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
This commit is contained in:
shafik
2020-02-21 15:35:18 +00:00
parent 3c1b99c1dc
commit ac8aba0c4a
2 changed files with 28 additions and 5 deletions

View File

@@ -22,20 +22,25 @@ import android.content.Context;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import java.util.List;
/** /**
* Retrieves information from {@link AppOpsManager} and {@link android.content.pm.PackageManager} * Retrieves information from {@link AppOpsManager} and {@link android.content.pm.PackageManager}
* regarding {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE} and * regarding {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE} and
* {@link Manifest.permission#MANAGE_EXTERNAL_STORAGE}. * {@link Manifest.permission#MANAGE_EXTERNAL_STORAGE}.
*/ */
public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge { 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 = { private static final String[] PERMISSIONS = {
Manifest.permission.MANAGE_EXTERNAL_STORAGE Manifest.permission.MANAGE_EXTERNAL_STORAGE
}; };
private final AppOpsManager mAppOpsManager;
public AppStateManageExternalStorageBridge(Context context, ApplicationsState appState, public AppStateManageExternalStorageBridge(Context context, ApplicationsState appState,
Callback callback) { 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 @Override
@@ -43,6 +48,25 @@ public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge {
app.extraInfo = getManageExternalStoragePermState(pkg, uid); app.extraInfo = getManageExternalStoragePermState(pkg, uid);
} }
@Override
protected void loadAllExtraInfo() {
super.loadAllExtraInfo();
List<ApplicationsState.AppEntry> 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 * Returns the MANAGE_EXTERNAL_STORAGE {@link AppStateAppOpsBridge.PermissionState} object
* associated with the given package and user. * associated with the given package and user.

View File

@@ -23,7 +23,6 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.Preference.OnPreferenceChangeListener;
@@ -110,8 +109,8 @@ public class ManageExternalStorageDetails extends AppInfoWithHeader implements
*/ */
private void setManageExternalStorageState(boolean newState) { private void setManageExternalStorageState(boolean newState) {
logSpecialPermissionChange(newState, mPackageName); logSpecialPermissionChange(newState, mPackageName);
mAppOpsManager.setMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE, mAppOpsManager.setUidMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE,
mPackageInfo.applicationInfo.uid, mPackageName, newState mPackageInfo.applicationInfo.uid, newState
? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED); ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
} }