Loading services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java +6 −27 Original line number Original line Diff line number Diff line Loading @@ -104,7 +104,6 @@ public class BatterySaverPolicy extends ContentObserver { private static final String KEY_AOD_DISABLED = "aod_disabled"; private static final String KEY_AOD_DISABLED = "aod_disabled"; // Go into deep Doze as soon as the screen turns off. // Go into deep Doze as soon as the screen turns off. private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled"; private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled"; private static final String KEY_SEND_TRON_LOG = "send_tron_log"; private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i"; private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i"; private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n"; private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n"; Loading @@ -129,8 +128,7 @@ public class BatterySaverPolicy extends ContentObserver { new ArrayMap<>(), /* filesForNoninteractive */ new ArrayMap<>(), /* filesForNoninteractive */ false, /* forceAllAppsStandby */ false, /* forceAllAppsStandby */ false, /* forceBackgroundCheck */ false, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_NO_CHANGE, /* gpsMode */ PowerManager.LOCATION_MODE_NO_CHANGE /* gpsMode */ false /* sendTronLog */ ); ); private static final Policy DEFAULT_ADAPTIVE_POLICY = OFF_POLICY; private static final Policy DEFAULT_ADAPTIVE_POLICY = OFF_POLICY; Loading @@ -154,8 +152,7 @@ public class BatterySaverPolicy extends ContentObserver { new ArrayMap<>(), /* filesForNoninteractive */ new ArrayMap<>(), /* filesForNoninteractive */ true, /* forceAllAppsStandby */ true, /* forceAllAppsStandby */ true, /* forceBackgroundCheck */ true, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF, /* gpsMode */ PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF /* gpsMode */ false /* sendTronLog */ ); ); private final Object mLock; private final Object mLock; Loading Loading @@ -418,13 +415,10 @@ public class BatterySaverPolicy extends ContentObserver { if (currPolicy.disableOptionalSensors) sb.append("S"); if (currPolicy.disableOptionalSensors) sb.append("S"); if (currPolicy.disableAod) sb.append("o"); if (currPolicy.disableAod) sb.append("o"); if (currPolicy.enableQuickDoze) sb.append("q"); if (currPolicy.enableQuickDoze) sb.append("q"); if (currPolicy.sendTronLog) sb.append("t"); sb.append(currPolicy.gpsMode); sb.append(currPolicy.gpsMode); mEventLogKeys = sb.toString(); mEventLogKeys = sb.toString(); mBatterySavingStats.setSendTronLog(currPolicy.sendTronLog); } } static class Policy { static class Policy { Loading Loading @@ -567,11 +561,6 @@ public class BatterySaverPolicy extends ContentObserver { */ */ public final int gpsMode; public final int gpsMode; /** * Whether BatterySavingStats should send tron events. */ public final boolean sendTronLog; private final int mHashCode; private final int mHashCode; Policy( Policy( Loading @@ -593,8 +582,7 @@ public class BatterySaverPolicy extends ContentObserver { ArrayMap<String, String> filesForNoninteractive, ArrayMap<String, String> filesForNoninteractive, boolean forceAllAppsStandby, boolean forceAllAppsStandby, boolean forceBackgroundCheck, boolean forceBackgroundCheck, int gpsMode, int gpsMode) { boolean sendTronLog) { this.adjustBrightnessFactor = adjustBrightnessFactor; this.adjustBrightnessFactor = adjustBrightnessFactor; this.advertiseIsEnabled = advertiseIsEnabled; this.advertiseIsEnabled = advertiseIsEnabled; Loading @@ -615,7 +603,6 @@ public class BatterySaverPolicy extends ContentObserver { this.forceAllAppsStandby = forceAllAppsStandby; this.forceAllAppsStandby = forceAllAppsStandby; this.forceBackgroundCheck = forceBackgroundCheck; this.forceBackgroundCheck = forceBackgroundCheck; this.gpsMode = gpsMode; this.gpsMode = gpsMode; this.sendTronLog = sendTronLog; mHashCode = Objects.hash( mHashCode = Objects.hash( adjustBrightnessFactor, adjustBrightnessFactor, Loading @@ -636,8 +623,7 @@ public class BatterySaverPolicy extends ContentObserver { filesForNoninteractive, filesForNoninteractive, forceAllAppsStandby, forceAllAppsStandby, forceBackgroundCheck, forceBackgroundCheck, gpsMode, gpsMode); sendTronLog); } } static Policy fromConfig(BatterySaverPolicyConfig config) { static Policy fromConfig(BatterySaverPolicyConfig config) { Loading Loading @@ -674,8 +660,7 @@ public class BatterySaverPolicy extends ContentObserver { (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), config.getForceAllAppsStandby(), config.getForceAllAppsStandby(), config.getForceBackgroundCheck(), config.getForceBackgroundCheck(), config.getGpsMode(), config.getGpsMode() OFF_POLICY.sendTronLog ); ); } } Loading Loading @@ -737,7 +722,6 @@ public class BatterySaverPolicy extends ContentObserver { boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, defaultPolicy.forceBackgroundCheck); defaultPolicy.forceBackgroundCheck); int gpsMode = parser.getInt(KEY_GPS_MODE, defaultPolicy.gpsMode); int gpsMode = parser.getInt(KEY_GPS_MODE, defaultPolicy.gpsMode); boolean sendTronLog = parser.getBoolean(KEY_SEND_TRON_LOG, defaultPolicy.sendTronLog); return new Policy( return new Policy( adjustBrightnessFactor, adjustBrightnessFactor, Loading @@ -761,8 +745,7 @@ public class BatterySaverPolicy extends ContentObserver { (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), forceAllAppsStandby, forceAllAppsStandby, forceBackgroundCheck, forceBackgroundCheck, gpsMode, gpsMode sendTronLog ); ); } } Loading @@ -788,7 +771,6 @@ public class BatterySaverPolicy extends ContentObserver { && forceAllAppsStandby == other.forceAllAppsStandby && forceAllAppsStandby == other.forceAllAppsStandby && forceBackgroundCheck == other.forceBackgroundCheck && forceBackgroundCheck == other.forceBackgroundCheck && gpsMode == other.gpsMode && gpsMode == other.gpsMode && sendTronLog == other.sendTronLog && filesForInteractive.equals(other.filesForInteractive) && filesForInteractive.equals(other.filesForInteractive) && filesForNoninteractive.equals(other.filesForNoninteractive); && filesForNoninteractive.equals(other.filesForNoninteractive); } } Loading Loading @@ -1026,9 +1008,6 @@ public class BatterySaverPolicy extends ContentObserver { pw.println(" " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger); pw.println(" " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger); pw.print(indent); pw.print(indent); pw.println(" " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze); pw.println(" " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze); pw.print(indent); pw.println(" " + KEY_SEND_TRON_LOG + "=" + p.sendTronLog); pw.println(); pw.print(" Interactive File values:\n"); pw.print(" Interactive File values:\n"); dumpMap(pw, " ", p.filesForInteractive); dumpMap(pw, " ", p.filesForInteractive); Loading services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java +1 −81 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,6 @@ */ */ package com.android.server.power.batterysaver; package com.android.server.power.batterysaver; import android.metrics.LogMaker; import android.os.BatteryManagerInternal; import android.os.BatteryManagerInternal; import android.os.SystemClock; import android.os.SystemClock; import android.util.ArrayMap; import android.util.ArrayMap; Loading @@ -24,9 +23,6 @@ import android.util.TimeUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.EventLogTags; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.LocalServices; Loading Loading @@ -142,7 +138,6 @@ public class BatterySavingStats { } } private BatteryManagerInternal mBatteryManagerInternal; private BatteryManagerInternal mBatteryManagerInternal; private final MetricsLogger mMetricsLogger; private static final int STATE_NOT_INITIALIZED = -1; private static final int STATE_NOT_INITIALIZED = -1; private static final int STATE_CHARGING = -2; private static final int STATE_CHARGING = -2; Loading Loading @@ -172,28 +167,11 @@ public class BatterySavingStats { @GuardedBy("mLock") @GuardedBy("mLock") private long mLastBatterySaverDisabledTime = 0; private long mLastBatterySaverDisabledTime = 0; private final MetricsLoggerHelper mMetricsLoggerHelper = new MetricsLoggerHelper(); @VisibleForTesting @GuardedBy("mLock") private boolean mSendTronLog; /** Visible for unit tests */ /** Visible for unit tests */ @VisibleForTesting @VisibleForTesting public BatterySavingStats(Object lock, MetricsLogger metricsLogger) { public BatterySavingStats(Object lock) { mLock = lock; mLock = lock; mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class); mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class); mMetricsLogger = metricsLogger; } public BatterySavingStats(Object lock) { this(lock, new MetricsLogger()); } public void setSendTronLog(boolean send) { synchronized (mLock) { mSendTronLog = send; } } } private BatteryManagerInternal getBatteryManagerInternal() { private BatteryManagerInternal getBatteryManagerInternal() { Loading Loading @@ -325,7 +303,6 @@ public class BatterySavingStats { endLastStateLocked(now, batteryLevel, batteryPercent); endLastStateLocked(now, batteryLevel, batteryPercent); startNewStateLocked(newState, now, batteryLevel, batteryPercent); startNewStateLocked(newState, now, batteryLevel, batteryPercent); mMetricsLoggerHelper.transitionStateLocked(newState, now, batteryLevel, batteryPercent); } } @GuardedBy("mLock") @GuardedBy("mLock") Loading Loading @@ -472,61 +449,4 @@ public class BatterySavingStats { onStat.totalBatteryDrainPercent, onStat.totalBatteryDrainPercent, onStat.drainPerHour() / 1000.0)); onStat.drainPerHour() / 1000.0)); } } @VisibleForTesting class MetricsLoggerHelper { private int mLastState = STATE_NOT_INITIALIZED; private long mStartTime; private int mStartBatteryLevel; private int mStartPercent; private static final int STATE_CHANGE_DETECT_MASK = (BatterySaverState.MASK << BatterySaverState.SHIFT) | (InteractiveState.MASK << InteractiveState.SHIFT); @GuardedBy("BatterySavingStats.this.mLock") public void transitionStateLocked( int newState, long now, int batteryLevel, int batteryPercent) { final boolean stateChanging = ((mLastState >= 0) ^ (newState >= 0)) || (((mLastState ^ newState) & STATE_CHANGE_DETECT_MASK) != 0); if (stateChanging) { if (mLastState >= 0) { final long deltaTime = now - mStartTime; reportLocked(mLastState, deltaTime, mStartBatteryLevel, mStartPercent, batteryLevel, batteryPercent); } mStartTime = now; mStartBatteryLevel = batteryLevel; mStartPercent = batteryPercent; } mLastState = newState; } @GuardedBy("BatterySavingStats.this.mLock") void reportLocked(int state, long deltaTimeMs, int startBatteryLevelUa, int startBatteryLevelPercent, int endBatteryLevelUa, int endBatteryLevelPercent) { if (!mSendTronLog) { return; } final boolean batterySaverOn = BatterySaverState.fromIndex(state) != BatterySaverState.OFF; final boolean interactive = InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE; final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER) .setSubtype(batterySaverOn ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT, startBatteryLevelPercent) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent); mMetricsLogger.write(logMaker); } } } } services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java +1 −8 Original line number Original line Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static com.android.server.power.batterysaver.BatterySaverPolicy.POLICY_LE import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import android.content.Context; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager; import android.os.PowerManager.ServiceType; import android.os.PowerManager.ServiceType; Loading @@ -34,10 +32,8 @@ import android.util.ArrayMap; import com.android.frameworks.servicestests.R; import com.android.frameworks.servicestests.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.server.power.batterysaver.BatterySaverPolicy.Policy; import com.android.server.power.batterysaver.BatterySaverPolicy.Policy; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations; /** /** Loading Loading @@ -87,9 +83,6 @@ public class BatterySaverPolicyTest extends AndroidTestCase { } } } } @Mock MetricsLogger mMetricsLogger = mock(MetricsLogger.class); private BatterySaverPolicyForTest mBatterySaverPolicy; private BatterySaverPolicyForTest mBatterySaverPolicy; private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>(); private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>(); Loading @@ -100,7 +93,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase { MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this); final Object lock = new Object(); final Object lock = new Object(); mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(), mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(), new BatterySavingStats(lock, mMetricsLogger)); new BatterySavingStats(lock)); mBatterySaverPolicy.systemReady(); mBatterySaverPolicy.systemReady(); mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL); mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL); Loading services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java +9 −54 Original line number Original line Diff line number Diff line Loading @@ -30,14 +30,12 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.io.PrintWriter; Loading @@ -54,7 +52,7 @@ public class BatterySavingStatsTest { private int mBatteryLevel = 1_000_000_000; private int mBatteryLevel = 1_000_000_000; private BatterySavingStatsTestable() { private BatterySavingStatsTestable() { super(new Object(), mMetricsLogger); super(new Object()); } } @Override @Override Loading Loading @@ -104,23 +102,13 @@ public class BatterySavingStatsTest { public MetricsLogger mMetricsLogger = mock(MetricsLogger.class); public MetricsLogger mMetricsLogger = mock(MetricsLogger.class); private boolean sendTronEvents; @Test public void testAll_withTron() { sendTronEvents = true; checkAll(); } @Test @Test public void testAll_noTron() { public void testAll() { sendTronEvents = false; checkAll(); checkAll(); } } private void checkAll() { private void checkAll() { final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); target.setSendTronLog(sendTronEvents); target.assertDumpable(); target.assertDumpable(); Loading Loading @@ -240,46 +228,13 @@ public class BatterySavingStatsTest { target.toDebugString()); target.toDebugString()); } } private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs, private void assertLog() { int deltaBatteryLevelUa, int deltaBatteryLevelPercent) { if (sendTronEvents) { ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class); verify(mMetricsLogger, times(1)).write(ac.capture()); LogMaker lm = ac.getValue(); assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory()); assertEquals(batterySaver ? 1 : 0, lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE)); assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE)); assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS)); assertEquals(deltaBatteryLevelUa, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA)); assertEquals(deltaBatteryLevelPercent, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT)); } else { verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); } } } @Test public void testMetricsLogger_withTron() { sendTronEvents = true; checkMetricsLogger(); } @Test @Test public void testMetricsLogger_noTron() { public void testMetricsLogger() { sendTronEvents = false; checkMetricsLogger(); } private void checkMetricsLogger() { final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); target.setSendTronLog(sendTronEvents); target.advanceClock(1); target.advanceClock(1); target.drainBattery(1000); target.drainBattery(1000); Loading @@ -300,7 +255,7 @@ public class BatterySavingStatsTest { InteractiveState.NON_INTERACTIVE, InteractiveState.NON_INTERACTIVE, DozeState.NOT_DOZING); DozeState.NOT_DOZING); assertLog(false, true, 60_000, 2000, 200); assertLog(); target.advanceClock(1); target.advanceClock(1); target.drainBattery(2000); target.drainBattery(2000); Loading Loading @@ -331,7 +286,7 @@ public class BatterySavingStatsTest { InteractiveState.INTERACTIVE, InteractiveState.INTERACTIVE, DozeState.NOT_DOZING); DozeState.NOT_DOZING); assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3); assertLog(); target.advanceClock(10); target.advanceClock(10); target.drainBattery(10000); target.drainBattery(10000); Loading @@ -339,7 +294,7 @@ public class BatterySavingStatsTest { reset(mMetricsLogger); reset(mMetricsLogger); target.startCharging(); target.startCharging(); assertLog(true, true, 60_000 * 10, 10000, 1000); assertLog(); target.advanceClock(1); target.advanceClock(1); target.drainBattery(2000); target.drainBattery(2000); Loading @@ -357,6 +312,6 @@ public class BatterySavingStatsTest { target.startCharging(); target.startCharging(); assertLog(true, false, 60_000, 2000, 200); assertLog(); } } } } Loading
services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java +6 −27 Original line number Original line Diff line number Diff line Loading @@ -104,7 +104,6 @@ public class BatterySaverPolicy extends ContentObserver { private static final String KEY_AOD_DISABLED = "aod_disabled"; private static final String KEY_AOD_DISABLED = "aod_disabled"; // Go into deep Doze as soon as the screen turns off. // Go into deep Doze as soon as the screen turns off. private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled"; private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled"; private static final String KEY_SEND_TRON_LOG = "send_tron_log"; private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i"; private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i"; private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n"; private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n"; Loading @@ -129,8 +128,7 @@ public class BatterySaverPolicy extends ContentObserver { new ArrayMap<>(), /* filesForNoninteractive */ new ArrayMap<>(), /* filesForNoninteractive */ false, /* forceAllAppsStandby */ false, /* forceAllAppsStandby */ false, /* forceBackgroundCheck */ false, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_NO_CHANGE, /* gpsMode */ PowerManager.LOCATION_MODE_NO_CHANGE /* gpsMode */ false /* sendTronLog */ ); ); private static final Policy DEFAULT_ADAPTIVE_POLICY = OFF_POLICY; private static final Policy DEFAULT_ADAPTIVE_POLICY = OFF_POLICY; Loading @@ -154,8 +152,7 @@ public class BatterySaverPolicy extends ContentObserver { new ArrayMap<>(), /* filesForNoninteractive */ new ArrayMap<>(), /* filesForNoninteractive */ true, /* forceAllAppsStandby */ true, /* forceAllAppsStandby */ true, /* forceBackgroundCheck */ true, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF, /* gpsMode */ PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF /* gpsMode */ false /* sendTronLog */ ); ); private final Object mLock; private final Object mLock; Loading Loading @@ -418,13 +415,10 @@ public class BatterySaverPolicy extends ContentObserver { if (currPolicy.disableOptionalSensors) sb.append("S"); if (currPolicy.disableOptionalSensors) sb.append("S"); if (currPolicy.disableAod) sb.append("o"); if (currPolicy.disableAod) sb.append("o"); if (currPolicy.enableQuickDoze) sb.append("q"); if (currPolicy.enableQuickDoze) sb.append("q"); if (currPolicy.sendTronLog) sb.append("t"); sb.append(currPolicy.gpsMode); sb.append(currPolicy.gpsMode); mEventLogKeys = sb.toString(); mEventLogKeys = sb.toString(); mBatterySavingStats.setSendTronLog(currPolicy.sendTronLog); } } static class Policy { static class Policy { Loading Loading @@ -567,11 +561,6 @@ public class BatterySaverPolicy extends ContentObserver { */ */ public final int gpsMode; public final int gpsMode; /** * Whether BatterySavingStats should send tron events. */ public final boolean sendTronLog; private final int mHashCode; private final int mHashCode; Policy( Policy( Loading @@ -593,8 +582,7 @@ public class BatterySaverPolicy extends ContentObserver { ArrayMap<String, String> filesForNoninteractive, ArrayMap<String, String> filesForNoninteractive, boolean forceAllAppsStandby, boolean forceAllAppsStandby, boolean forceBackgroundCheck, boolean forceBackgroundCheck, int gpsMode, int gpsMode) { boolean sendTronLog) { this.adjustBrightnessFactor = adjustBrightnessFactor; this.adjustBrightnessFactor = adjustBrightnessFactor; this.advertiseIsEnabled = advertiseIsEnabled; this.advertiseIsEnabled = advertiseIsEnabled; Loading @@ -615,7 +603,6 @@ public class BatterySaverPolicy extends ContentObserver { this.forceAllAppsStandby = forceAllAppsStandby; this.forceAllAppsStandby = forceAllAppsStandby; this.forceBackgroundCheck = forceBackgroundCheck; this.forceBackgroundCheck = forceBackgroundCheck; this.gpsMode = gpsMode; this.gpsMode = gpsMode; this.sendTronLog = sendTronLog; mHashCode = Objects.hash( mHashCode = Objects.hash( adjustBrightnessFactor, adjustBrightnessFactor, Loading @@ -636,8 +623,7 @@ public class BatterySaverPolicy extends ContentObserver { filesForNoninteractive, filesForNoninteractive, forceAllAppsStandby, forceAllAppsStandby, forceBackgroundCheck, forceBackgroundCheck, gpsMode, gpsMode); sendTronLog); } } static Policy fromConfig(BatterySaverPolicyConfig config) { static Policy fromConfig(BatterySaverPolicyConfig config) { Loading Loading @@ -674,8 +660,7 @@ public class BatterySaverPolicy extends ContentObserver { (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), config.getForceAllAppsStandby(), config.getForceAllAppsStandby(), config.getForceBackgroundCheck(), config.getForceBackgroundCheck(), config.getGpsMode(), config.getGpsMode() OFF_POLICY.sendTronLog ); ); } } Loading Loading @@ -737,7 +722,6 @@ public class BatterySaverPolicy extends ContentObserver { boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, defaultPolicy.forceBackgroundCheck); defaultPolicy.forceBackgroundCheck); int gpsMode = parser.getInt(KEY_GPS_MODE, defaultPolicy.gpsMode); int gpsMode = parser.getInt(KEY_GPS_MODE, defaultPolicy.gpsMode); boolean sendTronLog = parser.getBoolean(KEY_SEND_TRON_LOG, defaultPolicy.sendTronLog); return new Policy( return new Policy( adjustBrightnessFactor, adjustBrightnessFactor, Loading @@ -761,8 +745,7 @@ public class BatterySaverPolicy extends ContentObserver { (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), forceAllAppsStandby, forceAllAppsStandby, forceBackgroundCheck, forceBackgroundCheck, gpsMode, gpsMode sendTronLog ); ); } } Loading @@ -788,7 +771,6 @@ public class BatterySaverPolicy extends ContentObserver { && forceAllAppsStandby == other.forceAllAppsStandby && forceAllAppsStandby == other.forceAllAppsStandby && forceBackgroundCheck == other.forceBackgroundCheck && forceBackgroundCheck == other.forceBackgroundCheck && gpsMode == other.gpsMode && gpsMode == other.gpsMode && sendTronLog == other.sendTronLog && filesForInteractive.equals(other.filesForInteractive) && filesForInteractive.equals(other.filesForInteractive) && filesForNoninteractive.equals(other.filesForNoninteractive); && filesForNoninteractive.equals(other.filesForNoninteractive); } } Loading Loading @@ -1026,9 +1008,6 @@ public class BatterySaverPolicy extends ContentObserver { pw.println(" " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger); pw.println(" " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger); pw.print(indent); pw.print(indent); pw.println(" " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze); pw.println(" " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze); pw.print(indent); pw.println(" " + KEY_SEND_TRON_LOG + "=" + p.sendTronLog); pw.println(); pw.print(" Interactive File values:\n"); pw.print(" Interactive File values:\n"); dumpMap(pw, " ", p.filesForInteractive); dumpMap(pw, " ", p.filesForInteractive); Loading
services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java +1 −81 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,6 @@ */ */ package com.android.server.power.batterysaver; package com.android.server.power.batterysaver; import android.metrics.LogMaker; import android.os.BatteryManagerInternal; import android.os.BatteryManagerInternal; import android.os.SystemClock; import android.os.SystemClock; import android.util.ArrayMap; import android.util.ArrayMap; Loading @@ -24,9 +23,6 @@ import android.util.TimeUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.EventLogTags; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.LocalServices; Loading Loading @@ -142,7 +138,6 @@ public class BatterySavingStats { } } private BatteryManagerInternal mBatteryManagerInternal; private BatteryManagerInternal mBatteryManagerInternal; private final MetricsLogger mMetricsLogger; private static final int STATE_NOT_INITIALIZED = -1; private static final int STATE_NOT_INITIALIZED = -1; private static final int STATE_CHARGING = -2; private static final int STATE_CHARGING = -2; Loading Loading @@ -172,28 +167,11 @@ public class BatterySavingStats { @GuardedBy("mLock") @GuardedBy("mLock") private long mLastBatterySaverDisabledTime = 0; private long mLastBatterySaverDisabledTime = 0; private final MetricsLoggerHelper mMetricsLoggerHelper = new MetricsLoggerHelper(); @VisibleForTesting @GuardedBy("mLock") private boolean mSendTronLog; /** Visible for unit tests */ /** Visible for unit tests */ @VisibleForTesting @VisibleForTesting public BatterySavingStats(Object lock, MetricsLogger metricsLogger) { public BatterySavingStats(Object lock) { mLock = lock; mLock = lock; mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class); mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class); mMetricsLogger = metricsLogger; } public BatterySavingStats(Object lock) { this(lock, new MetricsLogger()); } public void setSendTronLog(boolean send) { synchronized (mLock) { mSendTronLog = send; } } } private BatteryManagerInternal getBatteryManagerInternal() { private BatteryManagerInternal getBatteryManagerInternal() { Loading Loading @@ -325,7 +303,6 @@ public class BatterySavingStats { endLastStateLocked(now, batteryLevel, batteryPercent); endLastStateLocked(now, batteryLevel, batteryPercent); startNewStateLocked(newState, now, batteryLevel, batteryPercent); startNewStateLocked(newState, now, batteryLevel, batteryPercent); mMetricsLoggerHelper.transitionStateLocked(newState, now, batteryLevel, batteryPercent); } } @GuardedBy("mLock") @GuardedBy("mLock") Loading Loading @@ -472,61 +449,4 @@ public class BatterySavingStats { onStat.totalBatteryDrainPercent, onStat.totalBatteryDrainPercent, onStat.drainPerHour() / 1000.0)); onStat.drainPerHour() / 1000.0)); } } @VisibleForTesting class MetricsLoggerHelper { private int mLastState = STATE_NOT_INITIALIZED; private long mStartTime; private int mStartBatteryLevel; private int mStartPercent; private static final int STATE_CHANGE_DETECT_MASK = (BatterySaverState.MASK << BatterySaverState.SHIFT) | (InteractiveState.MASK << InteractiveState.SHIFT); @GuardedBy("BatterySavingStats.this.mLock") public void transitionStateLocked( int newState, long now, int batteryLevel, int batteryPercent) { final boolean stateChanging = ((mLastState >= 0) ^ (newState >= 0)) || (((mLastState ^ newState) & STATE_CHANGE_DETECT_MASK) != 0); if (stateChanging) { if (mLastState >= 0) { final long deltaTime = now - mStartTime; reportLocked(mLastState, deltaTime, mStartBatteryLevel, mStartPercent, batteryLevel, batteryPercent); } mStartTime = now; mStartBatteryLevel = batteryLevel; mStartPercent = batteryPercent; } mLastState = newState; } @GuardedBy("BatterySavingStats.this.mLock") void reportLocked(int state, long deltaTimeMs, int startBatteryLevelUa, int startBatteryLevelPercent, int endBatteryLevelUa, int endBatteryLevelPercent) { if (!mSendTronLog) { return; } final boolean batterySaverOn = BatterySaverState.fromIndex(state) != BatterySaverState.OFF; final boolean interactive = InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE; final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER) .setSubtype(batterySaverOn ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT, startBatteryLevelPercent) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent); mMetricsLogger.write(logMaker); } } } }
services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java +1 −8 Original line number Original line Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static com.android.server.power.batterysaver.BatterySaverPolicy.POLICY_LE import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import android.content.Context; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager; import android.os.PowerManager.ServiceType; import android.os.PowerManager.ServiceType; Loading @@ -34,10 +32,8 @@ import android.util.ArrayMap; import com.android.frameworks.servicestests.R; import com.android.frameworks.servicestests.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.server.power.batterysaver.BatterySaverPolicy.Policy; import com.android.server.power.batterysaver.BatterySaverPolicy.Policy; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations; /** /** Loading Loading @@ -87,9 +83,6 @@ public class BatterySaverPolicyTest extends AndroidTestCase { } } } } @Mock MetricsLogger mMetricsLogger = mock(MetricsLogger.class); private BatterySaverPolicyForTest mBatterySaverPolicy; private BatterySaverPolicyForTest mBatterySaverPolicy; private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>(); private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>(); Loading @@ -100,7 +93,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase { MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this); final Object lock = new Object(); final Object lock = new Object(); mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(), mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(), new BatterySavingStats(lock, mMetricsLogger)); new BatterySavingStats(lock)); mBatterySaverPolicy.systemReady(); mBatterySaverPolicy.systemReady(); mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL); mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL); Loading
services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java +9 −54 Original line number Original line Diff line number Diff line Loading @@ -30,14 +30,12 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.io.PrintWriter; Loading @@ -54,7 +52,7 @@ public class BatterySavingStatsTest { private int mBatteryLevel = 1_000_000_000; private int mBatteryLevel = 1_000_000_000; private BatterySavingStatsTestable() { private BatterySavingStatsTestable() { super(new Object(), mMetricsLogger); super(new Object()); } } @Override @Override Loading Loading @@ -104,23 +102,13 @@ public class BatterySavingStatsTest { public MetricsLogger mMetricsLogger = mock(MetricsLogger.class); public MetricsLogger mMetricsLogger = mock(MetricsLogger.class); private boolean sendTronEvents; @Test public void testAll_withTron() { sendTronEvents = true; checkAll(); } @Test @Test public void testAll_noTron() { public void testAll() { sendTronEvents = false; checkAll(); checkAll(); } } private void checkAll() { private void checkAll() { final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); target.setSendTronLog(sendTronEvents); target.assertDumpable(); target.assertDumpable(); Loading Loading @@ -240,46 +228,13 @@ public class BatterySavingStatsTest { target.toDebugString()); target.toDebugString()); } } private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs, private void assertLog() { int deltaBatteryLevelUa, int deltaBatteryLevelPercent) { if (sendTronEvents) { ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class); verify(mMetricsLogger, times(1)).write(ac.capture()); LogMaker lm = ac.getValue(); assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory()); assertEquals(batterySaver ? 1 : 0, lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE)); assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE)); assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS)); assertEquals(deltaBatteryLevelUa, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA)); assertEquals(deltaBatteryLevelPercent, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT)); } else { verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); } } } @Test public void testMetricsLogger_withTron() { sendTronEvents = true; checkMetricsLogger(); } @Test @Test public void testMetricsLogger_noTron() { public void testMetricsLogger() { sendTronEvents = false; checkMetricsLogger(); } private void checkMetricsLogger() { final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); final BatterySavingStatsTestable target = new BatterySavingStatsTestable(); target.setSendTronLog(sendTronEvents); target.advanceClock(1); target.advanceClock(1); target.drainBattery(1000); target.drainBattery(1000); Loading @@ -300,7 +255,7 @@ public class BatterySavingStatsTest { InteractiveState.NON_INTERACTIVE, InteractiveState.NON_INTERACTIVE, DozeState.NOT_DOZING); DozeState.NOT_DOZING); assertLog(false, true, 60_000, 2000, 200); assertLog(); target.advanceClock(1); target.advanceClock(1); target.drainBattery(2000); target.drainBattery(2000); Loading Loading @@ -331,7 +286,7 @@ public class BatterySavingStatsTest { InteractiveState.INTERACTIVE, InteractiveState.INTERACTIVE, DozeState.NOT_DOZING); DozeState.NOT_DOZING); assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3); assertLog(); target.advanceClock(10); target.advanceClock(10); target.drainBattery(10000); target.drainBattery(10000); Loading @@ -339,7 +294,7 @@ public class BatterySavingStatsTest { reset(mMetricsLogger); reset(mMetricsLogger); target.startCharging(); target.startCharging(); assertLog(true, true, 60_000 * 10, 10000, 1000); assertLog(); target.advanceClock(1); target.advanceClock(1); target.drainBattery(2000); target.drainBattery(2000); Loading @@ -357,6 +312,6 @@ public class BatterySavingStatsTest { target.startCharging(); target.startCharging(); assertLog(true, false, 60_000, 2000, 200); assertLog(); } } } }