diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java index ff50ebd07f54e..98b75df9d4670 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java @@ -138,6 +138,8 @@ public class BatterySaverPolicy extends ContentObserver implements static final Policy OFF_POLICY = new Policy( 1f, /* adjustBrightnessFactor */ false, /* advertiseIsEnabled */ + new CpuFrequencies(), /* cpuFrequenciesForInteractive */ + new CpuFrequencies(), /* cpuFrequenciesForNoninteractive */ false, /* deferFullBackup */ false, /* deferKeyValueBackup */ false, /* disableAnimation */ @@ -150,8 +152,6 @@ public class BatterySaverPolicy extends ContentObserver implements false, /* enableFireWall */ false, /* enableNightMode */ false, /* enableQuickDoze */ - new ArrayMap<>(), /* filesForInteractive */ - new ArrayMap<>(), /* filesForNoninteractive */ false, /* forceAllAppsStandby */ false, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_NO_CHANGE, /* locationMode */ @@ -163,6 +163,8 @@ public class BatterySaverPolicy extends ContentObserver implements private static final Policy DEFAULT_FULL_POLICY = new Policy( 0.5f, /* adjustBrightnessFactor */ true, /* advertiseIsEnabled */ + new CpuFrequencies(), /* cpuFrequenciesForInteractive */ + new CpuFrequencies(), /* cpuFrequenciesForNoninteractive */ true, /* deferFullBackup */ true, /* deferKeyValueBackup */ false, /* disableAnimation */ @@ -175,8 +177,6 @@ public class BatterySaverPolicy extends ContentObserver implements true, /* enableFirewall */ true, /* enableNightMode */ true, /* enableQuickDoze */ - new ArrayMap<>(), /* filesForInteractive */ - new ArrayMap<>(), /* filesForNoninteractive */ true, /* forceAllAppsStandby */ true, /* forceBackgroundCheck */ PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF, /* locationMode */ @@ -488,6 +488,8 @@ public class BatterySaverPolicy extends ContentObserver implements mEffectivePolicyRaw = new Policy( rawPolicy.adjustBrightnessFactor, rawPolicy.advertiseIsEnabled, + rawPolicy.cpuFrequenciesForInteractive, + rawPolicy.cpuFrequenciesForNoninteractive, rawPolicy.deferFullBackup, rawPolicy.deferKeyValueBackup, rawPolicy.disableAnimation, @@ -502,8 +504,6 @@ public class BatterySaverPolicy extends ContentObserver implements // Don't force night mode when car projection is enabled. rawPolicy.enableNightMode && !mAutomotiveProjectionActive.get(), rawPolicy.enableQuickDoze, - rawPolicy.filesForInteractive, - rawPolicy.filesForNoninteractive, rawPolicy.forceAllAppsStandby, rawPolicy.forceBackgroundCheck, locationMode, @@ -649,20 +649,20 @@ public class BatterySaverPolicy extends ContentObserver implements public final boolean enableQuickDoze; /** - * List of [Filename -> content] that should be written when battery saver is activated + * List of CPU frequencies that should be written when battery saver is activated * and the device is interactive. * * We use this to change the max CPU frequencies. */ - public final ArrayMap filesForInteractive; + public final CpuFrequencies cpuFrequenciesForInteractive; /** - * List of [Filename -> content] that should be written when battery saver is activated + * List of CPU frequencies that should be written when battery saver is activated * and the device is non-interactive. * * We use this to change the max CPU frequencies. */ - public final ArrayMap filesForNoninteractive; + public final CpuFrequencies cpuFrequenciesForNoninteractive; /** * Whether to put all apps in the stand-by mode. @@ -688,6 +688,8 @@ public class BatterySaverPolicy extends ContentObserver implements Policy( float adjustBrightnessFactor, boolean advertiseIsEnabled, + CpuFrequencies cpuFrequenciesForInteractive, + CpuFrequencies cpuFrequenciesForNoninteractive, boolean deferFullBackup, boolean deferKeyValueBackup, boolean disableAnimation, @@ -700,8 +702,6 @@ public class BatterySaverPolicy extends ContentObserver implements boolean enableFirewall, boolean enableNightMode, boolean enableQuickDoze, - ArrayMap filesForInteractive, - ArrayMap filesForNoninteractive, boolean forceAllAppsStandby, boolean forceBackgroundCheck, int locationMode, @@ -709,6 +709,8 @@ public class BatterySaverPolicy extends ContentObserver implements this.adjustBrightnessFactor = Math.min(1, Math.max(0, adjustBrightnessFactor)); this.advertiseIsEnabled = advertiseIsEnabled; + this.cpuFrequenciesForInteractive = cpuFrequenciesForInteractive; + this.cpuFrequenciesForNoninteractive = cpuFrequenciesForNoninteractive; this.deferFullBackup = deferFullBackup; this.deferKeyValueBackup = deferKeyValueBackup; this.disableAnimation = disableAnimation; @@ -721,8 +723,6 @@ public class BatterySaverPolicy extends ContentObserver implements this.enableFirewall = enableFirewall; this.enableNightMode = enableNightMode; this.enableQuickDoze = enableQuickDoze; - this.filesForInteractive = filesForInteractive; - this.filesForNoninteractive = filesForNoninteractive; this.forceAllAppsStandby = forceAllAppsStandby; this.forceBackgroundCheck = forceBackgroundCheck; @@ -745,6 +745,8 @@ public class BatterySaverPolicy extends ContentObserver implements mHashCode = Objects.hash( adjustBrightnessFactor, advertiseIsEnabled, + cpuFrequenciesForInteractive, + cpuFrequenciesForNoninteractive, deferFullBackup, deferKeyValueBackup, disableAnimation, @@ -757,8 +759,6 @@ public class BatterySaverPolicy extends ContentObserver implements enableFirewall, enableNightMode, enableQuickDoze, - filesForInteractive, - filesForNoninteractive, forceAllAppsStandby, forceBackgroundCheck, locationMode, @@ -781,6 +781,8 @@ public class BatterySaverPolicy extends ContentObserver implements return new Policy( config.getAdjustBrightnessFactor(), config.getAdvertiseIsEnabled(), + (new CpuFrequencies()).parseString(cpuFreqInteractive), + (new CpuFrequencies()).parseString(cpuFreqNoninteractive), config.getDeferFullBackup(), config.getDeferKeyValueBackup(), config.getDisableAnimation(), @@ -793,10 +795,6 @@ public class BatterySaverPolicy extends ContentObserver implements config.getEnableFirewall(), config.getEnableNightMode(), config.getEnableQuickDoze(), - /* filesForInteractive */ - (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(), - /* filesForNoninteractive */ - (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), config.getForceAllAppsStandby(), config.getForceBackgroundCheck(), config.getLocationMode(), @@ -894,6 +892,8 @@ public class BatterySaverPolicy extends ContentObserver implements return new Policy( adjustBrightnessFactor, advertiseIsEnabled, + (new CpuFrequencies()).parseString(cpuFreqInteractive), + (new CpuFrequencies()).parseString(cpuFreqNoninteractive), deferFullBackup, deferKeyValueBackup, disableAnimation, @@ -907,10 +907,6 @@ public class BatterySaverPolicy extends ContentObserver implements enableFirewall, enableNightMode, enableQuickDoze, - /* filesForInteractive */ - (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(), - /* filesForNoninteractive */ - (new CpuFrequencies()).parseString(cpuFreqNoninteractive).toSysFileMap(), forceAllAppsStandby, forceBackgroundCheck, locationMode, @@ -941,8 +937,9 @@ public class BatterySaverPolicy extends ContentObserver implements && forceBackgroundCheck == other.forceBackgroundCheck && locationMode == other.locationMode && soundTriggerMode == other.soundTriggerMode - && filesForInteractive.equals(other.filesForInteractive) - && filesForNoninteractive.equals(other.filesForNoninteractive); + && cpuFrequenciesForInteractive.equals(other.cpuFrequenciesForInteractive) + && cpuFrequenciesForNoninteractive.equals( + other.cpuFrequenciesForNoninteractive); } @Override @@ -1097,8 +1094,9 @@ public class BatterySaverPolicy extends ContentObserver implements public ArrayMap getFileValues(boolean interactive) { synchronized (mLock) { - return interactive ? getCurrentPolicyLocked().filesForInteractive - : getCurrentPolicyLocked().filesForNoninteractive; + return interactive + ? getCurrentPolicyLocked().cpuFrequenciesForInteractive.toSysFileMap() + : getCurrentPolicyLocked().cpuFrequenciesForNoninteractive.toSysFileMap(); } } @@ -1190,13 +1188,13 @@ public class BatterySaverPolicy extends ContentObserver implements pw.println("Interactive File values:"); pw.increaseIndent(); - dumpMap(pw, p.filesForInteractive); + dumpMap(pw, p.cpuFrequenciesForInteractive.toSysFileMap()); pw.decreaseIndent(); pw.println(); pw.println("Noninteractive File values:"); pw.increaseIndent(); - dumpMap(pw, p.filesForNoninteractive); + dumpMap(pw, p.cpuFrequenciesForNoninteractive.toSysFileMap()); pw.decreaseIndent(); // Decrease from indent right after "Policy" line diff --git a/services/core/java/com/android/server/power/batterysaver/CpuFrequencies.java b/services/core/java/com/android/server/power/batterysaver/CpuFrequencies.java index f2485098fcaac..5b38cf48e5373 100644 --- a/services/core/java/com/android/server/power/batterysaver/CpuFrequencies.java +++ b/services/core/java/com/android/server/power/batterysaver/CpuFrequencies.java @@ -38,6 +38,8 @@ import java.util.Map; public class CpuFrequencies { private static final String TAG = "CpuFrequencies"; + private static final String CPU_DELIM = "/"; + private static final String FREQUENCY_DELIM = ":"; private final Object mLock = new Object(); @GuardedBy("mLock") @@ -53,12 +55,12 @@ public class CpuFrequencies { synchronized (mLock) { mCoreAndFrequencies.clear(); try { - for (String pair : cpuNumberAndFrequencies.split("/")) { + for (String pair : cpuNumberAndFrequencies.split(CPU_DELIM)) { pair = pair.trim(); if (pair.length() == 0) { continue; } - final String[] coreAndFreq = pair.split(":", 2); + final String[] coreAndFreq = pair.split(FREQUENCY_DELIM, 2); if (coreAndFreq.length != 2) { throw new IllegalArgumentException("Wrong format"); @@ -102,4 +104,39 @@ public class CpuFrequencies { } } } + + /** + * Returns String describing the frequency settings used. + * The returned String can be parsed again by {@link #parseString(String)}. + */ + public String toString() { + synchronized (mLock) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mCoreAndFrequencies.size(); i++) { + if (i > 0) { + sb.append(CPU_DELIM); + } + sb.append(mCoreAndFrequencies.keyAt(i)); + sb.append(FREQUENCY_DELIM); + sb.append(mCoreAndFrequencies.valueAt(i)); + } + + return sb.toString(); + } + } + + @Override + public boolean equals(Object obj) { + synchronized (mLock) { + if (this == obj) return true; + if (!(obj instanceof CpuFrequencies)) return false; + CpuFrequencies other = (CpuFrequencies) obj; + return mCoreAndFrequencies.equals(other.mCoreAndFrequencies); + } + } + + @Override + public int hashCode() { + return mCoreAndFrequencies.hashCode(); + } } diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java index 8371e9c852444..796394f179e17 100644 --- a/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java +++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java @@ -32,8 +32,8 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class CpuFrequenciesTest { private void check(ArrayMap expected, String config) { - assertEquals(expected, (new CpuFrequencies().parseString(config)) - .toSysFileMap()); + CpuFrequencies actual = new CpuFrequencies().parseString(config); + assertEquals(expected, actual.toSysFileMap()); } @Test @@ -67,4 +67,21 @@ public class CpuFrequenciesTest { check(expected, "0:1900800/4:1958400/1:"); // Shouldn't crash. check(expected, "0:1900800/4:1958400/1:b"); // Shouldn't crash. } + + @Test + public void testToString_returnsSanitizedStringUsedToParse() { + String inputString = "0:1900800/4:1958400/a:1"; + String expectedString = "0:1900800/4:1958400"; + CpuFrequencies cpuFrequencies = new CpuFrequencies(); + cpuFrequencies.parseString(inputString); + assertEquals(expectedString, cpuFrequencies.toString()); + } + + @Test + public void testEquals_objectsParsedFromSameStringShouldBeEqual() { + String inputString = "0:1900800/4:1958400/a:1"; + CpuFrequencies cpuFrequencies1 = new CpuFrequencies().parseString(inputString); + CpuFrequencies cpuFrequencies2 = new CpuFrequencies().parseString(inputString); + assertEquals(cpuFrequencies1, cpuFrequencies2); + } }