You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
13 KiB
369 lines
13 KiB
package com.kongzue.dialogx.interfaces;
|
|
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.content.res.ColorStateList;
|
|
import android.content.res.Configuration;
|
|
import android.content.res.Resources;
|
|
import android.graphics.Color;
|
|
import android.graphics.Typeface;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.util.Log;
|
|
import android.util.TypedValue;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.WindowManager;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
|
|
import androidx.annotation.ColorRes;
|
|
import androidx.appcompat.app.AppCompatDelegate;
|
|
|
|
import com.kongzue.dialogx.DialogX;
|
|
import com.kongzue.dialogx.dialogs.PopTip;
|
|
import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
|
|
import com.kongzue.dialogx.util.TextInfo;
|
|
import com.kongzue.dialogx.util.WindowUtil;
|
|
|
|
import java.lang.ref.WeakReference;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
import static com.kongzue.dialogx.DialogX.DEBUGMODE;
|
|
|
|
/**
|
|
* @author: Kongzue
|
|
* @github: https://github.com/kongzue/
|
|
* @homepage: http://kongzue.com/
|
|
* @mail: myzcxhh@live.cn
|
|
* @createTime: 2020/9/22 14:10
|
|
*/
|
|
public abstract class BaseDialog {
|
|
|
|
private static WeakReference<FrameLayout> rootFrameLayout;
|
|
private static WeakReference<Activity> contextWeakReference;
|
|
protected WeakReference<Activity> ownActivity;
|
|
private static List<BaseDialog> runningDialogList;
|
|
private WeakReference<View> dialogView;
|
|
|
|
public static void init(Context context) {
|
|
if (context instanceof Activity) {
|
|
initActivityContext((Activity) context);
|
|
}
|
|
ActivityLifecycleImpl.init(context, new ActivityLifecycleImpl.onActivityResumeCallBack() {
|
|
@Override
|
|
public void getActivity(Activity activity) {
|
|
initActivityContext(activity);
|
|
}
|
|
});
|
|
}
|
|
|
|
public static void initActivityContext(Activity activity) {
|
|
try {
|
|
contextWeakReference = new WeakReference<>(activity);
|
|
rootFrameLayout = new WeakReference<>((FrameLayout) activity.getWindow().getDecorView());
|
|
} catch (Exception e) {
|
|
error("DialogX.init: 初始化异常,找不到Activity的根布局");
|
|
}
|
|
}
|
|
|
|
protected static void log(Object o) {
|
|
if (DEBUGMODE) Log.i(">>>", o.toString());
|
|
}
|
|
|
|
protected static void error(Object o) {
|
|
if (DEBUGMODE) Log.e(">>>", o.toString());
|
|
}
|
|
|
|
public abstract void onUIModeChange(Configuration newConfig);
|
|
|
|
protected static void show(final View view) {
|
|
if (view == null) return;
|
|
final BaseDialog baseDialog = (BaseDialog) view.getTag();
|
|
baseDialog.ownActivity = new WeakReference<>(contextWeakReference.get());
|
|
baseDialog.dialogView = new WeakReference<>(view);
|
|
|
|
log(baseDialog.dialogKey() + ".show");
|
|
addDialogToRunningList(baseDialog);
|
|
if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
|
|
if (rootFrameLayout == null || rootFrameLayout.get() == null) return;
|
|
log(rootFrameLayout.get());
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
rootFrameLayout.get().addView(view);
|
|
}
|
|
});
|
|
} else {
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
WindowUtil.show(contextWeakReference.get(), view, !(baseDialog instanceof PopTip));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
protected static void show(final Activity activity, final View view) {
|
|
if (activity == null || view == null) return;
|
|
if (activity.isDestroyed()) {
|
|
error(((BaseDialog) view.getTag()).dialogKey() + ".show ERROR: activity is Destroyed.");
|
|
return;
|
|
}
|
|
final BaseDialog baseDialog = (BaseDialog) view.getTag();
|
|
baseDialog.ownActivity = new WeakReference<>(activity);
|
|
baseDialog.dialogView = new WeakReference<>(view);
|
|
|
|
log(baseDialog + ".show");
|
|
addDialogToRunningList(baseDialog);
|
|
if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
|
|
final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
|
|
if (activityRootView == null) {
|
|
return;
|
|
}
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
activityRootView.addView(view);
|
|
}
|
|
});
|
|
} else {
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
WindowUtil.show(activity, view, !(baseDialog instanceof PopTip));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
protected static void dismiss(final View dialogView) {
|
|
if (dialogView == null) return;
|
|
final BaseDialog baseDialog = (BaseDialog) dialogView.getTag();
|
|
log(baseDialog.dialogKey() + ".dismiss");
|
|
removeDialogToRunningList(baseDialog);
|
|
if (baseDialog.dialogView != null) baseDialog.dialogView.clear();
|
|
if (DialogX.implIMPLMode == DialogX.IMPL_MODE.VIEW) {
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
if (dialogView.getParent() == null || !(dialogView.getParent() instanceof ViewGroup)) {
|
|
if (rootFrameLayout == null) return;
|
|
rootFrameLayout.get().removeView(dialogView);
|
|
} else {
|
|
((ViewGroup) dialogView.getParent()).removeView(dialogView);
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
runOnMain(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
WindowUtil.dismiss(dialogView);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private static void addDialogToRunningList(BaseDialog baseDialog) {
|
|
if (runningDialogList == null) runningDialogList = new ArrayList<>();
|
|
runningDialogList.add(baseDialog);
|
|
}
|
|
|
|
private static void removeDialogToRunningList(BaseDialog baseDialog) {
|
|
if (runningDialogList != null) runningDialogList.remove(baseDialog);
|
|
}
|
|
|
|
public static Context getContext() {
|
|
if (contextWeakReference == null) return null;
|
|
return contextWeakReference.get();
|
|
}
|
|
|
|
public static void cleanContext() {
|
|
contextWeakReference.clear();
|
|
contextWeakReference = null;
|
|
System.gc();
|
|
}
|
|
|
|
protected boolean cancelable = true;
|
|
protected OnBackPressedListener onBackPressedListener;
|
|
protected boolean isShow;
|
|
protected DialogXStyle style;
|
|
protected DialogX.THEME theme;
|
|
protected boolean autoShowInputKeyboard;
|
|
protected int backgroundColor = -1;
|
|
protected long enterAnimDuration = -1;
|
|
protected long exitAnimDuration = -1;
|
|
|
|
public BaseDialog() {
|
|
cancelable = DialogX.cancelable;
|
|
style = DialogX.globalStyle;
|
|
theme = DialogX.globalTheme;
|
|
enterAnimDuration = DialogX.enterAnimDuration;
|
|
exitAnimDuration = DialogX.exitAnimDuration;
|
|
autoShowInputKeyboard = DialogX.autoShowInputKeyboard;
|
|
}
|
|
|
|
public View createView(int layoutId) {
|
|
return LayoutInflater.from(getContext()).inflate(layoutId, null);
|
|
}
|
|
|
|
public boolean isShow() {
|
|
return isShow;
|
|
}
|
|
|
|
public DialogXStyle getStyle() {
|
|
return style;
|
|
}
|
|
|
|
public DialogX.THEME getTheme() {
|
|
return theme;
|
|
}
|
|
|
|
protected void useTextInfo(TextView textView, TextInfo textInfo) {
|
|
if (textInfo == null) return;
|
|
if (textView == null) return;
|
|
if (textInfo.getFontSize() > 0) {
|
|
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textInfo.getFontSize());
|
|
}
|
|
if (textInfo.getFontColor() != 1) {
|
|
textView.setTextColor(textInfo.getFontColor());
|
|
}
|
|
if (textInfo.getGravity() != -1) {
|
|
textView.setGravity(textInfo.getGravity());
|
|
}
|
|
textView.getPaint().setFakeBoldText(textInfo.isBold());
|
|
}
|
|
|
|
protected void showText(TextView textView, CharSequence text) {
|
|
if (textView == null) return;
|
|
if (isNull(text)) {
|
|
textView.setVisibility(View.GONE);
|
|
textView.setText("");
|
|
} else {
|
|
textView.setVisibility(View.VISIBLE);
|
|
textView.setText(text);
|
|
}
|
|
}
|
|
|
|
protected View createHorizontalSplitView(int color) {
|
|
View splitView = new View(getContext());
|
|
splitView.setBackgroundColor(color);
|
|
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1);
|
|
splitView.setLayoutParams(lp);
|
|
return splitView;
|
|
}
|
|
|
|
protected View createVerticalSplitView(int color, int height) {
|
|
View splitView = new View(getContext());
|
|
splitView.setBackgroundColor(color);
|
|
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(1, dip2px(height));
|
|
splitView.setLayoutParams(lp);
|
|
return splitView;
|
|
}
|
|
|
|
public static boolean isNull(String s) {
|
|
if (s == null || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static boolean isNull(CharSequence c) {
|
|
String s = String.valueOf(c);
|
|
if (c == null || s.trim().isEmpty() || "null".equals(s) || "(null)".equals(s)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public Resources getResources() {
|
|
if (getContext() == null) return Resources.getSystem();
|
|
return getContext().getResources();
|
|
}
|
|
|
|
public int dip2px(float dpValue) {
|
|
final float scale = getContext().getResources().getDisplayMetrics().density;
|
|
return (int) (dpValue * scale + 0.5f);
|
|
}
|
|
|
|
public boolean isLightTheme() {
|
|
if (theme == DialogX.THEME.AUTO) {
|
|
return (getContext().getApplicationContext().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO;
|
|
}
|
|
return theme == DialogX.THEME.LIGHT;
|
|
}
|
|
|
|
public static FrameLayout getRootFrameLayout() {
|
|
if (rootFrameLayout == null) {
|
|
error("DialogX 未初始化。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
|
|
return null;
|
|
}
|
|
return rootFrameLayout.get();
|
|
}
|
|
|
|
public void tintColor(View view, int color) {
|
|
view.setBackgroundTintList(ColorStateList.valueOf(color));
|
|
}
|
|
|
|
protected void beforeShow() {
|
|
if (getContext() == null) {
|
|
error("DialogX 未初始化。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
|
|
}
|
|
if (style.styleVer != DialogXStyle.styleVer) {
|
|
error("DialogX 所引用的 Style 不符合当前适用版本:" + DialogXStyle.styleVer + " 引入的 Style(" + style.getClass().getSimpleName() + ") 版本" + style.styleVer);
|
|
}
|
|
}
|
|
|
|
protected String getString(int titleResId) {
|
|
if (getContext() == null) {
|
|
error("DialogX 未初始化。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
|
|
return null;
|
|
}
|
|
return getContext().getString(titleResId);
|
|
}
|
|
|
|
protected int getColor(int backgroundRes) {
|
|
if (getContext() == null) {
|
|
error("DialogX 未初始化。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
|
|
return Color.BLACK;
|
|
}
|
|
return getResources().getColor(backgroundRes);
|
|
}
|
|
|
|
public enum BOOLEAN {
|
|
TRUE, FALSE
|
|
}
|
|
|
|
public abstract String dialogKey();
|
|
|
|
protected static void runOnMain(Runnable runnable) {
|
|
if (!DialogX.autoRunOnUIThread) runnable.run();
|
|
new Handler(Looper.getMainLooper()).post(runnable);
|
|
}
|
|
|
|
public Activity getActivity() {
|
|
return ownActivity == null ? null : ownActivity.get();
|
|
}
|
|
|
|
protected void cleanActivityContext() {
|
|
if (ownActivity != null) ownActivity.clear();
|
|
}
|
|
|
|
public static void recycleDialog(Activity activity) {
|
|
if (DialogX.implIMPLMode == DialogX.IMPL_MODE.WINDOW) {
|
|
if (runningDialogList != null) {
|
|
CopyOnWriteArrayList<BaseDialog> copyOnWriteList = new CopyOnWriteArrayList<>(runningDialogList);
|
|
for (BaseDialog baseDialog : copyOnWriteList) {
|
|
if (baseDialog.getActivity() == activity && baseDialog.dialogView != null) {
|
|
WindowUtil.dismiss(baseDialog.dialogView.get());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|