blob: 3acca2a7ef75a0b2f13d29679c208521c108e42f [file] [log] [blame]
tmfang2badb3e2018-12-10 00:25:02 +08001/*
tmfangd8551b12018-12-21 19:53:17 +08002 * Copyright (C) 2019 The Android Open Source Project
tmfang2badb3e2018-12-10 00:25:02 +08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settingslib.widget;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import android.content.Context;
22import android.graphics.drawable.Drawable;
tmfang4a2cd662019-02-14 14:02:14 +080023import android.text.TextUtils;
tmfang2badb3e2018-12-10 00:25:02 +080024import android.view.View;
25import android.widget.TextView;
26
27import androidx.preference.PreferenceViewHolder;
28
29import org.junit.Before;
tmfangd8551b12018-12-21 19:53:17 +080030import org.junit.Rule;
tmfang2badb3e2018-12-10 00:25:02 +080031import org.junit.Test;
tmfangd8551b12018-12-21 19:53:17 +080032import org.junit.rules.ExpectedException;
tmfang2badb3e2018-12-10 00:25:02 +080033import org.junit.runner.RunWith;
34import org.robolectric.RobolectricTestRunner;
35import org.robolectric.RuntimeEnvironment;
36
37@RunWith(RobolectricTestRunner.class)
38public class BarChartPreferenceTest {
39
tmfangd8551b12018-12-21 19:53:17 +080040 @Rule
41 public final ExpectedException thrown = ExpectedException.none();
42
tmfang2badb3e2018-12-10 00:25:02 +080043 private Context mContext;
44 private View mBarChartView;
45 private Drawable mIcon;
46 private BarView mBarView1;
47 private BarView mBarView2;
48 private BarView mBarView3;
49 private BarView mBarView4;
tmfang4a2cd662019-02-14 14:02:14 +080050 private TextView mTitleView;
Joel Galenson919f6ea42018-12-20 15:09:47 -080051 private TextView mDetailsView;
tmfang2badb3e2018-12-10 00:25:02 +080052 private PreferenceViewHolder mHolder;
53 private BarChartPreference mPreference;
tmfangd8551b12018-12-21 19:53:17 +080054 private BarChartInfo mBarChartInfo;
tmfang2badb3e2018-12-10 00:25:02 +080055
56 @Before
57 public void setUp() {
58 mContext = RuntimeEnvironment.application;
59 mBarChartView = View.inflate(mContext, R.layout.settings_bar_chart, null /* parent */);
60 mHolder = PreferenceViewHolder.createInstanceForTests(mBarChartView);
61 mPreference = new BarChartPreference(mContext, null /* attrs */);
tmfang2badb3e2018-12-10 00:25:02 +080062
Amin Shaikh10f363b2019-01-24 17:59:49 -050063 mIcon = mContext.getDrawable(com.android.internal.R.drawable.ic_menu);
tmfangd8551b12018-12-21 19:53:17 +080064 mBarView1 = mBarChartView.findViewById(R.id.bar_view1);
65 mBarView2 = mBarChartView.findViewById(R.id.bar_view2);
66 mBarView3 = mBarChartView.findViewById(R.id.bar_view3);
67 mBarView4 = mBarChartView.findViewById(R.id.bar_view4);
tmfang4a2cd662019-02-14 14:02:14 +080068 mTitleView = mBarChartView.findViewById(R.id.bar_chart_title);
tmfangd8551b12018-12-21 19:53:17 +080069 mDetailsView = mBarChartView.findViewById(R.id.bar_chart_details);
70
71 mBarChartInfo = new BarChartInfo.Builder()
72 .setTitle(R.string.debug_app)
73 .setDetails(R.string.debug_app)
74 .setEmptyText(R.string.debug_app)
75 .setDetailsOnClickListener(v -> {
76 })
77 .build();
tmfang2badb3e2018-12-10 00:25:02 +080078 }
79
80 @Test
tmfangd8551b12018-12-21 19:53:17 +080081 public void initializeBarChart_titleSet_shouldSetTitleInChartView() {
tmfangd8551b12018-12-21 19:53:17 +080082 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
83 .setTitle(R.string.debug_app)
84 .build();
tmfang2badb3e2018-12-10 00:25:02 +080085
tmfangd8551b12018-12-21 19:53:17 +080086 mPreference.initializeBarChart(barChartInfo);
tmfang2badb3e2018-12-10 00:25:02 +080087 mPreference.onBindViewHolder(mHolder);
88
tmfang4a2cd662019-02-14 14:02:14 +080089 assertThat(mTitleView.getVisibility()).isEqualTo(View.VISIBLE);
90 assertThat(mTitleView.getText()).isEqualTo(mContext.getText(R.string.debug_app));
tmfang2badb3e2018-12-10 00:25:02 +080091 }
92
93 @Test
tmfangff3ba832018-12-20 19:21:04 +080094 public void initializeBarChart_noBarViewSet_shouldShowTitleAndEmptyView() {
95 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
96 .setTitle(R.string.debug_app)
97 .setEmptyText(R.string.debug_app)
98 .build();
99
100 mPreference.initializeBarChart(barChartInfo);
101 // We don't add any bar view yet.
102 mPreference.onBindViewHolder(mHolder);
103
tmfang4a2cd662019-02-14 14:02:14 +0800104 assertThat(mTitleView.getVisibility()).isEqualTo(View.VISIBLE);
tmfangff3ba832018-12-20 19:21:04 +0800105 assertThat(mBarChartView.findViewById(R.id.empty_view).getVisibility())
106 .isEqualTo(View.VISIBLE);
107 assertThat(mBarChartView.findViewById(R.id.bar_views_container).getVisibility())
108 .isEqualTo(View.GONE);
109 }
110
111 @Test
tmfangd8551b12018-12-21 19:53:17 +0800112 public void initializeBarChart_detailsSet_shouldShowBarChartDetailsView() {
113 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
114 .setTitle(R.string.debug_app)
115 .setDetails(R.string.debug_app)
tmfangff3ba832018-12-20 19:21:04 +0800116 .addBarViewInfo(new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app))
tmfangd8551b12018-12-21 19:53:17 +0800117 .build();
tmfang2badb3e2018-12-10 00:25:02 +0800118
tmfangd8551b12018-12-21 19:53:17 +0800119 mPreference.initializeBarChart(barChartInfo);
Joel Galenson418137e2018-12-27 09:39:03 -0800120 mPreference.onBindViewHolder(mHolder);
121
122 assertThat(mDetailsView.getVisibility()).isEqualTo(View.VISIBLE);
123 assertThat(mDetailsView.getText()).isEqualTo(mContext.getText(R.string.debug_app));
124 }
125
126 @Test
tmfangd8551b12018-12-21 19:53:17 +0800127 public void initializeBarChart_detailsNotSet_shouldHideBarChartDetailsView() {
128 // We don't call BarChartInfo.Builder#setDetails yet.
129 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
130 .setTitle(R.string.debug_app)
tmfangff3ba832018-12-20 19:21:04 +0800131 .addBarViewInfo(new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app))
tmfangd8551b12018-12-21 19:53:17 +0800132 .build();
133
134 mPreference.initializeBarChart(barChartInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800135 mPreference.onBindViewHolder(mHolder);
136
tmfangd8551b12018-12-21 19:53:17 +0800137 assertThat(mDetailsView.getVisibility()).isEqualTo(View.GONE);
tmfang2badb3e2018-12-10 00:25:02 +0800138 }
139
140 @Test
tmfangd8551b12018-12-21 19:53:17 +0800141 public void initializeBarChart_clickListenerSet_shouldSetClickListenerOnDetailsView() {
142 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
143 .setTitle(R.string.debug_app)
144 .setDetails(R.string.debug_app)
145 .setDetailsOnClickListener(v -> {
146 })
tmfangff3ba832018-12-20 19:21:04 +0800147 .addBarViewInfo(new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app))
tmfangd8551b12018-12-21 19:53:17 +0800148 .build();
149
150 mPreference.initializeBarChart(barChartInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800151 mPreference.onBindViewHolder(mHolder);
152
Joel Galenson919f6ea42018-12-20 15:09:47 -0800153 assertThat(mDetailsView.getVisibility()).isEqualTo(View.VISIBLE);
154 assertThat(mDetailsView.hasOnClickListeners()).isTrue();
tmfang2badb3e2018-12-10 00:25:02 +0800155 }
156
157 @Test
tmfangd8551b12018-12-21 19:53:17 +0800158 public void setBarViewInfos_oneBarViewInfoSet_shouldShowOneBarView() {
tmfang2badb3e2018-12-10 00:25:02 +0800159 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
160 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app)
161 };
162
tmfangd8551b12018-12-21 19:53:17 +0800163 mPreference.initializeBarChart(mBarChartInfo);
164 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800165 mPreference.onBindViewHolder(mHolder);
166
167 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
168 assertThat(mBarView1.getTitle()).isEqualTo("10");
169
170 assertThat(mBarView2.getVisibility()).isEqualTo(View.GONE);
171 assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
172 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
173 }
174
175 @Test
tmfangd8551b12018-12-21 19:53:17 +0800176 public void setBarViewInfos_twoBarViewInfosSet_shouldShowTwoBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800177 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
178 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app),
179 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app)
180 };
181
tmfangd8551b12018-12-21 19:53:17 +0800182 mPreference.initializeBarChart(mBarChartInfo);
183 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800184 mPreference.onBindViewHolder(mHolder);
185
186 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
187 assertThat(mBarView1.getTitle()).isEqualTo("20");
188 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
189 assertThat(mBarView2.getTitle()).isEqualTo("10");
190
191 assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
192 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
193 }
194
195 @Test
tmfangd8551b12018-12-21 19:53:17 +0800196 public void setBarViewInfos_threeBarViewInfosSet_shouldShowThreeBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800197 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
198 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app),
199 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app),
200 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app)
201 };
202
tmfangd8551b12018-12-21 19:53:17 +0800203 mPreference.initializeBarChart(mBarChartInfo);
204 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800205 mPreference.onBindViewHolder(mHolder);
206
207 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
208 assertThat(mBarView1.getTitle()).isEqualTo("20");
209 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
210 assertThat(mBarView2.getTitle()).isEqualTo("10");
211 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
212 assertThat(mBarView3.getTitle()).isEqualTo("5");
213
214 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
215 }
216
217 @Test
tmfangd8551b12018-12-21 19:53:17 +0800218 public void setBarViewInfos_fourBarViewInfosSet_shouldShowFourBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800219 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
220 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app),
221 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app),
222 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app),
223 new BarViewInfo(mIcon, 2 /* barNumber */, R.string.debug_app),
224 };
225
tmfangd8551b12018-12-21 19:53:17 +0800226 mPreference.initializeBarChart(mBarChartInfo);
227 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800228 mPreference.onBindViewHolder(mHolder);
229
230 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
231 assertThat(mBarView1.getTitle()).isEqualTo("20");
232 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
233 assertThat(mBarView2.getTitle()).isEqualTo("10");
234 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
235 assertThat(mBarView3.getTitle()).isEqualTo("5");
236 assertThat(mBarView4.getVisibility()).isEqualTo(View.VISIBLE);
237 assertThat(mBarView4.getTitle()).isEqualTo("2");
238 }
239
240 @Test
tmfangd8551b12018-12-21 19:53:17 +0800241 public void setBarViewInfos_moreInfosThanMaxAllowed_shouldThrowIllegalStateException() {
242 thrown.expect(IllegalStateException.class);
243
244 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
245 new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app),
246 new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app),
247 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app),
248 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app),
249 new BarViewInfo(mIcon, 70 /* barNumber */, R.string.debug_app),
250 };
251
252 mPreference.setBarViewInfos(barViewsInfo);
253 }
254
255 @Test
256 public void setBarViewInfos_barViewInfosSet_shouldBeSortedInDescending() {
tmfang2badb3e2018-12-10 00:25:02 +0800257 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
258 new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app),
259 new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app),
260 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app),
261 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app),
262 };
263
tmfangd8551b12018-12-21 19:53:17 +0800264 mPreference.initializeBarChart(mBarChartInfo);
265 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800266 mPreference.onBindViewHolder(mHolder);
267
268 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
269 assertThat(mBarView1.getTitle()).isEqualTo("50");
270 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
271 assertThat(mBarView2.getTitle()).isEqualTo("30");
272 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
273 assertThat(mBarView3.getTitle()).isEqualTo("10");
274 assertThat(mBarView4.getVisibility()).isEqualTo(View.VISIBLE);
275 assertThat(mBarView4.getTitle()).isEqualTo("5");
276 }
277
278 @Test
tmfangd8551b12018-12-21 19:53:17 +0800279 public void setBarViewInfos_validBarViewSummarySet_barViewShouldShowSummary() {
tmfang2badb3e2018-12-10 00:25:02 +0800280 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
281 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app),
282 };
283
tmfangd8551b12018-12-21 19:53:17 +0800284 mPreference.initializeBarChart(mBarChartInfo);
285 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800286 mPreference.onBindViewHolder(mHolder);
287
288 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
289 assertThat(mBarView1.getSummary()).isEqualTo(mContext.getText(R.string.debug_app));
290 }
tmfang7081e7f2018-12-19 14:14:34 +0800291
292 @Test
tmfangd8551b12018-12-21 19:53:17 +0800293 public void setBarViewInfos_clickListenerForBarViewSet_barViewShouldHaveClickListener() {
tmfang7081e7f2018-12-19 14:14:34 +0800294 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app);
295 viewInfo.setClickListener(v -> {
296 });
297 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
298
tmfangd8551b12018-12-21 19:53:17 +0800299 mPreference.initializeBarChart(mBarChartInfo);
300 mPreference.setBarViewInfos(barViewsInfo);
tmfang7081e7f2018-12-19 14:14:34 +0800301 mPreference.onBindViewHolder(mHolder);
302
303 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
304 assertThat(mBarView1.hasOnClickListeners()).isTrue();
305 }
tmfang4a2cd662019-02-14 14:02:14 +0800306
307 @Test
tmfangb052cfa2019-02-23 15:08:04 +0800308 public void onBindViewHolder_loadingStateIsTrue_shouldHideAllViews() {
tmfang4a2cd662019-02-14 14:02:14 +0800309 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app);
310 viewInfo.setClickListener(v -> {
311 });
312 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
313
314 mPreference.initializeBarChart(mBarChartInfo);
315 mPreference.setBarViewInfos(barViewsInfo);
316 mPreference.updateLoadingState(true /* isLoading */);
317
318 mPreference.onBindViewHolder(mHolder);
319
tmfangb052cfa2019-02-23 15:08:04 +0800320 assertThat(mHolder.itemView.getVisibility()).isEqualTo(View.INVISIBLE);
tmfang4a2cd662019-02-14 14:02:14 +0800321 }
322
323 @Test
324 public void onBindViewHolder_loadingStateIsFalse_shouldInitAnyView() {
325 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app);
326 viewInfo.setClickListener(v -> {
327 });
328 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
329
330 mPreference.initializeBarChart(mBarChartInfo);
331 mPreference.setBarViewInfos(barViewsInfo);
332 mPreference.updateLoadingState(false /* isLoading */);
333
334 mPreference.onBindViewHolder(mHolder);
335
tmfangb052cfa2019-02-23 15:08:04 +0800336 assertThat(mHolder.itemView.getVisibility()).isEqualTo(View.VISIBLE);
tmfang4a2cd662019-02-14 14:02:14 +0800337 assertThat(TextUtils.isEmpty(mTitleView.getText())).isFalse();
338 assertThat(TextUtils.isEmpty(mDetailsView.getText())).isFalse();
339 }
tmfang2badb3e2018-12-10 00:25:02 +0800340}