package com.mylhyl.circledialog;
|
|
import android.app.Dialog;
|
import android.content.Context;
|
import android.content.DialogInterface;
|
import android.os.Bundle;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.view.Window;
|
import android.view.WindowManager;
|
|
import androidx.annotation.Nullable;
|
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentTransaction;
|
|
import com.mylhyl.circledialog.internal.CircleParams;
|
import com.mylhyl.circledialog.internal.Controller;
|
import com.mylhyl.circledialog.params.DialogParams;
|
|
import java.lang.reflect.Field;
|
|
/**
|
* Created by hupei on 2017/3/29.
|
*/
|
|
public final class BaseCircleDialog extends AbsBaseCircleDialog implements DialogInterface.OnShowListener,
|
Controller.OnDialogInternalListener {
|
|
private static final String CIRCLE_DIALOG = "circleDialog";
|
private static final String SAVED_PARAMS = "circle:params";
|
private CircleParams mParams;
|
private Controller mController;
|
|
public BaseCircleDialog() {
|
}
|
|
public static BaseCircleDialog newAbsCircleDialog(CircleParams params) {
|
BaseCircleDialog circleDialog = new BaseCircleDialog();
|
circleDialog.mParams = params;
|
Bundle bundle = new Bundle();
|
bundle.putParcelable(SAVED_PARAMS, params);
|
circleDialog.setArguments(bundle);
|
return circleDialog;
|
}
|
|
@Override
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
if (savedInstanceState != null) {
|
mParams = savedInstanceState.getParcelable(SAVED_PARAMS);
|
}
|
}
|
|
@Override
|
public void onDismiss(DialogInterface dialog) {
|
super.onDismiss(dialog);
|
if (mParams != null) {
|
if (mParams.circleListeners.dismissListener != null) {
|
mParams.circleListeners.dismissListener.onDismiss(dialog);
|
}
|
if (mParams.circleListeners.cancelListener != null) {
|
mParams.circleListeners.cancelListener.onCancel(dialog);
|
}
|
}
|
//mParams = null;
|
mController = null;
|
}
|
|
@Override
|
public void onSaveInstanceState(Bundle outState) {
|
super.onSaveInstanceState(outState);
|
outState.putParcelable(SAVED_PARAMS, mParams);
|
}
|
|
@Override
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
DialogParams dialogParams = mParams.dialogParams;
|
setGravity(dialogParams.gravity);
|
setCanceledOnTouchOutside(dialogParams.canceledOnTouchOutside);
|
setCancelable(dialogParams.cancelable);
|
setWidth(dialogParams.width);
|
setMaxHeight(dialogParams.maxHeight);
|
int[] padding = dialogParams.mPadding;
|
if (padding != null) {
|
setPadding(padding[0], padding[1], padding[2], padding[3]);
|
}
|
setAnimations(dialogParams.animStyle);
|
setDimEnabled(dialogParams.isDimEnabled);
|
setDimAmount(dialogParams.dimAmount);
|
setRadius(dialogParams.radius);
|
setAlpha(dialogParams.alpha);
|
setX(dialogParams.xOff);
|
setY(dialogParams.yOff);
|
if (mParams != null && mParams.inputParams != null &&
|
mParams.inputParams.showSoftKeyboard && mController != null) {
|
setSoftInputMode();
|
}
|
setSystemUiVisibility(dialogParams.systemUiVisibility);
|
super.onViewCreated(view, savedInstanceState);
|
}
|
|
@Override
|
public View createView(Context context, LayoutInflater inflater, ViewGroup container) {
|
mController = new Controller(context, mParams, this);
|
return mController.createView();
|
}
|
|
public void show(FragmentManager manager) {
|
show(manager, CIRCLE_DIALOG);
|
}
|
|
@Override
|
public void show(FragmentManager manager, String tag) {
|
try {
|
Class<?> superclass = getClass().getSuperclass().getSuperclass();
|
Field dismissedField = superclass.getDeclaredField("mDismissed");
|
dismissedField.setAccessible(true);
|
dismissedField.set(this, false);
|
|
Field shownByMeField = superclass.getDeclaredField("mShownByMe");
|
shownByMeField.setAccessible(true);
|
shownByMeField.set(this, true);
|
} catch (NoSuchFieldException e) {
|
e.printStackTrace();
|
} catch (IllegalAccessException e) {
|
e.printStackTrace();
|
}
|
|
FragmentTransaction transaction = manager.beginTransaction();
|
if (isVisible() && isAdded()) {
|
transaction.remove(this).commitAllowingStateLoss();
|
}
|
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
|
transaction.add(this, tag);
|
transaction.commitAllowingStateLoss();
|
}
|
|
@Override
|
public void dismiss() {
|
dialogDismiss();
|
}
|
|
@Override
|
public void onActivityCreated(Bundle savedInstanceState) {
|
super.onActivityCreated(savedInstanceState);
|
Dialog dialog = getDialog();
|
if (dialog == null) {
|
return;
|
}
|
if (mParams == null) {
|
return;
|
}
|
dialog.setOnShowListener(this);
|
dialog.setOnKeyListener(mParams.circleListeners.keyListener);
|
if (mParams.circleListeners.createBodyViewListener != null) {
|
mParams.circleListeners.createBodyViewListener.onCreateBodyView(mController.getViewHolder());
|
}
|
}
|
|
@Override
|
public void onShow(DialogInterface dialog) {
|
if (mParams == null) {
|
return;
|
}
|
if (mParams.circleListeners.showListener != null) {
|
mParams.circleListeners.showListener.onShow(dialog, mController.getViewHolder());
|
}
|
if (mParams.popupParams != null && mParams.dialogParams.width != 0) {
|
resizeSize();
|
}
|
}
|
|
void resizeSize() {
|
Dialog dialog = getDialog();
|
if (dialog == null) return;
|
Window window = dialog.getWindow();
|
WindowManager.LayoutParams wlp = window.getAttributes();
|
int avg = getSystemBarConfig().getScreenWidth() / 3;
|
final float absoluteWidth = mParams.dialogParams.width;
|
wlp.width = absoluteWidth > avg ? (int) absoluteWidth : avg;
|
window.setAttributes(wlp);
|
}
|
|
public void refreshView() {
|
if (mController != null) {
|
mController.refreshView();
|
}
|
}
|
|
@Override
|
public void dialogAtLocation(int x, int y) {
|
Dialog dialog = getDialog();
|
if (dialog == null) return;
|
|
setX(x);
|
setY(y);
|
|
Window window = dialog.getWindow();
|
WindowManager.LayoutParams wlp = window.getAttributes();
|
wlp.x = x;
|
wlp.y = y;
|
window.setAttributes(wlp);
|
}
|
|
@Override
|
public void dialogDismiss() {
|
dismissAllowingStateLoss();
|
}
|
|
@Override
|
public int[] getScreenSize() {
|
return getSystemBarConfig().getScreenSize();
|
}
|
|
@Override
|
public int getStatusBarHeight() {
|
return getSystemBarConfig().getStatusBarHeight();
|
}
|
}
|