From aaea0a2994dda83876d360fef593a8c8a4df0639 Mon Sep 17 00:00:00 2001 From: Lukasz Kalnik Date: Tue, 28 Jan 2020 15:48:49 +0100 Subject: [PATCH] workaround for AndroidX Fragment 1.2.0 isInBackStack bug --- .../thirtyinch/util/BackstackReader.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/util/BackstackReader.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/util/BackstackReader.java index 08f3e392..d94b0e73 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/util/BackstackReader.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/util/BackstackReader.java @@ -4,6 +4,7 @@ import androidx.fragment.app.FragmentManager; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.reflect.Field; /** * Reads package private information about the {@link FragmentManager} backstack @@ -23,9 +24,36 @@ public class BackstackReader { * Hacky workaround because Fragment#isInBackStack is inaccessible with AndroidX */ public static boolean isInBackStack(final Fragment fragment) { + return isInBackStackAndroidX120(fragment); + } + + /** + * Implementation which worked with AndroidX Fragment 1.1.0 and should be working again from 1.2.1: + * https://issuetracker.google.com/issues/148189412 + */ + private static boolean isInBackStackAndroidXOld(final Fragment fragment) { final StringWriter writer = new StringWriter(); fragment.dump("", null, new PrintWriter(writer), null); final String dump = writer.toString(); return !dump.contains("mBackStackNesting=0"); } + + /** + * Temporary hack for the hack ;) because in AndroidX Fragment 1.2.0 the original `fragment.dump` hack stopped working: + * https://github.com/sockeqwe/mosby/issues/318#issuecomment-577660091 + * + * Uses reflection, so should be removed once AndroidX Fragment 1.2.1 is released. + */ + private static boolean isInBackStackAndroidX120(final Fragment fragment) { + try { + final Field backStackNestingField = Fragment.class.getDeclaredField("mBackStackNesting"); + backStackNestingField.setAccessible(true); + final int backStackNesting = backStackNestingField.getInt(fragment); + return backStackNesting > 0; + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } }