summaryrefslogtreecommitdiff
path: root/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
diff options
context:
space:
mode:
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt')
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt61
1 files changed, 60 insertions, 1 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
index 0318144e4..890de5524 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
@@ -18,6 +18,8 @@ package com.android.permissioncontroller.permission.data
import android.app.Application
import android.app.role.RoleManager
+import android.os.Handler
+import android.os.Looper
import android.os.UserHandle
import androidx.lifecycle.LiveData
import com.android.permissioncontroller.PermissionControllerApplication
@@ -34,11 +36,24 @@ import com.android.permissioncontroller.permission.utils.Utils
*/
class PermGroupsPackagesUiInfoLiveData(
private val app: Application,
- groupNamesLiveData: LiveData<List<String>>
+ private val groupNamesLiveData: LiveData<List<String>>
) : SmartUpdateMediatorLiveData<
@kotlin.jvm.JvmSuppressWildcards Map<String, PermGroupPackagesUiInfo?>>() {
private val SYSTEM_SHELL = "android.app.role.SYSTEM_SHELL"
+ private val STAGGER_LOAD_TIME_MS = 50L
+
+ // Optimization: This LiveData relies on a large number of other ones. Enough that they can
+ // cause loading issues when they all become active at once. If this value is true, then it will
+ // slowly load data from all source LiveDatas, spacing loads them STAGGER_LOAD_TIME_MS apart
+ var loadStaggered: Boolean = false
+
+ // If we are returning from a particular permission group page, then that particular group is
+ // the one most likely to change. If so, then it will be prioritized in the load order.
+ var firstLoadGroup: String? = null
+
+ private val handler: Handler = Handler(Looper.getMainLooper())
+
/**
* Map<permission group name, PermGroupUiLiveDatas>
*/
@@ -139,4 +154,48 @@ class PermGroupsPackagesUiInfoLiveData(
}
value = allPackageData.toMap()
}
+
+ // Schedule a staggered loading of individual permission group livedatas
+ private fun scheduleStaggeredGroupLoad() {
+ if (groupNamesLiveData.value != null) {
+ val haveFirstLoadGroup = firstLoadGroup in groupNames
+ if (haveFirstLoadGroup) {
+ addLiveDataDelayed(firstLoadGroup!!, 0)
+ }
+ var afterFirstLoad = false
+ for ((idx, groupName) in groupNames.withIndex()) {
+ if (groupName != firstLoadGroup) {
+ val delay = if (!haveFirstLoadGroup || afterFirstLoad) {
+ idx * STAGGER_LOAD_TIME_MS
+ } else {
+ (idx + 1) * STAGGER_LOAD_TIME_MS
+ }
+ addLiveDataDelayed(groupName, delay)
+ } else {
+ afterFirstLoad = true
+ }
+ }
+ }
+ }
+
+ private fun addLiveDataDelayed(groupName: String, delayTimeMs: Long) {
+ val liveData = SinglePermGroupPackagesUiInfoLiveData[groupName]
+ permGroupPackagesLiveDatas[groupName] = liveData
+ handler.postDelayed({ addSource(liveData) { update() } }, delayTimeMs)
+ }
+
+ override fun onActive() {
+ super.onActive()
+ if (loadStaggered && permGroupPackagesLiveDatas.isEmpty()) {
+ scheduleStaggeredGroupLoad()
+ }
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ if (loadStaggered) {
+ permGroupPackagesLiveDatas.forEach { (_, liveData) -> removeSource(liveData) }
+ permGroupPackagesLiveDatas.clear()
+ }
+ }
}