Skip to content

Commit 56b217b

Browse files
committed
Merged PR #8267 with some changes
1 parent d872cce commit 56b217b

7 files changed

Lines changed: 33 additions & 7 deletions

File tree

android/src/main/java/com/reactnativenavigation/hierarchy/root/RootAnimator.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController
1010
open class RootAnimator {
1111

1212
open fun setRoot(appearing: ViewController<*>, disappearing: ViewController<*>?, setRoot: TransitionAnimationOptions, onAnimationEnd: ()->Unit) {
13+
if (appearing.isDestroyed) {
14+
onAnimationEnd()
15+
return
16+
}
1317
appearing.view.visibility = View.VISIBLE
1418

1519
if (!setRoot.hasValue() || (!setRoot.enter.hasAnimation() && !setRoot.exit.hasAnimation())) {
@@ -22,10 +26,9 @@ open class RootAnimator {
2226
val appearingAnimation = if (setRoot.enter.hasAnimation()) {
2327
setRoot.enter.getAnimation(appearing.view)
2428
} else null
25-
val disappearingAnimation = if (disappearing != null && setRoot.exit.hasAnimation()) {
29+
val disappearingAnimation = if (disappearing != null && !disappearing.isDestroyed && setRoot.exit.hasAnimation()) {
2630
setRoot.exit.getAnimation(disappearing.view)
2731
} else null
28-
2932
when {
3033
appearingAnimation != null && disappearingAnimation != null -> animationSet.playTogether(appearingAnimation, disappearingAnimation)
3134
appearingAnimation != null -> animationSet.play(appearingAnimation)

android/src/main/java/com/reactnativenavigation/react/NavigationTurboModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class NavigationTurboModule(
8484
handle {
8585
Log.d("NavigationTurboModule", "setRoot handle ${Thread.currentThread()}")
8686
val viewController = layoutFactory.create(layoutTree)
87+
val activity = currentActivity
88+
if (activity == null) {
89+
promise.reject("ACTIVITY_NULL", "Activity is null")
90+
return@handle
91+
}
8792
navigator()?.setRoot(
8893
viewController,
8994
NativeCommandListener("setRoot", commandId, promise, eventEmitter, now)

android/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
88
import com.reactnativenavigation.react.events.EventEmitter;
99
import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry;
10+
import com.reactnativenavigation.NavigationApplication;
1011
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
1112
import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarController;
1213

@@ -32,7 +33,7 @@ public StackControllerBuilder(Activity activity, EventEmitter eventEmitter) {
3233
this.activity = activity;
3334
this.eventEmitter = eventEmitter;
3435
presenter = new Presenter(activity, new Options());
35-
animator = new StackAnimator(activity);
36+
animator = new StackAnimator(activity != null ? activity : NavigationApplication.instance);
3637
}
3738

3839
public StackControllerBuilder setEventEmitter(EventEmitter eventEmitter) {

android/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/LayoutDirectionApplier.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ class LayoutDirectionApplier {
1010
val currentContext = root.view?.context ?: return
1111

1212
if (options.layout.direction.hasValue()) {
13-
root.activity.window.decorView.layoutDirection = options.layout.direction.get()
13+
val direction = options.layout.direction.get()
14+
root.activity?.window?.decorView?.let { decor ->
15+
decor.layoutDirection = direction
16+
}
1417
I18nUtil.instance.allowRTL(currentContext, options.layout.direction.isRtl)
1518
I18nUtil.instance.forceRTL(currentContext, options.layout.direction.isRtl)
1619
}

android/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/Presenter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void onViewBroughtToFront(ViewController<?> viewController, Options optio
6565
}
6666

6767
private void applyOrientation(OrientationOptions options) {
68-
activity.setRequestedOrientation(options.getValue());
68+
if (activity != null) activity.setRequestedOrientation(options.getValue());
6969
}
7070

7171
private void applyViewOptions(ViewController view, Options options) {
@@ -127,6 +127,7 @@ private void mergeNavigationBarVisibility(NavigationBarOptions options) {
127127
}
128128

129129
private void applyNavigationBarVisibility(NavigationBarOptions options) {
130+
if (activity == null) return;
130131
View decorView = activity.getWindow().getDecorView();
131132
if (options.isVisible.isTrueOrUndefined()) {
132133
SystemUiUtils.showNavigationBar(activity.getWindow(), decorView);
@@ -136,6 +137,7 @@ private void applyNavigationBarVisibility(NavigationBarOptions options) {
136137
}
137138

138139
private void setNavigationBarBackgroundColor(NavigationBarOptions navigationBar) {
140+
if (activity == null) return;
139141
int defaultColor = SystemUiUtils.getDefaultNavBarColor();
140142
if (navigationBar.backgroundColor.canApplyValue()) {
141143
int color = navigationBar.backgroundColor.get(defaultColor);

android/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/RootPresenter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public RootPresenter(RootAnimator animator, LayoutDirectionApplier layoutDirecti
3535
}
3636

3737
public void setRoot(ViewController appearingRoot, ViewController<?> disappearingRoot, Options defaultOptions, CommandListener listener) {
38+
if (appearingRoot.isDestroyed()) {
39+
listener.onError("Could not set root - appearingRoot is already destroyed");
40+
return;
41+
}
3842
layoutDirectionApplier.apply(appearingRoot, defaultOptions);
3943
rootLayout.addView(appearingRoot.getView(), matchParentWithBehaviour(new BehaviourDelegate(appearingRoot)));
4044
Options options = appearingRoot.resolveCurrentOptions(defaultOptions);
@@ -60,6 +64,10 @@ private void animateSetRootAndReportSuccess(ViewController root,
6064
CommandListener listener,
6165
Options options)
6266
{
67+
if (root.isDestroyed()) {
68+
listener.onError("Could not set root - root is already destroyed");
69+
return;
70+
}
6371
AnimationOptions exit = options.animations.setRoot.getExit();
6472
AnimationOptions enter = options.animations.setRoot.getEnter();
6573
if ((enter.enabled.isTrueOrUndefined() && enter.hasAnimation())
@@ -68,7 +76,11 @@ private void animateSetRootAndReportSuccess(ViewController root,
6876
disappearingRoot,
6977
options.animations.setRoot,
7078
() -> {
71-
listener.onSuccess(root.getId());
79+
if (!root.isDestroyed()) {
80+
listener.onSuccess(root.getId());
81+
} else {
82+
listener.onError("Could not set root - root was destroyed before animation completed");
83+
}
7284
return Unit.INSTANCE;
7385
});
7486
} else {

android/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public void performOnParentStack(Func1<StackController> task) {
235235
public T getView() {
236236
if (view == null) {
237237
if (isDestroyed) {
238-
throw new RuntimeException("Tried to create view after it has already been destroyed");
238+
throw new RuntimeException("Tried to create view for " + getClass().getSimpleName() + " (id: " + id + ") after it has already been destroyed");
239239
}
240240
view = createView();
241241
view.setOnHierarchyChangeListener(this);

0 commit comments

Comments
 (0)