WIP Fix for cases where a router is simultaneously frozen from 2 sources
Needs tests before merging
This commit is contained in:
@@ -1364,20 +1364,21 @@ public abstract class Controller {
|
||||
changeHandler.onEnd();
|
||||
}
|
||||
|
||||
final void setDetachFrozen(boolean frozen) {
|
||||
if (isDetachFrozen != frozen) {
|
||||
isDetachFrozen = frozen;
|
||||
final void onDetachFreezeUpdated(boolean frozen) {
|
||||
if (isDetachFrozen == frozen) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (ControllerHostedRouter router : childRouters) {
|
||||
router.setDetachFrozen(frozen);
|
||||
}
|
||||
isDetachFrozen = frozen;
|
||||
for (ControllerHostedRouter router : childRouters) {
|
||||
router.onParentDetachFreezeUpdated(frozen);
|
||||
}
|
||||
|
||||
if (!frozen && view != null && viewWasDetached) {
|
||||
View aView = view;
|
||||
detach(view, false, false);
|
||||
if (view == null && aView.getParent() == router.container) {
|
||||
router.container.removeView(aView); // need to remove the view when this controller is a child controller
|
||||
}
|
||||
if (!frozen && view != null && viewWasDetached) {
|
||||
View aView = view;
|
||||
detach(view, false, false);
|
||||
if (view == null && aView.getParent() == router.container) {
|
||||
router.container.removeView(aView); // need to remove the view when this controller is a child controller
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ class ControllerHostedRouter extends Router {
|
||||
|
||||
@IdRes private int hostId;
|
||||
private String tag;
|
||||
private boolean isParentDetachFrozen;
|
||||
private boolean isDetachFrozen;
|
||||
private boolean boundToContainer;
|
||||
|
||||
@@ -89,13 +90,24 @@ class ControllerHostedRouter extends Router {
|
||||
container = null;
|
||||
}
|
||||
|
||||
final void onParentDetachFreezeUpdated(boolean frozen) {
|
||||
isParentDetachFrozen = frozen;
|
||||
for (RouterTransaction transaction : backstack) {
|
||||
reportDetachFrozen(transaction.controller());
|
||||
}
|
||||
}
|
||||
|
||||
final void setDetachFrozen(boolean frozen) {
|
||||
isDetachFrozen = frozen;
|
||||
for (RouterTransaction transaction : backstack) {
|
||||
transaction.controller().setDetachFrozen(frozen);
|
||||
reportDetachFrozen(transaction.controller());
|
||||
}
|
||||
}
|
||||
|
||||
private void reportDetachFrozen(@NonNull Controller controller) {
|
||||
controller.onDetachFreezeUpdated(isDetachFrozen || isParentDetachFrozen);
|
||||
}
|
||||
|
||||
@Override
|
||||
void destroy(boolean popViews) {
|
||||
setDetachFrozen(false);
|
||||
@@ -104,17 +116,17 @@ class ControllerHostedRouter extends Router {
|
||||
|
||||
@Override
|
||||
protected void pushToBackstack(@NonNull RouterTransaction entry) {
|
||||
if (isDetachFrozen) {
|
||||
entry.controller().setDetachFrozen(true);
|
||||
if (isDetachFrozen || isParentDetachFrozen) {
|
||||
reportDetachFrozen(entry.controller());
|
||||
}
|
||||
super.pushToBackstack(entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBackstack(@NonNull List<RouterTransaction> newBackstack, @Nullable ControllerChangeHandler changeHandler) {
|
||||
if (isDetachFrozen) {
|
||||
if (isDetachFrozen || isParentDetachFrozen) {
|
||||
for (RouterTransaction transaction : newBackstack) {
|
||||
transaction.controller().setDetachFrozen(true);
|
||||
reportDetachFrozen(transaction.controller());
|
||||
}
|
||||
}
|
||||
super.setBackstack(newBackstack, changeHandler);
|
||||
|
||||
Reference in New Issue
Block a user