MasterSwitchPreferenceTest.java revision c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924
1ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/*
2ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Copyright (C) 2017 The Android Open Source Project
3ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
4ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * you may not use this file except in compliance with the License.
6ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * You may obtain a copy of the License at
7ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
8ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville *
10ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Unless required by applicable law or agreed to in writing, software
11ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * See the License for the specific language governing permissions and
14ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * limitations under the License.
15ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */
16ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
17ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepackage com.android.settings.widget;
18ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
19ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.content.Context;
20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.support.v7.preference.Preference;
21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.support.v7.preference.PreferenceViewHolder;
22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
232cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.view.LayoutInflater;
24ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.widget.CompoundButton.OnCheckedChangeListener;
25ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.widget.Switch;
26ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
276c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajanimport com.android.settings.R;
28ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.settings.SettingsRobolectricTestRunner;
29ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.settings.TestConfig;
30ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
31ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
32ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport org.junit.Before;
33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport org.junit.Test;
34ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport org.junit.runner.RunWith;
35ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport org.robolectric.annotation.Config;
36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport org.robolectric.shadows.ShadowApplication;
37ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static com.google.common.truth.Truth.assertThat;
39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static org.mockito.Matchers.any;
40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static org.mockito.Matchers.eq;
41ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static org.mockito.Mockito.mock;
42ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static org.mockito.Mockito.spy;
43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport static org.mockito.Mockito.verify;
446c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajan
45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville@RunWith(SettingsRobolectricTestRunner.class)
46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic class MasterSwitchPreferenceTest {
48ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
49ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private Context mContext;
50ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
51ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Before
52ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void setUp() {
53ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mContext = ShadowApplication.getInstance().getApplicationContext();
54ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
55ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
56ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Test
57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void createNewPreference_shouldSetLayout() {
58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
59ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        assertThat(preference.getWidgetLayoutResource()).isEqualTo(
61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            R.layout.preference_widget_master_switch);
62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
63ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
64ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Test
65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void setChecked_shouldUpdateButtonCheckedState() {
66ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final PreferenceViewHolder holder = new PreferenceViewHolder(LayoutInflater.from(mContext)
68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            .inflate(R.layout.preference_widget_master_switch, null));
69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
70ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.onBindViewHolder(holder);
71ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
72ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.setChecked(true);
73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        assertThat(toggle.isChecked()).isTrue();
74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.setChecked(false);
76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        assertThat(toggle.isChecked()).isFalse();
776c806ef816f8ae0a1849ba05f3128a04577b32d0Amit Mahajan    }
78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
792cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville    @Test
80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
82ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final PreferenceViewHolder holder = new PreferenceViewHolder(
83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.onBindViewHolder(holder);
86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.setSwitchEnabled(true);
88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        assertThat(toggle.isEnabled()).isTrue();
89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.setSwitchEnabled(false);
91ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        assertThat(toggle.isEnabled()).isFalse();
92ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
93ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
94ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Test
95ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void toggleButtonOn_shouldNotifyChecked() {
9657da4aa945252ebed6b505387145f99be8ad5d72Wink Saville        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
9757da4aa945252ebed6b505387145f99be8ad5d72Wink Saville        final PreferenceViewHolder holder = new PreferenceViewHolder(
9857da4aa945252ebed6b505387145f99be8ad5d72Wink Saville            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
101e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        preference.setOnPreferenceChangeListener(listener);
102ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        preference.onBindViewHolder(holder);
103ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        toggle.setChecked(true);
105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        verify(listener).onPreferenceChange(preference, true);
106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Test
109    public void toggleButtonOff_shouldNotifyUnchecked() {
110        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
111        final PreferenceViewHolder holder = new PreferenceViewHolder(
112            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
113        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
114        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
115        preference.setChecked(true);
116        preference.setOnPreferenceChangeListener(listener);
117        preference.onBindViewHolder(holder);
118
119        toggle.setChecked(false);
120        verify(listener).onPreferenceChange(preference, false);
121    }
122
123    @Test
124    public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
125        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
126        final PreferenceViewHolder holder = new PreferenceViewHolder(
127            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
128        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
129        toggle.setEnabled(true);
130        preference.onBindViewHolder(holder);
131
132        preference.setDisabledByAdmin(mock(EnforcedAdmin.class));
133        assertThat(toggle.isEnabled()).isFalse();
134    }
135
136    @Test
137    public void setDisabledByAdmin_noEnforcedAdmin_shouldEnaableButton() {
138        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
139        final PreferenceViewHolder holder = new PreferenceViewHolder(
140            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
141        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
142        toggle.setEnabled(false);
143        preference.onBindViewHolder(holder);
144
145        preference.setDisabledByAdmin(null);
146        assertThat(toggle.isEnabled()).isTrue();
147    }
148}
149