MasterSwitchPreferenceTest.java revision 6467d2027e8fefd646af03c08d51d91386843463
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;
246467d2027e8fefd646af03c08d51d91386843463Doris Lingimport android.view.View;
256467d2027e8fefd646af03c08d51d91386843463Doris Lingimport android.view.View.OnClickListener;
261432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.widget.CompoundButton.OnCheckedChangeListener;
276467d2027e8fefd646af03c08d51d91386843463Doris Lingimport android.widget.LinearLayout;
281432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.widget.Switch;
291432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
301432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.R;
311432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.SettingsRobolectricTestRunner;
321432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.TestConfig;
33c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Lingimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
341432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
351432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.Before;
361432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.Test;
371432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.junit.runner.RunWith;
381432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.robolectric.annotation.Config;
391432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.robolectric.shadows.ShadowApplication;
401432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
411432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static com.google.common.truth.Truth.assertThat;
421432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Matchers.any;
431432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Matchers.eq;
441432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.mock;
451432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.spy;
461432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.verify;
471432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
481432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@RunWith(SettingsRobolectricTestRunner.class)
491432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
501432cb852972daedd6c2fde78abb769b722fc47dDoris Lingpublic class MasterSwitchPreferenceTest {
511432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
521432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    private Context mContext;
531432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
541432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Before
551432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setUp() {
561432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        mContext = ShadowApplication.getInstance().getApplicationContext();
571432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
581432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
591432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
601432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void createNewPreference_shouldSetLayout() {
611432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
621432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
631432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(preference.getWidgetLayoutResource()).isEqualTo(
641432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            R.layout.preference_widget_master_switch);
651432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
661432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
671432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
681432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setChecked_shouldUpdateButtonCheckedState() {
691432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
701432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(LayoutInflater.from(mContext)
711432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            .inflate(R.layout.preference_widget_master_switch, null));
721432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
731432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
741432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
751432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(true);
761432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isTrue();
771432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
781432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(false);
791432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isFalse();
801432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
811432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
821432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
831432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
841432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
851432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
861432cb852972daedd6c2fde78abb769b722fc47dDoris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
871432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
881432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
891432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
901432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(true);
911432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isTrue();
921432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
931432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(false);
941432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isFalse();
951432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
961432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
971432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
986467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void clickWidgetView_shouldToggleButton() {
991432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1006467d2027e8fefd646af03c08d51d91386843463Doris Ling        final LayoutInflater inflater = LayoutInflater.from(mContext);
1011432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
1026467d2027e8fefd646af03c08d51d91386843463Doris Ling            inflater.inflate(R.layout.preference_master_switch, null));
1036467d2027e8fefd646af03c08d51d91386843463Doris Ling        final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
1046467d2027e8fefd646af03c08d51d91386843463Doris Ling        inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
1051432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
1061432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1071432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1086467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1096467d2027e8fefd646af03c08d51d91386843463Doris Ling        assertThat(toggle.isChecked()).isTrue();
1106467d2027e8fefd646af03c08d51d91386843463Doris Ling
1116467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1126467d2027e8fefd646af03c08d51d91386843463Doris Ling        assertThat(toggle.isChecked()).isFalse();
1131432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
1141432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1151432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
1166467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void clickWidgetView_shouldNotifyPreferenceChanged() {
1171432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1181432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
1196467d2027e8fefd646af03c08d51d91386843463Doris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_master_switch, null));
1206467d2027e8fefd646af03c08d51d91386843463Doris Ling        final View widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
1211432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
1221432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setOnPreferenceChangeListener(listener);
1231432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1241432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1256467d2027e8fefd646af03c08d51d91386843463Doris Ling        preference.setChecked(false);
1266467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1276467d2027e8fefd646af03c08d51d91386843463Doris Ling        verify(listener).onPreferenceChange(preference, true);
1286467d2027e8fefd646af03c08d51d91386843463Doris Ling
1296467d2027e8fefd646af03c08d51d91386843463Doris Ling        preference.setChecked(true);
1306467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1311432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        verify(listener).onPreferenceChange(preference, false);
1321432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
133c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
134c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
135c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
136c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
137c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
138c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
139c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
140c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(true);
141c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
142c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
143c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(mock(EnforcedAdmin.class));
144c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isFalse();
145c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
146c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
147c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
1486467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() {
149c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
150c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final PreferenceViewHolder holder = new PreferenceViewHolder(
151c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling            LayoutInflater.from(mContext).inflate(R.layout.preference_widget_master_switch, null));
152c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final Switch toggle = (Switch) holder.itemView.findViewById(R.id.switchWidget);
153c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(false);
154c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
155c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
156c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(null);
157c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isTrue();
158c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
1591432cb852972daedd6c2fde78abb769b722fc47dDoris Ling}
160