From aef7745cd3a8d9cfce69f9553c8c01b9bdf1cc06 Mon Sep 17 00:00:00 2001 From: Guy Carmeli Date: Wed, 6 Feb 2019 09:15:53 +0200 Subject: [PATCH] Fixed modalDismissed event being emitted with wrong id Event was emitted with parent id instead of the id provided by the user, which could be an id on one of the modals children. fixes #4693 --- .../viewcontrollers/modal/ModalStack.java | 4 ++-- .../stack/StackControllerBuilder.java | 7 ++++-- .../viewcontrollers/modal/ModalStackTest.java | 23 +++++++++++++++++-- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalStack.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalStack.java index 859e22d7784..ea7d7411f2f 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalStack.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalStack.java @@ -62,8 +62,8 @@ public boolean dismissModal(String componentId, @Nullable ViewController root, C CommandListenerAdapter onDismiss = new CommandListenerAdapter(listener) { @Override public void onSuccess(String childId) { - eventEmitter.emitModalDismissed(toDismiss.getId(), 1); - super.onSuccess(childId); + eventEmitter.emitModalDismissed(componentId, 1); + super.onSuccess(componentId); } }; if (isDismissingTopModal) { diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerBuilder.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerBuilder.java index 0b9de0c2490..37bb9a375f7 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerBuilder.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerBuilder.java @@ -11,8 +11,7 @@ import com.reactnativenavigation.viewcontrollers.topbar.TopBarController; import com.reactnativenavigation.views.element.ElementTransitionManager; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class StackControllerBuilder { private Activity activity; @@ -32,6 +31,10 @@ public StackControllerBuilder(Activity activity) { animator = new NavigationAnimator(activity, new ElementTransitionManager()); } + public StackControllerBuilder setChildren(ViewController... children) { + return setChildren(Arrays.asList(children)); + } + public StackControllerBuilder setChildren(List children) { this.children = children; return this; diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java index 378ba3841b6..1238cbc3228 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java @@ -4,7 +4,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; -import com.reactnativenavigation.BaseTest; +import com.reactnativenavigation.*; import com.reactnativenavigation.anim.ModalAnimator; import com.reactnativenavigation.mocks.SimpleViewController; import com.reactnativenavigation.parse.Options; @@ -13,6 +13,7 @@ import com.reactnativenavigation.utils.CommandListenerAdapter; import com.reactnativenavigation.viewcontrollers.ChildControllersRegistry; import com.reactnativenavigation.viewcontrollers.ViewController; +import com.reactnativenavigation.viewcontrollers.stack.*; import org.junit.Test; import org.mockito.Mockito; @@ -34,16 +35,20 @@ public class ModalStackTest extends BaseTest { private static final String MODAL_ID_1 = "modalId1"; private static final String MODAL_ID_2 = "modalId2"; private static final String MODAL_ID_3 = "modalId3"; + private static final String MODAL_ID_4 = "modalId4"; private ModalStack uut; private ViewController modal1; private ViewController modal2; private ViewController modal3; + private ViewController modal4; + private StackController stack; private Activity activity; private ChildControllersRegistry childRegistry; private ModalPresenter presenter; private ModalAnimator animator; private ViewController root; + private EventEmitter emitter; @Override public void beforeEach() { @@ -63,10 +68,15 @@ public void beforeEach() { uut = new ModalStack(presenter); uut.setModalsLayout(modalsLayout); uut.setRootLayout(rootLayout); - uut.setEventEmitter(Mockito.mock(EventEmitter.class)); + emitter = Mockito.mock(EventEmitter.class); + uut.setEventEmitter(emitter); modal1 = spy(new SimpleViewController(activity, childRegistry, MODAL_ID_1, new Options())); modal2 = spy(new SimpleViewController(activity, childRegistry, MODAL_ID_2, new Options())); modal3 = spy(new SimpleViewController(activity, childRegistry, MODAL_ID_3, new Options())); + modal4 = spy(new SimpleViewController(activity, childRegistry, MODAL_ID_4, new Options())); + stack = TestUtils.newStackController(activity) + .setChildren(modal4) + .build(); } @Test @@ -99,6 +109,15 @@ public void dismissModal() { verify(listener).onSuccess(modal1.getId()); } + @Test + public void dismissModal_listenerAndEmitterAreInvokedWithGivenId() { + uut.showModal(stack, root, new CommandListenerAdapter()); + CommandListener listener = spy(new CommandListenerAdapter()); + uut.dismissModal(modal4.getId(), root, listener); + verify(listener).onSuccess(modal4.getId()); + verify(emitter).emitModalDismissed(modal4.getId(), 1); + } + @SuppressWarnings("Convert2Lambda") @Test public void dismissModal_rejectIfModalNotFound() {