11b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk/*
21b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * Copyright (C) 2017 The Android Open Source Project
31b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk *
41b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
51b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * except in compliance with the License. You may obtain a copy of the License at
61b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk *
71b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
81b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk *
91b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
101b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
111b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * KIND, either express or implied. See the License for the specific language governing
121b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk * permissions and limitations under the License.
131b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk */
141b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
151b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkpackage com.android.systemui.statusbar.policy;
161b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
171b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_NAV_BUTTON_EVENT;
181b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_FLAGS;
191b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_NAV_ACTION;
201b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
211b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport static org.mockito.ArgumentMatchers.argThat;
221b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
231b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport android.metrics.LogMaker;
2425a52b65b2cac1f49f37f4532cfa62282432957aJason Monkimport android.support.test.filters.SmallTest;
251b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport android.testing.AndroidTestingRunner;
261b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport android.testing.TestableLooper;
271b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport android.testing.TestableLooper.RunWithLooper;
281b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport android.view.KeyEvent;
291b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
301b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport com.android.internal.logging.MetricsLogger;
311b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
321b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport com.android.systemui.SysuiTestCase;
331b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
341b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport org.junit.Before;
351b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport org.junit.Test;
361b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport org.junit.runner.RunWith;
371b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport org.mockito.ArgumentMatcher;
381b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport org.mockito.Mockito;
391b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
401b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkimport java.util.Objects;
411b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
421b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk@RunWith(AndroidTestingRunner.class)
431b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk@RunWithLooper
4425a52b65b2cac1f49f37f4532cfa62282432957aJason Monk@SmallTest
451b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monkpublic class KeyButtonViewTest extends SysuiTestCase {
461b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
471b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    private KeyButtonView mKeyButtonView;
481b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    private MetricsLogger mMetricsLogger;
491b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
501b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    @Before
511b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    public void setup() throws Exception {
521b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
531b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        TestableLooper.get(this).runWithLooper(() ->
541b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                mKeyButtonView = new KeyButtonView(mContext, null));
551b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    }
561b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
571b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    @Test
581b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    public void testMetrics() {
591b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        int action = 42;
601b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        int flags = 0x141;
611b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        int code = KeyEvent.KEYCODE_ENTER;
621b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        mKeyButtonView.setCode(code);
631b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        mKeyButtonView.sendEvent(action, flags);
641b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
651b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        Mockito.verify(mMetricsLogger).write(argThat(new ArgumentMatcher<LogMaker>() {
661b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            public String mReason;
671b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
681b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            @Override
691b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            public boolean matches(LogMaker argument) {
701b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                return checkField("category", argument.getCategory(), ACTION_NAV_BUTTON_EVENT)
711b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                        && checkField("type", argument.getType(), MetricsEvent.TYPE_ACTION)
721b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                        && checkField("subtype", argument.getSubtype(), code)
731b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                        && checkField("FIELD_FLAGS", argument.getTaggedData(FIELD_FLAGS), flags)
741b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                        && checkField("FIELD_NAV_ACTION", argument.getTaggedData(FIELD_NAV_ACTION),
751b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                                action);
761b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            }
771b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
781b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            private boolean checkField(String field, Object val, Object val2) {
791b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                if (!Objects.equals(val, val2)) {
801b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                    mReason = "Expected " + field + " " + val2 + " but was " + val;
811b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                    return false;
821b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                }
831b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                return true;
841b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            }
851b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
861b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            @Override
871b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            public String toString() {
881b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk                return mReason;
891b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk            }
901b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk        }));
911b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk    }
921b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk
931b77565a6f702f4e986c195fe7345a7d7ebd31e3Jason Monk}