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.OnPreferenceChangeListener;
21fe292515d88e803057a5b6077f67ce284b595d7aFan Zhangimport android.support.v7.preference.PreferenceViewHolder;
221432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.view.LayoutInflater;
236467d2027e8fefd646af03c08d51d91386843463Doris Lingimport android.view.View;
246467d2027e8fefd646af03c08d51d91386843463Doris Lingimport android.widget.LinearLayout;
251432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport android.widget.Switch;
261432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
271432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport com.android.settings.R;
289f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.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;
35fe292515d88e803057a5b6077f67ce284b595d7aFan Zhangimport org.robolectric.RuntimeEnvironment;
361432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport org.robolectric.annotation.Config;
371432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
381432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static com.google.common.truth.Truth.assertThat;
391432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.mock;
401432cb852972daedd6c2fde78abb769b722fc47dDoris Lingimport static org.mockito.Mockito.verify;
411432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
421432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@RunWith(SettingsRobolectricTestRunner.class)
431432cb852972daedd6c2fde78abb769b722fc47dDoris Ling@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
441432cb852972daedd6c2fde78abb769b722fc47dDoris Lingpublic class MasterSwitchPreferenceTest {
451432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
461432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    private Context mContext;
471432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
481432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Before
491432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setUp() {
50fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        mContext = RuntimeEnvironment.application;
511432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
521432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
531432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
541432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void createNewPreference_shouldSetLayout() {
551432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
561432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
57fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        assertThat(preference.getWidgetLayoutResource())
58fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang                .isEqualTo(R.layout.preference_widget_master_switch);
591432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
601432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
611432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
621432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setChecked_shouldUpdateButtonCheckedState() {
631432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
644bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
654bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                LayoutInflater.from(mContext).inflate(
664bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                  R.layout.preference_widget_master_switch, null));
67fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
681432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
691432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
701432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(true);
711432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isTrue();
721432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
731432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setChecked(false);
741432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isChecked()).isFalse();
751432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
761432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
771432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
781432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    public void setSwitchEnabled_shouldUpdateButtonEnabledState() {
791432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
804bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
814bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                LayoutInflater.from(mContext).inflate(
824bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                  R.layout.preference_widget_master_switch, null));
83fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
841432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
851432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
861432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(true);
871432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isTrue();
881432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
891432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setSwitchEnabled(false);
901432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        assertThat(toggle.isEnabled()).isFalse();
911432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
921432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
931432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
94c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    public void setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound() {
95c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
96c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
97c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds                LayoutInflater.from(mContext).inflate(
98c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds                        R.layout.preference_widget_master_switch, null));
99c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
100c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds
101c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        preference.setSwitchEnabled(false);
102c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        preference.onBindViewHolder(holder);
103c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        assertThat(toggle.isEnabled()).isFalse();
104c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    }
105c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds
106c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    @Test
1076467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void clickWidgetView_shouldToggleButton() {
1081432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1096467d2027e8fefd646af03c08d51d91386843463Doris Ling        final LayoutInflater inflater = LayoutInflater.from(mContext);
1104bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
111fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang                inflater.inflate(R.layout.preference_two_target, null));
1126467d2027e8fefd646af03c08d51d91386843463Doris Ling        final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
1136467d2027e8fefd646af03c08d51d91386843463Doris Ling        inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
114fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
1151432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1161432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1176467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1186467d2027e8fefd646af03c08d51d91386843463Doris Ling        assertThat(toggle.isChecked()).isTrue();
1196467d2027e8fefd646af03c08d51d91386843463Doris Ling
1206467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1216467d2027e8fefd646af03c08d51d91386843463Doris Ling        assertThat(toggle.isChecked()).isFalse();
1221432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
1231432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1241432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    @Test
125c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    public void clickWidgetView_shouldNotToggleButtonIfDisabled() {
126c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
127c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final LayoutInflater inflater = LayoutInflater.from(mContext);
128c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
129c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds                inflater.inflate(R.layout.preference_two_target, null));
130c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame);
131c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true);
132c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
133c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        preference.onBindViewHolder(holder);
134c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        toggle.setEnabled(false);
135c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds
136c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        widgetView.performClick();
137c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds        assertThat(toggle.isChecked()).isFalse();
138c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    }
139c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds
140c68ae0b9fdd5f5a149364d0af7e8a9497a91adfdJulia Reynolds    @Test
1416467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void clickWidgetView_shouldNotifyPreferenceChanged() {
1421432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1434bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
144fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang                LayoutInflater.from(mContext).inflate(R.layout.preference_two_target, null));
145fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final View widgetView = holder.findViewById(android.R.id.widget_frame);
1461432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        final OnPreferenceChangeListener listener = mock(OnPreferenceChangeListener.class);
1471432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.setOnPreferenceChangeListener(listener);
1481432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        preference.onBindViewHolder(holder);
1491432cb852972daedd6c2fde78abb769b722fc47dDoris Ling
1506467d2027e8fefd646af03c08d51d91386843463Doris Ling        preference.setChecked(false);
1516467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1526467d2027e8fefd646af03c08d51d91386843463Doris Ling        verify(listener).onPreferenceChange(preference, true);
1536467d2027e8fefd646af03c08d51d91386843463Doris Ling
1546467d2027e8fefd646af03c08d51d91386843463Doris Ling        preference.setChecked(true);
1556467d2027e8fefd646af03c08d51d91386843463Doris Ling        widgetView.performClick();
1561432cb852972daedd6c2fde78abb769b722fc47dDoris Ling        verify(listener).onPreferenceChange(preference, false);
1571432cb852972daedd6c2fde78abb769b722fc47dDoris Ling    }
158c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
159c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
160c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    public void setDisabledByAdmin_hasEnforcedAdmin_shouldDisableButton() {
161c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1624bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
1634bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                LayoutInflater.from(mContext)
1644bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                  .inflate(R.layout.preference_widget_master_switch, null));
165fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
166c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(true);
167c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
168c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
169c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(mock(EnforcedAdmin.class));
170c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isFalse();
171c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
172c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
173c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    @Test
1746467d2027e8fefd646af03c08d51d91386843463Doris Ling    public void setDisabledByAdmin_noEnforcedAdmin_shouldEnableButton() {
175c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
1764bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
1774bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                LayoutInflater.from(mContext)
1784bd1e4f73b7b3b7efcf40e8056aba54dc3ea1ee6Filip Pavlis                  .inflate(R.layout.preference_widget_master_switch, null));
179fe292515d88e803057a5b6077f67ce284b595d7aFan Zhang        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
180c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        toggle.setEnabled(false);
181c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.onBindViewHolder(holder);
182c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling
183c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        preference.setDisabledByAdmin(null);
184c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling        assertThat(toggle.isEnabled()).isTrue();
185c4c9f4d50eec659eb50f8ed671c27d8c6ef0c924Doris Ling    }
186e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling
187e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling    @Test
188e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling    public void onBindViewHolder_toggleButtonShouldHaveContentDescription() {
189e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
190e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(
191e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling            LayoutInflater.from(mContext)
192e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling                .inflate(R.layout.preference_widget_master_switch, null));
193e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget);
194e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        final String label = "TestButton";
195e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        preference.setTitle(label);
196e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling
197e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        preference.onBindViewHolder(holder);
198e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling
199e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling        assertThat(toggle.getContentDescription()).isEqualTo(label);
200e2ad415fdba79b27dfd2c98a2b01d56db9257c71Doris Ling    }
2011432cb852972daedd6c2fde78abb769b722fc47dDoris Ling}
202