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