App ops: add "draw on top" op, improve switch ordering.

Change-Id: Ibe490305650f986f3ccf1ea25012272287455f59
This commit is contained in:
Dianne Hackborn
2013-02-07 00:01:10 -08:00
parent 2ae050796a
commit d69e8dc441
2 changed files with 25 additions and 7 deletions

View File

@@ -587,8 +587,9 @@
<item>read ICC SMS</item>
<item>write ICC SMS</item>
<item>modify settings</item>
<item>draw on top</item>
</string-array>
<!-- User display names for app ops codes -->
<string-array name="app_ops_labels">
<item>Location</item>
@@ -615,6 +616,7 @@
<item>Receive SMS/MMS</item>
<item>Send SMS/MMS</item>
<item>Modify settings</item>
<item>Draw on top</item>
</string-array>
<!-- Titles for the list of long press timeout options. -->

View File

@@ -149,10 +149,12 @@ public class AppOpsState {
new int[] { AppOpsManager.OP_VIBRATE,
AppOpsManager.OP_POST_NOTIFICATION,
AppOpsManager.OP_CALL_PHONE,
AppOpsManager.OP_WRITE_SETTINGS },
AppOpsManager.OP_WRITE_SETTINGS,
AppOpsManager.OP_SYSTEM_ALERT_WINDOW },
new boolean[] { false,
false,
true,
true,
true }
);
@@ -254,10 +256,13 @@ public class AppOpsState {
private final ArrayList<AppOpsManager.OpEntry> mSwitchOps
= new ArrayList<AppOpsManager.OpEntry>();
private final AppEntry mApp;
private final int mSwitchOrder;
public AppOpEntry(AppOpsManager.PackageOps pkg, AppOpsManager.OpEntry op, AppEntry app) {
public AppOpEntry(AppOpsManager.PackageOps pkg, AppOpsManager.OpEntry op, AppEntry app,
int switchOrder) {
mPkgOps = pkg;
mApp = app;
mSwitchOrder = switchOrder;
mApp.addOp(this, op);
mOps.add(op);
mSwitchOps.add(op);
@@ -293,6 +298,10 @@ public class AppOpsState {
return mApp;
}
public int getSwitchOrder() {
return mSwitchOrder;
}
public AppOpsManager.PackageOps getPackageOps() {
return mPkgOps;
}
@@ -366,6 +375,9 @@ public class AppOpsState {
private final Collator sCollator = Collator.getInstance();
@Override
public int compare(AppOpEntry object1, AppOpEntry object2) {
if (object1.getSwitchOrder() != object2.getSwitchOrder()) {
return object1.getSwitchOrder() < object2.getSwitchOrder() ? -1 : 1;
}
if (object1.isRunning() != object2.isRunning()) {
// Currently running ops go first.
return object1.isRunning() ? -1 : 1;
@@ -380,7 +392,7 @@ public class AppOpsState {
};
private void addOp(List<AppOpEntry> entries, AppOpsManager.PackageOps pkgOps,
AppEntry appEntry, AppOpsManager.OpEntry opEntry, boolean allowMerge) {
AppEntry appEntry, AppOpsManager.OpEntry opEntry, boolean allowMerge, int switchOrder) {
if (allowMerge && entries.size() > 0) {
AppOpEntry last = entries.get(entries.size()-1);
if (last.getAppEntry() == appEntry) {
@@ -399,7 +411,7 @@ public class AppOpsState {
entry.addOp(opEntry);
return;
}
entry = new AppOpEntry(pkgOps, opEntry, appEntry);
entry = new AppOpEntry(pkgOps, opEntry, appEntry, switchOrder);
if (DEBUG) Log.d(TAG, "Add op " + opEntry.getOp() + " to package "
+ pkgOps.getPackageName() + ": making new " + entry);
entries.add(entry);
@@ -438,12 +450,14 @@ public class AppOpsState {
final ArrayList<String> perms = new ArrayList<String>();
final ArrayList<Integer> permOps = new ArrayList<Integer>();
final int[] opToOrder = new int[AppOpsManager._NUM_OP];
for (int i=0; i<tpl.ops.length; i++) {
if (tpl.showPerms[i]) {
String perm = AppOpsManager.opToPermission(tpl.ops[i]);
if (perm != null && !perms.contains(perm)) {
perms.add(perm);
permOps.add(tpl.ops[i]);
opToOrder[tpl.ops[i]] = i;
}
}
}
@@ -464,7 +478,8 @@ public class AppOpsState {
}
for (int j=0; j<pkgOps.getOps().size(); j++) {
AppOpsManager.OpEntry opEntry = pkgOps.getOps().get(j);
addOp(entries, pkgOps, appEntry, opEntry, packageName == null);
addOp(entries, pkgOps, appEntry, opEntry, packageName == null,
packageName == null ? 0 : opToOrder[opEntry.getOp()]);
}
}
}
@@ -521,7 +536,8 @@ public class AppOpsState {
AppOpsManager.OpEntry opEntry = new AppOpsManager.OpEntry(
permOps.get(k), AppOpsManager.MODE_ALLOWED, 0, 0, 0);
dummyOps.add(opEntry);
addOp(entries, pkgOps, appEntry, opEntry, packageName == null);
addOp(entries, pkgOps, appEntry, opEntry, packageName == null,
packageName == null ? 0 : opToOrder[opEntry.getOp()]);
}
}
}