react-native-navigation的迁移库

SingleScreenLayout.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package com.reactnativenavigation.layouts;
  2. import android.os.Bundle;
  3. import android.support.annotation.Nullable;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.view.View;
  6. import android.widget.RelativeLayout;
  7. import com.facebook.react.bridge.Callback;
  8. import com.facebook.react.bridge.Promise;
  9. import com.reactnativenavigation.NavigationApplication;
  10. import com.reactnativenavigation.events.EventBus;
  11. import com.reactnativenavigation.events.ScreenChangedEvent;
  12. import com.reactnativenavigation.params.ContextualMenuParams;
  13. import com.reactnativenavigation.params.FabParams;
  14. import com.reactnativenavigation.params.LightBoxParams;
  15. import com.reactnativenavigation.params.ScreenParams;
  16. import com.reactnativenavigation.params.SideMenuParams;
  17. import com.reactnativenavigation.params.SlidingOverlayParams;
  18. import com.reactnativenavigation.params.SnackbarParams;
  19. import com.reactnativenavigation.params.TitleBarButtonParams;
  20. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  21. import com.reactnativenavigation.screens.NavigationType;
  22. import com.reactnativenavigation.screens.Screen;
  23. import com.reactnativenavigation.screens.ScreenStack;
  24. import com.reactnativenavigation.views.LeftButtonOnClickListener;
  25. import com.reactnativenavigation.views.LightBox;
  26. import com.reactnativenavigation.views.SideMenu;
  27. import com.reactnativenavigation.views.SideMenu.Side;
  28. import com.reactnativenavigation.views.SnackbarAndFabContainer;
  29. import com.reactnativenavigation.views.slidingOverlay.SlidingOverlay;
  30. import com.reactnativenavigation.views.slidingOverlay.SlidingOverlaysQueue;
  31. import java.util.List;
  32. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  33. public class SingleScreenLayout extends BaseLayout {
  34. protected final ScreenParams screenParams;
  35. private final SideMenuParams leftSideMenuParams;
  36. private final SideMenuParams rightSideMenuParams;
  37. protected ScreenStack stack;
  38. private SnackbarAndFabContainer snackbarAndFabContainer;
  39. protected LeftButtonOnClickListener leftButtonOnClickListener;
  40. private @Nullable SideMenu sideMenu;
  41. private final SlidingOverlaysQueue slidingOverlaysQueue = new SlidingOverlaysQueue();
  42. private LightBox lightBox;
  43. public SingleScreenLayout(AppCompatActivity activity, SideMenuParams leftSideMenuParams,
  44. SideMenuParams rightSideMenuParams, ScreenParams screenParams) {
  45. super(activity);
  46. this.screenParams = screenParams;
  47. this.leftSideMenuParams = leftSideMenuParams;
  48. this.rightSideMenuParams = rightSideMenuParams;
  49. createLayout();
  50. }
  51. private void createLayout() {
  52. if (leftSideMenuParams == null && rightSideMenuParams == null) {
  53. createStack(getScreenStackParent());
  54. } else {
  55. sideMenu = createSideMenu();
  56. createStack(getScreenStackParent());
  57. }
  58. createFabAndSnackbarContainer();
  59. sendScreenChangedEventAfterInitialPush();
  60. }
  61. private RelativeLayout getScreenStackParent() {
  62. return sideMenu == null ? this : sideMenu.getContentContainer();
  63. }
  64. private SideMenu createSideMenu() {
  65. SideMenu sideMenu = new SideMenu(getContext(), leftSideMenuParams, rightSideMenuParams);
  66. RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  67. addView(sideMenu, lp);
  68. return sideMenu;
  69. }
  70. private void createStack(RelativeLayout parent) {
  71. if (stack != null) {
  72. stack.destroy();
  73. }
  74. stack = new ScreenStack(getActivity(), parent, screenParams.getNavigatorId(), this);
  75. LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  76. pushInitialScreen(lp);
  77. pushAdditionalScreens(lp);
  78. }
  79. protected void pushInitialScreen(LayoutParams lp) {
  80. stack.pushInitialScreen(screenParams, lp);
  81. }
  82. protected void pushAdditionalScreens(LayoutParams lp) {
  83. for (ScreenParams screen : screenParams.screens) {
  84. stack.pushInitialScreen(screen, lp);
  85. }
  86. stack.show(NavigationType.Push);
  87. }
  88. private void sendScreenChangedEventAfterInitialPush() {
  89. if (screenParams.topTabParams != null) {
  90. EventBus.instance.post(new ScreenChangedEvent(screenParams.topTabParams.get(0)));
  91. } else {
  92. EventBus.instance.post(new ScreenChangedEvent(screenParams));
  93. }
  94. }
  95. private void createFabAndSnackbarContainer() {
  96. snackbarAndFabContainer = new SnackbarAndFabContainer(getContext(), this);
  97. RelativeLayout.LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
  98. lp.addRule(ALIGN_PARENT_BOTTOM);
  99. snackbarAndFabContainer.setLayoutParams(lp);
  100. getScreenStackParent().addView(snackbarAndFabContainer);
  101. }
  102. @Override
  103. public boolean onBackPressed() {
  104. if (handleBackInJs()) {
  105. return true;
  106. }
  107. if (stack.canPop()) {
  108. stack.pop(true, System.currentTimeMillis());
  109. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  110. return true;
  111. } else {
  112. return false;
  113. }
  114. }
  115. @Override
  116. public boolean handleBackInJs() {
  117. return stack.handleBackPressInJs();
  118. }
  119. @Override
  120. public void destroy() {
  121. stack.destroy();
  122. snackbarAndFabContainer.destroy();
  123. if (sideMenu != null) {
  124. sideMenu.destroy();
  125. }
  126. if (sideMenu != null) {
  127. sideMenu.destroy();
  128. }
  129. if (lightBox != null) {
  130. lightBox.destroy();
  131. }
  132. slidingOverlaysQueue.destroy();
  133. }
  134. @Override
  135. public void push(ScreenParams params, Promise onPushComplete) {
  136. stack.push(params, new LayoutParams(MATCH_PARENT, MATCH_PARENT), onPushComplete);
  137. EventBus.instance.post(new ScreenChangedEvent(params));
  138. }
  139. @Override
  140. public void pop(ScreenParams params) {
  141. stack.pop(params.animateScreenTransitions, params.timestamp, new ScreenStack.OnScreenPop() {
  142. @Override
  143. public void onScreenPopAnimationEnd() {
  144. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  145. }
  146. });
  147. }
  148. @Override
  149. public void popToRoot(ScreenParams params) {
  150. stack.popToRoot(params.animateScreenTransitions, params.timestamp, new ScreenStack.OnScreenPop() {
  151. @Override
  152. public void onScreenPopAnimationEnd() {
  153. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  154. }
  155. });
  156. }
  157. @Override
  158. public void newStack(final ScreenParams params) {
  159. stack.newStack(params, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
  160. EventBus.instance.post(new ScreenChangedEvent(params));
  161. }
  162. @Override
  163. public void setTopBarVisible(String screenInstanceID, boolean visible, boolean animate) {
  164. stack.setScreenTopBarVisible(screenInstanceID, visible, animate);
  165. }
  166. @Override
  167. public void setTitleBarTitle(String screenInstanceId, String title) {
  168. stack.setScreenTitleBarTitle(screenInstanceId, title);
  169. }
  170. @Override
  171. public void setTitleBarSubtitle(String screenInstanceId, String subtitle) {
  172. stack.setScreenTitleBarSubtitle(screenInstanceId, subtitle);
  173. }
  174. @Override
  175. public View asView() {
  176. return this;
  177. }
  178. @Override
  179. public void setTitleBarRightButtons(String screenInstanceId, String navigatorEventId,
  180. List<TitleBarButtonParams> titleBarRightButtons) {
  181. stack.setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, titleBarRightButtons);
  182. }
  183. @Override
  184. public void setTitleBarLeftButton(String screenInstanceId, String navigatorEventId, TitleBarLeftButtonParams titleBarLeftButtonParams) {
  185. stack.setScreenTitleBarLeftButton(screenInstanceId, navigatorEventId, titleBarLeftButtonParams);
  186. }
  187. @Override
  188. public void setFab(String screenInstanceId, String navigatorEventId, FabParams fabParams) {
  189. stack.setFab(screenInstanceId, fabParams);
  190. }
  191. @Override
  192. public void toggleSideMenuVisible(boolean animated, Side side) {
  193. if (sideMenu != null) {
  194. sideMenu.toggleVisible(animated, side);
  195. }
  196. }
  197. @Override
  198. public void setSideMenuVisible(boolean animated, boolean visible, Side side) {
  199. if (sideMenu != null) {
  200. sideMenu.setVisible(visible, animated, side);
  201. }
  202. }
  203. @Override
  204. public void setSideMenuEnabled(boolean enabled, Side side) {
  205. if (sideMenu != null) {
  206. sideMenu.setEnabled(enabled, side);
  207. }
  208. }
  209. @Override
  210. public void showSnackbar(SnackbarParams params) {
  211. final String navigatorEventId = stack.peek().getNavigatorEventId();
  212. snackbarAndFabContainer.showSnackbar(navigatorEventId, params);
  213. }
  214. @Override
  215. public void dismissSnackbar() {
  216. snackbarAndFabContainer.dismissSnackbar();
  217. }
  218. @Override
  219. public void showLightBox(LightBoxParams params) {
  220. if (lightBox == null) {
  221. lightBox = new LightBox(getActivity(), new Runnable() {
  222. @Override
  223. public void run() {
  224. lightBox = null;
  225. }
  226. }, params);
  227. lightBox.show();
  228. }
  229. }
  230. @Override
  231. public void dismissLightBox() {
  232. if (lightBox != null) {
  233. lightBox.hide();
  234. lightBox = null;
  235. }
  236. }
  237. @Override
  238. public void selectTopTabByTabIndex(String screenInstanceId, int index) {
  239. stack.selectTopTabByTabIndex(screenInstanceId, index);
  240. }
  241. @Override
  242. public void selectTopTabByScreen(String screenInstanceId) {
  243. stack.selectTopTabByScreen(screenInstanceId);
  244. }
  245. @Override
  246. public void updateScreenStyle(String screenInstanceId, Bundle styleParams) {
  247. stack.updateScreenStyle(screenInstanceId, styleParams);
  248. }
  249. @Override
  250. public String getCurrentlyVisibleScreenId() {
  251. return stack.peek().getScreenInstanceId();
  252. }
  253. @Override
  254. public void showSlidingOverlay(final SlidingOverlayParams params) {
  255. slidingOverlaysQueue.add(new SlidingOverlay(this, params));
  256. }
  257. @Override
  258. public void hideSlidingOverlay() {
  259. slidingOverlaysQueue.remove();
  260. }
  261. @Override
  262. public void onModalDismissed() {
  263. stack.peek().setStyle();
  264. stack.peek().getScreenParams().timestamp = System.currentTimeMillis();
  265. NavigationApplication.instance.getEventEmitter().sendWillAppearEvent(stack.peek().getScreenParams(), NavigationType.DismissModal);
  266. NavigationApplication.instance.getEventEmitter().sendDidAppearEvent(stack.peek().getScreenParams(), NavigationType.DismissModal);
  267. EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
  268. }
  269. @Override
  270. public boolean containsNavigator(String navigatorId) {
  271. return stack.getNavigatorId().equals(navigatorId);
  272. }
  273. @Override
  274. public void showContextualMenu(String screenInstanceId, ContextualMenuParams params, Callback onButtonClicked) {
  275. stack.showContextualMenu(screenInstanceId, params, onButtonClicked);
  276. }
  277. @Override
  278. public void dismissContextualMenu(String screenInstanceId) {
  279. stack.dismissContextualMenu(screenInstanceId);
  280. }
  281. @Override
  282. public Screen getCurrentScreen() {
  283. return stack.peek();
  284. }
  285. @Override
  286. public boolean onTitleBarBackButtonClick() {
  287. if (leftButtonOnClickListener != null) {
  288. return leftButtonOnClickListener.onTitleBarBackButtonClick();
  289. }
  290. return onBackPressed();
  291. }
  292. @Override
  293. public void onSideMenuButtonClick() {
  294. final String navigatorEventId = stack.peek().getNavigatorEventId();
  295. NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("sideMenu", navigatorEventId);
  296. if (sideMenu != null) {
  297. sideMenu.openDrawer(Side.Left);
  298. }
  299. }
  300. }