From b75fc2b2b7ec5e3d8f45bcd9c7078ec0a8c143fe Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 22 Jun 2016 15:50:06 -0700 Subject: [PATCH] Add tron logging for retail demo session counters Count each demo user creation and time between first touch (to dismiss the video) and the start of inactivity timeout. Fixed an NPE in SysUI when user switcher is missing. Bug: 29540372 Change-Id: I7bc0e0dde75e7b213a025683c15c9b3e750643a9 --- cmds/pm/src/com/android/commands/pm/Pm.java | 2 + .../phone/KeyguardStatusBarView.java | 3 +- .../retaildemo/RetailDemoModeService.java | 78 +++++++++++++++---- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index c6834f9405547..32a8088e9c4e6 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -922,6 +922,8 @@ public final class Pm { flags |= UserInfo.FLAG_EPHEMERAL; } else if ("--guest".equals(opt)) { flags |= UserInfo.FLAG_GUEST; + } else if ("--demo".equals(opt)) { + flags |= UserInfo.FLAG_DEMO; } else { System.err.println("Error: unknown option " + opt); return showUsage(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index d5ff0b356d6db..42f398d8d83f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -153,7 +153,8 @@ public class KeyguardStatusBarView extends RelativeLayout if (mKeyguardUserSwitcher == null) { // If we have no keyguard switcher, the screen width is under 600dp. In this case, // we don't show the multi-user avatar unless there is more than 1 user on the device. - if (mUserSwitcherController.getSwitchableUserCount() > 1) { + if (mUserSwitcherController != null + && mUserSwitcherController.getSwitchableUserCount() > 1) { mMultiUserSwitch.setVisibility(View.VISIBLE); } else { mMultiUserSwitch.setVisibility(View.GONE); diff --git a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java index 96e6da741a822..51b1e38237a18 100644 --- a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java +++ b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java @@ -55,6 +55,8 @@ import android.provider.Settings; import android.util.Slog; import com.android.internal.os.BackgroundThread; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.logging.MetricsLogger; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.ServiceThread; @@ -86,8 +88,12 @@ public class RetailDemoModeService extends SystemService { AudioSystem.STREAM_MUSIC }; + // Tron Vars + private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; + private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; + boolean mDeviceInDemoMode = false; - int mCurrentUserId; + int mCurrentUserId = UserHandle.USER_SYSTEM; private ActivityManagerService mAms; private ActivityManagerInternal mAmi; private AudioManager mAudioManager; @@ -102,6 +108,15 @@ public class RetailDemoModeService extends SystemService { private String[] mCameraIdsWithFlash; private Configuration mPrimaryUserConfiguration; + final Object mActivityLock = new Object(); + // Whether the newly created demo user has interacted with the screen yet + @GuardedBy("mActivityLock") + boolean mUserUntouched; + @GuardedBy("mActivityLock") + long mFirstUserActivityTime; + @GuardedBy("mActivityLock") + long mLastUserActivityTime; + private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -136,18 +151,7 @@ public class RetailDemoModeService extends SystemService { mWakeLock.acquire(); break; case MSG_INACTIVITY_TIME_OUT: - final IPackageManager pm = AppGlobals.getPackageManager(); - int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; - String demoLauncherComponent = getContext().getResources() - .getString(R.string.config_demoModeLauncherComponent); - try { - enabledState = pm.getComponentEnabledSetting( - ComponentName.unflattenFromString(demoLauncherComponent), - mCurrentUserId); - } catch (RemoteException exc) { - Slog.e(TAG, "Unable to talk to Package Manager", exc); - } - if (enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { + if (isDemoLauncherDisabled()) { Slog.i(TAG, "User inactivity timeout reached"); showInactivityCountdownDialog(); } @@ -158,6 +162,9 @@ public class RetailDemoModeService extends SystemService { } removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_INACTIVITY_TIME_OUT); + if (mCurrentUserId != UserHandle.USER_SYSTEM) { + logSessionDuration(); + } final UserInfo demoUser = getUserManager().createUser(DEMO_USER_NAME, UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); if (demoUser != null) { @@ -190,6 +197,9 @@ public class RetailDemoModeService extends SystemService { public RetailDemoModeService(Context context) { super(context); + synchronized (mActivityLock) { + mFirstUserActivityTime = mLastUserActivityTime = SystemClock.uptimeMillis(); + } } private Notification createResetNotification() { @@ -213,6 +223,21 @@ public class RetailDemoModeService extends SystemService { return mResetDemoPendingIntent; } + boolean isDemoLauncherDisabled() { + IPackageManager pm = AppGlobals.getPackageManager(); + int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + String demoLauncherComponent = getContext().getResources() + .getString(R.string.config_demoModeLauncherComponent); + try { + enabledState = pm.getComponentEnabledSetting( + ComponentName.unflattenFromString(demoLauncherComponent), + mCurrentUserId); + } catch (RemoteException exc) { + Slog.e(TAG, "Unable to talk to Package Manager", exc); + } + return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; + } + private void setupDemoUser(UserInfo userInfo) { UserManager um = getUserManager(); UserHandle user = UserHandle.of(userInfo.id); @@ -226,6 +251,14 @@ public class RetailDemoModeService extends SystemService { Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); } + void logSessionDuration() { + final int sessionDuration; + synchronized (mActivityLock) { + sessionDuration = (int) ((mLastUserActivityTime - mFirstUserActivityTime) / 1000); + } + MetricsLogger.count(getContext(), DEMO_SESSION_DURATION, sessionDuration); + } + private ActivityManagerService getActivityManager() { if (mAms == null) { mAms = (ActivityManagerService) ActivityManagerNative.getDefault(); @@ -395,11 +428,15 @@ public class RetailDemoModeService extends SystemService { turnOffAllFlashLights(); muteVolumeStreams(); mAmi.updatePersistentConfigurationForUser(getPrimaryUsersConfiguration(), userId); + synchronized (mActivityLock) { + mUserUntouched = true; + } + MetricsLogger.count(getContext(), DEMO_SESSION_COUNT, 1); + mHandler.removeMessages(MSG_INACTIVITY_TIME_OUT); } private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { private static final long USER_ACTIVITY_DEBOUNCE_TIME = 2000; - private long mLastUserActivityTime = 0; @Override public void onUserActivity() { @@ -407,10 +444,17 @@ public class RetailDemoModeService extends SystemService { return; } long timeOfActivity = SystemClock.uptimeMillis(); - if (timeOfActivity < mLastUserActivityTime + USER_ACTIVITY_DEBOUNCE_TIME) { - return; + synchronized (mActivityLock) { + if (timeOfActivity < mLastUserActivityTime + USER_ACTIVITY_DEBOUNCE_TIME) { + return; + } + mLastUserActivityTime = timeOfActivity; + if (mUserUntouched && isDemoLauncherDisabled()) { + Slog.d(TAG, "retail_demo first touch"); + mUserUntouched = false; + mFirstUserActivityTime = timeOfActivity; + } } - mLastUserActivityTime = timeOfActivity; mHandler.removeMessages(MSG_INACTIVITY_TIME_OUT); mHandler.sendEmptyMessageDelayed(MSG_INACTIVITY_TIME_OUT, USER_INACTIVITY_TIMEOUT); }