summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-11-02 01:21:00 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-11-02 01:21:00 +0000
commitf88c3d9958f9cbd6d1b87283494c8586e19f4bc7 (patch)
tree6d3418358ccb495c3c3309074cf76969da4c824e
parentec83faf16866b522d79c8682856b4e88b528d829 (diff)
parent7f1820cb857a69547aa49c77c5c26176d6e5c8cc (diff)
downloadConfigInfrastructure-f88c3d9958f9cbd6d1b87283494c8586e19f4bc7.tar.gz
Snap for 11038355 from 7f1820cb857a69547aa49c77c5c26176d6e5c8cc to 24Q1-release
Change-Id: Ib931c0be0058dd7dfc0346998ef61e6b447a7e8d
-rw-r--r--service/java/com/android/server/deviceconfig/UnattendedRebootManager.java21
-rw-r--r--service/java/com/android/server/deviceconfig/UnattendedRebootManagerInjector.java2
-rw-r--r--service/javatests/src/com/android/server/deviceconfig/UnattendedRebootManagerTest.java42
3 files changed, 62 insertions, 3 deletions
diff --git a/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java b/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
index e6ccf9f..8429d0a 100644
--- a/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
+++ b/service/java/com/android/server/deviceconfig/UnattendedRebootManager.java
@@ -16,12 +16,14 @@ import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.PowerManager;
import android.os.RecoverySystem;
+import android.os.SystemClock;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
+import java.util.concurrent.TimeUnit;
/**
* Reboot scheduler for applying aconfig flags.
@@ -68,6 +70,11 @@ final class UnattendedRebootManager {
return ZoneId.systemDefault();
}
+ @Override
+ public long elapsedRealtime() {
+ return SystemClock.elapsedRealtime();
+ }
+
public int getRebootStartTime() {
return DEFAULT_REBOOT_WINDOW_START_TIME_HOUR;
}
@@ -201,6 +208,17 @@ final class UnattendedRebootManager {
void tryRebootOrSchedule() {
Log.v(TAG, "Attempting unattended reboot");
+ // Has enough time passed since reboot?
+ if (TimeUnit.MILLISECONDS.toDays(mInjector.elapsedRealtime())
+ < mInjector.getRebootFrequency()) {
+ Log.v(
+ TAG,
+ "Device has already been rebooted in that last"
+ + mInjector.getRebootFrequency()
+ + " days.");
+ scheduleReboot();
+ return;
+ }
// Is RoR is supported?
if (!isDeviceSecure(mContext)) {
Log.v(TAG, "Device is not secure. Proceed with regular reboot");
@@ -228,7 +246,7 @@ final class UnattendedRebootManager {
.toLocalDateTime()
.getHour();
if (currentHour < mInjector.getRebootStartTime()
- && currentHour >= mInjector.getRebootEndTime()) {
+ || currentHour >= mInjector.getRebootEndTime()) {
Log.v(TAG, "Reboot requested outside of reboot window, reschedule.");
prepareUnattendedReboot();
scheduleReboot();
@@ -236,6 +254,7 @@ final class UnattendedRebootManager {
}
// Proceed with RoR.
+ Log.v(TAG, "Rebooting device...");
try {
int success = mInjector.rebootAndApply(mContext, REBOOT_REASON, /* slotSwitch= */ false);
if (success != 0) {
diff --git a/service/java/com/android/server/deviceconfig/UnattendedRebootManagerInjector.java b/service/java/com/android/server/deviceconfig/UnattendedRebootManagerInjector.java
index e1e0909..5ca3e1e 100644
--- a/service/java/com/android/server/deviceconfig/UnattendedRebootManagerInjector.java
+++ b/service/java/com/android/server/deviceconfig/UnattendedRebootManagerInjector.java
@@ -20,6 +20,8 @@ interface UnattendedRebootManagerInjector {
ZoneId zoneId();
+ long elapsedRealtime();
+
/** Reboot time injectors. */
int getRebootStartTime();
diff --git a/service/javatests/src/com/android/server/deviceconfig/UnattendedRebootManagerTest.java b/service/javatests/src/com/android/server/deviceconfig/UnattendedRebootManagerTest.java
index 20494e5..7d822b6 100644
--- a/service/javatests/src/com/android/server/deviceconfig/UnattendedRebootManagerTest.java
+++ b/service/javatests/src/com/android/server/deviceconfig/UnattendedRebootManagerTest.java
@@ -43,7 +43,10 @@ public class UnattendedRebootManagerTest {
private static final long CURRENT_TIME = 1696452549304L; // 2023-10-04T13:49:09.304
private static final long REBOOT_TIME = 1696496400000L; // 2023-10-05T02:00:00
private static final long RESCHEDULED_REBOOT_TIME = 1696582800000L; // 2023-10-06T02:00:00
- private static final long OUTSIDE_WINDOW_REBOOT_TIME = 1696583400000L; // 2023-10-06T03:10:00
+ private static final long OUTSIDE_WINDOW_REBOOT_TIME = 1696587000000L; // 2023-10-06T03:10:00
+ private static final long RESCHEDULED_OUTSIDE_WINDOW_REBOOT_TIME =
+ 1696669200000L; // 2023-10-07T02:00:00
+ private static final long ELAPSED_REALTIME_1_DAY = 86400000L;
private Context mContext;
private KeyguardManager mKeyguardManager;
@@ -83,6 +86,8 @@ public class UnattendedRebootManagerTest {
},
new IntentFilter(ACTION_TRIGGER_REBOOT),
Context.RECEIVER_EXPORTED);
+
+ mFakeInjector.setElapsedRealtime(ELAPSED_REALTIME_1_DAY);
}
@Test
@@ -176,6 +181,26 @@ public class UnattendedRebootManagerTest {
}
@Test
+ public void scheduleReboot_elapsedRealtimeLessThanFrequency() {
+ Log.i(TAG, "scheduleReboot_elapsedRealtimeLessThanFrequency");
+ when(mKeyguardManager.isDeviceSecure()).thenReturn(true);
+ when(mConnectivityManager.getNetworkCapabilities(any()))
+ .thenReturn(
+ new NetworkCapabilities.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
+ .build());
+ mFakeInjector.setElapsedRealtime(82800000); // 23 hours
+
+ mRebootManager.prepareUnattendedReboot();
+ mRebootManager.scheduleReboot();
+
+ assertFalse(mFakeInjector.isRebootAndApplied());
+ assertFalse(mFakeInjector.isRegularRebooted());
+ assertThat(mFakeInjector.getActualRebootTime()).isEqualTo(RESCHEDULED_REBOOT_TIME);
+ }
+
+ @Test
public void tryRebootOrSchedule_outsideRebootWindow() {
Log.i(TAG, "scheduleReboot_internetOutsideRebootWindow");
when(mKeyguardManager.isDeviceSecure()).thenReturn(true);
@@ -192,8 +217,10 @@ public class UnattendedRebootManagerTest {
// reboot window.
mRebootManager.tryRebootOrSchedule();
- assertFalse(mFakeInjector.isRebootAndApplied());
+ assertTrue(mFakeInjector.isRebootAndApplied());
assertFalse(mFakeInjector.isRegularRebooted());
+ assertThat(mFakeInjector.getActualRebootTime())
+ .isEqualTo(RESCHEDULED_OUTSIDE_WINDOW_REBOOT_TIME);
}
static class FakeInjector implements UnattendedRebootManagerInjector {
@@ -207,6 +234,8 @@ public class UnattendedRebootManagerTest {
private long nowMillis;
+ private long elapsedRealtimeMillis;
+
FakeInjector() {
nowMillis = CURRENT_TIME;
}
@@ -292,6 +321,15 @@ public class UnattendedRebootManagerTest {
}
@Override
+ public long elapsedRealtime() {
+ return elapsedRealtimeMillis;
+ }
+
+ public void setElapsedRealtime(long elapsedRealtimeMillis) {
+ this.elapsedRealtimeMillis = elapsedRealtimeMillis;
+ }
+
+ @Override
public void regularReboot(Context context) {
regularRebooted = true;
}