[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) })