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

View File

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