Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e24824b9 authored by Arc Wang's avatar Arc Wang
Browse files

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
parent 44d2d1f8
Loading
Loading
Loading
Loading
+18 −15
Original line number Diff line number Diff line
@@ -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 =
+0 −20
Original line number Diff line number Diff line
@@ -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();
    }
}