diff options
author | Kevin Han <kevhan@google.com> | 2023-08-01 23:42:09 +0000 |
---|---|---|
committer | Kevin Han <kevhan@google.com> | 2023-08-02 17:46:42 +0000 |
commit | 972dfca115718a7244c32e42056767e56a389c02 (patch) | |
tree | 62fe9be17c904c80ae3ab314c9362b4767001b81 | |
parent | daf7b5c57f97c50e676f3d29a40389ce2b31e0c9 (diff) | |
download | Permission-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.kt | 9 |
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 { |