Loading src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt +2 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ package com.android.permissioncontroller.permission.data import android.os.Handler import android.os.Looper import kotlinx.coroutines.Dispatchers import com.android.permissioncontroller.permission.utils.IPC import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch Loading Loading @@ -54,7 +54,7 @@ abstract class SmartAsyncMediatorLiveData<T> : SmartUpdateMediatorLiveData<T>() jobRunning = true } GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(IPC) { currentJob = coroutineContext[Job] loadDataAndPostValue(currentJob!!) jobRunning = false Loading src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +55 −42 Original line number Diff line number Diff line Loading @@ -36,7 +36,9 @@ import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager.* import android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED import android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Process.myUserHandle import android.os.UserHandle import android.os.UserManager Loading @@ -55,12 +57,22 @@ import com.android.permissioncontroller.permission.data.PackagePermissionsLiveDa import com.android.permissioncontroller.permission.data.UserPackageInfosLiveData import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo import com.android.permissioncontroller.permission.utils.* import com.android.permissioncontroller.permission.utils.Utils.PROPERTY_AUTO_REVOKE_CHECK_FREQUENCY_MILLIS import com.android.permissioncontroller.permission.utils.Utils.PROPERTY_AUTO_REVOKE_UNUSED_THRESHOLD_MILLIS import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import com.android.permissioncontroller.permission.utils.application import com.android.permissioncontroller.permission.utils.forEachInParallel import com.android.permissioncontroller.permission.utils.updatePermissionFlags import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.concurrent.TimeUnit.DAYS import java.util.concurrent.TimeUnit.SECONDS import kotlin.random.Random Loading @@ -83,7 +95,8 @@ private val CHECK_FREQUENCY_MS = DeviceConfig.getLong( private val SERVER_LOG_ID = PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_UNUSED_APP_PERMISSION_REVOKED private val isAutoRevokeEnabled: Boolean get() { private val isAutoRevokeEnabled: Boolean get() { return CHECK_FREQUENCY_MS > 0 && UNUSED_THRESHOLD_MS > 0 } Loading Loading @@ -124,7 +137,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { .toMutableList() // TODO eugenesusla: adapt UsageStats into a LiveData val stats = withContext(IO) { val stats = withContext(IPC) { context.getSystemService<UsageStatsManager>() .queryUsageStats( if (DEBUG) INTERVAL_DAILY else INTERVAL_MONTHLY, Loading @@ -132,7 +145,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { now) } val profileUsersStats: Deferred<List<List<UsageStats>>> = GlobalScope.async(IO, start = CoroutineStart.LAZY) { GlobalScope.async(IPC, start = CoroutineStart.LAZY) { context .getSystemService<UserManager>() .enabledProfiles Loading Loading @@ -180,7 +193,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { Log.i(LOG_TAG, "Unused apps: ${unusedApps.map { it.packageName }}") } val manifestExemptPackages: Set<String> = withContext(IO) { val manifestExemptPackages: Set<String> = withContext(IPC) { context.getSystemService<PermissionManager>() .getAutoRevokeExemptionGrantedPackages() } Loading src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt +2 −2 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveDat import com.android.permissioncontroller.permission.data.UserPackageInfosLiveData import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch Loading @@ -56,7 +56,7 @@ internal object RuntimePermissionsUpgradeController { val permissionManager = context.getSystemService(PermissionManager::class.java) val currentVersion = permissionManager!!.runtimePermissionsVersion GlobalScope.launch(IO) { GlobalScope.launch(IPC) { whitelistAllSystemAppPermissions(context) val upgradedVersion = onUpgradeLocked(context, currentVersion) Loading src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt +2 −2 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveD import com.android.permissioncontroller.permission.data.get import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState import com.android.permissioncontroller.permission.ui.Category import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch Loading Loading @@ -149,7 +149,7 @@ class AppPermissionGroupsViewModel( val autoRevokeLiveData = AutoRevokeStateLiveData[packageName, user] fun setAutoRevoke(enabled: Boolean) { GlobalScope.launch(IO) { GlobalScope.launch(IPC) { val aom = PermissionControllerApplication.get() .getSystemService(AppOpsManager::class.java)!! val packageInfo = LightPackageInfoLiveData[packageName, user].getInitializedValue() Loading src/com/android/permissioncontroller/permission/utils/AndroidUtils.kt +13 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import android.content.ContextWrapper import android.content.pm.PackageManager import android.os.Looper import android.os.UserHandle import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors /** * Gets an [Application] instance from a regular [Context] Loading @@ -35,6 +37,17 @@ val Context.application: Application get() = when (this) { else -> applicationContext as Application } /** * The number of threads in the IPC thread pool. Set to the maximum number of binder threads allowed * to an app by the Android System. */ const val IPC_THREAD_POOL_COUNT = 16 /** * A coroutine dispatcher with a fixed thread pool size, to be used for background tasks */ val IPC = Executors.newFixedThreadPool(IPC_THREAD_POOL_COUNT).asCoroutineDispatcher() /** * Assert that an operation is running on main thread */ Loading Loading
src/com/android/permissioncontroller/permission/data/SmartAsyncMediatorLiveData.kt +2 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ package com.android.permissioncontroller.permission.data import android.os.Handler import android.os.Looper import kotlinx.coroutines.Dispatchers import com.android.permissioncontroller.permission.utils.IPC import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch Loading Loading @@ -54,7 +54,7 @@ abstract class SmartAsyncMediatorLiveData<T> : SmartUpdateMediatorLiveData<T>() jobRunning = true } GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(IPC) { currentJob = coroutineContext[Job] loadDataAndPostValue(currentJob!!) jobRunning = false Loading
src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +55 −42 Original line number Diff line number Diff line Loading @@ -36,7 +36,9 @@ import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager.* import android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED import android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Process.myUserHandle import android.os.UserHandle import android.os.UserManager Loading @@ -55,12 +57,22 @@ import com.android.permissioncontroller.permission.data.PackagePermissionsLiveDa import com.android.permissioncontroller.permission.data.UserPackageInfosLiveData import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo import com.android.permissioncontroller.permission.utils.* import com.android.permissioncontroller.permission.utils.Utils.PROPERTY_AUTO_REVOKE_CHECK_FREQUENCY_MILLIS import com.android.permissioncontroller.permission.utils.Utils.PROPERTY_AUTO_REVOKE_UNUSED_THRESHOLD_MILLIS import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import com.android.permissioncontroller.permission.utils.application import com.android.permissioncontroller.permission.utils.forEachInParallel import com.android.permissioncontroller.permission.utils.updatePermissionFlags import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.concurrent.TimeUnit.DAYS import java.util.concurrent.TimeUnit.SECONDS import kotlin.random.Random Loading @@ -83,7 +95,8 @@ private val CHECK_FREQUENCY_MS = DeviceConfig.getLong( private val SERVER_LOG_ID = PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_UNUSED_APP_PERMISSION_REVOKED private val isAutoRevokeEnabled: Boolean get() { private val isAutoRevokeEnabled: Boolean get() { return CHECK_FREQUENCY_MS > 0 && UNUSED_THRESHOLD_MS > 0 } Loading Loading @@ -124,7 +137,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { .toMutableList() // TODO eugenesusla: adapt UsageStats into a LiveData val stats = withContext(IO) { val stats = withContext(IPC) { context.getSystemService<UsageStatsManager>() .queryUsageStats( if (DEBUG) INTERVAL_DAILY else INTERVAL_MONTHLY, Loading @@ -132,7 +145,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { now) } val profileUsersStats: Deferred<List<List<UsageStats>>> = GlobalScope.async(IO, start = CoroutineStart.LAZY) { GlobalScope.async(IPC, start = CoroutineStart.LAZY) { context .getSystemService<UserManager>() .enabledProfiles Loading Loading @@ -180,7 +193,7 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context) { Log.i(LOG_TAG, "Unused apps: ${unusedApps.map { it.packageName }}") } val manifestExemptPackages: Set<String> = withContext(IO) { val manifestExemptPackages: Set<String> = withContext(IPC) { context.getSystemService<PermissionManager>() .getAutoRevokeExemptionGrantedPackages() } Loading
src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt +2 −2 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveDat import com.android.permissioncontroller.permission.data.UserPackageInfosLiveData import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch Loading @@ -56,7 +56,7 @@ internal object RuntimePermissionsUpgradeController { val permissionManager = context.getSystemService(PermissionManager::class.java) val currentVersion = permissionManager!!.runtimePermissionsVersion GlobalScope.launch(IO) { GlobalScope.launch(IPC) { whitelistAllSystemAppPermissions(context) val upgradedVersion = onUpgradeLocked(context, currentVersion) Loading
src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt +2 −2 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveD import com.android.permissioncontroller.permission.data.get import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState import com.android.permissioncontroller.permission.ui.Category import com.android.permissioncontroller.permission.utils.IPC import com.android.permissioncontroller.permission.utils.KotlinUtils import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch Loading Loading @@ -149,7 +149,7 @@ class AppPermissionGroupsViewModel( val autoRevokeLiveData = AutoRevokeStateLiveData[packageName, user] fun setAutoRevoke(enabled: Boolean) { GlobalScope.launch(IO) { GlobalScope.launch(IPC) { val aom = PermissionControllerApplication.get() .getSystemService(AppOpsManager::class.java)!! val packageInfo = LightPackageInfoLiveData[packageName, user].getInitializedValue() Loading
src/com/android/permissioncontroller/permission/utils/AndroidUtils.kt +13 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ import android.content.ContextWrapper import android.content.pm.PackageManager import android.os.Looper import android.os.UserHandle import kotlinx.coroutines.asCoroutineDispatcher import java.util.concurrent.Executors /** * Gets an [Application] instance from a regular [Context] Loading @@ -35,6 +37,17 @@ val Context.application: Application get() = when (this) { else -> applicationContext as Application } /** * The number of threads in the IPC thread pool. Set to the maximum number of binder threads allowed * to an app by the Android System. */ const val IPC_THREAD_POOL_COUNT = 16 /** * A coroutine dispatcher with a fixed thread pool size, to be used for background tasks */ val IPC = Executors.newFixedThreadPool(IPC_THREAD_POOL_COUNT).asCoroutineDispatcher() /** * Assert that an operation is running on main thread */ Loading