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