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;
+ }
+ }
+}