+ // Prior to Android N we were simply checking if this fragment had a FragmentManager
+ // set before we would trigger a deferred start. Unfortunately this also gets set before
+ // a fragment transaction is committed, so if setUserVisibleHint was called before a
+ // transaction commit, we would start the fragment way too early. FragmentPagerAdapter
+ // triggers this situation.
+ // Unfortunately some apps relied on this timing in overrides of setUserVisibleHint
+ // on their own fragments, and expected, however erroneously, that after a call to
+ // super.setUserVisibleHint their onStart methods had been run.
+ // We preserve this behavior for apps targeting old platform versions below.
+ boolean useBrokenAddedCheck = false;
+ Context context = getContext();
+ if (mFragmentManager != null && mFragmentManager.mHost != null) {
+ context = mFragmentManager.mHost.getContext();
+ }
+ if (context != null) {
+ useBrokenAddedCheck = context.getApplicationInfo().targetSdkVersion <= VERSION_CODES.M;
+ }
+
+ final boolean performDeferredStart;
+ if (useBrokenAddedCheck) {
+ performDeferredStart = !mUserVisibleHint && isVisibleToUser && mState < STARTED
+ && mFragmentManager != null;
+ } else {
+ performDeferredStart = !mUserVisibleHint && isVisibleToUser && mState < STARTED
+ && mFragmentManager != null && isAdded();
+ }
+
+ if (performDeferredStart) {