package cn.mutils.app.ui; import android.content.Context; import android.content.DialogInterface; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import cn.mutils.app.ui.core.IViewFinder; import cn.mutils.app.ui.core.UICore; import cn.mutils.core.codec.FlagUtil; @SuppressWarnings({"deprecation", "unused"}) public class Alert implements IViewFinder { public static abstract class AlertListener { /** * Return true to intercept */ public abstract boolean onOK(Alert alert); /** * Return true to intercept */ public abstract boolean onCancel(Alert alert); /** * Return true to intercept */ public boolean onDismiss(Alert alert) { return false; } /** * Return true to intercept */ public boolean onClose(Alert alert) { return false; } } public static final int FLAG_CANCEL_VISIBLE = FlagUtil.FLAG_01; public static final int FLAG_CANCELABLE = FlagUtil.FLAG_02; public static final int FLAG_ACTION_BAR_VISIBLE = FlagUtil.FLAG_03; public static final int FLAG_OK_ENABLED = FlagUtil.FLAG_04; protected int mFlags = FlagUtil.FLAGS_FALSE; protected CharSequence mOK; protected CharSequence mCancel; protected Dialoger mDialog; protected Context mContext; protected int mTitleIconResId; protected int mTitleTextColor; protected CharSequence mTitle; protected CharSequence mMessage; protected AlertListener mListener; protected View mContentView; protected int mBackgroundColor = 0xFFEDEDED; protected int mLeftMargin; protected int mRightMargin; protected int mTopMargin; protected int mBottomMargin; protected LayoutInflater mLayoutInflater; protected View mTitleBar; protected int mTitleId = View.NO_ID; protected int mCloseId = View.NO_ID; protected View mActionBar; protected int mOKId = View.NO_ID; protected int mCancelId = View.NO_ID; protected View mOKView; protected int mMessageGravity = Gravity.CENTER; /** * Fixed with for alert */ protected int mFixedWidth; public Alert(Context context) { mContext = context; mFlags = FlagUtil.setFlags(mFlags, FLAG_CANCELABLE | FLAG_ACTION_BAR_VISIBLE | FLAG_OK_ENABLED, true); } public boolean isCancelVisible() { return FlagUtil.hasFlags(mFlags, FLAG_CANCEL_VISIBLE); } public void setCancelVisible(boolean value) { if (mDialog != null) { return; } if (isCancelVisible() == value) { return; } mFlags = FlagUtil.setFlags(mFlags, FLAG_CANCEL_VISIBLE, value); if (value && mCancel == null) { String country = mContext.getResources().getConfiguration().locale.getCountry(); if (country.equals("CN")) { mOK = "取消"; } else if (country.equals("TW")) { mOK = "取消"; } else { mOK = "Cancel"; } } } public int getFixedWidth() { return mFixedWidth; } public void setFixedWidth(int fixedWidth) { if (mDialog != null) { return; } mFixedWidth = fixedWidth; } public boolean isOKEnabled() { return FlagUtil.hasFlags(mFlags, FLAG_OK_ENABLED); } public void setOKEnabled(boolean value) { if (isOKEnabled() == value) { return; } mFlags = FlagUtil.setFlags(mFlags, FLAG_OK_ENABLED, value); if (mOKView != null) { mOKView.setEnabled(value); } } public LayoutInflater getLayoutInflater() { if (mLayoutInflater == null) { mLayoutInflater = LayoutInflater.from(getContext()); } return mLayoutInflater; } public Resources getResources() { return mContext.getResources(); } public void setMargin(int left, int top, int right, int bottom) { if (mDialog != null) { return; } mLeftMargin = left; mTopMargin = top; mRightMargin = right; mBottomMargin = bottom; } public void setBackgroundColor(int color) { if (mDialog != null) { return; } mBackgroundColor = color; } public Context getContext() { return mContext; } public void setTitleBar(int titleBarLayoutId) { if (mDialog != null) { return; } mTitleBar = titleBarLayoutId == 0 ? null : getLayoutInflater().inflate(titleBarLayoutId, null); } public void setTitleBar(View titleBar) { if (mDialog != null) { return; } mTitleBar = titleBar; } public void setActionBar(int actionBarLayoutId) { if (mDialog != null) { return; } mActionBar = actionBarLayoutId == 0 ? null : getLayoutInflater().inflate(actionBarLayoutId, null); } public void setActionBar(View actionBar) { if (mDialog != null) { return; } mActionBar = actionBar; } public void setTitleIcon(int resId) { if (mDialog != null) { return; } mTitleIconResId = resId; } public void setTitleTextColor(int color) { if (mDialog != null) { return; } mTitleTextColor = color; } public void setTitleId(int titleId) { if (mDialog != null) { return; } mTitleId = titleId; } public void setCloseId(int closeId) { if (mDialog != null) { return; } mCloseId = closeId; } public void setOKId(int OKId) { if (mDialog != null) { return; } mOKId = OKId; } public void setCancelId(int cancelId) { if (mDialog != null) { return; } mCancelId = cancelId; } public boolean isActionBarVisible() { return FlagUtil.hasFlags(mFlags, FLAG_ACTION_BAR_VISIBLE); } public void setActionBarVisible(boolean value) { if (mDialog != null) { return; } mFlags = FlagUtil.setFlags(mFlags, FLAG_ACTION_BAR_VISIBLE, value); } public void setOK(CharSequence OK) { if (mDialog != null) { return; } mOK = OK; } public void setOK(int OKStringId) { if (mDialog != null) { return; } if (OKStringId == 0) { mOK = null; } else { mOK = mContext.getText(OKStringId); } } public void setCancel(CharSequence cancel) { if (mDialog != null) { return; } mCancel = cancel; setCancelVisible(mCancel != null); } public void setCancel(int cancelStringId) { if (mDialog != null) { return; } if (cancelStringId == 0) { mCancel = null; } else { mCancel = mContext.getText(cancelStringId); } setCancelVisible(mCancel != null); } public void setTitle(CharSequence title) { if (mDialog != null) { return; } mTitle = title; } public void setTitle(int titleStringId) { if (mDialog != null) { return; } if (titleStringId == 0) { mTitle = null; } else { mTitle = mContext.getText(titleStringId); } } public void setMessage(CharSequence message) { if (mDialog != null) { return; } mMessage = message; } public void setMessage(int messageStringId) { if (mDialog != null) { return; } if (messageStringId == 0) { mMessage = null; } else { mMessage = mContext.getText(messageStringId); } } public void setMessageGravity(int gravity) { if (mDialog != null) { return; } mMessageGravity = gravity; } public <T extends View> T findViewById(int id, Class<T> viewClass) { if (mContentView == null) { return null; } return UICore.findViewById(mContentView, id, viewClass); } public View findViewById(int id) { if (mContentView == null) { return null; } return mContentView.findViewById(id); } public View getContentView() { return mContentView; } public void setContentView(View contentView) { if (mDialog != null) { return; } mContentView = contentView; } public void setContentView(int contentViewLayoutId) { if (mDialog != null) { return; } if (contentViewLayoutId == 0) { mContentView = null; } else { mContentView = getLayoutInflater().inflate(contentViewLayoutId, null); } } public boolean isCancelable() { return FlagUtil.hasFlags(mFlags, FLAG_CANCELABLE); } public void setCancelable(boolean value) { if (mDialog != null) { return; } mFlags = FlagUtil.setFlags(mFlags, FLAG_CANCELABLE, value); } public void setListener(AlertListener listener) { mListener = listener; } public void close() { if (mDialog == null) { return; } if (mListener != null) { if (mListener.onClose(this)) { return; } } dismiss(); } public void ok() { if (mDialog == null) { return; } if (mListener != null) { if (mListener.onOK(this)) { return; } } dismiss(); } public void cancel() { if (mDialog == null) { return; } if (mListener != null) { if (mListener.onCancel(this)) { return; } } mDialog.cancel(); mDialog = null; } public void dismiss() { if (mDialog == null) { return; } mDialog.dismiss(); mDialog = null; } public void hide() { if (mDialog == null) { return; } mDialog.hide(); } protected void preShow() { } public void show() { if (mDialog != null) { mDialog.show(); return; } preShow(); DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, metrics); int buttonPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, metrics); FrameLayout realContentView = new FrameLayout(mContext); realContentView.setPadding(padding + mLeftMargin, padding + mTopMargin, padding + mRightMargin, padding + mBottomMargin); LinearLayout alertView = new LinearLayout(mContext); GradientDrawable alertViewDrawable = new GradientDrawable(); alertViewDrawable.setColor(mBackgroundColor); alertViewDrawable.setCornerRadius(15); alertView.setBackgroundDrawable(alertViewDrawable); alertView.setOrientation(LinearLayout.VERTICAL); if (mTitleBar == null) { if (mTitle != null) { alertView.setPadding(0, padding, 0, 0); TextView titleTextView = new TextView(mContext); titleTextView.setGravity(Gravity.CENTER); titleTextView.setPadding(padding, padding, padding, padding); titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); titleTextView.setText(mTitle); if (mTitleTextColor != 0) { titleTextView.setTextColor(mTitleTextColor); } else { titleTextView.setTextColor(0xFF000000); } if (mTitleIconResId != 0) { titleTextView.setCompoundDrawablesWithIntrinsicBounds(mTitleIconResId, 0, 0, 0); } alertView.addView(titleTextView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } } else { if (mTitleId != View.NO_ID && mTitle != null) { View titleView = mTitleBar.findViewById(mTitleId); if (titleView != null) { if (titleView instanceof TextView) { TextView titleTextView = (TextView) titleView; titleTextView.setText(mTitle); if (mTitleTextColor != 0) { titleTextView.setTextColor(mTitleTextColor); } if (mTitleIconResId != 0) { titleTextView.setCompoundDrawablesWithIntrinsicBounds(mTitleIconResId, 0, 0, 0); } } } } if (mCloseId != View.NO_ID) { View closeView = mTitleBar.findViewById(mCloseId); if (closeView != null) { closeView.setOnClickListener(new CloseClickListener()); } } if (mTitleBar.getLayoutParams() == null) { mTitleBar.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } alertView.addView(mTitleBar); } ScrollView scrollView = new ScrollView(mContext); scrollView.setVerticalScrollBarEnabled(false); LinearLayout scrollContent = new LinearLayout(mContext); scrollContent.setOrientation(LinearLayout.VERTICAL); if (mContentView == null) { if (mMessage != null) { scrollContent.setPadding(padding, (mTitle != null || mTitleBar != null) ? 0 : padding, padding, padding); TextView messageTextView = new TextView(mContext); messageTextView.setGravity(mMessageGravity); messageTextView.setTextColor(0xFF000000); messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15); messageTextView.setText(mMessage); scrollContent.addView(messageTextView, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } else { scrollContent.setPadding(0, 0, 0, padding); } } else { if (mContentView.getLayoutParams() == null) { mContentView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } scrollContent.addView(mContentView); } scrollView.addView(scrollContent, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); alertView.addView(scrollView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1)); if (isActionBarVisible()) { if (mActionBar == null) { View hLine = new View(mContext); hLine.setBackgroundDrawable(new ColorDrawable(0xFFB3B3B3)); alertView.addView(hLine, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1)); LinearLayout buttonArea = new LinearLayout(mContext); buttonArea.setOrientation(LinearLayout.HORIZONTAL); if (isCancelVisible() && mCancel != null) { TextView cancelButton = new TextView(mContext); StateListDrawable cancelButtonDrawable = new StateListDrawable(); GradientDrawable cancelButtonPressedDrawable = new GradientDrawable(); cancelButtonPressedDrawable.setColor(0xFFD9D9D9); cancelButtonPressedDrawable.setCornerRadii(new float[]{0, 0, 0, 0, 0, 0, 15, 15}); cancelButtonDrawable.addState( new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, cancelButtonPressedDrawable); cancelButton.setBackgroundDrawable(cancelButtonDrawable); cancelButton.setGravity(Gravity.CENTER); cancelButton.setPadding(buttonPadding, buttonPadding, buttonPadding, buttonPadding); cancelButton.setTextColor( new ColorStateList(new int[][]{new int[]{android.R.attr.state_enabled}, new int[]{}}, new int[]{0xFF2F82C7, 0xFF999999})); cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); cancelButton.setText(mCancel); cancelButton.setOnClickListener(new CancelClickListener()); buttonArea.addView(cancelButton, new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1)); View vLine = new View(mContext); vLine.setBackgroundDrawable(new ColorDrawable(0xFFB3B3B3)); buttonArea.addView(vLine, new LinearLayout.LayoutParams(1, LinearLayout.LayoutParams.MATCH_PARENT)); } TextView okButton = new TextView(mContext); StateListDrawable okButtonDrawable = new StateListDrawable(); GradientDrawable okButtonPressedDrawable = new GradientDrawable(); okButtonPressedDrawable.setColor(0xFFD9D9D9); okButtonPressedDrawable.setCornerRadii( new float[]{0, 0, 0, 0, 15, 15, mCancel != null ? 0 : 15, mCancel != null ? 0 : 15}); okButtonDrawable.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, okButtonPressedDrawable); okButton.setBackgroundDrawable(okButtonDrawable); okButton.setGravity(Gravity.CENTER); okButton.setPadding(buttonPadding, buttonPadding, buttonPadding, buttonPadding); okButton.setTextColor( new ColorStateList(new int[][]{new int[]{android.R.attr.state_enabled}, new int[]{}}, new int[]{0xFF2F82C7, 0xFF999999})); okButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); if (mOK == null) { String country = mContext.getResources().getConfiguration().locale.getCountry(); if (country.equals("CN")) { mOK = "确认"; } else if (country.equals("TW")) { mOK = "確認"; } else { mOK = "OK"; } } okButton.setText(mOK); okButton.setOnClickListener(new OKClickListener()); okButton.getPaint().setFakeBoldText(true); mOKView = okButton; mOKView.setEnabled(isOKEnabled()); buttonArea.addView(okButton, new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1)); alertView.addView(buttonArea, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } else { if (mCancelId != View.NO_ID) { View cancelView = mActionBar.findViewById(mCancelId); if (cancelView != null) { if (isCancelVisible() && mCancel != null) { if (cancelView instanceof TextView) { TextView cancelButton = (TextView) cancelView; cancelButton.setText(mCancel); } cancelView.setOnClickListener(new CancelClickListener()); } else { cancelView.setVisibility(View.GONE); } } } if (mOKId != View.NO_ID) { View okView = mActionBar.findViewById(mOKId); if (okView != null) { if (mOK != null && (okView instanceof TextView)) { TextView okButton = (TextView) okView; okButton.setText(mOK); } okView.setOnClickListener(new OKClickListener()); } mOKView = okView; mOKView.setEnabled(isOKEnabled()); } if (mActionBar.getLayoutParams() == null) { mActionBar.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } alertView.addView(mActionBar); } } else { alertView.addView(new View(mContext), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0)); } realContentView.addView(alertView, new FrameLayout.LayoutParams(mFixedWidth != 0 ? mFixedWidth : FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); mDialog = new Dialoger(mContext); mDialog.setCancelable(isCancelable()); mDialog.setCanceledOnTouchOutside(isCancelable()); mDialog.setContentView(realContentView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); mDialog.setOnCancelListener(new DialogCancelListener()); mDialog.setOnDismissListener(new DialogDismissListener()); mDialog.show(); } class OKClickListener implements View.OnClickListener { @Override public void onClick(View v) { ok(); } } class CancelClickListener implements View.OnClickListener { @Override public void onClick(View v) { cancel(); } } class CloseClickListener implements View.OnClickListener { @Override public void onClick(View v) { close(); } } class DialogCancelListener implements DialogInterface.OnCancelListener { @Override public void onCancel(DialogInterface dialog) { cancel(); } } class DialogDismissListener implements DialogInterface.OnDismissListener { @Override public void onDismiss(DialogInterface dialog) { if (mListener != null) { mListener.onDismiss(Alert.this); } } } }