blob: 9ed9d28cd96cf7a70b12c21ce2e9c94b876fb0b2 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
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_QS_POSITION;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Intent;
import android.metrics.LogMaker;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Dependency;
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 org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
public class QSTileImplTest extends SysuiTestCase {
public static final int POSITION = 14;
private TestableLooper mTestableLooper;
private TileImpl mTile;
private QSTileHost mHost;
private MetricsLogger mMetricsLogger;
@Before
public void setup() throws Exception {
String spec = "spec";
mTestableLooper = TestableLooper.get(this);
mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
mHost = mock(QSTileHost.class);
when(mHost.indexOf(spec)).thenReturn(POSITION);
mTestableLooper.runWithLooper(() -> {
mTile = new TileImpl(mHost);
mTile.setTileSpec(spec);
});
}
@Test
public void testClick_Metrics() {
mTile.click();
verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK)));
}
@Test
public void testSecondaryClick_Metrics() {
mTile.secondaryClick();
verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK)));
}
@Test
public void testLongClick_Metrics() {
mTile.longClick();
verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_LONG_PRESS)));
}
@Test
public void testPopulate() {
LogMaker maker = mock(LogMaker.class);
when(maker.setSubtype(anyInt())).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));
}
private class TileLogMatcher implements ArgumentMatcher<LogMaker> {
private final int mCategory;
public String mInvalid;
public TileLogMatcher(int category) {
mCategory = category;
}
@Override
public boolean matches(LogMaker arg) {
if (arg.getCategory() != mCategory) {
mInvalid = "Expected category " + mCategory + " but was " + arg.getCategory();
return false;
}
if (arg.getType() != TYPE_ACTION) {
mInvalid = "Expected type " + TYPE_ACTION + " but was " + arg.getType();
return false;
}
if (arg.getSubtype() != mTile.getMetricsCategory()) {
mInvalid = "Expected subtype " + mTile.getMetricsCategory() + " but was "
+ arg.getSubtype();
return false;
}
return true;
}
@Override
public String toString() {
return mInvalid;
}
}
private static class TileImpl extends QSTileImpl<QSTile.BooleanState> {
protected TileImpl(QSHost host) {
super(host);
}
@Override
public BooleanState newTileState() {
return new BooleanState();
}
@Override
protected void handleClick() {
}
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
}
@Override
public int getMetricsCategory() {
return 42;
}
@Override
public Intent getLongClickIntent() {
return null;
}
@Override
protected void setListening(boolean listening) {
}
@Override
public CharSequence getTileLabel() {
return null;
}
}
}