diff --git a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java index 4a3a6d9129666..95d6f850feac3 100644 --- a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java +++ b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java @@ -16,11 +16,15 @@ package android.app.tare; +import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.SystemService; import android.content.Context; import android.util.Log; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Provides access to the resource economy service. * @@ -91,10 +95,38 @@ public class EconomyManager { } } - public static final String KEY_ENABLE_TARE = "enable_tare"; + + public static final int ENABLED_MODE_OFF = 0; + public static final int ENABLED_MODE_ON = 1; + /** + * Go through the motions, tracking events, updating balances and other TARE state values, + * but don't use TARE to affect actual device behavior. + */ + public static final int ENABLED_MODE_SHADOW = 2; + + /** @hide */ + @IntDef(prefix = {"ENABLED_MODE_"}, value = { + ENABLED_MODE_OFF, + ENABLED_MODE_ON, + ENABLED_MODE_SHADOW, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EnabledMode { + } + + public static String enabledModeToString(@EnabledMode int mode) { + switch (mode) { + case ENABLED_MODE_OFF: return "ENABLED_MODE_OFF"; + case ENABLED_MODE_ON: return "ENABLED_MODE_ON"; + case ENABLED_MODE_SHADOW: return "ENABLED_MODE_SHADOW"; + default: return "ENABLED_MODE_" + mode; + } + } + + public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode"; public static final String KEY_ENABLE_POLICY_ALARM = "enable_policy_alarm"; public static final String KEY_ENABLE_POLICY_JOB_SCHEDULER = "enable_policy_job"; - public static final boolean DEFAULT_ENABLE_TARE = true; + public static final int DEFAULT_ENABLE_TARE_MODE = ENABLED_MODE_ON; public static final boolean DEFAULT_ENABLE_POLICY_ALARM = true; public static final boolean DEFAULT_ENABLE_POLICY_JOB_SCHEDULER = true; diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index 37d190d068abd..2533a0f47ee69 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -77,6 +77,7 @@ import android.app.IAlarmManager; import android.app.PendingIntent; import android.app.compat.CompatChanges; import android.app.role.RoleManager; +import android.app.tare.EconomyManager; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.content.BroadcastReceiver; @@ -852,7 +853,7 @@ public class AlarmManagerService extends SystemService { public boolean KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED = DEFAULT_KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED; - public boolean USE_TARE_POLICY = Settings.Global.DEFAULT_ENABLE_TARE == 1; + public int USE_TARE_POLICY = Settings.Global.DEFAULT_ENABLE_TARE; /** * The amount of temporary reserve quota to give apps on receiving the @@ -892,7 +893,7 @@ public class AlarmManagerService extends SystemService { AlarmManagerEconomicPolicy.POLICY_ALARM); onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_ALARM_MANAGER)); updateTareSettings( - economyManagerInternal.isEnabled(AlarmManagerEconomicPolicy.POLICY_ALARM)); + economyManagerInternal.getEnabledMode(AlarmManagerEconomicPolicy.POLICY_ALARM)); } public void updateAllowWhileIdleWhitelistDurationLocked() { @@ -1065,18 +1066,19 @@ public class AlarmManagerService extends SystemService { } @Override - public void onTareEnabledStateChanged(boolean isTareEnabled) { - updateTareSettings(isTareEnabled); + public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) { + updateTareSettings(enabledMode); } - private void updateTareSettings(boolean isTareEnabled) { + private void updateTareSettings(int enabledMode) { synchronized (mLock) { - if (USE_TARE_POLICY != isTareEnabled) { - USE_TARE_POLICY = isTareEnabled; + if (USE_TARE_POLICY != enabledMode) { + USE_TARE_POLICY = enabledMode; final boolean changed = mAlarmStore.updateAlarmDeliveries(alarm -> { final boolean standbyChanged = adjustDeliveryTimeBasedOnBucketLocked(alarm); final boolean tareChanged = adjustDeliveryTimeBasedOnTareLocked(alarm); - if (USE_TARE_POLICY) { + if (USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) { + // Only register listeners if we're going to be acting on the policy. registerTareListener(alarm); } else { mEconomyManagerInternal.unregisterAffordabilityChangeListener( @@ -1086,7 +1088,7 @@ public class AlarmManagerService extends SystemService { } return standbyChanged || tareChanged; }); - if (!USE_TARE_POLICY) { + if (USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) { // Remove the cached values so we don't accidentally use them when TARE is // re-enabled. mAffordabilityCache.clear(); @@ -2526,7 +2528,8 @@ public class AlarmManagerService extends SystemService { */ private boolean adjustDeliveryTimeBasedOnBucketLocked(Alarm alarm) { final long nowElapsed = mInjector.getElapsedRealtimeMillis(); - if (mConstants.USE_TARE_POLICY || isExemptFromAppStandby(alarm) || mAppStandbyParole) { + if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON + || isExemptFromAppStandby(alarm) || mAppStandbyParole) { return alarm.setPolicyElapsed(APP_STANDBY_POLICY_INDEX, nowElapsed); } @@ -2586,7 +2589,7 @@ public class AlarmManagerService extends SystemService { */ private boolean adjustDeliveryTimeBasedOnTareLocked(Alarm alarm) { final long nowElapsed = mInjector.getElapsedRealtimeMillis(); - if (!mConstants.USE_TARE_POLICY + if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON || isExemptFromTare(alarm) || hasEnoughWealthLocked(alarm)) { return alarm.setPolicyElapsed(TARE_POLICY_INDEX, nowElapsed); } @@ -2596,7 +2599,8 @@ public class AlarmManagerService extends SystemService { } private void registerTareListener(Alarm alarm) { - if (!mConstants.USE_TARE_POLICY) { + if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) { + // Only register listeners if we're going to be acting on the policy. return; } mEconomyManagerInternal.registerAffordabilityChangeListener( @@ -2607,7 +2611,7 @@ public class AlarmManagerService extends SystemService { /** Unregister the TARE listener associated with the alarm if it's no longer needed. */ @GuardedBy("mLock") private void maybeUnregisterTareListenerLocked(Alarm alarm) { - if (!mConstants.USE_TARE_POLICY) { + if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) { return; } final EconomyManagerInternal.ActionBill bill = TareBill.getAppropriateBill(alarm); @@ -3126,7 +3130,7 @@ public class AlarmManagerService extends SystemService { mConstants.dump(pw); pw.println(); - if (mConstants.USE_TARE_POLICY) { + if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) { pw.println("TARE details:"); pw.increaseIndent(); @@ -4500,7 +4504,8 @@ public class AlarmManagerService extends SystemService { } private void reportAlarmEventToTare(Alarm alarm) { - if (!mConstants.USE_TARE_POLICY) { + // Don't bother reporting events if TARE is completely off. + if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_OFF) { return; } final boolean allowWhileIdle = @@ -4805,7 +4810,7 @@ public class AlarmManagerService extends SystemService { if (a.wakeup) { wakeupUids.add(a.uid); } - if (mConstants.USE_TARE_POLICY) { + if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) { if (!isExemptFromTare(a)) { triggerPackages.add(UserPackage.of( UserHandle.getUserId(a.creatorUid), @@ -4823,7 +4828,7 @@ public class AlarmManagerService extends SystemService { } deliverAlarmsLocked(triggerList, nowELAPSED); mTemporaryQuotaReserve.cleanUpExpiredQuotas(nowELAPSED); - if (mConstants.USE_TARE_POLICY) { + if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) { reorderAlarmsBasedOnTare(triggerPackages); } else { reorderAlarmsBasedOnStandbyBuckets(triggerPackages); diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 76336fb892951..ccad436839aab 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -43,6 +43,7 @@ import android.app.job.JobService; import android.app.job.JobSnapshot; import android.app.job.JobWorkItem; import android.app.job.UserVisibleJobSummary; +import android.app.tare.EconomyManager; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.compat.annotation.ChangeId; @@ -417,7 +418,8 @@ public class JobSchedulerService extends com.android.server.SystemService // Load all the constants. synchronized (mLock) { mConstants.updateTareSettingsLocked( - economyManagerInternal.isEnabled(JobSchedulerEconomicPolicy.POLICY_JOB)); + economyManagerInternal.getEnabledMode( + JobSchedulerEconomicPolicy.POLICY_JOB)); } onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_JOB_SCHEDULER)); } @@ -514,8 +516,8 @@ public class JobSchedulerService extends com.android.server.SystemService } @Override - public void onTareEnabledStateChanged(boolean isTareEnabled) { - if (mConstants.updateTareSettingsLocked(isTareEnabled)) { + public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) { + if (mConstants.updateTareSettingsLocked(enabledMode)) { for (int controller = 0; controller < mControllers.size(); controller++) { final StateController sc = mControllers.get(controller); sc.onConstantsUpdatedLocked(); @@ -962,10 +964,11 @@ public class JobSchedulerService extends com.android.server.SystemService DEFAULT_RUNTIME_USER_INITIATED_DATA_TRANSFER_LIMIT_MS))); } - private boolean updateTareSettingsLocked(boolean isTareEnabled) { + private boolean updateTareSettingsLocked(@EconomyManager.EnabledMode int enabledMode) { boolean changed = false; - if (USE_TARE_POLICY != isTareEnabled) { - USE_TARE_POLICY = isTareEnabled; + final boolean useTare = enabledMode == EconomyManager.ENABLED_MODE_ON; + if (USE_TARE_POLICY != useTare) { + USE_TARE_POLICY = useTare; changed = true; } return changed; diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java index 2b59209127183..dcc324deaac61 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java @@ -16,6 +16,7 @@ package com.android.server.tare; +import static android.app.tare.EconomyManager.ENABLED_MODE_OFF; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static com.android.server.tare.EconomicPolicy.REGULATION_BASIC_INCOME; @@ -1111,7 +1112,7 @@ class Agent { final ActionAffordabilityNote note = new ActionAffordabilityNote(bill, listener, economicPolicy); if (actionAffordabilityNotes.add(note)) { - if (!mIrs.isEnabled()) { + if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) { // When TARE isn't enabled, we always say something is affordable. We also don't // want to silently drop affordability change listeners in case TARE becomes enabled // because then clients will be in an ambiguous state. diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java index 716769c21afc6..5b305ad91118d 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java @@ -18,6 +18,7 @@ package com.android.server.tare; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.tare.EconomyManager; import java.util.ArrayList; import java.util.Collections; @@ -121,7 +122,7 @@ public interface EconomyManagerInternal { /** Listener for various TARE state changes. */ interface TareStateChangeListener { - void onTareEnabledStateChanged(boolean isTareEnabled); + void onTareEnabledModeChanged(@EconomyManager.EnabledMode int tareEnabledMode); } /** @@ -135,11 +136,13 @@ public interface EconomyManagerInternal { */ long getMaxDurationMs(int userId, @NonNull String pkgName, @NonNull ActionBill bill); - /** Returns true if TARE is enabled. */ - boolean isEnabled(); + /** Returns the current TARE enabled mode. */ + @EconomyManager.EnabledMode + int getEnabledMode(); - /** Returns true if TARE and the specified policy are enabled. */ - boolean isEnabled(@EconomicPolicy.Policy int policyId); + /** Returns the current TARE enabled mode for the specified policy. */ + @EconomyManager.EnabledMode + int getEnabledMode(@EconomicPolicy.Policy int policyId); /** * Register an {@link AffordabilityChangeListener} to track when an app's ability to afford the diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 08c1a0c373838..caf72e828d69c 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -16,6 +16,10 @@ package com.android.server.tare; +import static android.app.tare.EconomyManager.ENABLED_MODE_OFF; +import static android.app.tare.EconomyManager.ENABLED_MODE_ON; +import static android.app.tare.EconomyManager.ENABLED_MODE_SHADOW; +import static android.app.tare.EconomyManager.enabledModeToString; import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS; import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS; import static android.text.format.DateUtils.DAY_IN_MILLIS; @@ -202,7 +206,8 @@ public class InternalResourceService extends SystemService { private final SparseArrayMap> mInstallers = new SparseArrayMap<>(); private volatile boolean mHasBattery = true; - private volatile boolean mIsEnabled; + @EconomyManager.EnabledMode + private volatile int mEnabledMode; private volatile int mBootPhase; private volatile boolean mExemptListLoaded; // In the range [0,100] to represent 0% to 100% battery. @@ -474,13 +479,20 @@ public class InternalResourceService extends SystemService { } } - boolean isEnabled() { - return mIsEnabled; + @EconomyManager.EnabledMode + int getEnabledMode() { + return mEnabledMode; } - boolean isEnabled(int policyId) { + @EconomyManager.EnabledMode + int getEnabledMode(int policyId) { synchronized (mLock) { - return isEnabled() && mCompleteEconomicPolicy.isPolicyEnabled(policyId); + // For now, treat enabled policies as using the same enabled mode as full TARE. + // TODO: have enabled mode by policy + if (mCompleteEconomicPolicy.isPolicyEnabled(policyId)) { + return mEnabledMode; + } + return ENABLED_MODE_OFF; } } @@ -857,7 +869,7 @@ public class InternalResourceService extends SystemService { @GuardedBy("mLock") private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return; } final String pkgName = event.getPackageName(); @@ -1028,7 +1040,7 @@ public class InternalResourceService extends SystemService { /** Perform long-running and/or heavy setup work. This should be called off the main thread. */ private void setupHeavyWork() { - if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || !mIsEnabled) { + if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1079,7 +1091,7 @@ public class InternalResourceService extends SystemService { } private void onBootPhaseSystemServicesReady() { - if (mBootPhase < PHASE_SYSTEM_SERVICES_READY || !mIsEnabled) { + if (mBootPhase < PHASE_SYSTEM_SERVICES_READY || mEnabledMode == ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1101,14 +1113,14 @@ public class InternalResourceService extends SystemService { } private void onBootPhaseThirdPartyAppsCanStart() { - if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || !mIsEnabled) { + if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) { return; } mHandler.post(this::setupHeavyWork); } private void onBootPhaseBootCompleted() { - if (mBootPhase < PHASE_BOOT_COMPLETED || !mIsEnabled) { + if (mBootPhase < PHASE_BOOT_COMPLETED || mEnabledMode == ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1124,7 +1136,7 @@ public class InternalResourceService extends SystemService { } private void setupEverything() { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return; } if (mBootPhase >= PHASE_SYSTEM_SERVICES_READY) { @@ -1139,7 +1151,7 @@ public class InternalResourceService extends SystemService { } private void tearDownEverything() { - if (mIsEnabled) { + if (mEnabledMode != ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1231,7 +1243,7 @@ public class InternalResourceService extends SystemService { case MSG_NOTIFY_STATE_CHANGE_LISTENER: { final int policy = msg.arg1; final TareStateChangeListener listener = (TareStateChangeListener) msg.obj; - listener.onTareEnabledStateChanged(isEnabled(policy)); + listener.onTareEnabledModeChanged(getEnabledMode(policy)); } break; @@ -1246,10 +1258,10 @@ public class InternalResourceService extends SystemService { } final ArraySet listeners = mStateChangeListeners.get(policy); - final boolean isEnabled = isEnabled(policy); + final int enabledMode = getEnabledMode(policy); for (int p = listeners.size() - 1; p >= 0; --p) { final TareStateChangeListener listener = listeners.valueAt(p); - listener.onTareEnabledStateChanged(isEnabled); + listener.onTareEnabledModeChanged(enabledMode); } } } @@ -1382,7 +1394,7 @@ public class InternalResourceService extends SystemService { @Override public boolean canPayFor(int userId, @NonNull String pkgName, @NonNull ActionBill bill) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return true; } if (isVip(userId, pkgName)) { @@ -1410,7 +1422,7 @@ public class InternalResourceService extends SystemService { @Override public long getMaxDurationMs(int userId, @NonNull String pkgName, @NonNull ActionBill bill) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return FOREVER_MS; } if (isVip(userId, pkgName)) { @@ -1437,19 +1449,19 @@ public class InternalResourceService extends SystemService { } @Override - public boolean isEnabled() { - return mIsEnabled; + public int getEnabledMode() { + return mEnabledMode; } @Override - public boolean isEnabled(int policyId) { - return InternalResourceService.this.isEnabled(policyId); + public int getEnabledMode(int policyId) { + return InternalResourceService.this.getEnabledMode(policyId); } @Override public void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId, @Nullable String tag) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1460,7 +1472,7 @@ public class InternalResourceService extends SystemService { @Override public void noteOngoingEventStarted(int userId, @NonNull String pkgName, int eventId, @Nullable String tag) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return; } synchronized (mLock) { @@ -1472,7 +1484,7 @@ public class InternalResourceService extends SystemService { @Override public void noteOngoingEventStopped(int userId, @NonNull String pkgName, int eventId, @Nullable String tag) { - if (!mIsEnabled) { + if (mEnabledMode == ENABLED_MODE_OFF) { return; } final long nowElapsed = SystemClock.elapsedRealtime(); @@ -1540,7 +1552,7 @@ public class InternalResourceService extends SystemService { continue; } switch (name) { - case EconomyManager.KEY_ENABLE_TARE: + case EconomyManager.KEY_ENABLE_TARE_MODE: updateEnabledStatus(); break; case KEY_ENABLE_TIP3: @@ -1567,17 +1579,33 @@ public class InternalResourceService extends SystemService { private void updateEnabledStatus() { // User setting should override DeviceConfig setting. - final boolean isTareEnabledDC = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TARE, - EconomyManager.KEY_ENABLE_TARE, EconomyManager.DEFAULT_ENABLE_TARE); - final boolean isTareEnabled = isTareSupported() - && Settings.Global.getInt(mContentResolver, - Settings.Global.ENABLE_TARE, isTareEnabledDC ? 1 : 0) == 1; - if (mIsEnabled != isTareEnabled) { - mIsEnabled = isTareEnabled; - if (mIsEnabled) { - setupEverything(); - } else { - tearDownEverything(); + final int tareEnabledModeDC = DeviceConfig.getInt(DeviceConfig.NAMESPACE_TARE, + EconomyManager.KEY_ENABLE_TARE_MODE, EconomyManager.DEFAULT_ENABLE_TARE_MODE); + final int tareEnabledModeConfig = isTareSupported() + ? Settings.Global.getInt(mContentResolver, + Settings.Global.ENABLE_TARE, tareEnabledModeDC) + : ENABLED_MODE_OFF; + final int enabledMode; + if (tareEnabledModeConfig == ENABLED_MODE_OFF + || tareEnabledModeConfig == ENABLED_MODE_ON + || tareEnabledModeConfig == ENABLED_MODE_SHADOW) { + // Config has a valid enabled mode. + enabledMode = tareEnabledModeConfig; + } else { + enabledMode = EconomyManager.DEFAULT_ENABLE_TARE_MODE; + } + if (mEnabledMode != enabledMode) { + // A full change where we've gone from OFF to {SHADOW or ON}, or vie versa. + // With this transition, we'll have to set up or tear down. + final boolean fullEnableChange = + mEnabledMode == ENABLED_MODE_OFF || enabledMode == ENABLED_MODE_OFF; + mEnabledMode = enabledMode; + if (fullEnableChange) { + if (mEnabledMode != ENABLED_MODE_OFF) { + setupEverything(); + } else { + tearDownEverything(); + } } mHandler.obtainMessage( MSG_NOTIFY_STATE_CHANGE_LISTENERS, EconomicPolicy.ALL_POLICIES, 0) @@ -1592,7 +1620,8 @@ public class InternalResourceService extends SystemService { final int oldEnabledPolicies = mCompleteEconomicPolicy.getEnabledPolicyIds(); mCompleteEconomicPolicy.tearDown(); mCompleteEconomicPolicy = new CompleteEconomicPolicy(InternalResourceService.this); - if (mIsEnabled && mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) { + if (mEnabledMode != ENABLED_MODE_OFF + && mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) { mCompleteEconomicPolicy.setup(getAllDeviceConfigProperties()); if (minLimit != mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit() || maxLimit @@ -1626,7 +1655,7 @@ public class InternalResourceService extends SystemService { } } mVipOverrides.clear(); - if (mIsEnabled) { + if (mEnabledMode != ENABLED_MODE_OFF) { mAgent.onVipStatusChangedLocked(changedPkgs); } } @@ -1645,7 +1674,7 @@ public class InternalResourceService extends SystemService { mVipOverrides.add(userId, pkgName, newVipState); } changed = isVip(userId, pkgName) != wasVip; - if (mIsEnabled && changed) { + if (mEnabledMode != ENABLED_MODE_OFF && changed) { mAgent.onVipStatusChangedLocked(userId, pkgName); } } @@ -1668,8 +1697,8 @@ public class InternalResourceService extends SystemService { return; } synchronized (mLock) { - pw.print("Is enabled: "); - pw.println(mIsEnabled); + pw.print("Enabled mode: "); + pw.println(enabledModeToString(mEnabledMode)); pw.print("Current battery level: "); pw.println(mCurrentBatteryLevel); diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java index 66327fd63f138..08439f383f04b 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java @@ -16,6 +16,7 @@ package com.android.server.tare; +import static android.app.tare.EconomyManager.ENABLED_MODE_OFF; import static android.text.format.DateUtils.HOUR_IN_MILLIS; import static com.android.server.tare.TareUtils.appToString; @@ -662,7 +663,7 @@ public class Scribe { // Remove mCleanRunnable callbacks since we're going to clean up the ledgers before // writing anyway. TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable); - if (!mIrs.isEnabled()) { + if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) { // If it's no longer enabled, we would have cleared all the data in memory and would // accidentally write an empty file, thus deleting all the history. return; diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java index e2b25ef8da2a4..57c5a6efa099a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java @@ -128,6 +128,7 @@ import android.app.IAlarmManager; import android.app.PendingIntent; import android.app.compat.CompatChanges; import android.app.role.RoleManager; +import android.app.tare.EconomyManager; import android.app.usage.UsageStatsManagerInternal; import android.content.ContentResolver; import android.content.Context; @@ -508,7 +509,7 @@ public class AlarmManagerServiceTest { mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); verify(mBatteryManager).isCharging(); - setTareEnabled(false); + setTareEnabled(EconomyManager.ENABLED_MODE_OFF); mAppStandbyWindow = mService.mConstants.APP_STANDBY_WINDOW; mAllowWhileIdleWindow = mService.mConstants.ALLOW_WHILE_IDLE_WINDOW; ArgumentCaptor captor = @@ -658,10 +659,10 @@ public class AlarmManagerServiceTest { mService.mConstants.onPropertiesChanged(mDeviceConfigProperties); } - private void setTareEnabled(boolean enabled) { - when(mEconomyManagerInternal.isEnabled(eq(AlarmManagerEconomicPolicy.POLICY_ALARM))) - .thenReturn(enabled); - mService.mConstants.onTareEnabledStateChanged(enabled); + private void setTareEnabled(int enabledMode) { + when(mEconomyManagerInternal.getEnabledMode(eq(AlarmManagerEconomicPolicy.POLICY_ALARM))) + .thenReturn(enabledMode); + mService.mConstants.onTareEnabledModeChanged(enabledMode); } /** @@ -2091,7 +2092,7 @@ public class AlarmManagerServiceTest { @Test public void tareThrottling() { - setTareEnabled(true); + setTareEnabled(EconomyManager.ENABLED_MODE_ON); final ArgumentCaptor listenerCaptor = ArgumentCaptor.forClass(EconomyManagerInternal.AffordabilityChangeListener.class); final ArgumentCaptor billCaptor = @@ -3418,9 +3419,18 @@ public class AlarmManagerServiceTest { } @Test - public void tareEventPushed() throws Exception { - setTareEnabled(true); + public void tareEventPushed_on() throws Exception { + setTareEnabled(EconomyManager.ENABLED_MODE_ON); + runTareEventPushed(); + } + @Test + public void tareEventPushed_shadow() throws Exception { + setTareEnabled(EconomyManager.ENABLED_MODE_SHADOW); + runTareEventPushed(); + } + + private void runTareEventPushed() throws Exception { for (int i = 0; i < 10; i++) { final int type = (i % 2 == 1) ? ELAPSED_REALTIME : ELAPSED_REALTIME_WAKEUP; setTestAlarm(type, mNowElapsedTest + i, getNewMockPendingIntent()); diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java index c46ebf20c3ee0..71280ce01779d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.when; +import android.app.tare.EconomyManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -89,7 +90,7 @@ public class ScribeTest { .mockStatic(LocalServices.class) .startMocking(); when(mIrs.getLock()).thenReturn(new Object()); - when(mIrs.isEnabled()).thenReturn(true); + when(mIrs.getEnabledMode()).thenReturn(EconomyManager.ENABLED_MODE_ON); when(mIrs.getInstalledPackages()).thenReturn(mInstalledPackages); when(mAnalyst.getReports()).thenReturn(mReports); mTestFileDir = new File(getContext().getFilesDir(), "scribe_test");