Loading read-snapshot.txt 0 → 100644 +0 −0 Empty file added. src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt +5 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPerm import com.android.permissioncontroller.permission.model.livedatatypes.PermState import com.android.permissioncontroller.permission.utils.LocationUtils import com.android.permissioncontroller.permission.utils.Utils import com.android.permissioncontroller.permission.utils.Utils.isModernPermissionGroup /** * A LiveData representing UI properties of an App Permission Group: Loading Loading @@ -172,6 +173,10 @@ class AppPermGroupUiInfoLiveData private constructor( * permission group */ private fun isUserSensitive(permissionState: Map<String, PermState>): Boolean { if (!isModernPermissionGroup(permGroupName)) { return true } for (permissionName in permissionState.keys) { val flags = permissionState[permissionName]?.permFlags ?: return true val granted = permissionState[permissionName]?.granted ?: return true Loading src/com/android/permissioncontroller/permission/data/PackageBroadcastReceiver.kt +40 −30 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import com.android.permissioncontroller.PermissionControllerApplication import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch /** * Listens for package additions, replacements, and removals, and notifies listeners. Loading Loading @@ -49,12 +52,15 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * Add a callback which will be notified when the specified packaged is changed or removed. */ fun addChangeCallback(packageName: String, listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() changeCallbacks.getOrPut(packageName, { mutableSetOf() }).add(listener) if (wasEmpty) { app.registerReceiver(this, intentFilter) app.applicationContext.registerReceiverForAllUsers(this@PackageBroadcastReceiver, intentFilter, null, null) } } } Loading @@ -65,12 +71,15 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @return returns the integer ID assigned to the */ fun addAllCallback(listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() allCallbacks.add(listener) if (wasEmpty) { app.registerReceiver(this, intentFilter) app.applicationContext.registerReceiverForAllUsers(this@PackageBroadcastReceiver, intentFilter, null, null) } } } Loading @@ -80,13 +89,12 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @param listener the listener we wish to remove */ fun removeAllCallback(listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() if (!allCallbacks.remove(listener)) { return if (allCallbacks.remove(listener) && hasNoListeners() && !wasEmpty) { app.applicationContext.unregisterReceiver(this@PackageBroadcastReceiver) } if (hasNoListeners() && !wasEmpty) { app.unregisterReceiver(this) } } Loading @@ -97,22 +105,22 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @param listener the listener we wish to remove */ fun removeChangeCallback(packageName: String?, listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() changeCallbacks[packageName]?.let { callbackSet -> if (!callbackSet.remove(listener)) { return } callbackSet.remove(listener) if (callbackSet.isEmpty()) { changeCallbacks.remove(packageName) } if (hasNoListeners() && !wasEmpty) { app.unregisterReceiver(this) app.applicationContext.unregisterReceiver(this@PackageBroadcastReceiver) } } } } fun getNumListeners(): Int { private fun getNumListeners(): Int { var numListeners = allCallbacks.size for ((_, changeCallbackSet) in changeCallbacks) { numListeners += changeCallbackSet.size Loading @@ -120,7 +128,7 @@ object PackageBroadcastReceiver : BroadcastReceiver() { return numListeners } fun hasNoListeners(): Boolean { private fun hasNoListeners(): Boolean { return getNumListeners() == 0 } Loading @@ -133,15 +141,17 @@ object PackageBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val packageName = intent.data?.schemeSpecificPart ?: return for (callback in allCallbacks) { for (callback in allCallbacks.toList()) { callback.onPackageUpdate(packageName) } if (intent.action != Intent.ACTION_PACKAGE_ADDED) { changeCallbacks[packageName]?.forEach { callback -> changeCallbacks[packageName]?.toList()?.let { callbacks -> for (callback in callbacks) { callback.onPackageUpdate(packageName) } } } if (intent.action == Intent.ACTION_PACKAGE_REMOVED) { // Invalidate all livedatas associated with this package Loading src/com/android/permissioncontroller/permission/data/UserSensitivityLiveData.kt +11 −14 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ import android.app.Application import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.os.Handler import android.os.Looper import android.os.Process import android.os.Process.INVALID_UID import android.os.UserHandle Loading Loading @@ -50,7 +48,6 @@ class UserSensitivityLiveData private constructor( private val context: Context private val packageLiveDatas = mutableMapOf<String, LightPackageInfoLiveData>() private val mainHandler = Handler(Looper.getMainLooper()) private val userPackageInfosLiveData = UserPackageInfosLiveData[user] private val getAllUids = uid == INVALID_UID Loading @@ -76,8 +73,10 @@ class UserSensitivityLiveData private constructor( if (!getAllUids) { getAndObservePackageLiveDatas() if (packageLiveDatas.isEmpty() || packageLiveDatas.all { it.value.isInitialized && it.value.value == null }) { if (packageLiveDatas.isEmpty() || packageLiveDatas.all { it.value.isInitialized && it.value.value == null }) { packageLiveDatas.clear() invalidateSingle(uid to user) postValue(null) Loading Loading @@ -165,19 +164,17 @@ class UserSensitivityLiveData private constructor( val (toAdd, toRemove) = KotlinUtils.getMapAndListDifferences(packageNames, packageLiveDatas) for (packageName in toRemove) { val liveData = packageLiveDatas.remove(packageName) ?: continue mainHandler.post { removeSource(liveData) } for (packageName in toAdd) { packageLiveDatas[packageName] = LightPackageInfoLiveData[packageName, user] } for (packageName in toAdd) { val liveData = LightPackageInfoLiveData[packageName, user] mainHandler.post { addSource(liveData) { addSource(packageLiveDatas[packageName] ?: continue) { updateIfActive() } } packageLiveDatas[packageName] = liveData } return } Loading src/com/android/permissioncontroller/permission/model/livedatatypes/LightPermission.kt +6 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.permissioncontroller.permission.model.livedatatypes import android.content.pm.PackageManager import android.content.pm.PermissionInfo import com.android.permissioncontroller.permission.utils.Utils.isRuntimePlatformPermission /** * Represents a single permission, and its state Loading Loading @@ -69,7 +70,8 @@ data class LightPermission( /** Whether this permission is granted by role */ val isGrantedByRole = flags and PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE != 0 /** Whether this permission is user sensitive in its current grant state */ val isUserSensitive = (isGrantedIncludingAppOp && val isUserSensitive = !isRuntimePlatformPermission(permInfo.name) || (isGrantedIncludingAppOp && (flags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0) || (!isGrantedIncludingAppOp && (flags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED) != 0) Loading Loading
src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt +5 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPerm import com.android.permissioncontroller.permission.model.livedatatypes.PermState import com.android.permissioncontroller.permission.utils.LocationUtils import com.android.permissioncontroller.permission.utils.Utils import com.android.permissioncontroller.permission.utils.Utils.isModernPermissionGroup /** * A LiveData representing UI properties of an App Permission Group: Loading Loading @@ -172,6 +173,10 @@ class AppPermGroupUiInfoLiveData private constructor( * permission group */ private fun isUserSensitive(permissionState: Map<String, PermState>): Boolean { if (!isModernPermissionGroup(permGroupName)) { return true } for (permissionName in permissionState.keys) { val flags = permissionState[permissionName]?.permFlags ?: return true val granted = permissionState[permissionName]?.granted ?: return true Loading
src/com/android/permissioncontroller/permission/data/PackageBroadcastReceiver.kt +40 −30 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import com.android.permissioncontroller.PermissionControllerApplication import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch /** * Listens for package additions, replacements, and removals, and notifies listeners. Loading Loading @@ -49,12 +52,15 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * Add a callback which will be notified when the specified packaged is changed or removed. */ fun addChangeCallback(packageName: String, listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() changeCallbacks.getOrPut(packageName, { mutableSetOf() }).add(listener) if (wasEmpty) { app.registerReceiver(this, intentFilter) app.applicationContext.registerReceiverForAllUsers(this@PackageBroadcastReceiver, intentFilter, null, null) } } } Loading @@ -65,12 +71,15 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @return returns the integer ID assigned to the */ fun addAllCallback(listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() allCallbacks.add(listener) if (wasEmpty) { app.registerReceiver(this, intentFilter) app.applicationContext.registerReceiverForAllUsers(this@PackageBroadcastReceiver, intentFilter, null, null) } } } Loading @@ -80,13 +89,12 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @param listener the listener we wish to remove */ fun removeAllCallback(listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() if (!allCallbacks.remove(listener)) { return if (allCallbacks.remove(listener) && hasNoListeners() && !wasEmpty) { app.applicationContext.unregisterReceiver(this@PackageBroadcastReceiver) } if (hasNoListeners() && !wasEmpty) { app.unregisterReceiver(this) } } Loading @@ -97,22 +105,22 @@ object PackageBroadcastReceiver : BroadcastReceiver() { * @param listener the listener we wish to remove */ fun removeChangeCallback(packageName: String?, listener: PackageBroadcastListener) { GlobalScope.launch(Main.immediate) { val wasEmpty = hasNoListeners() changeCallbacks[packageName]?.let { callbackSet -> if (!callbackSet.remove(listener)) { return } callbackSet.remove(listener) if (callbackSet.isEmpty()) { changeCallbacks.remove(packageName) } if (hasNoListeners() && !wasEmpty) { app.unregisterReceiver(this) app.applicationContext.unregisterReceiver(this@PackageBroadcastReceiver) } } } } fun getNumListeners(): Int { private fun getNumListeners(): Int { var numListeners = allCallbacks.size for ((_, changeCallbackSet) in changeCallbacks) { numListeners += changeCallbackSet.size Loading @@ -120,7 +128,7 @@ object PackageBroadcastReceiver : BroadcastReceiver() { return numListeners } fun hasNoListeners(): Boolean { private fun hasNoListeners(): Boolean { return getNumListeners() == 0 } Loading @@ -133,15 +141,17 @@ object PackageBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val packageName = intent.data?.schemeSpecificPart ?: return for (callback in allCallbacks) { for (callback in allCallbacks.toList()) { callback.onPackageUpdate(packageName) } if (intent.action != Intent.ACTION_PACKAGE_ADDED) { changeCallbacks[packageName]?.forEach { callback -> changeCallbacks[packageName]?.toList()?.let { callbacks -> for (callback in callbacks) { callback.onPackageUpdate(packageName) } } } if (intent.action == Intent.ACTION_PACKAGE_REMOVED) { // Invalidate all livedatas associated with this package Loading
src/com/android/permissioncontroller/permission/data/UserSensitivityLiveData.kt +11 −14 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ import android.app.Application import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.os.Handler import android.os.Looper import android.os.Process import android.os.Process.INVALID_UID import android.os.UserHandle Loading Loading @@ -50,7 +48,6 @@ class UserSensitivityLiveData private constructor( private val context: Context private val packageLiveDatas = mutableMapOf<String, LightPackageInfoLiveData>() private val mainHandler = Handler(Looper.getMainLooper()) private val userPackageInfosLiveData = UserPackageInfosLiveData[user] private val getAllUids = uid == INVALID_UID Loading @@ -76,8 +73,10 @@ class UserSensitivityLiveData private constructor( if (!getAllUids) { getAndObservePackageLiveDatas() if (packageLiveDatas.isEmpty() || packageLiveDatas.all { it.value.isInitialized && it.value.value == null }) { if (packageLiveDatas.isEmpty() || packageLiveDatas.all { it.value.isInitialized && it.value.value == null }) { packageLiveDatas.clear() invalidateSingle(uid to user) postValue(null) Loading Loading @@ -165,19 +164,17 @@ class UserSensitivityLiveData private constructor( val (toAdd, toRemove) = KotlinUtils.getMapAndListDifferences(packageNames, packageLiveDatas) for (packageName in toRemove) { val liveData = packageLiveDatas.remove(packageName) ?: continue mainHandler.post { removeSource(liveData) } for (packageName in toAdd) { packageLiveDatas[packageName] = LightPackageInfoLiveData[packageName, user] } for (packageName in toAdd) { val liveData = LightPackageInfoLiveData[packageName, user] mainHandler.post { addSource(liveData) { addSource(packageLiveDatas[packageName] ?: continue) { updateIfActive() } } packageLiveDatas[packageName] = liveData } return } Loading
src/com/android/permissioncontroller/permission/model/livedatatypes/LightPermission.kt +6 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.permissioncontroller.permission.model.livedatatypes import android.content.pm.PackageManager import android.content.pm.PermissionInfo import com.android.permissioncontroller.permission.utils.Utils.isRuntimePlatformPermission /** * Represents a single permission, and its state Loading Loading @@ -69,7 +70,8 @@ data class LightPermission( /** Whether this permission is granted by role */ val isGrantedByRole = flags and PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE != 0 /** Whether this permission is user sensitive in its current grant state */ val isUserSensitive = (isGrantedIncludingAppOp && val isUserSensitive = !isRuntimePlatformPermission(permInfo.name) || (isGrantedIncludingAppOp && (flags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0) || (!isGrantedIncludingAppOp && (flags and PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED) != 0) Loading