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