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.