blob: 266554be57d3887be780493a2f195e7c52651157 [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)
Joel Galenson9842425f2019-03-05 14:14:14 -0800116 .addBarViewInfo(
117 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
tmfangd8551b12018-12-21 19:53:17 +0800118 .build();
tmfang2badb3e2018-12-10 00:25:02 +0800119
tmfangd8551b12018-12-21 19:53:17 +0800120 mPreference.initializeBarChart(barChartInfo);
Joel Galenson418137e2018-12-27 09:39:03 -0800121 mPreference.onBindViewHolder(mHolder);
122
123 assertThat(mDetailsView.getVisibility()).isEqualTo(View.VISIBLE);
124 assertThat(mDetailsView.getText()).isEqualTo(mContext.getText(R.string.debug_app));
125 }
126
127 @Test
tmfangd8551b12018-12-21 19:53:17 +0800128 public void initializeBarChart_detailsNotSet_shouldHideBarChartDetailsView() {
129 // We don't call BarChartInfo.Builder#setDetails yet.
130 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
131 .setTitle(R.string.debug_app)
Joel Galenson9842425f2019-03-05 14:14:14 -0800132 .addBarViewInfo(
133 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
tmfangd8551b12018-12-21 19:53:17 +0800134 .build();
135
136 mPreference.initializeBarChart(barChartInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800137 mPreference.onBindViewHolder(mHolder);
138
tmfangd8551b12018-12-21 19:53:17 +0800139 assertThat(mDetailsView.getVisibility()).isEqualTo(View.GONE);
tmfang2badb3e2018-12-10 00:25:02 +0800140 }
141
142 @Test
tmfangd8551b12018-12-21 19:53:17 +0800143 public void initializeBarChart_clickListenerSet_shouldSetClickListenerOnDetailsView() {
144 final BarChartInfo barChartInfo = new BarChartInfo.Builder()
145 .setTitle(R.string.debug_app)
146 .setDetails(R.string.debug_app)
147 .setDetailsOnClickListener(v -> {
148 })
Joel Galenson9842425f2019-03-05 14:14:14 -0800149 .addBarViewInfo(
150 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null))
tmfangd8551b12018-12-21 19:53:17 +0800151 .build();
152
153 mPreference.initializeBarChart(barChartInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800154 mPreference.onBindViewHolder(mHolder);
155
Joel Galenson919f6ea42018-12-20 15:09:47 -0800156 assertThat(mDetailsView.getVisibility()).isEqualTo(View.VISIBLE);
157 assertThat(mDetailsView.hasOnClickListeners()).isTrue();
tmfang2badb3e2018-12-10 00:25:02 +0800158 }
159
160 @Test
tmfangd8551b12018-12-21 19:53:17 +0800161 public void setBarViewInfos_oneBarViewInfoSet_shouldShowOneBarView() {
tmfang2badb3e2018-12-10 00:25:02 +0800162 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800163 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null)
tmfang2badb3e2018-12-10 00:25:02 +0800164 };
165
tmfangd8551b12018-12-21 19:53:17 +0800166 mPreference.initializeBarChart(mBarChartInfo);
167 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800168 mPreference.onBindViewHolder(mHolder);
169
170 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
171 assertThat(mBarView1.getTitle()).isEqualTo("10");
172
173 assertThat(mBarView2.getVisibility()).isEqualTo(View.GONE);
174 assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
175 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
176 }
177
178 @Test
tmfangd8551b12018-12-21 19:53:17 +0800179 public void setBarViewInfos_twoBarViewInfosSet_shouldShowTwoBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800180 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800181 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
182 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null)
tmfang2badb3e2018-12-10 00:25:02 +0800183 };
184
tmfangd8551b12018-12-21 19:53:17 +0800185 mPreference.initializeBarChart(mBarChartInfo);
186 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800187 mPreference.onBindViewHolder(mHolder);
188
189 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
190 assertThat(mBarView1.getTitle()).isEqualTo("20");
191 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
192 assertThat(mBarView2.getTitle()).isEqualTo("10");
193
194 assertThat(mBarView3.getVisibility()).isEqualTo(View.GONE);
195 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
196 }
197
198 @Test
tmfangd8551b12018-12-21 19:53:17 +0800199 public void setBarViewInfos_threeBarViewInfosSet_shouldShowThreeBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800200 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800201 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
202 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
203 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null)
tmfang2badb3e2018-12-10 00:25:02 +0800204 };
205
tmfangd8551b12018-12-21 19:53:17 +0800206 mPreference.initializeBarChart(mBarChartInfo);
207 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800208 mPreference.onBindViewHolder(mHolder);
209
210 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
211 assertThat(mBarView1.getTitle()).isEqualTo("20");
212 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
213 assertThat(mBarView2.getTitle()).isEqualTo("10");
214 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
215 assertThat(mBarView3.getTitle()).isEqualTo("5");
216
217 assertThat(mBarView4.getVisibility()).isEqualTo(View.GONE);
218 }
219
220 @Test
tmfangd8551b12018-12-21 19:53:17 +0800221 public void setBarViewInfos_fourBarViewInfosSet_shouldShowFourBarViews() {
tmfang2badb3e2018-12-10 00:25:02 +0800222 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800223 new BarViewInfo(mIcon, 20 /* barNumber */, R.string.debug_app, null),
224 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
225 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
226 new BarViewInfo(mIcon, 2 /* barNumber */, R.string.debug_app, null),
tmfang2badb3e2018-12-10 00:25:02 +0800227 };
228
tmfangd8551b12018-12-21 19:53:17 +0800229 mPreference.initializeBarChart(mBarChartInfo);
230 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800231 mPreference.onBindViewHolder(mHolder);
232
233 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
234 assertThat(mBarView1.getTitle()).isEqualTo("20");
235 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
236 assertThat(mBarView2.getTitle()).isEqualTo("10");
237 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
238 assertThat(mBarView3.getTitle()).isEqualTo("5");
239 assertThat(mBarView4.getVisibility()).isEqualTo(View.VISIBLE);
240 assertThat(mBarView4.getTitle()).isEqualTo("2");
241 }
242
243 @Test
tmfangd8551b12018-12-21 19:53:17 +0800244 public void setBarViewInfos_moreInfosThanMaxAllowed_shouldThrowIllegalStateException() {
245 thrown.expect(IllegalStateException.class);
246
247 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800248 new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app, null),
249 new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app, null),
250 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
251 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
252 new BarViewInfo(mIcon, 70 /* barNumber */, R.string.debug_app, null),
tmfangd8551b12018-12-21 19:53:17 +0800253 };
254
255 mPreference.setBarViewInfos(barViewsInfo);
256 }
257
258 @Test
259 public void setBarViewInfos_barViewInfosSet_shouldBeSortedInDescending() {
tmfang2badb3e2018-12-10 00:25:02 +0800260 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800261 new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app, null),
262 new BarViewInfo(mIcon, 50 /* barNumber */, R.string.debug_app, null),
263 new BarViewInfo(mIcon, 5 /* barNumber */, R.string.debug_app, null),
264 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
tmfang2badb3e2018-12-10 00:25:02 +0800265 };
266
tmfangd8551b12018-12-21 19:53:17 +0800267 mPreference.initializeBarChart(mBarChartInfo);
268 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800269 mPreference.onBindViewHolder(mHolder);
270
271 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
272 assertThat(mBarView1.getTitle()).isEqualTo("50");
273 assertThat(mBarView2.getVisibility()).isEqualTo(View.VISIBLE);
274 assertThat(mBarView2.getTitle()).isEqualTo("30");
275 assertThat(mBarView3.getVisibility()).isEqualTo(View.VISIBLE);
276 assertThat(mBarView3.getTitle()).isEqualTo("10");
277 assertThat(mBarView4.getVisibility()).isEqualTo(View.VISIBLE);
278 assertThat(mBarView4.getTitle()).isEqualTo("5");
279 }
280
281 @Test
tmfangd8551b12018-12-21 19:53:17 +0800282 public void setBarViewInfos_validBarViewSummarySet_barViewShouldShowSummary() {
tmfang2badb3e2018-12-10 00:25:02 +0800283 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{
Joel Galenson9842425f2019-03-05 14:14:14 -0800284 new BarViewInfo(mIcon, 10 /* barNumber */, R.string.debug_app, null),
tmfang2badb3e2018-12-10 00:25:02 +0800285 };
286
tmfangd8551b12018-12-21 19:53:17 +0800287 mPreference.initializeBarChart(mBarChartInfo);
288 mPreference.setBarViewInfos(barViewsInfo);
tmfang2badb3e2018-12-10 00:25:02 +0800289 mPreference.onBindViewHolder(mHolder);
290
291 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
292 assertThat(mBarView1.getSummary()).isEqualTo(mContext.getText(R.string.debug_app));
293 }
tmfang7081e7f2018-12-19 14:14:34 +0800294
295 @Test
tmfangd8551b12018-12-21 19:53:17 +0800296 public void setBarViewInfos_clickListenerForBarViewSet_barViewShouldHaveClickListener() {
Joel Galenson9842425f2019-03-05 14:14:14 -0800297 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
298 null);
tmfang7081e7f2018-12-19 14:14:34 +0800299 viewInfo.setClickListener(v -> {
300 });
301 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
302
tmfangd8551b12018-12-21 19:53:17 +0800303 mPreference.initializeBarChart(mBarChartInfo);
304 mPreference.setBarViewInfos(barViewsInfo);
tmfang7081e7f2018-12-19 14:14:34 +0800305 mPreference.onBindViewHolder(mHolder);
306
307 assertThat(mBarView1.getVisibility()).isEqualTo(View.VISIBLE);
308 assertThat(mBarView1.hasOnClickListeners()).isTrue();
309 }
tmfang4a2cd662019-02-14 14:02:14 +0800310
311 @Test
tmfangb052cfa2019-02-23 15:08:04 +0800312 public void onBindViewHolder_loadingStateIsTrue_shouldHideAllViews() {
Joel Galenson9842425f2019-03-05 14:14:14 -0800313 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
314 null);
tmfang4a2cd662019-02-14 14:02:14 +0800315 viewInfo.setClickListener(v -> {
316 });
317 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
318
319 mPreference.initializeBarChart(mBarChartInfo);
320 mPreference.setBarViewInfos(barViewsInfo);
321 mPreference.updateLoadingState(true /* isLoading */);
322
323 mPreference.onBindViewHolder(mHolder);
324
tmfangb052cfa2019-02-23 15:08:04 +0800325 assertThat(mHolder.itemView.getVisibility()).isEqualTo(View.INVISIBLE);
tmfang4a2cd662019-02-14 14:02:14 +0800326 }
327
328 @Test
329 public void onBindViewHolder_loadingStateIsFalse_shouldInitAnyView() {
Joel Galenson9842425f2019-03-05 14:14:14 -0800330 final BarViewInfo viewInfo = new BarViewInfo(mIcon, 30 /* barNumber */, R.string.debug_app,
331 null);
tmfang4a2cd662019-02-14 14:02:14 +0800332 viewInfo.setClickListener(v -> {
333 });
334 final BarViewInfo[] barViewsInfo = new BarViewInfo[]{viewInfo};
335
336 mPreference.initializeBarChart(mBarChartInfo);
337 mPreference.setBarViewInfos(barViewsInfo);
338 mPreference.updateLoadingState(false /* isLoading */);
339
340 mPreference.onBindViewHolder(mHolder);
341
tmfangb052cfa2019-02-23 15:08:04 +0800342 assertThat(mHolder.itemView.getVisibility()).isEqualTo(View.VISIBLE);
tmfang4a2cd662019-02-14 14:02:14 +0800343 assertThat(TextUtils.isEmpty(mTitleView.getText())).isFalse();
344 assertThat(TextUtils.isEmpty(mDetailsView.getText())).isFalse();
345 }
tmfang2badb3e2018-12-10 00:25:02 +0800346}