Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 482ba6b8 authored by Justin Klaassen's avatar Justin Klaassen Committed by Android (Google) Code Review
Browse files

Merge "Add support for carrier demo mode" into nyc-mr2-dev

parents ae9e15fa b632c554
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -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>
+3 −1
Original line number Original line Diff line number Diff line
@@ -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" />
+0 −27
Original line number Original line Diff line number Diff line
@@ -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;
@@ -2916,8 +2914,6 @@ public class UserManagerService extends IUserManager.Stub {
                applyUserRestrictionsLR(userId);
                applyUserRestrictionsLR(userId);
            }
            }
        }
        }

        maybeInitializeDemoMode(userId);
    }
    }


    /**
    /**
@@ -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
+127 −58
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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);
@@ -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();
                    }
                    }
@@ -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);
                    }
                    }
@@ -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
@@ -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);
@@ -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
@@ -245,6 +255,11 @@ public class RetailDemoModeService extends SystemService {
                            }
                            }
                        }
                        }
                    });
                    });

                    if (mWakeLock.isHeld()) {
                        mWakeLock.release();
                    }
                }
            }
            }
        }
        }


@@ -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);
@@ -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) {
@@ -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);
    }
    }
@@ -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);
    }
    }
@@ -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()
@@ -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;
        }
        }
@@ -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) {
@@ -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();