diff options
author | 2019-11-15 22:10:29 +0000 | |
---|---|---|
committer | 2019-11-15 22:10:29 +0000 | |
commit | 7f6620987562ba3dfee93d507261d2947c7442ef (patch) | |
tree | d5928346050d347940d461eecc466b4f6b9ab457 | |
parent | 78996775b2b9cc01a3bd5006cd2c1a5f5f51877b (diff) | |
parent | 0f530a25d646d149a2600d45dae376468a0c5838 (diff) |
Merge "Switched Async LiveData to coroutines"
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() { |