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

Commit 49b6103b authored by Jason Monk's avatar Jason Monk
Browse files

Make DropDownPreference extend ListPreference

Lots of updates to handle static setting of entries/values
Callbacks are now through preference changes
Fix weird inconsistencies in callback return values...

Change-Id: I2ebe02c3492ce543162efcd55bdae3f2c4039287
parent fe7a25f8
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -416,10 +416,10 @@ public class DevelopmentSettings extends SettingsPreferenceFragment
        final UiModeManager uiManager = (UiModeManager) getSystemService(
                Context.UI_MODE_SERVICE);
        final int currentNightMode = uiManager.getNightMode();
        mNightModePreference.setSelectedValue(String.valueOf(currentNightMode));
        mNightModePreference.setCallback(new DropDownPreference.Callback() {
        mNightModePreference.setValue(String.valueOf(currentNightMode));
        mNightModePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onItemSelected(int pos, Object newValue) {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                try {
                    final int value = Integer.parseInt((String) newValue);
                    final UiModeManager uiManager = (UiModeManager) getSystemService(
+15 −13
Original line number Diff line number Diff line
@@ -16,12 +16,6 @@

package com.android.settings;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.view.RotationPolicy;
import com.android.settings.DropDownPreference.Callback;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;

import static android.provider.Settings.Secure.CAMERA_GESTURE_DISABLED;
import static android.provider.Settings.Secure.DOUBLE_TAP_TO_WAKE;
import static android.provider.Settings.Secure.DOZE_ENABLED;
@@ -48,6 +42,7 @@ import android.os.RemoteException;
import android.os.SystemProperties;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
@@ -56,6 +51,11 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.view.RotationPolicy;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;

import java.util.ArrayList;
import java.util.List;

@@ -162,8 +162,6 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
        if (RotationPolicy.isRotationLockToggleVisible(activity)) {
            DropDownPreference rotatePreference =
                    (DropDownPreference) findPreference(KEY_AUTO_ROTATE);
            rotatePreference.addItem(activity.getString(R.string.display_auto_rotate_rotate),
                    false);
            int rotateLockedResourceId;
            // The following block sets the string used when rotation is locked.
            // If the device locks specifically to portrait or landscape (rather than current
@@ -180,13 +178,17 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
                            R.string.display_auto_rotate_stay_in_landscape;
                }
            }
            rotatePreference.addItem(activity.getString(rotateLockedResourceId), true);
            rotatePreference.setSelectedItem(RotationPolicy.isRotationLocked(activity) ?
            rotatePreference.setEntries(new CharSequence[] {
                    activity.getString(R.string.display_auto_rotate_rotate),
                    activity.getString(rotateLockedResourceId),
            });
            rotatePreference.setEntryValues(new CharSequence[] { "0", "1" });
            rotatePreference.setValueIndex(RotationPolicy.isRotationLocked(activity) ?
                    1 : 0);
            rotatePreference.setCallback(new Callback() {
            rotatePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onItemSelected(int pos, Object value) {
                    final boolean locked = (Boolean) value;
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    final boolean locked = Integer.parseInt((String) newValue) != 0;
                    MetricsLogger.action(getActivity(), MetricsLogger.ACTION_ROTATION_LOCK,
                            locked);
                    RotationPolicy.setRotationLock(activity, locked);
+35 −70
Original line number Diff line number Diff line
@@ -17,9 +17,9 @@
package com.android.settings;

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.Preference;
import android.preference.ListPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -27,16 +27,13 @@ import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import java.util.ArrayList;
import libcore.util.Objects;

public class DropDownPreference extends ListPreference {

public class DropDownPreference extends Preference {
    private final Context mContext;
    private final ArrayAdapter<String> mAdapter;
    private final Spinner mSpinner;
    private final ArrayList<Object> mValues = new ArrayList<Object>();

    private Callback mCallback;
    private int mSelectedPosition = -1;

    public DropDownPreference(Context context) {
        this(context, null);
@@ -55,7 +52,12 @@ public class DropDownPreference extends Preference {
        mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
                setSelectedItem(position, true);
                if (position >= 0) {
                    String value = getEntryValues()[position].toString();
                    if (!value.equals(getValue()) && callChangeListener(value)) {
                        setValue(value);
                    }
                }
            }

            @Override
@@ -64,75 +66,42 @@ public class DropDownPreference extends Preference {
            }
        });
        setPersistent(false);
        setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                mSpinner.performClick();
                return true;
        updateEntries();
    }
        });

        // Support XML specification like ListPreferences do.
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DropDownPreference);
        CharSequence[] entries = a.getTextArray(R.styleable.DropDownPreference_android_entries);
        CharSequence[] values = a.getTextArray(R.styleable.DropDownPreference_android_entryValues);
        if (entries != null && values != null) {
            for (int i= 0; i < entries.length; i++) {
                addItem(entries[i].toString(), values[i]);
            }
        }
    @Override
    protected void onClick() {
        mSpinner.performClick();
    }

    public void setDropDownWidth(int dimenResId) {
        mSpinner.setDropDownWidth(mContext.getResources().getDimensionPixelSize(dimenResId));
    }

    public void setCallback(Callback callback) {
        mCallback = callback;
    }

    public void setSelectedItem(int position) {
        setSelectedItem(position, false);
    }

    public void setSelectedItem(int position, boolean fromSpinner) {
        if (fromSpinner && position == mSelectedPosition) {
            return;
        }
        final Object value = mValues.get(position);
        if (mCallback != null && !mCallback.onItemSelected(position, value)) {
            return;
        }
        mSpinner.setSelection(position);
        mSelectedPosition = mSpinner.getSelectedItemPosition();
        setSummary(mAdapter.getItem(position));
        final boolean disableDependents = value == null;
        notifyDependencyChange(disableDependents);
    @Override
    public void setEntries(CharSequence[] entries) {
        super.setEntries(entries);
        updateEntries();
    }

    public void setSelectedValue(Object value) {
        final int i = mValues.indexOf(value);
        if (i > -1) {
            setSelectedItem(i);
    private void updateEntries() {
        mAdapter.clear();
        if (getEntries() != null) {
            for (CharSequence c : getEntries()) {
                mAdapter.add(c.toString());
            }
        }

    public void addItem(int captionResid, Object value) {
        addItem(mContext.getResources().getString(captionResid), value);
    }

    public void addItem(String caption, Object value) {
        mAdapter.add(caption);
        mValues.add(value);
    }

    public int getItemCount() {
        return mAdapter.getCount();
    @Override
    public void setValue(String value) {
        super.setValue(value);
        mSpinner.setSelection(findIndexOfValue(getValue()));
        setSummary(getEntry());
    }

    public void clearItems(){
        mAdapter.clear();
        mValues.clear();
    public void setValueIndex(int index) {
        setValue(getEntryValues()[index].toString());
    }

    @Override
@@ -148,8 +117,4 @@ public class DropDownPreference extends Preference {
        lp.width = 0;
        mSpinner.setLayoutParams(lp);
    }

    public interface Callback {
        boolean onItemSelected(int pos, Object value);
    }
}
+21 −18
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.Preference;
import android.preference.SwitchPreference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.util.ArraySet;
import android.util.Log;
import android.view.View;
@@ -32,16 +32,15 @@ import android.view.View.OnClickListener;

import com.android.internal.logging.MetricsLogger;
import com.android.settings.DropDownPreference;
import com.android.settings.DropDownPreference.Callback;
import com.android.settings.R;
import com.android.settings.Utils;

import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
import java.util.List;

import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;

import java.util.List;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;

public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListener,
        Preference.OnPreferenceChangeListener {
@@ -90,12 +89,16 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
        // * always
        // * ask
        // * never
        mAppLinkState.addItem(R.string.app_link_open_always,
                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
        mAppLinkState.addItem(R.string.app_link_open_ask,
                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK);
        mAppLinkState.addItem(R.string.app_link_open_never,
                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
        mAppLinkState.setEntries(new CharSequence[] {
                getString(R.string.app_link_open_always),
                getString(R.string.app_link_open_ask),
                getString(R.string.app_link_open_never),
        });
        mAppLinkState.setEntryValues(new CharSequence[] {
                Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS),
                Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK),
                Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER),
        });

        mAppLinkState.setEnabled(mHasDomainUrls);
        if (mHasDomainUrls) {
@@ -103,16 +106,16 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe
            // purposes of the UI (and does the right thing around pending domain
            // verifications that might arrive after the user chooses 'ask' in this UI).
            final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
            mAppLinkState.setSelectedValue(
                    (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
            mAppLinkState.setValue(
                    Integer.toString((state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
                        ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK
                        : state);
                        : state));

            // Set the callback only after setting the initial selected item
            mAppLinkState.setCallback(new Callback() {
            mAppLinkState.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onItemSelected(int pos, Object value) {
                    return updateAppLinkState((Integer) value);
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    return updateAppLinkState(Integer.parseInt((String) newValue));
                }
            });
        }
+11 −9
Original line number Diff line number Diff line
@@ -16,18 +16,18 @@
package com.android.settings.nfc;

import android.content.Context;

import com.android.settings.DropDownPreference;
import com.android.settings.R;

public class NfcForegroundPreference extends DropDownPreference implements
        DropDownPreference.Callback, PaymentBackend.Callback {
        PaymentBackend.Callback {

    private final PaymentBackend mPaymentBackend;
    public NfcForegroundPreference(Context context, PaymentBackend backend) {
        super(context);
        mPaymentBackend = backend;
        mPaymentBackend.registerCallback(this);
        setCallback(this);
        refresh();
    }

@@ -43,19 +43,21 @@ public class NfcForegroundPreference extends DropDownPreference implements
        setTitle(getContext().getString(R.string.nfc_payment_use_default));
        CharSequence favorOpen;
        CharSequence favorDefault;
        clearItems();
        addItem(getContext().getString(R.string.nfc_payment_favor_open), true);
        addItem(getContext().getString(R.string.nfc_payment_favor_default), false);
        setEntries(new CharSequence[] {
                getContext().getString(R.string.nfc_payment_favor_open),
                getContext().getString(R.string.nfc_payment_favor_default)
        });
        setEntryValues(new CharSequence[] { "1", "0" });
        if (foregroundMode) {
            setSelectedValue(true);
            setValue("1");
        } else {
            setSelectedValue(false);
            setValue("0");
        }
    }

    @Override
    public boolean onItemSelected(int pos, Object value) {
        mPaymentBackend.setForegroundMode((Boolean) value);
    protected boolean persistString(String value) {
        mPaymentBackend.setForegroundMode(Integer.parseInt(value) != 0);
        return true;
    }
}
Loading