MasterSwitchPreferenceTest.java revision c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924
11432cb852972daedd6c2fde78abb769b722fc47dDoris Ling/*
21432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * Copyright (C) 2017 The Android Open Source Project
31432cb852972daedd6c2fde78abb769b722fc47dDoris Ling *
41432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * Licensed under the Apache License, Version 2.0 (the "License");
51432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * you may not use this file except in compliance with the License.
61432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * You may obtain a copy of the License at
71432cb852972daedd6c2fde78abb769b722fc47dDoris Ling *
81432cb852972daedd6c2fde78abb769b722fc47dDoris Ling *      http://www.apache.org/licenses/LICENSE-2.0
91432cb852972daedd6c2fde78abb769b722fc47dDoris Ling *
101432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * Unless required by applicable law or agreed to in writing, software
111432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * distributed under the License is distributed on an "AS IS" BASIS,
121432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * See the License for the specific language governing permissions and
141432cb852972daedd6c2fde78abb769b722fc47dDoris Ling * limitations under the License.
151432cb852972daedd6c2fde78abb769b722fc47dDoris Ling */
161432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
171432cb852972daedd6c2fde78abb769b722fc47dDoris Lingpackage com.android.settings.widget;
181432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
191432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.content.Context;
201432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.support.v7.preference.Preference;
211432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.support.v7.preference.PreferenceViewHolder;
221432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
231432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.view.LayoutInflater;
241432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.widget.CompoundButton.OnCheckedChangeListener;
251432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.widget.Switch;
261432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
271432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.R;
281432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.SettingsRobolectricTestRunner;
291432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.TestConfig;
30c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Lingimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
311432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
321432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.Before;
331432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.Test;
341432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.runner.RunWith;
351432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.robolectric.annotation.Config;
361432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.robolectric.shadows.ShadowApplication;
371432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
381432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static com.google.common.truth.Truth.assertThat;
391432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Matchers.any;
401432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Matchers.eq;
411432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.mock;
421432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.spy;
431432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.verify;
441432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
451432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@RunWith(SettingsRobolectricTestRunner.class)
461432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
471432cb852972daedd6c2fde78abb769b722fc47dDoris Lingpublic class MasterSwitchPreferenceTest {
481432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
491432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    private Context mContext;
501432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
511432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Before
521432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setUp() {
531432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        mContext = ShadowApplication.getInstance().getApplicationContext();
541432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
551432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
561432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
571432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void createNewPreference_shouldSetLayout() {
581432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
591432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
601432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(preference.getWidgetLayoutResource()).isEqualTo(
611432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            R.layout.preference_widget_master_switch);
621432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
631432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
641432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
651432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setChecked_shouldUpdateButtonCheckedState() {
661432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
671432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(LayoutInflater.from(mContext)
681432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            .inflate(R.layout.preference_widget_master_switch, null));
691432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
701432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
711432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
721432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(true);
731432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isTrue();
741432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
751432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(false);
761432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isFalse();
771432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
781432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
791432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
801432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
811432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
821432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
831432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
841432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
851432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
861432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
871432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(true);
881432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isTrue();
891432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
901432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(false);
911432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isFalse();
921432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
931432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
941432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
951432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void toggleButtonOn_shouldNotifyChecked() {
961432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
971432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
981432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
991432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
1001432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
1011432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setOnPreferenceChangeListener(listener);
1021432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1031432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1041432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        toggle.setChecked(true);
1051432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        verify(listener).onPreferenceChange(preference, true);
1061432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
1071432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1081432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
1091432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void toggleButtonOff_shouldNotifyUnchecked() {
1101432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1111432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
1121432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
1131432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
1141432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
1151432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(true);
1161432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setOnPreferenceChangeListener(listener);
1171432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1181432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1191432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        toggle.setChecked(false);
1201432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        verify(listener).onPreferenceChange(preference, false);
1211432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
122c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
123c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
124c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
125c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
126c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
127c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
128c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
129c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(true);
130c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
131c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
132c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(mock(EnforcedAdmin.class));
133c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isFalse();
134c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
135c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
136c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
137c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    public void setDisabledByAdmin_noEnforcedAdmin_shouldEnaableButton() {
138c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
139c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
140c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
141c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
142c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(false);
143c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
144c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
145c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(null);
146c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isTrue();
147c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
1481432cb852972daedd6c2fde78abb769b722fc47dDoris Ling}
149