BatterySaverPolicy.java revision 85dd0852fe506bcf800bea99aeb7af401e1485c4
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;
232eccd0262827259d15ceaa0fca975d3243c3a699Makoto Onukiimport android.os.PowerManager.ServiceType;
2466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.os.PowerSaveState;
25455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.provider.Settings;
2666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.provider.Settings.Global;
2766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.text.TextUtils;
2866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport android.util.ArrayMap;
29455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.util.KeyValueListParser;
30455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.util.Slog;
3166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
329be0140c1474dfd23d46121c51e636040a8080dfMakoto Onukiimport com.android.internal.R;
3366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport com.android.internal.annotations.GuardedBy;
34455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.internal.annotations.VisibleForTesting;
35ce643a309e8d414395ec36188523d10eb64d6618Makoto Onukiimport com.android.server.power.batterysaver.CpuFrequencies;
36455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
37455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport java.io.PrintWriter;
3866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onukiimport java.util.ArrayList;
393aaed2912be642d306fa223edcb58278b0e45795Makoto Onukiimport java.util.List;
40455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
41455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei/**
42455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei * Class to decide whether to turn on battery saver mode for specific service
4366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki *
44ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki * Test:
45ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki atest ${ANDROID_BUILD_TOP}/frameworks/base/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
46455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei */
47455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleipublic class BatterySaverPolicy extends ContentObserver {
48455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String TAG = "BatterySaverPolicy";
49455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
50ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki    public static final boolean DEBUG = false; // DO NOT SUBMIT WITH TRUE.
51ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki
52455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    // Value of batterySaverGpsMode such that GPS isn't affected by battery saver mode.
53455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public static final int GPS_MODE_NO_CHANGE = 0;
54455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    // Value of batterySaverGpsMode such that GPS is disabled when battery saver mode
55455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    // is enabled and the screen is off.
56455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public static final int GPS_MODE_DISABLED_WHEN_SCREEN_OFF = 1;
57455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    // Secure setting for GPS behavior when battery saver mode is on.
58455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public static final String SECURE_KEY_GPS_MODE = "batterySaverGpsMode";
59455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
60455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_GPS_MODE = "gps_mode";
61455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_VIBRATION_DISABLED = "vibration_disabled";
62455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_ANIMATION_DISABLED = "animation_disabled";
63455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_SOUNDTRIGGER_DISABLED = "soundtrigger_disabled";
64455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_FIREWALL_DISABLED = "firewall_disabled";
65455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_ADJUST_BRIGHTNESS_DISABLED = "adjust_brightness_disabled";
6629c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei    private static final String KEY_DATASAVER_DISABLED = "datasaver_disabled";
67a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private static final String KEY_LAUNCH_BOOST_DISABLED = "launch_boost_disabled";
68455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_ADJUST_BRIGHTNESS_FACTOR = "adjust_brightness_factor";
69455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_FULLBACKUP_DEFERRED = "fullbackup_deferred";
70455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private static final String KEY_KEYVALUE_DEFERRED = "keyvaluebackup_deferred";
719be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki    private static final String KEY_FORCE_ALL_APPS_STANDBY = "force_all_apps_standby";
72e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki    private static final String KEY_FORCE_BACKGROUND_CHECK = "force_background_check";
73aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki    private static final String KEY_OPTIONAL_SENSORS_DISABLED = "optional_sensors_disabled";
74455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
75ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki    private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i";
76ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki    private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n";
7766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
78a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private final Object mLock = new Object();
79a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki
80a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
81a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private String mSettings;
82a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki
83a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
84a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private String mDeviceSpecificSettings;
85a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki
86a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
87a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private String mDeviceSpecificSettingsSource; // For dump() only.
88455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
89455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
9085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki     * A short string describing which battery saver is now enabled, which we dump in the eventlog.
9185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki     */
9285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki    @GuardedBy("mLock")
9385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki    private String mEventLogKeys;
9485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
9585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki    /**
96455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if vibration is disabled in battery saver mode.
97455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
98455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
99455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_VIBRATION_DISABLED
100455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
101a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
102455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mVibrationDisabled;
103455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
104455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
105455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if animation is disabled in battery saver mode.
106455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
107455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
108455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_ANIMATION_DISABLED
109455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
110a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
111455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mAnimationDisabled;
112455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
113455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
114455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if sound trigger is disabled in battery saver mode
115455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * in battery saver mode.
116455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
117455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
118455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_SOUNDTRIGGER_DISABLED
119455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
120a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
121455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mSoundTriggerDisabled;
122455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
123455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
124455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if full backup is deferred in battery saver mode.
125455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
126455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
127455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_FULLBACKUP_DEFERRED
128455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
129a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
130455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mFullBackupDeferred;
131455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
132455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
133455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if key value backup is deferred in battery saver mode.
134455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
135455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
136455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_KEYVALUE_DEFERRED
137455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
138a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
139455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mKeyValueBackupDeferred;
140455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
141455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
142455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if network policy firewall is disabled in battery saver mode.
143455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
144455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
145455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_FIREWALL_DISABLED
146455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
147a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
148455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mFireWallDisabled;
149455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
150455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
151455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * {@code true} if adjust brightness is disabled in battery saver mode.
152455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
153455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
154455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_ADJUST_BRIGHTNESS_DISABLED
155455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
156a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
157455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private boolean mAdjustBrightnessDisabled;
158455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
159455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
16029c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei     * {@code true} if data saver is disabled in battery saver mode.
16129c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei     *
16229c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
16329c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei     * @see #KEY_DATASAVER_DISABLED
16429c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei     */
165a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
16629c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei    private boolean mDataSaverDisabled;
16729c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei
16829c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei    /**
169a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki     * {@code true} if launch boost should be disabled on battery saver.
170a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki     */
171a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
172a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    private boolean mLaunchBoostDisabled;
173a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki
174a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    /**
175455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * This is the flag to decide the gps mode in battery saver mode.
176455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
177455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
178455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_GPS_MODE
179455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
180a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
181455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private int mGpsMode;
182455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
183455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
184455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * This is the flag to decide the how much to adjust the screen brightness. This is
185455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * the float value from 0 to 1 where 1 means don't change brightness.
186455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
187455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see Settings.Global#BATTERY_SAVER_CONSTANTS
188455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @see #KEY_ADJUST_BRIGHTNESS_FACTOR
189455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
190a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
191455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private float mAdjustBrightnessFactor;
192455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
193aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki    /**
1949be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki     * Whether to put all apps in the stand-by mode.
195aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki     */
196a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
1979be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki    private boolean mForceAllAppsStandby;
198aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki
199aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki    /**
200e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki     * Whether to put all apps in the stand-by mode.
201e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki     */
202e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki    @GuardedBy("mLock")
203e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki    private boolean mForceBackgroundCheck;
204e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki
205e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki    /**
206aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki     * Weather to show non-essential sensors (e.g. edge sensors) or not.
207aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki     */
208a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    @GuardedBy("mLock")
209aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki    private boolean mOptionalSensorsDisabled;
210aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki
21166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @GuardedBy("mLock")
21266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    private Context mContext;
21366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
21466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @GuardedBy("mLock")
215455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    private ContentResolver mContentResolver;
216455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
21766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @GuardedBy("mLock")
2183aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki    private final List<BatterySaverPolicyListener> mListeners = new ArrayList<>();
21966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
22066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    /**
22166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     * List of [Filename -> content] that should be written when battery saver is activated
2223aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki     * and the device is interactive.
22366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     *
22466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     * We use this to change the max CPU frequencies.
22566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     */
22666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @GuardedBy("mLock")
2273aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki    private ArrayMap<String, String> mFilesForInteractive;
22866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
22966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    /**
23066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     * List of [Filename -> content] that should be written when battery saver is activated
2313aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki     * and the device is non-interactive.
23266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     *
23366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     * We use this to change the max CPU frequencies.
23466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki     */
23566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @GuardedBy("mLock")
2363aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki    private ArrayMap<String, String> mFilesForNoninteractive;
23766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
23866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    public interface BatterySaverPolicyListener {
23966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        void onBatterySaverPolicyChanged(BatterySaverPolicy policy);
24066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
24166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
242455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public BatterySaverPolicy(Handler handler) {
243455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        super(handler);
244455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
245455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
24666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    public void systemReady(Context context) {
24766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
24866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mContext = context;
24966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mContentResolver = context.getContentResolver();
25066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
25166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mContentResolver.registerContentObserver(Settings.Global.getUriFor(
25266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                    Settings.Global.BATTERY_SAVER_CONSTANTS), false, this);
25366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mContentResolver.registerContentObserver(Settings.Global.getUriFor(
25466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                    Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS), false, this);
25566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
25666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        onChange(true, null);
25766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
25866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
25966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    public void addListener(BatterySaverPolicyListener listener) {
26066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
26166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mListeners.add(listener);
26266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
26366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
26466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
26566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @VisibleForTesting
26666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    String getGlobalSetting(String key) {
267a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        final ContentResolver cr;
268a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        synchronized (mLock) {
269a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki            cr = mContentResolver;
270a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        }
271a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        return Settings.Global.getString(cr, key);
27266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
27366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
27466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    @VisibleForTesting
27566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    int getDeviceSpecificConfigResId() {
27666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        return R.string.config_batterySaverDeviceSpecificConfig;
27766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
278455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
279455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
280455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onChange(boolean selfChange, Uri uri) {
28166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        final BatterySaverPolicyListener[] listeners;
28266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
28366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            // Load the non-device-specific setting.
28466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            final String setting = getGlobalSetting(Settings.Global.BATTERY_SAVER_CONSTANTS);
28566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
28666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            // Load the device specific setting.
28766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            // We first check the global setting, and if it's empty or the string "null" is set,
28866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            // use the default value from config.xml.
28966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            String deviceSpecificSetting = getGlobalSetting(
29066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                    Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS);
29166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            mDeviceSpecificSettingsSource =
29266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                    Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS;
29366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
29466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            if (TextUtils.isEmpty(deviceSpecificSetting) || "null".equals(deviceSpecificSetting)) {
29566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                deviceSpecificSetting =
29666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                        mContext.getString(getDeviceSpecificConfigResId());
29766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                mDeviceSpecificSettingsSource = "(overlay)";
29866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            }
29966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
30066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            // Update.
30166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            updateConstantsLocked(setting, deviceSpecificSetting);
30266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
30366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            listeners = mListeners.toArray(new BatterySaverPolicyListener[mListeners.size()]);
30466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
30566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
30666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        // Notify the listeners.
30766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        for (BatterySaverPolicyListener listener : listeners) {
30866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            listener.onBatterySaverPolicyChanged(this);
30966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
310455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
311455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
312455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @VisibleForTesting
31366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    void updateConstantsLocked(final String setting, final String deviceSpecificSetting) {
31466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mSettings = setting;
31566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mDeviceSpecificSettings = deviceSpecificSetting;
31666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
317ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki        if (DEBUG) {
318ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            Slog.i(TAG, "mSettings=" + mSettings);
319ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            Slog.i(TAG, "mDeviceSpecificSettings=" + mDeviceSpecificSettings);
320ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki        }
321ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki
32266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        final KeyValueListParser parser = new KeyValueListParser(',');
32366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
32466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        // Non-device-specific parameters.
32566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        try {
32666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            parser.setString(setting);
32766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        } catch (IllegalArgumentException e) {
32866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            Slog.wtf(TAG, "Bad battery saver constants: " + setting);
32966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
33066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
33166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mVibrationDisabled = parser.getBoolean(KEY_VIBRATION_DISABLED, true);
33266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mAnimationDisabled = parser.getBoolean(KEY_ANIMATION_DISABLED, true);
33366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mSoundTriggerDisabled = parser.getBoolean(KEY_SOUNDTRIGGER_DISABLED, true);
33466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mFullBackupDeferred = parser.getBoolean(KEY_FULLBACKUP_DEFERRED, true);
33566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mKeyValueBackupDeferred = parser.getBoolean(KEY_KEYVALUE_DEFERRED, true);
33666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mFireWallDisabled = parser.getBoolean(KEY_FIREWALL_DISABLED, false);
33766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mAdjustBrightnessDisabled = parser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED, false);
33866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mAdjustBrightnessFactor = parser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR, 0.5f);
33966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mDataSaverDisabled = parser.getBoolean(KEY_DATASAVER_DISABLED, true);
340a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        mLaunchBoostDisabled = parser.getBoolean(KEY_LAUNCH_BOOST_DISABLED, true);
3419be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki        mForceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY, true);
342e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki        mForceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK, true);
34366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mOptionalSensorsDisabled = parser.getBoolean(KEY_OPTIONAL_SENSORS_DISABLED, true);
34466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
34566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        // Get default value from Settings.Secure
34666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        final int defaultGpsMode = Settings.Secure.getInt(mContentResolver, SECURE_KEY_GPS_MODE,
34766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                GPS_MODE_NO_CHANGE);
34866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        mGpsMode = parser.getInt(KEY_GPS_MODE, defaultGpsMode);
34966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
35066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        // Non-device-specific parameters.
35166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        try {
35266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            parser.setString(deviceSpecificSetting);
35366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        } catch (IllegalArgumentException e) {
35466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            Slog.wtf(TAG, "Bad device specific battery saver constants: "
35566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki                    + deviceSpecificSetting);
35666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
35766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
358ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki        mFilesForInteractive = (new CpuFrequencies()).parseString(
359ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki                parser.getString(KEY_CPU_FREQ_INTERACTIVE, "")).toSysFileMap();
36066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
361ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki        mFilesForNoninteractive = (new CpuFrequencies()).parseString(
362ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki                parser.getString(KEY_CPU_FREQ_NONINTERACTIVE, "")).toSysFileMap();
36385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
36485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        final StringBuilder sb = new StringBuilder();
36585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
36685dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mForceAllAppsStandby) sb.append("A");
36785dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mForceBackgroundCheck) sb.append("B");
36885dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
36985dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mVibrationDisabled) sb.append("v");
37085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mAnimationDisabled) sb.append("a");
37185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mSoundTriggerDisabled) sb.append("s");
37285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mFullBackupDeferred) sb.append("F");
37385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mKeyValueBackupDeferred) sb.append("K");
37485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (!mFireWallDisabled) sb.append("f");
37585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (!mDataSaverDisabled) sb.append("d");
37685dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (!mAdjustBrightnessDisabled) sb.append("b");
37785dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
37885dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mLaunchBoostDisabled) sb.append("l");
37985dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        if (mOptionalSensorsDisabled) sb.append("S");
38085dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
38185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        sb.append(mGpsMode);
38285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
38385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        mEventLogKeys = sb.toString();
384455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
385455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
386455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    /**
387455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * Get the {@link PowerSaveState} based on {@paramref type} and {@paramref realMode}.
388455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * The result will have {@link PowerSaveState#batterySaverEnabled} and some other
389455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * parameters when necessary.
390455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     *
391455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @param type     type of the service, one of {@link ServiceType}
392455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @param realMode whether the battery saver is on by default
393455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     * @return State data that contains battery saver data
394455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei     */
395455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public PowerSaveState getBatterySaverPolicy(@ServiceType int type, boolean realMode) {
39666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
39729c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei            final PowerSaveState.Builder builder = new PowerSaveState.Builder()
39829c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei                    .setGlobalBatterySaverEnabled(realMode);
399455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei            if (!realMode) {
400455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                return builder.setBatterySaverEnabled(realMode)
401455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                        .build();
402455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei            }
403455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei            switch (type) {
404455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.GPS:
405455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(realMode)
406455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .setGpsMode(mGpsMode)
407455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
408455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.ANIMATION:
409455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(mAnimationDisabled)
410455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
411455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.FULL_BACKUP:
412455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(mFullBackupDeferred)
413455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
414455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.KEYVALUE_BACKUP:
415455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(mKeyValueBackupDeferred)
416455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
417455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.NETWORK_FIREWALL:
418455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(!mFireWallDisabled)
419455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
420455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.SCREEN_BRIGHTNESS:
421455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(!mAdjustBrightnessDisabled)
422455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .setBrightnessFactor(mAdjustBrightnessFactor)
423455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
42429c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei                case ServiceType.DATA_SAVER:
42529c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei                    return builder.setBatterySaverEnabled(!mDataSaverDisabled)
42629c82ab242d50000d22e593c27153751c8c6b44ajackqdyulei                            .build();
427455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.SOUND:
428455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(mSoundTriggerDisabled)
429455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
430455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                case ServiceType.VIBRATION:
431455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(mVibrationDisabled)
432455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
433e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                case ServiceType.FORCE_ALL_APPS_STANDBY:
434e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                    return builder.setBatterySaverEnabled(mForceAllAppsStandby)
435e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                            .build();
436e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                case ServiceType.FORCE_BACKGROUND_CHECK:
437e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                    return builder.setBatterySaverEnabled(mForceBackgroundCheck)
438e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki                            .build();
439aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki                case ServiceType.OPTIONAL_SENSORS:
440aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki                    return builder.setBatterySaverEnabled(mOptionalSensorsDisabled)
441aae89531c0e8fce575d97fc887cd1fbd3055de19Makoto Onuki                            .build();
442455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                default:
443455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                    return builder.setBatterySaverEnabled(realMode)
444455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                            .build();
445455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei            }
446455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        }
447455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
448455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
4493aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki    public ArrayMap<String, String> getFileValues(boolean interactive) {
45066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
4513aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki            return interactive ? mFilesForInteractive : mFilesForNoninteractive;
45266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
45366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
45466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
455a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    public boolean isLaunchBoostDisabled() {
456a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        synchronized (mLock) {
457a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki            return mLaunchBoostDisabled;
458a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki        }
459a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki    }
460a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki
46185dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki    public String toEventLogString() {
46285dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        synchronized (mLock) {
46385dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki            return mEventLogKeys;
46485dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki        }
46585dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki    }
46685dd0852fe506bcf800bea99aeb7af401e1485c4Makoto Onuki
467455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void dump(PrintWriter pw) {
46866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        synchronized (mLock) {
46966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println();
47066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("Battery saver policy");
471ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            pw.println("  Settings: " + Settings.Global.BATTERY_SAVER_CONSTANTS);
472ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            pw.println("    value: " + mSettings);
473ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            pw.println("  Settings: " + mDeviceSpecificSettingsSource);
474ce643a309e8d414395ec36188523d10eb64d6618Makoto Onuki            pw.println("    value: " + mDeviceSpecificSettings);
47566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
47666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println();
47766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_VIBRATION_DISABLED + "=" + mVibrationDisabled);
47866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_ANIMATION_DISABLED + "=" + mAnimationDisabled);
47966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_FULLBACKUP_DEFERRED + "=" + mFullBackupDeferred);
48066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_KEYVALUE_DEFERRED + "=" + mKeyValueBackupDeferred);
48166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_FIREWALL_DISABLED + "=" + mFireWallDisabled);
48266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_DATASAVER_DISABLED + "=" + mDataSaverDisabled);
483a7d8c4d9ca619c2565aa7994305cdd8aa52fefc1Makoto Onuki            pw.println("  " + KEY_LAUNCH_BOOST_DISABLED + "=" + mLaunchBoostDisabled);
48466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_ADJUST_BRIGHTNESS_DISABLED + "=" + mAdjustBrightnessDisabled);
48566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_ADJUST_BRIGHTNESS_FACTOR + "=" + mAdjustBrightnessFactor);
48666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_GPS_MODE + "=" + mGpsMode);
4879be0140c1474dfd23d46121c51e636040a8080dfMakoto Onuki            pw.println("  " + KEY_FORCE_ALL_APPS_STANDBY + "=" + mForceAllAppsStandby);
488e7ec72a5dfff1d199de5a77b5818478c3e29d825Makoto Onuki            pw.println("  " + KEY_FORCE_BACKGROUND_CHECK + "=" + mForceBackgroundCheck);
48966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("  " + KEY_OPTIONAL_SENSORS_DISABLED + "=" + mOptionalSensorsDisabled);
49066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println();
49166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
4923aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki            pw.print("  Interactive File values:\n");
4933aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki            dumpMap(pw, "    ", mFilesForInteractive);
49466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println();
49566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
4963aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki            pw.print("  Noninteractive File values:\n");
4973aaed2912be642d306fa223edcb58278b0e45795Makoto Onuki            dumpMap(pw, "    ", mFilesForNoninteractive);
49866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println();
49966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
50066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    }
50166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki
50266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki    private void dumpMap(PrintWriter pw, String prefix, ArrayMap<String, String> map) {
50366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        if (map == null) {
50466a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            return;
50566a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
50666a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        final int size = map.size();
50766a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        for (int i = 0; i < size; i++) {
50866a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.print(prefix);
50966a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.print(map.keyAt(i));
51066a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.print(": '");
51166a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.print(map.valueAt(i));
51266a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki            pw.println("'");
51366a7812bc90b5be7702fe5743d257fddcdb48201Makoto Onuki        }
514455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
515455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei}
516