From 49f7f8137f3fc8644831fa948172ef9b2f10bd91 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 18 Apr 2018 13:45:18 -0400 Subject: [PATCH] Can disable checkbox without tint on text Fixes: 76101594 Test: DisabledCheckBoxPreferenceTest, ZenModeVisEffectPreferenceControllerTest Change-Id: Ida92c7d94f788404d9cd48f07e779446d9ac0d54 --- res/xml/zen_mode_block_settings.xml | 14 ++--- res/xml/zen_mode_settings.xml | 3 +- .../ZenModeVisEffectPreferenceController.java | 5 +- .../widget/DisabledCheckBoxPreference.java | 61 +++++++++++++++---- ...ModeVisEffectPreferenceControllerTest.java | 11 ++-- .../DisabledCheckBoxPreferenceTest.java | 17 +++++- 6 files changed, 84 insertions(+), 27 deletions(-) diff --git a/res/xml/zen_mode_block_settings.xml b/res/xml/zen_mode_block_settings.xml index 63dbd476b97..cccc63c8a39 100644 --- a/res/xml/zen_mode_block_settings.xml +++ b/res/xml/zen_mode_block_settings.xml @@ -24,15 +24,15 @@ android:title="@string/zen_mode_block_effects_screen_off" android:key="zen_mode_block_screen_off"> - - - @@ -40,19 +40,19 @@ - - - - diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml index 385e8ff5ed5..717b6c505f6 100644 --- a/res/xml/zen_mode_settings.xml +++ b/res/xml/zen_mode_settings.xml @@ -25,7 +25,8 @@ + android:title="@string/zen_mode_block_effect_sound" + android:enabled="false"/> = 0; i--) { + int attr = a.getIndex(i); + switch (attr) { + case com.android.internal.R.styleable.Preference_enabled: + mEnabledCheckBox = a.getBoolean(attr, true); + break; + } + } + a.recycle(); + + // Always tell super class this preference is enabled. + // We manually enable/disable checkbox using enableCheckBox. + super.setEnabled(true); + enableCheckbox(mEnabledCheckBox); + } + + public void enableCheckbox(boolean enabled) { + mEnabledCheckBox = enabled; + if (mViewHolder != null && mCheckBox != null) { + mCheckBox.setEnabled(mEnabledCheckBox); + mViewHolder.itemView.setEnabled(mEnabledCheckBox); + } } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); + mViewHolder = holder; + mCheckBox = holder.findViewById(android.R.id.checkbox); - View view = holder.findViewById(android.R.id.checkbox); - view.setEnabled(false); - holder.itemView.setEnabled(false); + enableCheckbox(mEnabledCheckBox); } @Override protected void performClick(View view) { - // Do nothing + // only perform clicks if the checkbox is enabled + if (mEnabledCheckBox) { + super.performClick(view); + } } + } diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeVisEffectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeVisEffectPreferenceControllerTest.java index 6ca04ba7c6f..29ced0b2ab0 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenModeVisEffectPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenModeVisEffectPreferenceControllerTest.java @@ -42,6 +42,7 @@ import android.support.v7.preference.PreferenceScreen; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settings.widget.DisabledCheckBoxPreference; import org.junit.Before; import org.junit.Test; @@ -58,7 +59,7 @@ public class ZenModeVisEffectPreferenceControllerTest { @Mock private ZenModeBackend mBackend; @Mock - private CheckBoxPreference mockPref; + private DisabledCheckBoxPreference mockPref; private Context mContext; private FakeFeatureFactory mFeatureFactory; @Mock @@ -114,7 +115,7 @@ public class ZenModeVisEffectPreferenceControllerTest { mController.updateState(mockPref); verify(mockPref).setChecked(false); - verify(mockPref).setEnabled(true); + verify(mockPref).enableCheckbox(true); } @Test @@ -123,7 +124,7 @@ public class ZenModeVisEffectPreferenceControllerTest { mController.updateState(mockPref); verify(mockPref).setChecked(true); - verify(mockPref).setEnabled(true); + verify(mockPref).enableCheckbox(true); } @Test @@ -138,7 +139,7 @@ public class ZenModeVisEffectPreferenceControllerTest { mController.updateState(mockPref); verify(mockPref).setChecked(true); - verify(mockPref).setEnabled(false); + verify(mockPref).enableCheckbox(false); verify(mBackend, times(1)).saveVisualEffectsPolicy(SUPPRESSED_EFFECT_PEEK, true); } @@ -154,7 +155,7 @@ public class ZenModeVisEffectPreferenceControllerTest { mController.updateState(mockPref); verify(mockPref).setChecked(false); - verify(mockPref).setEnabled(true); + verify(mockPref).enableCheckbox(true); verify(mBackend, never()).saveVisualEffectsPolicy(SUPPRESSED_EFFECT_PEEK, true); } diff --git a/tests/robotests/src/com/android/settings/widget/DisabledCheckBoxPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/DisabledCheckBoxPreferenceTest.java index 5ab7013686a..ff10833492b 100644 --- a/tests/robotests/src/com/android/settings/widget/DisabledCheckBoxPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/DisabledCheckBoxPreferenceTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.Context; @@ -70,14 +71,28 @@ public class DisabledCheckBoxPreferenceTest { } @Test - public void checkboxOnClick_doesNothing() { + public void checkboxOnClick_checkboxDisabled() { Preference.OnPreferenceClickListener onClick = mock(Preference.OnPreferenceClickListener.class); mPref.setOnPreferenceClickListener(onClick); inflatePreference(); + mPref.enableCheckbox(false); mPref.performClick(mRootView); verify(onClick, never()).onPreferenceClick(any()); } + + @Test + public void checkboxOnClick_checkboxEnabled() { + Preference.OnPreferenceClickListener onClick = + mock(Preference.OnPreferenceClickListener.class); + mPref.setOnPreferenceClickListener(onClick); + inflatePreference(); + + mPref.enableCheckbox(true); + mPref.performClick(mRootView); + + verify(onClick, times(1)).onPreferenceClick(any()); + } }