From ac8aba0c4a72d0ebdc680683c4160e7e809a1577 Mon Sep 17 00:00:00 2001 From: shafik Date: Fri, 21 Feb 2020 15:35:18 +0000 Subject: [PATCH] Use AppOpsManager#setUidMode instead of #setMode Security related app-ops should be set with AppOpsManager#setUidMode instead of AppOpsManager#setMode. Test: manual - toggle All Files Access for a test app, reboot device and observe in /data/system/appops.xml that the mode was for UID instead of package Test: ensure that the right state is reflected in the relevant Settings activities Change-Id: I261953ff88bc049cf0a2f04f8caac00b8cc6f704 --- .../AppStateManageExternalStorageBridge.java | 28 +++++++++++++++++-- .../appinfo/ManageExternalStorageDetails.java | 5 ++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java b/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java index 5a69035db7f..7933062cba3 100644 --- a/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java +++ b/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java @@ -22,20 +22,25 @@ import android.content.Context; import com.android.settingslib.applications.ApplicationsState; +import java.util.List; + /** * Retrieves information from {@link AppOpsManager} and {@link android.content.pm.PackageManager} * regarding {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE} and * {@link Manifest.permission#MANAGE_EXTERNAL_STORAGE}. */ public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge { - private static final int APP_OPS_OP_CODE = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE; + private static final String APP_OP_STR = AppOpsManager.OPSTR_MANAGE_EXTERNAL_STORAGE; private static final String[] PERMISSIONS = { Manifest.permission.MANAGE_EXTERNAL_STORAGE }; + private final AppOpsManager mAppOpsManager; + public AppStateManageExternalStorageBridge(Context context, ApplicationsState appState, Callback callback) { - super(context, appState, callback, APP_OPS_OP_CODE, PERMISSIONS); + super(context, appState, callback, AppOpsManager.strOpToOp(APP_OP_STR), PERMISSIONS); + mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); } @Override @@ -43,6 +48,25 @@ public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge { app.extraInfo = getManageExternalStoragePermState(pkg, uid); } + @Override + protected void loadAllExtraInfo() { + super.loadAllExtraInfo(); + List apps = mAppSession.getAllApps(); + for (ApplicationsState.AppEntry app : apps) { + if (app.extraInfo instanceof PermissionState) { + ((PermissionState) app.extraInfo).appOpMode = mAppOpsManager.unsafeCheckOpNoThrow( + APP_OP_STR, app.info.uid, app.info.packageName); + } + } + } + + @Override + public PermissionState getPermissionInfo(String pkg, int uid) { + PermissionState ps = super.getPermissionInfo(pkg, uid); + ps.appOpMode = mAppOpsManager.unsafeCheckOpNoThrow(APP_OP_STR, uid, pkg); + return ps; + } + /** * Returns the MANAGE_EXTERNAL_STORAGE {@link AppStateAppOpsBridge.PermissionState} object * associated with the given package and user. diff --git a/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java b/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java index 63ce4408c58..6c840d5d94d 100644 --- a/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java +++ b/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java @@ -23,7 +23,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; @@ -110,8 +109,8 @@ public class ManageExternalStorageDetails extends AppInfoWithHeader implements */ private void setManageExternalStorageState(boolean newState) { logSpecialPermissionChange(newState, mPackageName); - mAppOpsManager.setMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE, - mPackageInfo.applicationInfo.uid, mPackageName, newState + mAppOpsManager.setUidMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE, + mPackageInfo.applicationInfo.uid, newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED); }