package org.wordpress.android.ui.prefs; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Bundle; import android.preference.ListPreference; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; import org.wordpress.android.R; /** * Custom {@link ListPreference} used to display detail text per item. */ public class DetailListPreference extends ListPreference implements PreferenceHint { private DetailListAdapter mListAdapter; private String[] mDetails; private String mStartingValue; private int mSelectedIndex; private String mHint; private AlertDialog mDialog; private int mWhichButtonClicked; public DetailListPreference(Context context, AttributeSet attrs) { super(context, attrs); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DetailListPreference); for (int i = 0; i < array.getIndexCount(); ++i) { int index = array.getIndex(i); if (index == R.styleable.DetailListPreference_entryDetails) { int id = array.getResourceId(index, -1); if (id != -1) { mDetails = array.getResources().getStringArray(id); } } else if (index == R.styleable.DetailListPreference_longClickHint) { mHint = array.getString(index); } } array.recycle(); mSelectedIndex = -1; } @Override protected void onBindView(@NonNull View view) { super.onBindView(view); setupView((TextView) view.findViewById(android.R.id.title), R.dimen.text_sz_large, R.color.grey_dark, R.color.grey_lighten_10); setupView((TextView) view.findViewById(android.R.id.summary), R.dimen.text_sz_medium, R.color.grey_darken_10, R.color.grey_lighten_10); } @Override public CharSequence getEntry() { int index = findIndexOfValue(getValue()); CharSequence[] entries = getEntries(); if (entries != null && index >= 0 && index < entries.length) { return entries[index]; } return null; } @Override protected void showDialog(Bundle state) { Context context = getContext(); Resources res = context.getResources(); AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Calypso_AlertDialog); mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE; builder.setPositiveButton(android.R.string.ok, this); builder.setNegativeButton(res.getString(R.string.cancel).toUpperCase(), this); if (mDetails == null) { mDetails = new String[getEntries() == null ? 1 : getEntries().length]; } mListAdapter = new DetailListAdapter(getContext(), R.layout.detail_list_preference, mDetails); mStartingValue = getValue(); mSelectedIndex = findIndexOfValue(mStartingValue); builder.setSingleChoiceItems(mListAdapter, mSelectedIndex, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mSelectedIndex = which; } }); View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); if (titleView != null) { TextView titleText = (TextView) titleView.findViewById(R.id.title); if (titleText != null) { titleText.setText(getTitle()); } builder.setCustomTitle(titleView); } else { builder.setTitle(getTitle()); } if ((mDialog = builder.create()) == null) return; if (state != null) { mDialog.onRestoreInstanceState(state); } mDialog.setOnDismissListener(this); mDialog.show(); ListView listView = mDialog.getListView(); Button positive = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); Button negative = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE); if (listView != null) { listView.setDividerHeight(0); listView.setClipToPadding(true); listView.setPadding(0, 0, 0, res.getDimensionPixelSize(R.dimen.site_settings_divider_height)); } if (positive != null) { //noinspection deprecation positive.setTextColor(res.getColor(R.color.blue_medium)); } if (negative != null) { //noinspection deprecation negative.setTextColor(res.getColor(R.color.blue_medium)); } } @Override public void onClick(DialogInterface dialog, int which) { mWhichButtonClicked = which; } @Override public void onDismiss(DialogInterface dialog) { mDialog = null; onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE); } @Override protected void onDialogClosed(boolean positiveResult) { int index = positiveResult ? mSelectedIndex : findIndexOfValue(mStartingValue); CharSequence[] values = getEntryValues(); if (values != null && index >= 0 && index < values.length) { String value = String.valueOf(values[index]); callChangeListener(value); } } @Override public boolean hasHint() { return !TextUtils.isEmpty(mHint); } @Override public String getHint() { return mHint; } @Override public void setHint(String hint) { mHint = hint; } public void refreshAdapter() { if (mListAdapter != null) { mListAdapter.notifyDataSetChanged(); } } public void setDetails(String[] details) { mDetails = details; refreshAdapter(); } /** * Helper method to style the Preference screen view */ private void setupView(TextView view, int sizeRes, int enabledColorRes, int disabledColorRes) { if (view != null) { Resources res = getContext().getResources(); view.setTextSize(TypedValue.COMPLEX_UNIT_PX, res.getDimensionPixelSize(sizeRes)); //noinspection deprecation view.setTextColor(res.getColor(isEnabled() ? enabledColorRes : disabledColorRes)); } } private class DetailListAdapter extends ArrayAdapter<String> { public DetailListAdapter(Context context, int resource, String[] objects) { super(context, resource, objects); } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = View.inflate(getContext(), R.layout.detail_list_preference, null); } final RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radio); TextView mainText = (TextView) convertView.findViewById(R.id.main_text); TextView detailText = (TextView) convertView.findViewById(R.id.detail_text); if (mainText != null && getEntries() != null && position < getEntries().length) { mainText.setText(getEntries()[position]); } if (detailText != null) { if (mDetails != null && position < mDetails.length && !TextUtils.isEmpty(mDetails[position])) { detailText.setVisibility(View.VISIBLE); detailText.setText(mDetails[position]); } else { detailText.setVisibility(View.GONE); } } if (radioButton != null) { radioButton.setChecked(mSelectedIndex == position); radioButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { changeSelection(position); } }); } convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { changeSelection(position); } }); return convertView; } private void changeSelection(int position) { mSelectedIndex = position; notifyDataSetChanged(); } } }