From e24824b9ccfa82f7b8c0cbfc8dee60cfe7152f47 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Mon, 21 Jun 2021 11:13:49 +0800 Subject: [PATCH] Shows ripple effect for SettingsSpinnerPreference Before this change, only the spinner inside SettingsSpinnerPreference is clickable. The preference itself is not clickable. After this change, whole preference area is clickable and it will show dropdown view of the spinnner at onPreferenceClick. Bug: 187142293 Test: atest SettingsSpinnerPreferenceTest manual visual Inserts an USB flash drive and clicks SettingsSpinnerPreference in Storage Settings. Change-Id: Ib4de017e6f5930f7b29c8958f2fe7f7dbe347324 --- .../widget/SettingsSpinnerPreference.java | 33 ++++++++++--------- .../widget/SettingsSpinnerPreferenceTest.java | 20 ----------- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java index 304c3439a60db..d993e44653430 100644 --- a/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java +++ b/packages/SettingsLib/SettingsSpinner/src/com/android/settingslib/widget/SettingsSpinnerPreference.java @@ -22,6 +22,7 @@ import android.view.View; import android.widget.AdapterView; import androidx.preference.Preference; +import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceViewHolder; import com.android.settingslib.widget.settingsspinner.SettingsSpinner; @@ -31,12 +32,12 @@ import com.android.settingslib.widget.settingsspinner.SettingsSpinnerAdapter; * This preference uses SettingsSpinner & SettingsSpinnerAdapter which provide default layouts for * both view and drop down view of the Spinner. */ -public class SettingsSpinnerPreference extends Preference { +public class SettingsSpinnerPreference extends Preference implements OnPreferenceClickListener { private SettingsSpinnerAdapter mAdapter; private AdapterView.OnItemSelectedListener mListener; - private int mPosition; //Default 0 for internal shard storage. - private boolean mIsClickable = true; + private int mPosition; + private boolean mShouldPerformClick; /** * Perform inflation from XML and apply a class-specific base style. @@ -51,7 +52,7 @@ public class SettingsSpinnerPreference extends Preference { public SettingsSpinnerPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutResource(R.layout.settings_spinner_preference); - setSelectable(false); + setOnPreferenceClickListener(this); } /** @@ -64,7 +65,7 @@ public class SettingsSpinnerPreference extends Preference { public SettingsSpinnerPreference(Context context, AttributeSet attrs) { super(context, attrs); setLayoutResource(R.layout.settings_spinner_preference); - setSelectable(false); + setOnPreferenceClickListener(this); } /** @@ -76,6 +77,13 @@ public class SettingsSpinnerPreference extends Preference { this(context, null); } + @Override + public boolean onPreferenceClick(Preference preference) { + mShouldPerformClick = true; + notifyChanged(); + return true; + } + /** Sets adapter of the spinner. */ public void setAdapter(T adapter) { mAdapter = adapter; @@ -101,24 +109,19 @@ public class SettingsSpinnerPreference extends Preference { notifyChanged(); } - /** Set clickable of the spinner. */ - public void setClickable(boolean isClickable) { - if (mIsClickable == isClickable) { - return; - } - mIsClickable = isClickable; - notifyChanged(); - } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); final SettingsSpinner spinner = (SettingsSpinner) holder.findViewById(R.id.spinner); - spinner.setEnabled(mIsClickable); - spinner.setClickable(mIsClickable); spinner.setAdapter(mAdapter); spinner.setSelection(mPosition); spinner.setOnItemSelectedListener(mOnSelectedListener); + if (mShouldPerformClick) { + mShouldPerformClick = false; + // To show dropdown view. + spinner.performClick(); + } } private final AdapterView.OnItemSelectedListener mOnSelectedListener = diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java index b0c5314a2ec04..53a382a9ebf6a 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/widget/SettingsSpinnerPreferenceTest.java @@ -89,24 +89,4 @@ public class SettingsSpinnerPreferenceTest { assertThat(mSpinnerPreference.getSelectedItem()) .isEqualTo(mSpinner.getAdapter().getItem(1)); } - - @Test - public void onBindViewHolder_setClickableTrue_isClickableTrue() { - mSpinnerPreference.setClickable(true); - - mSpinnerPreference.onBindViewHolder(mViewHolder); - - assertThat(mSpinner.isClickable()).isTrue(); - assertThat(mSpinner.isEnabled()).isTrue(); - } - - @Test - public void onBindViewHolder_setClickableFalse_isClickableFalse() { - mSpinnerPreference.setClickable(false); - - mSpinnerPreference.onBindViewHolder(mViewHolder); - - assertThat(mSpinner.isClickable()).isFalse(); - assertThat(mSpinner.isEnabled()).isFalse(); - } }