react-native-navigation的迁移库

ModalController.java 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.reactnativenavigation.controllers;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.Window;
  5. import com.facebook.react.bridge.Callback;
  6. import com.reactnativenavigation.events.EventBus;
  7. import com.reactnativenavigation.events.ModalDismissedEvent;
  8. import com.reactnativenavigation.layouts.ScreenStackContainer;
  9. import com.reactnativenavigation.params.ContextualMenuParams;
  10. import com.reactnativenavigation.params.FabParams;
  11. import com.reactnativenavigation.params.ScreenParams;
  12. import com.reactnativenavigation.params.SlidingOverlayParams;
  13. import com.reactnativenavigation.params.TitleBarButtonParams;
  14. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  15. import java.util.List;
  16. import java.util.Stack;
  17. class ModalController implements ScreenStackContainer, Modal.OnModalDismissedListener {
  18. private final AppCompatActivity activity;
  19. private Stack<Modal> stack = new Stack<>();
  20. ModalController(AppCompatActivity activity) {
  21. this.activity = activity;
  22. }
  23. boolean containsNavigator(String navigatorId) {
  24. for (Modal modal : stack) {
  25. if (modal.containsNavigator(navigatorId)) {
  26. return true;
  27. }
  28. }
  29. return false;
  30. }
  31. void showModal(ScreenParams screenParams) {
  32. Modal modal = new Modal(activity, this, screenParams);
  33. modal.show();
  34. stack.add(modal);
  35. }
  36. void dismissTopModal() {
  37. if (isShowing()) {
  38. stack.pop().dismiss();
  39. }
  40. }
  41. void dismissAllModals() {
  42. for (Modal modal : stack) {
  43. modal.dismiss();
  44. }
  45. stack.clear();
  46. }
  47. boolean isShowing() {
  48. return !stack.empty();
  49. }
  50. public void push(ScreenParams params) {
  51. stack.peek().push(params);
  52. }
  53. @Override
  54. public void pop(ScreenParams screenParams) {
  55. stack.peek().pop(screenParams);
  56. }
  57. @Override
  58. public void popToRoot(ScreenParams params) {
  59. stack.peek().popToRoot(params);
  60. }
  61. @Override
  62. public void newStack(ScreenParams params) {
  63. stack.peek().newStack(params);
  64. }
  65. @Override
  66. public void destroy() {
  67. for (Modal modal : stack) {
  68. modal.destroy();
  69. modal.dismiss();
  70. }
  71. stack.clear();
  72. }
  73. @Override
  74. public void onModalDismissed(Modal modal) {
  75. stack.remove(modal);
  76. if (isShowing()) {
  77. stack.peek().onModalDismissed();
  78. }
  79. EventBus.instance.post(new ModalDismissedEvent());
  80. }
  81. public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
  82. for (Modal modal : stack) {
  83. modal.setTopBarVisible(screenInstanceId, hidden, animated);
  84. }
  85. }
  86. void setTitleBarTitle(String screenInstanceId, String title) {
  87. for (Modal modal : stack) {
  88. modal.setTitleBarTitle(screenInstanceId, title);
  89. }
  90. }
  91. void setTitleBarSubtitle(String screenInstanceId, String subtitle) {
  92. for (Modal modal : stack) {
  93. modal.setTitleBarSubtitle(screenInstanceId, subtitle);
  94. }
  95. }
  96. void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
  97. for (Modal modal : stack) {
  98. modal.setTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarButtons);
  99. }
  100. }
  101. void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButton) {
  102. for (Modal modal : stack) {
  103. modal.setTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButton);
  104. }
  105. }
  106. void setFab(String screenInstanceId, String navigatorEventId, FabParams fab) {
  107. for (Modal modal : stack) {
  108. modal.setFab(screenInstanceId, navigatorEventId, fab);
  109. }
  110. }
  111. void updateScreenStyle(String screenInstanceId, Bundle styleParams) {
  112. for (Modal modal : stack) {
  113. modal.updateScreenStyle(screenInstanceId, styleParams);
  114. }
  115. }
  116. public void showContextualMenu(String screenInstanceId, ContextualMenuParams params, Callback onButtonClicked) {
  117. for (Modal modal : stack) {
  118. modal.showContextualMenu(screenInstanceId, params, onButtonClicked);
  119. }
  120. }
  121. public void dismissContextualMenu(String screenInstanceId) {
  122. for (Modal modal : stack) {
  123. modal.dismissContextualMenu(screenInstanceId);
  124. }
  125. }
  126. @Override
  127. public boolean onTitleBarBackButtonClick() {
  128. // Do nothing and let the layout handle the back button click
  129. return false;
  130. }
  131. @Override
  132. public void onSideMenuButtonClick() {
  133. // Do nothing and let the layout handle the click
  134. }
  135. void showSlidingOverlay(SlidingOverlayParams params) {
  136. stack.peek().showSlidingOverlay(params);
  137. }
  138. void hideSlidingOverlay() {
  139. stack.peek().hideSlidingOverlay();
  140. }
  141. Window getWindow() {
  142. return stack.peek().getWindow();
  143. }
  144. void selectTopTabByTabIndex(String screenInstanceId, int index) {
  145. for (Modal modal : stack) {
  146. modal.selectTopTabByTabIndex(screenInstanceId, index);
  147. }
  148. }
  149. void selectTopTabByScreen(String screenInstanceId) {
  150. for (Modal modal : stack) {
  151. modal.selectTopTabByScreen(screenInstanceId);
  152. }
  153. }
  154. }