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:
@@ -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<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
|
||||
* associated with the given package and user.
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user