Merge "Add shadow mode."
This commit is contained in:
committed by
Android (Google) Code Review
commit
8b5cc0a319
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user