Add metrics for taskbar 3 button nav

Fixes: 221075063
Test: wwlogcat shows right events,
new events show up on aster dashboard

Change-Id: I3864ac02ea00f281d33ccb26b95a4916bd8b6be9
This commit is contained in:
Vinit Nayak
2022-03-24 12:08:25 -07:00
parent 9818664bd6
commit ddbf5374aa
5 changed files with 157 additions and 3 deletions
@@ -56,6 +56,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.BubbleTextView; 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.Folder;
import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.logger.LauncherAtom; 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.AppInfo;
import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.ItemInfo;
@@ -249,6 +251,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
mDeviceProfile.updateAllAppsIconSize(1, resources); // Leave all apps unscaled. 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 */ /** Creates LayoutParams for adding a view directly to WindowManager as a new window */
public WindowManager.LayoutParams createDefaultWindowLayoutParams() { public WindowManager.LayoutParams createDefaultWindowLayoutParams() {
WindowManager.LayoutParams windowLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams windowLayoutParams = new WindowManager.LayoutParams(
@@ -19,6 +19,7 @@ import android.content.pm.ActivityInfo.Config;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController; import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController;
import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.shared.rotation.RotationButtonController;
@@ -121,6 +122,7 @@ public class TaskbarControllers {
taskbarForceVisibleImmersiveController.init(this); taskbarForceVisibleImmersiveController.init(this);
taskbarAllAppsController.init(this, sharedState); taskbarAllAppsController.init(this, sharedState);
taskbarRecentAppsController.init(this); taskbarRecentAppsController.init(this);
navButtonController.init(this);
mControllersToLog = new LoggableTaskbarController[] { mControllersToLog = new LoggableTaskbarController[] {
taskbarDragController, navButtonController, navbarButtonsViewController, taskbarDragController, navButtonController, navbarButtonsViewController,
@@ -158,6 +160,7 @@ public class TaskbarControllers {
taskbarForceVisibleImmersiveController.onDestroy(); taskbarForceVisibleImmersiveController.onDestroy();
taskbarAllAppsController.onDestroy(); taskbarAllAppsController.onDestroy();
taskbarRecentAppsController.onDestroy(); taskbarRecentAppsController.onDestroy();
navButtonController.onDestroy();
mControllersToLog = null; mControllersToLog = null;
} }
@@ -190,6 +193,12 @@ public class TaskbarControllers {
rotationButtonController.dumpLogs(prefix + "\t", pw); rotationButtonController.dumpLogs(prefix + "\t", pw);
} }
@VisibleForTesting
TaskbarActivityContext getTaskbarActivityContext() {
// Used to mock
return taskbarActivityContext;
}
protected interface LoggableTaskbarController { protected interface LoggableTaskbarController {
void dumpLogs(String prefix, PrintWriter pw); void dumpLogs(String prefix, PrintWriter pw);
} }
@@ -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_HOME_BUTTON_LONG_PRESS;
import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_KEY; 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.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 static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import com.android.launcher3.R; import com.android.launcher3.R;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.testing.TestProtocol;
import com.android.quickstep.OverviewCommandHelper; 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. */ /** 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_THRESHOLD = 200;
static final int SCREEN_PIN_LONG_PRESS_RESET = SCREEN_PIN_LONG_PRESS_THRESHOLD + 100; 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 long mLastScreenPinLongPress;
private boolean mScreenPinned; private boolean mScreenPinned;
@@ -89,6 +102,7 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa
private final TouchInteractionService mService; private final TouchInteractionService mService;
private final SystemUiProxy mSystemUiProxy; private final SystemUiProxy mSystemUiProxy;
private final Handler mHandler; private final Handler mHandler;
@Nullable private StatsLogManager mStatsLogManager;
private final Runnable mResetLongPress = this::resetScreenUnpin; private final Runnable mResetLongPress = this::resetScreenUnpin;
@@ -102,18 +116,23 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa
public void onButtonClick(@TaskbarButton int buttonType) { public void onButtonClick(@TaskbarButton int buttonType) {
switch (buttonType) { switch (buttonType) {
case BUTTON_BACK: case BUTTON_BACK:
logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_TAP);
executeBack(); executeBack();
break; break;
case BUTTON_HOME: case BUTTON_HOME:
logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_TAP);
navigateHome(); navigateHome();
break; break;
case BUTTON_RECENTS: case BUTTON_RECENTS:
logEvent(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP);
navigateToOverview(); navigateToOverview();
break; break;
case BUTTON_IME_SWITCH: case BUTTON_IME_SWITCH:
logEvent(LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_TAP);
showIMESwitcher(); showIMESwitcher();
break; break;
case BUTTON_A11Y: case BUTTON_A11Y:
logEvent(LAUNCHER_TASKBAR_A11Y_BUTTON_TAP);
notifyA11yClick(false /* longClick */); notifyA11yClick(false /* longClick */);
break; break;
case BUTTON_QUICK_SETTINGS: case BUTTON_QUICK_SETTINGS:
@@ -128,15 +147,19 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa
public boolean onButtonLongClick(@TaskbarButton int buttonType) { public boolean onButtonLongClick(@TaskbarButton int buttonType) {
switch (buttonType) { switch (buttonType) {
case BUTTON_HOME: case BUTTON_HOME:
logEvent(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS);
startAssistant(); startAssistant();
return true; return true;
case BUTTON_A11Y: case BUTTON_A11Y:
logEvent(LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS);
notifyA11yClick(true /* longClick */); notifyA11yClick(true /* longClick */);
return true; return true;
case BUTTON_BACK: case BUTTON_BACK:
logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS);
return backRecentsLongpress(buttonType);
case BUTTON_RECENTS: case BUTTON_RECENTS:
mLongPressedButtons |= buttonType; logEvent(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS);
return determineScreenUnpin(); return backRecentsLongpress(buttonType);
case BUTTON_IME_SWITCH: case BUTTON_IME_SWITCH:
default: default:
return false; 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 * Checks if the user has long pressed back and recents buttons
* "together" (within {@link #SCREEN_PIN_LONG_PRESS_THRESHOLD})ms * "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; 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() { private void navigateHome() {
mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME); mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME);
} }
@@ -1,5 +1,11 @@
package com.android.launcher3.taskbar; 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_A11Y;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; 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 com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -19,6 +26,7 @@ import android.os.Handler;
import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4;
import com.android.launcher3.logging.StatsLogManager;
import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.OverviewCommandHelper;
import com.android.quickstep.SystemUiProxy; import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TouchInteractionService; import com.android.quickstep.TouchInteractionService;
@@ -42,6 +50,14 @@ public class TaskbarNavButtonControllerTest {
OverviewCommandHelper mockCommandHelper; OverviewCommandHelper mockCommandHelper;
@Mock @Mock
Handler mockHandler; Handler mockHandler;
@Mock
StatsLogManager mockStatsLogManager;
@Mock
StatsLogManager.StatsLogger mockStatsLogger;
@Mock
TaskbarControllers mockTaskbarControllers;
@Mock
TaskbarActivityContext mockTaskbarActivityContext;
private TaskbarNavButtonController mNavButtonController; private TaskbarNavButtonController mNavButtonController;
@@ -50,6 +66,10 @@ public class TaskbarNavButtonControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mockService.getDisplayId()).thenReturn(DISPLAY_ID); when(mockService.getDisplayId()).thenReturn(DISPLAY_ID);
when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper); when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper);
when(mockStatsLogManager.logger()).thenReturn(mockStatsLogger);
when(mockTaskbarControllers.getTaskbarActivityContext())
.thenReturn(mockTaskbarActivityContext);
doReturn(mockStatsLogManager).when(mockTaskbarActivityContext).getStatsLogManager();
mNavButtonController = new TaskbarNavButtonController(mockService, mNavButtonController = new TaskbarNavButtonController(mockService,
mockSystemUiProxy, mockHandler); mockSystemUiProxy, mockHandler);
} }
@@ -156,4 +176,49 @@ public class TaskbarNavButtonControllerTest {
mNavButtonController.onButtonLongClick(BUTTON_HOME); mNavButtonController.onButtonLongClick(BUTTON_HOME);
verify(mockSystemUiProxy, times(0)).startAssistant(any()); 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);
}
} }
@@ -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 " @UiEvent(doc = "User scrolled on one of the all apps surfaces such as A-Z list, search "
+ "result page etc.") + "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 // ADD MORE