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

Commit 28537b6a authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Don't limit RetailDemoModeService to start only during demo mode.

- Update RetailDemoModeService to not do anything outside demo mode.
- Add am command get-started-user-state which is needed for cts tests.
- Update unit tests for RetailDemoModeService.

Bug: 31342350
Test: adb shell am instrument -e class com.android.server.retaildemo.RetailDemoModeServiceTest -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Change-Id: Idf50512facd27d47d7111e75cbc2f7b260f49740
parent 4c9f9d68
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -21705,6 +21705,13 @@ public final class ActivityManagerService extends ActivityManagerNative
        return mUserController.getCurrentUser();
    }
    String getStartedUserState(int userId) {
        synchronized (this) {
            final UserState userState = mUserController.getStartedUserStateLocked(userId);
            return UserState.stateToString(userState.state);
        }
    }
    @Override
    public boolean isUserRunning(int userId, int flags) {
        if (!mUserController.isSameProfileGroup(userId, UserHandle.getCallingUserId())
+16 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ class ActivityManagerShellCommand extends ShellCommand {
                    return runLenientBackgroundCheck(pw);
                case "get-uid-state":
                    return getUidState(pw);
                case "get-started-user-state":
                    return getStartedUserState(pw);
                default:
                    return handleDefaultCommands(cmd);
            }
@@ -458,6 +460,18 @@ class ActivityManagerShellCommand extends ShellCommand {
        return 0;
    }

    int getStartedUserState(PrintWriter pw) throws RemoteException {
        mInternal.enforceCallingPermission(android.Manifest.permission.DUMP,
                "getStartedUserState()");
        final int userId = Integer.parseInt(getNextArgRequired());
        try {
            pw.println(mInternal.getStartedUserState(userId));
        } catch (NullPointerException e) {
            pw.println("User is not started: " + userId);
        }
        return 0;
    }

    @Override
    public void onHelp() {
        PrintWriter pw = getOutPrintWriter();
@@ -534,6 +548,8 @@ class ActivityManagerShellCommand extends ShellCommand {
            pw.println("    Optionally controls lenient background check mode, returns current mode.");
            pw.println("  get-uid-state <UID>");
            pw.println("    Gets the process state of an app given its <UID>.");
            pw.println("  get-started-user-state <USER_ID>");
            pw.println("    Gets the current state of the given started user.");
            pw.println();
            Intent.printIntentArgsHelp(pw, "");
        }
+1 −1
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ public final class UserState {
        state = newState;
    }

    private static String stateToString(int state) {
    static String stateToString(int state) {
        switch (state) {
            case STATE_BOOTING: return "BOOTING";
            case STATE_RUNNING_LOCKED: return "RUNNING_LOCKED";
+3 −6
Original line number Diff line number Diff line
@@ -1372,12 +1372,9 @@ public final class SystemServer {
        mmsService = mSystemServiceManager.startService(MmsServiceBroker.class);
        traceEnd();

        if (Settings.Global.getInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED, 0) == 0 ||
                UserManager.isDeviceInDemoMode(mSystemContext)) {
        traceBeginAndSlog("StartRetailDemoModeService");
        mSystemServiceManager.startService(RetailDemoModeService.class);
        traceEnd();
        }

        // It is now time to start up the app processes...

+70 −16
Original line number Diff line number Diff line
@@ -124,7 +124,12 @@ public class RetailDemoModeService extends SystemService {
    @GuardedBy("mActivityLock")
    long mLastUserActivityTime;

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    private boolean mSafeBootRestrictionInitialState;
    private int mPackageVerifierEnableInitialState;

    private IntentReceiver mBroadcastReceiver = null;

    private final class IntentReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!mDeviceInDemoMode) {
@@ -150,6 +155,9 @@ public class RetailDemoModeService extends SystemService {

        @Override
        public void handleMessage(Message msg) {
            if (!mDeviceInDemoMode) {
                return;
            }
            switch (msg.what) {
                case MSG_TURN_SCREEN_ON:
                    if (mInjector.isWakeLockHeld()) {
@@ -219,7 +227,7 @@ public class RetailDemoModeService extends SystemService {
            if (mDeviceDemoModeUri.equals(uri)) {
                mDeviceInDemoMode = UserManager.isDeviceInDemoMode(getContext());
                if (mDeviceInDemoMode) {
                    putDeviceInDemoMode();
                    startDemoMode();
                } else {
                    mInjector.systemPropertiesSet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0");
                    if (mInjector.isWakeLockHeld()) {
@@ -238,6 +246,7 @@ public class RetailDemoModeService extends SystemService {
                        }
                    }
                });
                stopDemoMode();
            }
        }

@@ -376,11 +385,21 @@ public class RetailDemoModeService extends SystemService {
    }

    private void registerBroadcastReceiver() {
        if (mBroadcastReceiver == null) {
            final IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            filter.addAction(ACTION_RESET_DEMO);
            mBroadcastReceiver = new IntentReceiver();
            getContext().registerReceiver(mBroadcastReceiver, filter);
        }
    }

    private void unregisterBroadcastReceiver() {
        if (mBroadcastReceiver != null) {
            getContext().unregisterReceiver(mBroadcastReceiver);
            mBroadcastReceiver = null;
        }
    }

    private String[] getCameraIdsWithFlash() {
        ArrayList<String> cameraIdsList = new ArrayList<String>();
@@ -407,9 +426,33 @@ public class RetailDemoModeService extends SystemService {
        }
    }

    private void putDeviceInDemoMode() {
    private void startDemoMode() {
        mPreloadAppsInstaller = mInjector.getPreloadAppsInstaller();
        mInjector.initializeWakeLock();
        if (mCameraIdsWithFlash == null) {
            mCameraIdsWithFlash = getCameraIdsWithFlash();
        }
        registerBroadcastReceiver();

        mInjector.systemPropertiesSet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1");
        mHandler.sendEmptyMessage(MSG_START_NEW_SESSION);

        mSafeBootRestrictionInitialState = mInjector.getUserManager().hasUserRestriction(
                UserManager.DISALLOW_SAFE_BOOT, UserHandle.SYSTEM);
        mPackageVerifierEnableInitialState = Settings.Global.getInt(mInjector.getContentResolver(),
                Settings.Global.PACKAGE_VERIFIER_ENABLE, 0);
    }

    private void stopDemoMode() {
        mPreloadAppsInstaller = null;
        mCameraIdsWithFlash = null;
        mInjector.destroyWakeLock();
        unregisterBroadcastReceiver();

        mInjector.getUserManager().setUserRestriction(UserManager.DISALLOW_SAFE_BOOT,
                mSafeBootRestrictionInitialState, UserHandle.SYSTEM);
        Settings.Global.putInt(mInjector.getContentResolver(),
                Settings.Global.PACKAGE_VERIFIER_ENABLE, mPackageVerifierEnableInitialState);
    }

    @Override
@@ -421,25 +464,21 @@ public class RetailDemoModeService extends SystemService {
                false);
        mHandlerThread.start();
        mHandler = new MainHandler(mHandlerThread.getLooper());
        publishLocalService(RetailDemoModeServiceInternal.class, mLocalService);
        mInjector.publishLocalService(this, mLocalService);
    }

    @Override
    public void onBootPhase(int bootPhase) {
        switch (bootPhase) {
            case PHASE_THIRD_PARTY_APPS_CAN_START:
                mPreloadAppsInstaller = mInjector.getPreloadAppsInstaller();
                mInjector.initializeWakeLock();
                mCameraIdsWithFlash = getCameraIdsWithFlash();
                SettingsObserver settingsObserver = new SettingsObserver(mHandler);
                settingsObserver.register();
                settingsObserver.refreshTimeoutConstants();
                registerBroadcastReceiver();
                break;
            case PHASE_BOOT_COMPLETED:
                if (UserManager.isDeviceInDemoMode(getContext())) {
                    mDeviceInDemoMode = true;
                    putDeviceInDemoMode();
                    startDemoMode();
                }
                break;
        }
@@ -526,6 +565,7 @@ public class RetailDemoModeService extends SystemService {
        private WifiManager mWifiManager;
        private Configuration mSystemUserConfiguration;
        private PendingIntent mResetDemoPendingIntent;
        private PreloadAppsInstaller mPreloadAppsInstaller;

        Injector(Context context) {
            mContext = context;
@@ -609,7 +649,10 @@ public class RetailDemoModeService extends SystemService {
        }

        PreloadAppsInstaller getPreloadAppsInstaller() {
            return new PreloadAppsInstaller(getContext());
            if (mPreloadAppsInstaller == null) {
                mPreloadAppsInstaller = new PreloadAppsInstaller(getContext());
            }
            return mPreloadAppsInstaller;
        }

        void systemPropertiesSet(String key, String value) {
@@ -628,9 +671,15 @@ public class RetailDemoModeService extends SystemService {
        }

        void initializeWakeLock() {
            if (mWakeLock == null) {
                mWakeLock = getPowerManager().newWakeLock(
                        PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
            }
        }

        void destroyWakeLock() {
            mWakeLock = null;
        }

        boolean isWakeLockHeld() {
            return mWakeLock.isHeld();
@@ -688,5 +737,10 @@ public class RetailDemoModeService extends SystemService {
        File getDataPreloadsDirectory() {
            return Environment.getDataPreloadsDirectory();
        }

        void publishLocalService(RetailDemoModeService service,
                RetailDemoModeServiceInternal localService) {
            service.publishLocalService(RetailDemoModeServiceInternal.class, localService);
        }
    }
}
Loading