From 9b03367ad261cd3cc8f99056a7f417f855458c14 Mon Sep 17 00:00:00 2001 From: Susi Kharraz-Post Date: Wed, 28 Nov 2018 08:14:07 -0500 Subject: [PATCH] Add Status Bar State to QS click log This is adding the StatusBarState to the tron logs for QS click to answer the question if the quick setting was clicked from lockscreen. The currently available states are SHADE = 0 KEYGUARD = 1 SHADE_LOCKED = 2 FULLSCREEN_USER_SWITCHER = 3 For descriptions see StatusBarState.java Bug: 110157820 Test: added unit test and tested manually Change-Id: Ibcadebc737a0d71b51e764ee2d3fd4ddb5f7ef3a --- .../systemui/qs/tileimpl/QSTileImpl.java | 22 ++++++-- .../systemui/qs/tileimpl/QSTileImplTest.java | 55 ++++++++++++++++++- .../metrics_constants/metrics_constants.proto | 12 ++++ 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 451297bbd7e41..cc27135ce1e17 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -17,9 +17,10 @@ package com.android.systemui.qs.tileimpl; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CONTEXT; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_IS_FULL_QS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_BAR_STATE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -52,6 +53,7 @@ import com.android.systemui.plugins.qs.QSTile.State; import com.android.systemui.qs.PagedTileLayout.TilePage; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QuickStatusBarHeader; +import com.android.systemui.statusbar.StatusBarStateController; import java.util.ArrayList; @@ -61,6 +63,8 @@ import java.util.ArrayList; * State management done on a looper provided by the host. Tiles should update state in * handleUpdateState. Callbacks affecting state should use refreshState to trigger another * state update pass on tile looper. + * + * @param see above */ public abstract class QSTileImpl implements QSTile { protected final String TAG = "Tile." + getClass().getSimpleName(); @@ -76,6 +80,8 @@ public abstract class QSTileImpl implements QSTile { protected final Handler mUiHandler = new Handler(Looper.getMainLooper()); private final ArraySet mListeners = new ArraySet<>(); private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); + private final StatusBarStateController + mStatusBarStateController = Dependency.get(StatusBarStateController.class); private final ArrayList mCallbacks = new ArrayList<>(); private final Object mStaleListener = new Object(); @@ -172,17 +178,23 @@ public abstract class QSTileImpl implements QSTile { } public void click() { - mMetricsLogger.write(populate(new LogMaker(ACTION_QS_CLICK).setType(TYPE_ACTION))); + mMetricsLogger.write(populate(new LogMaker(ACTION_QS_CLICK).setType(TYPE_ACTION) + .addTaggedData(FIELD_STATUS_BAR_STATE, + mStatusBarStateController.getState()))); mHandler.sendEmptyMessage(H.CLICK); } public void secondaryClick() { - mMetricsLogger.write(populate(new LogMaker(ACTION_QS_SECONDARY_CLICK).setType(TYPE_ACTION))); + mMetricsLogger.write(populate(new LogMaker(ACTION_QS_SECONDARY_CLICK).setType(TYPE_ACTION) + .addTaggedData(FIELD_STATUS_BAR_STATE, + mStatusBarStateController.getState()))); mHandler.sendEmptyMessage(H.SECONDARY_CLICK); } public void longClick() { - mMetricsLogger.write(populate(new LogMaker(ACTION_QS_LONG_PRESS).setType(TYPE_ACTION))); + mMetricsLogger.write(populate(new LogMaker(ACTION_QS_LONG_PRESS).setType(TYPE_ACTION) + .addTaggedData(FIELD_STATUS_BAR_STATE, + mStatusBarStateController.getState()))); mHandler.sendEmptyMessage(H.LONG_CLICK); Prefs.putInt( @@ -196,7 +208,7 @@ public abstract class QSTileImpl implements QSTile { logMaker.addTaggedData(FIELD_QS_VALUE, ((BooleanState) mState).value ? 1 : 0); } return logMaker.setSubtype(getMetricsCategory()) - .addTaggedData(FIELD_CONTEXT, mIsFullQs) + .addTaggedData(FIELD_IS_FULL_QS, mIsFullQs) .addTaggedData(FIELD_QS_POSITION, mHost.indexOf(mTileSpec)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index 676463407f3ff..e5464e0343f43 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -19,8 +19,10 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_STATUS_BAR_STATE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION; +import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -37,7 +39,6 @@ import static java.lang.Thread.sleep; import android.content.Intent; import android.metrics.LogMaker; import android.support.test.filters.SmallTest; -import android.support.test.InstrumentationRegistry; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -48,12 +49,17 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.StatusBarStateController; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @RunWithLooper @@ -65,13 +71,20 @@ public class QSTileImplTest extends SysuiTestCase { private TileImpl mTile; private QSTileHost mHost; private MetricsLogger mMetricsLogger; + private StatusBarStateController mStatusBarStateController; + + @Captor + private ArgumentCaptor mLogCaptor; @Before public void setup() throws Exception { + MockitoAnnotations.initMocks(this); String spec = "spec"; mTestableLooper = TestableLooper.get(this); mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); + mStatusBarStateController = + mDependency.injectMockDependency(StatusBarStateController.class); mHost = mock(QSTileHost.class); when(mHost.indexOf(spec)).thenReturn(POSITION); when(mHost.getContext()).thenReturn(mContext.getBaseContext()); @@ -87,12 +100,30 @@ public class QSTileImplTest extends SysuiTestCase { verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK))); } + @Test + public void testClick_Metrics_Status_Bar_Status() { + when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); + mTile.click(); + verify(mMetricsLogger).write(mLogCaptor.capture()); + assertEquals(StatusBarState.SHADE, mLogCaptor.getValue() + .getTaggedData(FIELD_STATUS_BAR_STATE)); + } + @Test public void testSecondaryClick_Metrics() { mTile.secondaryClick(); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK))); } + @Test + public void testSecondaryClick_Metrics_Status_Bar_Status() { + when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); + mTile.secondaryClick(); + verify(mMetricsLogger).write(mLogCaptor.capture()); + assertEquals(StatusBarState.KEYGUARD, mLogCaptor.getValue() + .getTaggedData(FIELD_STATUS_BAR_STATE)); + } + @Test public void testLongClick_Metrics() { mTile.longClick(); @@ -100,7 +131,27 @@ public class QSTileImplTest extends SysuiTestCase { } @Test - public void testPopulate() { + public void testLongClick_Metrics_Status_Bar_Status() { + when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED); + mTile.click(); + verify(mMetricsLogger).write(mLogCaptor.capture()); + assertEquals(StatusBarState.SHADE_LOCKED, mLogCaptor.getValue() + .getTaggedData(FIELD_STATUS_BAR_STATE)); + } + + @Test + public void testPopulateWithLockedScreen() { + LogMaker maker = mock(LogMaker.class); + when(maker.setSubtype(anyInt())).thenReturn(maker); + when(maker.addTaggedData(anyInt(), any())).thenReturn(maker); + mTile.getState().value = true; + mTile.populate(maker); + verify(maker).addTaggedData(eq(FIELD_QS_VALUE), eq(1)); + verify(maker).addTaggedData(eq(FIELD_QS_POSITION), eq(POSITION)); + } + + @Test + public void testPopulateWithUnlockedScreen() { LogMaker maker = mock(LogMaker.class); when(maker.setSubtype(anyInt())).thenReturn(maker); when(maker.addTaggedData(anyInt(), any())).thenReturn(maker); diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index 89220d5f836ac..dec0c291fb229 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -6609,6 +6609,18 @@ message MetricsEvent { // OS: Q DIALOG_DISABLE_DEVELOPMENT_OPTIONS = 1591; + // Tag for an ACTION: QS -> Tile click / Secondary click / long press + // indicating the StatusBarState when menu was pulled down + // CATEGORY: QUICK_SETTINGS + // OS: Q + FIELD_STATUS_BAR_STATE = 1592; + + // Tag for an ACTION: QS -> Tile click / Secondary click / long press + // indicating whether current state is full QS + // CATEGORY: QUICK_SETTINGS + // OS: Q + FIELD_IS_FULL_QS = 1593; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line.