diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-01-17 18:31:40 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-17 18:31:40 +0000 |
commit | c1dcd6a1549d26b84680c554dd06bdeea57cb679 (patch) | |
tree | 0cdf70ec379b11b1b173ac92f98bc2fdf8cb3c73 | |
parent | f4daf8071ea3d537353ec22d934927fee4a0dd26 (diff) | |
parent | 4fa5f4e6d67299adffb5ff33779a5b23c2af3266 (diff) | |
download | android_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.tar.gz android_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.tar.bz2 android_packages_apps_PackageInstaller-c1dcd6a1549d26b84680c554dd06bdeea57cb679.zip |
Merge "Add getDefaultHolders() for SmsRoleBehavior."
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, |