Loading src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java +4 −2 Original line number Diff line number Diff line Loading @@ -756,7 +756,8 @@ public class GrantPermissionsActivity extends Activity || groupState.mGroup.getName().equals( Manifest.permission_group.MICROPHONE)) { mButtonVisibilities[ALLOW_BUTTON] = false; if (mCouldHaveFgCapabilities) { if (mCouldHaveFgCapabilities || Utils.isEmergencyApp(this, mCallingPackage)) { mButtonVisibilities[ALLOW_ALWAYS_BUTTON] = true; mButtonVisibilities[ALLOW_ONE_TIME_BUTTON] = false; } else { Loading Loading @@ -832,7 +833,8 @@ public class GrantPermissionsActivity extends Activity || groupState.mGroup.getName().equals( Manifest.permission_group.MICROPHONE)) { mButtonVisibilities[ALLOW_BUTTON] = false; if (mCouldHaveFgCapabilities) { if (mCouldHaveFgCapabilities || Utils.isEmergencyApp(this, mCallingPackage)) { mButtonVisibilities[ALLOW_ALWAYS_BUTTON] = true; mButtonVisibilities[ALLOW_ONE_TIME_BUTTON] = false; } else { Loading src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt +11 −3 Original line number Diff line number Diff line Loading @@ -278,9 +278,11 @@ class AppPermissionViewModel( if (detailId == 0) { detailId = getForegroundCapableDetailResId(foregroundCapableType) if (detailId != 0) { detailResIdLiveData.value = detailId to null } } } } else { // Allow / Deny case allowedState.isShown = true Loading Loading @@ -308,7 +310,8 @@ class AppPermissionViewModel( allowedState.isShown = false allowedForegroundState.isChecked = allowedState.isChecked allowedForegroundState.isEnabled = allowedState.isEnabled if (couldPackageHaveFgCapabilities) { if (couldPackageHaveFgCapabilities || (Utils.isEmergencyApp(app, packageName) && isMicrophone(permGroupName))) { allowedAlwaysState.isShown = true allowedAlwaysState.isChecked = allowedForegroundState.isChecked allowedAlwaysState.isEnabled = allowedForegroundState.isEnabled Loading @@ -319,11 +322,13 @@ class AppPermissionViewModel( if (detailId == 0) { detailId = getForegroundCapableDetailResId(foregroundCapableType) if (detailId != 0) { detailResIdLiveData.value = detailId to null } } } } } if (group.packageInfo.targetSdkVersion < Build.VERSION_CODES.M) { // Pre-M app's can't ask for runtime permissions askState.isShown = false Loading Loading @@ -367,6 +372,9 @@ class AppPermissionViewModel( return permissionGroupName.equals(Manifest.permission_group.CAMERA) || permissionGroupName.equals(Manifest.permission_group.MICROPHONE) } private fun isMicrophone(permissionGroupName: String): Boolean { return permissionGroupName.equals(Manifest.permission_group.MICROPHONE) } /** * Modifies the radio buttons to reflect the current policy fixing state Loading src/com/android/permissioncontroller/permission/utils/Utils.java +14 −0 Original line number Diff line number Diff line Loading @@ -1127,4 +1127,18 @@ public final class Utils { || (userManager.isManagedProfile(user.getIdentifier()) && !DeviceUtils.isTelevision(app)); } /** * @return Whether a package is an emergency app. */ public static boolean isEmergencyApp(@NonNull Context context, @NonNull String packageName) { try { return context.getSystemService(RoleManager.class) .getRoleHolders(RoleManager.ROLE_EMERGENCY).contains(packageName); } catch (Throwable t) { // Avoid crashing for any reason, this isn't very well tested Log.e(LOG_TAG, "Unable to check if " + packageName + " is an emergency app.", t); return false; } } } Loading
src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java +4 −2 Original line number Diff line number Diff line Loading @@ -756,7 +756,8 @@ public class GrantPermissionsActivity extends Activity || groupState.mGroup.getName().equals( Manifest.permission_group.MICROPHONE)) { mButtonVisibilities[ALLOW_BUTTON] = false; if (mCouldHaveFgCapabilities) { if (mCouldHaveFgCapabilities || Utils.isEmergencyApp(this, mCallingPackage)) { mButtonVisibilities[ALLOW_ALWAYS_BUTTON] = true; mButtonVisibilities[ALLOW_ONE_TIME_BUTTON] = false; } else { Loading Loading @@ -832,7 +833,8 @@ public class GrantPermissionsActivity extends Activity || groupState.mGroup.getName().equals( Manifest.permission_group.MICROPHONE)) { mButtonVisibilities[ALLOW_BUTTON] = false; if (mCouldHaveFgCapabilities) { if (mCouldHaveFgCapabilities || Utils.isEmergencyApp(this, mCallingPackage)) { mButtonVisibilities[ALLOW_ALWAYS_BUTTON] = true; mButtonVisibilities[ALLOW_ONE_TIME_BUTTON] = false; } else { Loading
src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt +11 −3 Original line number Diff line number Diff line Loading @@ -278,9 +278,11 @@ class AppPermissionViewModel( if (detailId == 0) { detailId = getForegroundCapableDetailResId(foregroundCapableType) if (detailId != 0) { detailResIdLiveData.value = detailId to null } } } } else { // Allow / Deny case allowedState.isShown = true Loading Loading @@ -308,7 +310,8 @@ class AppPermissionViewModel( allowedState.isShown = false allowedForegroundState.isChecked = allowedState.isChecked allowedForegroundState.isEnabled = allowedState.isEnabled if (couldPackageHaveFgCapabilities) { if (couldPackageHaveFgCapabilities || (Utils.isEmergencyApp(app, packageName) && isMicrophone(permGroupName))) { allowedAlwaysState.isShown = true allowedAlwaysState.isChecked = allowedForegroundState.isChecked allowedAlwaysState.isEnabled = allowedForegroundState.isEnabled Loading @@ -319,11 +322,13 @@ class AppPermissionViewModel( if (detailId == 0) { detailId = getForegroundCapableDetailResId(foregroundCapableType) if (detailId != 0) { detailResIdLiveData.value = detailId to null } } } } } if (group.packageInfo.targetSdkVersion < Build.VERSION_CODES.M) { // Pre-M app's can't ask for runtime permissions askState.isShown = false Loading Loading @@ -367,6 +372,9 @@ class AppPermissionViewModel( return permissionGroupName.equals(Manifest.permission_group.CAMERA) || permissionGroupName.equals(Manifest.permission_group.MICROPHONE) } private fun isMicrophone(permissionGroupName: String): Boolean { return permissionGroupName.equals(Manifest.permission_group.MICROPHONE) } /** * Modifies the radio buttons to reflect the current policy fixing state Loading
src/com/android/permissioncontroller/permission/utils/Utils.java +14 −0 Original line number Diff line number Diff line Loading @@ -1127,4 +1127,18 @@ public final class Utils { || (userManager.isManagedProfile(user.getIdentifier()) && !DeviceUtils.isTelevision(app)); } /** * @return Whether a package is an emergency app. */ public static boolean isEmergencyApp(@NonNull Context context, @NonNull String packageName) { try { return context.getSystemService(RoleManager.class) .getRoleHolders(RoleManager.ROLE_EMERGENCY).contains(packageName); } catch (Throwable t) { // Avoid crashing for any reason, this isn't very well tested Log.e(LOG_TAG, "Unable to check if " + packageName + " is an emergency app.", t); return false; } } }