NekoX/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/AlertDialog.java

832 lines
39 KiB
Java

/*
* This is the source code of Telegram for Android v. 3.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2017.
*/
package org.telegram.ui.ActionBar;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.LineProgressView;
import org.telegram.ui.Components.RadialProgressView;
public class AlertDialog extends Dialog implements Drawable.Callback {
private View customView;
private TextView titleTextView;
private TextView subtitleTextView;
private TextView messageTextView;
private FrameLayout progressViewContainer;
private TextView progressViewTextView;
private ScrollView contentScrollView;
private LinearLayout scrollContainer;
private ViewTreeObserver.OnScrollChangedListener onScrollChangedListener;
private BitmapDrawable shadow[] = new BitmapDrawable[2];
private boolean shadowVisibility[] = new boolean[2];
private AnimatorSet shadowAnimation[] = new AnimatorSet[2];
private int lastScreenWidth;
private OnClickListener onClickListener;
private OnDismissListener onDismissListener;
private CharSequence[] items;
private int[] itemIcons;
private CharSequence title;
private CharSequence subtitle;
private CharSequence message;
private int topResId;
private Drawable topDrawable;
private int topBackgroundColor;
private int progressViewStyle;
private int currentProgress;
private ImageView topImageView;
private CharSequence positiveButtonText;
private OnClickListener positiveButtonListener;
private CharSequence negativeButtonText;
private OnClickListener negativeButtonListener;
private CharSequence neutralButtonText;
private OnClickListener neutralButtonListener;
private FrameLayout buttonsLayout;
private LineProgressView lineProgressView;
private TextView lineProgressViewPercent;
private OnClickListener onBackButtonListener;
private Drawable shadowDrawable;
private Rect backgroundPaddings;
public static class AlertDialogCell extends FrameLayout {
private TextView textView;
private ImageView imageView;
public AlertDialogCell(Context context) {
super(context);
setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_dialogButtonSelector), 2));
setPadding(AndroidUtilities.dp(23), 0, AndroidUtilities.dp(23), 0);
imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogIcon), PorterDuff.Mode.MULTIPLY));
addView(imageView, LayoutHelper.createFrame(24, 24, Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)));
textView = new TextView(context);
textView.setLines(1);
textView.setSingleLine(true);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY));
}
public void setTextColor(int color) {
textView.setTextColor(color);
}
public void setGravity(int gravity) {
textView.setGravity(gravity);
}
public void setTextAndIcon(CharSequence text, int icon) {
textView.setText(text);
if (icon != 0) {
imageView.setImageResource(icon);
imageView.setVisibility(VISIBLE);
textView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(56), 0, LocaleController.isRTL ? AndroidUtilities.dp(56) : 0, 0);
} else {
imageView.setVisibility(INVISIBLE);
textView.setPadding(0, 0, 0, 0);
}
}
}
public AlertDialog(Context context, int progressStyle) {
super(context, R.style.TransparentDialog);
backgroundPaddings = new Rect();
shadowDrawable = context.getResources().getDrawable(R.drawable.popup_fixed_alert).mutate();
shadowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogBackground), PorterDuff.Mode.MULTIPLY));
shadowDrawable.getPadding(backgroundPaddings);
progressViewStyle = progressStyle;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout containerView = new LinearLayout(getContext()) {
private boolean inLayout;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
inLayout = true;
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int maxContentHeight;
int availableHeight = maxContentHeight = height - getPaddingTop() - getPaddingBottom();
int availableWidth = width - getPaddingLeft() - getPaddingRight();
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(availableWidth - AndroidUtilities.dp(48), MeasureSpec.EXACTLY);
int childFullWidthMeasureSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.EXACTLY);
LayoutParams layoutParams;
if (buttonsLayout != null) {
int count = buttonsLayout.getChildCount();
for (int a = 0; a < count; a++) {
TextView button = (TextView) buttonsLayout.getChildAt(a);
button.setMaxWidth(AndroidUtilities.dp((availableWidth - AndroidUtilities.dp(24)) / 2));
}
buttonsLayout.measure(childFullWidthMeasureSpec, heightMeasureSpec);
layoutParams = (LayoutParams) buttonsLayout.getLayoutParams();
availableHeight -= buttonsLayout.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
}
if (titleTextView != null) {
titleTextView.measure(childWidthMeasureSpec, heightMeasureSpec);
layoutParams = (LayoutParams) titleTextView.getLayoutParams();
availableHeight -= titleTextView.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
}
if (subtitleTextView != null) {
subtitleTextView.measure(childWidthMeasureSpec, heightMeasureSpec);
layoutParams = (LayoutParams) subtitleTextView.getLayoutParams();
availableHeight -= subtitleTextView.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
}
if (topImageView != null) {
topImageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(132), MeasureSpec.EXACTLY));
availableHeight -= topImageView.getMeasuredHeight() - AndroidUtilities.dp(8);
}
if (progressViewStyle == 0) {
layoutParams = (LayoutParams) contentScrollView.getLayoutParams();
if (customView != null) {
layoutParams.topMargin = titleTextView == null && messageTextView.getVisibility() == GONE && items == null ? AndroidUtilities.dp(16) : 0;
layoutParams.bottomMargin = buttonsLayout == null ? AndroidUtilities.dp(8) : 0;
} else if (items != null) {
layoutParams.topMargin = titleTextView == null && messageTextView.getVisibility() == GONE ? AndroidUtilities.dp(8) : 0;
layoutParams.bottomMargin = AndroidUtilities.dp(8);
} else if (messageTextView.getVisibility() == VISIBLE) {
layoutParams.topMargin = titleTextView == null ? AndroidUtilities.dp(19) : 0;
layoutParams.bottomMargin = AndroidUtilities.dp(20);
}
availableHeight -= layoutParams.bottomMargin + layoutParams.topMargin;
contentScrollView.measure(childFullWidthMeasureSpec, MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.AT_MOST));
availableHeight -= contentScrollView.getMeasuredHeight();
} else {
if (progressViewContainer != null) {
progressViewContainer.measure(childWidthMeasureSpec, MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.AT_MOST));
layoutParams = (LayoutParams) progressViewContainer.getLayoutParams();
availableHeight -= progressViewContainer.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
} else if (messageTextView != null) {
messageTextView.measure(childWidthMeasureSpec, MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.AT_MOST));
if (messageTextView.getVisibility() != GONE) {
layoutParams = (LayoutParams) messageTextView.getLayoutParams();
availableHeight -= messageTextView.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
}
}
if (lineProgressView != null) {
lineProgressView.measure(childWidthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(4), MeasureSpec.EXACTLY));
layoutParams = (LayoutParams) lineProgressView.getLayoutParams();
availableHeight -= lineProgressView.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
lineProgressViewPercent.measure(childWidthMeasureSpec, MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.AT_MOST));
layoutParams = (LayoutParams) lineProgressViewPercent.getLayoutParams();
availableHeight -= lineProgressViewPercent.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin;
}
}
setMeasuredDimension(width, maxContentHeight - availableHeight + getPaddingTop() + getPaddingBottom());
inLayout = false;
if (lastScreenWidth != AndroidUtilities.displaySize.x) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
lastScreenWidth = AndroidUtilities.displaySize.x;
final int calculatedWidth = AndroidUtilities.displaySize.x - AndroidUtilities.dp(56);
int maxWidth;
if (AndroidUtilities.isTablet()) {
if (AndroidUtilities.isSmallTablet()) {
maxWidth = AndroidUtilities.dp(446);
} else {
maxWidth = AndroidUtilities.dp(496);
}
} else {
maxWidth = AndroidUtilities.dp(356);
}
Window window = getWindow();
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.copyFrom(window.getAttributes());
params.width = Math.min(maxWidth, calculatedWidth) + backgroundPaddings.left + backgroundPaddings.right;
window.setAttributes(params);
}
});
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (contentScrollView != null) {
if (onScrollChangedListener == null) {
onScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
runShadowAnimation(0, titleTextView != null && contentScrollView.getScrollY() > scrollContainer.getTop());
runShadowAnimation(1, buttonsLayout != null && contentScrollView.getScrollY() + contentScrollView.getHeight() < scrollContainer.getBottom());
contentScrollView.invalidate();
}
};
contentScrollView.getViewTreeObserver().addOnScrollChangedListener(onScrollChangedListener);
}
onScrollChangedListener.onScrollChanged();
}
}
@Override
public void requestLayout() {
if (inLayout) {
return;
}
super.requestLayout();
}
@Override
public boolean hasOverlappingRendering() {
return false;
}
};
containerView.setOrientation(LinearLayout.VERTICAL);
containerView.setBackgroundDrawable(shadowDrawable);
containerView.setFitsSystemWindows(Build.VERSION.SDK_INT >= 21);
setContentView(containerView);
final boolean hasButtons = positiveButtonText != null || negativeButtonText != null || neutralButtonText != null;
if (topResId != 0 || topDrawable != null) {
topImageView = new ImageView(getContext());
if (topDrawable != null) {
topImageView.setImageDrawable(topDrawable);
} else {
topImageView.setImageResource(topResId);
}
topImageView.setScaleType(ImageView.ScaleType.CENTER);
topImageView.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.popup_fixed_top));
topImageView.getBackground().setColorFilter(new PorterDuffColorFilter(topBackgroundColor, PorterDuff.Mode.MULTIPLY));
topImageView.setPadding(0, 0, 0, 0);
containerView.addView(topImageView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 132, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, -8, -8, 0, 0));
}
if (title != null) {
titleTextView = new TextView(getContext());
titleTextView.setText(title);
titleTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
titleTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
containerView.addView(titleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 19, 24, (subtitle != null ? 2 : (items != null ? 14 : 10))));
}
if (subtitle != null) {
subtitleTextView = new TextView(getContext());
subtitleTextView.setText(subtitle);
subtitleTextView.setTextColor(Theme.getColor(Theme.key_dialogIcon));
subtitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
subtitleTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
containerView.addView(subtitleTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 0, 24, items != null ? 14 : 10));
}
if (progressViewStyle == 0) {
shadow[0] = (BitmapDrawable) getContext().getResources().getDrawable(R.drawable.header_shadow).mutate();
shadow[1] = (BitmapDrawable) getContext().getResources().getDrawable(R.drawable.header_shadow_reverse).mutate();
shadow[0].setAlpha(0);
shadow[1].setAlpha(0);
shadow[0].setCallback(this);
shadow[1].setCallback(this);
contentScrollView = new ScrollView(getContext()) {
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
boolean result = super.drawChild(canvas, child, drawingTime);
if (shadow[0].getPaint().getAlpha() != 0) {
shadow[0].setBounds(0, getScrollY(), getMeasuredWidth(), getScrollY() + AndroidUtilities.dp(3));
shadow[0].draw(canvas);
}
if (shadow[1].getPaint().getAlpha() != 0) {
shadow[1].setBounds(0, getScrollY() + getMeasuredHeight() - AndroidUtilities.dp(3), getMeasuredWidth(), getScrollY() + getMeasuredHeight());
shadow[1].draw(canvas);
}
return result;
}
};
contentScrollView.setVerticalScrollBarEnabled(false);
AndroidUtilities.setScrollViewEdgeEffectColor(contentScrollView, Theme.getColor(Theme.key_dialogScrollGlow));
containerView.addView(contentScrollView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 0));
scrollContainer = new LinearLayout(getContext());
scrollContainer.setOrientation(LinearLayout.VERTICAL);
contentScrollView.addView(scrollContainer, new ScrollView.LayoutParams(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
messageTextView = new TextView(getContext());
messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
if (progressViewStyle == 1) {
progressViewContainer = new FrameLayout(getContext());
containerView.addView(progressViewContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 44, Gravity.LEFT | Gravity.TOP, 23, title == null ? 24 : 0, 23, 24));
RadialProgressView progressView = new RadialProgressView(getContext());
progressView.setProgressColor(Theme.getColor(Theme.key_dialogProgressCircle));
progressViewContainer.addView(progressView, LayoutHelper.createFrame(44, 44, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP));
messageTextView.setLines(1);
messageTextView.setSingleLine(true);
messageTextView.setEllipsize(TextUtils.TruncateAt.END);
progressViewContainer.addView(messageTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, (LocaleController.isRTL ? 0 : 62), 0, (LocaleController.isRTL ? 62 : 0), 0));
} else if (progressViewStyle == 2) {
containerView.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, title == null ? 19 : 0, 24, 20));
lineProgressView = new LineProgressView(getContext());
lineProgressView.setProgress(currentProgress / 100.0f, false);
lineProgressView.setProgressColor(Theme.getColor(Theme.key_dialogLineProgress));
lineProgressView.setBackColor(Theme.getColor(Theme.key_dialogLineProgressBackground));
containerView.addView(lineProgressView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 4, Gravity.LEFT | Gravity.CENTER_VERTICAL, 24, 0, 24, 0));
lineProgressViewPercent = new TextView(getContext());
lineProgressViewPercent.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
lineProgressViewPercent.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
lineProgressViewPercent.setTextColor(Theme.getColor(Theme.key_dialogTextGray2));
lineProgressViewPercent.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
containerView.addView(lineProgressViewPercent, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 23, 4, 23, 24));
updateLineProgressTextView();
} else {
scrollContainer.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 0, 24, customView != null || items != null ? 20 : 0));
}
if (!TextUtils.isEmpty(message)) {
messageTextView.setText(message);
messageTextView.setVisibility(View.VISIBLE);
} else {
messageTextView.setVisibility(View.GONE);
}
if (items != null) {
FrameLayout rowLayout = null;
int lastRowLayoutNum = 0;
for (int a = 0; a < items.length; a++) {
if (items[a] == null) {
continue;
}
AlertDialogCell cell = new AlertDialogCell(getContext());
cell.setTextAndIcon(items[a], itemIcons != null ? itemIcons[a] : 0);
scrollContainer.addView(cell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
cell.setTag(a);
cell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(AlertDialog.this, (Integer) v.getTag());
}
dismiss();
}
});
}
}
if (customView != null) {
if (customView.getParent() != null) {
ViewGroup viewGroup = (ViewGroup) customView.getParent();
viewGroup.removeView(customView);
}
scrollContainer.addView(customView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
if (hasButtons) {
buttonsLayout = new FrameLayout(getContext()) {
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int count = getChildCount();
View positiveButton = null;
int width = right - left;
for (int a = 0; a < count; a++) {
View child = getChildAt(a);
if ((Integer) child.getTag() == Dialog.BUTTON_POSITIVE) {
positiveButton = child;
child.layout(width - getPaddingRight() - child.getMeasuredWidth(), getPaddingTop(), width - getPaddingRight() + child.getMeasuredWidth(), getPaddingTop() + child.getMeasuredHeight());
} else if ((Integer) child.getTag() == Dialog.BUTTON_NEGATIVE) {
int x = width - getPaddingRight() - child.getMeasuredWidth();
if (positiveButton != null) {
x -= positiveButton.getMeasuredWidth() + AndroidUtilities.dp(8);
}
child.layout(x, getPaddingTop(), x + child.getMeasuredWidth(), getPaddingTop() + child.getMeasuredHeight());
} else {
child.layout(getPaddingLeft(), getPaddingTop(), getPaddingLeft() + child.getMeasuredWidth(), getPaddingTop() + child.getMeasuredHeight());
}
}
}
};
buttonsLayout.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8));
containerView.addView(buttonsLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 52));
if (positiveButtonText != null) {
TextView textView = new TextView(getContext()) {
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setAlpha(enabled ? 1.0f : 0.5f);
}
};
textView.setMinWidth(AndroidUtilities.dp(64));
textView.setTag(Dialog.BUTTON_POSITIVE);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setTextColor(Theme.getColor(Theme.key_dialogButton));
textView.setGravity(Gravity.CENTER);
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
// textView.setLines(1);
// textView.setSingleLine(true); //TODO
textView.setText(positiveButtonText.toString().toUpperCase());
textView.setBackgroundDrawable(Theme.getRoundRectSelectorDrawable());
textView.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), 0);
buttonsLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 36, Gravity.TOP | Gravity.RIGHT));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (positiveButtonListener != null) {
positiveButtonListener.onClick(AlertDialog.this, Dialog.BUTTON_POSITIVE);
}
dismiss();
}
});
}
if (negativeButtonText != null) {
TextView textView = new TextView(getContext()) {
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setAlpha(enabled ? 1.0f : 0.5f);
}
};
textView.setMinWidth(AndroidUtilities.dp(64));
textView.setTag(Dialog.BUTTON_NEGATIVE);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setTextColor(Theme.getColor(Theme.key_dialogButton));
textView.setGravity(Gravity.CENTER);
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
// textView.setLines(1);
// textView.setSingleLine(true);
textView.setText(negativeButtonText.toString().toUpperCase());
textView.setBackgroundDrawable(Theme.getRoundRectSelectorDrawable());
textView.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), 0);
buttonsLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 36, Gravity.TOP | Gravity.RIGHT));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (negativeButtonListener != null) {
negativeButtonListener.onClick(AlertDialog.this, Dialog.BUTTON_NEGATIVE);
}
cancel();
}
});
}
if (neutralButtonText != null) {
TextView textView = new TextView(getContext()) {
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setAlpha(enabled ? 1.0f : 0.5f);
}
};
textView.setMinWidth(AndroidUtilities.dp(64));
textView.setTag(Dialog.BUTTON_NEUTRAL);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
textView.setTextColor(Theme.getColor(Theme.key_dialogButton));
textView.setGravity(Gravity.CENTER);
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
// textView.setLines(1);
// textView.setSingleLine(true);
textView.setText(neutralButtonText.toString().toUpperCase());
textView.setBackgroundDrawable(Theme.getRoundRectSelectorDrawable());
textView.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), 0);
buttonsLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 36, Gravity.TOP | Gravity.LEFT));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (neutralButtonListener != null) {
neutralButtonListener.onClick(AlertDialog.this, Dialog.BUTTON_NEGATIVE);
}
dismiss();
}
});
}
}
lastScreenWidth = AndroidUtilities.displaySize.x;
final int calculatedWidth = AndroidUtilities.displaySize.x - AndroidUtilities.dp(48);
int maxWidth;
if (AndroidUtilities.isTablet()) {
if (AndroidUtilities.isSmallTablet()) {
maxWidth = AndroidUtilities.dp(446);
} else {
maxWidth = AndroidUtilities.dp(496);
}
} else {
maxWidth = AndroidUtilities.dp(356);
}
Window window = getWindow();
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.copyFrom(window.getAttributes());
params.dimAmount = 0.6f;
params.width = Math.min(maxWidth, calculatedWidth) + backgroundPaddings.left + backgroundPaddings.right;
params.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
if (customView == null || !canTextInput(customView)) {
params.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
}
window.setAttributes(params);
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (onBackButtonListener != null) {
onBackButtonListener.onClick(AlertDialog.this, AlertDialog.BUTTON_NEGATIVE);
}
}
private void runShadowAnimation(final int num, final boolean show) {
if (show && !shadowVisibility[num] || !show && shadowVisibility[num]) {
shadowVisibility[num] = show;
if (shadowAnimation[num] != null) {
shadowAnimation[num].cancel();
}
shadowAnimation[num] = new AnimatorSet();
if (shadow[num] != null) {
shadowAnimation[num].playTogether(ObjectAnimator.ofInt(shadow[num], "alpha", show ? 255 : 0));
}
shadowAnimation[num].setDuration(150);
shadowAnimation[num].addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (shadowAnimation[num] != null && shadowAnimation[num].equals(animation)) {
shadowAnimation[num] = null;
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (shadowAnimation[num] != null && shadowAnimation[num].equals(animation)) {
shadowAnimation[num] = null;
}
}
});
try {
shadowAnimation[num].start();
} catch (Exception e) {
FileLog.e(e);
}
}
}
public void setProgressStyle(int style) {
progressViewStyle = style;
}
public void setProgress(int progress) {
currentProgress = progress;
if (lineProgressView != null) {
lineProgressView.setProgress(progress / 100.0f, true);
updateLineProgressTextView();
}
}
private void updateLineProgressTextView() {
lineProgressViewPercent.setText(String.format("%d%%", currentProgress));
}
private boolean canTextInput(View v) {
if (v.onCheckIsTextEditor()) {
return true;
}
if (!(v instanceof ViewGroup)) {
return false;
}
ViewGroup vg = (ViewGroup) v;
int i = vg.getChildCount();
while (i > 0) {
i--;
v = vg.getChildAt(i);
if (canTextInput(v)) {
return true;
}
}
return false;
}
@Override
public void dismiss() {
super.dismiss();
}
@Override
public void setCanceledOnTouchOutside(boolean cancel) {
super.setCanceledOnTouchOutside(cancel);
}
public void setMessage(CharSequence text) {
message = text;
if (messageTextView != null) {
if (!TextUtils.isEmpty(message)) {
messageTextView.setText(message);
messageTextView.setVisibility(View.VISIBLE);
} else {
messageTextView.setVisibility(View.GONE);
}
}
}
public void setButton(int type, CharSequence text, final OnClickListener listener) {
switch (type) {
case BUTTON_NEUTRAL:
neutralButtonText = text;
neutralButtonListener = listener;
break;
case BUTTON_NEGATIVE:
negativeButtonText = text;
negativeButtonListener = listener;
break;
case BUTTON_POSITIVE:
positiveButtonText = text;
positiveButtonListener = listener;
break;
}
}
public View getButton(int type) {
return buttonsLayout.findViewWithTag(type);
}
@Override
public void invalidateDrawable(Drawable who) {
contentScrollView.invalidate();
scrollContainer.invalidate();
}
@Override
public void scheduleDrawable(Drawable who, Runnable what, long when) {
if (contentScrollView != null) {
contentScrollView.postDelayed(what, when);
}
}
@Override
public void unscheduleDrawable(Drawable who, Runnable what) {
if (contentScrollView != null) {
contentScrollView.removeCallbacks(what);
}
}
public static class Builder {
private AlertDialog alertDialog;
public Builder(Context context) {
alertDialog = new AlertDialog(context, 0);
}
public Builder(Context context, int progressViewStyle) {
alertDialog = new AlertDialog(context, progressViewStyle);
}
public Context getContext() {
return alertDialog.getContext();
}
public Builder setItems(CharSequence[] items, final OnClickListener onClickListener) {
alertDialog.items = items;
alertDialog.onClickListener = onClickListener;
return this;
}
public Builder setItems(CharSequence[] items, int[] icons, final OnClickListener onClickListener) {
alertDialog.items = items;
alertDialog.itemIcons = icons;
alertDialog.onClickListener = onClickListener;
return this;
}
public Builder setView(View view) {
alertDialog.customView = view;
return this;
}
public Builder setTitle(CharSequence title) {
alertDialog.title = title;
return this;
}
public Builder setSubtitle(CharSequence subtitle) {
alertDialog.subtitle = subtitle;
return this;
}
public Builder setTopImage(int resId, int backgroundColor) {
alertDialog.topResId = resId;
alertDialog.topBackgroundColor = backgroundColor;
return this;
}
public Builder setTopImage(Drawable drawable, int backgroundColor) {
alertDialog.topDrawable = drawable;
alertDialog.topBackgroundColor = backgroundColor;
return this;
}
public Builder setMessage(CharSequence message) {
alertDialog.message = message;
return this;
}
public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {
alertDialog.positiveButtonText = text;
alertDialog.positiveButtonListener = listener;
return this;
}
public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {
alertDialog.negativeButtonText = text;
alertDialog.negativeButtonListener = listener;
return this;
}
public Builder setNeutralButton(CharSequence text, final OnClickListener listener) {
alertDialog.neutralButtonText = text;
alertDialog.neutralButtonListener = listener;
return this;
}
public Builder setOnBackButtonListener(final OnClickListener listener) {
alertDialog.onBackButtonListener = listener;
return this;
}
public AlertDialog create() {
return alertDialog;
}
public AlertDialog show() {
alertDialog.show();
return alertDialog;
}
public Builder setOnDismissListener(OnDismissListener onDismissListener) {
alertDialog.setOnDismissListener(onDismissListener);
return this;
}
}
}