Loading core/java/android/app/BackStackRecord.java +37 −24 Original line number Original line Diff line number Diff line Loading @@ -798,21 +798,33 @@ final class BackStackRecord extends FragmentTransaction implements } } } } private static void setFirstOut(SparseArray<Fragment> fragments, Fragment fragment) { private static void setFirstOut(SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments, Fragment fragment) { if (fragment != null) { if (fragment != null) { int containerId = fragment.mContainerId; int containerId = fragment.mContainerId; if (containerId != 0 && !fragment.isHidden() && fragment.isAdded() && if (containerId != 0 && !fragment.isHidden()) { fragment.getView() != null && fragments.get(containerId) == null) { if (fragment.isAdded() && fragment.getView() != null fragments.put(containerId, fragment); && firstOutFragments.get(containerId) == null) { firstOutFragments.put(containerId, fragment); } if (lastInFragments.get(containerId) == fragment) { lastInFragments.remove(containerId); } } } } } } } private void setLastIn(SparseArray<Fragment> fragments, Fragment fragment) { private void setLastIn(SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments, Fragment fragment) { if (fragment != null) { if (fragment != null) { int containerId = fragment.mContainerId; int containerId = fragment.mContainerId; if (containerId != 0) { if (containerId != 0) { fragments.put(containerId, fragment); if (!fragment.isAdded()) { lastInFragments.put(containerId, fragment); } if (firstOutFragments.get(containerId) == fragment) { firstOutFragments.remove(containerId); } } } } } } } Loading @@ -835,7 +847,7 @@ final class BackStackRecord extends FragmentTransaction implements while (op != null) { while (op != null) { switch (op.cmd) { switch (op.cmd) { case OP_ADD: case OP_ADD: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REPLACE: { case OP_REPLACE: { Fragment f = op.fragment; Fragment f = op.fragment; Loading @@ -845,29 +857,30 @@ final class BackStackRecord extends FragmentTransaction implements if (f == null || old.mContainerId == f.mContainerId) { if (f == null || old.mContainerId == f.mContainerId) { if (old == f) { if (old == f) { f = null; f = null; lastInFragments.remove(old.mContainerId); } else { } else { setFirstOut(firstOutFragments, old); setFirstOut(firstOutFragments, lastInFragments, old); } } } } } } } } setLastIn(lastInFragments, f); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; } } case OP_REMOVE: case OP_REMOVE: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_HIDE: case OP_HIDE: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_SHOW: case OP_SHOW: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_DETACH: case OP_DETACH: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_ATTACH: case OP_ATTACH: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; } } Loading @@ -889,38 +902,38 @@ final class BackStackRecord extends FragmentTransaction implements if (!mManager.mContainer.onHasView()) { if (!mManager.mContainer.onHasView()) { return; // nothing to see, so no transitions return; // nothing to see, so no transitions } } Op op = mHead; Op op = mTail; while (op != null) { while (op != null) { switch (op.cmd) { switch (op.cmd) { case OP_ADD: case OP_ADD: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REPLACE: case OP_REPLACE: if (op.removed != null) { if (op.removed != null) { for (int i = op.removed.size() - 1; i >= 0; i--) { for (int i = op.removed.size() - 1; i >= 0; i--) { setLastIn(lastInFragments, op.removed.get(i)); setLastIn(firstOutFragments, lastInFragments, op.removed.get(i)); } } } } setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REMOVE: case OP_REMOVE: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_HIDE: case OP_HIDE: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_SHOW: case OP_SHOW: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_DETACH: case OP_DETACH: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_ATTACH: case OP_ATTACH: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; } } op = op.next; op = op.prev; } } } } Loading Loading
core/java/android/app/BackStackRecord.java +37 −24 Original line number Original line Diff line number Diff line Loading @@ -798,21 +798,33 @@ final class BackStackRecord extends FragmentTransaction implements } } } } private static void setFirstOut(SparseArray<Fragment> fragments, Fragment fragment) { private static void setFirstOut(SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments, Fragment fragment) { if (fragment != null) { if (fragment != null) { int containerId = fragment.mContainerId; int containerId = fragment.mContainerId; if (containerId != 0 && !fragment.isHidden() && fragment.isAdded() && if (containerId != 0 && !fragment.isHidden()) { fragment.getView() != null && fragments.get(containerId) == null) { if (fragment.isAdded() && fragment.getView() != null fragments.put(containerId, fragment); && firstOutFragments.get(containerId) == null) { firstOutFragments.put(containerId, fragment); } if (lastInFragments.get(containerId) == fragment) { lastInFragments.remove(containerId); } } } } } } } private void setLastIn(SparseArray<Fragment> fragments, Fragment fragment) { private void setLastIn(SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments, Fragment fragment) { if (fragment != null) { if (fragment != null) { int containerId = fragment.mContainerId; int containerId = fragment.mContainerId; if (containerId != 0) { if (containerId != 0) { fragments.put(containerId, fragment); if (!fragment.isAdded()) { lastInFragments.put(containerId, fragment); } if (firstOutFragments.get(containerId) == fragment) { firstOutFragments.remove(containerId); } } } } } } } Loading @@ -835,7 +847,7 @@ final class BackStackRecord extends FragmentTransaction implements while (op != null) { while (op != null) { switch (op.cmd) { switch (op.cmd) { case OP_ADD: case OP_ADD: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REPLACE: { case OP_REPLACE: { Fragment f = op.fragment; Fragment f = op.fragment; Loading @@ -845,29 +857,30 @@ final class BackStackRecord extends FragmentTransaction implements if (f == null || old.mContainerId == f.mContainerId) { if (f == null || old.mContainerId == f.mContainerId) { if (old == f) { if (old == f) { f = null; f = null; lastInFragments.remove(old.mContainerId); } else { } else { setFirstOut(firstOutFragments, old); setFirstOut(firstOutFragments, lastInFragments, old); } } } } } } } } setLastIn(lastInFragments, f); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; } } case OP_REMOVE: case OP_REMOVE: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_HIDE: case OP_HIDE: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_SHOW: case OP_SHOW: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_DETACH: case OP_DETACH: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_ATTACH: case OP_ATTACH: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; } } Loading @@ -889,38 +902,38 @@ final class BackStackRecord extends FragmentTransaction implements if (!mManager.mContainer.onHasView()) { if (!mManager.mContainer.onHasView()) { return; // nothing to see, so no transitions return; // nothing to see, so no transitions } } Op op = mHead; Op op = mTail; while (op != null) { while (op != null) { switch (op.cmd) { switch (op.cmd) { case OP_ADD: case OP_ADD: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REPLACE: case OP_REPLACE: if (op.removed != null) { if (op.removed != null) { for (int i = op.removed.size() - 1; i >= 0; i--) { for (int i = op.removed.size() - 1; i >= 0; i--) { setLastIn(lastInFragments, op.removed.get(i)); setLastIn(firstOutFragments, lastInFragments, op.removed.get(i)); } } } } setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_REMOVE: case OP_REMOVE: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_HIDE: case OP_HIDE: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_SHOW: case OP_SHOW: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_DETACH: case OP_DETACH: setLastIn(lastInFragments, op.fragment); setLastIn(firstOutFragments, lastInFragments, op.fragment); break; break; case OP_ATTACH: case OP_ATTACH: setFirstOut(firstOutFragments, op.fragment); setFirstOut(firstOutFragments, lastInFragments, op.fragment); break; break; } } op = op.next; op = op.prev; } } } } Loading