From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: anupritaisno1 Date: Mon, 18 Oct 2021 01:35:40 +0300 Subject: [PATCH] automatically reboot device after timeout if set Signed-off-by: anupritaisno1 Change-Id: If891bfbcc144c9336ba013260bad2b7c7a59c054 --- core/java/android/provider/Settings.java | 8 +++++ data/etc/com.android.systemui.xml | 1 + packages/SystemUI/AndroidManifest.xml | 3 ++ .../keyguard/KeyguardViewMediator.java | 35 +++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 801c7d28fec2..c7abb8901cad 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -17237,6 +17237,14 @@ public final class Settings { public static final String REVIEW_PERMISSIONS_NOTIFICATION_STATE = "review_permissions_notification_state"; + + /** + * Whether to automatically reboot the device after a user defined timeout + * + * @hide + */ + public static final String SETTINGS_REBOOT_AFTER_TIMEOUT = "settings_reboot_after_timeout"; + /** * Settings migrated from Wear OS settings provider. * @hide diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index e0e13f59b706..9c8c1834f728 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -50,6 +50,7 @@ + diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 6475b6713717..2cc47823a109 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -329,6 +329,9 @@ + + + diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 813fa7db6588..e0f8208fb131 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -196,6 +196,8 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, private final static String TAG = "KeyguardViewMediator"; + private static final String DELAYED_REBOOT_ACTION = + "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_REBOOT"; private static final String DELAYED_KEYGUARD_ACTION = "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD"; private static final String DELAYED_LOCK_PROFILE_ACTION = @@ -334,6 +336,11 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, */ private int mDelayedProfileShowingSequence; + /** + * Same as {@link #mDelayedProfileShowingSequence}, but used for our reboot implementation + */ + private int mDelayedRebootSequence; + /** * If the user has disabled the keyguard, then requests to exit, this is * how we'll ultimately let them know whether it was successful. We use this @@ -1194,6 +1201,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, final IntentFilter delayedActionFilter = new IntentFilter(); delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION); delayedActionFilter.addAction(DELAYED_LOCK_PROFILE_ACTION); + delayedActionFilter.addAction(DELAYED_REBOOT_ACTION); delayedActionFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(mDelayedLockBroadcastReceiver, delayedActionFilter, SYSTEMUI_PERMISSION, null /* scheduler */, @@ -1540,6 +1548,18 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, } } + private void doRebootForOwnerAfterTimeoutIfEnabled(long rebootAfterTimeout) { + long when = SystemClock.elapsedRealtime() + rebootAfterTimeout; + Intent rebootIntent = new Intent(DELAYED_REBOOT_ACTION); + rebootIntent.putExtra("seq", mDelayedRebootSequence); + rebootIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + PendingIntent sender = PendingIntent.getBroadcast(mContext, + 0, rebootIntent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); + mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, sender); + if (DEBUG) Log.d(TAG, "setting alarm to reboot device, timeout = " + + String.valueOf(rebootAfterTimeout)); + } + private void doKeyguardForChildProfilesLocked() { UserManager um = UserManager.get(mContext); for (int profileId : um.getEnabledProfileIds(UserHandle.myUserId())) { @@ -1557,6 +1577,10 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, mDelayedProfileShowingSequence++; } + private void cancelDoRebootForOwnerAfterTimeoutIfEnabled() { + mDelayedRebootSequence++; + } + /** * It will let us know when the device is waking up. */ @@ -1917,6 +1941,10 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); showLocked(options); + final long rebootAfterTimeout = Settings.Global.getLong(mContext.getContentResolver(), Settings.Global.SETTINGS_REBOOT_AFTER_TIMEOUT, 0); + if (rebootAfterTimeout >= 1) { + doRebootForOwnerAfterTimeoutIfEnabled(rebootAfterTimeout); + } } private void lockProfile(int userId) { @@ -2101,6 +2129,12 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, } } } + } else if (DELAYED_REBOOT_ACTION.equals(intent.getAction())) { + final int sequence = intent.getIntExtra("seq", 0); + if (sequence == mDelayedRebootSequence) { + PowerManager pm = mContext.getSystemService(PowerManager.class); + pm.reboot(null); + } } } }; @@ -2688,6 +2722,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, mHideAnimationRun = false; adjustStatusBarLocked(); sendUserPresentBroadcast(); + cancelDoRebootForOwnerAfterTimeoutIfEnabled(); } private Configuration.Builder createInteractionJankMonitorConf(int cuj) {