aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java
diff options
context:
space:
mode:
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.java211
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;
+ }
+}