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

Commit 6bb61a7d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add support for carrier demo mode"

parents 95b89b30 f05cf3ee
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -2625,8 +2625,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
@@ -1136,7 +1136,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;
@@ -3133,8 +3131,6 @@ public class UserManagerService extends IUserManager.Stub {
                applyUserRestrictionsLR(userId);
                applyUserRestrictionsLR(userId);
            }
            }
        }
        }

        maybeInitializeDemoMode(userId);
    }
    }


    /**
    /**
@@ -3173,29 +3169,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.
     */
     */
+136 −56
Original line number Original line Diff line number Diff line
@@ -58,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;
@@ -105,7 +106,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;
@@ -135,7 +137,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 +169,7 @@ public class RetailDemoModeService extends SystemService {
                    mInjector.acquireWakeLock();
                    mInjector.acquireWakeLock();
                    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 +180,30 @@ 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 = mInjector.getUserManager().createUser(DEMO_USER_NAME,

                            UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL);
                    final UserManager um = mInjector.getUserManager();
                    if (demoUser != null) {
                    UserInfo demoUser = null;
                    if (mIsCarrierDemoMode) {
                        // Re-use the existing demo user in carrier demo mode.
                        for (UserInfo user : um.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 = um.createUser(DEMO_USER_NAME, flags);
                    }

                    if (demoUser != null && mCurrentUserId != demoUser.id) {
                        setupDemoUser(demoUser);
                        setupDemoUser(demoUser);
                        mInjector.switchUser(demoUser.id);
                        mInjector.switchUser(demoUser.id);
                    }
                    }
@@ -211,7 +232,7 @@ public class RetailDemoModeService extends SystemService {
        }
        }


        public void register() {
        public void register() {
            ContentResolver cr = mInjector.getContentResolver();
            final ContentResolver cr = mInjector.getContentResolver();
            cr.registerContentObserver(mDeviceDemoModeUri, false, this, UserHandle.USER_SYSTEM);
            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,
@@ -224,19 +245,14 @@ public class RetailDemoModeService extends SystemService {
                refreshTimeoutConstants();
                refreshTimeoutConstants();
                return;
                return;
            }
            }
            if (mDeviceDemoModeUri.equals(uri)) {

                mDeviceInDemoMode = UserManager.isDeviceInDemoMode(getContext());
            // If device is provisioned and left demo mode - run the cleanup in demo folder
                if (mDeviceInDemoMode) {
            if (isDeviceProvisioned()) {
                if (UserManager.isDeviceInDemoMode(getContext())) {
                    startDemoMode();
                    startDemoMode();
                } else {
                } else {
                    mInjector.systemPropertiesSet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0");
                    mInjector.systemPropertiesSet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0");
                    if (mInjector.isWakeLockHeld()) {

                        mInjector.releaseWakeLock();
                    }
                }
            }
            // 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
@@ -246,7 +262,13 @@ public class RetailDemoModeService extends SystemService {
                            }
                            }
                        }
                        }
                    });
                    });

                    stopDemoMode();
                    stopDemoMode();

                    if (mInjector.isWakeLockHeld()) {
                        mInjector.releaseWakeLock();
                    }
                }
            }
            }
        }
        }


