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.settings.widget; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Mockito.mock; 21 import static org.mockito.Mockito.verify; 22 23 import android.content.Context; 24 import android.support.v7.preference.Preference.OnPreferenceChangeListener; 25 import android.support.v7.preference.PreferenceViewHolder; 26 import android.view.LayoutInflater; 27 import android.view.View; 28 import android.widget.CheckBox; 29 import android.widget.LinearLayout; 30 31 import com.android.settings.R; 32 import com.android.settings.testutils.SettingsRobolectricTestRunner; 33 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.robolectric.RuntimeEnvironment; 38 39 @RunWith(SettingsRobolectricTestRunner.class) 40 public class MasterCheckBoxPreferenceTest { 41 42 private Context mContext; 43 private MasterCheckBoxPreference mPreference; 44 45 @Before 46 public void setUp() { 47 mContext = RuntimeEnvironment.application; 48 mPreference = new MasterCheckBoxPreference(mContext); 49 } 50 51 @Test 52 public void createNewPreference_shouldSetLayout() { 53 assertThat(mPreference.getWidgetLayoutResource()) 54 .isEqualTo(R.layout.preference_widget_master_checkbox); 55 } 56 57 @Test 58 public void setChecked_shouldUpdateCheckBoxCheckedState() { 59 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 60 LayoutInflater.from(mContext).inflate( 61 R.layout.preference_widget_master_checkbox, null)); 62 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 63 mPreference.onBindViewHolder(holder); 64 65 mPreference.setChecked(true); 66 assertThat(checkBox.isChecked()).isTrue(); 67 68 mPreference.setChecked(false); 69 assertThat(checkBox.isChecked()).isFalse(); 70 } 71 72 @Test 73 public void setEnabled_shouldUpdateCheckBoxEnabledState() { 74 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 75 LayoutInflater.from(mContext).inflate( 76 R.layout.preference_widget_master_checkbox, null)); 77 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 78 mPreference.onBindViewHolder(holder); 79 80 mPreference.setEnabled(true); 81 assertThat(checkBox.isEnabled()).isTrue(); 82 83 mPreference.setEnabled(false); 84 assertThat(checkBox.isEnabled()).isFalse(); 85 } 86 87 @Test 88 public void setCheckboxEnabled_shouldOnlyUpdateCheckBoxEnabledState() { 89 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 90 LayoutInflater.from(mContext).inflate( 91 R.layout.preference_widget_master_checkbox, null)); 92 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 93 mPreference.onBindViewHolder(holder); 94 95 mPreference.setCheckBoxEnabled(false); 96 assertThat(mPreference.isEnabled()).isTrue(); 97 assertThat(checkBox.isEnabled()).isFalse(); 98 99 mPreference.setCheckBoxEnabled(true); 100 assertThat(mPreference.isEnabled()).isTrue(); 101 assertThat(checkBox.isEnabled()).isTrue(); 102 } 103 104 @Test 105 public void onBindViewHolder_shouldSetCheckboxEnabledState() { 106 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 107 LayoutInflater.from(mContext).inflate( 108 R.layout.preference_widget_master_checkbox, null)); 109 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 110 111 mPreference.setCheckBoxEnabled(false); 112 mPreference.onBindViewHolder(holder); 113 114 assertThat(mPreference.isEnabled()).isTrue(); 115 assertThat(checkBox.isEnabled()).isFalse(); 116 117 mPreference.setCheckBoxEnabled(true); 118 assertThat(mPreference.isEnabled()).isTrue(); 119 assertThat(checkBox.isEnabled()).isTrue(); 120 } 121 122 @Test 123 public void clickWidgetView_shouldToggleCheckBox() { 124 final LayoutInflater inflater = LayoutInflater.from(mContext); 125 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 126 inflater.inflate(R.layout.preference_two_target, null)); 127 final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); 128 assertThat(widgetView).isNotNull(); 129 130 inflater.inflate(R.layout.preference_widget_master_checkbox, widgetView, true); 131 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 132 mPreference.onBindViewHolder(holder); 133 134 widgetView.performClick(); 135 assertThat(checkBox.isChecked()).isTrue(); 136 137 widgetView.performClick(); 138 assertThat(checkBox.isChecked()).isFalse(); 139 } 140 141 @Test 142 public void clickWidgetView_shouldNotToggleCheckBoxIfDisabled() { 143 final LayoutInflater inflater = LayoutInflater.from(mContext); 144 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 145 inflater.inflate(R.layout.preference_two_target, null)); 146 final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); 147 assertThat(widgetView).isNotNull(); 148 149 inflater.inflate(R.layout.preference_widget_master_checkbox, widgetView, true); 150 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 151 mPreference.onBindViewHolder(holder); 152 mPreference.setEnabled(false); 153 154 widgetView.performClick(); 155 assertThat(checkBox.isChecked()).isFalse(); 156 } 157 158 @Test 159 public void clickWidgetView_shouldNotifyPreferenceChanged() { 160 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 161 LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null)); 162 final View widgetView = holder.findViewById(android.R.id.widget_frame); 163 final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class); 164 mPreference.setOnPreferenceChangeListener(listener); 165 mPreference.onBindViewHolder(holder); 166 167 mPreference.setChecked(false); 168 widgetView.performClick(); 169 verify(listener).onPreferenceChange(mPreference, true); 170 171 mPreference.setChecked(true); 172 widgetView.performClick(); 173 verify(listener).onPreferenceChange(mPreference, false); 174 } 175 176 @Test 177 public void onBindViewHolder_checkBoxShouldHaveContentDescription() { 178 final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( 179 LayoutInflater.from(mContext) 180 .inflate(R.layout.preference_widget_master_checkbox, null)); 181 final CheckBox checkBox = (CheckBox) holder.findViewById(R.id.checkboxWidget); 182 final String label = "TestButton"; 183 mPreference.setTitle(label); 184 185 mPreference.onBindViewHolder(holder); 186 187 assertThat(checkBox.getContentDescription()).isEqualTo(label); 188 } 189 } 190