Loading core/java/android/app/AppOpsManager.java +10 −4 Original line number Diff line number Diff line Loading @@ -155,6 +155,12 @@ public class AppOpsManager { */ public static final int UID_STATE_FOREGROUND_SERVICE = 2; /** * Last UID state in which we don't restrict what an op can do. * @hide */ public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE; /** * Metrics about an op when its uid is in the foreground for any other reasons. * @hide Loading Loading @@ -1594,11 +1600,11 @@ public class AppOpsManager { } public long getLastAccessForegroundTime() { return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_FOREGROUND_SERVICE + 1); return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1); } public long getLastAccessBackgroundTime() { return maxTime(mTimes, UID_STATE_FOREGROUND_SERVICE + 1, _NUM_UID_STATE); return maxTime(mTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE); } public long getLastTimeFor(int uidState) { Loading @@ -1614,11 +1620,11 @@ public class AppOpsManager { } public long getLastRejectForegroundTime() { return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_FOREGROUND_SERVICE + 1); return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1); } public long getLastRejectBackgroundTime() { return maxTime(mRejectTimes, UID_STATE_FOREGROUND_SERVICE + 1, _NUM_UID_STATE); return maxTime(mRejectTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE); } public long getLastRejectTimeFor(int uidState) { Loading core/java/android/provider/Settings.java +3 −1 Original line number Diff line number Diff line Loading @@ -10447,7 +10447,9 @@ public final class Settings { * The following keys are supported: * * <pre> * state_settle_time (long) * top_state_settle_time (long) * fg_service_state_settle_time (long) * bg_state_settle_time (long) * </pre> * * <p> Loading services/core/java/com/android/server/AppOpsService.java +50 −15 Original line number Diff line number Diff line Loading @@ -95,11 +95,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import static android.app.AppOpsManager._NUM_UID_STATE; import static android.app.AppOpsManager.UID_STATE_BACKGROUND; import static android.app.AppOpsManager.UID_STATE_CACHED; import static android.app.AppOpsManager.UID_STATE_FOREGROUND; import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE; import static android.app.AppOpsManager._NUM_UID_STATE; import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED; import static android.app.AppOpsManager.UID_STATE_PERSISTENT; import static android.app.AppOpsManager.UID_STATE_TOP; Loading Loading @@ -213,15 +214,31 @@ public class AppOpsService extends IAppOpsService.Stub { */ private final class Constants extends ContentObserver { // Key names stored in the settings value. private static final String KEY_STATE_SETTLE_TIME = "state_settle_time"; private static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; private static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time"; private static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time"; /** * How long we want for a drop in uid state to settle before applying it. * How long we want for a drop in uid state from top to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_STATE_SETTLE_TIME * @see #KEY_TOP_STATE_SETTLE_TIME */ public long STATE_SETTLE_TIME; public long TOP_STATE_SETTLE_TIME; /** * How long we want for a drop in uid state from foreground to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_FG_SERVICE_STATE_SETTLE_TIME */ public long FG_SERVICE_STATE_SETTLE_TIME; /** * How long we want for a drop in uid state from background to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_BG_STATE_SETTLE_TIME */ public long BG_STATE_SETTLE_TIME; private final KeyValueListParser mParser = new KeyValueListParser(','); private ContentResolver mResolver; Loading Loading @@ -256,16 +273,24 @@ public class AppOpsService extends IAppOpsService.Stub { // with defaults. Slog.e(TAG, "Bad app ops settings", e); } STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_STATE_SETTLE_TIME, 10 * 1000L); TOP_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_TOP_STATE_SETTLE_TIME, 30 * 1000L); FG_SERVICE_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_FG_SERVICE_STATE_SETTLE_TIME, 10 * 1000L); BG_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_BG_STATE_SETTLE_TIME, 1 * 1000L); } } void dump(PrintWriter pw) { pw.println(" Settings:"); pw.print(" "); pw.print(KEY_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_TOP_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(TOP_STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_FG_SERVICE_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(FG_SERVICE_STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_BG_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(BG_STATE_SETTLE_TIME, pw); pw.println(); } } Loading Loading @@ -304,7 +329,7 @@ public class AppOpsService extends IAppOpsService.Stub { int evalMode(int mode) { if (mode == AppOpsManager.MODE_FOREGROUND) { return state <= UID_STATE_FOREGROUND_SERVICE return state <= UID_STATE_LAST_NON_RESTRICTED ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED; } return mode; Loading Loading @@ -728,14 +753,22 @@ public class AppOpsService extends IAppOpsService.Stub { if (uidState != null && uidState.pendingState != newState) { final int oldPendingState = uidState.pendingState; uidState.pendingState = newState; if (newState < uidState.state) { // We are moving to a more important state, always do it immediately. if (newState < uidState.state || newState <= UID_STATE_LAST_NON_RESTRICTED) { // We are moving to a more important state, or the new state is in the // foreground, then always do it immediately. commitUidPendingStateLocked(uidState); } else if (uidState.pendingStateCommitTime == 0) { // We are moving to a less important state for the first time, // delay the application for a bit. uidState.pendingStateCommitTime = SystemClock.uptimeMillis() + mConstants.STATE_SETTLE_TIME; final long settleTime; if (uidState.state <= UID_STATE_TOP) { settleTime = mConstants.TOP_STATE_SETTLE_TIME; } else if (uidState.state <= UID_STATE_FOREGROUND_SERVICE) { settleTime = mConstants.FG_SERVICE_STATE_SETTLE_TIME; } else { settleTime = mConstants.BG_STATE_SETTLE_TIME; } uidState.pendingStateCommitTime = SystemClock.uptimeMillis() + settleTime; } if (uidState.startNesting != 0) { // There is some actively running operation... need to find it Loading Loading @@ -1858,9 +1891,11 @@ public class AppOpsService extends IAppOpsService.Stub { } private void commitUidPendingStateLocked(UidState uidState) { final boolean lastForeground = uidState.state <= UID_STATE_LAST_NON_RESTRICTED; final boolean nowForeground = uidState.pendingState <= UID_STATE_LAST_NON_RESTRICTED; uidState.state = uidState.pendingState; uidState.pendingStateCommitTime = 0; if (uidState.hasForegroundWatchers) { if (uidState.hasForegroundWatchers && lastForeground != nowForeground) { for (int fgi = uidState.foregroundOps.size() - 1; fgi >= 0; fgi--) { if (!uidState.foregroundOps.valueAt(fgi)) { continue; Loading Loading
core/java/android/app/AppOpsManager.java +10 −4 Original line number Diff line number Diff line Loading @@ -155,6 +155,12 @@ public class AppOpsManager { */ public static final int UID_STATE_FOREGROUND_SERVICE = 2; /** * Last UID state in which we don't restrict what an op can do. * @hide */ public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE; /** * Metrics about an op when its uid is in the foreground for any other reasons. * @hide Loading Loading @@ -1594,11 +1600,11 @@ public class AppOpsManager { } public long getLastAccessForegroundTime() { return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_FOREGROUND_SERVICE + 1); return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1); } public long getLastAccessBackgroundTime() { return maxTime(mTimes, UID_STATE_FOREGROUND_SERVICE + 1, _NUM_UID_STATE); return maxTime(mTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE); } public long getLastTimeFor(int uidState) { Loading @@ -1614,11 +1620,11 @@ public class AppOpsManager { } public long getLastRejectForegroundTime() { return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_FOREGROUND_SERVICE + 1); return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1); } public long getLastRejectBackgroundTime() { return maxTime(mRejectTimes, UID_STATE_FOREGROUND_SERVICE + 1, _NUM_UID_STATE); return maxTime(mRejectTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE); } public long getLastRejectTimeFor(int uidState) { Loading
core/java/android/provider/Settings.java +3 −1 Original line number Diff line number Diff line Loading @@ -10447,7 +10447,9 @@ public final class Settings { * The following keys are supported: * * <pre> * state_settle_time (long) * top_state_settle_time (long) * fg_service_state_settle_time (long) * bg_state_settle_time (long) * </pre> * * <p> Loading
services/core/java/com/android/server/AppOpsService.java +50 −15 Original line number Diff line number Diff line Loading @@ -95,11 +95,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import static android.app.AppOpsManager._NUM_UID_STATE; import static android.app.AppOpsManager.UID_STATE_BACKGROUND; import static android.app.AppOpsManager.UID_STATE_CACHED; import static android.app.AppOpsManager.UID_STATE_FOREGROUND; import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE; import static android.app.AppOpsManager._NUM_UID_STATE; import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED; import static android.app.AppOpsManager.UID_STATE_PERSISTENT; import static android.app.AppOpsManager.UID_STATE_TOP; Loading Loading @@ -213,15 +214,31 @@ public class AppOpsService extends IAppOpsService.Stub { */ private final class Constants extends ContentObserver { // Key names stored in the settings value. private static final String KEY_STATE_SETTLE_TIME = "state_settle_time"; private static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; private static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time"; private static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time"; /** * How long we want for a drop in uid state to settle before applying it. * How long we want for a drop in uid state from top to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_STATE_SETTLE_TIME * @see #KEY_TOP_STATE_SETTLE_TIME */ public long STATE_SETTLE_TIME; public long TOP_STATE_SETTLE_TIME; /** * How long we want for a drop in uid state from foreground to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_FG_SERVICE_STATE_SETTLE_TIME */ public long FG_SERVICE_STATE_SETTLE_TIME; /** * How long we want for a drop in uid state from background to settle before applying it. * @see Settings.Global#APP_OPS_CONSTANTS * @see #KEY_BG_STATE_SETTLE_TIME */ public long BG_STATE_SETTLE_TIME; private final KeyValueListParser mParser = new KeyValueListParser(','); private ContentResolver mResolver; Loading Loading @@ -256,16 +273,24 @@ public class AppOpsService extends IAppOpsService.Stub { // with defaults. Slog.e(TAG, "Bad app ops settings", e); } STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_STATE_SETTLE_TIME, 10 * 1000L); TOP_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_TOP_STATE_SETTLE_TIME, 30 * 1000L); FG_SERVICE_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_FG_SERVICE_STATE_SETTLE_TIME, 10 * 1000L); BG_STATE_SETTLE_TIME = mParser.getDurationMillis( KEY_BG_STATE_SETTLE_TIME, 1 * 1000L); } } void dump(PrintWriter pw) { pw.println(" Settings:"); pw.print(" "); pw.print(KEY_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_TOP_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(TOP_STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_FG_SERVICE_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(FG_SERVICE_STATE_SETTLE_TIME, pw); pw.print(" "); pw.print(KEY_BG_STATE_SETTLE_TIME); pw.print("="); TimeUtils.formatDuration(BG_STATE_SETTLE_TIME, pw); pw.println(); } } Loading Loading @@ -304,7 +329,7 @@ public class AppOpsService extends IAppOpsService.Stub { int evalMode(int mode) { if (mode == AppOpsManager.MODE_FOREGROUND) { return state <= UID_STATE_FOREGROUND_SERVICE return state <= UID_STATE_LAST_NON_RESTRICTED ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED; } return mode; Loading Loading @@ -728,14 +753,22 @@ public class AppOpsService extends IAppOpsService.Stub { if (uidState != null && uidState.pendingState != newState) { final int oldPendingState = uidState.pendingState; uidState.pendingState = newState; if (newState < uidState.state) { // We are moving to a more important state, always do it immediately. if (newState < uidState.state || newState <= UID_STATE_LAST_NON_RESTRICTED) { // We are moving to a more important state, or the new state is in the // foreground, then always do it immediately. commitUidPendingStateLocked(uidState); } else if (uidState.pendingStateCommitTime == 0) { // We are moving to a less important state for the first time, // delay the application for a bit. uidState.pendingStateCommitTime = SystemClock.uptimeMillis() + mConstants.STATE_SETTLE_TIME; final long settleTime; if (uidState.state <= UID_STATE_TOP) { settleTime = mConstants.TOP_STATE_SETTLE_TIME; } else if (uidState.state <= UID_STATE_FOREGROUND_SERVICE) { settleTime = mConstants.FG_SERVICE_STATE_SETTLE_TIME; } else { settleTime = mConstants.BG_STATE_SETTLE_TIME; } uidState.pendingStateCommitTime = SystemClock.uptimeMillis() + settleTime; } if (uidState.startNesting != 0) { // There is some actively running operation... need to find it Loading Loading @@ -1858,9 +1891,11 @@ public class AppOpsService extends IAppOpsService.Stub { } private void commitUidPendingStateLocked(UidState uidState) { final boolean lastForeground = uidState.state <= UID_STATE_LAST_NON_RESTRICTED; final boolean nowForeground = uidState.pendingState <= UID_STATE_LAST_NON_RESTRICTED; uidState.state = uidState.pendingState; uidState.pendingStateCommitTime = 0; if (uidState.hasForegroundWatchers) { if (uidState.hasForegroundWatchers && lastForeground != nowForeground) { for (int fgi = uidState.foregroundOps.size() - 1; fgi >= 0; fgi--) { if (!uidState.foregroundOps.valueAt(fgi)) { continue; Loading