react-native-navigation的迁移库

LayoutFactory.java 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.reactnativenavigation.parse;
  2. import android.app.Activity;
  3. import com.facebook.react.ReactInstanceManager;
  4. import com.reactnativenavigation.presentation.BottomTabOptionsPresenter;
  5. import com.reactnativenavigation.presentation.BottomTabsOptionsPresenter;
  6. import com.reactnativenavigation.presentation.OptionsPresenter;
  7. import com.reactnativenavigation.presentation.StackOptionsPresenter;
  8. import com.reactnativenavigation.react.EventEmitter;
  9. import com.reactnativenavigation.utils.ImageLoader;
  10. import com.reactnativenavigation.utils.TypefaceLoader;
  11. import com.reactnativenavigation.viewcontrollers.ChildControllersRegistry;
  12. import com.reactnativenavigation.viewcontrollers.ComponentViewController;
  13. import com.reactnativenavigation.viewcontrollers.SideMenuController;
  14. import com.reactnativenavigation.viewcontrollers.ViewController;
  15. import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabsController;
  16. import com.reactnativenavigation.viewcontrollers.externalcomponent.ExternalComponentCreator;
  17. import com.reactnativenavigation.viewcontrollers.externalcomponent.ExternalComponentViewController;
  18. import com.reactnativenavigation.viewcontrollers.stack.StackControllerBuilder;
  19. import com.reactnativenavigation.viewcontrollers.topbar.TopBarBackgroundViewController;
  20. import com.reactnativenavigation.viewcontrollers.topbar.TopBarController;
  21. import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsController;
  22. import com.reactnativenavigation.views.ComponentViewCreator;
  23. import com.reactnativenavigation.views.titlebar.TitleBarButtonCreator;
  24. import com.reactnativenavigation.views.titlebar.TitleBarReactViewCreator;
  25. import com.reactnativenavigation.views.topbar.TopBarBackgroundViewCreator;
  26. import com.reactnativenavigation.views.toptabs.TopTabsLayoutCreator;
  27. import java.util.ArrayList;
  28. import java.util.List;
  29. import java.util.Map;
  30. import static com.reactnativenavigation.parse.Options.parse;
  31. public class LayoutFactory {
  32. private final Activity activity;
  33. private final ChildControllersRegistry childRegistry;
  34. private final ReactInstanceManager reactInstanceManager;
  35. private EventEmitter eventEmitter;
  36. private Map<String, ExternalComponentCreator> externalComponentCreators;
  37. private Options defaultOptions;
  38. private final TypefaceLoader typefaceManager;
  39. public LayoutFactory(Activity activity, ChildControllersRegistry childRegistry, final ReactInstanceManager reactInstanceManager, EventEmitter eventEmitter, Map<String, ExternalComponentCreator> externalComponentCreators, Options defaultOptions) {
  40. this.activity = activity;
  41. this.childRegistry = childRegistry;
  42. this.reactInstanceManager = reactInstanceManager;
  43. this.eventEmitter = eventEmitter;
  44. this.externalComponentCreators = externalComponentCreators;
  45. this.defaultOptions = defaultOptions;
  46. typefaceManager = new TypefaceLoader(activity);
  47. }
  48. public ViewController create(final LayoutNode node) {
  49. switch (node.type) {
  50. case Component:
  51. return createComponent(node);
  52. case ExternalComponent:
  53. return createExternalComponent(node);
  54. case Stack:
  55. return createStack(node);
  56. case BottomTabs:
  57. return createBottomTabs(node);
  58. case SideMenuRoot:
  59. return createSideMenuRoot(node);
  60. case SideMenuCenter:
  61. return createSideMenuContent(node);
  62. case SideMenuLeft:
  63. return createSideMenuLeft(node);
  64. case SideMenuRight:
  65. return createSideMenuRight(node);
  66. case TopTabs:
  67. return createTopTabs(node);
  68. default:
  69. throw new IllegalArgumentException("Invalid node type: " + node.type);
  70. }
  71. }
  72. private ViewController createSideMenuRoot(LayoutNode node) {
  73. SideMenuController sideMenuController = new SideMenuController(activity,
  74. childRegistry,
  75. node.id,
  76. parse(typefaceManager, node.getOptions()),
  77. new OptionsPresenter(activity, defaultOptions)
  78. );
  79. ViewController childControllerCenter = null, childControllerLeft = null, childControllerRight = null;
  80. for (LayoutNode child : node.children) {
  81. switch (child.type) {
  82. case SideMenuCenter:
  83. childControllerCenter = create(child);
  84. childControllerCenter.setParentController(sideMenuController);
  85. break;
  86. case SideMenuLeft:
  87. childControllerLeft = create(child);
  88. childControllerLeft.setParentController(sideMenuController);
  89. break;
  90. case SideMenuRight:
  91. childControllerRight = create(child);
  92. childControllerRight.setParentController(sideMenuController);
  93. break;
  94. default:
  95. throw new IllegalArgumentException("Invalid node type in sideMenu: " + node.type);
  96. }
  97. }
  98. if (childControllerCenter != null) {
  99. sideMenuController.setCenterController(childControllerCenter);
  100. }
  101. if (childControllerLeft != null) {
  102. sideMenuController.setLeftController(childControllerLeft);
  103. }
  104. if (childControllerRight != null) {
  105. sideMenuController.setRightController(childControllerRight);
  106. }
  107. return sideMenuController;
  108. }
  109. private ViewController createSideMenuContent(LayoutNode node) {
  110. return create(node.children.get(0));
  111. }
  112. private ViewController createSideMenuLeft(LayoutNode node) {
  113. return create(node.children.get(0));
  114. }
  115. private ViewController createSideMenuRight(LayoutNode node) {
  116. return create(node.children.get(0));
  117. }
  118. private ViewController createComponent(LayoutNode node) {
  119. String id = node.id;
  120. String name = node.data.optString("name");
  121. return new ComponentViewController(activity,
  122. childRegistry,
  123. id,
  124. name,
  125. new ComponentViewCreator(reactInstanceManager),
  126. parse(typefaceManager, node.getOptions()),
  127. new OptionsPresenter(activity, defaultOptions)
  128. );
  129. }
  130. private ViewController createExternalComponent(LayoutNode node) {
  131. final ExternalComponent externalComponent = ExternalComponent.parse(node.data);
  132. return new ExternalComponentViewController(activity,
  133. node.id,
  134. externalComponent,
  135. externalComponentCreators.get(externalComponent.name.get()),
  136. reactInstanceManager,
  137. parse(typefaceManager, node.getOptions())
  138. );
  139. }
  140. private ViewController createStack(LayoutNode node) {
  141. return new StackControllerBuilder(activity)
  142. .setChildren(createChildren(node.children))
  143. .setChildRegistry(childRegistry)
  144. .setTopBarButtonCreator(new TitleBarButtonCreator(reactInstanceManager))
  145. .setTitleBarReactViewCreator(new TitleBarReactViewCreator(reactInstanceManager))
  146. .setTopBarBackgroundViewController(new TopBarBackgroundViewController(activity, new TopBarBackgroundViewCreator(reactInstanceManager)))
  147. .setTopBarController(new TopBarController())
  148. .setId(node.id)
  149. .setInitialOptions(parse(typefaceManager, node.getOptions()))
  150. .setOptionsPresenter(new OptionsPresenter(activity, defaultOptions))
  151. .setStackPresenter(new StackOptionsPresenter(activity, defaultOptions))
  152. .build();
  153. }
  154. private List<ViewController> createChildren(List<LayoutNode> children) {
  155. List<ViewController> result = new ArrayList<>();
  156. for (LayoutNode child : children) {
  157. result.add(create(child));
  158. }
  159. return result;
  160. }
  161. private ViewController createBottomTabs(LayoutNode node) {
  162. List<ViewController> tabs = new ArrayList<>();
  163. for (int i = 0; i < node.children.size(); i++) {
  164. tabs.add(create(node.children.get(i)));
  165. }
  166. return new BottomTabsController(activity,
  167. tabs,
  168. childRegistry,
  169. eventEmitter,
  170. new ImageLoader(),
  171. node.id,
  172. parse(typefaceManager, node.getOptions()),
  173. new OptionsPresenter(activity, defaultOptions),
  174. new BottomTabsOptionsPresenter(tabs, defaultOptions),
  175. new BottomTabOptionsPresenter(activity, tabs, defaultOptions));
  176. }
  177. private ViewController createTopTabs(LayoutNode node) {
  178. final List<ViewController> tabs = new ArrayList<>();
  179. for (int i = 0; i < node.children.size(); i++) {
  180. ViewController tabController = create(node.children.get(i));
  181. Options options = parse(typefaceManager, node.children.get(i).getOptions());
  182. options.setTopTabIndex(i);
  183. tabs.add(tabController);
  184. }
  185. return new TopTabsController(activity, childRegistry, node.id, tabs, new TopTabsLayoutCreator(activity, tabs), parse(typefaceManager, node.getOptions()), new OptionsPresenter(activity, defaultOptions));
  186. }
  187. }