Merge "Add shadow mode."

This commit is contained in:
TreeHugger Robot
2023-01-25 01:12:39 +00:00
committed by Android (Google) Code Review
9 changed files with 167 additions and 82 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<String, ArraySet<String>> 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<TareStateChangeListener> 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);

View File

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

View File

@@ -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<AppStandbyInternal.AppIdleStateChangeListener> 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<EconomyManagerInternal.AffordabilityChangeListener> listenerCaptor =
ArgumentCaptor.forClass(EconomyManagerInternal.AffordabilityChangeListener.class);
final ArgumentCaptor<EconomyManagerInternal.ActionBill> 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());

View File

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