Loading packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java +19 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,14 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke mainSwitchBar.setIconSpaceReserved(isIconSpaceReserved()); // To support onPreferenceChange callback, it needs to call callChangeListener() when // MainSwitchBar is clicked. mainSwitchBar.setOnClickListener(view -> callChangeListener(isChecked())); mainSwitchBar.setOnClickListener(view -> { boolean isChecked = isChecked(); if (!callChangeListener(isChecked)) { // Change checked state back if listener doesn't like it. // Note that CompoundButton maintains internal state to avoid infinite recursion. mainSwitchBar.setChecked(!isChecked); } }); // Remove all listeners to 1. avoid triggering listener when update UI 2. prevent potential // listener leaking when the view holder is reused by RecyclerView Loading @@ -88,7 +95,11 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke mainSwitchBar.setChecked(isChecked()); mainSwitchBar.addOnSwitchChangeListener(this); if (isVisible()) { mainSwitchBar.show(); } else { mainSwitchBar.hide(); } } @Override Loading @@ -101,7 +112,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke /** * Adds a listener for switch changes * * @deprecated Use {@link #setOnPreferenceChangeListener(OnPreferenceChangeListener)} */ @Deprecated public void addOnSwitchChangeListener(OnCheckedChangeListener listener) { if (!mSwitchChangeListeners.contains(listener)) { mSwitchChangeListeners.add(listener); Loading @@ -110,7 +124,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke /** * Remove a listener for switch changes * * @deprecated Use {@link #setOnPreferenceChangeListener(OnPreferenceChangeListener)} */ @Deprecated public void removeOnSwitchChangeListener(OnCheckedChangeListener listener) { mSwitchChangeListeners.remove(listener); } Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/MainSwitchPreferenceTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,22 @@ package com.android.settingslib.widget; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.view.View; import android.widget.TextView; import androidx.preference.PreferenceDataStore; import androidx.preference.PreferenceViewHolder; import androidx.test.core.app.ApplicationProvider; import com.android.settingslib.preference.PreferenceScreenFactory; import com.android.settingslib.widget.mainswitch.R; import org.junit.Before; Loading Loading @@ -67,4 +76,31 @@ public class MainSwitchPreferenceTest { assertThat(mRootView.<MainSwitchBar>requireViewById( R.id.settingslib_main_switch_bar).isChecked()).isTrue(); } @Test public void setOnPreferenceChangeListener() { // Attach preference to preference screen, otherwise `Preference.performClick` does not // interact with underlying datastore new PreferenceScreenFactory(mContext).getOrCreatePreferenceScreen().addPreference( mPreference); PreferenceDataStore preferenceDataStore = mock(PreferenceDataStore.class); // always return the provided default value when(preferenceDataStore.getBoolean(any(), anyBoolean())).thenAnswer( invocation -> invocation.getArguments()[1]); mPreference.setPreferenceDataStore(preferenceDataStore); String key = "key"; mPreference.setKey(key); mPreference.setOnPreferenceChangeListener((preference, newValue) -> false); mPreference.onBindViewHolder(mHolder); mPreference.performClick(); verify(preferenceDataStore, never()).putBoolean(any(), anyBoolean()); mPreference.setOnPreferenceChangeListener((preference, newValue) -> true); mPreference.performClick(); verify(preferenceDataStore).putBoolean(any(), anyBoolean()); } } Loading
packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java +19 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,14 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke mainSwitchBar.setIconSpaceReserved(isIconSpaceReserved()); // To support onPreferenceChange callback, it needs to call callChangeListener() when // MainSwitchBar is clicked. mainSwitchBar.setOnClickListener(view -> callChangeListener(isChecked())); mainSwitchBar.setOnClickListener(view -> { boolean isChecked = isChecked(); if (!callChangeListener(isChecked)) { // Change checked state back if listener doesn't like it. // Note that CompoundButton maintains internal state to avoid infinite recursion. mainSwitchBar.setChecked(!isChecked); } }); // Remove all listeners to 1. avoid triggering listener when update UI 2. prevent potential // listener leaking when the view holder is reused by RecyclerView Loading @@ -88,7 +95,11 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke mainSwitchBar.setChecked(isChecked()); mainSwitchBar.addOnSwitchChangeListener(this); if (isVisible()) { mainSwitchBar.show(); } else { mainSwitchBar.hide(); } } @Override Loading @@ -101,7 +112,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke /** * Adds a listener for switch changes * * @deprecated Use {@link #setOnPreferenceChangeListener(OnPreferenceChangeListener)} */ @Deprecated public void addOnSwitchChangeListener(OnCheckedChangeListener listener) { if (!mSwitchChangeListeners.contains(listener)) { mSwitchChangeListeners.add(listener); Loading @@ -110,7 +124,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnChecke /** * Remove a listener for switch changes * * @deprecated Use {@link #setOnPreferenceChangeListener(OnPreferenceChangeListener)} */ @Deprecated public void removeOnSwitchChangeListener(OnCheckedChangeListener listener) { mSwitchChangeListeners.remove(listener); } Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/MainSwitchPreferenceTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,22 @@ package com.android.settingslib.widget; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.view.View; import android.widget.TextView; import androidx.preference.PreferenceDataStore; import androidx.preference.PreferenceViewHolder; import androidx.test.core.app.ApplicationProvider; import com.android.settingslib.preference.PreferenceScreenFactory; import com.android.settingslib.widget.mainswitch.R; import org.junit.Before; Loading Loading @@ -67,4 +76,31 @@ public class MainSwitchPreferenceTest { assertThat(mRootView.<MainSwitchBar>requireViewById( R.id.settingslib_main_switch_bar).isChecked()).isTrue(); } @Test public void setOnPreferenceChangeListener() { // Attach preference to preference screen, otherwise `Preference.performClick` does not // interact with underlying datastore new PreferenceScreenFactory(mContext).getOrCreatePreferenceScreen().addPreference( mPreference); PreferenceDataStore preferenceDataStore = mock(PreferenceDataStore.class); // always return the provided default value when(preferenceDataStore.getBoolean(any(), anyBoolean())).thenAnswer( invocation -> invocation.getArguments()[1]); mPreference.setPreferenceDataStore(preferenceDataStore); String key = "key"; mPreference.setKey(key); mPreference.setOnPreferenceChangeListener((preference, newValue) -> false); mPreference.onBindViewHolder(mHolder); mPreference.performClick(); verify(preferenceDataStore, never()).putBoolean(any(), anyBoolean()); mPreference.setOnPreferenceChangeListener((preference, newValue) -> true); mPreference.performClick(); verify(preferenceDataStore).putBoolean(any(), anyBoolean()); } }