1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import android.annotation.NonNull; 20 import android.annotation.SystemApi; 21 import android.text.TextUtils; 22 import android.util.ArrayMap; 23 24 import java.util.Collections; 25 import java.util.Map; 26 import java.util.Set; 27 28 /** 29 * Config to set Battery Saver policy flags. 30 * 31 * @hide 32 */ 33 @SystemApi 34 public final class BatterySaverPolicyConfig implements Parcelable { 35 private final float mAdjustBrightnessFactor; 36 private final boolean mAdvertiseIsEnabled; 37 private final boolean mDeferFullBackup; 38 private final boolean mDeferKeyValueBackup; 39 @NonNull 40 private final Map<String, String> mDeviceSpecificSettings; 41 private final boolean mDisableAnimation; 42 private final boolean mDisableAod; 43 private final boolean mDisableLaunchBoost; 44 private final boolean mDisableOptionalSensors; 45 private final boolean mDisableVibration; 46 private final boolean mEnableAdjustBrightness; 47 private final boolean mEnableDataSaver; 48 private final boolean mEnableFirewall; 49 private final boolean mEnableNightMode; 50 private final boolean mEnableQuickDoze; 51 private final boolean mForceAllAppsStandby; 52 private final boolean mForceBackgroundCheck; 53 private final int mLocationMode; 54 private final int mSoundTriggerMode; 55 BatterySaverPolicyConfig(Builder in)56 private BatterySaverPolicyConfig(Builder in) { 57 mAdjustBrightnessFactor = Math.max(0, Math.min(in.mAdjustBrightnessFactor, 1f)); 58 mAdvertiseIsEnabled = in.mAdvertiseIsEnabled; 59 mDeferFullBackup = in.mDeferFullBackup; 60 mDeferKeyValueBackup = in.mDeferKeyValueBackup; 61 mDeviceSpecificSettings = Collections.unmodifiableMap( 62 new ArrayMap<>(in.mDeviceSpecificSettings)); 63 mDisableAnimation = in.mDisableAnimation; 64 mDisableAod = in.mDisableAod; 65 mDisableLaunchBoost = in.mDisableLaunchBoost; 66 mDisableOptionalSensors = in.mDisableOptionalSensors; 67 mDisableVibration = in.mDisableVibration; 68 mEnableAdjustBrightness = in.mEnableAdjustBrightness; 69 mEnableDataSaver = in.mEnableDataSaver; 70 mEnableFirewall = in.mEnableFirewall; 71 mEnableNightMode = in.mEnableNightMode; 72 mEnableQuickDoze = in.mEnableQuickDoze; 73 mForceAllAppsStandby = in.mForceAllAppsStandby; 74 mForceBackgroundCheck = in.mForceBackgroundCheck; 75 mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE, 76 Math.min(in.mLocationMode, PowerManager.MAX_LOCATION_MODE)); 77 mSoundTriggerMode = Math.max(PowerManager.MIN_SOUND_TRIGGER_MODE, 78 Math.min(in.mSoundTriggerMode, PowerManager.MAX_SOUND_TRIGGER_MODE)); 79 } 80 BatterySaverPolicyConfig(Parcel in)81 private BatterySaverPolicyConfig(Parcel in) { 82 mAdjustBrightnessFactor = Math.max(0, Math.min(in.readFloat(), 1f)); 83 mAdvertiseIsEnabled = in.readBoolean(); 84 mDeferFullBackup = in.readBoolean(); 85 mDeferKeyValueBackup = in.readBoolean(); 86 87 final int size = in.readInt(); 88 Map<String, String> deviceSpecificSettings = new ArrayMap<>(size); 89 for (int i = 0; i < size; ++i) { 90 String key = TextUtils.emptyIfNull(in.readString()); 91 String val = TextUtils.emptyIfNull(in.readString()); 92 if (key.trim().isEmpty()) { 93 continue; 94 } 95 deviceSpecificSettings.put(key, val); 96 } 97 mDeviceSpecificSettings = Collections.unmodifiableMap(deviceSpecificSettings); 98 99 mDisableAnimation = in.readBoolean(); 100 mDisableAod = in.readBoolean(); 101 mDisableLaunchBoost = in.readBoolean(); 102 mDisableOptionalSensors = in.readBoolean(); 103 mDisableVibration = in.readBoolean(); 104 mEnableAdjustBrightness = in.readBoolean(); 105 mEnableDataSaver = in.readBoolean(); 106 mEnableFirewall = in.readBoolean(); 107 mEnableNightMode = in.readBoolean(); 108 mEnableQuickDoze = in.readBoolean(); 109 mForceAllAppsStandby = in.readBoolean(); 110 mForceBackgroundCheck = in.readBoolean(); 111 mLocationMode = Math.max(PowerManager.MIN_LOCATION_MODE, 112 Math.min(in.readInt(), PowerManager.MAX_LOCATION_MODE)); 113 mSoundTriggerMode = Math.max(PowerManager.MIN_SOUND_TRIGGER_MODE, 114 Math.min(in.readInt(), PowerManager.MAX_SOUND_TRIGGER_MODE)); 115 } 116 117 public static final @android.annotation.NonNull Creator<BatterySaverPolicyConfig> CREATOR = 118 new Creator<BatterySaverPolicyConfig>() { 119 @Override 120 public BatterySaverPolicyConfig createFromParcel(Parcel in) { 121 return new BatterySaverPolicyConfig(in); 122 } 123 124 @Override 125 public BatterySaverPolicyConfig[] newArray(int size) { 126 return new BatterySaverPolicyConfig[size]; 127 } 128 }; 129 130 @Override describeContents()131 public int describeContents() { 132 return 0; 133 } 134 135 @Override writeToParcel(Parcel dest, int flags)136 public void writeToParcel(Parcel dest, int flags) { 137 dest.writeFloat(mAdjustBrightnessFactor); 138 dest.writeBoolean(mAdvertiseIsEnabled); 139 dest.writeBoolean(mDeferFullBackup); 140 dest.writeBoolean(mDeferKeyValueBackup); 141 142 final Set<Map.Entry<String, String>> entries = mDeviceSpecificSettings.entrySet(); 143 final int size = entries.size(); 144 dest.writeInt(size); 145 for (Map.Entry<String, String> entry : entries) { 146 dest.writeString(entry.getKey()); 147 dest.writeString(entry.getValue()); 148 } 149 150 dest.writeBoolean(mDisableAnimation); 151 dest.writeBoolean(mDisableAod); 152 dest.writeBoolean(mDisableLaunchBoost); 153 dest.writeBoolean(mDisableOptionalSensors); 154 dest.writeBoolean(mDisableVibration); 155 dest.writeBoolean(mEnableAdjustBrightness); 156 dest.writeBoolean(mEnableDataSaver); 157 dest.writeBoolean(mEnableFirewall); 158 dest.writeBoolean(mEnableNightMode); 159 dest.writeBoolean(mEnableQuickDoze); 160 dest.writeBoolean(mForceAllAppsStandby); 161 dest.writeBoolean(mForceBackgroundCheck); 162 dest.writeInt(mLocationMode); 163 dest.writeInt(mSoundTriggerMode); 164 } 165 166 @NonNull 167 @Override toString()168 public String toString() { 169 StringBuilder sb = new StringBuilder(); 170 for (Map.Entry<String, String> entry : mDeviceSpecificSettings.entrySet()) { 171 sb.append(entry.getKey()).append("=").append(entry.getValue()).append(","); 172 } 173 return "adjust_brightness_disabled=" + !mEnableAdjustBrightness + "," 174 + "adjust_brightness_factor=" + mAdjustBrightnessFactor + "," 175 + "advertise_is_enabled=" + mAdvertiseIsEnabled + "," 176 + "animation_disabled=" + mDisableAnimation + "," 177 + "aod_disabled=" + mDisableAod + "," 178 + "datasaver_disabled=" + !mEnableDataSaver + "," 179 + "enable_night_mode=" + mEnableNightMode + "," 180 + "firewall_disabled=" + !mEnableFirewall + "," 181 + "force_all_apps_standby=" + mForceAllAppsStandby + "," 182 + "force_background_check=" + mForceBackgroundCheck + "," 183 + "fullbackup_deferred=" + mDeferFullBackup + "," 184 + "gps_mode=" + mLocationMode + "," 185 + "keyvaluebackup_deferred=" + mDeferKeyValueBackup + "," 186 + "launch_boost_disabled=" + mDisableLaunchBoost + "," 187 + "optional_sensors_disabled=" + mDisableOptionalSensors + "," 188 + "quick_doze_enabled=" + mEnableQuickDoze + "," 189 + "soundtrigger_mode=" + mSoundTriggerMode + "," 190 + "vibration_disabled=" + mDisableVibration + "," 191 + sb.toString(); 192 } 193 194 /** 195 * How much to adjust the screen brightness while in Battery Saver. This will have no effect 196 * if {@link #getEnableAdjustBrightness()} is {@code false}. 197 */ getAdjustBrightnessFactor()198 public float getAdjustBrightnessFactor() { 199 return mAdjustBrightnessFactor; 200 } 201 202 /** 203 * Whether or not to tell the system (and other apps) that Battery Saver is currently enabled. 204 */ getAdvertiseIsEnabled()205 public boolean getAdvertiseIsEnabled() { 206 return mAdvertiseIsEnabled; 207 } 208 209 /** Whether or not to defer full backup while in Battery Saver. */ getDeferFullBackup()210 public boolean getDeferFullBackup() { 211 return mDeferFullBackup; 212 } 213 214 /** Whether or not to defer key-value backup while in Battery Saver. */ getDeferKeyValueBackup()215 public boolean getDeferKeyValueBackup() { 216 return mDeferKeyValueBackup; 217 } 218 219 /** 220 * Returns the device-specific battery saver constants. 221 */ 222 @NonNull getDeviceSpecificSettings()223 public Map<String, String> getDeviceSpecificSettings() { 224 return mDeviceSpecificSettings; 225 } 226 227 /** Whether or not to disable animation while in Battery Saver. */ getDisableAnimation()228 public boolean getDisableAnimation() { 229 return mDisableAnimation; 230 } 231 232 /** Whether or not to disable Always On Display while in Battery Saver. */ getDisableAod()233 public boolean getDisableAod() { 234 return mDisableAod; 235 } 236 237 /** Whether or not to disable launch boost while in Battery Saver. */ getDisableLaunchBoost()238 public boolean getDisableLaunchBoost() { 239 return mDisableLaunchBoost; 240 } 241 242 /** Whether or not to disable optional sensors while in Battery Saver. */ getDisableOptionalSensors()243 public boolean getDisableOptionalSensors() { 244 return mDisableOptionalSensors; 245 } 246 247 /** 248 * Get the SoundTrigger mode while in Battery Saver. 249 */ 250 @PowerManager.SoundTriggerPowerSaveMode getSoundTriggerMode()251 public int getSoundTriggerMode() { 252 return mSoundTriggerMode; 253 } 254 255 /** 256 * Whether or not to disable {@link android.hardware.soundtrigger.SoundTrigger} 257 * while in Battery Saver. 258 * @deprecated Use {@link #getSoundTriggerMode()} instead. 259 */ 260 @Deprecated getDisableSoundTrigger()261 public boolean getDisableSoundTrigger() { 262 return mSoundTriggerMode == PowerManager.SOUND_TRIGGER_MODE_ALL_DISABLED; 263 } 264 265 /** Whether or not to disable vibration while in Battery Saver. */ getDisableVibration()266 public boolean getDisableVibration() { 267 return mDisableVibration; 268 } 269 270 /** Whether or not to enable brightness adjustment while in Battery Saver. */ getEnableAdjustBrightness()271 public boolean getEnableAdjustBrightness() { 272 return mEnableAdjustBrightness; 273 } 274 275 /** Whether or not to enable Data Saver while in Battery Saver. */ getEnableDataSaver()276 public boolean getEnableDataSaver() { 277 return mEnableDataSaver; 278 } 279 280 /** 281 * Whether or not to enable network firewall rules to restrict background network use 282 * while in Battery Saver. 283 */ getEnableFirewall()284 public boolean getEnableFirewall() { 285 return mEnableFirewall; 286 } 287 288 /** Whether or not to enable night mode while in Battery Saver. */ getEnableNightMode()289 public boolean getEnableNightMode() { 290 return mEnableNightMode; 291 } 292 293 /** Whether or not to enable Quick Doze while in Battery Saver. */ getEnableQuickDoze()294 public boolean getEnableQuickDoze() { 295 return mEnableQuickDoze; 296 } 297 298 /** Whether or not to force all apps to standby mode while in Battery Saver. */ getForceAllAppsStandby()299 public boolean getForceAllAppsStandby() { 300 return mForceAllAppsStandby; 301 } 302 303 /** 304 * Whether or not to force background check (disallow background services and manifest 305 * broadcast receivers) on all apps (not just apps targeting Android 306 * {@link Build.VERSION_CODES#O} and above) 307 * while in Battery Saver. 308 */ getForceBackgroundCheck()309 public boolean getForceBackgroundCheck() { 310 return mForceBackgroundCheck; 311 } 312 313 /** The location mode while in Battery Saver. */ getLocationMode()314 public int getLocationMode() { 315 return mLocationMode; 316 } 317 318 /** Builder class for constructing {@link BatterySaverPolicyConfig} objects. */ 319 public static final class Builder { 320 private float mAdjustBrightnessFactor = 1f; 321 private boolean mAdvertiseIsEnabled = false; 322 private boolean mDeferFullBackup = false; 323 private boolean mDeferKeyValueBackup = false; 324 @NonNull 325 private final ArrayMap<String, String> mDeviceSpecificSettings = new ArrayMap<>(); 326 private boolean mDisableAnimation = false; 327 private boolean mDisableAod = false; 328 private boolean mDisableLaunchBoost = false; 329 private boolean mDisableOptionalSensors = false; 330 private boolean mDisableVibration = false; 331 private boolean mEnableAdjustBrightness = false; 332 private boolean mEnableDataSaver = false; 333 private boolean mEnableFirewall = false; 334 private boolean mEnableNightMode = false; 335 private boolean mEnableQuickDoze = false; 336 private boolean mForceAllAppsStandby = false; 337 private boolean mForceBackgroundCheck = false; 338 private int mLocationMode = PowerManager.LOCATION_MODE_NO_CHANGE; 339 private int mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_ENABLED; 340 Builder()341 public Builder() { 342 } 343 344 /** 345 * Creates a Builder prepopulated with the values from the passed in 346 * {@link BatterySaverPolicyConfig}. 347 */ Builder(@onNull BatterySaverPolicyConfig batterySaverPolicyConfig)348 public Builder(@NonNull BatterySaverPolicyConfig batterySaverPolicyConfig) { 349 mAdjustBrightnessFactor = batterySaverPolicyConfig.getAdjustBrightnessFactor(); 350 mAdvertiseIsEnabled = batterySaverPolicyConfig.getAdvertiseIsEnabled(); 351 mDeferFullBackup = batterySaverPolicyConfig.getDeferFullBackup(); 352 mDeferKeyValueBackup = batterySaverPolicyConfig.getDeferKeyValueBackup(); 353 354 for (String key : 355 batterySaverPolicyConfig.getDeviceSpecificSettings().keySet()) { 356 mDeviceSpecificSettings.put(key, 357 batterySaverPolicyConfig.getDeviceSpecificSettings().get(key)); 358 } 359 360 mDisableAnimation = batterySaverPolicyConfig.getDisableAnimation(); 361 mDisableAod = batterySaverPolicyConfig.getDisableAod(); 362 mDisableLaunchBoost = batterySaverPolicyConfig.getDisableLaunchBoost(); 363 mDisableOptionalSensors = batterySaverPolicyConfig.getDisableOptionalSensors(); 364 mDisableVibration = batterySaverPolicyConfig.getDisableVibration(); 365 mEnableAdjustBrightness = batterySaverPolicyConfig.getEnableAdjustBrightness(); 366 mEnableDataSaver = batterySaverPolicyConfig.getEnableDataSaver(); 367 mEnableFirewall = batterySaverPolicyConfig.getEnableFirewall(); 368 mEnableNightMode = batterySaverPolicyConfig.getEnableNightMode(); 369 mEnableQuickDoze = batterySaverPolicyConfig.getEnableQuickDoze(); 370 mForceAllAppsStandby = batterySaverPolicyConfig.getForceAllAppsStandby(); 371 mForceBackgroundCheck = batterySaverPolicyConfig.getForceBackgroundCheck(); 372 mLocationMode = batterySaverPolicyConfig.getLocationMode(); 373 mSoundTriggerMode = batterySaverPolicyConfig.getSoundTriggerMode(); 374 } 375 376 /** 377 * Set how much to adjust the screen brightness while in Battery Saver. The value should 378 * be in the [0, 1] range, where 1 will not change the brightness. This will have no 379 * effect if {@link #setEnableAdjustBrightness(boolean)} is not called with {@code true}. 380 */ 381 @NonNull setAdjustBrightnessFactor(float adjustBrightnessFactor)382 public Builder setAdjustBrightnessFactor(float adjustBrightnessFactor) { 383 mAdjustBrightnessFactor = adjustBrightnessFactor; 384 return this; 385 } 386 387 /** 388 * Set whether or not to tell the system (and other apps) that Battery Saver is 389 * currently enabled. 390 */ 391 @NonNull setAdvertiseIsEnabled(boolean advertiseIsEnabled)392 public Builder setAdvertiseIsEnabled(boolean advertiseIsEnabled) { 393 mAdvertiseIsEnabled = advertiseIsEnabled; 394 return this; 395 } 396 397 /** Set whether or not to defer full backup while in Battery Saver. */ 398 @NonNull setDeferFullBackup(boolean deferFullBackup)399 public Builder setDeferFullBackup(boolean deferFullBackup) { 400 mDeferFullBackup = deferFullBackup; 401 return this; 402 } 403 404 /** Set whether or not to defer key-value backup while in Battery Saver. */ 405 @NonNull setDeferKeyValueBackup(boolean deferKeyValueBackup)406 public Builder setDeferKeyValueBackup(boolean deferKeyValueBackup) { 407 mDeferKeyValueBackup = deferKeyValueBackup; 408 return this; 409 } 410 411 /** 412 * Adds a key-value pair for device-specific battery saver constants. The supported keys 413 * and values are the same as those in 414 * {@link android.provider.Settings.Global#BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS}. 415 * 416 * @throws IllegalArgumentException if the provided key is invalid (empty, null, or all 417 * whitespace) 418 */ 419 @NonNull addDeviceSpecificSetting(@onNull String key, @NonNull String value)420 public Builder addDeviceSpecificSetting(@NonNull String key, @NonNull String value) { 421 if (key == null) { 422 throw new IllegalArgumentException("Key cannot be null"); 423 } 424 key = key.trim(); 425 if (TextUtils.isEmpty(key)) { 426 throw new IllegalArgumentException("Key cannot be empty"); 427 } 428 mDeviceSpecificSettings.put(key, TextUtils.emptyIfNull(value)); 429 return this; 430 } 431 432 /** Set whether or not to disable animation while in Battery Saver. */ 433 @NonNull setDisableAnimation(boolean disableAnimation)434 public Builder setDisableAnimation(boolean disableAnimation) { 435 mDisableAnimation = disableAnimation; 436 return this; 437 } 438 439 /** Set whether or not to disable Always On Display while in Battery Saver. */ 440 @NonNull setDisableAod(boolean disableAod)441 public Builder setDisableAod(boolean disableAod) { 442 mDisableAod = disableAod; 443 return this; 444 } 445 446 /** Set whether or not to disable launch boost while in Battery Saver. */ 447 @NonNull setDisableLaunchBoost(boolean disableLaunchBoost)448 public Builder setDisableLaunchBoost(boolean disableLaunchBoost) { 449 mDisableLaunchBoost = disableLaunchBoost; 450 return this; 451 } 452 453 /** Set whether or not to disable optional sensors while in Battery Saver. */ 454 @NonNull setDisableOptionalSensors(boolean disableOptionalSensors)455 public Builder setDisableOptionalSensors(boolean disableOptionalSensors) { 456 mDisableOptionalSensors = disableOptionalSensors; 457 return this; 458 } 459 460 /** 461 * Set whether or not to disable {@link android.hardware.soundtrigger.SoundTrigger} 462 * while in Battery Saver. 463 * @deprecated Use {@link #setSoundTriggerMode(int)} instead. 464 */ 465 @Deprecated 466 @NonNull setDisableSoundTrigger(boolean disableSoundTrigger)467 public Builder setDisableSoundTrigger(boolean disableSoundTrigger) { 468 if (disableSoundTrigger) { 469 mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_DISABLED; 470 } else { 471 mSoundTriggerMode = PowerManager.SOUND_TRIGGER_MODE_ALL_ENABLED; 472 } 473 return this; 474 } 475 476 /** 477 * Set the SoundTrigger mode while in Battery Saver. 478 */ 479 @NonNull setSoundTriggerMode( @owerManager.SoundTriggerPowerSaveMode int soundTriggerMode)480 public Builder setSoundTriggerMode( 481 @PowerManager.SoundTriggerPowerSaveMode int soundTriggerMode) { 482 mSoundTriggerMode = soundTriggerMode; 483 return this; 484 } 485 486 /** Set whether or not to disable vibration while in Battery Saver. */ 487 @NonNull setDisableVibration(boolean disableVibration)488 public Builder setDisableVibration(boolean disableVibration) { 489 mDisableVibration = disableVibration; 490 return this; 491 } 492 493 /** Set whether or not to enable brightness adjustment while in Battery Saver. */ 494 @NonNull setEnableAdjustBrightness(boolean enableAdjustBrightness)495 public Builder setEnableAdjustBrightness(boolean enableAdjustBrightness) { 496 mEnableAdjustBrightness = enableAdjustBrightness; 497 return this; 498 } 499 500 /** Set whether or not to enable Data Saver while in Battery Saver. */ 501 @NonNull setEnableDataSaver(boolean enableDataSaver)502 public Builder setEnableDataSaver(boolean enableDataSaver) { 503 mEnableDataSaver = enableDataSaver; 504 return this; 505 } 506 507 /** 508 * Set whether or not to enable network firewall rules to restrict background network use 509 * while in Battery Saver. 510 */ 511 @NonNull setEnableFirewall(boolean enableFirewall)512 public Builder setEnableFirewall(boolean enableFirewall) { 513 mEnableFirewall = enableFirewall; 514 return this; 515 } 516 517 /** Set whether or not to enable night mode while in Battery Saver. */ 518 @NonNull setEnableNightMode(boolean enableNightMode)519 public Builder setEnableNightMode(boolean enableNightMode) { 520 mEnableNightMode = enableNightMode; 521 return this; 522 } 523 524 /** Set whether or not to enable Quick Doze while in Battery Saver. */ 525 @NonNull setEnableQuickDoze(boolean enableQuickDoze)526 public Builder setEnableQuickDoze(boolean enableQuickDoze) { 527 mEnableQuickDoze = enableQuickDoze; 528 return this; 529 } 530 531 /** Set whether or not to force all apps to standby mode while in Battery Saver. */ 532 @NonNull setForceAllAppsStandby(boolean forceAllAppsStandby)533 public Builder setForceAllAppsStandby(boolean forceAllAppsStandby) { 534 mForceAllAppsStandby = forceAllAppsStandby; 535 return this; 536 } 537 538 /** 539 * Set whether or not to force background check (disallow background services and manifest 540 * broadcast receivers) on all apps (not just apps targeting Android 541 * {@link Build.VERSION_CODES#O} and above) 542 * while in Battery Saver. 543 */ 544 @NonNull setForceBackgroundCheck(boolean forceBackgroundCheck)545 public Builder setForceBackgroundCheck(boolean forceBackgroundCheck) { 546 mForceBackgroundCheck = forceBackgroundCheck; 547 return this; 548 } 549 550 /** Set the location mode while in Battery Saver. */ 551 @NonNull setLocationMode(@owerManager.LocationPowerSaveMode int locationMode)552 public Builder setLocationMode(@PowerManager.LocationPowerSaveMode int locationMode) { 553 mLocationMode = locationMode; 554 return this; 555 } 556 557 /** 558 * Build a {@link BatterySaverPolicyConfig} object using the set parameters. This object 559 * is immutable. 560 */ 561 @NonNull build()562 public BatterySaverPolicyConfig build() { 563 return new BatterySaverPolicyConfig(this); 564 } 565 } 566 } 567