Loading Android.bp +7 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,13 @@ filegroup { srcs: [ "src/**/*.java", "src/**/*.kt", ":permissioncontroller-protos", ], } filegroup { name: "permissioncontroller-protos", srcs: [ "src/**/*.proto", ], } Loading src/com/android/permissioncontroller/permission/data/AutoRevokeStateLiveData.kt +10 −4 Original line number Diff line number Diff line Loading @@ -59,11 +59,17 @@ class AutoRevokeStateLiveData private constructor( } override suspend fun loadDataAndPostValue(job: Job) { val uid = packageLiveData.value?.uid if (uid == null && packageLiveData.isInitialized) { if (!packageLiveData.isInitialized) { return } if (packageLiveData.value == null) { postValue(null) return } else if (uid == null) { } val uid = packageLiveData.value?.uid if (uid == null) { postValue(null) return } Loading @@ -81,7 +87,7 @@ class AutoRevokeStateLiveData private constructor( return } val revocable = !isPackageAutoRevokeExempt(app, packageLiveData.getInitializedValue()) val revocable = !isPackageAutoRevokeExempt(app, packageLiveData.value!!) val autoRevokeState = mutableListOf<String>() permStateLiveDatas.forEach { (groupName, liveData) -> val default = liveData.value?.any { (_, permState) -> Loading src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt +8 −4 Original line number Diff line number Diff line Loading @@ -70,11 +70,15 @@ class LightPackageInfoLiveData private constructor( newValue?.let { packageInfo -> if (packageInfo.uid != uid) { uid = packageInfo.uid // registeredUid == null means the live data is not active if (registeredUid != null) { PermissionListenerMultiplexer.addOrReplaceCallback(registeredUid, packageInfo.uid, this) registeredUid = uid } } } super.setValue(newValue) } Loading src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt +3 −2 Original line number Diff line number Diff line Loading @@ -113,7 +113,8 @@ class PermStateLiveData private constructor( return } uid = packageInfo.uid if (uid != registeredUid) { // registeredUid == null means the live data is not active if (uid != registeredUid && registeredUid != null) { PermissionListenerMultiplexer.addOrReplaceCallback( registeredUid, packageInfo.uid, this) registeredUid = uid Loading src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +24 −1 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import com.android.permissioncontroller.R import com.android.permissioncontroller.permission.data.AllPackageInfosLiveData import com.android.permissioncontroller.permission.data.AppOpLiveData import com.android.permissioncontroller.permission.data.AutoRevokeManifestExemptPackagesLiveData import com.android.permissioncontroller.permission.data.AutoRevokeStateLiveData import com.android.permissioncontroller.permission.data.DataRepositoryForPackage import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveData import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData Loading Loading @@ -743,6 +744,7 @@ private class AutoRevokeDumpLiveData(context: Context) : val firstInstallTime: Long, val lastTimeVisible: Long?, val isAutoRevokeManifestExempt: Boolean, val isAutoRevokeEnabled: Boolean, val implementedServices: List<String>, val groups: List<AutoRevokeDumpGroupData> ) { Loading @@ -752,6 +754,7 @@ private class AutoRevokeDumpLiveData(context: Context) : .setPackageName(packageName) .setFirstInstallTime(firstInstallTime) .setIsAutoRevokeManifestExempt(isAutoRevokeManifestExempt) .setIsAutoRevokeEnabled(isAutoRevokeEnabled) lastTimeVisible?.let { dump.lastTimeVisible = lastTimeVisible } Loading Loading @@ -815,6 +818,13 @@ private class AutoRevokeDumpLiveData(context: Context) : private var pkgPermGroupNames: MutableMap<Pair<UserHandle, String>, PackagePermissionsLiveData>? = null /** * Group names for packages * map<user, pkg-name> -> auto-revoke state. {@code null} before step 1 */ private var pkgAutoRevokeState: MutableMap<Pair<UserHandle, String>, AutoRevokeStateLiveData>? = null /** * Group state for packages * map<(user, pkg-name) -> map<perm-group-name -> group>>, value {@code null} before step 2 Loading Loading @@ -847,6 +857,8 @@ private class AutoRevokeDumpLiveData(context: Context) : addSource(packages) { pkgPermGroupNames?.values?.forEach { removeSource(it) } pkgPermGroupNames = null pkgAutoRevokeState?.values?.forEach { removeSource(it) } pkgAutoRevokeState = null pkgPermGroups.values.forEach { it?.values?.forEach { removeSource(it) } } updateIfActive() Loading Loading @@ -885,6 +897,7 @@ private class AutoRevokeDumpLiveData(context: Context) : // pkgPermGroupNames step 1, packages is loaded, nothing else if (packages.isInitialized && pkgPermGroupNames == null) { pkgPermGroupNames = mutableMapOf() pkgAutoRevokeState = mutableMapOf() for ((user, userPkgs) in packages.value!!) { for (pkg in userPkgs) { Loading @@ -897,6 +910,13 @@ private class AutoRevokeDumpLiveData(context: Context) : updateIfActive() } val newPkgAutoRevokeState = AutoRevokeStateLiveData[pkg.packageName, user] pkgAutoRevokeState!![user to pkg.packageName] = newPkgAutoRevokeState addSource(newPkgAutoRevokeState) { updateIfActive() } } } } Loading Loading @@ -934,7 +954,8 @@ private class AutoRevokeDumpLiveData(context: Context) : pkgPermGroupNames?.size == pkgPermGroups.size && pkgPermGroups.values.all { it?.values?.all { it.isInitialized } == true } && services?.values?.all { it.isInitialized } == true && autoRevokeManifestExemptPackages?.values?.all { it.isInitialized } == true) { autoRevokeManifestExemptPackages?.values?.all { it.isInitialized } == true && pkgAutoRevokeState?.values?.all { it.isInitialized } == true) { val users = mutableListOf<AutoRevokeDumpUserData>() for ((user, userPkgs) in packages.value!!) { Loading Loading @@ -967,6 +988,8 @@ private class AutoRevokeDumpLiveData(context: Context) : ?.find { it.packageName == pkg.packageName }?.lastTimeVisible, autoRevokeManifestExemptPackages!![user]!!.value!! .contains(pkg.packageName), pkgAutoRevokeState!![user to pkg.packageName]!!.value ?.isEnabledForApp == true, services!![user]?.value!![pkg.packageName] ?: emptyList(), groups)) } Loading Loading
Android.bp +7 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,13 @@ filegroup { srcs: [ "src/**/*.java", "src/**/*.kt", ":permissioncontroller-protos", ], } filegroup { name: "permissioncontroller-protos", srcs: [ "src/**/*.proto", ], } Loading
src/com/android/permissioncontroller/permission/data/AutoRevokeStateLiveData.kt +10 −4 Original line number Diff line number Diff line Loading @@ -59,11 +59,17 @@ class AutoRevokeStateLiveData private constructor( } override suspend fun loadDataAndPostValue(job: Job) { val uid = packageLiveData.value?.uid if (uid == null && packageLiveData.isInitialized) { if (!packageLiveData.isInitialized) { return } if (packageLiveData.value == null) { postValue(null) return } else if (uid == null) { } val uid = packageLiveData.value?.uid if (uid == null) { postValue(null) return } Loading @@ -81,7 +87,7 @@ class AutoRevokeStateLiveData private constructor( return } val revocable = !isPackageAutoRevokeExempt(app, packageLiveData.getInitializedValue()) val revocable = !isPackageAutoRevokeExempt(app, packageLiveData.value!!) val autoRevokeState = mutableListOf<String>() permStateLiveDatas.forEach { (groupName, liveData) -> val default = liveData.value?.any { (_, permState) -> Loading
src/com/android/permissioncontroller/permission/data/LightPackageInfoLiveData.kt +8 −4 Original line number Diff line number Diff line Loading @@ -70,11 +70,15 @@ class LightPackageInfoLiveData private constructor( newValue?.let { packageInfo -> if (packageInfo.uid != uid) { uid = packageInfo.uid // registeredUid == null means the live data is not active if (registeredUid != null) { PermissionListenerMultiplexer.addOrReplaceCallback(registeredUid, packageInfo.uid, this) registeredUid = uid } } } super.setValue(newValue) } Loading
src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt +3 −2 Original line number Diff line number Diff line Loading @@ -113,7 +113,8 @@ class PermStateLiveData private constructor( return } uid = packageInfo.uid if (uid != registeredUid) { // registeredUid == null means the live data is not active if (uid != registeredUid && registeredUid != null) { PermissionListenerMultiplexer.addOrReplaceCallback( registeredUid, packageInfo.uid, this) registeredUid = uid Loading
src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +24 −1 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ import com.android.permissioncontroller.R import com.android.permissioncontroller.permission.data.AllPackageInfosLiveData import com.android.permissioncontroller.permission.data.AppOpLiveData import com.android.permissioncontroller.permission.data.AutoRevokeManifestExemptPackagesLiveData import com.android.permissioncontroller.permission.data.AutoRevokeStateLiveData import com.android.permissioncontroller.permission.data.DataRepositoryForPackage import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveData import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData Loading Loading @@ -743,6 +744,7 @@ private class AutoRevokeDumpLiveData(context: Context) : val firstInstallTime: Long, val lastTimeVisible: Long?, val isAutoRevokeManifestExempt: Boolean, val isAutoRevokeEnabled: Boolean, val implementedServices: List<String>, val groups: List<AutoRevokeDumpGroupData> ) { Loading @@ -752,6 +754,7 @@ private class AutoRevokeDumpLiveData(context: Context) : .setPackageName(packageName) .setFirstInstallTime(firstInstallTime) .setIsAutoRevokeManifestExempt(isAutoRevokeManifestExempt) .setIsAutoRevokeEnabled(isAutoRevokeEnabled) lastTimeVisible?.let { dump.lastTimeVisible = lastTimeVisible } Loading Loading @@ -815,6 +818,13 @@ private class AutoRevokeDumpLiveData(context: Context) : private var pkgPermGroupNames: MutableMap<Pair<UserHandle, String>, PackagePermissionsLiveData>? = null /** * Group names for packages * map<user, pkg-name> -> auto-revoke state. {@code null} before step 1 */ private var pkgAutoRevokeState: MutableMap<Pair<UserHandle, String>, AutoRevokeStateLiveData>? = null /** * Group state for packages * map<(user, pkg-name) -> map<perm-group-name -> group>>, value {@code null} before step 2 Loading Loading @@ -847,6 +857,8 @@ private class AutoRevokeDumpLiveData(context: Context) : addSource(packages) { pkgPermGroupNames?.values?.forEach { removeSource(it) } pkgPermGroupNames = null pkgAutoRevokeState?.values?.forEach { removeSource(it) } pkgAutoRevokeState = null pkgPermGroups.values.forEach { it?.values?.forEach { removeSource(it) } } updateIfActive() Loading Loading @@ -885,6 +897,7 @@ private class AutoRevokeDumpLiveData(context: Context) : // pkgPermGroupNames step 1, packages is loaded, nothing else if (packages.isInitialized && pkgPermGroupNames == null) { pkgPermGroupNames = mutableMapOf() pkgAutoRevokeState = mutableMapOf() for ((user, userPkgs) in packages.value!!) { for (pkg in userPkgs) { Loading @@ -897,6 +910,13 @@ private class AutoRevokeDumpLiveData(context: Context) : updateIfActive() } val newPkgAutoRevokeState = AutoRevokeStateLiveData[pkg.packageName, user] pkgAutoRevokeState!![user to pkg.packageName] = newPkgAutoRevokeState addSource(newPkgAutoRevokeState) { updateIfActive() } } } } Loading Loading @@ -934,7 +954,8 @@ private class AutoRevokeDumpLiveData(context: Context) : pkgPermGroupNames?.size == pkgPermGroups.size && pkgPermGroups.values.all { it?.values?.all { it.isInitialized } == true } && services?.values?.all { it.isInitialized } == true && autoRevokeManifestExemptPackages?.values?.all { it.isInitialized } == true) { autoRevokeManifestExemptPackages?.values?.all { it.isInitialized } == true && pkgAutoRevokeState?.values?.all { it.isInitialized } == true) { val users = mutableListOf<AutoRevokeDumpUserData>() for ((user, userPkgs) in packages.value!!) { Loading Loading @@ -967,6 +988,8 @@ private class AutoRevokeDumpLiveData(context: Context) : ?.find { it.packageName == pkg.packageName }?.lastTimeVisible, autoRevokeManifestExemptPackages!![user]!!.value!! .contains(pkg.packageName), pkgAutoRevokeState!![user to pkg.packageName]!!.value ?.isEnabledForApp == true, services!![user]?.value!![pkg.packageName] ?: emptyList(), groups)) } Loading