package com.reactnativenavigation.controllers; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Window; import com.facebook.react.bridge.Callback; import com.reactnativenavigation.events.EventBus; import com.reactnativenavigation.events.ModalDismissedEvent; import com.reactnativenavigation.layouts.ScreenStackContainer; import com.reactnativenavigation.params.ContextualMenuParams; import com.reactnativenavigation.params.FabParams; import com.reactnativenavigation.params.ScreenParams; import com.reactnativenavigation.params.SlidingOverlayParams; import com.reactnativenavigation.params.TitleBarButtonParams; import com.reactnativenavigation.params.TitleBarLeftButtonParams; import java.util.List; import java.util.Stack; class ModalController implements ScreenStackContainer, Modal.OnModalDismissedListener { private final AppCompatActivity activity; private Stack<Modal> stack = new Stack<>(); ModalController(AppCompatActivity activity) { this.activity = activity; } boolean containsNavigator(String navigatorId) { for (Modal modal : stack) { if (modal.containsNavigator(navigatorId)) { return true; } } return false; } void showModal(ScreenParams screenParams) { Modal modal = new Modal(activity, this, screenParams); modal.show(); stack.add(modal); } void dismissTopModal() { if (isShowing()) { stack.pop().dismiss(); } } void dismissAllModals() { for (Modal modal : stack) { modal.dismiss(); } stack.clear(); } boolean isShowing() { return !stack.empty(); } public void push(ScreenParams params) { stack.peek().push(params); } @Override public void pop(ScreenParams screenParams) { stack.peek().pop(screenParams); } @Override public void popToRoot(ScreenParams params) { stack.peek().popToRoot(params); } @Override public void newStack(ScreenParams params) { stack.peek().newStack(params); } @Override public void destroy() { for (Modal modal : stack) { modal.destroy(); modal.dismiss(); } stack.clear(); } @Override public void onModalDismissed(Modal modal) { stack.remove(modal); if (isShowing()) { stack.peek().onModalDismissed(); } EventBus.instance.post(new ModalDismissedEvent()); } public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) { for (Modal modal : stack) { modal.setTopBarVisible(screenInstanceId, hidden, animated); } } void setTitleBarTitle(String screenInstanceId, String title) { for (Modal modal : stack) { modal.setTitleBarTitle(screenInstanceId, title); } } void setTitleBarSubtitle(String screenInstanceId, String subtitle) { for (Modal modal : stack) { modal.setTitleBarSubtitle(screenInstanceId, subtitle); } } void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) { for (Modal modal : stack) { modal.setTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarButtons); } } void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButton) { for (Modal modal : stack) { modal.setTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButton); } } void setFab(String screenInstanceId, String navigatorEventId, FabParams fab) { for (Modal modal : stack) { modal.setFab(screenInstanceId, navigatorEventId, fab); } } void updateScreenStyle(String screenInstanceId, Bundle styleParams) { for (Modal modal : stack) { modal.updateScreenStyle(screenInstanceId, styleParams); } } public void showContextualMenu(String screenInstanceId, ContextualMenuParams params, Callback onButtonClicked) { for (Modal modal : stack) { modal.showContextualMenu(screenInstanceId, params, onButtonClicked); } } public void dismissContextualMenu(String screenInstanceId) { for (Modal modal : stack) { modal.dismissContextualMenu(screenInstanceId); } } @Override public boolean onTitleBarBackButtonClick() { // Do nothing and let the layout handle the back button click return false; } @Override public void onSideMenuButtonClick() { // Do nothing and let the layout handle the click } void showSlidingOverlay(SlidingOverlayParams params) { stack.peek().showSlidingOverlay(params); } void hideSlidingOverlay() { stack.peek().hideSlidingOverlay(); } Window getWindow() { return stack.peek().getWindow(); } void selectTopTabByTabIndex(String screenInstanceId, int index) { for (Modal modal : stack) { modal.selectTopTabByTabIndex(screenInstanceId, index); } } void selectTopTabByScreen(String screenInstanceId) { for (Modal modal : stack) { modal.selectTopTabByScreen(screenInstanceId); } } }