Adding Reset Demo Notification

RetailDemoMOdeService adds a notification which allows user to wipe
current session and start a fresh demo session.

Bug: 27280140
Change-Id: I59dd82d236287206a2ca747210b3423fdc62c185
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6c289dc..b2028a7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -481,6 +481,8 @@
     <protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_AVAILABLE" />
     <protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_UNAVAILABLE" />
 
+    <protected-broadcast android:name="com.android.server.am.ACTION_RESET_DEMO" />
+
     <!-- ====================================================================== -->
     <!--                          RUNTIME PERMISSIONS                           -->
     <!-- ====================================================================== -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 236940d..063be16 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4364,6 +4364,11 @@
     <!-- The representation of a time duration when negative. An example is -1:14. This can be used with a countdown timer for example.-->
     <string name="negative_duration">\u2212<xliff:g id="time" example="1:14">%1$s</xliff:g></string>
 
+    <!-- Title of notification to start a new demo session when device is in retail mode [CHAR LIMIT=NONE] -->
+    <string name="reset_retail_demo_mode_title">Restart Session</string>
+    <!-- Text of notification to start a new demo session when device is in retail mode [CHAR LIMIT=NONE] -->
+    <string name="reset_retail_demo_mode_text">Tap to start a new demo session</string>
+
     <!-- Title of notification shown when device has been forced to safe mode after a security compromise. -->
     <string name="audit_safemode_notification">Factory reset to use this device without restrictions</string>
     <!-- Description of notification shown when device has been forced to safe mode after a security compromise. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 115c49f..7bd6c9c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1888,6 +1888,8 @@
   <java-symbol type="string" name="config_persistentDataPackageName" />
   <java-symbol type="string" name="audit_safemode_notification" />
   <java-symbol type="string" name="audit_safemode_notification_details" />
+  <java-symbol type="string" name="reset_retail_demo_mode_title" />
+  <java-symbol type="string" name="reset_retail_demo_mode_text" />
 
   <java-symbol type="layout" name="resolver_list" />
   <java-symbol type="id" name="resolver_list" />
diff --git a/services/core/java/com/android/server/am/RetailDemoModeService.java b/services/core/java/com/android/server/am/RetailDemoModeService.java
index 5929794..a1106f5 100644
--- a/services/core/java/com/android/server/am/RetailDemoModeService.java
+++ b/services/core/java/com/android/server/am/RetailDemoModeService.java
@@ -17,6 +17,9 @@
 package com.android.server.am;
 
 import android.app.ActivityManagerNative;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -36,6 +39,7 @@
 import android.util.Slog;
 
 import com.android.internal.os.BackgroundThread;
+import com.android.internal.R;
 import com.android.server.ServiceThread;
 import com.android.server.SystemService;
 import com.android.server.pm.UserManagerService;
@@ -47,15 +51,18 @@
 
     private static final String TAG = RetailDemoModeService.class.getSimpleName();
     private static final String DEMO_USER_NAME = "Demo";
+    private static final String ACTION_RESET_DEMO = "com.android.server.am.ACTION_RESET_DEMO";
 
     private static final long SCREEN_WAKEUP_DELAY = 5000;
 
     private ActivityManagerService mAms;
     private UserManagerService mUms;
+    private NotificationManager mNm;
     private PowerManager mPm;
     private PowerManager.WakeLock mWakeLock;
     private Handler mHandler;
     private ServiceThread mHandlerThread;
+    private PendingIntent mResetDemoPendingIntent;
 
     private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
@@ -75,6 +82,9 @@
                         }
                     }, SCREEN_WAKEUP_DELAY);
                     break;
+                case ACTION_RESET_DEMO:
+                    createAndSwitchToDemoUser();
+                    break;
             }
         }
     };
@@ -83,6 +93,26 @@
         super(context);
     }
 
+    private Notification createResetNotification() {
+        return new Notification.Builder(getContext())
+                .setContentTitle(getContext().getString(R.string.reset_retail_demo_mode_title))
+                .setContentText(getContext().getString(R.string.reset_retail_demo_mode_text))
+                .setOngoing(true)
+                .setSmallIcon(R.drawable.platlogo)
+                .setShowWhen(false)
+                .setVisibility(Notification.VISIBILITY_PUBLIC)
+                .setContentIntent(getResetDemoPendingIntent())
+                .build();
+    }
+
+    private PendingIntent getResetDemoPendingIntent() {
+        if (mResetDemoPendingIntent == null) {
+            Intent intent = new Intent(ACTION_RESET_DEMO);
+            mResetDemoPendingIntent = PendingIntent.getBroadcast(getContext(), 0, intent, 0);
+        }
+        return mResetDemoPendingIntent;
+    }
+
     private void createAndSwitchToDemoUser() {
         if (DEBUG) {
             Slog.d(TAG, "Switching to a new demo user");
@@ -162,7 +192,8 @@
     private void registerBroadcastReceiver() {
         final IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_SCREEN_OFF);
-        getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
+        filter.addAction(ACTION_RESET_DEMO);
+        getContext().registerReceiver(mBroadcastReceiver, filter);
     }
 
     @Override
@@ -184,6 +215,8 @@
         mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
         mWakeLock = mPm
                 .newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
+        mNm = NotificationManager.from(getContext());
+
         if (UserManager.isDeviceInDemoMode(getContext())) {
             createAndSwitchToDemoUser();
         }
@@ -208,5 +241,6 @@
         if (!mWakeLock.isHeld()) {
             mWakeLock.acquire();
         }
+        mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId));
     }
 }