-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Expand file tree
/
Copy pathRootPresenter.java
More file actions
88 lines (78 loc) · 3.76 KB
/
RootPresenter.java
File metadata and controls
88 lines (78 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.reactnativenavigation.viewcontrollers.viewcontroller;
import com.facebook.react.ReactInstanceManager;
import com.reactnativenavigation.hierarchy.root.RootAnimator;
import com.reactnativenavigation.options.AnimationOptions;
import com.reactnativenavigation.options.Options;
import com.reactnativenavigation.react.CommandListener;
import com.reactnativenavigation.views.BehaviourDelegate;
import androidx.annotation.VisibleForTesting;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
public class RootPresenter {
private final RootAnimator animator;
private CoordinatorLayout rootLayout;
private final LayoutDirectionApplier layoutDirectionApplier;
public void setRootContainer(CoordinatorLayout rootLayout) {
this.rootLayout = rootLayout;
}
public RootPresenter() {
this(new RootAnimator(), new LayoutDirectionApplier());
}
@VisibleForTesting
public RootPresenter(RootAnimator animator, LayoutDirectionApplier layoutDirectionApplier) {
this.animator = animator;
this.layoutDirectionApplier = layoutDirectionApplier;
}
public void setRoot(ViewController appearingRoot, ViewController<?> disappearingRoot, Options defaultOptions, CommandListener listener) {
layoutDirectionApplier.apply(appearingRoot, defaultOptions);
if (appearingRoot.isDestroyed()) {
listener.onError("Could not set root - appearingRoot is already destroyed");
return;
}
rootLayout.addView(appearingRoot.getView(), matchParentWithBehaviour(new BehaviourDelegate(appearingRoot)));
Options options = appearingRoot.resolveCurrentOptions(defaultOptions);
AnimationOptions enter = options.animations.setRoot.getEnter();
appearingRoot.setWaitForRender(enter.waitForRender);
if (enter.waitForRender.isTrue()) {
appearingRoot.getView().setAlpha(0);
appearingRoot.addOnAppearedListener(() -> {
if (appearingRoot.isDestroyed()) {
listener.onError("Could not set root - Waited for the view to become visible but it was destroyed");
} else {
appearingRoot.getView().setAlpha(1);
animateSetRootAndReportSuccess(appearingRoot, disappearingRoot, listener, options);
}
});
} else {
animateSetRootAndReportSuccess(appearingRoot, disappearingRoot, listener, options);
}
}
private void animateSetRootAndReportSuccess(ViewController root,
ViewController disappearingRoot,
CommandListener listener,
Options options)
{
if (root.isDestroyed()) {
listener.onError("Could not set root - root is already destroyed");
return;
}
AnimationOptions exit = options.animations.setRoot.getExit();
AnimationOptions enter = options.animations.setRoot.getEnter();
if ((enter.enabled.isTrueOrUndefined() && enter.hasAnimation())
|| (disappearingRoot != null && exit.enabled.isTrueOrUndefined()&& exit.hasAnimation())) {
animator.setRoot(root,
disappearingRoot,
options.animations.setRoot,
() -> {
if (!root.isDestroyed()) {
listener.onSuccess(root.getId());
}
return Unit.INSTANCE;
});
} else {
listener.onSuccess(root.getId());
}
}
}