Browse Source

0.0.45.beta12

kongzue 3 years ago
parent
commit
f48f91c0a0

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

@@ -24,6 +24,7 @@ import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnSafeInsetsChangeListener;
 import com.kongzue.dialogx.interfaces.ScrollController;
+import com.kongzue.dialogx.util.DialogXImplModeAgent;
 import com.kongzue.dialogx.util.FullScreenDialogTouchEventInterceptor;
 import com.kongzue.dialogx.util.views.ActivityScreenShotImageView;
 import com.kongzue.dialogx.util.views.BottomDialogScrollView;
@@ -156,8 +157,8 @@ public class FullScreenDialog extends BaseDialog {
             boxRoot.setOnBackPressedListener(new OnBackPressedListener() {
                 @Override
                 public boolean onBackPressed() {
-                    if (onBackPressedListener != null ) {
-                        if (onBackPressedListener.onBackPressed()){
+                    if (onBackPressedListener != null) {
+                        if (onBackPressedListener.onBackPressed()) {
                             dismiss();
                         }
                         return false;
@@ -292,7 +293,7 @@ public class FullScreenDialog extends BaseDialog {
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
             if (getContext() == null) return;
-    
+            
             if (!dismissAnimFlag) {
                 dismissAnimFlag = true;
                 long exitAnimDurationTemp = 300;
@@ -302,11 +303,11 @@ public class FullScreenDialog extends BaseDialog {
                 if (exitAnimDuration >= 0) {
                     exitAnimDurationTemp = exitAnimDuration;
                 }
-    
+                
                 ObjectAnimator exitAnim = ObjectAnimator.ofFloat(bkg, "y", bkg.getY(), boxBkg.getHeight());
                 exitAnim.setDuration(exitAnimDurationTemp);
                 exitAnim.start();
-    
+                
                 ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
                 bkgAlpha.setDuration(exitAnimDurationTemp);
                 bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@@ -320,7 +321,7 @@ public class FullScreenDialog extends BaseDialog {
                     }
                 });
                 bkgAlpha.start();
-    
+                
                 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                     @Override
                     public void run() {
@@ -523,4 +524,9 @@ public class FullScreenDialog extends BaseDialog {
         this.dialogImplMode = dialogImplMode;
         return this;
     }
+    
+    public FullScreenDialog setDurabilityDialogImplMode(DialogX.IMPL_MODE dialogImplMode) {
+        durabilityDialogImplMode = new DialogXImplModeAgent(dialogImplMode, this);
+        return this;
+    }
 }

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

@@ -37,6 +37,7 @@ import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.impl.DialogFragmentImpl;
 import com.kongzue.dialogx.util.ActivityRunnable;
 import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
+import com.kongzue.dialogx.util.DialogXImplModeAgent;
 import com.kongzue.dialogx.util.TextInfo;
 import com.kongzue.dialogx.util.WindowUtil;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
@@ -66,7 +67,8 @@ public abstract class BaseDialog {
     private static List<BaseDialog> runningDialogList;
     private WeakReference<View> dialogView;
     protected WeakReference<DialogFragmentImpl> ownDialogFragmentImpl;
-    protected DialogX.IMPL_MODE dialogImplMode = DialogX.implIMPLMode;
+    protected DialogX.IMPL_MODE dialogImplMode;
+    protected static DialogXImplModeAgent durabilityDialogImplMode = null;
     protected WeakReference<DialogXFloatingWindowActivity> floatingWindowActivity;
     
     public static void init(Context context) {
@@ -154,6 +156,8 @@ public abstract class BaseDialog {
             baseDialog.dialogView = new WeakReference<>(view);
             
             log(baseDialog.dialogKey() + ".show");
+            log(baseDialog + ".impl=" + baseDialog.dialogImplMode.name());
+            
             addDialogToRunningList(baseDialog);
             
             switch (baseDialog.dialogImplMode) {
@@ -271,7 +275,9 @@ public abstract class BaseDialog {
             baseDialog.dialogView = new WeakReference<>(view);
             
             log(baseDialog + ".show");
+            log(baseDialog + ".impl=" + baseDialog.dialogImplMode.name());
             addDialogToRunningList(baseDialog);
+            
             switch (baseDialog.dialogImplMode) {
                 case WINDOW:
                     runOnMain(new Runnable() {
@@ -356,6 +362,10 @@ public abstract class BaseDialog {
             return;
         }
         final BaseDialog baseDialog = (BaseDialog) dialogView.getTag();
+        if (durabilityDialogImplMode!=null && durabilityDialogImplMode.getDialog() == baseDialog) {
+            durabilityDialogImplMode.recycle();
+            durabilityDialogImplMode = null;
+        }
         log(baseDialog.dialogKey() + ".dismiss");
         removeDialogToRunningList(baseDialog);
         if (baseDialog.dialogView != null) {
@@ -616,6 +626,14 @@ public abstract class BaseDialog {
         if (style.styleVer != DialogXStyle.styleVer) {
             error("DialogX 所引用的 Style 不符合当前适用版本:" + DialogXStyle.styleVer + " 引入的 Style(" + style.getClass().getSimpleName() + ") 版本" + style.styleVer);
         }
+        
+        if (dialogImplMode == null) {
+            if (durabilityDialogImplMode != null && durabilityDialogImplMode.getDialog() != null) {
+                dialogImplMode = durabilityDialogImplMode.getImplMode();
+            } else {
+                dialogImplMode = DialogX.implIMPLMode;
+            }
+        }
         if (dialogImplMode != DialogX.IMPL_MODE.VIEW && getContext() instanceof LifecycleOwner) {
             Lifecycle lifecycle = ((LifecycleOwner) getContext()).getLifecycle();
             lifecycle.addObserver(new LifecycleEventObserver() {

+ 11 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/DialogXFloatingWindowActivity.java

@@ -115,4 +115,15 @@ public class DialogXFloatingWindowActivity extends AppCompatActivity {
             overridePendingTransition(0, 0);
         }
     }
+    
+    boolean isScreenshot;
+    
+    public boolean isScreenshot() {
+        return isScreenshot;
+    }
+    
+    public DialogXFloatingWindowActivity setScreenshot(boolean screenshot) {
+        isScreenshot = screenshot;
+        return this;
+    }
 }

+ 51 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/DialogXImplModeAgent.java

@@ -0,0 +1,51 @@
+package com.kongzue.dialogx.util;
+
+import com.kongzue.dialogx.DialogX;
+import com.kongzue.dialogx.interfaces.BaseDialog;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2022/5/17 15:16
+ */
+public class DialogXImplModeAgent {
+    
+    private DialogX.IMPL_MODE implMode;
+    private WeakReference<BaseDialog> dialogWeakReference;
+    
+    public DialogXImplModeAgent(DialogX.IMPL_MODE implMode, BaseDialog dialog) {
+        this.implMode = implMode;
+        this.dialogWeakReference = new WeakReference<>(dialog);
+    }
+    
+    public DialogX.IMPL_MODE getImplMode() {
+        return implMode;
+    }
+    
+    public DialogXImplModeAgent setImplMode(DialogX.IMPL_MODE implMode) {
+        this.implMode = implMode;
+        return this;
+    }
+    
+    public BaseDialog getDialog() {
+        if (dialogWeakReference == null) {
+            return null;
+        }
+        return dialogWeakReference.get();
+    }
+    
+    public DialogXImplModeAgent setDialogWeakReference(BaseDialog dialog) {
+        this.dialogWeakReference = new WeakReference<>(dialog);
+        return this;
+    }
+    
+    public void recycle() {
+        if (dialogWeakReference != null) dialogWeakReference.clear();
+        dialogWeakReference = null;
+        implMode = null;
+    }
+}

+ 22 - 6
DialogX/src/main/java/com/kongzue/dialogx/util/views/ActivityScreenShotImageView.java

@@ -16,10 +16,13 @@ import android.view.Gravity;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
+import android.widget.FrameLayout;
 
 import androidx.appcompat.widget.AppCompatImageView;
 
+import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.interfaces.BaseDialog;
+import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
 
 /**
  * @author: Kongzue
@@ -110,15 +113,28 @@ public class ActivityScreenShotImageView extends AppCompatImageView {
     }
     
     private void doScreenshotActivityAndZoom() {
-        if (BaseDialog.getRootFrameLayout() == null) return;
-        final View view = BaseDialog.getRootFrameLayout();
+        Activity screenshotActivity = ActivityLifecycleImpl.getTopActivity();
+        if (screenshotActivity == null) {
+            return;
+        }
+        View activityView;
+        if (screenshotActivity instanceof DialogXFloatingWindowActivity) {
+            if (((DialogXFloatingWindowActivity) screenshotActivity).isScreenshot()) {
+                activityView = (FrameLayout) screenshotActivity.getWindow().getDecorView();
+            } else {
+                activityView = BaseDialog.getRootFrameLayout();
+                ((DialogXFloatingWindowActivity) screenshotActivity).setScreenshot(true);
+            }
+        } else {
+            activityView = BaseDialog.getRootFrameLayout();
+        }
         //先执行一次绘制,防止出现闪屏问题
-        if (!inited) drawViewImage(view);
-        view.post(new Runnable() {
+        if (!inited) drawViewImage(activityView);
+        activityView.post(new Runnable() {
             @Override
             public void run() {
                 //当view渲染完成后再次通知刷新一下界面(当旋转屏幕执行时,很可能出现渲染延迟的问题)
-                drawViewImage(view);
+                drawViewImage(activityView);
                 inited = true;
             }
         });
@@ -128,7 +144,7 @@ public class ActivityScreenShotImageView extends AppCompatImageView {
     private boolean isScreenshotSuccess;
     
     private void drawViewImage(View view) {
-        if (view.getWidth()==0 || view.getHeight()==0)return;
+        if (view.getWidth() == 0 || view.getHeight() == 0) return;
         view.buildDrawingCache();
         Rect rect = new Rect();
         view.getWindowVisibleDisplayFrame(rect);

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

@@ -151,7 +151,7 @@ public class DialogXBaseRelativeLayout extends RelativeLayout {
             if (BaseDialog.getContext() == null) return;
             
             ((Activity) BaseDialog.getContext()).getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(decorViewLayoutListener);
-            
+            decorViewLayoutListener.onGlobalLayout();
             
             if (onLifecycleCallBack != null) {
                 onLifecycleCallBack.onShow();

+ 1 - 1
README.md

@@ -143,7 +143,7 @@ allprojects {
 2) 在 app 的 build.gradle 文件中找到 `dependencies{}` 代码块,并在其中加入以下语句:
 
 ```
-def dialogx_version = "0.0.43.beta13"
+def dialogx_version = "0.0.45.beta12"
 implementation "com.github.kongzue.DialogX:DialogX:${dialogx_version}"
 ```
 

+ 62 - 59
app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java

@@ -183,8 +183,8 @@ public class MainActivity extends BaseActivity {
         if (showBreak) {
             txtTitle.setText("显示Dialog时关闭Activity演示");
             MessageDialog.show("提示", "接下来会直接运行一个 WaitDialog,2 秒后直接关闭 Activity,并回到原 Activity,保证程序不会出现 WindowLeaked 错误。\n\n" +
-                    "Android 原生 AlertDialog 常出现因 Dialog 先于 Activity 关闭而导致此错误引发程序崩溃。\n\n" +
-                    "而使用 DialogX 构建的对话框不仅仅不会出现此问题,还可避免因句柄持续持有导致的内存泄漏。", "开始测试", "取消")
+                            "Android 原生 AlertDialog 常出现因 Dialog 先于 Activity 关闭而导致此错误引发程序崩溃。\n\n" +
+                            "而使用 DialogX 构建的对话框不仅仅不会出现此问题,还可避免因句柄持续持有导致的内存泄漏。", "开始测试", "取消")
                     .setOkButton(new OnDialogButtonClickListener() {
                         @Override
                         public boolean onClick(BaseDialog baseDialog, View v) {
@@ -380,11 +380,11 @@ public class MainActivity extends BaseActivity {
                 MessageDialog.show("标题", "这里是正文内容。", "确定")
                         .setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
                             @Override
-                    public boolean onClick(MessageDialog baseDialog, View v) {
-                        PopTip.show("点击确定按钮");
-                        return false;
-                    }
-                });
+                            public boolean onClick(MessageDialog baseDialog, View v) {
+                                PopTip.show("点击确定按钮");
+                                return false;
+                            }
+                        });
             }
         });
         
@@ -749,50 +749,53 @@ public class MainActivity extends BaseActivity {
         btnFullScreenDialogWebPage.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                FullScreenDialog.show(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);
-                        
-                        btnClose.setOnClickListener(new View.OnClickListener() {
+                FullScreenDialog.build(new OnBindView<FullScreenDialog>(R.layout.layout_full_webview) {
                             @Override
-                            public void onClick(View v) {
-                                dialog.dismiss();
-                            }
-                        });
-                        
-                        WebSettings webSettings = webView.getSettings();
-                        webSettings.setJavaScriptEnabled(true);
-                        webSettings.setLoadWithOverviewMode(true);
-                        webSettings.setUseWideViewPort(true);
-                        webSettings.setSupportZoom(false);
-                        webSettings.setAllowFileAccess(true);
-                        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
-                        webSettings.setLoadsImagesAutomatically(true);
-                        webSettings.setDefaultTextEncodingName("utf-8");
-                        
-                        webView.setWebViewClient(new WebViewClient() {
-                            @Override
-                            public boolean shouldOverrideUrlLoading(WebView view, String url) {
-                                try {
-                                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
-                                    startActivity(intent);
-                                } catch (ActivityNotFoundException e) {
-                                    e.printStackTrace();
-                                }
-                                return true;
-                            }
-                            
-                            @Override
-                            public void onPageFinished(WebView view, String url) {
-                                super.onPageFinished(view, url);
+                            public void onBind(final FullScreenDialog dialog, View v) {
+                                btnClose = v.findViewById(R.id.btn_close);
+                                webView = v.findViewById(R.id.webView);
+                                
+                                btnClose.setOnClickListener(new View.OnClickListener() {
+                                    @Override
+                                    public void onClick(View v) {
+                                        //dialog.dismiss();
+                                        btnFullScreenDialogLogin.callOnClick();
+                                    }
+                                });
+                                
+                                WebSettings webSettings = webView.getSettings();
+                                webSettings.setJavaScriptEnabled(true);
+                                webSettings.setLoadWithOverviewMode(true);
+                                webSettings.setUseWideViewPort(true);
+                                webSettings.setSupportZoom(false);
+                                webSettings.setAllowFileAccess(true);
+                                webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+                                webSettings.setLoadsImagesAutomatically(true);
+                                webSettings.setDefaultTextEncodingName("utf-8");
+                                
+                                webView.setWebViewClient(new WebViewClient() {
+                                    @Override
+                                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                                        try {
+                                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+                                            startActivity(intent);
+                                        } catch (ActivityNotFoundException e) {
+                                            e.printStackTrace();
+                                        }
+                                        return true;
+                                    }
+                                    
+                                    @Override
+                                    public void onPageFinished(WebView view, String url) {
+                                        super.onPageFinished(view, url);
+                                    }
+                                });
+                                
+                                webView.loadUrl("https://github.com/kongzue/DialogX");
                             }
-                        });
-                        
-                        webView.loadUrl("https://github.com/kongzue/DialogX");
-                    }
-                });
+                        })
+                        .setDurabilityDialogImplMode(DialogX.IMPL_MODE.FLOATING_ACTIVITY)
+                        .show();
             }
         });
         
@@ -800,18 +803,18 @@ public class MainActivity extends BaseActivity {
             @Override
             public void onClick(View v) {
                 CustomDialog.show(new OnBindView<CustomDialog>(R.layout.layout_custom_dialog) {
-                    @Override
-                    public void onBind(final CustomDialog dialog, View v) {
-                        ImageView btnOk;
-                        btnOk = v.findViewById(R.id.btn_ok);
-                        btnOk.setOnClickListener(new View.OnClickListener() {
                             @Override
-                            public void onClick(View v) {
-                                dialog.dismiss();
+                            public void onBind(final CustomDialog dialog, View v) {
+                                ImageView btnOk;
+                                btnOk = v.findViewById(R.id.btn_ok);
+                                btnOk.setOnClickListener(new View.OnClickListener() {
+                                    @Override
+                                    public void onClick(View v) {
+                                        dialog.dismiss();
+                                    }
+                                });
                             }
-                        });
-                    }
-                })
+                        })
                         .setMaskColor(getResources().getColor(R.color.black30));
             }
         });

+ 1 - 1
gradle.properties

@@ -19,5 +19,5 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.45.beta11
+BUILD_VERSION=0.0.45.beta12
 BUILD_VERSION_INT=44