From 7c0fdea47f723bab9f6172df035ceccecfb8d180 Mon Sep 17 00:00:00 2001 From: YoKey Date: Sat, 14 Apr 2018 16:51:47 +0800 Subject: [PATCH 1/5] FragmentAnimator.setEnter/Exit/popEnter/popExit() will return to itself --- .../fragmentation/anim/FragmentAnimator.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/anim/FragmentAnimator.java b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/anim/FragmentAnimator.java index 7545619c..5644b4f2 100644 --- a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/anim/FragmentAnimator.java +++ b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/anim/FragmentAnimator.java @@ -60,32 +60,39 @@ public int getEnter() { return enter; } - public void setEnter(int enter) { + public FragmentAnimator setEnter(int enter) { this.enter = enter; + return this; } public int getExit() { return exit; } - public void setExit(int exit) { + /** + * enter animation + */ + public FragmentAnimator setExit(int exit) { this.exit = exit; + return this; } public int getPopEnter() { return popEnter; } - public void setPopEnter(int popEnter) { + public FragmentAnimator setPopEnter(int popEnter) { this.popEnter = popEnter; + return this; } public int getPopExit() { return popExit; } - public void setPopExit(int popExit) { + public FragmentAnimator setPopExit(int popExit) { this.popExit = popExit; + return this; } @Override From 913daa88ee2de11579ffc25bd2d701b172237cf5 Mon Sep 17 00:00:00 2001 From: YoKey Date: Thu, 17 May 2018 16:52:23 +0800 Subject: [PATCH 2/5] Compatible with #863 (v27.1.0+) --- build.gradle | 2 +- .../support/v4/app/FragmentationMagician.java | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e790c464..277b7c9f 100644 --- a/build.gradle +++ b/build.gradle @@ -28,5 +28,5 @@ ext { minSdkVersion = 14 targetSdkVersion = compileSdkVersion - v4Version = "27.1.0" + v4Version = "27.1.1" } diff --git a/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java b/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java index 9226207c..dd6c2b60 100644 --- a/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java +++ b/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java @@ -15,11 +15,15 @@ */ public class FragmentationMagician { public static boolean sSupportLessThan25dot4 = false; + public static boolean sSupportGreaterThan27dot1dot0 = false; static { Field[] fields = FragmentManagerImpl.class.getDeclaredFields(); for (Field field : fields) { - if (field.getName().equals("mAvailIndices")) { + if (field.getName().equals("mStopped")) { // > v27.1.0 + sSupportGreaterThan27dot1dot0 = true; + break; + } else if (field.getName().equals("mAvailIndices")) { // < 25.4.0 sSupportLessThan25dot4 = true; break; } @@ -180,10 +184,27 @@ private static void hookStateSaved(FragmentManager fragmentManager, Runnable run FragmentManagerImpl fragmentManagerImpl = (FragmentManagerImpl) fragmentManager; if (isStateSaved(fragmentManager)) { fragmentManagerImpl.mStateSaved = false; - runnable.run(); + compatRunAction(fragmentManagerImpl, runnable); fragmentManagerImpl.mStateSaved = true; } else { runnable.run(); } } + + /** + * Compat v27.1.0+ + * + * So the code to compile Fragmentation needs v27.1.0+ + * + * @see FragmentManager#isStateSaved() + */ + private static void compatRunAction(FragmentManagerImpl fragmentManagerImpl, Runnable runnable) { + if (sSupportGreaterThan27dot1dot0) { + fragmentManagerImpl.mStopped = false; + runnable.run(); + fragmentManagerImpl.mStopped = true; + } else { + runnable.run(); + } + } } \ No newline at end of file From b19baf9c0e09e96b9996be17d2edc6fa5e3dab38 Mon Sep 17 00:00:00 2001 From: YoKey Date: Thu, 17 May 2018 16:53:04 +0800 Subject: [PATCH 3/5] Optimize timing of `onFragmentResult()` callbacks --- .../me/yokeyword/fragmentation/TransactionDelegate.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java index 843a82e1..9b7aea8e 100755 --- a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java +++ b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java @@ -320,13 +320,8 @@ void handleResultRecord(Fragment from) { final ResultRecord resultRecord = args.getParcelable(FRAGMENTATION_ARG_RESULT_RECORD); if (resultRecord == null) return; - final ISupportFragment targetFragment = (ISupportFragment) from.getFragmentManager().getFragment(from.getArguments(), FRAGMENTATION_STATE_SAVE_RESULT); - mHandler.post(new Runnable() { - @Override - public void run() { - targetFragment.onFragmentResult(resultRecord.requestCode, resultRecord.resultCode, resultRecord.resultBundle); - } - }); + ISupportFragment targetFragment = (ISupportFragment) from.getFragmentManager().getFragment(from.getArguments(), FRAGMENTATION_STATE_SAVE_RESULT); + targetFragment.onFragmentResult(resultRecord.requestCode, resultRecord.resultCode, resultRecord.resultBundle); } catch (IllegalStateException ignored) { // Fragment no longer exists } From 45982cf82d260c9abdf608308d3716611d53a260 Mon Sep 17 00:00:00 2001 From: YoKey Date: Thu, 17 May 2018 16:54:05 +0800 Subject: [PATCH 4/5] Update to 1.3.4 --- README.md | 8 ++++---- README_CN.md | 8 ++++---- fragmentation_swipeback/README.md | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d0c9698a..d92173cc 100755 --- a/README.md +++ b/README.md @@ -46,15 +46,15 @@ The first demo shows the basic usage of the library. The second one shows the wa **1、build.gradle** ````gradle // appcompat-v7 is required -compile 'me.yokeyword:fragmentation:1.3.3' +compile 'me.yokeyword:fragmentation:1.3.4' // If you don't want to extends SupportActivity/Fragment and would like to customize your own support, just rely on fragmentation-core -// compile 'me.yokeyword:fragmentation-core:1.3.3' +// compile 'me.yokeyword:fragmentation-core:1.3.4' // To get SwipeBack feature, rely on both fragmentation & fragmentation-swipeback -compile 'me.yokeyword:fragmentation:1.3.3' +compile 'me.yokeyword:fragmentation:1.3.4' // Swipeback is based on fragmentation. Refer to SwipeBackActivity/Fragment for your Customized SupportActivity/Fragment -compile 'me.yokeyword:fragmentation-swipeback:1.3.3' +compile 'me.yokeyword:fragmentation-swipeback:1.3.4' // To simplify the communication between Fragments. compile 'me.yokeyword:eventbus-activity-scope:1.1.0' diff --git a/README_CN.md b/README_CN.md index e982ee28..deed1d3f 100644 --- a/README_CN.md +++ b/README_CN.md @@ -52,15 +52,15 @@ A powerful library that manage Fragment for Android! **1. 项目下app的build.gradle中依赖:** ````gradle // appcompat-v7包是必须的 -compile 'me.yokeyword:fragmentation:1.3.3' +compile 'me.yokeyword:fragmentation:1.3.4' // 如果不想继承SupportActivity/Fragment,自己定制Support,可仅依赖: -// compile 'me.yokeyword:fragmentation-core:1.3.3' +// compile 'me.yokeyword:fragmentation-core:1.3.4' // 如果想使用SwipeBack 滑动边缘退出Fragment/Activity功能,完整的添加规则如下: -compile 'me.yokeyword:fragmentation:1.3.3' +compile 'me.yokeyword:fragmentation:1.3.4' // swipeback基于fragmentation, 如果是自定制SupportActivity/Fragment,则参照SwipeBackActivity/Fragment实现即可 -compile 'me.yokeyword:fragmentation-swipeback:1.3.3' +compile 'me.yokeyword:fragmentation-swipeback:1.3.4' // Activity作用域的EventBus,更安全,可有效避免after onSavenInstanceState()异常 compile 'me.yokeyword:eventbus-activity-scope:1.1.0' diff --git a/fragmentation_swipeback/README.md b/fragmentation_swipeback/README.md index 3f188a7b..6fb22189 100644 --- a/fragmentation_swipeback/README.md +++ b/fragmentation_swipeback/README.md @@ -10,8 +10,8 @@ Activity内Fragment数大于1时,滑动返回的是Fragment,否则滑动返 1、项目下app的build.gradle中依赖: ````gradle // appcompat v7包是必须的 -compile 'me.yokeyword:fragmentation:1.3.3' -compile 'me.yokeyword:fragmentation-swipeback:1.3.3' +compile 'me.yokeyword:fragmentation:1.3.4' +compile 'me.yokeyword:fragmentation-swipeback:1.3.4' ```` 2、如果Activity也需要支持SwipeBack,则继承SwipeBackActivity: From 28aff486c98ddb6da25c2ff88e7115963672b381 Mon Sep 17 00:00:00 2001 From: YoKey Date: Thu, 17 May 2018 17:06:25 +0800 Subject: [PATCH 5/5] Optimized `FragmentationMagician.java` --- .../support/v4/app/FragmentationMagician.java | 21 ++++++++++++------- .../fragmentation/TransactionDelegate.java | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java b/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java index dd6c2b60..052c5769 100644 --- a/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java +++ b/fragmentation_core/src/main/java/android/support/v4/app/FragmentationMagician.java @@ -14,8 +14,8 @@ * Created by YoKey on 16/1/22. */ public class FragmentationMagician { - public static boolean sSupportLessThan25dot4 = false; - public static boolean sSupportGreaterThan27dot1dot0 = false; + private static boolean sSupportLessThan25dot4 = false; + private static boolean sSupportGreaterThan27dot1dot0 = false; static { Field[] fields = FragmentManagerImpl.class.getDeclaredFields(); @@ -30,6 +30,10 @@ public class FragmentationMagician { } } + public static boolean isSupportLessThan25dot4() { + return sSupportLessThan25dot4; + } + public static boolean isExecutingActions(FragmentManager fragmentManager) { if (!(fragmentManager instanceof FragmentManagerImpl)) return false; @@ -193,18 +197,19 @@ private static void hookStateSaved(FragmentManager fragmentManager, Runnable run /** * Compat v27.1.0+ - * + *

* So the code to compile Fragmentation needs v27.1.0+ * * @see FragmentManager#isStateSaved() */ private static void compatRunAction(FragmentManagerImpl fragmentManagerImpl, Runnable runnable) { - if (sSupportGreaterThan27dot1dot0) { - fragmentManagerImpl.mStopped = false; - runnable.run(); - fragmentManagerImpl.mStopped = true; - } else { + if (!sSupportGreaterThan27dot1dot0) { runnable.run(); + return; } + + fragmentManagerImpl.mStopped = false; + runnable.run(); + fragmentManagerImpl.mStopped = true; } } \ No newline at end of file diff --git a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java index 9b7aea8e..049e81d0 100755 --- a/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java +++ b/fragmentation_core/src/main/java/me/yokeyword/fragmentation/TransactionDelegate.java @@ -575,7 +575,7 @@ private void safePopTo(String fragmentTag, final FragmentManager fm, int flag, L FragmentationMagician.executePendingTransactionsAllowingStateLoss(fm); mSupport.getSupportDelegate().mPopMultipleNoAnim = false; - if (FragmentationMagician.sSupportLessThan25dot4) { + if (FragmentationMagician.isSupportLessThan25dot4()) { mHandler.post(new Runnable() { @Override public void run() {