Loading core/res/res/values/config.xml +8 −2 Original line number Original line Diff line number Diff line Loading @@ -2635,8 +2635,14 @@ <!-- Component that is the default launcher when demo mode is enabled. --> <!-- Component that is the default launcher when demo mode is enabled. --> <string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string> <string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string> <!-- Hashed password (SHA-256) used to restrict demo mode operation --> <!-- Hashed password (SHA-256) used to restrict carrier demo mode operation. --> <string name="config_demoModePassword" translatable="false"></string> <string name="config_carrierDemoModePassword" translatable="false"></string> <!-- Secure setting used to activate carrier demo mode. --> <string name="config_carrierDemoModeSetting" translatable="false"></string> <!-- List of packages to enable in carrier demo mode (comma separated). --> <string name="config_carrierDemoModePackages" translatable="false"></string> <!-- Flag indicating whether round icons should be parsed from the application manifest. --> <!-- Flag indicating whether round icons should be parsed from the application manifest. --> <bool name="config_useRoundIcon">false</bool> <bool name="config_useRoundIcon">false</bool> Loading core/res/res/values/symbols.xml +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1118,7 +1118,9 @@ <java-symbol type="string" name="config_ethernet_tcp_buffers" /> <java-symbol type="string" name="config_ethernet_tcp_buffers" /> <java-symbol type="string" name="config_wifi_tcp_buffers" /> <java-symbol type="string" name="config_wifi_tcp_buffers" /> <java-symbol type="string" name="config_demoModeLauncherComponent" /> <java-symbol type="string" name="config_demoModeLauncherComponent" /> <java-symbol type="string" name="config_demoModePassword" /> <java-symbol type="string" name="config_carrierDemoModePassword" /> <java-symbol type="string" name="config_carrierDemoModeSetting" /> <java-symbol type="string" name="config_carrierDemoModePackages" /> <java-symbol type="string" name="demo_starting_message" /> <java-symbol type="string" name="demo_starting_message" /> <java-symbol type="string" name="demo_restarting_message" /> <java-symbol type="string" name="demo_restarting_message" /> <java-symbol type="string" name="conference_call" /> <java-symbol type="string" name="conference_call" /> Loading services/core/java/com/android/server/pm/UserManagerService.java +0 −27 Original line number Original line Diff line number Diff line Loading @@ -33,12 +33,10 @@ import android.app.IStopUserCallback; import android.app.KeyguardManager; import android.app.KeyguardManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentFilter; import android.content.IntentSender; import android.content.IntentSender; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.content.pm.UserInfo; Loading Loading @@ -2916,8 +2914,6 @@ public class UserManagerService extends IUserManager.Stub { applyUserRestrictionsLR(userId); applyUserRestrictionsLR(userId); } } } } maybeInitializeDemoMode(userId); } } /** /** Loading Loading @@ -2950,29 +2946,6 @@ public class UserManagerService extends IUserManager.Stub { scheduleWriteUser(userData); scheduleWriteUser(userData); } } private void maybeInitializeDemoMode(int userId) { if (UserManager.isDeviceInDemoMode(mContext) && userId != UserHandle.USER_SYSTEM) { String demoLauncher = mContext.getResources().getString( com.android.internal.R.string.config_demoModeLauncherComponent); if (!TextUtils.isEmpty(demoLauncher)) { ComponentName componentToEnable = ComponentName.unflattenFromString(demoLauncher); String demoLauncherPkg = componentToEnable.getPackageName(); try { final IPackageManager iPm = AppGlobals.getPackageManager(); iPm.setComponentEnabledSetting(componentToEnable, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, /* userId= */ userId); iPm.setApplicationEnabledSetting(demoLauncherPkg, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, /* userId= */ userId, null); } catch (RemoteException re) { // Internal, shouldn't happen } } } } /** /** * Returns the next available user id, filling in any holes in the ids. * Returns the next available user id, filling in any holes in the ids. * TODO: May not be a good idea to recycle ids, in case it results in confusion * TODO: May not be a good idea to recycle ids, in case it results in confusion Loading services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java +127 −58 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.app.PendingIntent; import android.app.RetailDemoModeServiceInternal; import android.app.RetailDemoModeServiceInternal; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ComponentName; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentResolver; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; Loading Loading @@ -59,6 +58,7 @@ import android.os.UserManager; import android.provider.CallLog; import android.provider.CallLog; import android.provider.MediaStore; import android.provider.MediaStore; import android.provider.Settings; import android.provider.Settings; import android.text.TextUtils; import android.util.KeyValueListParser; import android.util.KeyValueListParser; import android.util.Slog; import android.util.Slog; import com.android.internal.os.BackgroundThread; import com.android.internal.os.BackgroundThread; Loading Loading @@ -103,7 +103,8 @@ public class RetailDemoModeService extends SystemService { private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; boolean mDeviceInDemoMode = false; boolean mDeviceInDemoMode; boolean mIsCarrierDemoMode; int mCurrentUserId = UserHandle.USER_SYSTEM; int mCurrentUserId = UserHandle.USER_SYSTEM; long mUserInactivityTimeout; long mUserInactivityTimeout; long mWarningDialogTimeout; long mWarningDialogTimeout; Loading Loading @@ -138,7 +139,8 @@ public class RetailDemoModeService extends SystemService { if (!mDeviceInDemoMode) { if (!mDeviceInDemoMode) { return; return; } } switch (intent.getAction()) { final String action = intent.getAction(); switch (action) { case Intent.ACTION_SCREEN_OFF: case Intent.ACTION_SCREEN_OFF: mHandler.removeMessages(MSG_TURN_SCREEN_ON); mHandler.removeMessages(MSG_TURN_SCREEN_ON); mHandler.sendEmptyMessageDelayed(MSG_TURN_SCREEN_ON, SCREEN_WAKEUP_DELAY); mHandler.sendEmptyMessageDelayed(MSG_TURN_SCREEN_ON, SCREEN_WAKEUP_DELAY); Loading Loading @@ -166,7 +168,7 @@ public class RetailDemoModeService extends SystemService { mWakeLock.acquire(); mWakeLock.acquire(); break; break; case MSG_INACTIVITY_TIME_OUT: case MSG_INACTIVITY_TIME_OUT: if (isDemoLauncherDisabled()) { if (!mIsCarrierDemoMode && isDemoLauncherDisabled()) { Slog.i(TAG, "User inactivity timeout reached"); Slog.i(TAG, "User inactivity timeout reached"); showInactivityCountdownDialog(); showInactivityCountdownDialog(); } } Loading @@ -177,12 +179,29 @@ public class RetailDemoModeService extends SystemService { } } removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_INACTIVITY_TIME_OUT); removeMessages(MSG_INACTIVITY_TIME_OUT); if (mCurrentUserId != UserHandle.USER_SYSTEM) { if (!mIsCarrierDemoMode && mCurrentUserId != UserHandle.USER_SYSTEM) { logSessionDuration(); logSessionDuration(); } } final UserInfo demoUser = getUserManager().createUser(DEMO_USER_NAME, UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); UserInfo demoUser = null; if (demoUser != null) { if (mIsCarrierDemoMode) { // Re-use the existing demo user in carrier demo mode. for (UserInfo user : getUserManager().getUsers()) { if (user.isDemo()) { demoUser = user; break; } } } if (demoUser == null) { // User in carrier demo mode should survive reboots. final int flags = UserInfo.FLAG_DEMO | (mIsCarrierDemoMode ? 0 : UserInfo.FLAG_EPHEMERAL); demoUser = getUserManager().createUser(DEMO_USER_NAME, flags); } if (demoUser != null && mCurrentUserId != demoUser.id) { setupDemoUser(demoUser); setupDemoUser(demoUser); getActivityManager().switchUser(demoUser.id); getActivityManager().switchUser(demoUser.id); } } Loading @@ -196,8 +215,6 @@ public class RetailDemoModeService extends SystemService { private final static String KEY_USER_INACTIVITY_TIMEOUT = "user_inactivity_timeout_ms"; private final static String KEY_USER_INACTIVITY_TIMEOUT = "user_inactivity_timeout_ms"; private final static String KEY_WARNING_DIALOG_TIMEOUT = "warning_dialog_timeout_ms"; private final static String KEY_WARNING_DIALOG_TIMEOUT = "warning_dialog_timeout_ms"; private final Uri mDeviceDemoModeUri = Settings.Global .getUriFor(Settings.Global.DEVICE_DEMO_MODE); private final Uri mDeviceProvisionedUri = Settings.Global private final Uri mDeviceProvisionedUri = Settings.Global .getUriFor(Settings.Global.DEVICE_PROVISIONED); .getUriFor(Settings.Global.DEVICE_PROVISIONED); private final Uri mRetailDemoConstantsUri = Settings.Global private final Uri mRetailDemoConstantsUri = Settings.Global Loading @@ -211,7 +228,6 @@ public class RetailDemoModeService extends SystemService { public void register() { public void register() { ContentResolver cr = getContext().getContentResolver(); ContentResolver cr = getContext().getContentResolver(); cr.registerContentObserver(mDeviceDemoModeUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mDeviceProvisionedUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mDeviceProvisionedUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mRetailDemoConstantsUri, false, this, cr.registerContentObserver(mRetailDemoConstantsUri, false, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); Loading @@ -223,19 +239,13 @@ public class RetailDemoModeService extends SystemService { refreshTimeoutConstants(); refreshTimeoutConstants(); return; return; } } if (mDeviceDemoModeUri.equals(uri)) { // If device is provisioned and left demo mode - run the cleanup in demo folder mDeviceInDemoMode = UserManager.isDeviceInDemoMode(getContext()); if (isDeviceProvisioned()) { if (mDeviceInDemoMode) { if (UserManager.isDeviceInDemoMode(getContext())) { putDeviceInDemoMode(); putDeviceInDemoMode(); } else { } else { SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); if (mWakeLock.isHeld()) { mWakeLock.release(); } } } // If device is provisioned and left demo mode - run the cleanup in demo folder if (!mDeviceInDemoMode && isDeviceProvisioned()) { // Run on the bg thread to not block the fg thread // Run on the bg thread to not block the fg thread BackgroundThread.getHandler().post(new Runnable() { BackgroundThread.getHandler().post(new Runnable() { @Override @Override Loading @@ -245,6 +255,11 @@ public class RetailDemoModeService extends SystemService { } } } } }); }); if (mWakeLock.isHeld()) { mWakeLock.release(); } } } } } } Loading Loading @@ -312,23 +327,22 @@ public class RetailDemoModeService extends SystemService { } } boolean isDemoLauncherDisabled() { boolean isDemoLauncherDisabled() { IPackageManager pm = AppGlobals.getPackageManager(); int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; String demoLauncherComponent = getContext().getResources() .getString(R.string.config_demoModeLauncherComponent); try { try { enabledState = pm.getComponentEnabledSetting( final IPackageManager iPm = AppGlobals.getPackageManager(); ComponentName.unflattenFromString(demoLauncherComponent), final String demoLauncherComponent = mCurrentUserId); getContext().getString(R.string.config_demoModeLauncherComponent); } catch (RemoteException exc) { enabledState = iPm.getComponentEnabledSetting( Slog.e(TAG, "Unable to talk to Package Manager", exc); ComponentName.unflattenFromString(demoLauncherComponent), mCurrentUserId); } catch (RemoteException re) { Slog.e(TAG, "Error retrieving demo launcher enabled setting", re); } } return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; } } private void setupDemoUser(UserInfo userInfo) { private void setupDemoUser(UserInfo userInfo) { UserManager um = getUserManager(); final UserManager um = getUserManager(); UserHandle user = UserHandle.of(userInfo.id); final UserHandle user = UserHandle.of(userInfo.id); um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); Loading @@ -338,14 +352,56 @@ public class RetailDemoModeService extends SystemService { // Set this to false because the default is true on user creation // Set this to false because the default is true on user creation um.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); um.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); // Disallow rebooting in safe mode - controlled by user 0 // Disallow rebooting in safe mode - controlled by user 0 getUserManager().setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, um.setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM); UserHandle.SYSTEM); Settings.Secure.putIntForUser(getContext().getContentResolver(), Settings.Secure.putIntForUser(getContext().getContentResolver(), Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); grantRuntimePermissionToCamera(user); grantRuntimePermissionToCamera(user); clearPrimaryCallLog(); clearPrimaryCallLog(); if (!mIsCarrierDemoMode) { // Enable demo launcher. final String demoLauncher = getContext().getString( R.string.config_demoModeLauncherComponent); if (!TextUtils.isEmpty(demoLauncher)) { final ComponentName componentToEnable = ComponentName.unflattenFromString(demoLauncher); final String packageName = componentToEnable.getPackageName(); try { final IPackageManager iPm = AppGlobals.getPackageManager(); iPm.setComponentEnabledSetting(componentToEnable, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id); iPm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); } catch (RemoteException re) { // Internal, shouldn't happen } } } else { // Set the carrier demo mode setting for the demo user. final String carrierDemoModeSetting = getContext().getString( R.string.config_carrierDemoModeSetting); Settings.Secure.putIntForUser(getContext().getContentResolver(), carrierDemoModeSetting, 1, userInfo.id); // Enable packages for carrier demo mode. final String packageList = getContext().getString( R.string.config_carrierDemoModePackages); final String[] packageNames = packageList == null ? new String[0] : TextUtils.split(packageList, ","); final IPackageManager iPm = AppGlobals.getPackageManager(); for (String packageName : packageNames) { try { iPm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); } catch (RemoteException re) { Slog.e(TAG, "Error enabling application: " + packageName, re); } } } } } private void grantRuntimePermissionToCamera(UserHandle user) { private void grantRuntimePermissionToCamera(UserHandle user) { Loading Loading @@ -419,7 +475,9 @@ public class RetailDemoModeService extends SystemService { private void registerBroadcastReceiver() { private void registerBroadcastReceiver() { final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter(); if (!mIsCarrierDemoMode) { filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF); } filter.addAction(ACTION_RESET_DEMO); filter.addAction(ACTION_RESET_DEMO); getContext().registerReceiver(mBroadcastReceiver, filter); getContext().registerReceiver(mBroadcastReceiver, filter); } } Loading Loading @@ -465,6 +523,14 @@ public class RetailDemoModeService extends SystemService { } } private void putDeviceInDemoMode() { private void putDeviceInDemoMode() { mDeviceInDemoMode = true; final String carrierDemoModeSetting = getContext().getString(R.string.config_carrierDemoModeSetting); mIsCarrierDemoMode = !TextUtils.isEmpty(carrierDemoModeSetting) && (Settings.Secure.getInt(getContext().getContentResolver(), carrierDemoModeSetting, 0) == 1); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1"); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1"); mHandler.sendEmptyMessage(MSG_START_NEW_SESSION); mHandler.sendEmptyMessage(MSG_START_NEW_SESSION); } } Loading @@ -488,10 +554,8 @@ public class RetailDemoModeService extends SystemService { mPreloadAppsInstaller = new PreloadAppsInstaller(getContext()); mPreloadAppsInstaller = new PreloadAppsInstaller(getContext()); mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mAmi = LocalServices.getService(ActivityManagerInternal.class); mAmi = LocalServices.getService(ActivityManagerInternal.class); mWakeLock = mPm mWakeLock = mPm.newWakeLock( .newWakeLock( PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); mNm = NotificationManager.from(getContext()); mNm = NotificationManager.from(getContext()); mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mCameraManager = (CameraManager) getContext() mCameraManager = (CameraManager) getContext() Loading @@ -500,12 +564,11 @@ public class RetailDemoModeService extends SystemService { SettingsObserver settingsObserver = new SettingsObserver(mHandler); SettingsObserver settingsObserver = new SettingsObserver(mHandler); settingsObserver.register(); settingsObserver.register(); settingsObserver.refreshTimeoutConstants(); settingsObserver.refreshTimeoutConstants(); registerBroadcastReceiver(); break; break; case PHASE_BOOT_COMPLETED: case PHASE_BOOT_COMPLETED: if (UserManager.isDeviceInDemoMode(getContext())) { if (UserManager.isDeviceInDemoMode(getContext())) { mDeviceInDemoMode = true; putDeviceInDemoMode(); putDeviceInDemoMode(); registerBroadcastReceiver(); } } break; break; } } Loading @@ -524,19 +587,24 @@ public class RetailDemoModeService extends SystemService { Slog.wtf(TAG, "Should not allow switch to non-demo user in demo mode"); Slog.wtf(TAG, "Should not allow switch to non-demo user in demo mode"); return; return; } } if (!mWakeLock.isHeld()) { if (!mIsCarrierDemoMode && !mWakeLock.isHeld()) { mWakeLock.acquire(); mWakeLock.acquire(); } } mCurrentUserId = userId; mCurrentUserId = userId; mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId); mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId); turnOffAllFlashLights(); turnOffAllFlashLights(); muteVolumeStreams(); muteVolumeStreams(); if (!mWifiManager.isWifiEnabled()) { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); mWifiManager.setWifiEnabled(true); } } // Disable lock screen for demo users. // Disable lock screen for demo users. LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); lockPatternUtils.setLockScreenDisabled(true, userId); lockPatternUtils.setLockScreenDisabled(true, userId); if (!mIsCarrierDemoMode) { // Show reset notification (except in carrier demo mode). mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); synchronized (mActivityLock) { synchronized (mActivityLock) { Loading @@ -551,13 +619,14 @@ public class RetailDemoModeService extends SystemService { } } }); }); } } } private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { private static final long USER_ACTIVITY_DEBOUNCE_TIME = 2000; private static final long USER_ACTIVITY_DEBOUNCE_TIME = 2000; @Override @Override public void onUserActivity() { public void onUserActivity() { if (!mDeviceInDemoMode) { if (!mDeviceInDemoMode || mIsCarrierDemoMode) { return; return; } } long timeOfActivity = SystemClock.uptimeMillis(); long timeOfActivity = SystemClock.uptimeMillis(); Loading Loading
core/res/res/values/config.xml +8 −2 Original line number Original line Diff line number Diff line Loading @@ -2635,8 +2635,14 @@ <!-- Component that is the default launcher when demo mode is enabled. --> <!-- Component that is the default launcher when demo mode is enabled. --> <string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string> <string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string> <!-- Hashed password (SHA-256) used to restrict demo mode operation --> <!-- Hashed password (SHA-256) used to restrict carrier demo mode operation. --> <string name="config_demoModePassword" translatable="false"></string> <string name="config_carrierDemoModePassword" translatable="false"></string> <!-- Secure setting used to activate carrier demo mode. --> <string name="config_carrierDemoModeSetting" translatable="false"></string> <!-- List of packages to enable in carrier demo mode (comma separated). --> <string name="config_carrierDemoModePackages" translatable="false"></string> <!-- Flag indicating whether round icons should be parsed from the application manifest. --> <!-- Flag indicating whether round icons should be parsed from the application manifest. --> <bool name="config_useRoundIcon">false</bool> <bool name="config_useRoundIcon">false</bool> Loading
core/res/res/values/symbols.xml +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1118,7 +1118,9 @@ <java-symbol type="string" name="config_ethernet_tcp_buffers" /> <java-symbol type="string" name="config_ethernet_tcp_buffers" /> <java-symbol type="string" name="config_wifi_tcp_buffers" /> <java-symbol type="string" name="config_wifi_tcp_buffers" /> <java-symbol type="string" name="config_demoModeLauncherComponent" /> <java-symbol type="string" name="config_demoModeLauncherComponent" /> <java-symbol type="string" name="config_demoModePassword" /> <java-symbol type="string" name="config_carrierDemoModePassword" /> <java-symbol type="string" name="config_carrierDemoModeSetting" /> <java-symbol type="string" name="config_carrierDemoModePackages" /> <java-symbol type="string" name="demo_starting_message" /> <java-symbol type="string" name="demo_starting_message" /> <java-symbol type="string" name="demo_restarting_message" /> <java-symbol type="string" name="demo_restarting_message" /> <java-symbol type="string" name="conference_call" /> <java-symbol type="string" name="conference_call" /> Loading
services/core/java/com/android/server/pm/UserManagerService.java +0 −27 Original line number Original line Diff line number Diff line Loading @@ -33,12 +33,10 @@ import android.app.IStopUserCallback; import android.app.KeyguardManager; import android.app.KeyguardManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentFilter; import android.content.IntentSender; import android.content.IntentSender; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.content.pm.UserInfo; Loading Loading @@ -2916,8 +2914,6 @@ public class UserManagerService extends IUserManager.Stub { applyUserRestrictionsLR(userId); applyUserRestrictionsLR(userId); } } } } maybeInitializeDemoMode(userId); } } /** /** Loading Loading @@ -2950,29 +2946,6 @@ public class UserManagerService extends IUserManager.Stub { scheduleWriteUser(userData); scheduleWriteUser(userData); } } private void maybeInitializeDemoMode(int userId) { if (UserManager.isDeviceInDemoMode(mContext) && userId != UserHandle.USER_SYSTEM) { String demoLauncher = mContext.getResources().getString( com.android.internal.R.string.config_demoModeLauncherComponent); if (!TextUtils.isEmpty(demoLauncher)) { ComponentName componentToEnable = ComponentName.unflattenFromString(demoLauncher); String demoLauncherPkg = componentToEnable.getPackageName(); try { final IPackageManager iPm = AppGlobals.getPackageManager(); iPm.setComponentEnabledSetting(componentToEnable, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, /* userId= */ userId); iPm.setApplicationEnabledSetting(demoLauncherPkg, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, /* userId= */ userId, null); } catch (RemoteException re) { // Internal, shouldn't happen } } } } /** /** * Returns the next available user id, filling in any holes in the ids. * Returns the next available user id, filling in any holes in the ids. * TODO: May not be a good idea to recycle ids, in case it results in confusion * TODO: May not be a good idea to recycle ids, in case it results in confusion Loading
services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java +127 −58 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.app.PendingIntent; import android.app.RetailDemoModeServiceInternal; import android.app.RetailDemoModeServiceInternal; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ComponentName; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentResolver; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; Loading Loading @@ -59,6 +58,7 @@ import android.os.UserManager; import android.provider.CallLog; import android.provider.CallLog; import android.provider.MediaStore; import android.provider.MediaStore; import android.provider.Settings; import android.provider.Settings; import android.text.TextUtils; import android.util.KeyValueListParser; import android.util.KeyValueListParser; import android.util.Slog; import android.util.Slog; import com.android.internal.os.BackgroundThread; import com.android.internal.os.BackgroundThread; Loading Loading @@ -103,7 +103,8 @@ public class RetailDemoModeService extends SystemService { private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; boolean mDeviceInDemoMode = false; boolean mDeviceInDemoMode; boolean mIsCarrierDemoMode; int mCurrentUserId = UserHandle.USER_SYSTEM; int mCurrentUserId = UserHandle.USER_SYSTEM; long mUserInactivityTimeout; long mUserInactivityTimeout; long mWarningDialogTimeout; long mWarningDialogTimeout; Loading Loading @@ -138,7 +139,8 @@ public class RetailDemoModeService extends SystemService { if (!mDeviceInDemoMode) { if (!mDeviceInDemoMode) { return; return; } } switch (intent.getAction()) { final String action = intent.getAction(); switch (action) { case Intent.ACTION_SCREEN_OFF: case Intent.ACTION_SCREEN_OFF: mHandler.removeMessages(MSG_TURN_SCREEN_ON); mHandler.removeMessages(MSG_TURN_SCREEN_ON); mHandler.sendEmptyMessageDelayed(MSG_TURN_SCREEN_ON, SCREEN_WAKEUP_DELAY); mHandler.sendEmptyMessageDelayed(MSG_TURN_SCREEN_ON, SCREEN_WAKEUP_DELAY); Loading Loading @@ -166,7 +168,7 @@ public class RetailDemoModeService extends SystemService { mWakeLock.acquire(); mWakeLock.acquire(); break; break; case MSG_INACTIVITY_TIME_OUT: case MSG_INACTIVITY_TIME_OUT: if (isDemoLauncherDisabled()) { if (!mIsCarrierDemoMode && isDemoLauncherDisabled()) { Slog.i(TAG, "User inactivity timeout reached"); Slog.i(TAG, "User inactivity timeout reached"); showInactivityCountdownDialog(); showInactivityCountdownDialog(); } } Loading @@ -177,12 +179,29 @@ public class RetailDemoModeService extends SystemService { } } removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_INACTIVITY_TIME_OUT); removeMessages(MSG_INACTIVITY_TIME_OUT); if (mCurrentUserId != UserHandle.USER_SYSTEM) { if (!mIsCarrierDemoMode && mCurrentUserId != UserHandle.USER_SYSTEM) { logSessionDuration(); logSessionDuration(); } } final UserInfo demoUser = getUserManager().createUser(DEMO_USER_NAME, UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); UserInfo demoUser = null; if (demoUser != null) { if (mIsCarrierDemoMode) { // Re-use the existing demo user in carrier demo mode. for (UserInfo user : getUserManager().getUsers()) { if (user.isDemo()) { demoUser = user; break; } } } if (demoUser == null) { // User in carrier demo mode should survive reboots. final int flags = UserInfo.FLAG_DEMO | (mIsCarrierDemoMode ? 0 : UserInfo.FLAG_EPHEMERAL); demoUser = getUserManager().createUser(DEMO_USER_NAME, flags); } if (demoUser != null && mCurrentUserId != demoUser.id) { setupDemoUser(demoUser); setupDemoUser(demoUser); getActivityManager().switchUser(demoUser.id); getActivityManager().switchUser(demoUser.id); } } Loading @@ -196,8 +215,6 @@ public class RetailDemoModeService extends SystemService { private final static String KEY_USER_INACTIVITY_TIMEOUT = "user_inactivity_timeout_ms"; private final static String KEY_USER_INACTIVITY_TIMEOUT = "user_inactivity_timeout_ms"; private final static String KEY_WARNING_DIALOG_TIMEOUT = "warning_dialog_timeout_ms"; private final static String KEY_WARNING_DIALOG_TIMEOUT = "warning_dialog_timeout_ms"; private final Uri mDeviceDemoModeUri = Settings.Global .getUriFor(Settings.Global.DEVICE_DEMO_MODE); private final Uri mDeviceProvisionedUri = Settings.Global private final Uri mDeviceProvisionedUri = Settings.Global .getUriFor(Settings.Global.DEVICE_PROVISIONED); .getUriFor(Settings.Global.DEVICE_PROVISIONED); private final Uri mRetailDemoConstantsUri = Settings.Global private final Uri mRetailDemoConstantsUri = Settings.Global Loading @@ -211,7 +228,6 @@ public class RetailDemoModeService extends SystemService { public void register() { public void register() { ContentResolver cr = getContext().getContentResolver(); ContentResolver cr = getContext().getContentResolver(); cr.registerContentObserver(mDeviceDemoModeUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mDeviceProvisionedUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mDeviceProvisionedUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mRetailDemoConstantsUri, false, this, cr.registerContentObserver(mRetailDemoConstantsUri, false, this, UserHandle.USER_SYSTEM); UserHandle.USER_SYSTEM); Loading @@ -223,19 +239,13 @@ public class RetailDemoModeService extends SystemService { refreshTimeoutConstants(); refreshTimeoutConstants(); return; return; } } if (mDeviceDemoModeUri.equals(uri)) { // If device is provisioned and left demo mode - run the cleanup in demo folder mDeviceInDemoMode = UserManager.isDeviceInDemoMode(getContext()); if (isDeviceProvisioned()) { if (mDeviceInDemoMode) { if (UserManager.isDeviceInDemoMode(getContext())) { putDeviceInDemoMode(); putDeviceInDemoMode(); } else { } else { SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); if (mWakeLock.isHeld()) { mWakeLock.release(); } } } // If device is provisioned and left demo mode - run the cleanup in demo folder if (!mDeviceInDemoMode && isDeviceProvisioned()) { // Run on the bg thread to not block the fg thread // Run on the bg thread to not block the fg thread BackgroundThread.getHandler().post(new Runnable() { BackgroundThread.getHandler().post(new Runnable() { @Override @Override Loading @@ -245,6 +255,11 @@ public class RetailDemoModeService extends SystemService { } } } } }); }); if (mWakeLock.isHeld()) { mWakeLock.release(); } } } } } } Loading Loading @@ -312,23 +327,22 @@ public class RetailDemoModeService extends SystemService { } } boolean isDemoLauncherDisabled() { boolean isDemoLauncherDisabled() { IPackageManager pm = AppGlobals.getPackageManager(); int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; String demoLauncherComponent = getContext().getResources() .getString(R.string.config_demoModeLauncherComponent); try { try { enabledState = pm.getComponentEnabledSetting( final IPackageManager iPm = AppGlobals.getPackageManager(); ComponentName.unflattenFromString(demoLauncherComponent), final String demoLauncherComponent = mCurrentUserId); getContext().getString(R.string.config_demoModeLauncherComponent); } catch (RemoteException exc) { enabledState = iPm.getComponentEnabledSetting( Slog.e(TAG, "Unable to talk to Package Manager", exc); ComponentName.unflattenFromString(demoLauncherComponent), mCurrentUserId); } catch (RemoteException re) { Slog.e(TAG, "Error retrieving demo launcher enabled setting", re); } } return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; } } private void setupDemoUser(UserInfo userInfo) { private void setupDemoUser(UserInfo userInfo) { UserManager um = getUserManager(); final UserManager um = getUserManager(); UserHandle user = UserHandle.of(userInfo.id); final UserHandle user = UserHandle.of(userInfo.id); um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); Loading @@ -338,14 +352,56 @@ public class RetailDemoModeService extends SystemService { // Set this to false because the default is true on user creation // Set this to false because the default is true on user creation um.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); um.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); // Disallow rebooting in safe mode - controlled by user 0 // Disallow rebooting in safe mode - controlled by user 0 getUserManager().setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, um.setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM); UserHandle.SYSTEM); Settings.Secure.putIntForUser(getContext().getContentResolver(), Settings.Secure.putIntForUser(getContext().getContentResolver(), Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); grantRuntimePermissionToCamera(user); grantRuntimePermissionToCamera(user); clearPrimaryCallLog(); clearPrimaryCallLog(); if (!mIsCarrierDemoMode) { // Enable demo launcher. final String demoLauncher = getContext().getString( R.string.config_demoModeLauncherComponent); if (!TextUtils.isEmpty(demoLauncher)) { final ComponentName componentToEnable = ComponentName.unflattenFromString(demoLauncher); final String packageName = componentToEnable.getPackageName(); try { final IPackageManager iPm = AppGlobals.getPackageManager(); iPm.setComponentEnabledSetting(componentToEnable, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id); iPm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); } catch (RemoteException re) { // Internal, shouldn't happen } } } else { // Set the carrier demo mode setting for the demo user. final String carrierDemoModeSetting = getContext().getString( R.string.config_carrierDemoModeSetting); Settings.Secure.putIntForUser(getContext().getContentResolver(), carrierDemoModeSetting, 1, userInfo.id); // Enable packages for carrier demo mode. final String packageList = getContext().getString( R.string.config_carrierDemoModePackages); final String[] packageNames = packageList == null ? new String[0] : TextUtils.split(packageList, ","); final IPackageManager iPm = AppGlobals.getPackageManager(); for (String packageName : packageNames) { try { iPm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); } catch (RemoteException re) { Slog.e(TAG, "Error enabling application: " + packageName, re); } } } } } private void grantRuntimePermissionToCamera(UserHandle user) { private void grantRuntimePermissionToCamera(UserHandle user) { Loading Loading @@ -419,7 +475,9 @@ public class RetailDemoModeService extends SystemService { private void registerBroadcastReceiver() { private void registerBroadcastReceiver() { final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter(); if (!mIsCarrierDemoMode) { filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF); } filter.addAction(ACTION_RESET_DEMO); filter.addAction(ACTION_RESET_DEMO); getContext().registerReceiver(mBroadcastReceiver, filter); getContext().registerReceiver(mBroadcastReceiver, filter); } } Loading Loading @@ -465,6 +523,14 @@ public class RetailDemoModeService extends SystemService { } } private void putDeviceInDemoMode() { private void putDeviceInDemoMode() { mDeviceInDemoMode = true; final String carrierDemoModeSetting = getContext().getString(R.string.config_carrierDemoModeSetting); mIsCarrierDemoMode = !TextUtils.isEmpty(carrierDemoModeSetting) && (Settings.Secure.getInt(getContext().getContentResolver(), carrierDemoModeSetting, 0) == 1); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1"); SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1"); mHandler.sendEmptyMessage(MSG_START_NEW_SESSION); mHandler.sendEmptyMessage(MSG_START_NEW_SESSION); } } Loading @@ -488,10 +554,8 @@ public class RetailDemoModeService extends SystemService { mPreloadAppsInstaller = new PreloadAppsInstaller(getContext()); mPreloadAppsInstaller = new PreloadAppsInstaller(getContext()); mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mAmi = LocalServices.getService(ActivityManagerInternal.class); mAmi = LocalServices.getService(ActivityManagerInternal.class); mWakeLock = mPm mWakeLock = mPm.newWakeLock( .newWakeLock( PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); mNm = NotificationManager.from(getContext()); mNm = NotificationManager.from(getContext()); mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mCameraManager = (CameraManager) getContext() mCameraManager = (CameraManager) getContext() Loading @@ -500,12 +564,11 @@ public class RetailDemoModeService extends SystemService { SettingsObserver settingsObserver = new SettingsObserver(mHandler); SettingsObserver settingsObserver = new SettingsObserver(mHandler); settingsObserver.register(); settingsObserver.register(); settingsObserver.refreshTimeoutConstants(); settingsObserver.refreshTimeoutConstants(); registerBroadcastReceiver(); break; break; case PHASE_BOOT_COMPLETED: case PHASE_BOOT_COMPLETED: if (UserManager.isDeviceInDemoMode(getContext())) { if (UserManager.isDeviceInDemoMode(getContext())) { mDeviceInDemoMode = true; putDeviceInDemoMode(); putDeviceInDemoMode(); registerBroadcastReceiver(); } } break; break; } } Loading @@ -524,19 +587,24 @@ public class RetailDemoModeService extends SystemService { Slog.wtf(TAG, "Should not allow switch to non-demo user in demo mode"); Slog.wtf(TAG, "Should not allow switch to non-demo user in demo mode"); return; return; } } if (!mWakeLock.isHeld()) { if (!mIsCarrierDemoMode && !mWakeLock.isHeld()) { mWakeLock.acquire(); mWakeLock.acquire(); } } mCurrentUserId = userId; mCurrentUserId = userId; mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId); mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId); turnOffAllFlashLights(); turnOffAllFlashLights(); muteVolumeStreams(); muteVolumeStreams(); if (!mWifiManager.isWifiEnabled()) { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); mWifiManager.setWifiEnabled(true); } } // Disable lock screen for demo users. // Disable lock screen for demo users. LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); lockPatternUtils.setLockScreenDisabled(true, userId); lockPatternUtils.setLockScreenDisabled(true, userId); if (!mIsCarrierDemoMode) { // Show reset notification (except in carrier demo mode). mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); synchronized (mActivityLock) { synchronized (mActivityLock) { Loading @@ -551,13 +619,14 @@ public class RetailDemoModeService extends SystemService { } } }); }); } } } private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { private static final long USER_ACTIVITY_DEBOUNCE_TIME = 2000; private static final long USER_ACTIVITY_DEBOUNCE_TIME = 2000; @Override @Override public void onUserActivity() { public void onUserActivity() { if (!mDeviceInDemoMode) { if (!mDeviceInDemoMode || mIsCarrierDemoMode) { return; return; } } long timeOfActivity = SystemClock.uptimeMillis(); long timeOfActivity = SystemClock.uptimeMillis(); Loading