diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6c289dc1f9049..b2028a702f39b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -481,6 +481,8 @@
+
+
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3a288222c7055..eef8fcf6e3e6f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4362,6 +4362,11 @@
\u2212%1$s
+
+ Restart Session
+
+ Tap to start a new demo session
+
Factory reset to use this device without restrictions
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0f20b5cb0b5aa..bd51258b4dbc2 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1888,6 +1888,8 @@
+
+
diff --git a/services/core/java/com/android/server/am/RetailDemoModeService.java b/services/core/java/com/android/server/am/RetailDemoModeService.java
index 5929794ad8fb9..a1106f50ebeb2 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.provider.Settings;
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 @@ public class RetailDemoModeService extends SystemService {
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 @@ public class RetailDemoModeService extends SystemService {
}
}, SCREEN_WAKEUP_DELAY);
break;
+ case ACTION_RESET_DEMO:
+ createAndSwitchToDemoUser();
+ break;
}
}
};
@@ -83,6 +93,26 @@ public class RetailDemoModeService extends SystemService {
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 @@ public class RetailDemoModeService extends SystemService {
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 @@ public class RetailDemoModeService extends SystemService {
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 @@ public class RetailDemoModeService extends SystemService {
if (!mWakeLock.isHeld()) {
mWakeLock.acquire();
}
+ mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId));
}
}