blob: c3a3e6339daa1a6b7b155ae9ec6b74f36a7246fb [file] [log] [blame]
Evan Laird6b284732017-02-28 17:27:04 -05001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.qs.customize;
16
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040017import static junit.framework.Assert.assertTrue;
Evan Laird6b284732017-02-28 17:27:04 -050018
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050019import static org.hamcrest.Matchers.equalTo;
20import static org.hamcrest.Matchers.is;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040021import static org.junit.Assert.assertFalse;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050022import static org.junit.Assert.assertThat;
23import static org.mockito.ArgumentMatchers.anyString;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040024import static org.mockito.Mockito.any;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050025import static org.mockito.Mockito.atLeastOnce;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040026import static org.mockito.Mockito.doAnswer;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050027import static org.mockito.Mockito.mock;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040028import static org.mockito.Mockito.times;
29import static org.mockito.Mockito.verify;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050030import static org.mockito.Mockito.when;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040031
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050032import android.content.pm.PackageManager;
33import android.provider.Settings;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040034import android.support.test.filters.SmallTest;
Jason Monk340b0e52017-03-08 14:57:56 -050035import android.testing.AndroidTestingRunner;
Jason Monk340b0e52017-03-08 14:57:56 -050036import android.testing.TestableLooper;
37import android.testing.TestableLooper.RunWithLooper;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050038import android.text.TextUtils;
39import android.util.ArraySet;
Jason Monke5b770e2017-03-03 21:49:29 -050040
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040041import com.android.systemui.Dependency;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050042import com.android.systemui.R;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040043import com.android.systemui.SysuiTestCase;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050044import com.android.systemui.plugins.qs.QSTile;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040045import com.android.systemui.qs.QSTileHost;
46
Evan Laird6b284732017-02-28 17:27:04 -050047import org.junit.Before;
48import org.junit.Test;
49import org.junit.runner.RunWith;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050050import org.mockito.ArgumentCaptor;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040051import org.mockito.Mock;
52import org.mockito.MockitoAnnotations;
Evan Laird6b284732017-02-28 17:27:04 -050053
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040054import java.util.ArrayList;
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050055import java.util.Arrays;
56import java.util.List;
57import java.util.Set;
Jason Monke5b770e2017-03-03 21:49:29 -050058
Evan Laird6b284732017-02-28 17:27:04 -050059@SmallTest
Jason Monk340b0e52017-03-08 14:57:56 -050060@RunWith(AndroidTestingRunner.class)
Evan Laird6b284732017-02-28 17:27:04 -050061@RunWithLooper
62public class TileQueryHelperTest extends SysuiTestCase {
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050063 private static final String CURRENT_TILES = "wifi,dnd,nfc";
64 private static final String ONLY_STOCK_TILES = "wifi,dnd";
65 private static final String WITH_OTHER_TILES = "wifi,dnd,other";
66 // Note no nfc in stock tiles
67 private static final String STOCK_TILES = "wifi,dnd,cell,battery";
68 private static final String ALL_TILES = "wifi,dnd,nfc,cell,battery";
69 private static final Set<String> FACTORY_TILES = new ArraySet<>();
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040070
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050071 static {
72 FACTORY_TILES.addAll(Arrays.asList(
73 new String[]{"wifi", "bt", "cell", "dnd", "inversion", "airplane", "work",
74 "rotation", "flashlight", "location", "cast", "hotspot", "user", "battery",
75 "saver", "night", "nfc"}));
76 }
77
78 @Mock
79 private TileQueryHelper.TileStateListener mListener;
80 @Mock
81 private QSTileHost mQSTileHost;
82 @Mock
83 private PackageManager mPackageManager;
84
85 private QSTile.State mState;
Evan Laird6b284732017-02-28 17:27:04 -050086 private TestableLooper mBGLooper;
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040087 private TileQueryHelper mTileQueryHelper;
Evan Laird6b284732017-02-28 17:27:04 -050088
89 @Before
90 public void setup() {
Amin Shaikhc5b1bc82018-03-21 08:13:47 -040091 MockitoAnnotations.initMocks(this);
Evan Laird6b284732017-02-28 17:27:04 -050092 mBGLooper = TestableLooper.get(this);
Jason Monk340b0e52017-03-08 14:57:56 -050093 mDependency.injectTestDependency(Dependency.BG_LOOPER, mBGLooper.getLooper());
Fabian Kozynskibb3ff872018-11-16 14:51:44 -050094 mContext.setMockPackageManager(mPackageManager);
95
96 mState = new QSTile.State();
97 doAnswer(invocation -> {
98 String spec = (String) invocation.getArguments()[0];
99 if (FACTORY_TILES.contains(spec)) {
100 QSTile m = mock(QSTile.class);
101 when(m.isAvailable()).thenReturn(true);
102 when(m.getTileSpec()).thenReturn(spec);
103 when(m.getState()).thenReturn(mState);
104 return m;
105 } else {
106 return null;
107 }
108 }
109 ).when(mQSTileHost).createTile(anyString());
110
Amin Shaikhc5b1bc82018-03-21 08:13:47 -0400111 mTileQueryHelper = new TileQueryHelper(mContext, mListener);
Evan Laird6b284732017-02-28 17:27:04 -0500112 }
113
114 @Test
Amin Shaikhc5b1bc82018-03-21 08:13:47 -0400115 public void testIsFinished_falseBeforeQuerying() {
116 assertFalse(mTileQueryHelper.isFinished());
Evan Laird6b284732017-02-28 17:27:04 -0500117 }
118
119 @Test
Amin Shaikhc5b1bc82018-03-21 08:13:47 -0400120 public void testIsFinished_trueAfterQuerying() {
121 mTileQueryHelper.queryTiles(mQSTileHost);
Evan Laird6b284732017-02-28 17:27:04 -0500122
Evan Laird6b284732017-02-28 17:27:04 -0500123 mBGLooper.processAllMessages();
Amin Shaikhc5b1bc82018-03-21 08:13:47 -0400124 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
125
126 assertTrue(mTileQueryHelper.isFinished());
127 }
128
129 @Test
130 public void testQueryTiles_callsListenerTwice() {
131 mTileQueryHelper.queryTiles(mQSTileHost);
132
133 mBGLooper.processAllMessages();
134 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
135
136 verify(mListener, times(2)).onTilesChanged(any());
137 }
138
139 @Test
140 public void testQueryTiles_isFinishedFalseOnListenerCalls_thenTrueAfterCompletion() {
141 doAnswer(invocation -> {
142 assertFalse(mTileQueryHelper.isFinished());
143 return null;
144 }).when(mListener).onTilesChanged(any());
145
146 mTileQueryHelper.queryTiles(mQSTileHost);
147
148 mBGLooper.processAllMessages();
149 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
150
151 assertTrue(mTileQueryHelper.isFinished());
Evan Laird6b284732017-02-28 17:27:04 -0500152 }
Fabian Kozynskibb3ff872018-11-16 14:51:44 -0500153
154 @Test
155 public void testQueryTiles_correctTilesAndOrderOnlyStockTiles() {
156 ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
157
158 Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
159 ONLY_STOCK_TILES);
160 mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
161 STOCK_TILES);
162
163 mTileQueryHelper.queryTiles(mQSTileHost);
164
165 mBGLooper.processAllMessages();
166 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
167
168 verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
169 List<String> specs = new ArrayList<>();
170 for (TileQueryHelper.TileInfo t : captor.getValue()) {
171 specs.add(t.spec);
172 }
173 String tiles = TextUtils.join(",", specs);
174 assertThat(tiles, is(equalTo(STOCK_TILES)));
175 }
176
177 @Test
178 public void testQueryTiles_correctTilesAndOrderOtherFactoryTiles() {
179 ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
180
181 Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
182 CURRENT_TILES);
183 mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
184 STOCK_TILES);
185
186 mTileQueryHelper.queryTiles(mQSTileHost);
187
188 mBGLooper.processAllMessages();
189 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
190
191 verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
192 List<String> specs = new ArrayList<>();
193 for (TileQueryHelper.TileInfo t : captor.getValue()) {
194 specs.add(t.spec);
195 }
196 String tiles = TextUtils.join(",", specs);
197 assertThat(tiles, is(equalTo(ALL_TILES)));
198 }
199
200 @Test
201 public void testQueryTiles_otherTileNotIncluded() {
202 ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
203
204 Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
205 WITH_OTHER_TILES);
206 mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
207 STOCK_TILES);
208
209 mTileQueryHelper.queryTiles(mQSTileHost);
210
211 mBGLooper.processAllMessages();
212 waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
213
214 verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
215 List<String> specs = new ArrayList<>();
216 for (TileQueryHelper.TileInfo t : captor.getValue()) {
217 specs.add(t.spec);
218 }
219 assertFalse(specs.contains("other"));
220 }
Fabian Kozynski565f2582018-12-19 17:39:53 -0500221
222 @Test
223 public void testQueryTiles_nullSetting() {
224 Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, null);
225 mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
226 STOCK_TILES);
227 mTileQueryHelper.queryTiles(mQSTileHost);
228 }
Evan Laird6b284732017-02-28 17:27:04 -0500229}