Merge "DO NOT MERGE: Fix a few issues with foreground service location accesses." into qt-dev

This commit is contained in:
TreeHugger Robot
2019-04-18 04:35:43 +00:00
committed by Android (Google) Code Review
2 changed files with 11 additions and 8 deletions

View File

@@ -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;
}
}

View File

@@ -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;