From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: anupritaisno1 <www.anuprita804@gmail.com>
Date: Mon, 18 Oct 2021 04:05:40 +0530
Subject: [PATCH] automatically reboot device after timeout if set

Signed-off-by: anupritaisno1 <www.anuprita804@gmail.com>
Change-Id: If891bfbcc144c9336ba013260bad2b7c7a59c054
---
 core/java/android/provider/Settings.java      |  7 ++++
 data/etc/com.android.systemui.xml             |  1 +
 packages/SystemUI/AndroidManifest.xml         |  3 ++
 .../keyguard/KeyguardViewMediator.java        | 35 +++++++++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 1c5650b540f0..1f606fefeb36 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -16395,6 +16395,13 @@ public final class Settings {
          * @hide
          */
         public static final String RESTRICTED_NETWORKING_MODE = "restricted_networking_mode";
+
+        /**
+         * Whether to automatically reboot the device after a user defined timeout
+         *
+         * @hide
+         */
+        public static final String SETTINGS_REBOOT_AFTER_TIMEOUT = "settings_reboot_after_timeout";
     }
 
     /**
diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml
index f2a33de008d6..354fd82f3a0d 100644
--- a/data/etc/com.android.systemui.xml
+++ b/data/etc/com.android.systemui.xml
@@ -48,6 +48,7 @@
         <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
         <permission name="android.permission.REAL_GET_TASKS"/>
+        <permission name="android.permission.REBOOT"/>
         <permission name="android.permission.REQUEST_NETWORK_SCORES"/>
         <permission name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE"/>
         <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND" />
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index cdec5a47b240..3210af7bdebc 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -292,6 +292,9 @@
 
     <uses-permission android:name="android.permission.READ_PEOPLE_DATA" />
 
+    <!-- Permission to allow rebooting the device after a user configurable amount of time -->
+    <uses-permission android:name="android.permission.REBOOT" />
+
     <uses-permission android:name="lineageos.permission.WRITE_SETTINGS"/>
 
     <protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 7ef58f5522ee..c08ec6f770a4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -187,6 +187,8 @@ public class KeyguardViewMediator extends SystemUI 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 =
@@ -313,6 +315,11 @@ public class KeyguardViewMediator extends SystemUI 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
@@ -907,6 +914,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
         final IntentFilter delayedActionFilter = new IntentFilter();
         delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION);
         delayedActionFilter.addAction(DELAYED_LOCK_PROFILE_ACTION);
+        delayedActionFilter.addAction(DELAYED_REBOOT_ACTION);
         mContext.registerReceiver(mDelayedLockBroadcastReceiver, delayedActionFilter,
                 SYSTEMUI_PERMISSION, null /* scheduler */);
 
@@ -1208,6 +1216,18 @@ public class KeyguardViewMediator extends SystemUI 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())) {
@@ -1225,6 +1245,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
         mDelayedProfileShowingSequence++;
     }
 
+    private void cancelDoRebootForOwnerAfterTimeoutIfEnabled() {
+        mDelayedRebootSequence++;
+    }
+
     /**
      * Let's us know when the device is waking up.
      */
@@ -1590,6 +1614,10 @@ public class KeyguardViewMediator extends SystemUI 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) {
@@ -1786,6 +1814,12 @@ public class KeyguardViewMediator extends SystemUI 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);
+                }
             }
         }
     };
@@ -2360,6 +2394,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
         mHideAnimationRun = false;
         adjustStatusBarLocked();
         sendUserPresentBroadcast();
+        cancelDoRebootForOwnerAfterTimeoutIfEnabled();
     }
 
     private Configuration.Builder createInteractionJankMonitorConf(String tag) {
