18c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk/* 28c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Copyright (C) 2017 The Android Open Source Project 38c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 48c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 58c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * except in compliance with the License. You may obtain a copy of the License at 68c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 78c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * http://www.apache.org/licenses/LICENSE-2.0 88c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 98c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 108c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 118c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * KIND, either express or implied. See the License for the specific language governing 128c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * permissions and limitations under the License. 138c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk */ 148c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 158c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkpackage com.android.systemui.qs.tileimpl; 168c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 178c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK; 188c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS; 198c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK; 208c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION; 218c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE; 228c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION; 238c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 248c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.ArgumentMatchers.anyInt; 258c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.ArgumentMatchers.eq; 268c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.Matchers.argThat; 278c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.Mockito.mock; 288c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.Mockito.verify; 298c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport static org.mockito.Mockito.when; 308c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 318c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport android.content.Intent; 328c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport android.metrics.LogMaker; 3325a52b65b2cac1f49f37f4532cfa62282432957aJason Monkimport android.support.test.filters.SmallTest; 348c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport android.testing.AndroidTestingRunner; 358c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport android.testing.TestableLooper; 368c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport android.testing.TestableLooper.RunWithLooper; 378c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 388c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.internal.logging.MetricsLogger; 398c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.systemui.Dependency; 408c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.systemui.SysuiTestCase; 418c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.systemui.plugins.qs.QSTile; 428c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.systemui.qs.QSHost; 438c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport com.android.systemui.qs.QSTileHost; 448c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 458c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport org.junit.Before; 468c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport org.junit.Test; 478c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport org.junit.runner.RunWith; 488c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkimport org.mockito.ArgumentMatcher; 498c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 508c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk@RunWith(AndroidTestingRunner.class) 518c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk@RunWithLooper 5225a52b65b2cac1f49f37f4532cfa62282432957aJason Monk@SmallTest 538c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkpublic class QSTileImplTest extends SysuiTestCase { 548c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 558c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public static final int POSITION = 14; 568c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private TestableLooper mTestableLooper; 578c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private TileImpl mTile; 588c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private QSTileHost mHost; 598c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private MetricsLogger mMetricsLogger; 608c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 618c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Before 628c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public void setup() throws Exception { 638c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk String spec = "spec"; 648c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTestableLooper = TestableLooper.get(this); 658c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); 668c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); 678c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mHost = mock(QSTileHost.class); 688c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk when(mHost.indexOf(spec)).thenReturn(POSITION); 698c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTestableLooper.runWithLooper(() -> { 708c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile = new TileImpl(mHost); 718c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.setTileSpec(spec); 728c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk }); 738c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 748c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 758c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Test 768c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public void testClick_Metrics() { 778c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.click(); 788c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK))); 798c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 808c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 818c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Test 828c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public void testSecondaryClick_Metrics() { 838c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.secondaryClick(); 848c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK))); 858c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 868c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 878c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Test 888c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public void testLongClick_Metrics() { 898c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.longClick(); 908c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_LONG_PRESS))); 918c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 928c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 938c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Test 948c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public void testPopulate() { 958c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk LogMaker maker = mock(LogMaker.class); 968c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk when(maker.setSubtype(anyInt())).thenReturn(maker); 978c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.getState().value = true; 988c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mTile.populate(maker); 998c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk verify(maker).addTaggedData(eq(FIELD_QS_VALUE), eq(1)); 1008c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk verify(maker).addTaggedData(eq(FIELD_QS_POSITION), eq(POSITION)); 1018c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1028c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1038c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private class TileLogMatcher implements ArgumentMatcher<LogMaker> { 1048c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1058c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private final int mCategory; 1068c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public String mInvalid; 1078c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1088c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public TileLogMatcher(int category) { 1098c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mCategory = category; 1108c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1118c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1128c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1138c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public boolean matches(LogMaker arg) { 1148c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk if (arg.getCategory() != mCategory) { 1158c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mInvalid = "Expected category " + mCategory + " but was " + arg.getCategory(); 1168c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return false; 1178c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1188c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk if (arg.getType() != TYPE_ACTION) { 1198c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mInvalid = "Expected type " + TYPE_ACTION + " but was " + arg.getType(); 1208c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return false; 1218c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1228c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk if (arg.getSubtype() != mTile.getMetricsCategory()) { 1238c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mInvalid = "Expected subtype " + mTile.getMetricsCategory() + " but was " 1248c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk + arg.getSubtype(); 1258c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return false; 1268c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1278c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return true; 1288c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1298c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1308c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1318c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public String toString() { 1328c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return mInvalid; 1338c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1348c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1358c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1368c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk private static class TileImpl extends QSTileImpl<QSTile.BooleanState> { 1378c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk protected TileImpl(QSHost host) { 1388c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk super(host); 1398c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1408c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1418c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1428c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public BooleanState newTileState() { 1438c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return new BooleanState(); 1448c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1458c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1468c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1478c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk protected void handleClick() { 1488c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1498c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1508c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1518c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1528c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk protected void handleUpdateState(BooleanState state, Object arg) { 1538c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1548c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1558c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1568c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1578c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public int getMetricsCategory() { 1588c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return 42; 1598c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1608c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1618c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1628c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public Intent getLongClickIntent() { 1638c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return null; 1648c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1658c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1668c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1678c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk protected void setListening(boolean listening) { 1688c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1698c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1708c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1718c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk @Override 1728c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk public CharSequence getTileLabel() { 1738c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk return null; 1748c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1758c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk } 1768c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk} 177