diff options
| author | 2019-04-18 04:35:43 +0000 | |
|---|---|---|
| committer | 2019-04-18 04:35:43 +0000 | |
| commit | 80e9a4cc421d32707b386a8cad98e982a62b497a (patch) | |
| tree | c216866c9ade35c951f5518848b3b968d3ff11ea | |
| parent | db44ba1e85fbba8ad9628d48af6948fb3757c0d9 (diff) | |
| parent | e1f864e5448d6906d1c27c3c913ab06c082b6fd4 (diff) | |
Merge "DO NOT MERGE: Fix a few issues with foreground service location accesses." into qt-dev
| -rw-r--r-- | core/java/android/app/AppOpsManager.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 15 |
2 files changed, 11 insertions, 8 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 7243624b855a..713fd1cf6879 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -328,7 +328,9 @@ public class AppOpsManager { public static int resolveFirstUnrestrictedUidState(int op) { switch (op) { case OP_FINE_LOCATION: - case OP_COARSE_LOCATION: { + case OP_COARSE_LOCATION: + case OP_MONITOR_LOCATION: + case OP_MONITOR_HIGH_POWER_LOCATION: { return UID_STATE_FOREGROUND_SERVICE_LOCATION; } } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index cd8167ae4653..c56d8eabf0bb 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -343,7 +343,7 @@ public class AppOpsService extends IAppOpsService.Stub { int evalMode(int op, int mode) { if (mode == AppOpsManager.MODE_FOREGROUND) { - return state <= AppOpsManager.resolveLastRestrictedUidState(op) + return state <= AppOpsManager.resolveFirstUnrestrictedUidState(op) ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED; } return mode; @@ -924,9 +924,12 @@ public class AppOpsService extends IAppOpsService.Stub { if (uidState != null && uidState.pendingState != newState) { final int oldPendingState = uidState.pendingState; uidState.pendingState = newState; - if (newState < uidState.state || newState <= UID_STATE_MAX_LAST_NON_RESTRICTED) { - // We are moving to a more important state, or the new state is in the - // foreground, then always do it immediately. + if (newState < uidState.state + || (newState <= UID_STATE_MAX_LAST_NON_RESTRICTED + && uidState.state > UID_STATE_MAX_LAST_NON_RESTRICTED)) { + // We are moving to a more important state, or the new state may be in the + // foreground and the old state is in the background, then always do it + // immediately. commitUidPendingStateLocked(uidState); } else if (uidState.pendingStateCommitTime == 0) { // We are moving to a less important state for the first time, @@ -2426,9 +2429,7 @@ public class AppOpsService extends IAppOpsService.Stub { } private void commitUidPendingStateLocked(UidState uidState) { - final boolean lastForeground = uidState.state <= UID_STATE_MAX_LAST_NON_RESTRICTED; - final boolean nowForeground = uidState.pendingState <= UID_STATE_MAX_LAST_NON_RESTRICTED; - if (uidState.hasForegroundWatchers && lastForeground != nowForeground) { + if (uidState.hasForegroundWatchers) { for (int fgi = uidState.foregroundOps.size() - 1; fgi >= 0; fgi--) { if (!uidState.foregroundOps.valueAt(fgi)) { continue; |