summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Han <kevhan@google.com>2023-08-01 23:42:09 +0000
committerKevin Han <kevhan@google.com>2023-08-02 17:46:42 +0000
commit972dfca115718a7244c32e42056767e56a389c02 (patch)
tree62fe9be17c904c80ae3ab314c9362b4767001b81
parentdaf7b5c57f97c50e676f3d29a40389ce2b31e0c9 (diff)
downloadPermission-972dfca115718a7244c32e42056767e56a389c02.tar.gz
Fix hibernation job blocking
It is possible for getInitializedValue to suspend and never continue if the unused apps live data has no active observers. The default parameters of getInitializedValue are to block if the data is stale and wait for the value to be not stale. However, if the live data has no active observers, it never becomes not stale. Because this call is done as a "preload" there is a chance there are no active observers and the suspended function never continues. As a fix, we pass in a parameter that accepts that the value can be stale. We also move the suspending function onto a separate thread as it should not block the job finishing even if it suspends. Relnote: Fix issue with hibernation job blocking and not completing Bug: 288324294 Test: atest CtsHibernationTestCases Merged-In: I19d95fa5ae79d4e4ac5751dbed7ad3197d99c834 Change-Id: I19d95fa5ae79d4e4ac5751dbed7ad3197d99c834
-rw-r--r--PermissionController/src/com/android/permissioncontroller/hibernation/HibernationPolicy.kt9
1 files changed, 6 insertions, 3 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/hibernation/HibernationPolicy.kt b/PermissionController/src/com/android/permissioncontroller/hibernation/HibernationPolicy.kt
index 1f6b5272a..6e901fa26 100644
--- a/PermissionController/src/com/android/permissioncontroller/hibernation/HibernationPolicy.kt
+++ b/PermissionController/src/com/android/permissioncontroller/hibernation/HibernationPolicy.kt
@@ -99,6 +99,7 @@ import com.android.permissioncontroller.permission.data.get
import com.android.permissioncontroller.permission.data.getUnusedPackages
import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
import com.android.permissioncontroller.permission.service.revokeAppPermissions
+import com.android.permissioncontroller.permission.utils.IPC
import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.StringUtils
import com.android.permissioncontroller.permission.utils.Utils
@@ -861,7 +862,7 @@ class HibernationJobService : JobService() {
return true
}
- private suspend fun showUnusedAppsNotification(numUnused: Int, sessionId: Long) {
+ private fun showUnusedAppsNotification(numUnused: Int, sessionId: Long) {
val notificationManager = getSystemService(NotificationManager::class.java)!!
val permissionReminderChannel = NotificationChannel(
@@ -909,8 +910,10 @@ class HibernationJobService : JobService() {
notificationManager.notify(HibernationJobService::class.java.simpleName,
Constants.UNUSED_APPS_NOTIFICATION_ID, b.build())
- // Preload the unused packages
- getUnusedPackages().getInitializedValue()
+ GlobalScope.launch(IPC) {
+ // Preload the unused packages
+ getUnusedPackages().getInitializedValue(staleOk = true)
+ }
}
override fun onStopJob(params: JobParameters?): Boolean {