summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-01-17 18:31:40 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-01-17 18:31:40 +0000
commitc1dcd6a1549d26b84680c554dd06bdeea57cb679 (patch)
tree0cdf70ec379b11b1b173ac92f98bc2fdf8cb3c73
parentf4daf8071ea3d537353ec22d934927fee4a0dd26 (diff)
parent4fa5f4e6d67299adffb5ff33779a5b23c2af3266 (diff)
downloadandroid_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.tar.gz
android_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.tar.bz2
android_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.zip
Merge "Add getDefaultHolders() for SmsRoleBehavior."
-rw-r--r--src/com/android/packageinstaller/role/model/DefaultRoleHolders.java98
-rw-r--r--src/com/android/packageinstaller/role/model/Role.java2
-rw-r--r--src/com/android/packageinstaller/role/model/Roles.java6
-rw-r--r--src/com/android/packageinstaller/role/model/SmsRoleBehavior.java13
-rw-r--r--src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java15
-rw-r--r--src/com/android/packageinstaller/role/ui/DefaultAppActivity.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/DefaultAppFragment.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/RequestRoleActivity.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/RequestRoleFragment.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/RoleListLiveData.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/SpecialAppAccessActivity.java2
-rw-r--r--src/com/android/packageinstaller/role/ui/SpecialAppAccessFragment.java2
12 files changed, 130 insertions, 18 deletions
diff --git a/src/com/android/packageinstaller/role/model/DefaultRoleHolders.java b/src/com/android/packageinstaller/role/model/DefaultRoleHolders.java
new file mode 100644
index 00000000..d4b934e6
--- /dev/null
+++ b/src/com/android/packageinstaller/role/model/DefaultRoleHolders.java
@@ -0,0 +1,98 @@
+/*
+ * 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.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Provides access to all the default role holders.
+ */
+public class DefaultRoleHolders {
+
+ private static final String LOG_TAG = DefaultRoleHolders.class.getSimpleName();
+
+ @NonNull
+ private static final Object sLock = new Object();
+
+ private static ArrayMap<String, List<String>> sDefaultRoleHolders;
+
+ /**
+ * Get the default role holders.
+ *
+ * @param context the {@code Context} used to read the system resource
+ *
+ * @return a map from role name to a list of package names of the default holders
+ */
+ @NonNull
+ public static ArrayMap<String, List<String>> get(@NonNull Context context) {
+ synchronized (sLock) {
+ if (sDefaultRoleHolders == null) {
+ sDefaultRoleHolders = load(context);
+ }
+ return sDefaultRoleHolders;
+ }
+ }
+
+ @NonNull
+ private static ArrayMap<String, List<String>> load(@NonNull Context context) {
+ ArrayMap<String, List<String>> defaultRoleHolders = new ArrayMap<>();
+ String[] items = context.getResources().getStringArray(
+ android.R.array.config_defaultRoleHolders);
+ int itemsLength = items.length;
+ for (int i = 0; i < itemsLength; i++) {
+ String item = items[i];
+
+ item = item.trim();
+ String[] roleNameAndPackageNames = item.split("\\s*:\\s*", 2);
+ if (roleNameAndPackageNames.length != 2) {
+ Log.e(LOG_TAG, "Invalid item: " + item);
+ continue;
+ }
+ String roleName = roleNameAndPackageNames[0];
+ if (roleName.isEmpty()) {
+ Log.e(LOG_TAG, "Empty role name: " + item);
+ continue;
+ }
+ if (defaultRoleHolders.containsKey(roleName)) {
+ Log.e(LOG_TAG, "Duplicate role name: " + roleName);
+ continue;
+ }
+ String packageNamesString = roleNameAndPackageNames[1];
+ if (packageNamesString.isEmpty()) {
+ Log.e(LOG_TAG, "Empty package names: " + item);
+ continue;
+ }
+ List<String> packageNames = Arrays.asList(packageNamesString.split("\\s*,\\s*"));
+ ArraySet<String> uniquePackageNames = new ArraySet<>(packageNames);
+ if (packageNames.size() != uniquePackageNames.size()) {
+ Log.e(LOG_TAG, "Duplicate package names: " + packageNamesString);
+ packageNames.clear();
+ packageNames.addAll(uniquePackageNames);
+ }
+ defaultRoleHolders.put(roleName, packageNames);
+ }
+ return defaultRoleHolders;
+ }
+}
diff --git a/src/com/android/packageinstaller/role/model/Role.java b/src/com/android/packageinstaller/role/model/Role.java
index 556e8d7c..46a82adc 100644
--- a/src/com/android/packageinstaller/role/model/Role.java
+++ b/src/com/android/packageinstaller/role/model/Role.java
@@ -397,7 +397,7 @@ public class Role {
otherRoleNames.remove(mName);
List<String> permissionsToRevoke = new ArrayList<>(mPermissions);
- ArrayMap<String, Role> roles = Roles.getRoles(context);
+ ArrayMap<String, Role> roles = Roles.get(context);
int otherRoleNamesSize = otherRoleNames.size();
for (int i = 0; i < otherRoleNamesSize; i++) {
String roleName = otherRoleNames.get(i);
diff --git a/src/com/android/packageinstaller/role/model/Roles.java b/src/com/android/packageinstaller/role/model/Roles.java
index d78e6d1f..0a473c4f 100644
--- a/src/com/android/packageinstaller/role/model/Roles.java
+++ b/src/com/android/packageinstaller/role/model/Roles.java
@@ -125,17 +125,17 @@ public class Roles {
* @return a map from role name to {@link Role} instances
*/
@NonNull
- public static ArrayMap<String, Role> getRoles(@NonNull Context context) {
+ public static ArrayMap<String, Role> get(@NonNull Context context) {
synchronized (sLock) {
if (sRoles == null) {
- sRoles = loadRoles(context);
+ sRoles = load(context);
}
return sRoles;
}
}
@NonNull
- private static ArrayMap<String, Role> loadRoles(@NonNull Context context) {
+ private static ArrayMap<String, Role> load(@NonNull Context context) {
// If the storage model feature flag is disabled, we need to fiddle
// around with permission definitions to return us to pre-Q behavior.
// STOPSHIP(b/112545973): remove once feature enabled by default
diff --git a/src/com/android/packageinstaller/role/model/SmsRoleBehavior.java b/src/com/android/packageinstaller/role/model/SmsRoleBehavior.java
index 346fea80..7a1e7632 100644
--- a/src/com/android/packageinstaller/role/model/SmsRoleBehavior.java
+++ b/src/com/android/packageinstaller/role/model/SmsRoleBehavior.java
@@ -65,8 +65,15 @@ public class SmsRoleBehavior implements RoleBehavior {
@Nullable
private String getDefaultHolder(@NonNull Role role, @NonNull Context context) {
- // TODO: STOPSHIP: Read system resource for default handler.
- return null;
+ String defaultPackageName = CollectionUtils.firstOrNull(DefaultRoleHolders.get(context).get(
+ role.getName()));
+ if (defaultPackageName == null) {
+ return null;
+ }
+ if (!role.isPackageQualified(defaultPackageName, context)) {
+ return null;
+ }
+ return defaultPackageName;
}
@Nullable
@@ -77,6 +84,8 @@ public class SmsRoleBehavior implements RoleBehavior {
return defaultPackageName;
}
+ // TODO: STOPSHIP: This was the previous behavior, however this allows any third-party app
+ // to suddenly become the default SMS app and get the permissions.
List<String> qualifyingPackageNames = role.getQualifyingPackagesAsUser(
Process.myUserHandle(), context);
return CollectionUtils.firstOrNull(qualifyingPackageNames);
diff --git a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
index 17c24812..2dc318cf 100644
--- a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
+++ b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
@@ -47,6 +47,9 @@ public class RoleControllerServiceImpl extends RoleControllerService {
private static final String LOG_TAG = RoleControllerServiceImpl.class.getSimpleName();
+ // TODO: STOPSHIP: Turn off debugging before we ship.
+ private static final boolean DEBUG = true;
+
private RoleManager mRoleManager;
private HandlerThread mWorkerThread;
@@ -136,10 +139,12 @@ public class RoleControllerServiceImpl extends RoleControllerService {
@WorkerThread
private void grantDefaultRoles(@NonNull RoleManagerCallback callback) {
- Log.i(LOG_TAG, "Granting default roles, user: " + UserHandle.myUserId());
+ if (DEBUG) {
+ Log.i(LOG_TAG, "Granting default roles, user: " + UserHandle.myUserId());
+ }
// Gather the available roles for current user.
- ArrayMap<String, Role> roleMap = Roles.getRoles(this);
+ ArrayMap<String, Role> roleMap = Roles.get(this);
List<Role> roles = new ArrayList<>();
List<String> roleNames = new ArrayList<>();
ArraySet<String> addedRoleNames = new ArraySet<>();
@@ -248,7 +253,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
@WorkerThread
private void addRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull RoleManagerCallback callback) {
- Role role = Roles.getRoles(this).get(roleName);
+ Role role = Roles.get(this).get(roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
callback.onFailure();
@@ -302,7 +307,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
@WorkerThread
private void removeRoleHolder(@NonNull String roleName, @NonNull String packageName,
@NonNull RoleManagerCallback callback) {
- Role role = Roles.getRoles(this).get(roleName);
+ Role role = Roles.get(this).get(roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
callback.onFailure();
@@ -332,7 +337,7 @@ public class RoleControllerServiceImpl extends RoleControllerService {
@WorkerThread
private void clearRoleHolders(@NonNull String roleName, @NonNull RoleManagerCallback callback) {
- Role role = Roles.getRoles(this).get(roleName);
+ Role role = Roles.get(this).get(roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
callback.onFailure();
diff --git a/src/com/android/packageinstaller/role/ui/DefaultAppActivity.java b/src/com/android/packageinstaller/role/ui/DefaultAppActivity.java
index 5da5d5a6..65fc8275 100644
--- a/src/com/android/packageinstaller/role/ui/DefaultAppActivity.java
+++ b/src/com/android/packageinstaller/role/ui/DefaultAppActivity.java
@@ -66,7 +66,7 @@ public class DefaultAppActivity extends FragmentActivity {
user = Process.myUserHandle();
}
- Role role = Roles.getRoles(this).get(roleName);
+ Role role = Roles.get(this).get(roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
finish();
diff --git a/src/com/android/packageinstaller/role/ui/DefaultAppFragment.java b/src/com/android/packageinstaller/role/ui/DefaultAppFragment.java
index fbf3ec39..25d8a2b4 100644
--- a/src/com/android/packageinstaller/role/ui/DefaultAppFragment.java
+++ b/src/com/android/packageinstaller/role/ui/DefaultAppFragment.java
@@ -91,7 +91,7 @@ public class DefaultAppFragment extends SettingsFragment
super.onActivityCreated(savedInstanceState);
Activity activity = requireActivity();
- mRole = Roles.getRoles(activity).get(mRoleName);
+ mRole = Roles.get(activity).get(mRoleName);
activity.setTitle(mRole.getLabelResource());
mViewModel = ViewModelProviders.of(this, new DefaultAppViewModel.Factory(mRole, mUser,
diff --git a/src/com/android/packageinstaller/role/ui/RequestRoleActivity.java b/src/com/android/packageinstaller/role/ui/RequestRoleActivity.java
index e31f1a7e..e6fb868a 100644
--- a/src/com/android/packageinstaller/role/ui/RequestRoleActivity.java
+++ b/src/com/android/packageinstaller/role/ui/RequestRoleActivity.java
@@ -70,7 +70,7 @@ public class RequestRoleActivity extends FragmentActivity {
}
// Perform checks here so that we have a chance to finish without being visible to user.
- Role role = Roles.getRoles(this).get(mRoleName);
+ Role role = Roles.get(this).get(mRoleName);
if (role == null) {
Log.w(LOG_TAG, "Unknown role: " + mRoleName);
finish();
diff --git a/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java b/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java
index c635d59b..46d7f8bd 100644
--- a/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java
+++ b/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java
@@ -89,7 +89,7 @@ public class RequestRoleFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Context context = requireContext();
- Role role = Roles.getRoles(context).get(mRoleName);
+ Role role = Roles.get(context).get(mRoleName);
if (role == null) {
Log.w(LOG_TAG, "Unknown role: " + mRoleName);
finish();
diff --git a/src/com/android/packageinstaller/role/ui/RoleListLiveData.java b/src/com/android/packageinstaller/role/ui/RoleListLiveData.java
index 3a5b617b..ae451f37 100644
--- a/src/com/android/packageinstaller/role/ui/RoleListLiveData.java
+++ b/src/com/android/packageinstaller/role/ui/RoleListLiveData.java
@@ -79,7 +79,7 @@ public class RoleListLiveData extends AsyncTaskLiveData<List<RoleItem>>
@Override
@WorkerThread
protected List<RoleItem> loadValueInBackground() {
- ArrayMap<String, Role> roles = Roles.getRoles(mContext);
+ ArrayMap<String, Role> roles = Roles.get(mContext);
List<RoleItem> roleItems = new ArrayList<>();
RoleManager roleManager = mContext.getSystemService(RoleManager.class);
diff --git a/src/com/android/packageinstaller/role/ui/SpecialAppAccessActivity.java b/src/com/android/packageinstaller/role/ui/SpecialAppAccessActivity.java
index 9d23dcc6..557e73dd 100644
--- a/src/com/android/packageinstaller/role/ui/SpecialAppAccessActivity.java
+++ b/src/com/android/packageinstaller/role/ui/SpecialAppAccessActivity.java
@@ -55,7 +55,7 @@ public class SpecialAppAccessActivity extends FragmentActivity {
String roleName = getIntent().getStringExtra(Intent.EXTRA_ROLE_NAME);
- Role role = Roles.getRoles(this).get(roleName);
+ Role role = Roles.get(this).get(roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
finish();
diff --git a/src/com/android/packageinstaller/role/ui/SpecialAppAccessFragment.java b/src/com/android/packageinstaller/role/ui/SpecialAppAccessFragment.java
index 0c875611..7719acf2 100644
--- a/src/com/android/packageinstaller/role/ui/SpecialAppAccessFragment.java
+++ b/src/com/android/packageinstaller/role/ui/SpecialAppAccessFragment.java
@@ -87,7 +87,7 @@ public class SpecialAppAccessFragment extends SettingsFragment
super.onActivityCreated(savedInstanceState);
Activity activity = requireActivity();
- mRole = Roles.getRoles(activity).get(mRoleName);
+ mRole = Roles.get(activity).get(mRoleName);
activity.setTitle(mRole.getLabelResource());
mViewModel = ViewModelProviders.of(this, new SpecialAppAccessViewModel.Factory(mRole,