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