summaryrefslogtreecommitdiff
path: root/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'service/java/com/android/server/deviceconfig/UnattendedRebootManager.java')
-rw-r--r--service/java/com/android/server/deviceconfig/UnattendedRebootManager.java43
1 files changed, 43 insertions, 0 deletions
diff --git a/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java b/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
index 34f4602..4b7159a 100644
--- a/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
+++ b/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
@@ -1,5 +1,6 @@
package com.android.server.deviceconfig;
+import static com.android.server.deviceconfig.Flags.enableChargerDependencyForReboot;
import static com.android.server.deviceconfig.Flags.enableCustomRebootTimeConfigurations;
import static com.android.server.deviceconfig.Flags.enableSimPinReplay;
@@ -17,12 +18,15 @@ import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.os.BatteryManager;
import android.os.PowerManager;
import android.os.RecoverySystem;
import android.os.SystemClock;
import android.util.Log;
import android.util.Pair;
+
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.deviceconfig.resources.R;
import java.io.IOException;
import java.time.Instant;
@@ -68,6 +72,17 @@ final class UnattendedRebootManager {
private final SimPinReplayManager mSimPinReplayManager;
+ private boolean mChargingReceiverRegistered;
+
+ private final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mChargingReceiverRegistered = false;
+ mContext.unregisterReceiver(mChargingReceiver);
+ tryRebootOrSchedule();
+ }
+ };
+
private static class InjectorImpl implements UnattendedRebootManagerInjector {
InjectorImpl() {
/*no op*/
@@ -129,6 +144,11 @@ final class UnattendedRebootManager {
return RecoverySystem.isPreparedForUnattendedUpdate(context);
}
+ @Override
+ public boolean requiresChargingForReboot(Context context) {
+ return context.getResources().getBoolean(R.bool.config_requireChargingForUnattendedReboot);
+ }
+
public void regularReboot(Context context) {
PowerManager powerManager = context.getSystemService(PowerManager.class);
powerManager.reboot(REBOOT_REASON);
@@ -292,6 +312,13 @@ final class UnattendedRebootManager {
scheduleReboot();
}
+ if (enableChargerDependencyForReboot()
+ && mInjector.requiresChargingForReboot(mContext)
+ && !isCharging(mContext)) {
+ triggerRebootOnCharging();
+ return;
+ }
+
// Proceed with RoR.
Log.v(TAG, "Rebooting device to apply device config flags.");
try {
@@ -326,6 +353,16 @@ final class UnattendedRebootManager {
}
}
+ private void triggerRebootOnCharging() {
+ if (!mChargingReceiverRegistered) {
+ mChargingReceiverRegistered = true;
+ mContext.registerReceiver(
+ mChargingReceiver,
+ new IntentFilter(BatteryManager.ACTION_CHARGING),
+ Context.RECEIVER_EXPORTED);
+ }
+ }
+
/** Returns true if the device has screen lock. */
private static boolean isDeviceSecure(Context context) {
KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
@@ -337,6 +374,12 @@ final class UnattendedRebootManager {
return keyguardManager.isDeviceSecure();
}
+ private static boolean isCharging(Context context) {
+ BatteryManager batteryManager =
+ (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
+ return batteryManager.isCharging();
+ }
+
private static boolean isNetworkConnected(Context context) {
final ConnectivityManager connectivityManager =
context.getSystemService(ConnectivityManager.class);