| /* | 
 |  * Copyright (C) 2019 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | package android.os; | 
 |  | 
 | import android.annotation.NonNull; | 
 | import android.annotation.SystemApi; | 
 | import android.text.TextUtils; | 
 | import android.util.ArrayMap; | 
 |  | 
 | import java.util.Collections; | 
 | import java.util.Map; | 
 | import java.util.Set; | 
 |  | 
 | /** | 
 |  * Config to set Battery Saver policy flags. | 
 |  * | 
 |  * @hide | 
 |  */ | 
 | @SystemApi | 
 | public final class BatterySaverPolicyConfig implements Parcelable { | 
 |     private final float mAdjustBrightnessFactor; | 
 |     private final boolean mAdvertiseIsEnabled; | 
 |     private final boolean mDeferFullBackup; | 
 |     private final boolean mDeferKeyValueBackup; | 
 |     @NonNull | 
 |     private final Map<String, String> mDeviceSpecificSettings; | 
 |     private final boolean mDisableAnimation; | 
 |     private final boolean mDisableAod; | 
 |     private final boolean mDisableLaunchBoost; | 
 |     private final boolean mDisableOptionalSensors; | 
 |     private final boolean mDisableSoundTrigger; | 
 |     private final boolean mDisableVibration; | 
 |     private final boolean mEnableAdjustBrightness; | 
 |     private final boolean mEnableDataSaver; | 
 |     private final boolean mEnableFirewall; | 
 |     private final boolean mEnableNightMode; | 
 |     private final boolean mEnableQuickDoze; | 
 |     private final boolean mForceAllAppsStandby; | 
 |     private final boolean mForceBackgroundCheck; | 
 |     private final int mLocationMode; | 
 |  | 
 |     private BatterySaverPolicyConfig(Builder in) { | 
 |         mAdjustBrightnessFactor = Math.max(0, Math.min(in.mAdjustBrightnessFactor, 1f)); | 
 |         mAdvertiseIsEnabled = in.mAdvertiseIsEnabled; | 
 |         mDeferFullBackup = in.mDeferFullBackup; | 
 |         mDeferKeyValueBackup = in.mDeferKeyValueBackup; | 
 |         mDeviceSpecificSettings = Collections.unmodifiableMap( | 
 |                 new ArrayMap<>(in.mDeviceSpecificSettings)); | 
 |         mDisableAnimation = in.mDisableAnimation; | 
 |         mDisableAod = in.mDisableAod; | 
 |         mDisableLaunchBoost = in.mDisableLaunchBoost; | 
 |         mDisableOptionalSensors = in.mDisableOptionalSensors; | 
 |         mDisableSoundTrigger = in.mDisableSoundTrigger; | 
 |         mDisableVibration = in.mDisableVibration; | 
 |         mEnableAdjustBrightness = in.mEnableAdjustBrightness; | 
 |         mEnableDataSaver = in.mEnableDataSaver; | 
 |         mEnableFirewall = in.mEnableFirewall; | 
 |         mEnableNightMode = in.mEnableNightMode; | 
 |         mEnableQuickDoze = in.mEnableQuickDoze; | 
 |         mForceAllAppsStandby = in.mForceAllAppsStandby; | 
 |         mForceBackgroundCheck = in.mForceBackgroundCheck; | 
 |         mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE, | 
 |                 Math.min(in.mLocationMode, PowerManager.MAX_LOCATION_MODE)); | 
 |     } | 
 |  | 
 |     private BatterySaverPolicyConfig(Parcel in) { | 
 |         mAdjustBrightnessFactor = Math.max(0, Math.min(in.readFloat(), 1f)); | 
 |         mAdvertiseIsEnabled = in.readBoolean(); | 
 |         mDeferFullBackup = in.readBoolean(); | 
 |         mDeferKeyValueBackup = in.readBoolean(); | 
 |  | 
 |         final int size = in.readInt(); | 
 |         Map<String, String> deviceSpecificSettings = new ArrayMap<>(size); | 
 |         for (int i = 0; i < size; ++i) { | 
 |             String key = TextUtils.emptyIfNull(in.readString()); | 
 |             String val = TextUtils.emptyIfNull(in.readString()); | 
 |             if (key.trim().isEmpty()) { | 
 |                 continue; | 
 |             } | 
 |             deviceSpecificSettings.put(key, val); | 
 |         } | 
 |         mDeviceSpecificSettings = Collections.unmodifiableMap(deviceSpecificSettings); | 
 |  | 
 |         mDisableAnimation = in.readBoolean(); | 
 |         mDisableAod = in.readBoolean(); | 
 |         mDisableLaunchBoost = in.readBoolean(); | 
 |         mDisableOptionalSensors = in.readBoolean(); | 
 |         mDisableSoundTrigger = in.readBoolean(); | 
 |         mDisableVibration = in.readBoolean(); | 
 |         mEnableAdjustBrightness = in.readBoolean(); | 
 |         mEnableDataSaver = in.readBoolean(); | 
 |         mEnableFirewall = in.readBoolean(); | 
 |         mEnableNightMode = in.readBoolean(); | 
 |         mEnableQuickDoze = in.readBoolean(); | 
 |         mForceAllAppsStandby = in.readBoolean(); | 
 |         mForceBackgroundCheck = in.readBoolean(); | 
 |         mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE, | 
 |                 Math.min(in.readInt(), PowerManager.MAX_LOCATION_MODE)); | 
 |     } | 
 |  | 
 |     public static final @android.annotation.NonNull Creator<BatterySaverPolicyConfig> CREATOR = | 
 |             new Creator<BatterySaverPolicyConfig>() { | 
 |                 @Override | 
 |                 public BatterySaverPolicyConfig createFromParcel(Parcel in) { | 
 |                     return new BatterySaverPolicyConfig(in); | 
 |                 } | 
 |  | 
 |                 @Override | 
 |                 public BatterySaverPolicyConfig[] newArray(int size) { | 
 |                     return new BatterySaverPolicyConfig[size]; | 
 |                 } | 
 |             }; | 
 |  | 
 |     @Override | 
 |     public int describeContents() { | 
 |         return 0; | 
 |     } | 
 |  | 
 |     @Override | 
 |     public void writeToParcel(Parcel dest, int flags) { | 
 |         dest.writeFloat(mAdjustBrightnessFactor); | 
 |         dest.writeBoolean(mAdvertiseIsEnabled); | 
 |         dest.writeBoolean(mDeferFullBackup); | 
 |         dest.writeBoolean(mDeferKeyValueBackup); | 
 |  | 
 |         final Set<Map.Entry<String, String>> entries = mDeviceSpecificSettings.entrySet(); | 
 |         final int size = entries.size(); | 
 |         dest.writeInt(size); | 
 |         for (Map.Entry<String, String> entry : entries) { | 
 |             dest.writeString(entry.getKey()); | 
 |             dest.writeString(entry.getValue()); | 
 |         } | 
 |  | 
 |         dest.writeBoolean(mDisableAnimation); | 
 |         dest.writeBoolean(mDisableAod); | 
 |         dest.writeBoolean(mDisableLaunchBoost); | 
 |         dest.writeBoolean(mDisableOptionalSensors); | 
 |         dest.writeBoolean(mDisableSoundTrigger); | 
 |         dest.writeBoolean(mDisableVibration); | 
 |         dest.writeBoolean(mEnableAdjustBrightness); | 
 |         dest.writeBoolean(mEnableDataSaver); | 
 |         dest.writeBoolean(mEnableFirewall); | 
 |         dest.writeBoolean(mEnableNightMode); | 
 |         dest.writeBoolean(mEnableQuickDoze); | 
 |         dest.writeBoolean(mForceAllAppsStandby); | 
 |         dest.writeBoolean(mForceBackgroundCheck); | 
 |         dest.writeInt(mLocationMode); | 
 |     } | 
 |  | 
 |     @Override | 
 |     public String toString() { | 
 |         StringBuilder sb = new StringBuilder(); | 
 |         for (Map.Entry<String, String> entry : mDeviceSpecificSettings.entrySet()) { | 
 |             sb.append(entry.getKey()).append("=").append(entry.getValue()).append(","); | 
 |         } | 
 |         return "adjust_brightness_disabled=" + !mEnableAdjustBrightness + "," | 
 |                 + "adjust_brightness_factor=" + mAdjustBrightnessFactor + "," | 
 |                 + "advertise_is_enabled=" + mAdvertiseIsEnabled + "," | 
 |                 + "animation_disabled=" + mDisableAnimation + "," | 
 |                 + "aod_disabled=" + mDisableAod + "," | 
 |                 + "datasaver_disabled=" + !mEnableDataSaver + "," | 
 |                 + "enable_night_mode=" + mEnableNightMode + "," | 
 |                 + "firewall_disabled=" + !mEnableFirewall + "," | 
 |                 + "force_all_apps_standby=" + mForceAllAppsStandby + "," | 
 |                 + "force_background_check=" + mForceBackgroundCheck + "," | 
 |                 + "fullbackup_deferred=" + mDeferFullBackup + "," | 
 |                 + "gps_mode=" + mLocationMode + "," | 
 |                 + "keyvaluebackup_deferred=" + mDeferKeyValueBackup + "," | 
 |                 + "launch_boost_disabled=" + mDisableLaunchBoost + "," | 
 |                 + "optional_sensors_disabled=" + mDisableOptionalSensors + "," | 
 |                 + "quick_doze_enabled=" + mEnableQuickDoze + "," | 
 |                 + "soundtrigger_disabled=" + mDisableSoundTrigger + "," | 
 |                 + "vibration_disabled=" + mDisableVibration + "," | 
 |                 + sb.toString(); | 
 |     } | 
 |  | 
 |     /** | 
 |      * How much to adjust the screen brightness while in Battery Saver. This will have no effect | 
 |      * if {@link #getEnableAdjustBrightness()} is {@code false}. | 
 |      */ | 
 |     public float getAdjustBrightnessFactor() { | 
 |         return mAdjustBrightnessFactor; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Whether or not to tell the system (and other apps) that Battery Saver is currently enabled. | 
 |      */ | 
 |     public boolean getAdvertiseIsEnabled() { | 
 |         return mAdvertiseIsEnabled; | 
 |     } | 
 |  | 
 |     /** Whether or not to defer full backup while in Battery Saver. */ | 
 |     public boolean getDeferFullBackup() { | 
 |         return mDeferFullBackup; | 
 |     } | 
 |  | 
 |     /** Whether or not to defer key-value backup while in Battery Saver. */ | 
 |     public boolean getDeferKeyValueBackup() { | 
 |         return mDeferKeyValueBackup; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Returns the device-specific battery saver constants. | 
 |      */ | 
 |     @NonNull | 
 |     public Map<String, String> getDeviceSpecificSettings() { | 
 |         return mDeviceSpecificSettings; | 
 |     } | 
 |  | 
 |     /** Whether or not to disable animation while in Battery Saver. */ | 
 |     public boolean getDisableAnimation() { | 
 |         return mDisableAnimation; | 
 |     } | 
 |  | 
 |     /** Whether or not to disable Always On Display while in Battery Saver. */ | 
 |     public boolean getDisableAod() { | 
 |         return mDisableAod; | 
 |     } | 
 |  | 
 |     /** Whether or not to disable launch boost while in Battery Saver. */ | 
 |     public boolean getDisableLaunchBoost() { | 
 |         return mDisableLaunchBoost; | 
 |     } | 
 |  | 
 |     /** Whether or not to disable optional sensors while in Battery Saver. */ | 
 |     public boolean getDisableOptionalSensors() { | 
 |         return mDisableOptionalSensors; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Whether or not to disable {@link android.hardware.soundtrigger.SoundTrigger} | 
 |      * while in Battery Saver. | 
 |      */ | 
 |     public boolean getDisableSoundTrigger() { | 
 |         return mDisableSoundTrigger; | 
 |     } | 
 |  | 
 |     /** Whether or not to disable vibration while in Battery Saver. */ | 
 |     public boolean getDisableVibration() { | 
 |         return mDisableVibration; | 
 |     } | 
 |  | 
 |     /** Whether or not to enable brightness adjustment while in Battery Saver. */ | 
 |     public boolean getEnableAdjustBrightness() { | 
 |         return mEnableAdjustBrightness; | 
 |     } | 
 |  | 
 |     /** Whether or not to enable Data Saver while in Battery Saver. */ | 
 |     public boolean getEnableDataSaver() { | 
 |         return mEnableDataSaver; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Whether or not to enable network firewall rules to restrict background network use | 
 |      * while in Battery Saver. | 
 |      */ | 
 |     public boolean getEnableFirewall() { | 
 |         return mEnableFirewall; | 
 |     } | 
 |  | 
 |     /** Whether or not to enable night mode while in Battery Saver. */ | 
 |     public boolean getEnableNightMode() { | 
 |         return mEnableNightMode; | 
 |     } | 
 |  | 
 |     /** Whether or not to enable Quick Doze while in Battery Saver. */ | 
 |     public boolean getEnableQuickDoze() { | 
 |         return mEnableQuickDoze; | 
 |     } | 
 |  | 
 |     /** Whether or not to force all apps to standby mode while in Battery Saver. */ | 
 |     public boolean getForceAllAppsStandby() { | 
 |         return mForceAllAppsStandby; | 
 |     } | 
 |  | 
 |     /** | 
 |      * Whether or not to force background check (disallow background services and manifest | 
 |      * broadcast receivers) on all apps (not just apps targeting Android | 
 |      * {@link Build.VERSION_CODES#O} and above) | 
 |      * while in Battery Saver. | 
 |      */ | 
 |     public boolean getForceBackgroundCheck() { | 
 |         return mForceBackgroundCheck; | 
 |     } | 
 |  | 
 |     /** The location mode while in Battery Saver. */ | 
 |     public int getLocationMode() { | 
 |         return mLocationMode; | 
 |     } | 
 |  | 
 |     /** Builder class for constructing {@link BatterySaverPolicyConfig} objects. */ | 
 |     public static final class Builder { | 
 |         private float mAdjustBrightnessFactor = 1f; | 
 |         private boolean mAdvertiseIsEnabled = false; | 
 |         private boolean mDeferFullBackup = false; | 
 |         private boolean mDeferKeyValueBackup = false; | 
 |         @NonNull | 
 |         private final ArrayMap<String, String> mDeviceSpecificSettings = new ArrayMap<>(); | 
 |         private boolean mDisableAnimation = false; | 
 |         private boolean mDisableAod = false; | 
 |         private boolean mDisableLaunchBoost = false; | 
 |         private boolean mDisableOptionalSensors = false; | 
 |         private boolean mDisableSoundTrigger = false; | 
 |         private boolean mDisableVibration = false; | 
 |         private boolean mEnableAdjustBrightness = false; | 
 |         private boolean mEnableDataSaver = false; | 
 |         private boolean mEnableFirewall = false; | 
 |         private boolean mEnableNightMode = false; | 
 |         private boolean mEnableQuickDoze = false; | 
 |         private boolean mForceAllAppsStandby = false; | 
 |         private boolean mForceBackgroundCheck = false; | 
 |         private int mLocationMode = PowerManager.LOCATION_MODE_NO_CHANGE; | 
 |  | 
 |         public Builder() { | 
 |         } | 
 |  | 
 |         /** | 
 |          * Set how much to adjust the screen brightness while in Battery Saver. The value should | 
 |          * be in the [0, 1] range, where 1 will not change the brightness. This will have no | 
 |          * effect if {@link #setEnableAdjustBrightness(boolean)} is not called with {@code true}. | 
 |          */ | 
 |         @NonNull | 
 |         public Builder setAdjustBrightnessFactor(float adjustBrightnessFactor) { | 
 |             mAdjustBrightnessFactor = adjustBrightnessFactor; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Set whether or not to tell the system (and other apps) that Battery Saver is | 
 |          * currently enabled. | 
 |          */ | 
 |         @NonNull | 
 |         public Builder setAdvertiseIsEnabled(boolean advertiseIsEnabled) { | 
 |             mAdvertiseIsEnabled = advertiseIsEnabled; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to defer full backup while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDeferFullBackup(boolean deferFullBackup) { | 
 |             mDeferFullBackup = deferFullBackup; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to defer key-value backup while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDeferKeyValueBackup(boolean deferKeyValueBackup) { | 
 |             mDeferKeyValueBackup = deferKeyValueBackup; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Adds a key-value pair for device-specific battery saver constants. The supported keys | 
 |          * and values are the same as those in | 
 |          * {@link android.provider.Settings.Global#BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS}. | 
 |          * | 
 |          * @throws IllegalArgumentException if the provided key is invalid (empty, null, or all | 
 |          * whitespace) | 
 |          */ | 
 |         @NonNull | 
 |         public Builder addDeviceSpecificSetting(@NonNull String key, @NonNull String value) { | 
 |             if (key == null) { | 
 |                 throw new IllegalArgumentException("Key cannot be null"); | 
 |             } | 
 |             key = key.trim(); | 
 |             if (TextUtils.isEmpty(key)) { | 
 |                 throw new IllegalArgumentException("Key cannot be empty"); | 
 |             } | 
 |             mDeviceSpecificSettings.put(key, TextUtils.emptyIfNull(value)); | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to disable animation while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDisableAnimation(boolean disableAnimation) { | 
 |             mDisableAnimation = disableAnimation; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to disable Always On Display while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDisableAod(boolean disableAod) { | 
 |             mDisableAod = disableAod; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to disable launch boost while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDisableLaunchBoost(boolean disableLaunchBoost) { | 
 |             mDisableLaunchBoost = disableLaunchBoost; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to disable optional sensors while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDisableOptionalSensors(boolean disableOptionalSensors) { | 
 |             mDisableOptionalSensors = disableOptionalSensors; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Set whether or not to disable  {@link android.hardware.soundtrigger.SoundTrigger} | 
 |          * while in Battery Saver. | 
 |          */ | 
 |         @NonNull | 
 |         public Builder setDisableSoundTrigger(boolean disableSoundTrigger) { | 
 |             mDisableSoundTrigger = disableSoundTrigger; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to disable vibration while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setDisableVibration(boolean disableVibration) { | 
 |             mDisableVibration = disableVibration; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to enable brightness adjustment while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setEnableAdjustBrightness(boolean enableAdjustBrightness) { | 
 |             mEnableAdjustBrightness = enableAdjustBrightness; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to enable Data Saver while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setEnableDataSaver(boolean enableDataSaver) { | 
 |             mEnableDataSaver = enableDataSaver; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Set whether or not to enable network firewall rules to restrict background network use | 
 |          * while in Battery Saver. | 
 |          */ | 
 |         @NonNull | 
 |         public Builder setEnableFirewall(boolean enableFirewall) { | 
 |             mEnableFirewall = enableFirewall; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to enable night mode while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setEnableNightMode(boolean enableNightMode) { | 
 |             mEnableNightMode = enableNightMode; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to enable Quick Doze while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setEnableQuickDoze(boolean enableQuickDoze) { | 
 |             mEnableQuickDoze = enableQuickDoze; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set whether or not to force all apps to standby mode while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setForceAllAppsStandby(boolean forceAllAppsStandby) { | 
 |             mForceAllAppsStandby = forceAllAppsStandby; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Set whether or not to force background check (disallow background services and manifest | 
 |          * broadcast receivers) on all apps (not just apps targeting Android | 
 |          * {@link Build.VERSION_CODES#O} and above) | 
 |          * while in Battery Saver. | 
 |          */ | 
 |         @NonNull | 
 |         public Builder setForceBackgroundCheck(boolean forceBackgroundCheck) { | 
 |             mForceBackgroundCheck = forceBackgroundCheck; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** Set the location mode while in Battery Saver. */ | 
 |         @NonNull | 
 |         public Builder setLocationMode(@PowerManager.LocationPowerSaveMode int locationMode) { | 
 |             mLocationMode = locationMode; | 
 |             return this; | 
 |         } | 
 |  | 
 |         /** | 
 |          * Build a {@link BatterySaverPolicyConfig} object using the set parameters. This object | 
 |          * is immutable. | 
 |          */ | 
 |         @NonNull | 
 |         public BatterySaverPolicyConfig build() { | 
 |             return new BatterySaverPolicyConfig(this); | 
 |         } | 
 |     } | 
 | } |