From 26b6b577b94968a678fd669de5153f5917f61547 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Thu, 24 Mar 2022 12:08:25 -0700 Subject: [PATCH] Add metrics for taskbar 3 button nav Fixes: 221075063 Test: wwlogcat shows right events, new events show up on aster dashboard Change-Id: I3864ac02ea00f281d33ccb26b95a4916bd8b6be9 Merged-In: I3864ac02ea00f281d33ccb26b95a4916bd8b6be9 --- .../taskbar/TaskbarActivityContext.java | 9 +++ .../launcher3/taskbar/TaskbarControllers.java | 9 +++ .../taskbar/TaskbarNavButtonController.java | 48 +++++++++++++- .../TaskbarNavButtonControllerTest.java | 65 +++++++++++++++++++ .../launcher3/logging/StatsLogManager.java | 29 ++++++++- 5 files changed, 157 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 5479664cf9..1c6d4a2992 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -56,6 +56,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; @@ -66,6 +67,7 @@ import com.android.launcher3.dot.DotInfo; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.logger.LauncherAtom; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.ItemInfo; @@ -244,6 +246,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mDeviceProfile.updateAllAppsIconSize(1, resources); // Leave all apps unscaled. } + @VisibleForTesting + @Override + public StatsLogManager getStatsLogManager() { + // Used to mock, can't mock a default interface method directly + return super.getStatsLogManager(); + } + /** Creates LayoutParams for adding a view directly to WindowManager as a new window */ public WindowManager.LayoutParams createDefaultWindowLayoutParams() { WindowManager.LayoutParams windowLayoutParams = new WindowManager.LayoutParams( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index a5999ccaac..a3586396ea 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -19,6 +19,7 @@ import android.content.pm.ActivityInfo.Config; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController; import com.android.systemui.shared.rotation.RotationButtonController; @@ -117,6 +118,7 @@ public class TaskbarControllers { taskbarPopupController.init(this); taskbarForceVisibleImmersiveController.init(this); taskbarAllAppsController.init(this, sharedState); + navButtonController.init(this); mControllersToLog = new LoggableTaskbarController[] { taskbarDragController, navButtonController, navbarButtonsViewController, @@ -153,6 +155,7 @@ public class TaskbarControllers { taskbarPopupController.onDestroy(); taskbarForceVisibleImmersiveController.onDestroy(); taskbarAllAppsController.onDestroy(); + navButtonController.onDestroy(); mControllersToLog = null; } @@ -185,6 +188,12 @@ public class TaskbarControllers { rotationButtonController.dumpLogs(prefix + "\t", pw); } + @VisibleForTesting + TaskbarActivityContext getTaskbarActivityContext() { + // Used to mock + return taskbarActivityContext; + } + protected interface LoggableTaskbarController { void dumpLogs(String prefix, PrintWriter pw); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java index 958598dc61..4ff0649440 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java @@ -19,15 +19,27 @@ package com.android.launcher3.taskbar; import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS; import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_KEY; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_A11Y_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import android.os.Bundle; import android.os.Handler; +import android.util.Log; import androidx.annotation.IntDef; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.android.launcher3.R; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.TestProtocol; import com.android.quickstep.OverviewCommandHelper; @@ -49,6 +61,7 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa /** Allow some time in between the long press for back and recents. */ static final int SCREEN_PIN_LONG_PRESS_THRESHOLD = 200; static final int SCREEN_PIN_LONG_PRESS_RESET = SCREEN_PIN_LONG_PRESS_THRESHOLD + 100; + private static final String TAG = TaskbarNavButtonController.class.getSimpleName(); private long mLastScreenPinLongPress; private boolean mScreenPinned; @@ -89,6 +102,7 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa private final TouchInteractionService mService; private final SystemUiProxy mSystemUiProxy; private final Handler mHandler; + @Nullable private StatsLogManager mStatsLogManager; private final Runnable mResetLongPress = this::resetScreenUnpin; @@ -102,18 +116,23 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa public void onButtonClick(@TaskbarButton int buttonType) { switch (buttonType) { case BUTTON_BACK: + logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_TAP); executeBack(); break; case BUTTON_HOME: + logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); navigateHome(); break; case BUTTON_RECENTS: + logEvent(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP); navigateToOverview(); break; case BUTTON_IME_SWITCH: + logEvent(LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_TAP); showIMESwitcher(); break; case BUTTON_A11Y: + logEvent(LAUNCHER_TASKBAR_A11Y_BUTTON_TAP); notifyA11yClick(false /* longClick */); break; case BUTTON_QUICK_SETTINGS: @@ -128,15 +147,19 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa public boolean onButtonLongClick(@TaskbarButton int buttonType) { switch (buttonType) { case BUTTON_HOME: + logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); startAssistant(); return true; case BUTTON_A11Y: + logEvent(LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS); notifyA11yClick(true /* longClick */); return true; case BUTTON_BACK: + logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS); + return backRecentsLongpress(buttonType); case BUTTON_RECENTS: - mLongPressedButtons |= buttonType; - return determineScreenUnpin(); + logEvent(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS); + return backRecentsLongpress(buttonType); case BUTTON_IME_SWITCH: default: return false; @@ -164,6 +187,11 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa } } + private boolean backRecentsLongpress(@TaskbarButton int buttonType) { + mLongPressedButtons |= buttonType; + return determineScreenUnpin(); + } + /** * Checks if the user has long pressed back and recents buttons * "together" (within {@link #SCREEN_PIN_LONG_PRESS_THRESHOLD})ms @@ -210,6 +238,22 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa mScreenPinned = (sysuiFlags & SYSUI_STATE_SCREEN_PINNING) != 0; } + public void init(TaskbarControllers taskbarControllers) { + mStatsLogManager = taskbarControllers.getTaskbarActivityContext().getStatsLogManager(); + } + + public void onDestroy() { + mStatsLogManager = null; + } + + private void logEvent(StatsLogManager.LauncherEvent event) { + if (mStatsLogManager == null) { + Log.w(TAG, "No stats log manager to log taskbar button event"); + return; + } + mStatsLogManager.logger().log(event); + } + private void navigateHome() { mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME); } diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java index ba1a60dd38..d8be30728e 100644 --- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java +++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java @@ -1,5 +1,11 @@ package com.android.launcher3.taskbar; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_TAP; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; @@ -11,6 +17,7 @@ import static com.android.quickstep.OverviewCommandHelper.TYPE_TOGGLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -19,6 +26,7 @@ import android.os.Handler; import androidx.test.runner.AndroidJUnit4; +import com.android.launcher3.logging.StatsLogManager; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TouchInteractionService; @@ -42,6 +50,14 @@ public class TaskbarNavButtonControllerTest { OverviewCommandHelper mockCommandHelper; @Mock Handler mockHandler; + @Mock + StatsLogManager mockStatsLogManager; + @Mock + StatsLogManager.StatsLogger mockStatsLogger; + @Mock + TaskbarControllers mockTaskbarControllers; + @Mock + TaskbarActivityContext mockTaskbarActivityContext; private TaskbarNavButtonController mNavButtonController; @@ -50,6 +66,10 @@ public class TaskbarNavButtonControllerTest { MockitoAnnotations.initMocks(this); when(mockService.getDisplayId()).thenReturn(DISPLAY_ID); when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper); + when(mockStatsLogManager.logger()).thenReturn(mockStatsLogger); + when(mockTaskbarControllers.getTaskbarActivityContext()) + .thenReturn(mockTaskbarActivityContext); + doReturn(mockStatsLogManager).when(mockTaskbarActivityContext).getStatsLogManager(); mNavButtonController = new TaskbarNavButtonController(mockService, mockSystemUiProxy, mockHandler); } @@ -156,4 +176,49 @@ public class TaskbarNavButtonControllerTest { mNavButtonController.onButtonLongClick(BUTTON_HOME); verify(mockSystemUiProxy, times(0)).startAssistant(any()); } + + @Test + public void testNoCallsToNullLogger() { + mNavButtonController.onButtonClick(BUTTON_HOME); + verify(mockStatsLogManager, times(0)).logger(); + verify(mockStatsLogger, times(0)).log(any()); + } + + @Test + public void testNoCallsAfterNullingOut() { + mNavButtonController.init(mockTaskbarControllers); + mNavButtonController.onButtonClick(BUTTON_HOME); + mNavButtonController.onDestroy(); + mNavButtonController.onButtonClick(BUTTON_HOME); + verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); + verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); + } + + @Test + public void testLogOnTap() { + mNavButtonController.init(mockTaskbarControllers); + mNavButtonController.onButtonClick(BUTTON_HOME); + verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); + verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); + } + + @Test + public void testLogOnLongpress() { + mNavButtonController.init(mockTaskbarControllers); + mNavButtonController.onButtonLongClick(BUTTON_HOME); + verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); + verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); + } + + @Test + public void testBackOverviewLogOnLongpress() { + mNavButtonController.init(mockTaskbarControllers); + mNavButtonController.onButtonLongClick(BUTTON_RECENTS); + verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS); + verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP); + + mNavButtonController.onButtonLongClick(BUTTON_BACK); + verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS); + verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_BACK_BUTTON_TAP); + } } diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index e6dc21e09c..b8ecec1541 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -552,7 +552,34 @@ public class StatsLogManager implements ResourceBasedOverride { @UiEvent(doc = "User scrolled on one of the all apps surfaces such as A-Z list, search " + "result page etc.") - LAUNCHER_ALLAPPS_SCROLLED(985); + LAUNCHER_ALLAPPS_SCROLLED(985), + + @UiEvent(doc = "User tapped taskbar home button") + LAUNCHER_TASKBAR_HOME_BUTTON_TAP(1003), + + @UiEvent(doc = "User tapped taskbar back button") + LAUNCHER_TASKBAR_BACK_BUTTON_TAP(1004), + + @UiEvent(doc = "User tapped taskbar overview/recents button") + LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP(1005), + + @UiEvent(doc = "User tapped taskbar IME switcher button") + LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_TAP(1006), + + @UiEvent(doc = "User tapped taskbar a11y button") + LAUNCHER_TASKBAR_A11Y_BUTTON_TAP(1007), + + @UiEvent(doc = "User tapped taskbar home button") + LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS(1008), + + @UiEvent(doc = "User tapped taskbar back button") + LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS(1009), + + @UiEvent(doc = "User tapped taskbar overview/recents button") + LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS(1010), + + @UiEvent(doc = "User tapped taskbar a11y button") + LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS(1011); // ADD MORE