summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/PackageInfoLiveData.kt18
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt35
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt40
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/UserPackageInfosLiveData.kt15
4 files changed, 50 insertions, 58 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PackageInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PackageInfoLiveData.kt
index 713e3350f..c9b876aa0 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/PackageInfoLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PackageInfoLiveData.kt
@@ -22,6 +22,7 @@ import android.os.UserHandle
import android.util.Log
import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
import com.android.permissioncontroller.permission.utils.Utils
+import kotlinx.coroutines.Job
/**
* LiveData for a LightPackageInfo.
@@ -68,18 +69,17 @@ class PackageInfoLiveData(
super.setValue(newValue)
}
- override fun loadData(isCancelled: () -> Boolean): LightPackageInfo? {
- try {
- if (isCancelled()) {
- // return will be ignored
- return value
- }
- return LightPackageInfo(context.packageManager.getPackageInfo(packageName,
+ override suspend fun loadDataAndPostValue(job: Job) {
+ if (job.isCancelled) {
+ return
+ }
+ postValue(try {
+ LightPackageInfo(context.packageManager.getPackageInfo(packageName,
PackageManager.GET_PERMISSIONS))
} catch (e: PackageManager.NameNotFoundException) {
Log.w(LOG_TAG, "Package \"$packageName\" not found")
- return null
- }
+ null
+ })
}
/**
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt
index fcf36ead7..3ecfcdc6c 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt
@@ -25,6 +25,7 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPack
import com.android.permissioncontroller.permission.model.livedatatypes.PermState
import com.android.permissioncontroller.permission.utils.LocationUtils
import com.android.permissioncontroller.permission.utils.Utils
+import kotlinx.coroutines.Job
/**
* A LiveData which tracks the permission state for one permission group for one package. It
@@ -68,20 +69,19 @@ class PermStateLiveData(
/**
* Gets the system flags from the package manager, and the grant state from those flags, plus
* the RequestedPermissionFlags of the PackageInfo.
- *
- * @param isCancelled: A boolean function saying whether or not this task should been cancelled
- *
- * @return A map of permission name to a PermState object with both types of flag.
*/
- override fun loadData(isCancelled: () -> Boolean): Map<String, PermState>? {
- val packageInfo = packageInfoLiveData.value ?: return value
- val permissionGroup = groupLiveData.value ?: return value
- val allPermissionFlags = mutableMapOf<String, PermState>()
+ override suspend fun loadDataAndPostValue(job: Job) {
+ if (!packageInfoLiveData.isInitialized || !groupLiveData.isInitialized) {
+ return
+ }
+ val packageInfo = packageInfoLiveData.value
+ val permissionGroup = groupLiveData.value
+ if (packageInfo == null || permissionGroup == null) {
+ postValue(null)
+ return
+ }
+ val permissionStates = mutableMapOf<String, PermState>()
for ((index, permissionName) in packageInfo.requestedPermissions.withIndex()) {
- if (isCancelled()) {
- // return the current value, which will be ignored
- return value
- }
permissionGroup.permissionInfos[permissionName]?.let { permInfo ->
val packageFlags = packageInfo.requestedPermissionsFlags[index]
@@ -94,21 +94,24 @@ class PermStateLiveData(
if (permissionGroupName == Manifest.permission_group.LOCATION) {
val userContext = Utils.getUserContext(app, user)
if (LocationUtils.isLocationGroupAndProvider(userContext, permissionGroupName,
- packageName)) {
+ packageName)) {
granted = LocationUtils.isLocationEnabled(userContext)
}
// The permission of the extra location controller package is determined by the
// status of the controller package itself.
if (LocationUtils.isLocationGroupAndControllerExtraPackage(userContext,
- permissionGroupName, packageName)) {
+ permissionGroupName, packageName)) {
granted = LocationUtils.isExtraLocationControllerPackageEnabled(userContext)
}
}
- allPermissionFlags[permissionName] = PermState(permFlags, granted)
+ if (job.isCancelled) {
+ return
+ }
+ permissionStates[permissionName] = PermState(permFlags, granted)
}
}
- return allPermissionFlags
+ postValue(permissionStates)
}
override fun onPermissionChange() {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt
index 9e1e5ea45..23819f614 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt
@@ -16,9 +16,10 @@
package com.android.permissioncontroller.permission.data
-import android.annotation.SuppressLint
-import android.os.AsyncTask
-import android.os.AsyncTask.THREAD_POOL_EXECUTOR
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
/**
* A LiveData which loads its data in a background AsyncTask. It will cancel current tasks, if new
@@ -26,39 +27,32 @@ import android.os.AsyncTask.THREAD_POOL_EXECUTOR
*/
abstract class SmartAsyncMediatorLiveData<T> : SmartUpdateMediatorLiveData<T>() {
- private var backgroundLoadTask = BackgroundLoadTask()
+ private var currentJob: Job? = null
/**
* The main function which will load data. It should periodically check isCancelled to see if
- * it should stop working.
+ * it should stop working. If data is loaded, it should call "postValue".
*/
- abstract fun loadData(isCancelled: () -> Boolean): T?
+ abstract suspend fun loadDataAndPostValue(job: Job)
open fun updateAsync() {
- stopTaskIfRunningAndGetNewTask()
- backgroundLoadTask.executeOnExecutor(THREAD_POOL_EXECUTOR)
- }
-
- private fun stopTaskIfRunningAndGetNewTask() {
- if (backgroundLoadTask.status == AsyncTask.Status.RUNNING) {
- backgroundLoadTask.cancel(false)
+ cancelJobIfRunning()
+ GlobalScope.launch(Dispatchers.Default) {
+ currentJob = coroutineContext[Job]
+ loadDataAndPostValue(currentJob!!)
}
- backgroundLoadTask = BackgroundLoadTask()
}
override fun onInactive() {
- stopTaskIfRunningAndGetNewTask()
+ cancelJobIfRunning()
super.onInactive()
}
- @SuppressLint("StaticFieldLeak")
- private inner class BackgroundLoadTask : AsyncTask<Void, Void, T>() {
- override fun doInBackground(vararg p0: Void?): T? {
- return loadData { isCancelled }
- }
-
- override fun onPostExecute(result: T?) {
- value = result
+ private fun cancelJobIfRunning() {
+ currentJob?.let { job ->
+ if (job.isActive) {
+ job.cancel()
+ }
}
}
} \ No newline at end of file
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/UserPackageInfosLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/UserPackageInfosLiveData.kt
index 2b9ffc0bb..489bf17de 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/UserPackageInfosLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/UserPackageInfosLiveData.kt
@@ -22,6 +22,7 @@ import android.os.UserHandle
import com.android.permissioncontroller.permission.data.PackageInfoRepository.getPackageBroadcastReceiver
import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
import com.android.permissioncontroller.permission.utils.KotlinUtils
+import kotlinx.coroutines.Job
/**
* A LiveData which tracks all of the packageinfos installed for a given user.
@@ -52,21 +53,15 @@ class UserPackageInfosLiveData(
/**
* Get all of the packages in the system, organized by user.
- *
- * @param isCancelled: A boolean function to tell us if the task has been cancelled
- *
- * @return A map of UserHandles to a list of package names for a given user
*/
- override fun loadData(isCancelled: () -> Boolean): List<LightPackageInfo>? {
- if (isCancelled()) {
- // return the current value, which will be ignored
- return value
+ override suspend fun loadDataAndPostValue(job: Job) {
+ if (job.isCancelled) {
+ return
}
-
val packageInfos = app.applicationContext.packageManager
.getInstalledPackagesAsUser(PackageManager.GET_PERMISSIONS,
user.identifier)
- return packageInfos.map { packageInfo -> LightPackageInfo(packageInfo) }
+ postValue(packageInfos.map { packageInfo -> LightPackageInfo(packageInfo) })
}
override fun onActive() {