1455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei/* 2455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Copyright (C) 2017 The Android Open Source Project 3455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 4455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Licensed under the Apache License, Version 2.0 (the "License"); 5455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * you may not use this file except in compliance with the License. 6455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * You may obtain a copy of the License at 7455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 8455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * http://www.apache.org/licenses/LICENSE-2.0 9455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 10455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Unless required by applicable law or agreed to in writing, software 11455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * distributed under the License is distributed on an "AS IS" BASIS, 12455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * See the License for the specific language governing permissions and 14455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * limitations under the License. 15455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 16455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleipackage com.android.server.power; 17455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 18455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.content.ContentResolver; 1966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.content.Context; 20455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.database.ContentObserver; 21455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.net.Uri; 22455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.Handler; 2357f0f5513b593c206d8410922a667c8c5f79b2b8Makoto Onukiimport android.os.PowerManager; 242eccd0262827259d15ceaa0fca975d3243c3a699Makoto Onukiimport android.os.PowerManager.ServiceType; 2566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.os.PowerSaveState; 26455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.provider.Settings; 2766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.provider.Settings.Global; 2866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.text.TextUtils; 2966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.util.ArrayMap; 30455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.util.KeyValueListParser; 31455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.util.Slog; 32ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onukiimport android.view.accessibility.AccessibilityManager; 3366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 349be0140c1474dfd23d46121c51e636040a8080dfMakoto Onukiimport com.android.internal.R; 3566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport com.android.internal.annotations.GuardedBy; 36455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.internal.annotations.VisibleForTesting; 37bd7a62538901e256148186006f60bd4dfa35469aMakoto Onukiimport com.android.internal.os.BackgroundThread; 38bd7a62538901e256148186006f60bd4dfa35469aMakoto Onukiimport com.android.internal.util.ConcurrentUtils; 39076218bfc0094c17f95c2e8afa4d5b2480f03f73Makoto Onukiimport com.android.server.power.batterysaver.BatterySavingStats; 40ce643a309e8d414395ec36188523d10eb64d6618Makoto Onukiimport com.android.server.power.batterysaver.CpuFrequencies; 41455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 42455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport java.io.PrintWriter; 4366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport java.util.ArrayList; 443aaed2912be642d306fa223edcb58278b0e45795Makoto Onukiimport java.util.List; 45455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 46455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei/** 47455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Class to decide whether to turn on battery saver mode for specific service 4866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * 49bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki * IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy. 50bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki * Do not call out with the lock held, such as AccessibilityManager. (Settings provider is okay.) 51bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki * 52ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki * Test: 53ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki atest ${ANDROID_BUILD_TOP}/frameworks/base/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java 54455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 55455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleipublic class BatterySaverPolicy extends ContentObserver { 56455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String TAG = "BatterySaverPolicy"; 57455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 58ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki public static final boolean DEBUG = false; // DO NOT SUBMIT WITH TRUE. 59ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki 60455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei // Secure setting for GPS behavior when battery saver mode is on. 61455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public static final String SECURE_KEY_GPS_MODE = "batterySaverGpsMode"; 62455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 63455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_GPS_MODE = "gps_mode"; 64455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_VIBRATION_DISABLED = "vibration_disabled"; 65455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_ANIMATION_DISABLED = "animation_disabled"; 66455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_SOUNDTRIGGER_DISABLED = "soundtrigger_disabled"; 67455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_FIREWALL_DISABLED = "firewall_disabled"; 68455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_ADJUST_BRIGHTNESS_DISABLED = "adjust_brightness_disabled"; 6929c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei private static final String KEY_DATASAVER_DISABLED = "datasaver_disabled"; 70a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki private static final String KEY_LAUNCH_BOOST_DISABLED = "launch_boost_disabled"; 71455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_ADJUST_BRIGHTNESS_FACTOR = "adjust_brightness_factor"; 72455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_FULLBACKUP_DEFERRED = "fullbackup_deferred"; 73455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private static final String KEY_KEYVALUE_DEFERRED = "keyvaluebackup_deferred"; 749be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki private static final String KEY_FORCE_ALL_APPS_STANDBY = "force_all_apps_standby"; 75e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki private static final String KEY_FORCE_BACKGROUND_CHECK = "force_background_check"; 76aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki private static final String KEY_OPTIONAL_SENSORS_DISABLED = "optional_sensors_disabled"; 7792a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin private static final String KEY_AOD_DISABLED = "aod_disabled"; 78c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki private static final String KEY_SEND_TRON_LOG = "send_tron_log"; 79455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 80ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i"; 81ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n"; 8266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 83bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki private final Object mLock; 84bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki private final Handler mHandler; 85a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki 86a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 87a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki private String mSettings; 88a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki 89a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 90a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki private String mDeviceSpecificSettings; 91a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki 92a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 93a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki private String mDeviceSpecificSettingsSource; // For dump() only. 94455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 95455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 9685dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki * A short string describing which battery saver is now enabled, which we dump in the eventlog. 9785dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki */ 9885dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki @GuardedBy("mLock") 9985dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki private String mEventLogKeys; 10085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 10185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki /** 102455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if vibration is disabled in battery saver mode. 103455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 104455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 105455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_VIBRATION_DISABLED 106455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 107a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 108ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki private boolean mVibrationDisabledConfig; 109ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 110ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki /** 111ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki * Whether vibration should *really* be disabled -- i.e. {@link #mVibrationDisabledConfig} 112ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki * is true *and* {@link #mAccessibilityEnabled} is false. 113ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki */ 114ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki @GuardedBy("mLock") 115ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki private boolean mVibrationDisabledEffective; 116455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 117455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 118455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if animation is disabled in battery saver mode. 119455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 120455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 121455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_ANIMATION_DISABLED 122455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 123a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 124455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mAnimationDisabled; 125455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 126455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 127455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if sound trigger is disabled in battery saver mode 128455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * in battery saver mode. 129455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 130455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 131455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_SOUNDTRIGGER_DISABLED 132455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 133a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 134455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mSoundTriggerDisabled; 135455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 136455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 137455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if full backup is deferred in battery saver mode. 138455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 139455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 140455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_FULLBACKUP_DEFERRED 141455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 142a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 143455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mFullBackupDeferred; 144455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 145455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 146455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if key value backup is deferred in battery saver mode. 147455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 148455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 149455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_KEYVALUE_DEFERRED 150455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 151a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 152455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mKeyValueBackupDeferred; 153455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 154455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 155455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if network policy firewall is disabled in battery saver mode. 156455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 157455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 158455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_FIREWALL_DISABLED 159455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 160a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 161455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mFireWallDisabled; 162455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 163455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 164455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * {@code true} if adjust brightness is disabled in battery saver mode. 165455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 166455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 167455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_ADJUST_BRIGHTNESS_DISABLED 168455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 169a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 170455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private boolean mAdjustBrightnessDisabled; 171455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 172455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 17329c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei * {@code true} if data saver is disabled in battery saver mode. 17429c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei * 17529c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 17629c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei * @see #KEY_DATASAVER_DISABLED 17729c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei */ 178a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 17929c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei private boolean mDataSaverDisabled; 18029c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei 18129c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei /** 182a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki * {@code true} if launch boost should be disabled on battery saver. 183a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki */ 184a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 185a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki private boolean mLaunchBoostDisabled; 186a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki 187a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki /** 188455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * This is the flag to decide the gps mode in battery saver mode. 189455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 190455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 191455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_GPS_MODE 192455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 193a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 194455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private int mGpsMode; 195455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 196455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 197455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * This is the flag to decide the how much to adjust the screen brightness. This is 198455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * the float value from 0 to 1 where 1 means don't change brightness. 199455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 200455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see Settings.Global#BATTERY_SAVER_CONSTANTS 201455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @see #KEY_ADJUST_BRIGHTNESS_FACTOR 202455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 203a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 204455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei private float mAdjustBrightnessFactor; 205455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 206aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki /** 2079be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki * Whether to put all apps in the stand-by mode. 208aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki */ 209a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 2109be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki private boolean mForceAllAppsStandby; 211aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki 212aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki /** 213e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki * Whether to put all apps in the stand-by mode. 214e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki */ 215e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki @GuardedBy("mLock") 216e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki private boolean mForceBackgroundCheck; 217e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki 218e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki /** 21992a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin * Whether to show non-essential sensors (e.g. edge sensors) or not. 220aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki */ 221a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki @GuardedBy("mLock") 222aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki private boolean mOptionalSensorsDisabled; 223aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki 22492a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin /** 22592a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin * Whether AOD is enabled or not. 22692a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin */ 22792a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin @GuardedBy("mLock") 22892a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin private boolean mAodDisabled; 22992a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin 230c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki /** 231c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki * Whether BatterySavingStats should send tron events. 232c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki */ 233c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki @GuardedBy("mLock") 234c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki private boolean mSendTronLog; 235c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki 236bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki private final Context mContext; 237bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki private final ContentResolver mContentResolver; 238bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki private final BatterySavingStats mBatterySavingStats; 239ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 240ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki @GuardedBy("mLock") 2413aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki private final List<BatterySaverPolicyListener> mListeners = new ArrayList<>(); 24266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 24366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki /** 24466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * List of [Filename -> content] that should be written when battery saver is activated 2453aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki * and the device is interactive. 24666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * 24766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * We use this to change the max CPU frequencies. 24866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki */ 24966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki @GuardedBy("mLock") 2503aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki private ArrayMap<String, String> mFilesForInteractive; 25166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 25266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki /** 25366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * List of [Filename -> content] that should be written when battery saver is activated 2543aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki * and the device is non-interactive. 25566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * 25666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki * We use this to change the max CPU frequencies. 25766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki */ 25866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki @GuardedBy("mLock") 2593aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki private ArrayMap<String, String> mFilesForNoninteractive; 26066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 261ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki /** 262ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki * Whether accessibility is enabled or not. 263ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki */ 264ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki @GuardedBy("mLock") 265ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki private boolean mAccessibilityEnabled; 266ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 26766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki public interface BatterySaverPolicyListener { 26866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki void onBatterySaverPolicyChanged(BatterySaverPolicy policy); 26966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 27066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 271bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki public BatterySaverPolicy(Object lock, Context context, BatterySavingStats batterySavingStats) { 272bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki super(BackgroundThread.getHandler()); 273bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mLock = lock; 274bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mHandler = BackgroundThread.getHandler(); 275bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mContext = context; 276bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mContentResolver = context.getContentResolver(); 277bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mBatterySavingStats = batterySavingStats; 278455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 279455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 280bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki /** 281bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki * Called by {@link PowerManagerService#systemReady}, *with no lock held.* 282bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki */ 283bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki public void systemReady() { 284bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki ConcurrentUtils.wtfIfLockHeld(TAG, mLock); 28566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 286bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mContentResolver.registerContentObserver(Settings.Global.getUriFor( 287bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki Settings.Global.BATTERY_SAVER_CONSTANTS), false, this); 288bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mContentResolver.registerContentObserver(Settings.Global.getUriFor( 289bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS), false, this); 290ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 291bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki final AccessibilityManager acm = mContext.getSystemService(AccessibilityManager.class); 292ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 293bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki acm.addAccessibilityStateChangeListener((enabled) -> { 294bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki synchronized (mLock) { 295bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mAccessibilityEnabled = enabled; 296bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki } 297bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki refreshSettings(); 298bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki }); 299bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki final boolean enabled = acm.isEnabled(); 300bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki synchronized (mLock) { 301bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mAccessibilityEnabled = enabled; 30266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 30366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki onChange(true, null); 30466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 30566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 30666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki public void addListener(BatterySaverPolicyListener listener) { 30766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki synchronized (mLock) { 30866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mListeners.add(listener); 30966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 31066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 31166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 31266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki @VisibleForTesting 31366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki String getGlobalSetting(String key) { 314bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki return Settings.Global.getString(mContentResolver, key); 31566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 31666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 31766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki @VisibleForTesting 31866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki int getDeviceSpecificConfigResId() { 31966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki return R.string.config_batterySaverDeviceSpecificConfig; 32066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 321455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 322455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei @Override 323455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public void onChange(boolean selfChange, Uri uri) { 324ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki refreshSettings(); 325ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki } 326ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 327ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki private void refreshSettings() { 32866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki final BatterySaverPolicyListener[] listeners; 32966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki synchronized (mLock) { 33066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Load the non-device-specific setting. 33166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki final String setting = getGlobalSetting(Settings.Global.BATTERY_SAVER_CONSTANTS); 33266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 33366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Load the device specific setting. 33466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // We first check the global setting, and if it's empty or the string "null" is set, 33566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // use the default value from config.xml. 33666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki String deviceSpecificSetting = getGlobalSetting( 33766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS); 33866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mDeviceSpecificSettingsSource = 33966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS; 34066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 34166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki if (TextUtils.isEmpty(deviceSpecificSetting) || "null".equals(deviceSpecificSetting)) { 34266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki deviceSpecificSetting = 34366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mContext.getString(getDeviceSpecificConfigResId()); 34466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mDeviceSpecificSettingsSource = "(overlay)"; 34566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 34666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 34766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Update. 34866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki updateConstantsLocked(setting, deviceSpecificSetting); 34966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 35066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki listeners = mListeners.toArray(new BatterySaverPolicyListener[mListeners.size()]); 35166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 35266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 35366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Notify the listeners. 354bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mHandler.post(() -> { 355bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki for (BatterySaverPolicyListener listener : listeners) { 356bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki listener.onBatterySaverPolicyChanged(this); 357bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki } 358bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki }); 359455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 360455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 361a36dc621ef0b86a0bd46f1d4f5a719a466ba1800Andreas Gampe @GuardedBy("mLock") 362455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei @VisibleForTesting 36366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki void updateConstantsLocked(final String setting, final String deviceSpecificSetting) { 36466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mSettings = setting; 36566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mDeviceSpecificSettings = deviceSpecificSetting; 36666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 367ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki if (DEBUG) { 368ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki Slog.i(TAG, "mSettings=" + mSettings); 369ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki Slog.i(TAG, "mDeviceSpecificSettings=" + mDeviceSpecificSettings); 370ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki } 371ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki 37266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki final KeyValueListParser parser = new KeyValueListParser(','); 37366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 37466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Non-device-specific parameters. 37566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki try { 37666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki parser.setString(setting); 37766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } catch (IllegalArgumentException e) { 37866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki Slog.wtf(TAG, "Bad battery saver constants: " + setting); 37966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 38066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 381ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki mVibrationDisabledConfig = parser.getBoolean(KEY_VIBRATION_DISABLED, true); 3824de1ad7061039aee9905a302753ee8d22cca7c72Makoto Onuki mAnimationDisabled = parser.getBoolean(KEY_ANIMATION_DISABLED, false); 38366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mSoundTriggerDisabled = parser.getBoolean(KEY_SOUNDTRIGGER_DISABLED, true); 38466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mFullBackupDeferred = parser.getBoolean(KEY_FULLBACKUP_DEFERRED, true); 38566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mKeyValueBackupDeferred = parser.getBoolean(KEY_KEYVALUE_DEFERRED, true); 38666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mFireWallDisabled = parser.getBoolean(KEY_FIREWALL_DISABLED, false); 38797e5a71838f07721a6622e4de837ffbbdf9ba7f7Makoto Onuki mAdjustBrightnessDisabled = parser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED, true); 38866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mAdjustBrightnessFactor = parser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR, 0.5f); 38966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mDataSaverDisabled = parser.getBoolean(KEY_DATASAVER_DISABLED, true); 390a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki mLaunchBoostDisabled = parser.getBoolean(KEY_LAUNCH_BOOST_DISABLED, true); 3919be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki mForceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY, true); 392e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki mForceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, true); 39366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mOptionalSensorsDisabled = parser.getBoolean(KEY_OPTIONAL_SENSORS_DISABLED, true); 39492a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin mAodDisabled = parser.getBoolean(KEY_AOD_DISABLED, true); 395a50bf78fdeecedb646a5bb34fe42343c68e25c96Makoto Onuki mSendTronLog = parser.getBoolean(KEY_SEND_TRON_LOG, false); 39666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 39766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Get default value from Settings.Secure 39866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki final int defaultGpsMode = Settings.Secure.getInt(mContentResolver, SECURE_KEY_GPS_MODE, 39957f0f5513b593c206d8410922a667c8c5f79b2b8Makoto Onuki PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF); 40066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki mGpsMode = parser.getInt(KEY_GPS_MODE, defaultGpsMode); 40166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 40266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki // Non-device-specific parameters. 40366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki try { 40466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki parser.setString(deviceSpecificSetting); 40566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } catch (IllegalArgumentException e) { 40666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki Slog.wtf(TAG, "Bad device specific battery saver constants: " 40766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki + deviceSpecificSetting); 40866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 40966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 410ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki mFilesForInteractive = (new CpuFrequencies()).parseString( 411ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki parser.getString(KEY_CPU_FREQ_INTERACTIVE, "")).toSysFileMap(); 41266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 413ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki mFilesForNoninteractive = (new CpuFrequencies()).parseString( 414ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki parser.getString(KEY_CPU_FREQ_NONINTERACTIVE, "")).toSysFileMap(); 41585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 416ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki // Update the effective policy. 417ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki mVibrationDisabledEffective = mVibrationDisabledConfig 418ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki && !mAccessibilityEnabled; // Don't disable vibration when accessibility is on. 419ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki 42085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki final StringBuilder sb = new StringBuilder(); 42185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 42285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mForceAllAppsStandby) sb.append("A"); 42385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mForceBackgroundCheck) sb.append("B"); 42485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 425ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki if (mVibrationDisabledEffective) sb.append("v"); 42685dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mAnimationDisabled) sb.append("a"); 42785dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mSoundTriggerDisabled) sb.append("s"); 42885dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mFullBackupDeferred) sb.append("F"); 42985dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mKeyValueBackupDeferred) sb.append("K"); 43085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (!mFireWallDisabled) sb.append("f"); 43185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (!mDataSaverDisabled) sb.append("d"); 43285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (!mAdjustBrightnessDisabled) sb.append("b"); 43385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 43485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mLaunchBoostDisabled) sb.append("l"); 43585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki if (mOptionalSensorsDisabled) sb.append("S"); 43692a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin if (mAodDisabled) sb.append("o"); 437c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki if (mSendTronLog) sb.append("t"); 43885dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 43985dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki sb.append(mGpsMode); 44085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 44185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki mEventLogKeys = sb.toString(); 442c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki 443bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mBatterySavingStats.setSendTronLog(mSendTronLog); 444455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 445455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 446455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei /** 447455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Get the {@link PowerSaveState} based on {@paramref type} and {@paramref realMode}. 448455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * The result will have {@link PowerSaveState#batterySaverEnabled} and some other 449455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * parameters when necessary. 450455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * 451455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @param type type of the service, one of {@link ServiceType} 452455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @param realMode whether the battery saver is on by default 453455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * @return State data that contains battery saver data 454455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */ 455455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public PowerSaveState getBatterySaverPolicy(@ServiceType int type, boolean realMode) { 45666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki synchronized (mLock) { 45729c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei final PowerSaveState.Builder builder = new PowerSaveState.Builder() 45829c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei .setGlobalBatterySaverEnabled(realMode); 459455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei if (!realMode) { 460455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(realMode) 461455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 462455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 463455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei switch (type) { 464455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.GPS: 465455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(realMode) 466455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .setGpsMode(mGpsMode) 467455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 468455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.ANIMATION: 469455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(mAnimationDisabled) 470455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 471455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.FULL_BACKUP: 472455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(mFullBackupDeferred) 473455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 474455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.KEYVALUE_BACKUP: 475455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(mKeyValueBackupDeferred) 476455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 477455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.NETWORK_FIREWALL: 478455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(!mFireWallDisabled) 479455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 480455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.SCREEN_BRIGHTNESS: 481455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(!mAdjustBrightnessDisabled) 482455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .setBrightnessFactor(mAdjustBrightnessFactor) 483455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 48429c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei case ServiceType.DATA_SAVER: 48529c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei return builder.setBatterySaverEnabled(!mDataSaverDisabled) 48629c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei .build(); 487455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.SOUND: 488455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(mSoundTriggerDisabled) 489455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 490455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei case ServiceType.VIBRATION: 491ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki return builder.setBatterySaverEnabled(mVibrationDisabledEffective) 492455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 493e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki case ServiceType.FORCE_ALL_APPS_STANDBY: 494e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki return builder.setBatterySaverEnabled(mForceAllAppsStandby) 495e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki .build(); 496e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki case ServiceType.FORCE_BACKGROUND_CHECK: 497e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki return builder.setBatterySaverEnabled(mForceBackgroundCheck) 498e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki .build(); 499aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki case ServiceType.OPTIONAL_SENSORS: 500aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki return builder.setBatterySaverEnabled(mOptionalSensorsDisabled) 501aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki .build(); 50292a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin case ServiceType.AOD: 50392a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin return builder.setBatterySaverEnabled(mAodDisabled) 50492a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin .build(); 505455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei default: 506455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return builder.setBatterySaverEnabled(realMode) 507455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .build(); 508455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 509455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 510455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 511455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 5122b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki public int getGpsMode() { 5132b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki synchronized (mLock) { 5142b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki return mGpsMode; 5152b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki } 5162b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki } 5172b186fa2142087cb3bb5d5996febe66b2aaf7aa3Makoto Onuki 5183aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki public ArrayMap<String, String> getFileValues(boolean interactive) { 51966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki synchronized (mLock) { 5203aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki return interactive ? mFilesForInteractive : mFilesForNoninteractive; 52166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 52266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 52366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 524a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki public boolean isLaunchBoostDisabled() { 525a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki synchronized (mLock) { 526a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki return mLaunchBoostDisabled; 527a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki } 528a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki } 529a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki 53085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki public String toEventLogString() { 53185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki synchronized (mLock) { 53285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki return mEventLogKeys; 53385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki } 53485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki } 53585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki 536455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public void dump(PrintWriter pw) { 53766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki synchronized (mLock) { 53866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(); 539bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mBatterySavingStats.dump(pw, ""); 540c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki 541c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki pw.println(); 542c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki pw.println("Battery saver policy (*NOTE* they only apply when battery saver is ON):"); 543ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki pw.println(" Settings: " + Settings.Global.BATTERY_SAVER_CONSTANTS); 544ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki pw.println(" value: " + mSettings); 545ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki pw.println(" Settings: " + mDeviceSpecificSettingsSource); 546ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki pw.println(" value: " + mDeviceSpecificSettings); 54766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 54866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(); 549ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki pw.println(" mAccessibilityEnabled=" + mAccessibilityEnabled); 550ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki pw.println(" " + KEY_VIBRATION_DISABLED + ":config=" + mVibrationDisabledConfig); 551ebd2421c733f2bc56928f9ac2e583cac20db020bMakoto Onuki pw.println(" " + KEY_VIBRATION_DISABLED + ":effective=" + mVibrationDisabledEffective); 55266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_ANIMATION_DISABLED + "=" + mAnimationDisabled); 55366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_FULLBACKUP_DEFERRED + "=" + mFullBackupDeferred); 55466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_KEYVALUE_DEFERRED + "=" + mKeyValueBackupDeferred); 55566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_FIREWALL_DISABLED + "=" + mFireWallDisabled); 55666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_DATASAVER_DISABLED + "=" + mDataSaverDisabled); 557a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki pw.println(" " + KEY_LAUNCH_BOOST_DISABLED + "=" + mLaunchBoostDisabled); 55866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_ADJUST_BRIGHTNESS_DISABLED + "=" + mAdjustBrightnessDisabled); 55966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_ADJUST_BRIGHTNESS_FACTOR + "=" + mAdjustBrightnessFactor); 56066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_GPS_MODE + "=" + mGpsMode); 5619be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki pw.println(" " + KEY_FORCE_ALL_APPS_STANDBY + "=" + mForceAllAppsStandby); 562e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki pw.println(" " + KEY_FORCE_BACKGROUND_CHECK + "=" + mForceBackgroundCheck); 56366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(" " + KEY_OPTIONAL_SENSORS_DISABLED + "=" + mOptionalSensorsDisabled); 56492a62e5533e816d05b8342f20114d56ddab18fc3Lucas Dupin pw.println(" " + KEY_AOD_DISABLED + "=" + mAodDisabled); 565c733500d1de3db256f5f97b71920f55878b2156fMakoto Onuki pw.println(" " + KEY_SEND_TRON_LOG + "=" + mSendTronLog); 56666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(); 56766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 5683aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki pw.print(" Interactive File values:\n"); 5693aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki dumpMap(pw, " ", mFilesForInteractive); 57066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println(); 57166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 5723aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki pw.print(" Noninteractive File values:\n"); 5733aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki dumpMap(pw, " ", mFilesForNoninteractive); 57466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 57566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 57666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki 57766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki private void dumpMap(PrintWriter pw, String prefix, ArrayMap<String, String> map) { 57866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki if (map == null) { 57966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki return; 58066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 58166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki final int size = map.size(); 58266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki for (int i = 0; i < size; i++) { 58366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.print(prefix); 58466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.print(map.keyAt(i)); 58566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.print(": '"); 58666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.print(map.valueAt(i)); 58766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki pw.println("'"); 58866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki } 589455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 590bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki 591bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki @VisibleForTesting 592bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki public void setAccessibilityEnabledForTest(boolean enabled) { 593bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki synchronized (mLock) { 594bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki mAccessibilityEnabled = enabled; 595bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki } 596bd7a62538901e256148186006f60bd4dfa35469aMakoto Onuki } 597455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei} 598