GCX-HCI / ThirtyInch

a MVP library for Android favoring a stateful Presenter
Apache License 2.0
1.03k stars 101 forks source link

BackstackReader doesn't work with AndroidX #149

Closed passsy closed 6 years ago

passsy commented 6 years ago

On Android P (Preview 3) with AndroidX

java.lang.IllegalAccessError: Method 'boolean androidx.fragment.app.Fragment.isInBackStack()' is inaccessible to class 'androidx.core.app.BackstackReader' (declaration of 'androidx.core.app.BackstackReader' appears in /data/app/com.mayapp.dev-A_fe5N5nGmYISV6iJbCPcg==/base.apk)
        at androidx.core.app.BackstackReader.isInBackStack(BackstackReader.java:19)
        at net.grandcentrix.thirtyinch.TiFragment.isFragmentInBackstack(TiFragment.java:235)
        at net.grandcentrix.thirtyinch.internal.TiFragmentDelegate.onDestroy_afterSuper(TiFragmentDelegate.java:204)
        at net.grandcentrix.thirtyinch.TiFragment.onDestroy(TiFragment.java:169)
        at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2689)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1591)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:797)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
        at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:648)
passsy commented 6 years ago

Reported: https://issuetracker.google.com/issues/111131656 //cc @sockeqwe

passsy commented 6 years ago

Possible workaround (not tested if returns the correct result)

    public static boolean isInBackStack(final Fragment fragment) {
        // Hacky workaround because Fragment#isInBackStack is inaccessible with AndroidX
        final StringWriter writer = new StringWriter();
        fragment.dump("", null, new PrintWriter(writer), null);
        final String dump = writer.toString();
        return !dump.contains("mBackStackNesting=0");
    }
sockeqwe commented 6 years ago

Thanks for the info. I talked to Adam Powell about making isInBackStack() public some time ago but I as well as Adam haven't push this further. I will reach out to him.