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:
@@ -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 =
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user