1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
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 
17 package com.android.settingslib.widget;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyBoolean;
23 import static org.mockito.ArgumentMatchers.anyInt;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.when;
26 
27 import android.content.Context;
28 import android.graphics.drawable.Drawable;
29 import android.view.View;
30 import android.widget.Button;
31 
32 import androidx.preference.PreferenceViewHolder;
33 
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.robolectric.RobolectricTestRunner;
38 import org.robolectric.RuntimeEnvironment;
39 
40 @RunWith(RobolectricTestRunner.class)
41 public class ActionButtonsPreferenceTest {
42 
43     private Context mContext;
44     private View mRootView;
45     private ActionButtonsPreference mPref;
46     private PreferenceViewHolder mHolder;
47 
48     @Before
setUp()49     public void setUp() {
50         mContext = RuntimeEnvironment.application;
51         mRootView = View.inflate(mContext, R.layout.settingslib_action_buttons, null /* parent */);
52         mHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
53         mPref = new ActionButtonsPreference(mContext);
54     }
55 
56     @Test
onBindViewHolder_setTitle_shouldShowButtonByDefault()57     public void onBindViewHolder_setTitle_shouldShowButtonByDefault() {
58         mPref.setButton1Text(R.string.install_other_apps);
59         mPref.setButton2Text(R.string.install_other_apps);
60         mPref.setButton3Text(R.string.install_other_apps);
61         mPref.setButton4Text(R.string.install_other_apps);
62 
63         mPref.onBindViewHolder(mHolder);
64 
65         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
66                 .isEqualTo(View.VISIBLE);
67         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
68                 .isEqualTo(View.VISIBLE);
69         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
70                 .isEqualTo(View.VISIBLE);
71         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
72                 .isEqualTo(View.VISIBLE);
73     }
74 
75     @Test
onBindViewHolder_setIcon_shouldShowButtonByDefault()76     public void onBindViewHolder_setIcon_shouldShowButtonByDefault() {
77         mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus);
78         mPref.setButton2Icon(com.android.internal.R.drawable.ic_plus);
79         mPref.setButton3Icon(com.android.internal.R.drawable.ic_plus);
80         mPref.setButton4Icon(com.android.internal.R.drawable.ic_plus);
81 
82         mPref.onBindViewHolder(mHolder);
83 
84         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
85                 .isEqualTo(View.VISIBLE);
86         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
87                 .isEqualTo(View.VISIBLE);
88         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
89                 .isEqualTo(View.VISIBLE);
90         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
91                 .isEqualTo(View.VISIBLE);
92     }
93 
94     @Test
onBindViewHolder_notSetTitleOrIcon_shouldNotShowButtonByDefault()95     public void onBindViewHolder_notSetTitleOrIcon_shouldNotShowButtonByDefault() {
96         mPref.onBindViewHolder(mHolder);
97 
98         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
99                 .isEqualTo(View.GONE);
100         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
101                 .isEqualTo(View.GONE);
102         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
103                 .isEqualTo(View.GONE);
104         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
105                 .isEqualTo(View.GONE);
106     }
107 
108     @Test
onBindViewHolder_setVisibleIsGoneAndSetTitle_shouldNotShowButton()109     public void onBindViewHolder_setVisibleIsGoneAndSetTitle_shouldNotShowButton() {
110         mPref.setButton1Text(R.string.install_other_apps).setButton1Visible(false);
111         mPref.setButton2Text(R.string.install_other_apps).setButton2Visible(false);
112         mPref.setButton3Text(R.string.install_other_apps).setButton3Visible(false);
113         mPref.setButton4Text(R.string.install_other_apps).setButton4Visible(false);
114 
115         mPref.onBindViewHolder(mHolder);
116 
117         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
118                 .isEqualTo(View.GONE);
119         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
120                 .isEqualTo(View.GONE);
121         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
122                 .isEqualTo(View.GONE);
123         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
124                 .isEqualTo(View.GONE);
125     }
126 
127     @Test
onBindViewHolder_setVisibleIsGoneAndSetIcon_shouldNotShowButton()128     public void onBindViewHolder_setVisibleIsGoneAndSetIcon_shouldNotShowButton() {
129         mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus).setButton1Visible(false);
130         mPref.setButton2Icon(com.android.internal.R.drawable.ic_plus).setButton2Visible(false);
131         mPref.setButton3Icon(com.android.internal.R.drawable.ic_plus).setButton3Visible(false);
132         mPref.setButton4Icon(com.android.internal.R.drawable.ic_plus).setButton4Visible(false);
133 
134         mPref.onBindViewHolder(mHolder);
135 
136         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
137                 .isEqualTo(View.GONE);
138         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
139                 .isEqualTo(View.GONE);
140         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
141                 .isEqualTo(View.GONE);
142         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
143                 .isEqualTo(View.GONE);
144     }
145 
146     @Test
onBindViewHolder_setVisibility_shouldUpdateButtonVisibility()147     public void onBindViewHolder_setVisibility_shouldUpdateButtonVisibility() {
148         mPref.setButton1Text(R.string.install_other_apps).setButton1Visible(false);
149         mPref.setButton2Text(R.string.install_other_apps).setButton2Visible(false);
150         mPref.setButton3Text(R.string.install_other_apps).setButton3Visible(false);
151         mPref.setButton4Text(R.string.install_other_apps).setButton4Visible(false);
152 
153         mPref.onBindViewHolder(mHolder);
154 
155         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
156                 .isEqualTo(View.GONE);
157         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
158                 .isEqualTo(View.GONE);
159         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
160                 .isEqualTo(View.GONE);
161         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
162                 .isEqualTo(View.GONE);
163 
164         mPref.setButton1Visible(true);
165         mPref.setButton2Visible(true);
166         mPref.setButton3Visible(true);
167         mPref.setButton4Visible(true);
168 
169         mPref.onBindViewHolder(mHolder);
170 
171         assertThat(mRootView.findViewById(R.id.button1).getVisibility())
172                 .isEqualTo(View.VISIBLE);
173         assertThat(mRootView.findViewById(R.id.button2).getVisibility())
174                 .isEqualTo(View.VISIBLE);
175         assertThat(mRootView.findViewById(R.id.button3).getVisibility())
176                 .isEqualTo(View.VISIBLE);
177         assertThat(mRootView.findViewById(R.id.button4).getVisibility())
178                 .isEqualTo(View.VISIBLE);
179     }
180 
181     @Test
onBindViewHolder_setEnabled_shouldEnableButton()182     public void onBindViewHolder_setEnabled_shouldEnableButton() {
183         mPref.setButton1Enabled(true);
184         mPref.setButton2Enabled(false);
185         mPref.setButton3Enabled(true);
186         mPref.setButton4Enabled(false);
187 
188         mPref.onBindViewHolder(mHolder);
189 
190         assertThat(mRootView.findViewById(R.id.button1).isEnabled()).isTrue();
191         assertThat(mRootView.findViewById(R.id.button2).isEnabled()).isFalse();
192         assertThat(mRootView.findViewById(R.id.button3).isEnabled()).isTrue();
193         assertThat(mRootView.findViewById(R.id.button4).isEnabled()).isFalse();
194     }
195 
196     @Test
onBindViewHolder_setText_shouldShowSameText()197     public void onBindViewHolder_setText_shouldShowSameText() {
198         mPref.setButton1Text(R.string.install_other_apps);
199         mPref.setButton2Text(R.string.install_other_apps);
200         mPref.setButton3Text(R.string.install_other_apps);
201         mPref.setButton4Text(R.string.install_other_apps);
202 
203         mPref.onBindViewHolder(mHolder);
204 
205         assertThat(((Button) mRootView.findViewById(R.id.button1)).getText())
206                 .isEqualTo(mContext.getText(R.string.install_other_apps));
207         assertThat(((Button) mRootView.findViewById(R.id.button2)).getText())
208                 .isEqualTo(mContext.getText(R.string.install_other_apps));
209         assertThat(((Button) mRootView.findViewById(R.id.button3)).getText())
210                 .isEqualTo(mContext.getText(R.string.install_other_apps));
211         assertThat(((Button) mRootView.findViewById(R.id.button4)).getText())
212                 .isEqualTo(mContext.getText(R.string.install_other_apps));
213     }
214 
215     @Test
onBindViewHolder_setButtonIcon_iconMustDisplayAboveText()216     public void onBindViewHolder_setButtonIcon_iconMustDisplayAboveText() {
217         mPref.setButton1Text(R.string.install_other_apps);
218         mPref.setButton1Icon(com.android.internal.R.drawable.ic_plus);
219 
220         mPref.onBindViewHolder(mHolder);
221         final Drawable[] drawablesAroundText =
222                 ((Button) mRootView.findViewById(R.id.button1))
223                         .getCompoundDrawables();
224 
225         assertThat(drawablesAroundText[1 /* top */]).isNotNull();
226     }
227 
228     @Test
setButtonIcon_iconResourceIdIsZero_shouldNotDisplayIcon()229     public void setButtonIcon_iconResourceIdIsZero_shouldNotDisplayIcon() {
230         mPref.setButton1Text(R.string.install_other_apps);
231         mPref.setButton1Icon(0);
232 
233         mPref.onBindViewHolder(mHolder);
234         final Drawable[] drawablesAroundText =
235                 ((Button) mRootView.findViewById(R.id.button1))
236                         .getCompoundDrawables();
237 
238         assertThat(drawablesAroundText[1 /* top */]).isNull();
239     }
240 
241     @Test
setButtonIcon_iconResourceIdNotExisting_shouldNotDisplayIconAndCrash()242     public void setButtonIcon_iconResourceIdNotExisting_shouldNotDisplayIconAndCrash() {
243         mPref.setButton1Text(R.string.install_other_apps);
244         mPref.setButton1Icon(999999999 /* not existing id */);
245         // Should not crash here
246         mPref.onBindViewHolder(mHolder);
247         final Drawable[] drawablesAroundText =
248                 ((Button) mRootView.findViewById(R.id.button1))
249                         .getCompoundDrawables();
250 
251         assertThat(drawablesAroundText[1 /* top */]).isNull();
252     }
253 
254     @Test
onBindViewHolder_setAllButton_shouldShowAllDivider()255     public void onBindViewHolder_setAllButton_shouldShowAllDivider() {
256         mPref.setButton1Text(R.string.install_other_apps);
257         mPref.setButton2Text(R.string.install_other_apps);
258         mPref.setButton3Text(R.string.install_other_apps);
259         mPref.setButton4Text(R.string.install_other_apps);
260 
261         mPref.onBindViewHolder(mHolder);
262 
263         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
264                 .isEqualTo(View.VISIBLE);
265         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
266                 .isEqualTo(View.VISIBLE);
267         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
268                 .isEqualTo(View.VISIBLE);
269     }
270 
271     @Test
onBindViewHolder_setAllButtonWithoutButton2_shouldHideDivider1()272     public void onBindViewHolder_setAllButtonWithoutButton2_shouldHideDivider1() {
273         mPref.setButton1Text(R.string.install_other_apps);
274         mPref.setButton3Text(R.string.install_other_apps);
275         mPref.setButton4Text(R.string.install_other_apps);
276 
277         mPref.onBindViewHolder(mHolder);
278 
279         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
280                 .isEqualTo(View.GONE);
281         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
282                 .isEqualTo(View.VISIBLE);
283         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
284                 .isEqualTo(View.VISIBLE);
285     }
286 
287     @Test
onBindViewHolder_setAllButtonWithoutButton3_shouldHideDivider2()288     public void onBindViewHolder_setAllButtonWithoutButton3_shouldHideDivider2() {
289         mPref.setButton1Text(R.string.install_other_apps);
290         mPref.setButton2Text(R.string.install_other_apps);
291         mPref.setButton4Text(R.string.install_other_apps);
292 
293         mPref.onBindViewHolder(mHolder);
294 
295         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
296                 .isEqualTo(View.VISIBLE);
297         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
298                 .isEqualTo(View.GONE);
299         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
300                 .isEqualTo(View.VISIBLE);
301     }
302 
303     @Test
onBindViewHolder_setButton1And4_shouldShowDivider3Only()304     public void onBindViewHolder_setButton1And4_shouldShowDivider3Only() {
305         mPref.setButton1Text(R.string.install_other_apps);
306         mPref.setButton4Text(R.string.install_other_apps);
307 
308         mPref.onBindViewHolder(mHolder);
309 
310         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
311                 .isEqualTo(View.GONE);
312         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
313                 .isEqualTo(View.GONE);
314         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
315                 .isEqualTo(View.VISIBLE);
316     }
317 
318     @Test
onBindViewHolder_setOneButtonOnly_noDivider()319     public void onBindViewHolder_setOneButtonOnly_noDivider() {
320         mPref.setButton4Text(R.string.install_other_apps);
321 
322         mPref.onBindViewHolder(mHolder);
323 
324         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
325                 .isEqualTo(View.GONE);
326         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
327                 .isEqualTo(View.GONE);
328         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
329                 .isEqualTo(View.GONE);
330     }
331 
332     @Test
onBindViewHolder_setButton1And2_shouldShowDivider1Only()333     public void onBindViewHolder_setButton1And2_shouldShowDivider1Only() {
334         mPref.setButton1Text(R.string.install_other_apps);
335         mPref.setButton2Text(R.string.install_other_apps);
336 
337         mPref.onBindViewHolder(mHolder);
338 
339         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
340                 .isEqualTo(View.VISIBLE);
341         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
342                 .isEqualTo(View.GONE);
343         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
344                 .isEqualTo(View.GONE);
345     }
346 
347     @Test
onBindViewHolder_setButton1And3_shouldShowDivider2Only()348     public void onBindViewHolder_setButton1And3_shouldShowDivider2Only() {
349         mPref.setButton1Text(R.string.install_other_apps);
350         mPref.setButton3Text(R.string.install_other_apps);
351 
352         mPref.onBindViewHolder(mHolder);
353 
354         assertThat(mRootView.findViewById(R.id.divider1).getVisibility())
355                 .isEqualTo(View.GONE);
356         assertThat(mRootView.findViewById(R.id.divider2).getVisibility())
357                 .isEqualTo(View.VISIBLE);
358         assertThat(mRootView.findViewById(R.id.divider3).getVisibility())
359                 .isEqualTo(View.GONE);
360     }
361 
createMock()362     public static ActionButtonsPreference createMock() {
363         final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
364         when(pref.setButton1Text(anyInt())).thenReturn(pref);
365         when(pref.setButton1Icon(anyInt())).thenReturn(pref);
366         when(pref.setButton1Enabled(anyBoolean())).thenReturn(pref);
367         when(pref.setButton1Visible(anyBoolean())).thenReturn(pref);
368         when(pref.setButton1OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
369 
370         when(pref.setButton2Text(anyInt())).thenReturn(pref);
371         when(pref.setButton2Icon(anyInt())).thenReturn(pref);
372         when(pref.setButton2Enabled(anyBoolean())).thenReturn(pref);
373         when(pref.setButton2Visible(anyBoolean())).thenReturn(pref);
374         when(pref.setButton2OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
375 
376         when(pref.setButton3Text(anyInt())).thenReturn(pref);
377         when(pref.setButton3Icon(anyInt())).thenReturn(pref);
378         when(pref.setButton3Enabled(anyBoolean())).thenReturn(pref);
379         when(pref.setButton3Visible(anyBoolean())).thenReturn(pref);
380         when(pref.setButton3OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
381 
382         when(pref.setButton4Text(anyInt())).thenReturn(pref);
383         when(pref.setButton4Icon(anyInt())).thenReturn(pref);
384         when(pref.setButton4Enabled(anyBoolean())).thenReturn(pref);
385         when(pref.setButton4Visible(anyBoolean())).thenReturn(pref);
386         when(pref.setButton4OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
387         return pref;
388     }
389 }
390