소스 검색

0.0.48.beta14
- 对大部分 Dialog 的 activity 获取由 topActivity 变更为 ownActivity,且均为弱引用,此次修改已通过泄漏验证;
- 对DialogFragment以及FloatingActivity模式下的诸多问题进行了修复,包括全屏对话框背景空白、非安全区获取到的结果错误等问题;
- 修复[issues:286](https://github.com/kongzue/DialogX/issues/286);

Kongzue 2 년 전
부모
커밋
13e64b4efd
20개의 변경된 파일406개의 추가작업 그리고 360개의 파일을 삭제
  1. 2 2
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java
  2. 174 174
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java
  3. 4 4
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/CustomDialog.java
  4. 2 2
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/FullScreenDialog.java
  5. 8 8
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java
  6. 4 4
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopMenu.java
  7. 3 3
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopNotification.java
  8. 3 3
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopTip.java
  9. 9 9
      DialogX/src/main/java/com/kongzue/dialogx/dialogs/WaitDialog.java
  10. 17 0
      DialogX/src/main/java/com/kongzue/dialogx/impl/ActivityLifecycleImpl.java
  11. 5 5
      DialogX/src/main/java/com/kongzue/dialogx/impl/DialogFragmentImpl.java
  12. 108 108
      DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java
  13. 4 4
      DialogX/src/main/java/com/kongzue/dialogx/interfaces/OnBindView.java
  14. 32 18
      DialogX/src/main/java/com/kongzue/dialogx/util/DialogXFloatingWindowActivity.java
  15. 1 3
      DialogX/src/main/java/com/kongzue/dialogx/util/views/ActivityScreenShotImageView.java
  16. 16 8
      DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogXBaseRelativeLayout.java
  17. 4 0
      app/src/main/java/com/kongzue/dialogxdemo/App.java
  18. 8 1
      app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java
  19. 1 3
      app/src/main/res/layout/layout_custom_recycleview.xml
  20. 1 1
      gradle.properties

+ 2 - 2
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java

@@ -483,7 +483,7 @@ public class BottomDialog extends BaseDialog {
 
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -613,7 +613,7 @@ public class BottomDialog extends BaseDialog {
         @Override
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
-            if (getTopActivity() == null) return;
+            if (getOwnActivity() == null) return;
 
             if (!dismissAnimFlag) {
                 dismissAnimFlag = true;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 174 - 174
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java


+ 4 - 4
DialogX/src/main/java/com/kongzue/dialogx/dialogs/CustomDialog.java

@@ -253,7 +253,7 @@ public class CustomDialog extends BaseDialog {
         
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -515,7 +515,7 @@ public class CustomDialog extends BaseDialog {
                         }
                         
                         if (boxCustom != null) {
-                            Animation exitAnim = AnimationUtils.loadAnimation(getTopActivity() == null ? boxCustom.getContext() : getTopActivity(), exitAnimResIdTemp);
+                            Animation exitAnim = AnimationUtils.loadAnimation(getOwnActivity() == null ? boxCustom.getContext() : getOwnActivity(), exitAnimResIdTemp);
                             exitAnimDurationTemp = exitAnim.getDuration();
                             if (overrideExitDuration >= 0) {
                                 exitAnimDurationTemp = overrideExitDuration;
@@ -588,7 +588,7 @@ public class CustomDialog extends BaseDialog {
                     exitAnimResId = R.anim.anim_dialogx_right_exit;
                     break;
             }
-            enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResId);
+            enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResId);
             enterAnim.setInterpolator(new DecelerateInterpolator(2f));
         } else {
             int enterAnimResIdTemp = R.anim.anim_dialogx_default_enter;
@@ -598,7 +598,7 @@ public class CustomDialog extends BaseDialog {
             if (enterAnimResId != 0) {
                 enterAnimResIdTemp = enterAnimResId;
             }
-            enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResIdTemp);
+            enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResIdTemp);
         }
         long enterAnimDurationTemp = enterAnim.getDuration();
         if (overrideEnterDuration >= 0) {

+ 2 - 2
DialogX/src/main/java/com/kongzue/dialogx/dialogs/FullScreenDialog.java

@@ -280,7 +280,7 @@ public class FullScreenDialog extends BaseDialog {
 
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -349,7 +349,7 @@ public class FullScreenDialog extends BaseDialog {
         @Override
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
-            if (getTopActivity() == null) return;
+            if (getOwnActivity() == null) return;
 
             if (!dismissAnimFlag) {
                 dismissAnimFlag = true;

+ 8 - 8
DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java

@@ -499,7 +499,7 @@ public class MessageDialog extends BaseDialog {
         }
         
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             
@@ -690,13 +690,13 @@ public class MessageDialog extends BaseDialog {
                                 }
                                 break;
                             case DialogXStyle.SPACE:
-                                Space space = new Space(getTopActivity());
+                                Space space = new Space(getOwnActivity());
                                 LinearLayout.LayoutParams spaceLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                                 spaceLp.weight = 1;
                                 boxButton.addView(space, spaceLp);
                                 break;
                             case DialogXStyle.SPLIT:
-                                View splitView = new View(getTopActivity());
+                                View splitView = new View(getOwnActivity());
                                 splitView.setBackgroundColor(getResources().getColor(style.splitColorRes(isLightTheme())));
                                 LinearLayout.LayoutParams viewLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, style.splitWidthPx());
                                 boxButton.addView(splitView, viewLp);
@@ -742,7 +742,7 @@ public class MessageDialog extends BaseDialog {
                                 } else {
                                     break;
                                 }
-                                Space space = new Space(getTopActivity());
+                                Space space = new Space(getOwnActivity());
                                 LinearLayout.LayoutParams spaceLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                                 spaceLp.weight = 1;
                                 boxButton.addView(space, spaceLp);
@@ -755,7 +755,7 @@ public class MessageDialog extends BaseDialog {
                                 } else {
                                     break;
                                 }
-                                View splitView = new View(getTopActivity());
+                                View splitView = new View(getOwnActivity());
                                 splitView.setBackgroundColor(getResources().getColor(style.splitColorRes(isLightTheme())));
                                 LinearLayout.LayoutParams viewLp = new LinearLayout.LayoutParams(style.splitWidthPx(), ViewGroup.LayoutParams.MATCH_PARENT);
                                 boxButton.addView(splitView, viewLp);
@@ -794,7 +794,7 @@ public class MessageDialog extends BaseDialog {
         
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
-            if (getTopActivity() == null) return;
+            if (getOwnActivity() == null) return;
             
             if (!dismissAnimFlag) {
                 dismissAnimFlag = true;
@@ -828,7 +828,7 @@ public class MessageDialog extends BaseDialog {
                         if (customEnterAnimResId != 0) {
                             enterAnimResId = customEnterAnimResId;
                         }
-                        Animation enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResId);
+                        Animation enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResId);
                         long enterAnimDurationTemp = enterAnim.getDuration();
                         if (overrideEnterDuration >= 0) {
                             enterAnimDurationTemp = overrideEnterDuration;
@@ -860,7 +860,7 @@ public class MessageDialog extends BaseDialog {
                         if (customExitAnimResId != 0) {
                             exitAnimResId = customExitAnimResId;
                         }
-                        Animation exitAnim = AnimationUtils.loadAnimation(getTopActivity(), exitAnimResId);
+                        Animation exitAnim = AnimationUtils.loadAnimation(getOwnActivity(), exitAnimResId);
                         long exitAnimDurationTemp = exitAnim.getDuration();
                         exitAnim.setInterpolator(new AccelerateInterpolator());
                         if (overrideExitDuration >= 0) {

+ 4 - 4
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopMenu.java

@@ -446,7 +446,7 @@ public class PopMenu extends BaseDialog {
         public void init() {
             closing = false;
             if (menuListAdapter == null) {
-                menuListAdapter = new PopMenuArrayAdapter(me, getTopActivity(), menuList);
+                menuListAdapter = new PopMenuArrayAdapter(me, getOwnActivity(), menuList);
             }
 
             boxRoot.setParentDialog(me);
@@ -539,7 +539,7 @@ public class PopMenu extends BaseDialog {
 
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -547,7 +547,7 @@ public class PopMenu extends BaseDialog {
                 listMenu.setAdapter(menuListAdapter);
             } else {
                 if (menuListAdapter.getMenuList() != menuList) {
-                    menuListAdapter = new PopMenuArrayAdapter(me, getTopActivity(), menuList);
+                    menuListAdapter = new PopMenuArrayAdapter(me, getOwnActivity(), menuList);
                     listMenu.setAdapter(menuListAdapter);
                 } else {
                     menuListAdapter.notifyDataSetChanged();
@@ -793,7 +793,7 @@ public class PopMenu extends BaseDialog {
                         if (overrideExitDuration != -1) {
                             exitAnimDuration = overrideExitDuration;
                         }
-                        Animation exitAnim = AnimationUtils.loadAnimation(getTopActivity() == null ? boxRoot.getContext() : getTopActivity(), R.anim.anim_dialogx_default_exit);
+                        Animation exitAnim = AnimationUtils.loadAnimation(getOwnActivity() == null ? boxRoot.getContext() : getOwnActivity(), R.anim.anim_dialogx_default_exit);
                         if (exitAnimDuration != -1) {
                             exitAnim.setDuration(exitAnimDuration);
                         }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopNotification.java

@@ -658,7 +658,7 @@ public class PopNotification extends BaseDialog implements NoTouchInterface {
 
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -837,7 +837,7 @@ public class PopNotification extends BaseDialog implements NoTouchInterface {
                 dialogXAnimImpl = new DialogXAnimInterface<PopNotification>() {
                     @Override
                     public void doShowAnim(PopNotification dialog, ObjectRunnable<Float> animProgress) {
-                        Animation enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResId == 0 ? R.anim.anim_dialogx_notification_enter : enterAnimResId);
+                        Animation enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResId == 0 ? R.anim.anim_dialogx_notification_enter : enterAnimResId);
                         enterAnim.setInterpolator(new DecelerateInterpolator(2f));
                         if (enterAnimDuration != -1) {
                             enterAnim.setDuration(enterAnimDuration);
@@ -854,7 +854,7 @@ public class PopNotification extends BaseDialog implements NoTouchInterface {
 
                     @Override
                     public void doExitAnim(PopNotification dialog, ObjectRunnable<Float> animProgress) {
-                        Animation exitAnim = AnimationUtils.loadAnimation(getTopActivity() == null ? boxRoot.getContext() : getTopActivity(), exitAnimResId == 0 ? R.anim.anim_dialogx_notification_exit : exitAnimResId);
+                        Animation exitAnim = AnimationUtils.loadAnimation(getOwnActivity() == null ? boxRoot.getContext() : getOwnActivity(), exitAnimResId == 0 ? R.anim.anim_dialogx_notification_exit : exitAnimResId);
                         if (exitAnimDuration != -1) {
                             exitAnim.setDuration(exitAnimDuration);
                         }

+ 3 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopTip.java

@@ -584,7 +584,7 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
 
         @Override
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -676,7 +676,7 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
                 dialogXAnimImpl = new DialogXAnimInterface<PopTip>() {
                     @Override
                     public void doShowAnim(PopTip dialog, ObjectRunnable<Float> animProgress) {
-                        Animation enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResId == 0 ? R.anim.anim_dialogx_default_enter : enterAnimResId);
+                        Animation enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResId == 0 ? R.anim.anim_dialogx_default_enter : enterAnimResId);
                         enterAnim.setInterpolator(new DecelerateInterpolator(2f));
                         if (enterAnimDuration != -1) {
                             enterAnim.setDuration(enterAnimDuration);
@@ -693,7 +693,7 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
 
                     @Override
                     public void doExitAnim(PopTip dialog, ObjectRunnable<Float> animProgress) {
-                        Animation exitAnim = AnimationUtils.loadAnimation(getTopActivity() == null ? boxRoot.getContext() : getTopActivity(), exitAnimResId == 0 ? R.anim.anim_dialogx_default_exit : exitAnimResId);
+                        Animation exitAnim = AnimationUtils.loadAnimation(getOwnActivity() == null ? boxRoot.getContext() : getOwnActivity(), exitAnimResId == 0 ? R.anim.anim_dialogx_default_exit : exitAnimResId);
                         if (exitAnimDuration != -1) {
                             exitAnim.setDuration(exitAnimDuration);
                         }

+ 9 - 9
DialogX/src/main/java/com/kongzue/dialogx/dialogs/WaitDialog.java

@@ -290,9 +290,9 @@ public class WaitDialog extends BaseDialog {
             bkg = dialogView.findViewById(R.id.bkg);
             blurView = dialogView.findViewById(R.id.blurView);
             boxProgress = dialogView.findViewById(R.id.box_progress);
-            View progressViewCache = (View) style.overrideWaitTipRes().overrideWaitView(getTopActivity(), isLightTheme());
+            View progressViewCache = (View) style.overrideWaitTipRes().overrideWaitView(getOwnActivity(), isLightTheme());
             if (progressViewCache == null) {
-                progressViewCache = new ProgressView(getTopActivity());
+                progressViewCache = new ProgressView(getOwnActivity());
             }
             progressView = (ProgressViewInterface) progressViewCache;
             boxProgress.addView(progressViewCache, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
@@ -309,9 +309,9 @@ public class WaitDialog extends BaseDialog {
             bkg = convertView.findViewById(R.id.bkg);
             blurView = convertView.findViewById(R.id.blurView);
             boxProgress = convertView.findViewById(R.id.box_progress);
-            View progressViewCache = (View) style.overrideWaitTipRes().overrideWaitView(getTopActivity(), isLightTheme());
+            View progressViewCache = (View) style.overrideWaitTipRes().overrideWaitView(getOwnActivity(), isLightTheme());
             if (progressViewCache == null) {
-                progressViewCache = new ProgressView(getTopActivity());
+                progressViewCache = new ProgressView(getOwnActivity());
             }
             progressView = (ProgressViewInterface) progressViewCache;
             boxProgress.addView(progressViewCache, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
@@ -344,7 +344,7 @@ public class WaitDialog extends BaseDialog {
                     bkg.post(new Runnable() {
                         @Override
                         public void run() {
-                            if (getTopActivity() == null) return;
+                            if (getOwnActivity() == null) return;
                             
                             getDialogXAnimImpl().doShowAnim(WaitDialog.this, new ObjectRunnable<Float>() {
                                 @Override
@@ -410,7 +410,7 @@ public class WaitDialog extends BaseDialog {
         private float oldProgress;
         
         public void refreshView() {
-            if (boxRoot == null || getTopActivity() == null) {
+            if (boxRoot == null || getOwnActivity() == null) {
                 return;
             }
             boxRoot.setRootPadding(screenPaddings[0], screenPaddings[1], screenPaddings[2], screenPaddings[3]);
@@ -511,7 +511,7 @@ public class WaitDialog extends BaseDialog {
         
         public void doDismiss(final View v) {
             if (boxRoot == null) return;
-            if (getTopActivity() == null) return;
+            if (getOwnActivity() == null) return;
             
             if (!dismissAnimFlag) {
                 dismissAnimFlag = true;
@@ -550,7 +550,7 @@ public class WaitDialog extends BaseDialog {
                         if (customEnterAnimResId != 0) {
                             enterAnimResId = customEnterAnimResId;
                         }
-                        Animation enterAnim = AnimationUtils.loadAnimation(getTopActivity(), enterAnimResId);
+                        Animation enterAnim = AnimationUtils.loadAnimation(getOwnActivity(), enterAnimResId);
                         long enterAnimDurationTemp = enterAnim.getDuration();
                         enterAnim.setInterpolator(new DecelerateInterpolator());
                         if (overrideEnterDuration >= 0) {
@@ -581,7 +581,7 @@ public class WaitDialog extends BaseDialog {
                     
                     @Override
                     public void doExitAnim(WaitDialog dialog, ObjectRunnable<Float> animProgress) {
-                        Context context = getTopActivity();
+                        Context context = getOwnActivity();
                         if (context == null) context = boxRoot.getContext();
                         if (context == null) return;
                         

+ 17 - 0
DialogX/src/main/java/com/kongzue/dialogx/impl/ActivityLifecycleImpl.java

@@ -15,6 +15,7 @@ import com.kongzue.dialogx.interfaces.BaseDialog;
 import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -66,6 +67,14 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
             return application;
         } catch (Exception e) {
         }
+        try {
+            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
+            Object activityThread = activityThreadClass.getDeclaredMethod("currentActivityThread").invoke(null);
+            Method getApplicationMethod = activityThreadClass.getDeclaredMethod("getApplication");
+            Application application = (Application) getApplicationMethod.invoke(activityThread);
+            return application;
+        } catch (Exception e) {
+        }
         try {
             Application application = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null, (Object[]) null);
             return application;
@@ -84,6 +93,14 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
             return application;
         } catch (Exception e) {
         }
+        try {
+            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
+            Object activityThread = activityThreadClass.getDeclaredMethod("currentActivityThread").invoke(null);
+            Method getApplicationMethod = activityThreadClass.getDeclaredMethod("getApplication");
+            Application application = (Application) getApplicationMethod.invoke(activityThread);
+            return application;
+        } catch (Exception e) {
+        }
         try {
             Application application = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null, (Object[]) null);
             return application;

+ 5 - 5
DialogX/src/main/java/com/kongzue/dialogx/impl/DialogFragmentImpl.java

@@ -45,6 +45,7 @@ public class DialogFragmentImpl extends DialogFragment {
     public DialogFragmentImpl(BaseDialog baseDialog, View dialogView) {
         this.dialogView = dialogView;
         this.baseDialog = baseDialog;
+        activityWeakReference = new WeakReference<>(baseDialog.getOwnActivity());
     }
     
     @Override
@@ -57,10 +58,6 @@ public class DialogFragmentImpl extends DialogFragment {
     @Override
     public void onStart() {
         super.onStart();
-        if (BaseDialog.getTopActivity() != null && BaseDialog.getTopActivity() instanceof Activity) {
-            activityWeakReference = new WeakReference<>(((Activity) BaseDialog.getTopActivity()));
-        }
-        if (activityWeakReference == null || activityWeakReference.get() == null) return;
         final Activity activity = activityWeakReference.get();
         
         if (getDialog() == null) return;
@@ -109,7 +106,10 @@ public class DialogFragmentImpl extends DialogFragment {
                 }
             }
             dialogWindow.getDecorView().setSystemUiVisibility(visibility);
-            dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+            dialogWindow.addFlags(
+                    WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
+                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
+            );
             dialogWindow.setStatusBarColor(Color.TRANSPARENT);
             dialogWindow.setNavigationBarColor(Color.TRANSPARENT);
         } else {

+ 108 - 108
DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java

@@ -60,7 +60,7 @@ import static com.kongzue.dialogx.DialogX.DEBUGMODE;
  * @createTime: 2020/9/22 14:10
  */
 public abstract class BaseDialog implements LifecycleOwner {
-    
+
     private static Thread uiThread;
     private static WeakReference<Activity> activityWeakReference;
     protected WeakReference<Activity> ownActivity;
@@ -73,13 +73,13 @@ public abstract class BaseDialog implements LifecycleOwner {
     private WeakReference<DialogListBuilder> dialogListBuilder;
     protected LifecycleRegistry lifecycle = new LifecycleRegistry(this);
 
-    public enum BUTTON_SELECT_RESULT{
+    public enum BUTTON_SELECT_RESULT {
         NONE,           //未做出选择
         BUTTON_OK,      //选择了确定按钮
         BUTTON_CANCEL,  //选择了取消按钮
         BUTTON_OTHER    //选择了其他按钮
     }
-    
+
     public static void init(Context context) {
         if (context == null) {
             context = ActivityLifecycleImpl.getTopActivity();
@@ -94,7 +94,7 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         });
     }
-    
+
     private static void initActivityContext(Activity activity) {
         if (ActivityLifecycleImpl.isExemptActivities(activity)) {
             return;
@@ -107,19 +107,19 @@ public abstract class BaseDialog implements LifecycleOwner {
             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 static void onActivityResume(Activity activity) {
         if (runningDialogList != null) {
             CopyOnWriteArrayList<BaseDialog> copyOnWriteList = new CopyOnWriteArrayList<>(runningDialogList);
@@ -137,15 +137,13 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         }
     }
-    
+
     private static void requestDialogFocus() {
-        if (getTopActivity() instanceof Activity) {
-            onActivityResume((Activity) getTopActivity());
-        }
+        onActivityResume(getTopActivity());
     }
-    
+
     public abstract void restartDialog();
-    
+
     protected static void show(final View view) {
         if (view == null) {
             return;
@@ -160,23 +158,22 @@ public abstract class BaseDialog implements LifecycleOwner {
                 error(((BaseDialog) view.getTag()).dialogKey() + "已处于显示状态,请勿重复执行 show() 指令。");
                 return;
             }
-            baseDialog.ownActivity = new WeakReference<>(getTopActivity());
             baseDialog.dialogView = new WeakReference<>(view);
-            
+
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                 publicWindowInsets(baseDialog.getRootFrameLayout().getRootWindowInsets());
             }
-            
+
             log(baseDialog.dialogKey() + ".show");
-            
+
             addDialogToRunningList(baseDialog);
             switch (baseDialog.dialogImplMode) {
                 case WINDOW:
-                    WindowUtil.show(getTopActivity(), view, !(baseDialog instanceof NoTouchInterface));
+                    WindowUtil.show(baseDialog.getOwnActivity(), view, !(baseDialog instanceof NoTouchInterface));
                     break;
                 case DIALOG_FRAGMENT:
                     DialogFragmentImpl dialogFragment = new DialogFragmentImpl(baseDialog, view);
-                    dialogFragment.show(getSupportFragmentManager(getTopActivity()), "DialogX");
+                    dialogFragment.show(getSupportFragmentManager(baseDialog.getOwnActivity()), "DialogX");
                     baseDialog.ownDialogFragmentImpl = new WeakReference<>(dialogFragment);
                     break;
                 case FLOATING_ACTIVITY:
@@ -187,6 +184,7 @@ public abstract class BaseDialog implements LifecycleOwner {
                         @Override
                         public void run(Activity activity) {
                             baseDialog.floatingWindowActivity = new WeakReference<>((DialogXFloatingWindowActivity) activity);
+                            baseDialog.floatingWindowActivity.get().setFromActivity(baseDialog.getOwnActivity());
                             final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
                             if (activityRootView == null) {
                                 return;
@@ -207,21 +205,21 @@ public abstract class BaseDialog implements LifecycleOwner {
                         }
                     });
                     DialogXFloatingWindowActivity dialogXFloatingWindowActivity = DialogXFloatingWindowActivity.getDialogXFloatingWindowActivity();
-                    if (dialogXFloatingWindowActivity != null && dialogXFloatingWindowActivity.isSameFrom(getTopActivity().hashCode())) {
+                    if (dialogXFloatingWindowActivity != null && dialogXFloatingWindowActivity.isSameFrom(baseDialog.getOwnActivity().hashCode())) {
                         dialogXFloatingWindowActivity.showDialogX(baseDialog.dialogKey());
                         return;
                     }
                     Intent intent = new Intent(getContext(), DialogXFloatingWindowActivity.class);
-                    if (getTopActivity() == null) {
+                    if (baseDialog.getOwnActivity() == null) {
                         intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
                     }
                     intent.putExtra("dialogXKey", baseDialog.dialogKey());
-                    intent.putExtra("fromActivityUiStatus", getTopActivity() == null ? 0 : getTopActivity().getWindow().getDecorView().getSystemUiVisibility());
+                    intent.putExtra("fromActivityUiStatus", baseDialog.getOwnActivity() == null ? 0 : baseDialog.getOwnActivity().getWindow().getDecorView().getSystemUiVisibility());
                     intent.putExtra("from", getContext().hashCode());
                     getContext().startActivity(intent);
                     int version = Integer.valueOf(Build.VERSION.SDK_INT);
-                    if (version > 5 && getTopActivity() != null) {
-                        getTopActivity().overridePendingTransition(0, 0);
+                    if (version > 5 && baseDialog.getOwnActivity() != null) {
+                        baseDialog.getOwnActivity().overridePendingTransition(0, 0);
                     }
                     break;
                 default:
@@ -245,20 +243,20 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         }
     }
-    
+
     private static FragmentManager getSupportFragmentManager(Activity activity) {
         return (activity instanceof AppCompatActivity) ? ((AppCompatActivity) activity).getSupportFragmentManager() : null;
     }
-    
+
     private static Map<String, ActivityRunnable> waitRunDialogX;
-    
+
     public static ActivityRunnable getActivityRunnable(String dialogXKey) {
         if (dialogXKey == null) {
             return null;
         }
         return waitRunDialogX.get(dialogXKey);
     }
-    
+
     protected static void show(final Activity activity, final View view) {
         if (activity == null || view == null) {
             return;
@@ -281,14 +279,14 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
             baseDialog.ownActivity = new WeakReference<>(activity);
             baseDialog.dialogView = new WeakReference<>(view);
-            
+
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                 publicWindowInsets(baseDialog.getRootFrameLayout().getRootWindowInsets());
             }
-            
+
             log(baseDialog + ".show");
             addDialogToRunningList(baseDialog);
-            
+
             switch (baseDialog.dialogImplMode) {
                 case WINDOW:
                     WindowUtil.show(activity, view, !(baseDialog instanceof NoTouchInterface));
@@ -306,6 +304,7 @@ public abstract class BaseDialog implements LifecycleOwner {
                         @Override
                         public void run(Activity activity) {
                             baseDialog.floatingWindowActivity = new WeakReference<>((DialogXFloatingWindowActivity) activity);
+                            baseDialog.floatingWindowActivity.get().setFromActivity(baseDialog.getOwnActivity());
                             final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
                             if (activityRootView == null) {
                                 return;
@@ -362,7 +361,7 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         }
     }
-    
+
     protected static void dismiss(final View dialogView) {
         if (dialogView == null) {
             return;
@@ -373,7 +372,7 @@ public abstract class BaseDialog implements LifecycleOwner {
         if (baseDialog.dialogView != null) {
             baseDialog.dialogView.clear();
         }
-        
+
         switch (baseDialog.dialogImplMode) {
             case WINDOW:
                 WindowUtil.dismiss(dialogView);
@@ -414,20 +413,20 @@ public abstract class BaseDialog implements LifecycleOwner {
             baseDialog.getDialogListBuilder().showNext();
         }
     }
-    
+
     private static void addDialogToRunningList(BaseDialog baseDialog) {
         if (runningDialogList == null) {
             runningDialogList = new CopyOnWriteArrayList<>();
         }
         runningDialogList.add(baseDialog);
     }
-    
+
     private static void removeDialogToRunningList(BaseDialog baseDialog) {
         if (runningDialogList != null) {
             runningDialogList.remove(baseDialog);
         }
     }
-    
+
     public static Activity getTopActivity() {
         if (activityWeakReference == null) {
             init(null);
@@ -438,7 +437,7 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return activityWeakReference.get();
     }
-    
+
     public static Context getContext() {
         Activity activity = getTopActivity();
         if (activity == null) {
@@ -451,11 +450,11 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return activity;
     }
-    
+
     public static Context getApplicationContext() {
         return ActivityLifecycleImpl.getApplicationContext();
     }
-    
+
     /**
      * 自动执行,不建议自行调用此方法
      *
@@ -468,9 +467,9 @@ public abstract class BaseDialog implements LifecycleOwner {
         activityWeakReference = null;
         System.gc();
     }
-    
+
     protected abstract void shutdown();
-    
+
     protected boolean cancelable = true;
     protected boolean isShow;
     protected DialogXStyle style;
@@ -484,7 +483,7 @@ public abstract class BaseDialog implements LifecycleOwner {
     protected int minWidth;
     protected int minHeight;
     protected int[] screenPaddings = new int[4];
-    
+
     public BaseDialog() {
         cancelable = DialogX.cancelable;
         style = DialogX.globalStyle;
@@ -493,9 +492,9 @@ public abstract class BaseDialog implements LifecycleOwner {
         exitAnimDuration = DialogX.exitAnimDuration;
         autoShowInputKeyboard = DialogX.autoShowInputKeyboard;
     }
-    
+
     public abstract boolean isCancelable();
-    
+
     public View createView(int layoutId) {
         if (getApplicationContext() == null) {
             error("DialogX 未初始化(E3)。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
@@ -503,19 +502,19 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return LayoutInflater.from(getApplicationContext()).inflate(layoutId, null);
     }
-    
+
     public boolean isShow() {
         return isShow;
     }
-    
+
     public DialogXStyle getStyle() {
         return style;
     }
-    
+
     public DialogX.THEME getTheme() {
         return theme;
     }
-    
+
     public static void useTextInfo(TextView textView, TextInfo textInfo) {
         if (textInfo == null) {
             return;
@@ -542,10 +541,10 @@ public abstract class BaseDialog implements LifecycleOwner {
         } else {
             textView.setMaxLines(Integer.MAX_VALUE);
         }
-        
+
         textView.getPaint().setFakeBoldText(textInfo.isBold());
     }
-    
+
     protected void showText(TextView textView, CharSequence text) {
         if (textView == null) {
             return;
@@ -558,14 +557,14 @@ public abstract class BaseDialog implements LifecycleOwner {
             textView.setText(text);
         }
     }
-    
+
     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)) {
@@ -573,19 +572,19 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return false;
     }
-    
+
     public Resources getResources() {
         if (getApplicationContext() == null) {
             return Resources.getSystem();
         }
         return getApplicationContext().getResources();
     }
-    
+
     public int dip2px(float dpValue) {
         final float scale = getResources().getDisplayMetrics().density;
         return (int) (dpValue * scale + 0.5f);
     }
-    
+
     public boolean isLightTheme() {
         if (theme == DialogX.THEME.AUTO) {
             if (getApplicationContext() == null) {
@@ -595,16 +594,16 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return theme == DialogX.THEME.LIGHT;
     }
-    
+
     public FrameLayout getRootFrameLayout() {
         Activity activity = getOwnActivity();
         if (activity == null) {
-            activity = getTopActivity();
+            activity = getOwnActivity();
         }
         rootFrameLayout = new WeakReference<>((FrameLayout) activity.getWindow().getDecorView());
         return rootFrameLayout.get();
     }
-    
+
     public void tintColor(View view, int color) {
         if (view == null) {
             return;
@@ -613,20 +612,21 @@ public abstract class BaseDialog implements LifecycleOwner {
             view.setBackgroundTintList(ColorStateList.valueOf(color));
         }
     }
-    
+
     /**
      * 此标记用于拦截重复 dismiss 指令导致的关闭动画抖动异常
      */
     protected boolean dismissAnimFlag;
     protected boolean preShow;
-    
+
     protected void beforeShow() {
         preShow = true;
         dismissAnimFlag = false;
-        if (getTopActivity() == null) {
+        ownActivity = new WeakReference<>(getTopActivity());
+        if (getOwnActivity() == null) {
             //尝试重新获取 activity
             init(null);
-            if (getTopActivity() == null) {
+            if (getOwnActivity() == null) {
                 error("DialogX 未初始化(E5)。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
                 return;
             }
@@ -634,27 +634,27 @@ public abstract class BaseDialog implements LifecycleOwner {
         if (style.styleVer != DialogXStyle.styleVer) {
             error("DialogX 所引用的 Style 不符合当前适用版本:" + DialogXStyle.styleVer + " 引入的 Style(" + style.getClass().getSimpleName() + ") 版本" + style.styleVer);
         }
-        
-        if (dialogImplMode != DialogX.IMPL_MODE.VIEW && getTopActivity() instanceof LifecycleOwner) {
-            Lifecycle lifecycle = ((LifecycleOwner) getTopActivity()).getLifecycle();
+
+        if (dialogImplMode != DialogX.IMPL_MODE.VIEW && getOwnActivity() instanceof LifecycleOwner) {
+            Lifecycle lifecycle = ((LifecycleOwner) getOwnActivity()).getLifecycle();
             lifecycle.addObserver(new LifecycleEventObserver() {
                 @Override
                 public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                     if (event == Lifecycle.Event.ON_DESTROY) {
-                        recycleDialog(getTopActivity());
+                        recycleDialog(getOwnActivity());
                     }
                 }
             });
         }
-        
+
         //Hide IME
-        View view = (BaseDialog.getTopActivity()).getCurrentFocus();
+        View view = getOwnActivity().getCurrentFocus();
         if (view != null) {
-            InputMethodManager imm = (InputMethodManager) BaseDialog.getTopActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+            InputMethodManager imm = (InputMethodManager) getOwnActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
             imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
         }
     }
-    
+
     protected String getString(int titleResId) {
         if (getApplicationContext() == null) {
             error("DialogX 未初始化(E6)。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
@@ -662,7 +662,7 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return getResources().getString(titleResId);
     }
-    
+
     protected int getColor(int backgroundRes) {
         if (getApplicationContext() == null) {
             error("DialogX 未初始化(E7)。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
@@ -670,13 +670,13 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         return getResources().getColor(backgroundRes);
     }
-    
+
     public enum BOOLEAN {
         TRUE, FALSE
     }
-    
+
     public abstract String dialogKey();
-    
+
     protected static void runOnMain(Runnable runnable) {
         if (!DialogX.autoRunOnUIThread || (getUiThread() != null && Thread.currentThread() == getUiThread())) {
             runnable.run();
@@ -684,18 +684,18 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         runOnMain(runnable, true);
     }
-    
+
     protected static Thread getUiThread() {
         if (uiThread == null) {
             uiThread = Looper.getMainLooper().getThread();
         }
         return uiThread;
     }
-    
+
     protected static void runOnMain(Runnable runnable, boolean needWaitMainLooper) {
         getMainHandler().post(runnable);
     }
-    
+
     protected static void runOnMainDelay(Runnable runnable, long delay) {
         if (delay < 0) {
             return;
@@ -705,25 +705,25 @@ public abstract class BaseDialog implements LifecycleOwner {
         }
         getMainHandler().postDelayed(runnable, delay);
     }
-    
+
     public View getDialogView() {
         if (dialogView == null) {
             return null;
         }
         return dialogView.get();
     }
-    
+
     public Activity getOwnActivity() {
         return ownActivity == null ? null : ownActivity.get();
     }
-    
+
     protected void cleanActivityContext() {
         if (ownActivity != null) {
             ownActivity.clear();
         }
         ownActivity = null;
     }
-    
+
     public static void cleanAll() {
         if (runningDialogList != null) {
             CopyOnWriteArrayList<BaseDialog> copyOnWriteList = new CopyOnWriteArrayList<>(runningDialogList);
@@ -736,7 +736,7 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         }
     }
-    
+
     public static void recycleDialog(Activity activity) {
         switch (DialogX.implIMPLMode) {
             case WINDOW:
@@ -760,7 +760,7 @@ public abstract class BaseDialog implements LifecycleOwner {
                 }
                 break;
             case FLOATING_ACTIVITY:
-                
+
                 break;
             default:
                 if (runningDialogList != null) {
@@ -778,36 +778,36 @@ public abstract class BaseDialog implements LifecycleOwner {
             cleanContext();
         }
     }
-    
+
     public static List<BaseDialog> getRunningDialogList() {
         if (runningDialogList == null) {
             return new ArrayList<>();
         }
         return new CopyOnWriteArrayList<>(runningDialogList);
     }
-    
+
     protected void imeShow(EditText editText, boolean show) {
-        if (getTopActivity() == null) {
+        if (getOwnActivity() == null) {
             return;
         }
-        InputMethodManager imm = (InputMethodManager) getTopActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+        InputMethodManager imm = (InputMethodManager) getOwnActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
         if (show) {
             imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
         } else {
             imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
         }
     }
-    
+
     public DialogX.IMPL_MODE getDialogImplMode() {
         return dialogImplMode;
     }
-    
+
     protected static WindowInsets windowInsets;
-    
+
     public static WindowInsets publicWindowInsets() {
         return windowInsets;
     }
-    
+
     public static void publicWindowInsets(WindowInsets windowInsets) {
         if (windowInsets != null) {
             BaseDialog.windowInsets = windowInsets;
@@ -825,13 +825,13 @@ public abstract class BaseDialog implements LifecycleOwner {
             }
         }
     }
-    
+
     protected void bindFloatingActivity(DialogXFloatingWindowActivity activity) {
         floatingWindowActivity = new WeakReference<>(activity);
     }
-    
+
     static WeakReference<Handler> mMainHandler;
-    
+
     private static Handler getMainHandler() {
         if (mMainHandler != null && mMainHandler.get() != null) {
             return mMainHandler.get();
@@ -839,66 +839,66 @@ public abstract class BaseDialog implements LifecycleOwner {
         mMainHandler = new WeakReference<>(new Handler(Looper.getMainLooper()));
         return mMainHandler.get();
     }
-    
+
     public DialogListBuilder getDialogListBuilder() {
         if (dialogListBuilder == null) {
             return null;
         }
         return dialogListBuilder.get();
     }
-    
+
     public void setDialogListBuilder(DialogListBuilder dialogListBuilder) {
         this.dialogListBuilder = new WeakReference<>(dialogListBuilder);
     }
-    
+
     public void cleanDialogList() {
         this.dialogListBuilder = null;
     }
-    
+
     public boolean isPreShow() {
         return preShow;
     }
-    
+
     public abstract <D extends BaseDialog> D show();
-    
+
     protected void onDialogShow() {
     }
-    
+
     protected void onDialogInit() {
     }
-    
+
     protected void onDialogRefreshUI() {
     }
-    
+
     @NonNull
     @Override
     public Lifecycle getLifecycle() {
         return lifecycle;
     }
-    
+
     public int getMaxWidth() {
         if (maxWidth == 0) {
             return DialogX.dialogMaxWidth;
         }
         return maxWidth;
     }
-    
+
     public int getMaxHeight() {
         if (maxHeight == 0) {
             return DialogX.dialogMaxHeight;
         }
         return maxHeight;
     }
-    
+
     public int getMinWidth() {
         if (minWidth == 0) {
             return DialogX.dialogMinWidth;
         }
         return minWidth;
     }
-    
+
     public int getMinHeight() {
-        if (minWidth == 0) {
+        if (minHeight == 0) {
             return DialogX.dialogMinHeight;
         }
         return minHeight;

+ 4 - 4
DialogX/src/main/java/com/kongzue/dialogx/interfaces/OnBindView.java

@@ -182,15 +182,15 @@ public abstract class OnBindView<D> {
             getCustomView().post(new Runnable() {
                 @Override
                 public void run() {
-                    if (fragment != null && getCustomView() instanceof FrameLayout && BaseDialog.getTopActivity() instanceof AppCompatActivity) {
-                        AppCompatActivity appCompatActivity = (AppCompatActivity) BaseDialog.getTopActivity();
+                    if (fragment != null && getCustomView() instanceof FrameLayout && dialog.getOwnActivity() instanceof AppCompatActivity) {
+                        AppCompatActivity appCompatActivity = (AppCompatActivity) dialog.getOwnActivity();
                         androidx.fragment.app.FragmentTransaction transaction = appCompatActivity.getSupportFragmentManager().beginTransaction();
                         transaction.add(getFragmentParentId(), fragment);
                         transaction.commit();
                         onFragmentBind((D) dialog, getCustomView(), fragment, appCompatActivity.getSupportFragmentManager());
                     }
-                    if (supportFragment != null && getCustomView() instanceof FrameLayout && BaseDialog.getTopActivity() instanceof Activity) {
-                        Activity activity = (Activity) BaseDialog.getTopActivity();
+                    if (supportFragment != null && getCustomView() instanceof FrameLayout && dialog.getOwnActivity() instanceof Activity) {
+                        Activity activity = dialog.getOwnActivity();
                         android.app.FragmentTransaction transaction = activity.getFragmentManager().beginTransaction();
                         transaction.add(getFragmentParentId(), supportFragment);
                         transaction.commit();

+ 32 - 18
DialogX/src/main/java/com/kongzue/dialogx/util/DialogXFloatingWindowActivity.java

@@ -24,24 +24,24 @@ import java.util.List;
  * @createTime: 2021/12/20 14:58
  */
 public class DialogXFloatingWindowActivity extends AppCompatActivity {
-    
+
     static WeakReference<DialogXFloatingWindowActivity> dialogXFloatingWindowActivity;
     int fromActivityHashCode;
     List<String> shownDialogXList = new ArrayList<>();
-    
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         dialogXFloatingWindowActivity = new WeakReference<>(this);
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout_dialogx_empty);
-        
+
         int fromActivityUiStatus = getIntent().getIntExtra("fromActivityUiStatus", 0);
         if (fromActivityUiStatus == 0) {
             getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
         } else {
             getWindow().getDecorView().setSystemUiVisibility(fromActivityUiStatus | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
         }
-        
+
         setFromActivityHashCode(getIntent().getIntExtra("from", 0));
         String dialogXKey;
         ActivityRunnable activityRunnable = BaseDialog.getActivityRunnable(dialogXKey = getIntent().getStringExtra("dialogXKey"));
@@ -51,24 +51,24 @@ public class DialogXFloatingWindowActivity extends AppCompatActivity {
             shownDialogXList.add(dialogXKey);
             activityRunnable.run(this);
         }
-        
+
         getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
             @Override
             public boolean onTouch(View v, MotionEvent event) {
-                if (event.getAction() != MotionEvent.ACTION_CANCEL) {
-                    if (BaseDialog.getTopActivity() != null && !(BaseDialog.getTopActivity() instanceof DialogXFloatingWindowActivity)) {
-                        return ((Activity) BaseDialog.getTopActivity()).dispatchTouchEvent(event);
+                if (event.getAction() != MotionEvent.ACTION_CANCEL && getFromActivity() != null) {
+                    if (getFromActivity() != null && !(getFromActivity() instanceof DialogXFloatingWindowActivity)) {
+                        return getFromActivity().dispatchTouchEvent(event);
                     }
                 }
                 return false;
             }
         });
     }
-    
+
     public boolean isSameFrom(int fromActivityHashCode) {
         return fromActivityHashCode == this.fromActivityHashCode;
     }
-    
+
     public void showDialogX(String dialogXKey) {
         ActivityRunnable activityRunnable = BaseDialog.getActivityRunnable(dialogXKey);
         if (activityRunnable != null) {
@@ -76,21 +76,21 @@ public class DialogXFloatingWindowActivity extends AppCompatActivity {
             activityRunnable.run(this);
         }
     }
-    
+
     public int getFromActivityHashCode() {
         return fromActivityHashCode;
     }
-    
+
     public DialogXFloatingWindowActivity setFromActivityHashCode(int fromActivityHashCode) {
         this.fromActivityHashCode = fromActivityHashCode;
         return this;
     }
-    
+
     public static DialogXFloatingWindowActivity getDialogXFloatingWindowActivity() {
         if (dialogXFloatingWindowActivity == null) return null;
         return dialogXFloatingWindowActivity.get();
     }
-    
+
     public void finish(String dialogXKey) {
         shownDialogXList.remove(dialogXKey);
         if (shownDialogXList.isEmpty()) {
@@ -105,7 +105,7 @@ public class DialogXFloatingWindowActivity extends AppCompatActivity {
             }
         }
     }
-    
+
     public void finish() {
         if (dialogXFloatingWindowActivity != null) {
             dialogXFloatingWindowActivity.clear();
@@ -117,15 +117,29 @@ public class DialogXFloatingWindowActivity extends AppCompatActivity {
             overridePendingTransition(0, 0);
         }
     }
-    
+
     boolean isScreenshot;
-    
+
     public boolean isScreenshot() {
         return isScreenshot;
     }
-    
+
     public DialogXFloatingWindowActivity setScreenshot(boolean screenshot) {
         isScreenshot = screenshot;
         return this;
     }
+
+    /**
+     * 原始用户操作界面
+     */
+    WeakReference<Activity> fromActivity;
+
+    public Activity getFromActivity() {
+        return fromActivity == null ? null : fromActivity.get();
+    }
+
+    public DialogXFloatingWindowActivity setFromActivity(Activity fromActivity) {
+        this.fromActivity = new WeakReference<>(fromActivity);
+        return this;
+    }
 }

+ 1 - 3
DialogX/src/main/java/com/kongzue/dialogx/util/views/ActivityScreenShotImageView.java

@@ -145,9 +145,7 @@ public class ActivityScreenShotImageView extends ImageView {
             return ((Activity) getContext()).getWindow().getDecorView();
         }else{
             if (topActivity instanceof DialogXFloatingWindowActivity) {
-                if (((DialogXFloatingWindowActivity) topActivity).isScreenshot()) {
-                    return topActivity.getWindow().getDecorView();
-                }
+                return ((DialogXFloatingWindowActivity) topActivity).getFromActivity().getWindow().getDecorView();
             }
             return topActivity.getWindow().getDecorView();
         }

+ 16 - 8
DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogXBaseRelativeLayout.java

@@ -132,6 +132,10 @@ public class DialogXBaseRelativeLayout extends RelativeLayout {
             }
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            if (insets.getSystemWindowInsetLeft() == 0 && insets.getSystemWindowInsetTop() == 0 && insets.getSystemWindowInsetRight() == 0 && insets.getSystemWindowInsetBottom() == 0) {
+                getWindowInsetsByDisplayMetrics();
+                return;
+            }
             paddingView(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
         }
     }
@@ -165,7 +169,7 @@ public class DialogXBaseRelativeLayout extends RelativeLayout {
             }
             ViewCompat.requestApplyInsets(this);
 
-            if (BaseDialog.getTopActivity() == null) return;
+            if (parentDialog.getOwnActivity() == null) return;
 
             View decorView = (View) getParent();
             if (decorView != null) {
@@ -242,16 +246,20 @@ public class DialogXBaseRelativeLayout extends RelativeLayout {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             paddingView(getRootWindowInsets());
         } else {
-            if (BaseDialog.getTopActivity() == null) return;
-            DisplayMetrics displayMetrics = new DisplayMetrics();
-            ((Activity) BaseDialog.getTopActivity()).getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
-            Rect rect = new Rect();
-            View decorView = (View) getParent();
-            decorView.getWindowVisibleDisplayFrame(rect);
-            paddingView(rect.left, rect.top, displayMetrics.widthPixels - rect.right, displayMetrics.heightPixels - rect.bottom);
+            getWindowInsetsByDisplayMetrics();
         }
     }
 
+    private void getWindowInsetsByDisplayMetrics() {
+        if (parentDialog.getOwnActivity() == null) return;
+        DisplayMetrics displayMetrics = new DisplayMetrics();
+        parentDialog.getOwnActivity().getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
+        Rect rect = new Rect();
+        View decorView = (View) getParent();
+        decorView.getWindowVisibleDisplayFrame(rect);
+        paddingView(rect.left, rect.top, displayMetrics.widthPixels - rect.right, displayMetrics.heightPixels - rect.bottom);
+    }
+
     @Override
     protected void onDetachedFromWindow() {
         View decorView = (View) getParent();

+ 4 - 0
app/src/main/java/com/kongzue/dialogxdemo/App.java

@@ -3,6 +3,7 @@ package com.kongzue.dialogxdemo;
 import android.content.Intent;
 
 import com.kongzue.baseframework.BaseApp;
+import com.kongzue.baseframework.BaseFrameworkSettings;
 import com.kongzue.dialogx.DialogX;
 import com.kongzue.dialogx.style.MaterialStyle;
 import com.kongzue.dialogxdemo.service.TestBackgroundService;
@@ -17,12 +18,15 @@ import com.kongzue.dialogxdemo.service.TestBackgroundService;
 public class App extends BaseApp<App> {
     @Override
     public void init() {
+        BaseFrameworkSettings.DEBUGMODE = BuildConfig.DEBUG;
+
         DialogX.init(this);
         DialogX.implIMPLMode = DialogX.IMPL_MODE.VIEW;
         DialogX.useHaptic = true;
         DialogX.globalStyle = new MaterialStyle();
         DialogX.globalTheme = DialogX.THEME.AUTO;
         DialogX.onlyOnePopTip = false;
+        DialogX.DEBUGMODE = BuildConfig.DEBUG;
     
         //以下代码用于测试后台 Service 启动对话框
 //        DialogX.implIMPLMode = DialogX.IMPL_MODE.FLOATING_ACTIVITY;

+ 8 - 1
app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java

@@ -521,7 +521,7 @@ public class MainActivity extends BaseActivity {
                             @Override
                             public boolean onClick(MessageDialog baseDialog, View v) {
                                 PopTip.show("点击确定按钮");
-                                return true;
+                                return false;
                             }
                         });
             }
@@ -973,6 +973,7 @@ public class MainActivity extends BaseActivity {
                 FullScreenDialog.build(new OnBindView<FullScreenDialog>(R.layout.layout_full_webview) {
                             @Override
                             public void onBind(final FullScreenDialog dialog, View v) {
+
                                 btnClose = v.findViewById(R.id.btn_close);
                                 webView = v.findViewById(R.id.webView);
 
@@ -1446,4 +1447,10 @@ public class MainActivity extends BaseActivity {
             setDarkStatusBarTheme(false);
         }
     }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        log("MainActivity#onDestroy");
+    }
 }

+ 1 - 3
app/src/main/res/layout/layout_custom_recycleview.xml

@@ -4,6 +4,4 @@
     android:tag="ScrollController"
     android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="350dp">
-
-</com.kongzue.dialogxdemo.custom.recycleview.CustomRecycleView>
+    android:layout_height="400dp"/>

+ 1 - 1
gradle.properties

@@ -19,6 +19,6 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.48.beta13
+BUILD_VERSION=0.0.48.beta14
 BUILD_VERSION_INT=47
 DIALOGX_STYLE_VERSION=5

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.