[DO NOT MERGE] Deep-update live datas and update on isStale in getInitializedValue

Test: atest AutoRevokeTest
Bug: 160380748
Change-Id: I1c30ef5e1bb8742a97677b92380656a9c803fd9d
diff --git a/src/com/android/permissioncontroller/permission/data/AllPackageInfosLiveData.kt b/src/com/android/permissioncontroller/permission/data/AllPackageInfosLiveData.kt
index 424505b..494a8de 100644
--- a/src/com/android/permissioncontroller/permission/data/AllPackageInfosLiveData.kt
+++ b/src/com/android/permissioncontroller/permission/data/AllPackageInfosLiveData.kt
@@ -19,12 +19,16 @@
 import android.os.UserHandle
 import com.android.permissioncontroller.permission.data.AllPackageInfosLiveData.addSource
 import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
+import kotlinx.coroutines.Dispatchers.Main
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
 
 /**
  * A LiveData which tracks the PackageInfos of all of the packages in the system, for all users.
  */
 object AllPackageInfosLiveData :
-    SmartUpdateMediatorLiveData<Map<UserHandle, List<LightPackageInfo>>>() {
+    SmartUpdateMediatorLiveData<Map<UserHandle, List<LightPackageInfo>>>(),
+    DeepUpdateable {
 
     private val userPackageInfosLiveDatas = mutableMapOf<UserHandle, UserPackageInfosLiveData>()
     private val userPackageInfos = mutableMapOf<UserHandle, List<LightPackageInfo>>()
@@ -35,6 +39,15 @@
         }
     }
 
+    override suspend fun onDeepUpdate() {
+        updateIfActive()
+        GlobalScope.launch(Main.immediate) {
+            for ((_, liveData) in userPackageInfosLiveDatas) {
+                liveData.updateAsync()
+            }
+        }
+    }
+
     override fun onUpdate() {
         UsersLiveData.value?.let { users ->
             val getLiveData = { user: UserHandle -> UserPackageInfosLiveData[user] }
diff --git a/src/com/android/permissioncontroller/permission/data/DeepUpdateable.kt b/src/com/android/permissioncontroller/permission/data/DeepUpdateable.kt
new file mode 100644
index 0000000..4a7d5b4
--- /dev/null
+++ b/src/com/android/permissioncontroller/permission/data/DeepUpdateable.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.permission.data
+
+interface DeepUpdateable {
+    suspend fun onDeepUpdate()
+}
+
+suspend fun SmartUpdateMediatorLiveData<*>.deepUpdate() {
+    if (this is DeepUpdateable) {
+        onDeepUpdate()
+    } else {
+        updateIfActive()
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt b/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
index 84826c0..0634d1b 100644
--- a/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
+++ b/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
@@ -328,8 +328,10 @@
         return getInitializedValue(
             observe = { observer ->
                 observeStale(ForeverActiveLifecycle, observer)
-                if (forceUpdate) {
-                    updateIfActive()
+                if (forceUpdate || (!staleOk && isStale)) {
+                    GlobalScope.launch(Main) {
+                        deepUpdate()
+                    }
                 }
             },
             isInitialized = { isInitialized && (staleOk || !isStale) })