Gate permissions hub assistant handling behind flag

Update the user sensitive flags of the current assistant whenever it is
added or removed from the role, only when the device config flag is set.
Adds camera/mic icon flags, and only shows location on
reviewOngoingUsageFragment when permission hub is enabled.

Fixes: 159998363
Test: manual
Change-Id: Ice52dc044c34b31e6930f461008fbeafa70b1e3b
diff --git a/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt b/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
index 1d8b9ac..49acf8a 100644
--- a/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
+++ b/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
@@ -25,6 +25,7 @@
 import android.os.Build
 import android.os.UserHandle
 import com.android.permissioncontroller.PermissionControllerApplication
+import com.android.permissioncontroller.permission.debug.shouldShowCameraMicIndicators
 import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo
 import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState
 import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
@@ -78,7 +79,7 @@
             updateIfActive()
         }
 
-        if (isMicrophone) {
+        if (isMicrophone && shouldShowCameraMicIndicators()) {
             addSource(assistantPkgsLiveData) {
                 updateIfActive()
             }
@@ -91,7 +92,8 @@
         val permissionState = permissionStateLiveData.value
 
         if (packageInfo == null || permissionGroup == null || permissionState == null ||
-            (isMicrophone && assistantPkgsLiveData.value == null)) {
+            ((isMicrophone && shouldShowCameraMicIndicators()) &&
+                assistantPkgsLiveData.value == null)) {
             if (packageInfoLiveData.isInitialized && permGroupLiveData.isInitialized &&
                 permissionStateLiveData.isInitialized) {
                 invalidateSingle(Triple(packageName, permGroupName, user))
@@ -193,7 +195,8 @@
         }
 
         // Make the current assistant microphone permission show as user sensitive
-        if (isMicrophone && packageName in assistantPkgsLiveData.value ?: emptyList()) {
+        if (shouldShowCameraMicIndicators() &&
+            isMicrophone && packageName in assistantPkgsLiveData.value ?: emptyList()) {
             return true
         }
 
@@ -309,7 +312,6 @@
 
     override fun onActive() {
         super.onActive()
-
         if (isSpecialLocation) {
             LocationUtils.addLocationListener(this)
             updateIfActive()
diff --git a/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageActivity.java b/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageActivity.java
index bb2b42e..62d3009 100644
--- a/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageActivity.java
+++ b/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageActivity.java
@@ -26,7 +26,6 @@
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.permissioncontroller.DeviceUtils;
-import com.android.permissioncontroller.permission.debug.UtilsKt;
 
 /**
  * A dialog listing the currently uses of camera, microphone, and location.
@@ -40,7 +39,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        if (!UtilsKt.isPermissionsHub2Enabled()) {
+        if (!UtilsKt.shouldShowCameraMicIndicators()) {
             finish();
             return;
         }
diff --git a/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageFragment.java b/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageFragment.java
index 0eb785a..5a8670a 100644
--- a/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageFragment.java
+++ b/src/com/android/permissioncontroller/permission/debug/ReviewOngoingUsageFragment.java
@@ -24,6 +24,7 @@
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS;
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_LINE_ITEM;
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_PRIVACY_SETTINGS;
+import static com.android.permissioncontroller.permission.debug.UtilsKt.shouldShowPermissionsDashboard;
 
 import android.app.AlertDialog;
 import android.content.Context;
@@ -84,9 +85,13 @@
 
         mPermissionUsages = new PermissionUsages(getActivity());
         mStartTime = Math.max(System.currentTimeMillis() - numMillis, Instant.EPOCH.toEpochMilli());
-        mPermissionUsages.load(null, new String[]{CAMERA, LOCATION, MICROPHONE}, mStartTime,
-                Long.MAX_VALUE, PermissionUsages.USAGE_FLAG_LAST, getActivity().getLoaderManager(),
-                false, false, this::onPermissionUsagesLoaded, false);
+        String[] permissions = new String[]{CAMERA, MICROPHONE};
+        if (shouldShowPermissionsDashboard()) {
+            permissions = new String[] {CAMERA, LOCATION, MICROPHONE};
+        }
+        mPermissionUsages.load(null, permissions, mStartTime, Long.MAX_VALUE,
+                PermissionUsages.USAGE_FLAG_LAST, getActivity().getLoaderManager(), false, false,
+                this::onPermissionUsagesLoaded, false);
     }
 
     private void onPermissionUsagesLoaded() {
diff --git a/src/com/android/permissioncontroller/permission/debug/Utils.kt b/src/com/android/permissioncontroller/permission/debug/Utils.kt
index 6e1e889..04456f2 100644
--- a/src/com/android/permissioncontroller/permission/debug/Utils.kt
+++ b/src/com/android/permissioncontroller/permission/debug/Utils.kt
@@ -23,20 +23,50 @@
 import android.text.format.DateFormat.getTimeFormat
 import com.android.permissioncontroller.R
 import com.android.permissioncontroller.permission.debug.AppPermissionUsage.GroupUsage
-import java.util.*
+import java.util.Locale
 
 /** Whether to show the Permissions Hub.  */
 private const val PROPERTY_PERMISSIONS_HUB_2_ENABLED = "permissions_hub_2_enabled"
 
+/** Whether to show the mic and camera icons.  */
+private const val PROPERTY_CAMERA_MIC_ICONS_ENABLED = "camera_mic_icons_enabled"
 
 /**
- * Whether the Permissions Hub 2 is enabled.
+ * Whether the Permissions Hub 2 flag is enabled
  *
- * @return whether the Permissions Hub is enabled.
+ * @return whether the flag is enabled
  */
-fun isPermissionsHub2Enabled(): Boolean {
+fun isPermissionsHub2FlagEnabled(): Boolean {
     return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
-            PROPERTY_PERMISSIONS_HUB_2_ENABLED, false)
+        PROPERTY_PERMISSIONS_HUB_2_ENABLED, false)
+}
+/**
+ * Whether to show the Permissions Dashboard
+ *
+ * @return whether to show the Permissions Dashboard.
+ */
+fun shouldShowPermissionsDashboard(): Boolean {
+    return isPermissionsHub2FlagEnabled()
+}
+
+/**
+ * Whether the Camera and Mic Icons are enabled by flag.
+ *
+ * @return whether the Camera and Mic Icons are enabled.
+ */
+fun isCameraMicIconsFlagEnabled(): Boolean {
+    return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+        PROPERTY_CAMERA_MIC_ICONS_ENABLED, false)
+}
+
+/**
+ * Whether to show Camera and Mic Icons. They should be shown if the permission hub, or the icons
+ * specifically, are enabled.
+ *
+ * @return whether to show the icons.
+ */
+fun shouldShowCameraMicIndicators(): Boolean {
+    return isCameraMicIconsFlagEnabled() || isPermissionsHub2FlagEnabled()
 }
 
 /**
diff --git a/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
index bc68f8a..7297792 100644
--- a/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
+++ b/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
@@ -144,7 +144,7 @@
                 break;
 
             case Intent.ACTION_REVIEW_PERMISSION_USAGE: {
-                if (!UtilsKt.isPermissionsHub2Enabled()) {
+                if (!UtilsKt.shouldShowPermissionsDashboard()) {
                     finish();
                     return;
                 }
diff --git a/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java b/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
index 9d26bfa..ddae029 100644
--- a/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
+++ b/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
@@ -17,7 +17,7 @@
 
 import static com.android.permissioncontroller.Constants.EXTRA_SESSION_ID;
 import static com.android.permissioncontroller.Constants.INVALID_SESSION_ID;
-import static com.android.permissioncontroller.permission.debug.UtilsKt.isPermissionsHub2Enabled;
+import static com.android.permissioncontroller.permission.debug.UtilsKt.shouldShowPermissionsDashboard;
 import static com.android.permissioncontroller.permission.ui.handheld.UtilsKt.pressBack;
 
 import android.content.Intent;
@@ -110,7 +110,7 @@
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
 
-        if (isPermissionsHub2Enabled()) {
+        if (shouldShowPermissionsDashboard()) {
             menu.add(Menu.NONE, MENU_PERMISSION_USAGE, Menu.NONE, R.string.permission_usage_title);
         }
     }
diff --git a/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
index 7922d71..7c9c46b 100644
--- a/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
+++ b/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
@@ -22,7 +22,7 @@
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__DENIED;
 import static com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__UNDEFINED;
-import static com.android.permissioncontroller.permission.debug.UtilsKt.isPermissionsHub2Enabled;
+import static com.android.permissioncontroller.permission.debug.UtilsKt.shouldShowPermissionsDashboard;
 import static com.android.permissioncontroller.permission.ui.Category.ALLOWED;
 import static com.android.permissioncontroller.permission.ui.Category.ALLOWED_FOREGROUND;
 import static com.android.permissioncontroller.permission.ui.Category.ASK;
@@ -156,7 +156,7 @@
             updateMenu(mViewModel.getShouldShowSystemLiveData().getValue());
         }
 
-        if (isPermissionsHub2Enabled()) {
+        if (shouldShowPermissionsDashboard()) {
             menu.add(Menu.NONE, MENU_PERMISSION_USAGE, Menu.NONE, R.string.permission_usage_title);
         }
 
diff --git a/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt b/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
index a6233bb..405d93d 100644
--- a/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
+++ b/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
@@ -45,6 +45,7 @@
 import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData.Companion.NON_RUNTIME_NORMAL_PERMS
 import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
 import com.android.permissioncontroller.permission.data.get
+import com.android.permissioncontroller.permission.debug.shouldShowCameraMicIndicators
 import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState
 import com.android.permissioncontroller.permission.ui.Category
 import com.android.permissioncontroller.permission.utils.IPC
@@ -182,6 +183,9 @@
     }
 
     fun shouldShowAssistantMicSwitch(): Boolean {
+        if (!shouldShowCameraMicIndicators()) {
+            return false
+        }
         val rolePkgs = Utils.getUserContext(app, user).getSystemService(RoleManager::class.java)!!
             .getRoleHolders(RoleManager.ROLE_ASSISTANT)
         return packageName in rolePkgs
diff --git a/src/com/android/permissioncontroller/permission/utils/UserSensitiveFlagsUtils.kt b/src/com/android/permissioncontroller/permission/utils/UserSensitiveFlagsUtils.kt
index ad4a8a5..6d77af4 100644
--- a/src/com/android/permissioncontroller/permission/utils/UserSensitiveFlagsUtils.kt
+++ b/src/com/android/permissioncontroller/permission/utils/UserSensitiveFlagsUtils.kt
@@ -31,6 +31,7 @@
 import com.android.permissioncontroller.Constants.ASSISTANT_RECORD_AUDIO_IS_USER_SENSITIVE_KEY
 import com.android.permissioncontroller.PermissionControllerApplication
 import com.android.permissioncontroller.permission.data.UserSensitivityLiveData
+import com.android.permissioncontroller.permission.debug.shouldShowCameraMicIndicators
 import com.android.permissioncontroller.permission.model.livedatatypes.UidSensitivityState
 import com.android.permissioncontroller.permission.utils.Utils.FLAGS_ALWAYS_USER_SENSITIVE
 import kotlinx.coroutines.GlobalScope
@@ -78,7 +79,7 @@
                     // If this package is the current assistant, its microphone permission is not
                     // user sensitive
                     if (perm == Manifest.permission.RECORD_AUDIO &&
-                        pkg.packageName == assistantPkg) {
+                        pkg.packageName == assistantPkg && shouldShowCameraMicIndicators()) {
                         val contentResolver = PermissionControllerApplication.get().contentResolver
                         val shouldHide = Settings.Secure.getInt(contentResolver,
                             ASSISTANT_RECORD_AUDIO_IS_USER_SENSITIVE_KEY, 0) == 0
diff --git a/src/com/android/permissioncontroller/role/model/AssistantRoleBehavior.java b/src/com/android/permissioncontroller/role/model/AssistantRoleBehavior.java
index 1c33a1f..d4dfb7f 100644
--- a/src/com/android/permissioncontroller/role/model/AssistantRoleBehavior.java
+++ b/src/com/android/permissioncontroller/role/model/AssistantRoleBehavior.java
@@ -16,6 +16,8 @@
 
 package com.android.permissioncontroller.role.model;
 
+import static com.android.permissioncontroller.permission.debug.UtilsKt.shouldShowCameraMicIndicators;
+
 import android.app.ActivityManager;
 import android.app.role.RoleManager;
 import android.content.Context;
@@ -174,12 +176,16 @@
 
     @Override
     public void grant(@NonNull Role role, @NonNull String packageName, @NonNull Context context) {
-        UserSensitiveFlagsUtils.setMicUserSensitiveWhenReady(packageName, true);
+        if (shouldShowCameraMicIndicators()) {
+            UserSensitiveFlagsUtils.setMicUserSensitiveWhenReady(packageName, true);
+        }
     }
 
     @Override
     public void revoke(@NonNull Role role, @NonNull String packageName, @NonNull Context context) {
-        UserSensitiveFlagsUtils.setMicUserSensitiveWhenReady(packageName, false);
+        if (shouldShowCameraMicIndicators()) {
+            UserSensitiveFlagsUtils.setMicUserSensitiveWhenReady(packageName, false);
+        }
     }
 
     private boolean isAssistantVoiceInteractionService(@NonNull PackageManager pm,