Add visibility config for assistant, home and emergency role.

Default assistant, home and emergency could be hidden from users, so
keep this ability when we migrate to roles.

Bug: 124452117
Bug: 124260975
Test: manual
Change-Id: I03265d3f19950b603f74f33b18492ede868e6e49
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java b/PermissionController/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
index b58fda9..92191ba 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
@@ -70,6 +70,12 @@
                 context);
     }
 
+    @Override
+    public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
+            @NonNull Context context) {
+        return VisibilityMixin.isVisible("config_showDefaultAssistant", context);
+    }
+
     @Nullable
     @Override
     public Intent getManageIntentAsUser(@NonNull Role role, @NonNull UserHandle user,
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/EmergencyRoleBehavior.java b/PermissionController/src/com/android/packageinstaller/role/model/EmergencyRoleBehavior.java
index b4220a3..0f5875d 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/EmergencyRoleBehavior.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/EmergencyRoleBehavior.java
@@ -69,6 +69,12 @@
         return fallbackPackageInfo != null ? fallbackPackageInfo.packageName : null;
     }
 
+    @Override
+    public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
+            @NonNull Context context) {
+        return VisibilityMixin.isVisible("config_showDefaultEmergency", context);
+    }
+
     @Nullable
     @Override
     public CharSequence getConfirmationMessage(@NonNull Role role, @NonNull String packageName,
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/ExclusiveDefaultHolderMixin.java b/PermissionController/src/com/android/packageinstaller/role/model/ExclusiveDefaultHolderMixin.java
index e9f8bbf..86073c8 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/ExclusiveDefaultHolderMixin.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/ExclusiveDefaultHolderMixin.java
@@ -61,7 +61,13 @@
             Log.w(LOG_TAG, "Cannot find resource for default holder: " + resourceName);
             return null;
         }
-        String packageName = resources.getString(resourceId);
+        String packageName;
+        try {
+            packageName = resources.getString(resourceId);
+        } catch (Resources.NotFoundException e) {
+            Log.w(LOG_TAG, "Cannot get resource for default holder: " + resourceName, e);
+            return null;
+        }
         if (TextUtils.isEmpty(packageName)) {
             return null;
         }
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java b/PermissionController/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java
index 87eb48e..38b85d5 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/HomeRoleBehavior.java
@@ -85,6 +85,12 @@
     }
 
     @Override
+    public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
+            @NonNull Context context) {
+        return VisibilityMixin.isVisible("config_showDefaultHome", context);
+    }
+
+    @Override
     public void prepareApplicationPreferenceAsUser(@NonNull Role role,
             @NonNull Preference preference, @NonNull ApplicationInfo applicationInfo,
             @NonNull UserHandle user, @NonNull Context context) {
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/Role.java b/PermissionController/src/com/android/packageinstaller/role/model/Role.java
index 1ae8b1d..d2c32b8 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/Role.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/Role.java
@@ -247,6 +247,21 @@
     }
 
     /**
+     * Check whether this role should be visible to user.
+     *
+     * @param user the user to check for
+     * @param context the {@code Context} to retrieve system services
+     *
+     * @return whether this role should be visible to user
+     */
+    public boolean isVisibleAsUser(@NonNull UserHandle user, @NonNull Context context) {
+        if (mBehavior != null) {
+            return mBehavior.isVisibleAsUser(this, user, context);
+        }
+        return true;
+    }
+
+    /**
      * Get the {@link Intent} to manage this role, or {@code null} to use the default UI.
      *
      * @param user the user to manage this role for
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/RoleBehavior.java b/PermissionController/src/com/android/packageinstaller/role/model/RoleBehavior.java
index d0f89c3..07362c1 100644
--- a/PermissionController/src/com/android/packageinstaller/role/model/RoleBehavior.java
+++ b/PermissionController/src/com/android/packageinstaller/role/model/RoleBehavior.java
@@ -58,6 +58,14 @@
     }
 
     /**
+     * @see Role#isVisibleAsUser(UserHandle, Context)
+     */
+    default boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
+            @NonNull Context context) {
+        return true;
+    }
+
+    /**
      * @see Role#getManageIntentAsUser(UserHandle, Context)
      */
     @Nullable
diff --git a/PermissionController/src/com/android/packageinstaller/role/model/VisibilityMixin.java b/PermissionController/src/com/android/packageinstaller/role/model/VisibilityMixin.java
new file mode 100644
index 0000000..5096c31
--- /dev/null
+++ b/PermissionController/src/com/android/packageinstaller/role/model/VisibilityMixin.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.packageinstaller.role.model;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Mixin for {@link RoleBehavior#getDefaultHolders(Role, Context)} that returns a single default
+ * role holder from the corresponding string resource.
+ */
+public class VisibilityMixin {
+
+    private static final String LOG_TAG = VisibilityMixin.class.getSimpleName();
+
+    private VisibilityMixin() {}
+
+    /**
+     * @see Role#isVisibleAsUser(UserHandle, Context)
+     */
+    public static boolean isVisible(@NonNull String resourceName, @NonNull Context context) {
+        Resources resources = context.getResources();
+        int resourceId = resources.getIdentifier(resourceName, "boolean", "android");
+        if (resourceId == 0) {
+            Log.w(LOG_TAG, "Cannot find resource for visibility: " + resourceName);
+            return true;
+        }
+        try {
+            return resources.getBoolean(resourceId);
+        } catch (Resources.NotFoundException e) {
+            Log.w(LOG_TAG, "Cannot get resource for visibility: " + resourceName, e);
+            return true;
+        }
+    }
+}