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