• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.LinearLayout;
29 import android.widget.Switch;
30 
31 import com.android.settings.R;
32 import com.android.settings.testutils.SettingsRobolectricTestRunner;
33 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
34 
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.robolectric.RuntimeEnvironment;
39 
40 @RunWith(SettingsRobolectricTestRunner.class)
41 public class MasterSwitchPreferenceTest {
42 
43     private Context mContext;
44 
45     @Before
setUp()46     public void setUp() {
47         mContext = RuntimeEnvironment.application;
48     }
49 
50     @Test
createNewPreference_shouldSetLayout()51     public void createNewPreference_shouldSetLayout() {
52         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
53 
54         assertThat(preference.getWidgetLayoutResource())
55                 .isEqualTo(R.layout.preference_widget_master_switch);
56     }
57 
58     @Test
setChecked_shouldUpdateButtonCheckedState()59     public void setChecked_shouldUpdateButtonCheckedState() {
60         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
61         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
62                 LayoutInflater.from(mContext).inflate(
63                   R.layout.preference_widget_master_switch, null));
64         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
65         preference.onBindViewHolder(holder);
66 
67         preference.setChecked(true);
68         assertThat(toggle.isChecked()).isTrue();
69 
70         preference.setChecked(false);
71         assertThat(toggle.isChecked()).isFalse();
72     }
73 
74     @Test
setSwitchEnabled_shouldUpdateButtonEnabledState()75     public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
76         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
77         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
78                 LayoutInflater.from(mContext).inflate(
79                   R.layout.preference_widget_master_switch, null));
80         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
81         preference.onBindViewHolder(holder);
82 
83         preference.setSwitchEnabled(true);
84         assertThat(toggle.isEnabled()).isTrue();
85 
86         preference.setSwitchEnabled(false);
87         assertThat(toggle.isEnabled()).isFalse();
88     }
89 
90     @Test
setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound()91     public void setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound() {
92         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
93         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
94                 LayoutInflater.from(mContext).inflate(
95                         R.layout.preference_widget_master_switch, null));
96         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
97 
98         preference.setSwitchEnabled(false);
99         preference.onBindViewHolder(holder);
100         assertThat(toggle.isEnabled()).isFalse();
101     }
102 
103     @Test
clickWidgetView_shouldToggleButton()104     public void clickWidgetView_shouldToggleButton() {
105         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
106         final LayoutInflater inflater = LayoutInflater.from(mContext);
107         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
108                 inflater.inflate(R.layout.preference_two_target, null));
109         final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
110         assertThat(widgetView).isNotNull();
111 
112         inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
113         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
114         preference.onBindViewHolder(holder);
115 
116         widgetView.performClick();
117         assertThat(toggle.isChecked()).isTrue();
118 
119         widgetView.performClick();
120         assertThat(toggle.isChecked()).isFalse();
121     }
122 
123     @Test
clickWidgetView_shouldNotToggleButtonIfDisabled()124     public void clickWidgetView_shouldNotToggleButtonIfDisabled() {
125         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
126         final LayoutInflater inflater = LayoutInflater.from(mContext);
127         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
128                 inflater.inflate(R.layout.preference_two_target, null));
129         final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
130         assertThat(widgetView).isNotNull();
131 
132         inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
133         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
134         preference.onBindViewHolder(holder);
135         toggle.setEnabled(false);
136 
137         widgetView.performClick();
138         assertThat(toggle.isChecked()).isFalse();
139     }
140 
141     @Test
clickWidgetView_shouldNotifyPreferenceChanged()142     public void clickWidgetView_shouldNotifyPreferenceChanged() {
143         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
144         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
145                 LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null));
146         final View widgetView = holder.findViewById(android.R.id.widget_frame);
147         final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
148         preference.setOnPreferenceChangeListener(listener);
149         preference.onBindViewHolder(holder);
150 
151         preference.setChecked(false);
152         widgetView.performClick();
153         verify(listener).onPreferenceChange(preference, true);
154 
155         preference.setChecked(true);
156         widgetView.performClick();
157         verify(listener).onPreferenceChange(preference, false);
158     }
159 
160     @Test
setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton()161     public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
162         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
163         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
164                 LayoutInflater.from(mContext)
165                   .inflate(R.layout.preference_widget_master_switch, null));
166         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
167         toggle.setEnabled(true);
168         preference.onBindViewHolder(holder);
169 
170         preference.setDisabledByAdmin(mock(EnforcedAdmin.class));
171         assertThat(toggle.isEnabled()).isFalse();
172     }
173 
174     @Test
setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton()175     public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() {
176         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
177         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
178                 LayoutInflater.from(mContext)
179                   .inflate(R.layout.preference_widget_master_switch, null));
180         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
181         toggle.setEnabled(false);
182         preference.onBindViewHolder(holder);
183 
184         preference.setDisabledByAdmin(null);
185         assertThat(toggle.isEnabled()).isTrue();
186     }
187 
188     @Test
onBindViewHolder_toggleButtonShouldHaveContentDescription()189     public void onBindViewHolder_toggleButtonShouldHaveContentDescription() {
190         final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
191         final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
192             LayoutInflater.from(mContext)
193                 .inflate(R.layout.preference_widget_master_switch, null));
194         final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
195         final String label = "TestButton";
196         preference.setTitle(label);
197 
198         preference.onBindViewHolder(holder);
199 
200         assertThat(toggle.getContentDescription()).isEqualTo(label);
201     }
202 }
203