summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2019-04-18 04:35:43 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-04-18 04:35:43 +0000
commit80e9a4cc421d32707b386a8cad98e982a62b497a (patch)
treec216866c9ade35c951f5518848b3b968d3ff11ea
parentdb44ba1e85fbba8ad9628d48af6948fb3757c0d9 (diff)
parente1f864e5448d6906d1c27c3c913ab06c082b6fd4 (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.java4
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java15
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;