Auto power off if stay in Welcome screen for more than 30 minutes

Issue: FP4-3639
Issue: FP4-INT#13
Change-Id: I4e6708867eabf5ba6d34d3d35fa7de7efafa805a
(cherry picked from commit c149ae4b97660b1b202ad69cc22aea69454313e8)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a0f9ab9..a8fcee5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3512,6 +3512,8 @@
             </intent-filter>
         </activity>
 
+        <service android:name=".ShutdownJobService"
+            android:permission="android.permission.BIND_JOB_SERVICE" />
 
     </application>
 </manifest>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 7a6e0aa..919105d 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -20,4 +20,5 @@
     <integer name="job_anomaly_config_update">101</integer>
     <integer name="job_anomaly_detection">102</integer>
     <integer name="device_index_update">103</integer>
+    <integer name="job_shut_down">104</integer>
 </resources>
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index 5157033..9305338 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -63,6 +63,7 @@
         managedProfileSetup(context, pm, broadcast, userInfo);
         webviewSettingSetup(context, pm, userInfo);
         refreshExistingShortcuts(context);
+        ShutdownJobService.startShutdownJob(context);
     }
 
     private void managedProfileSetup(Context context, final PackageManager pm, Intent broadcast,
diff --git a/src/com/android/settings/ShutdownJobService.java b/src/com/android/settings/ShutdownJobService.java
new file mode 100644
index 0000000..e8019f0
--- /dev/null
+++ b/src/com/android/settings/ShutdownJobService.java
@@ -0,0 +1,103 @@
+package com.android.settings;
+
+import static android.provider.Settings.Secure.USER_SETUP_COMPLETE;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings.Secure;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import com.android.internal.statusbar.IStatusBarService;
+
+/**
+ *
+ *
+ * <pre>
+ *     author : yingyubin
+ *     e-mail : yubin.ying@t2mobile.com
+ *     time   : 2022/04/14
+ *     desc   :
+ *     version: 1.0
+ * </pre>
+ */
+public class ShutdownJobService extends JobService {
+    private static final String TAG = ShutdownJobService.class.getSimpleName();
+
+    static final long SHUT_DOWN_MS = 30 * 60 * 1000;
+
+    public static void startShutdownJob(Context context) {
+        final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+
+        final ComponentName component = new ComponentName(context, ShutdownJobService.class);
+        final JobInfo.Builder jobBuilder =
+                new JobInfo.Builder(R.integer.job_shut_down, component)
+                        .setMinimumLatency(SHUT_DOWN_MS)
+                        .setOverrideDeadline(SHUT_DOWN_MS);
+        final JobInfo pending = jobScheduler.getPendingJob(R.integer.job_shut_down);
+
+        // Don't schedule it if it already exists, to make sure it runs periodically even after
+        // reboot
+        if (pending == null
+                && jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
+            Log.i(TAG, "Shutdown job service schedule failed.");
+        }
+    }
+
+    @Override
+    public boolean onStartJob(JobParameters jobParameters) {
+        if (!isUserSetupCompleted() && !isSimReady() && !isWifiConnected()) {
+            Log.d(
+                    TAG,
+                    "shutdown device as sim not ready ,wifi not connect, setup wizard not"
+                            + " complete");
+            shutdown();
+        }
+        Log.d(TAG, "ShutdownJobService finish");
+        return false;
+    }
+
+    @Override
+    public boolean onStopJob(JobParameters jobParameters) {
+        return false;
+    }
+
+    private void shutdown() {
+        IStatusBarService mBarService =
+                IStatusBarService.Stub.asInterface(
+                        ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+        try {
+            mBarService.shutdown();
+        } catch (RemoteException e) {
+        }
+    }
+
+    private boolean isWifiConnected() {
+        ConnectivityManager cm =
+                (ConnectivityManager)
+                        getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (cm == null) return false;
+        NetworkInfo ni = cm.getActiveNetworkInfo();
+        return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI;
+    }
+
+    private boolean isSimReady() {
+        TelephonyManager tm =
+                (TelephonyManager)
+                        getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
+        return tm.getSimState() == TelephonyManager.SIM_STATE_READY;
+    }
+
+    private boolean isUserSetupCompleted() {
+        return Secure.getInt(getApplicationContext().getContentResolver(), USER_SETUP_COMPLETE, 0)
+                != 0;
+    }
+}