diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java new file mode 100644 index 000000000..b3998ab24 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java @@ -0,0 +1,211 @@ +package org.wordpress.android.ui.prefs; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.os.Build; +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.support.annotation.NonNull; +import android.support.v7.app.AlertDialog; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.util.WPPrefUtils; + +/** + * Standard EditTextPreference that has attributes to limit summary length. + * + * Created for and used by {@link SiteSettingsFragment} to style some Preferences. + * + * When declaring this class in a layout file you can use the following attributes: + * - app:summaryLines : sets the number of lines to display in the Summary field + * (see {@link TextView#setLines(int)} for details) + * - app:maxSummaryLines : sets the maximum number of lines the Summary field can display + * (see {@link TextView#setMaxLines(int)} for details) + * - app:longClickHint : sets the string to be shown in a Toast when preference is long clicked + */ + +public class SummaryEditTextPreference extends EditTextPreference implements PreferenceHint { + private int mLines; + private int mMaxLines; + private String mHint; + private AlertDialog mDialog; + private int mWhichButtonClicked; + + public SummaryEditTextPreference(Context context) { + super(context); + } + + public SummaryEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SummaryEditTextPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + mLines = -1; + mMaxLines = -1; + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SummaryEditTextPreference); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.SummaryEditTextPreference_summaryLines) { + mLines = array.getInt(index, -1); + } else if (index == R.styleable.SummaryEditTextPreference_maxSummaryLines) { + mMaxLines = array.getInt(index, -1); + } else if (index == R.styleable.SummaryEditTextPreference_longClickHint) { + mHint = array.getString(index); + } + } + + array.recycle(); + } + + @Override + protected void onBindView(@NonNull View view) { + super.onBindView(view); + + TextView titleView = (TextView) view.findViewById(android.R.id.title); + TextView summaryView = (TextView) view.findViewById(android.R.id.summary); + + if (titleView != null) WPPrefUtils.layoutAsSubhead(titleView); + + if (summaryView != null) { + WPPrefUtils.layoutAsBody1(summaryView); + summaryView.setEllipsize(TextUtils.TruncateAt.END); + summaryView.setInputType(getEditText().getInputType()); + if (mLines != -1) summaryView.setLines(mLines); + if (mMaxLines != -1) summaryView.setMaxLines(mMaxLines); + } + } + + @Override + public Dialog getDialog() { + return mDialog; + } + + @Override + protected void showDialog(Bundle state) { + Context context = getContext(); + Resources res = context.getResources(); + AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.Calypso_AlertDialog); + View titleView = View.inflate(getContext(), R.layout.detail_list_preference_title, null); + mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE; + + builder.setPositiveButton(R.string.ok, this); + builder.setNegativeButton(res.getString(R.string.cancel).toUpperCase(), this); + if (titleView != null) { + TextView titleText = (TextView) titleView.findViewById(R.id.title); + if (titleText != null) { + titleText.setText(getTitle()); + } + + builder.setCustomTitle(titleView); + } else { + builder.setTitle(getTitle()); + } + + View view = View.inflate(getContext(), getDialogLayoutResource(), null); + if (view != null) { + onBindDialogView(view); + builder.setView(view); + } + + if ((mDialog = builder.create()) == null) return; + + if (state != null) { + mDialog.onRestoreInstanceState(state); + } + mDialog.setOnDismissListener(this); + mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + mDialog.show(); + + Button positive = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); + Button negative = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE); + if (positive != null) WPPrefUtils.layoutAsFlatButton(positive); + if (negative != null) WPPrefUtils.layoutAsFlatButton(negative); + } + + @Override + protected void onBindDialogView(final View view) { + super.onBindDialogView(view); + if (view == null) return; + + EditText editText = getEditText(); + ViewParent oldParent = editText.getParent(); + if (oldParent != view) { + if (oldParent != null && oldParent instanceof ViewGroup) { + ViewGroup groupParent = (ViewGroup) oldParent; + groupParent.removeView(editText); + groupParent.setPadding(groupParent.getPaddingLeft(), 0, groupParent.getPaddingRight(), groupParent.getPaddingBottom()); + } + onAddEditTextToDialogView(view, editText); + } + WPPrefUtils.layoutAsInput(editText); + editText.setSelection(editText.getText().length()); + + TextView message = (TextView) view.findViewById(android.R.id.message); + WPPrefUtils.layoutAsDialogMessage(message); + + // Dialog message has some extra bottom margin we don't want + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) message.getLayoutParams(); + int leftMargin = 0; + int bottomMargin = view.getResources().getDimensionPixelSize(R.dimen.margin_small); + // Different versions handle the message view's margin differently + // This is a small hack to try to make it align with the input for earlier versions + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) { + leftMargin = view.getResources().getDimensionPixelSize(R.dimen.margin_small); + } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + leftMargin = view.getResources().getDimensionPixelSize(R.dimen.margin_large); + } + layoutParams.setMargins(leftMargin, layoutParams.topMargin, layoutParams.rightMargin, bottomMargin); + message.setLayoutParams(layoutParams); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + mWhichButtonClicked = which; + } + + @Override + public void onDismiss(DialogInterface dialog) { + mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + if (positiveResult) { + callChangeListener(getEditText().getText()); + } + } + + @Override + public boolean hasHint() { + return !TextUtils.isEmpty(mHint); + } + + @Override + public String getHint() { + return mHint; + } + + @Override + public void setHint(String hint) { + mHint = hint; + } +} |