diff options
27 files changed, 355 insertions, 87 deletions
@@ -35,6 +35,9 @@ LOCAL_PRIVILEGED_MODULE := true LOCAL_PROGUARD_FLAG_FILES := proguard.flags +# Comment for now unitl all private API dependencies are removed +# LOCAL_SDK_VERSION := system_current + include frameworks/base/packages/SettingsLib/common.mk include $(BUILD_PACKAGE) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a750491c..8bfa28cd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -127,6 +127,13 @@ android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" android:exported="true"/> + <service android:name=".permission.service.RuntimePermissionPresenterServiceImpl" + android:permission="android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE"> + <intent-filter> + <action android:name="android.permissionpresenterservice.RuntimePermissionPresenterService"/> + </intent-filter> + </service> + <provider android:name=".wear.WearPackageIconProvider" android:authorities="com.google.android.packageinstaller.wear.provider" android:grantUriPermissions="true" diff --git a/src/com/android/packageinstaller/InstallAppProgress.java b/src/com/android/packageinstaller/InstallAppProgress.java index 6b8994f6..38f53e53 100755 --- a/src/com/android/packageinstaller/InstallAppProgress.java +++ b/src/com/android/packageinstaller/InstallAppProgress.java @@ -34,7 +34,6 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; -import android.content.pm.VerificationParams; import android.graphics.drawable.LevelListDrawable; import android.net.Uri; import android.os.Bundle; @@ -47,8 +46,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; - -import libcore.io.IoUtils; +import com.android.packageinstaller.permission.utils.IoUtils; import java.io.File; import java.io.FileInputStream; diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java index 801b9c2f..ab4c6045 100644 --- a/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -24,7 +24,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; @@ -51,7 +50,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TabHost; import android.widget.TextView; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.io.File; import java.io.FileOutputStream; diff --git a/src/com/android/packageinstaller/PackageUtil.java b/src/com/android/packageinstaller/PackageUtil.java index ab2b829e..330cbbce 100644 --- a/src/com/android/packageinstaller/PackageUtil.java +++ b/src/com/android/packageinstaller/PackageUtil.java @@ -47,25 +47,12 @@ public class PackageUtil { public static final String INTENT_ATTR_PACKAGE_NAME=PREFIX+"PackageName"; /** - * Utility method to get application information for a given {@link File} - */ - public static ApplicationInfo getApplicationInfo(File sourcePath) { - final PackageParser parser = new PackageParser(); - try { - PackageParser.Package pkg = parser.parseMonolithicPackage(sourcePath, 0); - return pkg.applicationInfo; - } catch (PackageParserException e) { - return null; - } - } - - /** * Utility method to get package information for a given {@link File} */ public static PackageParser.Package getPackageInfo(File sourceFile) { final PackageParser parser = new PackageParser(); try { - return parser.parseMonolithicPackage(sourceFile, 0); + return parser.parsePackage(sourceFile, 0); } catch (PackageParserException e) { return null; } diff --git a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java index 214571ba..ca66449d 100644 --- a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java +++ b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java @@ -25,11 +25,12 @@ import android.content.pm.PackageManager; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.os.Build; +import android.os.Process; import android.os.UserHandle; import android.util.ArrayMap; -import com.android.internal.util.ArrayUtils; import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.LocationUtils; import java.util.ArrayList; @@ -93,7 +94,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> } return create(context, packageInfo, groupInfo, permissionInfos, - new UserHandle(context.getUserId())); + Process.myUserHandle()); } public static AppPermissionGroup create(Context context, PackageInfo packageInfo, @@ -145,11 +146,10 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> final boolean granted = (packageInfo.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0; - final int appOp = PLATFORM_PACKAGE_NAME.equals(requestedPermissionInfo.packageName) - ? AppOpsManager.permissionToOpCode(requestedPermissionInfo.name) - : AppOpsManager.OP_NONE; + final String appOp = PLATFORM_PACKAGE_NAME.equals(requestedPermissionInfo.packageName) + ? AppOpsManager.permissionToOp(requestedPermissionInfo.name) : null; - final boolean appOpAllowed = appOp != AppOpsManager.OP_NONE + final boolean appOpAllowed = appOp != null && context.getSystemService(AppOpsManager.class).checkOpNoThrow(appOp, packageInfo.applicationInfo.uid, packageInfo.packageName) == AppOpsManager.MODE_ALLOWED; @@ -308,8 +308,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> if (permission.isGranted()) { return true; } - } else if (permission.isGranted() && (permission.getAppOp() - == AppOpsManager.OP_NONE || permission.isAppOpAllowed())) { + } else if (permission.isGranted() && (permission.getAppOp() == null + || permission.isAppOpAllowed())) { return true; } } diff --git a/src/com/android/packageinstaller/permission/model/Permission.java b/src/com/android/packageinstaller/permission/model/Permission.java index 0425c604..f9dc6e8e 100644 --- a/src/com/android/packageinstaller/permission/model/Permission.java +++ b/src/com/android/packageinstaller/permission/model/Permission.java @@ -16,19 +16,18 @@ package com.android.packageinstaller.permission.model; -import android.app.AppOpsManager; import android.content.pm.PackageManager; public final class Permission { private final String mName; - private final int mAppOp; + private final String mAppOp; private boolean mGranted; private boolean mAppOpAllowed; private int mFlags; public Permission(String name, boolean granted, - int appOp, boolean appOpAllowed, int flags) { + String appOp, boolean appOpAllowed, int flags) { mName = name; mGranted = granted; mAppOp = appOp; @@ -40,7 +39,7 @@ public final class Permission { return mName; } - public int getAppOp() { + public String getAppOp() { return mAppOp; } @@ -49,7 +48,7 @@ public final class Permission { } public boolean hasAppOp() { - return mAppOp != AppOpsManager.OP_NONE; + return mAppOp != null; } public boolean isGranted() { diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java index 2c0508a5..b40b5b9f 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionApps.java +++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java @@ -24,6 +24,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionInfo; import android.graphics.drawable.Drawable; import android.os.AsyncTask; +import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -32,7 +33,7 @@ import android.util.Log; import android.util.SparseArray; import com.android.packageinstaller.R; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; @@ -148,7 +149,8 @@ public class PermissionApps { ArrayList<PermissionApp> permApps = new ArrayList<>(); - for (UserHandle user : UserManager.get(mContext).getUserProfiles()) { + UserManager userManager = mContext.getSystemService(UserManager.class); + for (UserHandle user : userManager.getUserProfiles()) { List<PackageInfo> apps = mCache != null ? mCache.getPackages(user.getIdentifier()) : mPm.getInstalledPackagesAsUser(PackageManager.GET_PERMISSIONS, user.getIdentifier()); @@ -250,8 +252,7 @@ public class PermissionApps { return null; } Drawable unbadged = appInfo.loadUnbadgedIcon(mPm); - return mPm.getUserBadgedIcon(unbadged, - new UserHandle(UserHandle.getUserId(appInfo.uid))); + return mPm.getUserBadgedIcon(unbadged, Process.myUserHandle()); } private void loadGroupInfo() { diff --git a/src/com/android/packageinstaller/permission/model/PermissionGroups.java b/src/com/android/packageinstaller/permission/model/PermissionGroups.java index 04dd07ff..8ca69f24 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionGroups.java +++ b/src/com/android/packageinstaller/permission/model/PermissionGroups.java @@ -31,7 +31,7 @@ import android.os.Bundle; import android.util.ArraySet; import com.android.packageinstaller.R; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; diff --git a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java index d7e4547a..a87976a6 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java +++ b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java @@ -26,19 +26,117 @@ import android.util.ArrayMap; import android.util.ArraySet; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * This class handles backwards compatibility for M. Don't remove + * until we decide to drop M support altogether. + */ public class PermissionStatusReceiver extends BroadcastReceiver { + + /** + * Broadcast action that requests current permission granted information. It will respond + * to the request by sending a broadcast with action defined by + * {@link #EXTRA_GET_PERMISSIONS_RESPONSE_INTENT}. The response will contain + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}, as well as + * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}, with contents described below or + * a null upon failure. + * + * <p>If {@link Intent#EXTRA_PACKAGE_NAME} is included then the number of permissions granted, the + * number of permissions requested and the number of granted additional permissions + * by that package will be calculated and included as the first + * and second elements respectively of an int[] in the response as + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. The response will also deliver the list + * of localized permission group names that are granted in + * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}. + * + * <p>If {@link #EXTRA_PACKAGE_NAME} is not included then the number of apps granted any runtime + * permissions and the total number of apps requesting runtime permissions will be the first + * and second elements respectively of an int[] in the response as + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. + * + * @hide + */ + public static final String ACTION_GET_PERMISSIONS_COUNT + = "android.intent.action.GET_PERMISSIONS_COUNT"; + + /** + * Broadcast action that requests list of all apps that have runtime permissions. It will + * respond to the request by sending a broadcast with action defined by + * {@link #EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT}. The response will contain + * {@link #EXTRA_GET_PERMISSIONS_APP_LIST_RESULT}, as well as + * {@link #EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT}, with contents described below or + * a null upon failure. + * + * <p>{@link #EXTRA_GET_PERMISSIONS_APP_LIST_RESULT} will contain a list of package names of + * apps that have runtime permissions. {@link #EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT} + * will contain the list of app labels corresponding ot the apps in the first list. + * + * @hide + */ + public static final String ACTION_GET_PERMISSIONS_PACKAGES + = "android.intent.action.GET_PERMISSIONS_PACKAGES"; + + /** + * Extra included in response to {@link #ACTION_GET_PERMISSIONS_COUNT}. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_COUNT_RESULT + = "android.intent.extra.GET_PERMISSIONS_COUNT_RESULT"; + + /** + * List of CharSequence of localized permission group labels. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT + = "android.intent.extra.GET_PERMISSIONS_GROUP_LIST_RESULT"; + + /** + * String list of apps that have one or more runtime permissions. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_APP_LIST_RESULT + = "android.intent.extra.GET_PERMISSIONS_APP_LIST_RESULT"; + + /** + * String list of app labels for apps that have one or more runtime permissions. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT + = "android.intent.extra.GET_PERMISSIONS_APP_LABEL_LIST_RESULT"; + + /** + * Boolean list describing if the app is a system app for apps that have one or more runtime + * permissions. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT + = "android.intent.extra.GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT"; + + /** + * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_COUNT} broadcasts. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_RESPONSE_INTENT + = "android.intent.extra.GET_PERMISSIONS_RESONSE_INTENT"; + + /** + * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_PACKAGES} broadcasts. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT + = "android.intent.extra.GET_PERMISSIONS_PACKAGES_RESONSE_INTENT"; + @Override public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { + if (ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( - Intent.EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); + EXTRA_GET_PERMISSIONS_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); int[] counts = new int[3]; @@ -54,28 +152,28 @@ public class PermissionStatusReceiver extends BroadcastReceiver { succeeded = getAppsWithPermissionsCount(context, counts); } if (succeeded) { - responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts); + responseIntent.putExtra(EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts); if (isForPackage) { - responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT, + responseIntent.putExtra(EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT, grantedGroups.toArray(new CharSequence[grantedGroups.size()])); } } context.sendBroadcast(responseIntent); - } else if (Intent.ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) { + } else if (ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) { Intent responseIntent = new Intent(intent.getStringExtra( - Intent.EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT)); + EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT)); responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND); List<String> appsList = new ArrayList<>(); List<CharSequence> appLabelsList = new ArrayList<>(); List<Boolean> isSystemAppList = new ArrayList<>(); if (getAppsWithRuntimePermissions(context, appsList, appLabelsList, isSystemAppList)) { - responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LIST_RESULT, + responseIntent.putExtra(EXTRA_GET_PERMISSIONS_APP_LIST_RESULT, appsList.toArray(new String[appsList.size()])); - responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT, + responseIntent.putExtra(EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT, appLabelsList.toArray(new String[appLabelsList.size()])); - responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT, + responseIntent.putExtra(EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT, toPrimitiveBoolArray(isSystemAppList)); } context.sendBroadcast(responseIntent); diff --git a/src/com/android/packageinstaller/permission/service/RuntimePermissionPresenterServiceImpl.java b/src/com/android/packageinstaller/permission/service/RuntimePermissionPresenterServiceImpl.java new file mode 100644 index 00000000..fbd4f10c --- /dev/null +++ b/src/com/android/packageinstaller/permission/service/RuntimePermissionPresenterServiceImpl.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2016 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.permission.service; + +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.permission.RuntimePermissionPresentationInfo; +import android.permissionpresenterservice.RuntimePermissionPresenterService; +import android.util.ArraySet; +import android.util.Log; +import com.android.packageinstaller.permission.model.AppPermissionGroup; +import com.android.packageinstaller.permission.model.AppPermissions; +import com.android.packageinstaller.permission.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Service that provides presentation information for runtime permissions. + */ +public final class RuntimePermissionPresenterServiceImpl extends RuntimePermissionPresenterService { + private static final String LOG_TAG = "PermissionPresenter"; + + @Override + public List<RuntimePermissionPresentationInfo> onGetAppPermissions(String packageName) { + final PackageInfo packageInfo; + try { + packageInfo = getPackageManager().getPackageInfo(packageName, + PackageManager.GET_PERMISSIONS); + } catch (PackageManager.NameNotFoundException e) { + Log.e(LOG_TAG, "Error getting package:" + packageName, e); + return null; + } + + List<RuntimePermissionPresentationInfo> permissions = new ArrayList<>(); + + AppPermissions appPermissions = new AppPermissions(this, packageInfo, null, false, null); + for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { + if (Utils.shouldShowPermission(group, packageName)) { + final boolean granted = group.areRuntimePermissionsGranted(); + final boolean standard = Utils.OS_PKG.equals(group.getDeclaringPackage()); + RuntimePermissionPresentationInfo permission = + new RuntimePermissionPresentationInfo(group.getLabel(), + granted, standard); + permissions.add(permission); + } + } + + return permissions; + } + + @Override + public List<ApplicationInfo> onGetAppsUsingPermissions(boolean system) { + final List<ApplicationInfo> appInfos = Utils.getAllInstalledApplications(this); + if (appInfos == null || appInfos.isEmpty()) { + return null; + } + List<ApplicationInfo> appsResult = new ArrayList<>(); + ArraySet<String> launcherPackages = Utils.getLauncherPackages(this); + final int appInfosSize = appInfos.size(); + for (int i = 0; i < appInfosSize; i++) { + ApplicationInfo appInfo = appInfos.get(i); + final String packageName = appInfo.packageName; + final PackageInfo packageInfo; + try { + packageInfo = getPackageManager().getPackageInfo( + packageName, PackageManager.GET_PERMISSIONS); + } catch (PackageManager.NameNotFoundException e) { + Log.e(LOG_TAG, "Error getting package info for:" + packageName, e); + continue; + + } + AppPermissions appPermissions = new AppPermissions(this, + packageInfo, null, false, null); + boolean shouldShow = false; + + + for (AppPermissionGroup group : appPermissions.getPermissionGroups()) { + if (Utils.shouldShowPermission(group, packageName)) { + shouldShow = true; + break; + } + } + if (shouldShow) { + if (Utils.isSystem(appPermissions, launcherPackages) == system) { + appsResult.add(appInfo); + } + } + } + return appsResult; + } +} diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java index 944db9a3..78d33d23 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java @@ -48,7 +48,6 @@ import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.ui.handheld.GrantPermissionsViewHandlerImpl; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import libcore.util.EmptyArray; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -111,8 +110,8 @@ public class GrantPermissionsActivity extends OverlayTouchActivity // Don't allow legacy apps to request runtime permissions. if (callingPackageInfo.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { // Returning empty arrays means a cancellation. - mRequestedPermissions = EmptyArray.STRING; - mGrantResults = EmptyArray.INT; + mRequestedPermissions = new String[0]; + mGrantResults = new int[0]; setResultAndFinish(); return; } diff --git a/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java index 2bff0e28..0596c19b 100644 --- a/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java @@ -16,7 +16,6 @@ package com.android.packageinstaller.permission.ui; -import android.annotation.Nullable; import android.app.Activity; import android.app.DialogFragment; @@ -46,7 +45,7 @@ import android.widget.TextView; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import com.android.packageinstaller.permission.ui.ConfirmActionDialogFragment.OnActionConfirmedListener; import java.util.List; @@ -117,7 +116,7 @@ public final class ReviewPermissionsActivity extends Activity } @Override - public void onCreate(@Nullable Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Activity activity = getActivity(); @@ -158,7 +157,7 @@ public final class ReviewPermissionsActivity extends Activity } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); bindUi(); } diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java index 540d8765..0c249e55 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java @@ -37,7 +37,7 @@ import android.provider.Settings; import android.util.Log; import android.view.MenuItem; import com.android.packageinstaller.R; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java index 3716293e..422fb124 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java @@ -16,7 +16,6 @@ package com.android.packageinstaller.permission.ui.handheld; -import android.annotation.Nullable; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; @@ -51,7 +50,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtils; @@ -144,7 +143,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (mAppPermissions != null) { bindUi(this, mAppPermissions.getPackageInfo()); @@ -378,7 +377,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); bindUi(this, getPackageInfo(getActivity(), packageName)); diff --git a/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java index 8994cf5d..238af36d 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java @@ -15,7 +15,6 @@ */ package com.android.packageinstaller.permission.ui.handheld; -import android.annotation.Nullable; import android.app.ActionBar; import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; @@ -37,7 +36,7 @@ import com.android.packageinstaller.permission.model.PermissionApps; import com.android.packageinstaller.permission.model.PermissionApps.PmCache; import com.android.packageinstaller.permission.model.PermissionGroup; import com.android.packageinstaller.permission.model.PermissionGroups; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.List; @@ -115,12 +114,12 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); bindPermissionUi(getActivity(), getView()); } - private static void bindPermissionUi(@Nullable Context context, @Nullable View rootView) { + private static void bindPermissionUi(Context context, View rootView) { if (context == null || rootView == null) { return; } @@ -243,7 +242,7 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); bindPermissionUi(getActivity(), getView()); } diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java index 1502fcbc..df0bdd46 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java @@ -45,7 +45,7 @@ import com.android.packageinstaller.permission.model.PermissionApps.Callback; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtils; diff --git a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java index 7a40856f..0f8cb5b1 100644 --- a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java @@ -45,7 +45,7 @@ import android.view.MenuItem; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; diff --git a/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java index 7b2ff566..be7d159c 100644 --- a/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java @@ -16,7 +16,6 @@ package com.android.packageinstaller.permission.ui.television; -import android.annotation.Nullable; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; @@ -55,7 +54,7 @@ import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.ui.ReviewPermissionsActivity; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.List; @@ -154,7 +153,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (mAppPermissions != null) { bindUi(this, mAppPermissions.getPackageInfo()); @@ -402,7 +401,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); bindUi(this, getPackageInfo(getActivity(), packageName)); diff --git a/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java index fd84edd7..35f866de 100644 --- a/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java @@ -21,7 +21,6 @@ import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceClickListener; @@ -30,15 +29,13 @@ import android.util.ArraySet; import android.util.Log; import android.view.MenuItem; import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.PermissionApps; import com.android.packageinstaller.permission.model.PermissionApps.PmCache; import com.android.packageinstaller.permission.model.PermissionGroup; import com.android.packageinstaller.permission.model.PermissionGroups; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.List; @@ -115,7 +112,7 @@ public final class ManagePermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); bindPermissionUi(this, getView()); } @@ -238,7 +235,7 @@ public final class ManagePermissionsFragment extends SettingsWithHeader } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); bindPermissionUi(this, getView()); } diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java index 4fde4756..29839c14 100644 --- a/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java @@ -49,7 +49,7 @@ import com.android.packageinstaller.permission.model.PermissionApps.PermissionAp import com.android.packageinstaller.permission.ui.ReviewPermissionsActivity; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.List; diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java index 953cde4e..6119f98c 100644 --- a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java @@ -73,7 +73,7 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { } @Override - public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { PreferenceScreen preferences = getPreferenceScreen(); if (preferences == null) { preferences = getPreferenceManager().createPreferenceScreen(getActivity()); diff --git a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java index 4b621a64..db1c94d8 100644 --- a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java +++ b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java @@ -17,11 +17,9 @@ package com.android.packageinstaller.permission.ui.wear; import android.Manifest; -import android.annotation.Nullable; import android.app.Activity; import android.app.Fragment; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; @@ -39,7 +37,7 @@ import com.android.packageinstaller.permission.ui.wear.settings.PermissionsSetti import com.android.packageinstaller.permission.ui.wear.settings.SettingsAdapter; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; -import com.android.packageinstaller.util.Utils; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.List; @@ -119,7 +117,7 @@ public final class AppPermissionsFragmentWear extends TitledSettingsFragment { } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (mAppPermissions != null) { initializeLayout(mAdapter); diff --git a/src/com/android/packageinstaller/permission/utils/ArrayUtils.java b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java new file mode 100644 index 00000000..4b7a3947 --- /dev/null +++ b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2016 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.permission.utils; + +import java.util.Objects; + +public final class ArrayUtils { + private ArrayUtils() { /* cannot be instantiated */ } + + /** + * Checks that value is present as at least one of the elements of the array. + * @param array the array to check in + * @param value the value to check for + * @return true if the value is present in the array + */ + public static <T> boolean contains(T[] array, T value) { + return indexOf(array, value) != -1; + } + + /** + * Return first index of {@code value} in {@code array}, or {@code -1} if + * not found. + */ + public static <T> int indexOf(T[] array, T value) { + if (array == null) return -1; + for (int i = 0; i < array.length; i++) { + if (Objects.equals(array[i], value)) return i; + } + return -1; + } +} diff --git a/src/com/android/packageinstaller/permission/utils/IoUtils.java b/src/com/android/packageinstaller/permission/utils/IoUtils.java new file mode 100644 index 00000000..ff7d1831 --- /dev/null +++ b/src/com/android/packageinstaller/permission/utils/IoUtils.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 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.permission.utils; + +public final class IoUtils { + private IoUtils() { + } + + /** + * Closes 'closeable', ignoring any checked exceptions. Does nothing if 'closeable' is null. + */ + public static void closeQuietly(AutoCloseable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } +} diff --git a/src/com/android/packageinstaller/util/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java index f0d88d32..22663e13 100644 --- a/src/com/android/packageinstaller/util/Utils.java +++ b/src/com/android/packageinstaller/permission/utils/Utils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.packageinstaller.util; +package com.android.packageinstaller.permission.utils; import android.Manifest; import android.content.Context; @@ -32,11 +32,10 @@ import android.util.TypedValue; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp; -import com.android.packageinstaller.permission.utils.LocationUtils; import java.util.List; -public class Utils { +public final class Utils { private static final String LOG_TAG = "Utils"; diff --git a/src/com/android/packageinstaller/wear/WearPackageUtil.java b/src/com/android/packageinstaller/wear/WearPackageUtil.java index c351277e..e340d627 100644 --- a/src/com/android/packageinstaller/wear/WearPackageUtil.java +++ b/src/com/android/packageinstaller/wear/WearPackageUtil.java @@ -16,7 +16,6 @@ package com.android.packageinstaller.wear; -import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -87,7 +86,7 @@ public class WearPackageUtil { * decompress it here */ public static File getFileFromFd(Context context, ParcelFileDescriptor fd, - String packageName, @Nullable String compressionAlg) { + String packageName, String compressionAlg) { File newFile = getTemporaryFile(context, packageName); if (fd == null || fd.getFileDescriptor() == null) { return null; |