package com.android.settings; import android.content.Context; import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; import android.util.Log; import android.widget.Checkable; /** * A hybrid of AppListPreference and SwitchPreference, representing a preference which can be on or * off but must have a selected value when turned on. * * It is invalid to show this preference when zero valid apps are present. */ public class AppListSwitchPreference extends AppListPreference { private static final String TAG = "AppListSwitchPref"; private Checkable mSwitch; public AppListSwitchPreference(Context context, AttributeSet attrs) { super(context, attrs, 0, R.style.AppListSwitchPreference); } @Override public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); mSwitch = (Checkable) view.findViewById(com.android.internal.R.id.switch_widget); mSwitch.setChecked(getValue() != null); } @Override protected void onClick() { if (getValue() != null) { // Turning off the current value. if (callChangeListener(null)) { setValue(null); } } else if (getEntryValues() == null || getEntryValues().length == 0) { Log.e(TAG, "Attempting to show dialog with zero entries: " + getKey()); } else if (getEntryValues().length == 1) { // Suppress the dialog and just toggle the preference with the only choice. String value = getEntryValues()[0].toString(); if (callChangeListener(value)) { setValue(value); } } else { super.onClick(); } } @Override public void setValue(String value) { super.setValue(value); if (mSwitch != null) { mSwitch.setChecked(value != null); } } }