react-native-navigation的迁移库

NavigationModule.java 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package com.reactnativenavigation.react;
  2. import com.facebook.react.ReactInstanceManager;
  3. import com.facebook.react.bridge.Arguments;
  4. import com.facebook.react.bridge.Promise;
  5. import com.facebook.react.bridge.ReactApplicationContext;
  6. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  7. import com.facebook.react.bridge.ReactMethod;
  8. import com.facebook.react.bridge.ReadableArray;
  9. import com.facebook.react.bridge.ReadableMap;
  10. import com.facebook.react.bridge.WritableMap;
  11. import com.reactnativenavigation.NavigationActivity;
  12. import com.reactnativenavigation.NavigationApplication;
  13. import com.reactnativenavigation.parse.LayoutFactory;
  14. import com.reactnativenavigation.parse.LayoutNode;
  15. import com.reactnativenavigation.parse.Options;
  16. import com.reactnativenavigation.parse.parsers.JSONParser;
  17. import com.reactnativenavigation.parse.parsers.LayoutNodeParser;
  18. import com.reactnativenavigation.react.events.EventEmitter;
  19. import com.reactnativenavigation.utils.LaunchArgsParser;
  20. import com.reactnativenavigation.utils.NativeCommandListener;
  21. import com.reactnativenavigation.utils.Now;
  22. import com.reactnativenavigation.utils.StatusBarUtils;
  23. import com.reactnativenavigation.utils.TypefaceLoader;
  24. import com.reactnativenavigation.utils.UiThread;
  25. import com.reactnativenavigation.utils.UiUtils;
  26. import com.reactnativenavigation.viewcontrollers.ViewController;
  27. import com.reactnativenavigation.viewcontrollers.navigator.Navigator;
  28. import java.util.ArrayList;
  29. import androidx.annotation.NonNull;
  30. import androidx.annotation.Nullable;
  31. import static com.reactnativenavigation.utils.UiUtils.pxToDp;
  32. public class NavigationModule extends ReactContextBaseJavaModule {
  33. private static final String NAME = "RNNBridgeModule";
  34. private final Now now = new Now();
  35. private final ReactInstanceManager reactInstanceManager;
  36. private final JSONParser jsonParser;
  37. private final LayoutFactory layoutFactory;
  38. private EventEmitter eventEmitter;
  39. @SuppressWarnings("WeakerAccess")
  40. public NavigationModule(ReactApplicationContext reactContext, ReactInstanceManager reactInstanceManager, LayoutFactory layoutFactory) {
  41. this(reactContext, reactInstanceManager, new JSONParser(), layoutFactory);
  42. }
  43. public NavigationModule(ReactApplicationContext reactContext, ReactInstanceManager reactInstanceManager, JSONParser jsonParser, LayoutFactory layoutFactory) {
  44. super(reactContext);
  45. this.reactInstanceManager = reactInstanceManager;
  46. this.jsonParser = jsonParser;
  47. this.layoutFactory = layoutFactory;
  48. reactContext.addLifecycleEventListener(new LifecycleEventListenerAdapter() {
  49. @Override
  50. public void onHostResume() {
  51. eventEmitter = new EventEmitter(reactContext);
  52. navigator().setEventEmitter(eventEmitter);
  53. layoutFactory.init(
  54. activity(),
  55. eventEmitter,
  56. navigator().getChildRegistry(),
  57. ((NavigationApplication) activity().getApplication()).getExternalComponents()
  58. );
  59. }
  60. });
  61. }
  62. @NonNull
  63. @Override
  64. public String getName() {
  65. return NAME;
  66. }
  67. @ReactMethod
  68. public void getLaunchArgs(String commandId, Promise promise) {
  69. promise.resolve(LaunchArgsParser.parse(activity()));
  70. }
  71. @ReactMethod
  72. public void getNavigationConstants(Promise promise) {
  73. ReactApplicationContext ctx = getReactApplicationContext();
  74. WritableMap constants = Arguments.createMap();
  75. constants.putString(Constants.BACK_BUTTON_JS_KEY, Constants.BACK_BUTTON_ID);
  76. constants.putDouble(Constants.BOTTOM_TABS_HEIGHT_KEY, Constants.BOTTOM_TABS_HEIGHT);
  77. constants.putDouble(Constants.STATUS_BAR_HEIGHT_KEY, pxToDp(ctx, StatusBarUtils.getStatusBarHeight(ctx)));
  78. constants.putDouble(Constants.TOP_BAR_HEIGHT_KEY, pxToDp(ctx, UiUtils.getTopBarHeight(ctx)));
  79. promise.resolve(constants);
  80. }
  81. @ReactMethod
  82. public void setRoot(String commandId, ReadableMap rawLayoutTree, Promise promise) {
  83. final LayoutNode layoutTree = LayoutNodeParser.parse(jsonParser.parse(rawLayoutTree).optJSONObject("root"));
  84. handle(() -> {
  85. final ViewController viewController = layoutFactory.create(layoutTree);
  86. navigator().setRoot(viewController, new NativeCommandListener("setRoot", commandId, promise, eventEmitter, now), reactInstanceManager);
  87. });
  88. }
  89. @ReactMethod
  90. public void setDefaultOptions(ReadableMap options) {
  91. handle(() -> {
  92. Options defaultOptions = parse(options);
  93. layoutFactory.setDefaultOptions(defaultOptions);
  94. navigator().setDefaultOptions(defaultOptions);
  95. });
  96. }
  97. @ReactMethod
  98. public void mergeOptions(String onComponentId, @Nullable ReadableMap options) {
  99. handle(() -> navigator().mergeOptions(onComponentId, parse(options)));
  100. }
  101. @ReactMethod
  102. public void push(String commandId, String onComponentId, ReadableMap rawLayoutTree, Promise promise) {
  103. final LayoutNode layoutTree = LayoutNodeParser.parse(jsonParser.parse(rawLayoutTree));
  104. handle(() -> {
  105. final ViewController viewController = layoutFactory.create(layoutTree);
  106. navigator().push(onComponentId, viewController, new NativeCommandListener("push", commandId, promise, eventEmitter, now));
  107. });
  108. }
  109. @ReactMethod
  110. public void setStackRoot(String commandId, String onComponentId, ReadableArray children, Promise promise) {
  111. handle(() -> {
  112. ArrayList<ViewController> _children = new ArrayList<>();
  113. for (int i = 0; i < children.size(); i++) {
  114. final LayoutNode layoutTree = LayoutNodeParser.parse(jsonParser.parse(children.getMap(i)));
  115. _children.add(layoutFactory.create(layoutTree));
  116. }
  117. navigator().setStackRoot(onComponentId, _children, new NativeCommandListener("setStackRoot", commandId, promise, eventEmitter, now));
  118. });
  119. }
  120. @ReactMethod
  121. public void pop(String commandId, String componentId, @Nullable ReadableMap mergeOptions, Promise promise) {
  122. handle(() -> navigator().pop(componentId, parse(mergeOptions), new NativeCommandListener("pop", commandId, promise, eventEmitter, now)));
  123. }
  124. @ReactMethod
  125. public void popTo(String commandId, String componentId, @Nullable ReadableMap mergeOptions, Promise promise) {
  126. handle(() -> navigator().popTo(componentId, parse(mergeOptions), new NativeCommandListener("popTo", commandId, promise, eventEmitter, now)));
  127. }
  128. @ReactMethod
  129. public void popToRoot(String commandId, String componentId, @Nullable ReadableMap mergeOptions, Promise promise) {
  130. handle(() -> navigator().popToRoot(componentId, parse(mergeOptions), new NativeCommandListener("popToRoot", commandId, promise, eventEmitter, now)));
  131. }
  132. @ReactMethod
  133. public void showModal(String commandId, ReadableMap rawLayoutTree, Promise promise) {
  134. final LayoutNode layoutTree = LayoutNodeParser.parse(jsonParser.parse(rawLayoutTree));
  135. handle(() -> {
  136. final ViewController viewController = layoutFactory.create(layoutTree);
  137. navigator().showModal(viewController, new NativeCommandListener("showModal", commandId, promise, eventEmitter, now));
  138. });
  139. }
  140. @ReactMethod
  141. public void dismissModal(String commandId, String componentId, @Nullable ReadableMap mergeOptions, Promise promise) {
  142. handle(() -> {
  143. navigator().mergeOptions(componentId, parse(mergeOptions));
  144. navigator().dismissModal(componentId, new NativeCommandListener("dismissModal", commandId, promise, eventEmitter, now));
  145. });
  146. }
  147. @ReactMethod
  148. public void dismissAllModals(String commandId, @Nullable ReadableMap mergeOptions, Promise promise) {
  149. handle(() -> navigator().dismissAllModals(parse(mergeOptions), new NativeCommandListener("dismissAllModals", commandId, promise, eventEmitter, now)));
  150. }
  151. @ReactMethod
  152. public void showOverlay(String commandId, ReadableMap rawLayoutTree, Promise promise) {
  153. final LayoutNode layoutTree = LayoutNodeParser.parse(jsonParser.parse(rawLayoutTree));
  154. handle(() -> {
  155. final ViewController viewController = layoutFactory.create(layoutTree);
  156. navigator().showOverlay(viewController, new NativeCommandListener("showOverlay", commandId, promise, eventEmitter, now));
  157. });
  158. }
  159. @ReactMethod
  160. public void dismissOverlay(String commandId, String componentId, Promise promise) {
  161. handle(() -> navigator().dismissOverlay(componentId, new NativeCommandListener("dismissOverlay", commandId, promise, eventEmitter, now)));
  162. }
  163. private Navigator navigator() {
  164. return activity().getNavigator();
  165. }
  166. private Options parse(@Nullable ReadableMap mergeOptions) {
  167. return mergeOptions ==
  168. null ? Options.EMPTY : Options.parse(new TypefaceLoader(activity()), jsonParser.parse(mergeOptions));
  169. }
  170. protected void handle(Runnable task) {
  171. UiThread.post(() -> {
  172. if (getCurrentActivity() != null && !activity().isFinishing()) {
  173. task.run();
  174. }
  175. });
  176. }
  177. protected NavigationActivity activity() {
  178. return (NavigationActivity) getCurrentActivity();
  179. }
  180. @Override
  181. public void onCatalystInstanceDestroy() {
  182. final NavigationActivity navigationActivity = activity();
  183. if (navigationActivity != null) {
  184. navigationActivity.onCatalystInstanceDestroy();
  185. }
  186. super.onCatalystInstanceDestroy();
  187. }
  188. }