Loading src/com/android/permissioncontroller/permission/data/UsageStatsLiveData.kt +7 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.usage.UsageStatsManager import android.app.usage.UsageStatsManager.INTERVAL_MONTHLY import android.os.UserHandle import android.os.UserManager import com.android.permissioncontroller.DeviceUtils import com.android.permissioncontroller.PermissionControllerApplication import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Job Loading Loading @@ -53,9 +54,13 @@ class UsageStatsLiveData private constructor( val now = System.currentTimeMillis() val userMap = mutableMapOf<UserHandle, List<UsageStats>>() val enabledUsers = app.getSystemService(UserManager::class.java)!!.enabledProfiles val userManager = app.getSystemService(UserManager::class.java)!! val enabledUsers = userManager.enabledProfiles for (user in UsersLiveData.value!!) { if (user !in enabledUsers) { // If the user is not enabled, or if the user is a managed profile, and this is not an // android TV (where parental control accounts are managed profiles), do not get stats. if (user !in enabledUsers || (userManager.isManagedProfile(user.identifier) && !DeviceUtils.isTelevision(app))) { continue } val statsManager = Utils.getUserContext(app, user).getSystemService( Loading src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +7 −1 Original line number Diff line number Diff line Loading @@ -117,6 +117,9 @@ private const val AUTO_REVOKE_ENABLED = true private var SKIP_NEXT_RUN = false private val EXEMPT_PERMISSIONS = listOf( android.Manifest.permission.ACTIVITY_RECOGNITION) private val DEFAULT_UNUSED_THRESHOLD_MS = if (AUTO_REVOKE_ENABLED) DAYS.toMillis(90) else Long.MAX_VALUE fun getUnusedThresholdMs(context: Context) = when { Loading Loading @@ -339,8 +342,11 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context): ?: return@forEachInParallel val fixed = group.isBackgroundFixed || group.isForegroundFixed val granted = group.permissions.any { (_, perm) -> perm.isGrantedIncludingAppOp && perm.name !in EXEMPT_PERMISSIONS } if (!fixed && group.permissions.any { (_, perm) -> perm.isGrantedIncludingAppOp } && granted && !group.isGrantedByDefault && !group.isGrantedByRole && group.isUserSensitive) { Loading src/com/android/permissioncontroller/role/model/RequiredActivity.java +2 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; import androidx.annotation.NonNull; Loading @@ -37,8 +36,8 @@ import java.util.List; public class RequiredActivity extends RequiredComponent { public RequiredActivity(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { super(intentFilterData, permission, metaData); @Nullable String permission) { super(intentFilterData, permission); } @NonNull Loading @@ -63,10 +62,4 @@ public class RequiredActivity extends RequiredComponent { protected String getComponentPermission(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.permission; } @Nullable @Override protected Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.metaData; } } src/com/android/permissioncontroller/role/model/RequiredBroadcastReceiver.java +2 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; import androidx.annotation.NonNull; Loading @@ -37,8 +36,8 @@ import java.util.List; public class RequiredBroadcastReceiver extends RequiredComponent { public RequiredBroadcastReceiver(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { super(intentFilterData, permission, metaData); @Nullable String permission) { super(intentFilterData, permission); } @NonNull Loading @@ -62,10 +61,4 @@ public class RequiredBroadcastReceiver extends RequiredComponent { protected String getComponentPermission(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.permission; } @Nullable @Override protected Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.metaData; } } src/com/android/permissioncontroller/role/model/RequiredComponent.java +6 −62 Original line number Diff line number Diff line Loading @@ -21,11 +21,9 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.util.ArraySet; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -39,8 +37,6 @@ import java.util.Objects; */ public abstract class RequiredComponent { private static final String LOG_TAG = RequiredComponent.class.getSimpleName(); /** * The {@code Intent} or {@code IntentFilter} data to match the components. */ Loading @@ -56,20 +52,10 @@ public abstract class RequiredComponent { @Nullable private final String mPermission; /** * The meta data required on a component for match to succeed. * * @see android.content.pm.PackageItemInfo#metaData */ @NonNull private final List<RequiredMetaData> mMetaData; public RequiredComponent(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { @Nullable String permission) { mIntentFilterData = intentFilterData; mPermission = permission; mMetaData = metaData; } @NonNull Loading @@ -82,11 +68,6 @@ public abstract class RequiredComponent { return mPermission; } @NonNull public List<RequiredMetaData> getMetaData() { return mMetaData; } /** * Get the component that matches this required component within a package, if any. * Loading Loading @@ -127,13 +108,9 @@ public abstract class RequiredComponent { if (packageName != null) { intent.setPackage(packageName); } int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; boolean hasMetaData = !mMetaData.isEmpty(); if (hasMetaData) { flags |= PackageManager.GET_META_DATA; } List<ResolveInfo> resolveInfos = queryIntentComponentsAsUser(intent, flags, user, context); List<ResolveInfo> resolveInfos = queryIntentComponentsAsUser(intent, PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, user, context); ArraySet<String> componentPackageNames = new ArraySet<>(); List<ComponentName> componentNames = new ArrayList<>(); Loading @@ -148,27 +125,6 @@ public abstract class RequiredComponent { } } if (hasMetaData) { Bundle componentMetaData = getComponentMetaData(resolveInfo); if (componentMetaData == null) { Log.w(LOG_TAG, "Component meta data is null"); continue; } boolean isMetaDataQualified = true; int metaDataSize = mMetaData.size(); for (int metaDataIndex = 0; metaDataIndex < metaDataSize; metaDataIndex++) { RequiredMetaData metaData = mMetaData.get(metaDataIndex); if (!metaData.isQualified(componentMetaData)) { isMetaDataQualified = false; break; } } if (!isMetaDataQualified) { continue; } } ComponentName componentName = getComponentComponentName(resolveInfo); String componentPackageName = componentName.getPackageName(); if (componentPackageNames.contains(componentPackageName)) { Loading Loading @@ -216,22 +172,11 @@ public abstract class RequiredComponent { @Nullable protected abstract String getComponentPermission(@NonNull ResolveInfo resolveInfo); /** * Get the meta data associated with a component. * * @param resolveInfo the {@code ResolveInfo} of the component * * @return the meta data associated with a component */ @Nullable protected abstract Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo); @Override public String toString() { return "RequiredComponent{" + "mIntentFilterData=" + mIntentFilterData + ", mPermission='" + mPermission + '\'' + ", mMetaData=" + mMetaData + '}'; } Loading @@ -245,12 +190,11 @@ public abstract class RequiredComponent { } RequiredComponent that = (RequiredComponent) object; return Objects.equals(mIntentFilterData, that.mIntentFilterData) && Objects.equals(mPermission, that.mPermission) && Objects.equals(mMetaData, that.mMetaData); && Objects.equals(mPermission, that.mPermission); } @Override public int hashCode() { return Objects.hash(mIntentFilterData, mPermission, mMetaData); return Objects.hash(mIntentFilterData, mPermission); } } Loading
src/com/android/permissioncontroller/permission/data/UsageStatsLiveData.kt +7 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.usage.UsageStatsManager import android.app.usage.UsageStatsManager.INTERVAL_MONTHLY import android.os.UserHandle import android.os.UserManager import com.android.permissioncontroller.DeviceUtils import com.android.permissioncontroller.PermissionControllerApplication import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Job Loading Loading @@ -53,9 +54,13 @@ class UsageStatsLiveData private constructor( val now = System.currentTimeMillis() val userMap = mutableMapOf<UserHandle, List<UsageStats>>() val enabledUsers = app.getSystemService(UserManager::class.java)!!.enabledProfiles val userManager = app.getSystemService(UserManager::class.java)!! val enabledUsers = userManager.enabledProfiles for (user in UsersLiveData.value!!) { if (user !in enabledUsers) { // If the user is not enabled, or if the user is a managed profile, and this is not an // android TV (where parental control accounts are managed profiles), do not get stats. if (user !in enabledUsers || (userManager.isManagedProfile(user.identifier) && !DeviceUtils.isTelevision(app))) { continue } val statsManager = Utils.getUserContext(app, user).getSystemService( Loading
src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt +7 −1 Original line number Diff line number Diff line Loading @@ -117,6 +117,9 @@ private const val AUTO_REVOKE_ENABLED = true private var SKIP_NEXT_RUN = false private val EXEMPT_PERMISSIONS = listOf( android.Manifest.permission.ACTIVITY_RECOGNITION) private val DEFAULT_UNUSED_THRESHOLD_MS = if (AUTO_REVOKE_ENABLED) DAYS.toMillis(90) else Long.MAX_VALUE fun getUnusedThresholdMs(context: Context) = when { Loading Loading @@ -339,8 +342,11 @@ private suspend fun revokePermissionsOnUnusedApps(context: Context): ?: return@forEachInParallel val fixed = group.isBackgroundFixed || group.isForegroundFixed val granted = group.permissions.any { (_, perm) -> perm.isGrantedIncludingAppOp && perm.name !in EXEMPT_PERMISSIONS } if (!fixed && group.permissions.any { (_, perm) -> perm.isGrantedIncludingAppOp } && granted && !group.isGrantedByDefault && !group.isGrantedByRole && group.isUserSensitive) { Loading
src/com/android/permissioncontroller/role/model/RequiredActivity.java +2 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; import androidx.annotation.NonNull; Loading @@ -37,8 +36,8 @@ import java.util.List; public class RequiredActivity extends RequiredComponent { public RequiredActivity(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { super(intentFilterData, permission, metaData); @Nullable String permission) { super(intentFilterData, permission); } @NonNull Loading @@ -63,10 +62,4 @@ public class RequiredActivity extends RequiredComponent { protected String getComponentPermission(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.permission; } @Nullable @Override protected Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.metaData; } }
src/com/android/permissioncontroller/role/model/RequiredBroadcastReceiver.java +2 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.UserHandle; import androidx.annotation.NonNull; Loading @@ -37,8 +36,8 @@ import java.util.List; public class RequiredBroadcastReceiver extends RequiredComponent { public RequiredBroadcastReceiver(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { super(intentFilterData, permission, metaData); @Nullable String permission) { super(intentFilterData, permission); } @NonNull Loading @@ -62,10 +61,4 @@ public class RequiredBroadcastReceiver extends RequiredComponent { protected String getComponentPermission(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.permission; } @Nullable @Override protected Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo) { return resolveInfo.activityInfo.metaData; } }
src/com/android/permissioncontroller/role/model/RequiredComponent.java +6 −62 Original line number Diff line number Diff line Loading @@ -21,11 +21,9 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.util.ArraySet; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -39,8 +37,6 @@ import java.util.Objects; */ public abstract class RequiredComponent { private static final String LOG_TAG = RequiredComponent.class.getSimpleName(); /** * The {@code Intent} or {@code IntentFilter} data to match the components. */ Loading @@ -56,20 +52,10 @@ public abstract class RequiredComponent { @Nullable private final String mPermission; /** * The meta data required on a component for match to succeed. * * @see android.content.pm.PackageItemInfo#metaData */ @NonNull private final List<RequiredMetaData> mMetaData; public RequiredComponent(@NonNull IntentFilterData intentFilterData, @Nullable String permission, @NonNull List<RequiredMetaData> metaData) { @Nullable String permission) { mIntentFilterData = intentFilterData; mPermission = permission; mMetaData = metaData; } @NonNull Loading @@ -82,11 +68,6 @@ public abstract class RequiredComponent { return mPermission; } @NonNull public List<RequiredMetaData> getMetaData() { return mMetaData; } /** * Get the component that matches this required component within a package, if any. * Loading Loading @@ -127,13 +108,9 @@ public abstract class RequiredComponent { if (packageName != null) { intent.setPackage(packageName); } int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; boolean hasMetaData = !mMetaData.isEmpty(); if (hasMetaData) { flags |= PackageManager.GET_META_DATA; } List<ResolveInfo> resolveInfos = queryIntentComponentsAsUser(intent, flags, user, context); List<ResolveInfo> resolveInfos = queryIntentComponentsAsUser(intent, PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, user, context); ArraySet<String> componentPackageNames = new ArraySet<>(); List<ComponentName> componentNames = new ArrayList<>(); Loading @@ -148,27 +125,6 @@ public abstract class RequiredComponent { } } if (hasMetaData) { Bundle componentMetaData = getComponentMetaData(resolveInfo); if (componentMetaData == null) { Log.w(LOG_TAG, "Component meta data is null"); continue; } boolean isMetaDataQualified = true; int metaDataSize = mMetaData.size(); for (int metaDataIndex = 0; metaDataIndex < metaDataSize; metaDataIndex++) { RequiredMetaData metaData = mMetaData.get(metaDataIndex); if (!metaData.isQualified(componentMetaData)) { isMetaDataQualified = false; break; } } if (!isMetaDataQualified) { continue; } } ComponentName componentName = getComponentComponentName(resolveInfo); String componentPackageName = componentName.getPackageName(); if (componentPackageNames.contains(componentPackageName)) { Loading Loading @@ -216,22 +172,11 @@ public abstract class RequiredComponent { @Nullable protected abstract String getComponentPermission(@NonNull ResolveInfo resolveInfo); /** * Get the meta data associated with a component. * * @param resolveInfo the {@code ResolveInfo} of the component * * @return the meta data associated with a component */ @Nullable protected abstract Bundle getComponentMetaData(@NonNull ResolveInfo resolveInfo); @Override public String toString() { return "RequiredComponent{" + "mIntentFilterData=" + mIntentFilterData + ", mPermission='" + mPermission + '\'' + ", mMetaData=" + mMetaData + '}'; } Loading @@ -245,12 +190,11 @@ public abstract class RequiredComponent { } RequiredComponent that = (RequiredComponent) object; return Objects.equals(mIntentFilterData, that.mIntentFilterData) && Objects.equals(mPermission, that.mPermission) && Objects.equals(mMetaData, that.mMetaData); && Objects.equals(mPermission, that.mPermission); } @Override public int hashCode() { return Objects.hash(mIntentFilterData, mPermission, mMetaData); return Objects.hash(mIntentFilterData, mPermission); } }