Bug: 21588539 Move CHANGE_NETWORK_STATE to be in SYSTEM_SETTINGS
Change the implementation of AppStateAppOpsBridge to handle multiple requested permissions in one operation due to the merging of CHANGE_NETWORK_STATE permission with WRITE_SETTINGS. This change will affect the packages that will be listed under the "Write system settings" option in Settings->Apps->[Gear/Cog]. Change-Id: I7d2304d2846b6f505a7b1c3fcf53e7a9bd184ed5
This commit is contained in:
@@ -34,8 +34,11 @@ import com.android.settingslib.applications.ApplicationsState;
|
|||||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
import com.android.settingslib.applications.ApplicationsState.AppFilter;
|
import com.android.settingslib.applications.ApplicationsState.AppFilter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Connects app ops info to the ApplicationsState. Makes use of AppOpsManager to
|
* Connects app ops info to the ApplicationsState. Makes use of AppOpsManager to
|
||||||
@@ -54,7 +57,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
private final String[] mPermissions;
|
private final String[] mPermissions;
|
||||||
|
|
||||||
public AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
|
public AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
|
||||||
int appOpsOpCode, String permissionName) {
|
int appOpsOpCode, String[] permissions) {
|
||||||
super(appState, callback);
|
super(appState, callback);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mIPackageManager = AppGlobals.getPackageManager();
|
mIPackageManager = AppGlobals.getPackageManager();
|
||||||
@@ -62,7 +65,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
mProfiles = mUserManager.getUserProfiles();
|
mProfiles = mUserManager.getUserProfiles();
|
||||||
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||||
mAppOpsOpCodes = new int[] {appOpsOpCode};
|
mAppOpsOpCodes = new int[] {appOpsOpCode};
|
||||||
mPermissions = new String[] {permissionName};
|
mPermissions = permissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isThisUserAProfileOfCurrentUser(final int userId) {
|
private boolean isThisUserAProfileOfCurrentUser(final int userId) {
|
||||||
@@ -77,6 +80,15 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
|
|
||||||
protected abstract void updateExtraInfo(AppEntry app, String pkg, int uid);
|
protected abstract void updateExtraInfo(AppEntry app, String pkg, int uid);
|
||||||
|
|
||||||
|
private boolean doesAnyPermissionMatch(String permissionToMatch, String[] permissions) {
|
||||||
|
for (String permission : permissions) {
|
||||||
|
if (permissionToMatch.equals(permission)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public PermissionState getPermissionInfo(String pkg, int uid) {
|
public PermissionState getPermissionInfo(String pkg, int uid) {
|
||||||
PermissionState permissionState = new PermissionState(pkg, new UserHandle(UserHandle
|
PermissionState permissionState = new PermissionState(pkg, new UserHandle(UserHandle
|
||||||
.getUserId(uid)));
|
.getUserId(uid)));
|
||||||
@@ -88,7 +100,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
int[] permissionFlags = permissionState.packageInfo.requestedPermissionsFlags;
|
int[] permissionFlags = permissionState.packageInfo.requestedPermissionsFlags;
|
||||||
if (requestedPermissions != null) {
|
if (requestedPermissions != null) {
|
||||||
for (int i = 0; i < requestedPermissions.length; i++) {
|
for (int i = 0; i < requestedPermissions.length; i++) {
|
||||||
if (mPermissions[0].equals(requestedPermissions[i])) {
|
if (doesAnyPermissionMatch(requestedPermissions[i], mPermissions)) {
|
||||||
permissionState.permissionDeclared = true;
|
permissionState.permissionDeclared = true;
|
||||||
if ((permissionFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
|
if ((permissionFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
|
||||||
permissionState.staticPermissionGranted = true;
|
permissionState.staticPermissionGranted = true;
|
||||||
@@ -133,9 +145,15 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
*/
|
*/
|
||||||
private SparseArray<ArrayMap<String, PermissionState>> getEntries() {
|
private SparseArray<ArrayMap<String, PermissionState>> getEntries() {
|
||||||
try {
|
try {
|
||||||
final String[] packages = mIPackageManager.getAppOpPermissionPackages(mPermissions[0]);
|
Set<String> packagesSet = new HashSet<>();
|
||||||
|
for (String permission : mPermissions) {
|
||||||
|
String[] pkgs = mIPackageManager.getAppOpPermissionPackages(permission);
|
||||||
|
if (pkgs != null) {
|
||||||
|
packagesSet.addAll(Arrays.asList(pkgs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (packages == null) {
|
if (packagesSet.isEmpty()) {
|
||||||
// No packages are requesting permission as specified by mPermissions.
|
// No packages are requesting permission as specified by mPermissions.
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -147,7 +165,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
final ArrayMap<String, PermissionState> entriesForProfile = new ArrayMap<>();
|
final ArrayMap<String, PermissionState> entriesForProfile = new ArrayMap<>();
|
||||||
final int profileId = profile.getIdentifier();
|
final int profileId = profile.getIdentifier();
|
||||||
entries.put(profileId, entriesForProfile);
|
entries.put(profileId, entriesForProfile);
|
||||||
for (final String packageName : packages) {
|
for (final String packageName : packagesSet) {
|
||||||
final boolean isAvailable = mIPackageManager.isPackageAvailable(packageName,
|
final boolean isAvailable = mIPackageManager.isPackageAvailable(packageName,
|
||||||
profileId);
|
profileId);
|
||||||
if (!shouldIgnorePackage(packageName) && isAvailable) {
|
if (!shouldIgnorePackage(packageName) && isAvailable) {
|
||||||
@@ -193,7 +211,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
}
|
}
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.w(TAG, "PackageManager is dead. Can't get list of packages granted "
|
Log.w(TAG, "PackageManager is dead. Can't get list of packages granted "
|
||||||
+ mPermissions[0], e);
|
+ mPermissions, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,7 +241,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge {
|
|||||||
if (pe == null) {
|
if (pe == null) {
|
||||||
Log.w(TAG, "AppOp permission exists for package " + packageOp.getPackageName()
|
Log.w(TAG, "AppOp permission exists for package " + packageOp.getPackageName()
|
||||||
+ " of user " + userId + " but package doesn't exist or did not request "
|
+ " of user " + userId + " but package doesn't exist or did not request "
|
||||||
+ mPermissions[0] + " access");
|
+ mPermissions + " access");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,9 +34,12 @@ public class AppStateOverlayBridge extends AppStateAppOpsBridge {
|
|||||||
private static final String TAG = "AppStateOverlayBridge";
|
private static final String TAG = "AppStateOverlayBridge";
|
||||||
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
|
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
|
||||||
private static final String PM_SYSTEM_ALERT_WINDOW = Manifest.permission.SYSTEM_ALERT_WINDOW;
|
private static final String PM_SYSTEM_ALERT_WINDOW = Manifest.permission.SYSTEM_ALERT_WINDOW;
|
||||||
|
private static final String[] PM_PERMISSION = {
|
||||||
|
PM_SYSTEM_ALERT_WINDOW
|
||||||
|
};
|
||||||
|
|
||||||
public AppStateOverlayBridge(Context context, ApplicationsState appState, Callback callback) {
|
public AppStateOverlayBridge(Context context, ApplicationsState appState, Callback callback) {
|
||||||
super(context, appState, callback, APP_OPS_OP_CODE, PM_SYSTEM_ALERT_WINDOW);
|
super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -35,9 +35,12 @@ public class AppStateUsageBridge extends AppStateAppOpsBridge {
|
|||||||
|
|
||||||
private static final String PM_USAGE_STATS = Manifest.permission.PACKAGE_USAGE_STATS;
|
private static final String PM_USAGE_STATS = Manifest.permission.PACKAGE_USAGE_STATS;
|
||||||
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_GET_USAGE_STATS;
|
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_GET_USAGE_STATS;
|
||||||
|
private static final String[] PM_PERMISSION = {
|
||||||
|
PM_USAGE_STATS
|
||||||
|
};
|
||||||
|
|
||||||
public AppStateUsageBridge(Context context, ApplicationsState appState, Callback callback) {
|
public AppStateUsageBridge(Context context, ApplicationsState appState, Callback callback) {
|
||||||
super(context, appState, callback, APP_OPS_OP_CODE, PM_USAGE_STATS);
|
super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -34,10 +34,16 @@ public class AppStateWriteSettingsBridge extends AppStateAppOpsBridge {
|
|||||||
private static final String TAG = "AppStateWriteSettingsBridge";
|
private static final String TAG = "AppStateWriteSettingsBridge";
|
||||||
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
|
private static final int APP_OPS_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
|
||||||
private static final String PM_WRITE_SETTINGS = Manifest.permission.WRITE_SETTINGS;
|
private static final String PM_WRITE_SETTINGS = Manifest.permission.WRITE_SETTINGS;
|
||||||
|
private static final String PM_CHANGE_NETWORK_STATE = Manifest.permission.CHANGE_NETWORK_STATE;
|
||||||
|
// CHANGE_NETWORK_STATE is now merged with WRITE_SETTINGS
|
||||||
|
private static final String[] PM_PERMISSIONS = {
|
||||||
|
PM_WRITE_SETTINGS,
|
||||||
|
PM_CHANGE_NETWORK_STATE
|
||||||
|
};
|
||||||
|
|
||||||
public AppStateWriteSettingsBridge(Context context, ApplicationsState appState, Callback
|
public AppStateWriteSettingsBridge(Context context, ApplicationsState appState, Callback
|
||||||
callback) {
|
callback) {
|
||||||
super(context, appState, callback, APP_OPS_OP_CODE, PM_WRITE_SETTINGS);
|
super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Reference in New Issue
Block a user