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
This commit is contained in:
Arc Wang
2021-06-21 11:13:49 +08:00
parent 44d2d1f834
commit e24824b9cc
2 changed files with 18 additions and 35 deletions

View File

@@ -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 <T extends SettingsSpinnerAdapter> 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 =

View File

@@ -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();
}
}