@@ -300,23 +322,22 @@ public class RetailDemoModeService extends SystemService {
    }
    }


    boolean isDemoLauncherDisabled() {
    boolean isDemoLauncherDisabled() {
        IPackageManager pm = mInjector.getIPackageManager();
        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 = mInjector.getIPackageManager();
                    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 = mInjector.getUserManager();
        final UserManager um = mInjector.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);
@@ -327,6 +348,7 @@ public class RetailDemoModeService extends SystemService {
        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
        um.setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM);
        um.setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM);

        Settings.Secure.putIntForUser(mInjector.getContentResolver(),
        Settings.Secure.putIntForUser(mInjector.getContentResolver(),
                Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id);
                Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id);
        Settings.Global.putInt(mInjector.getContentResolver(),
        Settings.Global.putInt(mInjector.getContentResolver(),
@@ -334,6 +356,47 @@ public class RetailDemoModeService extends SystemService {


        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) {
@@ -385,14 +448,18 @@ public class RetailDemoModeService extends SystemService {
    }
    }


    private void registerBroadcastReceiver() {
    private void registerBroadcastReceiver() {
        if (mBroadcastReceiver == null) {
        if (mBroadcastReceiver != null) {
            return;
        }

        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);
        mBroadcastReceiver = new IntentReceiver();
        mBroadcastReceiver = new IntentReceiver();
        getContext().registerReceiver(mBroadcastReceiver, filter);
        getContext().registerReceiver(mBroadcastReceiver, filter);
    }
    }
    }


    private void unregisterBroadcastReceiver() {
    private void unregisterBroadcastReceiver() {
        if (mBroadcastReceiver != null) {
        if (mBroadcastReceiver != null) {
@@ -427,6 +494,8 @@ public class RetailDemoModeService extends SystemService {
    }
    }


    private void startDemoMode() {
    private void startDemoMode() {
        mDeviceInDemoMode = true;

        mPreloadAppsInstaller = mInjector.getPreloadAppsInstaller();
        mPreloadAppsInstaller = mInjector.getPreloadAppsInstaller();
        mInjector.initializeWakeLock();
        mInjector.initializeWakeLock();
        if (mCameraIdsWithFlash == null) {
        if (mCameraIdsWithFlash == null) {
@@ -434,6 +503,12 @@ public class RetailDemoModeService extends SystemService {
        }
        }
        registerBroadcastReceiver();
        registerBroadcastReceiver();


        final String carrierDemoModeSetting =
                getContext().getString(R.string.config_carrierDemoModeSetting);
        mIsCarrierDemoMode = !TextUtils.isEmpty(carrierDemoModeSetting)
                && (Settings.Secure.getInt(getContext().getContentResolver(),
                        carrierDemoModeSetting, 0) == 1);

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


@@ -471,13 +546,12 @@ public class RetailDemoModeService extends SystemService {
    public void onBootPhase(int bootPhase) {
    public void onBootPhase(int bootPhase) {
        switch (bootPhase) {
        switch (bootPhase) {
            case PHASE_THIRD_PARTY_APPS_CAN_START:
            case PHASE_THIRD_PARTY_APPS_CAN_START:
                SettingsObserver settingsObserver = new SettingsObserver(mHandler);
                final SettingsObserver settingsObserver = new SettingsObserver(mHandler);
                settingsObserver.register();
                settingsObserver.register();
                settingsObserver.refreshTimeoutConstants();
                settingsObserver.refreshTimeoutConstants();
                break;
                break;
            case PHASE_BOOT_COMPLETED:
            case PHASE_BOOT_COMPLETED:
                if (UserManager.isDeviceInDemoMode(getContext())) {
                if (UserManager.isDeviceInDemoMode(getContext())) {
                    mDeviceInDemoMode = true;
                    startDemoMode();
                    startDemoMode();
                }
                }
                break;
                break;
@@ -497,19 +571,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 (!mInjector.isWakeLockHeld()) {
        if (!mIsCarrierDemoMode && !mInjector.isWakeLockHeld()) {
            mInjector.acquireWakeLock();
            mInjector.acquireWakeLock();
        }
        }
        mCurrentUserId = userId;
        mCurrentUserId = userId;
        mInjector.getActivityManagerInternal().updatePersistentConfigurationForUser(
        mInjector.getActivityManagerInternal().updatePersistentConfigurationForUser(
                mInjector.getSystemUsersConfiguration(), userId);
                mInjector.getSystemUsersConfiguration(), userId);

        mInjector.turnOffAllFlashLights(mCameraIdsWithFlash);
        mInjector.turnOffAllFlashLights(mCameraIdsWithFlash);
        muteVolumeStreams();
        muteVolumeStreams();
        if (!mInjector.getWifiManager().isWifiEnabled()) {
        if (!mInjector.getWifiManager().isWifiEnabled()) {
            mInjector.getWifiManager().setWifiEnabled(true);
            mInjector.getWifiManager().setWifiEnabled(true);
        }
        }

        // Disable lock screen for demo users.
        // Disable lock screen for demo users.
        mInjector.getLockPatternUtils().setLockScreenDisabled(true, userId);
        mInjector.getLockPatternUtils().setLockScreenDisabled(true, userId);

        if (!mIsCarrierDemoMode) {
            // Show reset notification (except in carrier demo mode).
            mInjector.getNotificationManager().notifyAsUser(TAG,
            mInjector.getNotificationManager().notifyAsUser(TAG,
                    1, mInjector.createResetNotification(), UserHandle.of(userId));
                    1, mInjector.createResetNotification(), UserHandle.of(userId));


@@ -525,13 +604,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();
@@ -682,7 +762,7 @@ public class RetailDemoModeService extends SystemService {
        }
        }


        boolean isWakeLockHeld() {
        boolean isWakeLockHeld() {
            return mWakeLock.isHeld();
            return mWakeLock != null && mWakeLock.isHeld();
        }
        }


        void acquireWakeLock() {
        void acquireWakeLock() {