react-native-navigation 7.23.1 → 7.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/.buildkite/pipeline.yml +51 -11
  2. package/.nvmrc +1 -0
  3. package/Mock.d.ts +1 -0
  4. package/Mock.js +4 -0
  5. package/Mock.ts +1 -1
  6. package/README.md +0 -1
  7. package/jest.config.js +40 -0
  8. package/lib/{src/Mock → Mock}/Application.tsx +0 -0
  9. package/lib/{src/Mock → Mock}/ComponentProps.tsx +0 -0
  10. package/lib/{src/Mock → Mock}/Components/BottomTabs.tsx +0 -0
  11. package/lib/{src/Mock → Mock}/Components/ComponentScreen.tsx +13 -2
  12. package/lib/{src/Mock → Mock}/Components/LayoutComponent.tsx +0 -0
  13. package/lib/{src/Mock → Mock}/Components/Modals.tsx +0 -0
  14. package/lib/{src/Mock → Mock}/Components/NavigationButton.tsx +1 -1
  15. package/lib/{src/Mock → Mock}/Components/Overlays.tsx +0 -0
  16. package/lib/{src/Mock → Mock}/Components/Stack.tsx +0 -0
  17. package/lib/{src/Mock → Mock}/Components/TopBar.tsx +2 -2
  18. package/lib/{src/Mock → Mock}/Layouts/BottomTabsNode.ts +1 -1
  19. package/lib/{src/Mock → Mock}/Layouts/ComponentNode.ts +1 -1
  20. package/lib/{src/Mock → Mock}/Layouts/LayoutNodeFactory.ts +0 -0
  21. package/lib/{src/Mock → Mock}/Layouts/Node.ts +1 -1
  22. package/lib/{src/Mock → Mock}/Layouts/ParentNode.ts +2 -2
  23. package/lib/{src/Mock → Mock}/Layouts/StackNode.ts +0 -0
  24. package/lib/{src/Mock → Mock}/Stores/EventsStore.ts +10 -2
  25. package/lib/{src/Mock → Mock}/Stores/LayoutStore.ts +3 -2
  26. package/lib/{src/Mock → Mock}/connect.ts +0 -0
  27. package/lib/Mock/constants.d.ts +2 -0
  28. package/lib/Mock/constants.js +5 -0
  29. package/lib/{src/Mock → Mock}/constants.ts +0 -0
  30. package/lib/Mock/index.d.ts +3 -0
  31. package/lib/Mock/index.js +14 -0
  32. package/lib/{src/Mock → Mock}/index.ts +0 -0
  33. package/lib/{src/Mock → Mock}/mocks/AppRegistryService.ts +0 -0
  34. package/lib/{src/Mock → Mock}/mocks/NativeCommandsSender.tsx +1 -1
  35. package/lib/{src/Mock → Mock}/mocks/NativeEventsReceiver.ts +7 -4
  36. package/lib/android/app/build.gradle +23 -21
  37. package/lib/android/app/src/main/java/com/reactnativenavigation/options/FontOptions.kt +2 -2
  38. package/lib/android/app/src/main/java/com/reactnativenavigation/options/HardwareBackButtonOptions.kt +35 -2
  39. package/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java +32 -17
  40. package/lib/android/app/src/main/java/com/reactnativenavigation/options/Options.java +1 -1
  41. package/lib/android/app/src/main/java/com/reactnativenavigation/options/parsers/TypefaceLoader.kt +16 -10
  42. package/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java +5 -2
  43. package/lib/android/app/src/main/java/com/reactnativenavigation/react/modal/ModalFrameLayout.kt +3 -3
  44. package/lib/android/app/src/main/java/com/reactnativenavigation/react/modal/ModalViewManager.kt +11 -8
  45. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt +168 -0
  46. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabPresenter.java +5 -2
  47. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java +42 -2
  48. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/child/ChildController.java +12 -16
  49. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java +19 -11
  50. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/externalcomponent/ExternalComponentViewController.java +2 -2
  51. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalPresenter.java +6 -4
  52. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManager.kt +8 -3
  53. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java +15 -7
  54. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java +127 -138
  55. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/TopBarController.kt +183 -22
  56. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonController.kt +25 -4
  57. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonPresenter.kt +9 -1
  58. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonSpan.kt +1 -1
  59. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/Presenter.java +52 -71
  60. package/lib/android/app/src/main/java/com/reactnativenavigation/views/component/ComponentLayout.java +2 -0
  61. package/lib/android/app/src/main/java/com/reactnativenavigation/views/element/animators/ReactImageMatrixAnimator.kt +2 -3
  62. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/TopBar.java +1 -2
  63. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/ButtonBar.kt +7 -12
  64. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleAndButtonsContainer.kt +0 -2
  65. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleSubTitleLayout.kt +0 -7
  66. package/lib/android/app/src/reactNative51/java/com/reactnativenavigation/react/NavigationReactNativeHost.java +2 -1
  67. package/lib/android/app/src/test/java/com/reactnativenavigation/BaseTest.java +7 -6
  68. package/lib/android/app/src/test/java/com/reactnativenavigation/TestActivity.java +5 -0
  69. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/ImageLoaderMock.kt +5 -4
  70. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/Mocks.kt +3 -2
  71. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TypefaceLoaderMock.kt +5 -1
  72. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TransitionAnimationOptionsTest.kt +2 -3
  73. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/PresenterTest.java +25 -10
  74. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/LayoutFactoryTest.java +25 -2
  75. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/MotionEventTest.kt +1 -1
  76. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/{TitleAndButtonsMeasurer.kt → TitleAndButtonsMeasurerTest.kt} +2 -2
  77. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiThreadTest.java +2 -2
  78. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiUtilsTest.java +1 -1
  79. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.kt +572 -0
  80. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsPresenterTest.kt +1 -1
  81. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllerTest.java +2 -1
  82. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewControllerTest.java +5 -5
  83. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/fakes/FakeParentController.kt +1 -1
  84. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorTest.kt +1 -1
  85. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalPresenterTest.java +7 -3
  86. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java +17 -4
  87. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/NavigatorTest.java +2 -2
  88. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/RootPresenterTest.kt +5 -5
  89. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManagerTest.java +1 -0
  90. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/parent/ParentControllerTest.java +4 -0
  91. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java +6 -2
  92. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackAnimatorTest.kt +1 -1
  93. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt +13 -8
  94. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt +58 -51
  95. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarControllerTest.kt +219 -41
  96. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewControllerTest.java +4 -1
  97. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt +2 -2
  98. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/BaseViewAnimatorTest.kt +4 -4
  99. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsContainerTest.kt +1 -1
  100. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsTest.kt +4 -4
  101. package/lib/dist/Mock/Application.js +2 -2
  102. package/lib/dist/Mock/Components/BottomTabs.js +2 -2
  103. package/lib/dist/Mock/Components/ComponentScreen.js +15 -5
  104. package/lib/dist/Mock/Components/LayoutComponent.js +3 -2
  105. package/lib/dist/Mock/Components/Modals.js +2 -2
  106. package/lib/dist/Mock/Components/NavigationButton.d.ts +1 -1
  107. package/lib/dist/Mock/Components/NavigationButton.js +8 -10
  108. package/lib/dist/Mock/Components/Overlays.js +2 -2
  109. package/lib/dist/Mock/Components/Stack.js +2 -2
  110. package/lib/dist/Mock/Components/TopBar.d.ts +2 -2
  111. package/lib/dist/Mock/Components/TopBar.js +7 -6
  112. package/lib/dist/Mock/Layouts/BottomTabsNode.d.ts +1 -1
  113. package/lib/dist/Mock/Layouts/BottomTabsNode.js +3 -3
  114. package/lib/dist/Mock/Layouts/ComponentNode.d.ts +1 -1
  115. package/lib/dist/Mock/Layouts/ComponentNode.js +4 -4
  116. package/lib/dist/Mock/Layouts/LayoutNodeFactory.js +3 -3
  117. package/lib/dist/Mock/Layouts/Node.d.ts +1 -1
  118. package/lib/dist/Mock/Layouts/Node.js +5 -0
  119. package/lib/dist/Mock/Layouts/ParentNode.d.ts +2 -2
  120. package/lib/dist/Mock/Layouts/ParentNode.js +4 -3
  121. package/lib/dist/Mock/Layouts/StackNode.js +1 -1
  122. package/lib/dist/Mock/Stores/EventsStore.d.ts +5 -2
  123. package/lib/dist/Mock/Stores/EventsStore.js +7 -0
  124. package/lib/dist/Mock/Stores/LayoutStore.js +6 -3
  125. package/lib/dist/Mock/connect.js +1 -1
  126. package/lib/dist/Mock/index.js +1 -1
  127. package/lib/dist/Mock/mocks/NativeCommandsSender.d.ts +1 -1
  128. package/lib/dist/Mock/mocks/NativeCommandsSender.js +2 -2
  129. package/lib/dist/Mock/mocks/NativeEventsReceiver.d.ts +3 -3
  130. package/lib/dist/Mock/mocks/NativeEventsReceiver.js +6 -3
  131. package/lib/dist/{Navigation.d.ts → src/Navigation.d.ts} +0 -0
  132. package/lib/dist/{Navigation.js → src/Navigation.js} +19 -3
  133. package/lib/dist/{NavigationDelegate.d.ts → src/NavigationDelegate.d.ts} +0 -0
  134. package/lib/dist/{NavigationDelegate.js → src/NavigationDelegate.js} +1 -0
  135. package/lib/dist/{adapters → src/adapters}/AppRegistryService.d.ts +0 -0
  136. package/lib/dist/{adapters → src/adapters}/AppRegistryService.js +0 -0
  137. package/lib/dist/{adapters → src/adapters}/AssetResolver.d.ts +0 -0
  138. package/lib/dist/{adapters → src/adapters}/AssetResolver.js +0 -0
  139. package/lib/dist/src/adapters/ColorService.d.ts +3 -0
  140. package/lib/dist/{adapters → src/adapters}/ColorService.js +1 -1
  141. package/lib/dist/{adapters → src/adapters}/Constants.d.ts +0 -0
  142. package/lib/dist/{adapters → src/adapters}/Constants.js +10 -6
  143. package/lib/dist/{adapters → src/adapters}/NativeCommandsSender.d.ts +0 -0
  144. package/lib/dist/{adapters → src/adapters}/NativeCommandsSender.js +1 -0
  145. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.d.ts +0 -0
  146. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.js +1 -0
  147. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.mock.d.ts +0 -0
  148. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.mock.js +0 -0
  149. package/lib/dist/{adapters → src/adapters}/TouchablePreview.d.ts +0 -0
  150. package/lib/dist/src/adapters/TouchablePreview.js +89 -0
  151. package/lib/dist/{adapters → src/adapters}/UniqueIdProvider.d.ts +0 -0
  152. package/lib/dist/{adapters → src/adapters}/UniqueIdProvider.js +2 -2
  153. package/lib/dist/{commands → src/commands}/Commands.d.ts +0 -0
  154. package/lib/dist/{commands → src/commands}/Commands.js +24 -10
  155. package/lib/dist/{commands → src/commands}/Deprecations.d.ts +0 -0
  156. package/lib/dist/src/commands/Deprecations.js +80 -0
  157. package/lib/dist/{commands → src/commands}/LayoutTreeCrawler.d.ts +0 -0
  158. package/lib/dist/{commands → src/commands}/LayoutTreeCrawler.js +4 -2
  159. package/lib/dist/{commands → src/commands}/LayoutTreeParser.d.ts +0 -0
  160. package/lib/dist/{commands → src/commands}/LayoutTreeParser.js +1 -0
  161. package/lib/dist/{commands → src/commands}/LayoutType.d.ts +0 -0
  162. package/lib/dist/{commands → src/commands}/LayoutType.js +0 -0
  163. package/lib/dist/{commands → src/commands}/OptionsCrawler.d.ts +0 -0
  164. package/lib/dist/{commands → src/commands}/OptionsCrawler.js +6 -4
  165. package/lib/dist/{commands → src/commands}/OptionsProcessor.d.ts +1 -1
  166. package/lib/dist/{commands → src/commands}/OptionsProcessor.js +50 -42
  167. package/lib/dist/{components → src/components}/ComponentRegistry.d.ts +0 -0
  168. package/lib/dist/{components → src/components}/ComponentRegistry.js +4 -0
  169. package/lib/dist/{components → src/components}/ComponentWrapper.d.ts +0 -0
  170. package/lib/dist/{components → src/components}/ComponentWrapper.js +17 -17
  171. package/lib/dist/{components → src/components}/Modal.d.ts +0 -0
  172. package/lib/dist/{components → src/components}/Modal.js +8 -8
  173. package/lib/dist/{components → src/components}/Store.d.ts +2 -0
  174. package/lib/dist/{components → src/components}/Store.js +13 -6
  175. package/lib/dist/{events → src/events}/CommandsObserver.d.ts +0 -0
  176. package/lib/dist/{events → src/events}/CommandsObserver.js +2 -1
  177. package/lib/dist/{events → src/events}/ComponentEventsObserver.d.ts +4 -2
  178. package/lib/dist/{events → src/events}/ComponentEventsObserver.js +16 -14
  179. package/lib/dist/{events → src/events}/EventsRegistry.d.ts +2 -2
  180. package/lib/dist/{events → src/events}/EventsRegistry.js +3 -0
  181. package/lib/dist/{index.d.ts → src/index.d.ts} +0 -0
  182. package/lib/dist/src/index.js +22 -0
  183. package/lib/dist/{interfaces → src/interfaces}/CommandName.d.ts +0 -0
  184. package/lib/dist/{interfaces → src/interfaces}/CommandName.js +0 -0
  185. package/lib/dist/{interfaces → src/interfaces}/ComponentEvents.d.ts +0 -0
  186. package/lib/dist/{interfaces → src/interfaces}/ComponentEvents.js +0 -0
  187. package/lib/dist/{interfaces → src/interfaces}/EventSubscription.d.ts +0 -0
  188. package/lib/dist/{interfaces → src/interfaces}/EventSubscription.js +0 -0
  189. package/lib/dist/{interfaces → src/interfaces}/Events.d.ts +0 -0
  190. package/lib/dist/{interfaces → src/interfaces}/Events.js +0 -0
  191. package/lib/dist/{interfaces → src/interfaces}/Layout.d.ts +0 -0
  192. package/lib/dist/{interfaces → src/interfaces}/Layout.js +0 -0
  193. package/lib/dist/{interfaces → src/interfaces}/NavigationComponent.d.ts +0 -0
  194. package/lib/dist/{interfaces → src/interfaces}/NavigationComponent.js +8 -1
  195. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentListener.d.ts +0 -0
  196. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentListener.js +0 -0
  197. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentProps.d.ts +0 -0
  198. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentProps.js +0 -0
  199. package/lib/dist/{interfaces → src/interfaces}/NavigationFunctionComponent.d.ts +0 -0
  200. package/lib/dist/{interfaces → src/interfaces}/NavigationFunctionComponent.js +0 -0
  201. package/lib/dist/{interfaces → src/interfaces}/Options.d.ts +9 -0
  202. package/lib/dist/{interfaces → src/interfaces}/Options.js +0 -0
  203. package/lib/dist/{interfaces → src/interfaces}/ProcessorSubscription.d.ts +0 -0
  204. package/lib/dist/{interfaces → src/interfaces}/ProcessorSubscription.js +0 -0
  205. package/lib/dist/{interfaces → src/interfaces}/Processors.d.ts +0 -0
  206. package/lib/dist/{interfaces → src/interfaces}/Processors.js +0 -0
  207. package/lib/dist/{processors → src/processors}/LayoutProcessor.d.ts +0 -0
  208. package/lib/dist/{processors → src/processors}/LayoutProcessor.js +1 -0
  209. package/lib/dist/{processors → src/processors}/LayoutProcessorsStore.d.ts +0 -0
  210. package/lib/dist/{processors → src/processors}/LayoutProcessorsStore.js +1 -3
  211. package/lib/dist/{processors → src/processors}/OptionProcessorsStore.d.ts +0 -0
  212. package/lib/dist/{processors → src/processors}/OptionProcessorsStore.js +1 -3
  213. package/lib/dist/{types.d.ts → src/types.d.ts} +0 -0
  214. package/lib/dist/{types.js → src/types.js} +0 -0
  215. package/lib/ios/AnimationObserver.h +17 -0
  216. package/lib/ios/AnimationObserver.m +41 -0
  217. package/lib/ios/BottomTabPresenter.h +0 -3
  218. package/lib/ios/BottomTabPresenter.m +0 -8
  219. package/lib/ios/RNNAssert.h +2 -2
  220. package/lib/ios/RNNBasePresenter.h +0 -4
  221. package/lib/ios/RNNBasePresenter.m +0 -12
  222. package/lib/ios/RNNBottomTabOptions.m +2 -1
  223. package/lib/ios/RNNBottomTabsController.m +8 -8
  224. package/lib/ios/RNNBridgeManager.mm +0 -1
  225. package/lib/ios/RNNButtonBuilder.m +2 -0
  226. package/lib/ios/RNNButtonOptions.h +1 -0
  227. package/lib/ios/RNNButtonOptions.m +4 -0
  228. package/lib/ios/RNNCommandsHandler.m +15 -8
  229. package/lib/ios/RNNComponentPresenter.m +0 -4
  230. package/lib/ios/RNNComponentViewController.m +2 -4
  231. package/lib/ios/RNNDotIndicatorPresenter.m +2 -1
  232. package/lib/ios/RNNExternalViewController.m +2 -4
  233. package/lib/ios/RNNModalManager.h +2 -1
  234. package/lib/ios/RNNModalManager.m +12 -21
  235. package/lib/ios/RNNSegmentedControl.h +1 -1
  236. package/lib/ios/RNNSideMenuChildVC.m +0 -4
  237. package/lib/ios/RNNSideMenuController.m +0 -4
  238. package/lib/ios/RNNSplitViewController.m +0 -4
  239. package/lib/ios/RNNStackController.m +0 -4
  240. package/lib/ios/RNNStackPresenter.m +3 -0
  241. package/lib/ios/RNNSwizzles.m +20 -0
  242. package/lib/ios/RNNTabBarItemCreator.m +3 -2
  243. package/lib/ios/RNNUIBarButtonItem.h +2 -0
  244. package/lib/ios/RNNUIBarButtonItem.m +17 -0
  245. package/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj +8 -0
  246. package/lib/ios/TopBarPresenter.m +8 -4
  247. package/lib/ios/UIViewController+RNNOptions.m +1 -1
  248. package/lib/src/commands/Commands.ts +6 -1
  249. package/lib/src/commands/LayoutTreeCrawler.ts +2 -2
  250. package/lib/src/commands/OptionsCrawler.ts +2 -1
  251. package/lib/src/commands/OptionsProcessor.ts +15 -13
  252. package/lib/src/components/Store.ts +9 -0
  253. package/lib/src/events/ComponentEventsObserver.ts +5 -1
  254. package/lib/src/events/EventsRegistry.ts +2 -1
  255. package/lib/src/interfaces/Options.ts +10 -0
  256. package/package.json +19 -60
  257. package/tsconfig.mocks.json +7 -0
  258. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/StatusBarUtils.java +0 -41
  259. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java +0 -511
  260. package/lib/dist/adapters/ColorService.d.ts +0 -3
  261. package/lib/dist/adapters/TouchablePreview.js +0 -91
  262. package/lib/dist/commands/Deprecations.js +0 -82
  263. package/lib/dist/index.js +0 -22
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-navigation",
3
- "version": "7.23.1",
3
+ "version": "7.24.0",
4
4
  "description": "React Native Navigation - truly native navigation for iOS and Android",
5
5
  "license": "MIT",
6
6
  "nativePackage": true,
@@ -19,8 +19,8 @@
19
19
  "bin": {
20
20
  "rnn-link": "./autolink/postlink/run.js"
21
21
  },
22
- "main": "lib/dist/index.js",
23
- "typings": "lib/dist/index.d.ts",
22
+ "main": "lib/dist/src/index.js",
23
+ "typings": "lib/dist/src/index.d.ts",
24
24
  "scripts": {
25
25
  "build": "node ./scripts/build",
26
26
  "watch": "node ./scripts/watch",
@@ -66,45 +66,46 @@
66
66
  "tslib": "1.9.3"
67
67
  },
68
68
  "devDependencies": {
69
- "@babel/core": "7.10.3",
70
69
  "@babel/plugin-proposal-export-default-from": "7.10.1",
71
70
  "@babel/plugin-proposal-export-namespace-from": "7.10.1",
72
- "@babel/types": "7.6.x",
71
+ "@babel/types": "7.15.6",
73
72
  "@react-native-community/blur": "^3.6.0",
74
73
  "@react-native-community/datetimepicker": "^3.4.7",
75
74
  "@react-native-community/eslint-config": "2.0.0",
76
75
  "@react-native-community/netinfo": "^5.9.4",
77
76
  "@testing-library/jest-native": "^4.0.1",
78
77
  "@testing-library/react-native": "^7.2.0",
79
- "@types/detox": "16.4.1",
78
+ "@types/detox": "17.14.3",
80
79
  "@types/hoist-non-react-statics": "^3.0.1",
81
80
  "@types/jasmine": "3.5.10",
82
- "@types/jest": "26.0.3",
81
+ "@types/jest": "27.0.2",
83
82
  "@types/lodash": "^4.14.149",
84
83
  "@types/react": "16.9.41",
85
84
  "@types/react-native": "0.63.1",
86
85
  "@types/react-test-renderer": "16.9.2",
87
- "@typescript-eslint/eslint-plugin": "3.3.0",
88
- "@typescript-eslint/parser": "3.3.0",
89
- "babel-jest": "26.1.0",
86
+ "@typescript-eslint/eslint-plugin": "4.33.0",
87
+ "@typescript-eslint/parser": "4.33.0",
88
+ "babel-jest": "^27.2.5",
90
89
  "clang-format": "^1.4.0",
91
- "detox": "18.19.0",
90
+ "detox": "18.23.1",
92
91
  "eslint": "7.3.0",
93
92
  "eslint-config-prettier": "6.11.0",
94
93
  "eslint-plugin-prettier": "3.1.4",
95
94
  "github-release-notes": "https://github.com/yogevbd/github-release-notes/tarball/e601b3dba72dcd6cba323c1286ea6dd0c0110b58",
96
95
  "husky": "4.2.5",
97
96
  "identity-obj-proxy": "3.0.0",
98
- "jest": "26.1.0",
99
- "jest-circus": "26.1.0",
97
+ "@babel/core": "7.15.8",
98
+ "@babel/runtime": "7.15.4",
99
+ "jest": "^27.2.5",
100
+ "jest-circus": "^27.2.5",
100
101
  "lint-staged": "10.2.11",
101
- "metro-react-native-babel-preset": "0.59.0",
102
+ "metro-react-native-babel-preset": "0.66.2",
102
103
  "prettier": "2.1.2",
103
- "react": "16.13.1",
104
- "react-native": "0.63.2",
104
+ "react": "17.0.2",
105
+ "react-native": "0.66.3",
105
106
  "react-native-fast-image": "^8.3.4",
106
107
  "react-native-gesture-handler": "^1.6.1",
107
- "react-native-reanimated": "^1.9.0",
108
+ "react-native-reanimated": "2.3.0-beta.2",
108
109
  "react-native-ui-lib": "5.11.0",
109
110
  "react-redux": "5.x.x",
110
111
  "react-test-renderer": "16.13.1",
@@ -113,52 +114,10 @@
113
114
  "shell-utils": "1.x.x",
114
115
  "ts-mockito": "^2.3.1",
115
116
  "typedoc": "0.x.x",
116
- "typescript": "3.9.5",
117
+ "typescript": "4.4.3",
117
118
  "detox-testing-library-rnn-adapter": "2.x.x",
118
119
  "remx": "3.x.x"
119
120
  },
120
- "jest": {
121
- "preset": "react-native",
122
- "transform": {
123
- "^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js"
124
- },
125
- "roots": [
126
- "<rootDir>/lib/src/",
127
- "<rootDir>/playground/src/",
128
- "<rootDir>/integration/",
129
- "<rootDir>/scripts/",
130
- "<rootDir>/e2e/"
131
- ],
132
- "setupFilesAfterEnv": [
133
- "./jest-setup.js"
134
- ],
135
- "moduleNameMapper": {
136
- "react-native-navigation/Mock": "<rootDir>/lib/src/Mock",
137
- "react-native-navigation": "<rootDir>/lib/src",
138
- "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/playground/img/layouts@2x.png"
139
- },
140
- "collectCoverageFrom": [
141
- "lib/src/**/*.ts",
142
- "lib/src/**/*.tsx",
143
- "integration/**/*.js",
144
- "!lib/dist/index.js",
145
- "!lib/dist/Navigation.js",
146
- "!lib/dist/adapters/**/*",
147
- "!lib/dist/interfaces/**/*",
148
- "!lib/dist/**/*.test.*",
149
- "!integration/**/*.test.*",
150
- "!integration/*.test.*",
151
- "!e2e/**/*test.js"
152
- ],
153
- "resetMocks": true,
154
- "resetModules": true,
155
- "coverageReporters": [
156
- "json",
157
- "lcov",
158
- "text",
159
- "html"
160
- ]
161
- },
162
121
  "husky": {
163
122
  "hooks": {
164
123
  "pre-commit": "lint-staged"
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "outDir": "./"
5
+ },
6
+ "include": ["Mock.ts"]
7
+ }
@@ -1,41 +0,0 @@
1
- package com.reactnativenavigation.utils;
2
-
3
- import android.content.Context;
4
- import android.content.res.Resources;
5
- import android.os.Build;
6
- import android.view.Window;
7
- import android.view.WindowManager;
8
-
9
- import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
10
- import static com.reactnativenavigation.utils.UiUtils.dpToPx;
11
-
12
- public class StatusBarUtils {
13
- private static final int STATUS_BAR_HEIGHT_M = 24;
14
- private static final int STATUS_BAR_HEIGHT_L = 25;
15
- private static int statusBarHeight = -1;
16
-
17
- public static void saveStatusBarHeight(int height) {
18
- statusBarHeight = height;
19
- }
20
-
21
- public static int getStatusBarHeight(Context context) {
22
- if (statusBarHeight > 0) {
23
- return statusBarHeight;
24
- }
25
- final Resources resources = context.getResources();
26
- final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
27
- statusBarHeight = resourceId > 0 ?
28
- resources.getDimensionPixelSize(resourceId) :
29
- dpToPx(context, Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? STATUS_BAR_HEIGHT_M : STATUS_BAR_HEIGHT_L);
30
- return statusBarHeight;
31
- }
32
-
33
- public static int getStatusBarHeightDp(Context context) {
34
- return (int) UiUtils.pxToDp(context, getStatusBarHeight(context));
35
- }
36
-
37
- public static boolean isTranslucent(Window window) {
38
- WindowManager.LayoutParams lp = window.getAttributes();
39
- return lp != null && (lp.flags & FLAG_TRANSLUCENT_STATUS) == FLAG_TRANSLUCENT_STATUS;
40
- }
41
- }
@@ -1,511 +0,0 @@
1
- package com.reactnativenavigation.viewcontrollers.bottomtabs;
2
-
3
- import android.app.Activity;
4
- import android.graphics.Color;
5
- import android.view.Gravity;
6
- import android.view.View;
7
- import android.view.ViewGroup.MarginLayoutParams;
8
-
9
- import com.aurelhubert.ahbottomnavigation.AHBottomNavigation;
10
- import com.reactnativenavigation.BaseTest;
11
- import com.reactnativenavigation.TestUtils;
12
- import com.reactnativenavigation.mocks.ImageLoaderMock;
13
- import com.reactnativenavigation.mocks.SimpleViewController;
14
- import com.reactnativenavigation.mocks.TypefaceLoaderMock;
15
- import com.reactnativenavigation.options.BottomTabsOptions;
16
- import com.reactnativenavigation.options.Options;
17
- import com.reactnativenavigation.options.params.Bool;
18
- import com.reactnativenavigation.options.params.Colour;
19
- import com.reactnativenavigation.options.params.NullText;
20
- import com.reactnativenavigation.options.params.Number;
21
- import com.reactnativenavigation.options.params.ThemeColour;
22
- import com.reactnativenavigation.options.params.Text;
23
- import com.reactnativenavigation.react.CommandListenerAdapter;
24
- import com.reactnativenavigation.react.events.EventEmitter;
25
- import com.reactnativenavigation.utils.ImageLoader;
26
- import com.reactnativenavigation.utils.OptionHelper;
27
- import com.reactnativenavigation.utils.StatusBarUtils;
28
- import com.reactnativenavigation.viewcontrollers.bottomtabs.attacher.BottomTabsAttacher;
29
- import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry;
30
- import com.reactnativenavigation.viewcontrollers.fakes.FakeParentController;
31
- import com.reactnativenavigation.viewcontrollers.parent.ParentController;
32
- import com.reactnativenavigation.viewcontrollers.stack.StackController;
33
- import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
34
- import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
35
- import com.reactnativenavigation.views.bottomtabs.BottomTabs;
36
- import com.reactnativenavigation.views.bottomtabs.BottomTabsContainer;
37
- import com.reactnativenavigation.views.bottomtabs.BottomTabsLayout;
38
-
39
- import org.junit.Test;
40
- import org.mockito.ArgumentCaptor;
41
- import org.mockito.Mockito;
42
-
43
- import java.util.ArrayList;
44
- import java.util.Arrays;
45
- import java.util.Collections;
46
- import java.util.List;
47
-
48
- import androidx.annotation.NonNull;
49
- import androidx.coordinatorlayout.widget.CoordinatorLayout;
50
-
51
-
52
- import static com.reactnativenavigation.TestUtils.hideBackButton;
53
- import static com.reactnativenavigation.utils.ObjectUtils.perform;
54
- import static org.assertj.core.api.Java6Assertions.assertThat;
55
- import static org.mockito.ArgumentMatchers.any;
56
- import static org.mockito.ArgumentMatchers.eq;
57
- import static org.mockito.Mockito.spy;
58
- import static org.mockito.Mockito.times;
59
- import static org.mockito.Mockito.verify;
60
- import static org.mockito.Mockito.when;
61
-
62
- public class BottomTabsControllerTest extends BaseTest {
63
-
64
- private Activity activity;
65
- private BottomTabs bottomTabs;
66
- private BottomTabsContainer bottomTabsContainer;
67
- private BottomTabsController uut;
68
- private final Options initialOptions = new Options();
69
- private ViewController<?> child1;
70
- private ViewController<?> child2;
71
- private ViewController<?> child3;
72
- private ViewController<?> stackChild;
73
- private StackController child4;
74
- private ViewController<?> child5;
75
- private final Options tabOptions = OptionHelper.createBottomTabOptions();
76
- private final ImageLoader imageLoaderMock = ImageLoaderMock.mock();
77
- private EventEmitter eventEmitter;
78
- private ChildControllersRegistry childRegistry;
79
- private List<ViewController<?>> tabs;
80
- private BottomTabsPresenter presenter;
81
- private BottomTabPresenter bottomTabPresenter;
82
- private BottomTabsAttacher tabsAttacher;
83
-
84
- @Override
85
- public void beforeEach() {
86
- activity = newActivity();
87
- childRegistry = new ChildControllersRegistry();
88
- eventEmitter = Mockito.mock(EventEmitter.class);
89
- prepareViewsForTests();
90
- StatusBarUtils.saveStatusBarHeight(63);
91
- }
92
-
93
- @Test
94
- public void createView_checkProperStructure() {
95
- idleMainLooper();
96
- assertThat(uut.getView()).isInstanceOf(CoordinatorLayout.class);
97
- assertThat(uut.getView().getChildAt(uut.getView().getChildCount() - 1)).isInstanceOf(BottomTabsContainer.class);
98
- assertThat(((CoordinatorLayout.LayoutParams) uut.getBottomTabsContainer().getLayoutParams()).gravity).isEqualTo(Gravity.BOTTOM);
99
- }
100
-
101
- @Test
102
- public void createView_tabsWithoutIconsAreAccepted() {
103
- tabOptions.bottomTabOptions.icon = new NullText();
104
- prepareViewsForTests();
105
- assertThat(uut.getBottomTabs().getItemsCount()).isEqualTo(tabs.size());
106
- }
107
-
108
- @Test
109
- public void createView_showTitlesWhenAllTabsDontHaveIcons() {
110
- tabOptions.bottomTabOptions.icon = new NullText();
111
- assertThat(tabOptions.bottomTabsOptions.titleDisplayMode.hasValue()).isFalse();
112
- prepareViewsForTests();
113
- presenter.applyOptions(Options.EMPTY);
114
- assertThat(bottomTabsContainer.getBottomTabs().getTitleState()).isEqualTo(AHBottomNavigation.TitleState.ALWAYS_SHOW);
115
- }
116
-
117
- @Test(expected = RuntimeException.class)
118
- public void setTabs_ThrowWhenMoreThan5() {
119
- tabs.add(new SimpleViewController(activity, childRegistry, "6", tabOptions));
120
- createBottomTabs();
121
- }
122
-
123
- @Test
124
- public void parentControllerIsSet() {
125
- uut = createBottomTabs();
126
- for (ViewController<?> tab : tabs) {
127
- assertThat(tab.getParentController()).isEqualTo(uut);
128
- }
129
- }
130
-
131
- @Test
132
- public void setTabs_allChildViewsAreAttachedToHierarchy() {
133
- uut.onViewWillAppear();
134
- assertThat(uut.getView().getChildCount()).isEqualTo(6);
135
- for (ViewController<?> child : uut.getChildControllers()) {
136
- assertThat(child.getView().getParent()).isNotNull();
137
- }
138
- }
139
-
140
- @Test
141
- public void setTabs_firstChildIsVisibleOtherAreGone() {
142
- uut.onViewWillAppear();
143
- for (int i = 0; i < uut.getChildControllers().size(); i++) {
144
- assertThat(uut.getView().getChildAt(i)).isEqualTo(tabs.get(i).getView());
145
- assertThat(uut.getView().getChildAt(i).getVisibility()).isEqualTo(i == 0 ? View.VISIBLE : View.INVISIBLE);
146
- }
147
- }
148
-
149
- @Test
150
- public void onTabSelected() {
151
- uut.ensureViewIsCreated();
152
- assertThat(uut.getSelectedIndex()).isZero();
153
- assertThat(((ViewController<?>) ((List<?>) uut.getChildControllers()).get(0)).getView().getVisibility()).isEqualTo(View.VISIBLE);
154
-
155
- uut.onTabSelected(3, false);
156
-
157
- assertThat(uut.getSelectedIndex()).isEqualTo(3);
158
- assertThat(((ViewController<?>) ((List<?>) uut.getChildControllers()).get(0)).getView().getVisibility()).isEqualTo(View.INVISIBLE);
159
- assertThat(((ViewController<?>) ((List<?>) uut.getChildControllers()).get(3)).getView().getVisibility()).isEqualTo(View.VISIBLE);
160
- verify(eventEmitter).emitBottomTabSelected(0, 3);
161
- }
162
-
163
- @Test
164
- public void onTabReSelected() {
165
- uut.ensureViewIsCreated();
166
- assertThat(uut.getSelectedIndex()).isZero();
167
-
168
- uut.onTabSelected(0, true);
169
-
170
- assertThat(uut.getSelectedIndex()).isEqualTo(0);
171
- assertThat(((ViewController<?>) ((List<?>) uut.getChildControllers()).get(0)).getView().getParent()).isNotNull();
172
- verify(eventEmitter).emitBottomTabSelected(0, 0);
173
- }
174
-
175
- @Test
176
- public void handleBack_DelegatesToSelectedChild() {
177
- uut.ensureViewIsCreated();
178
- assertThat(uut.handleBack(new CommandListenerAdapter())).isFalse();
179
- uut.selectTab(4);
180
- assertThat(uut.handleBack(new CommandListenerAdapter())).isTrue();
181
- verify(child5).handleBack(any());
182
- }
183
-
184
- @Test
185
- public void applyChildOptions_bottomTabsOptionsAreClearedAfterApply() {
186
- ParentController<?> parent = Mockito.mock(ParentController.class);
187
- uut.setParentController(parent);
188
-
189
- child1.options.bottomTabsOptions.backgroundColor = new ThemeColour(new Colour(Color.RED));
190
- child1.onViewWillAppear();
191
-
192
- ArgumentCaptor<Options> optionsCaptor = ArgumentCaptor.forClass(Options.class);
193
- verify(parent).applyChildOptions(optionsCaptor.capture(), any());
194
- assertThat(optionsCaptor.getValue().bottomTabsOptions.backgroundColor.hasValue()).isFalse();
195
- }
196
-
197
- @Test
198
- public void applyOptions_bottomTabsCreateViewOnlyOnce() {
199
- idleMainLooper();
200
- verify(presenter).applyOptions(any());
201
- verify(bottomTabsContainer.getBottomTabs(), times(2)).superCreateItems(); // first time when view is created, second time when options are applied
202
- }
203
-
204
- @Test
205
- public void onSizeChanged_recreateItemsIfSizeHasChanged() {
206
- int numberOfPreviousInvocations = 1;
207
- bottomTabs.onSizeChanged(0, 0, 0, 0);
208
- verify(bottomTabs, times(numberOfPreviousInvocations)).superCreateItems();
209
-
210
- bottomTabs.onSizeChanged(100, 0, 0, 0);
211
- verify(bottomTabs, times(numberOfPreviousInvocations)).superCreateItems();
212
-
213
- bottomTabs.onSizeChanged(1080, 147, 0, 0);
214
- verify(bottomTabs, times(numberOfPreviousInvocations + 1)).superCreateItems();
215
-
216
- bottomTabs.onSizeChanged(1920, 147, 0, 0);
217
- verify(bottomTabs, times(numberOfPreviousInvocations + 2)).superCreateItems();
218
-
219
- when(bottomTabs.getItemsCount()).thenReturn(0);
220
- bottomTabs.onSizeChanged(1080, 147, 0, 0);
221
- verify(bottomTabs, times(numberOfPreviousInvocations + 2)).superCreateItems();
222
- }
223
-
224
- @Test
225
- public void mergeOptions_currentTabIndex() {
226
- uut.ensureViewIsCreated();
227
- assertThat(uut.getSelectedIndex()).isZero();
228
-
229
- Options options = new Options();
230
- options.bottomTabsOptions.currentTabIndex = new Number(1);
231
- uut.mergeOptions(options);
232
- assertThat(uut.getSelectedIndex()).isOne();
233
- verify(eventEmitter, times(0)).emitBottomTabSelected(any(Integer.class), any(Integer.class));
234
- }
235
-
236
- @Test
237
- public void mergeOptions_drawBehind() {
238
- assertThat(uut.getBottomInset(child1)).isEqualTo(uut.getBottomTabs().getHeight());
239
-
240
- Options o1 = new Options();
241
- o1.bottomTabsOptions.drawBehind = new Bool(true);
242
- child1.mergeOptions(o1);
243
- assertThat(uut.getBottomInset(child1)).isEqualTo(0);
244
-
245
- Options o2 = new Options();
246
- o2.topBar.title.text = new Text("Some text");
247
- child1.mergeOptions(o1);
248
- assertThat(uut.getBottomInset(child1)).isEqualTo(0);
249
- }
250
-
251
- @Test
252
- public void mergeOptions_drawBehind_stack() {
253
- uut.ensureViewIsCreated();
254
- uut.selectTab(3);
255
-
256
- assertThat(((MarginLayoutParams) stackChild.getView().getLayoutParams()).bottomMargin).isEqualTo(bottomTabs.getHeight());
257
-
258
- Options o1 = new Options();
259
- o1.bottomTabsOptions.drawBehind = new Bool(true);
260
- stackChild.mergeOptions(o1);
261
-
262
- assertThat(((MarginLayoutParams) stackChild.getView().getLayoutParams()).bottomMargin).isEqualTo(0);
263
- }
264
-
265
- @Test
266
- public void mergeOptions_mergesBottomTabOptions() {
267
- Options options = new Options();
268
- uut.mergeOptions(options);
269
- verify(bottomTabPresenter).mergeOptions(options);
270
- }
271
-
272
- @Test
273
- public void applyChildOptions_resolvedOptionsAreUsed() {
274
- Options childOptions = new Options();
275
- SimpleViewController pushedScreen = new SimpleViewController(activity, childRegistry, "child4.1", childOptions);
276
- disablePushAnimation(pushedScreen);
277
- child4 = spyOnStack(pushedScreen);
278
-
279
- tabs = new ArrayList<>(Collections.singletonList(child4));
280
- tabsAttacher = new BottomTabsAttacher(tabs, presenter, Options.EMPTY);
281
-
282
- initialOptions.bottomTabsOptions.currentTabIndex = new Number(0);
283
- Options resolvedOptions = new Options();
284
- uut = new BottomTabsController(activity,
285
- tabs,
286
- childRegistry,
287
- eventEmitter,
288
- imageLoaderMock,
289
- "uut",
290
- initialOptions,
291
- new Presenter(activity, new Options()),
292
- tabsAttacher,
293
- presenter,
294
- new BottomTabPresenter(activity, tabs, ImageLoaderMock.mock(), new TypefaceLoaderMock(), new Options())) {
295
- @Override
296
- public Options resolveCurrentOptions() {
297
- return resolvedOptions;
298
- }
299
-
300
- @NonNull
301
- @Override
302
- protected BottomTabs createBottomTabs() {
303
- return new BottomTabs(activity) {
304
- @Override
305
- protected void createItems() {
306
-
307
- }
308
- };
309
- }
310
- };
311
-
312
- activity.setContentView(uut.getView());
313
- idleMainLooper();
314
- verify(presenter, times(2)).applyChildOptions(eq(resolvedOptions), any());
315
- }
316
-
317
- @Test
318
- public void child_mergeOptions_currentTabIndex() {
319
- uut.ensureViewIsCreated();
320
-
321
- assertThat(uut.getSelectedIndex()).isZero();
322
-
323
- Options options = new Options();
324
- options.bottomTabsOptions.currentTabIndex = new Number(1);
325
- child1.mergeOptions(options);
326
-
327
- assertThat(uut.getSelectedIndex()).isOne();
328
- }
329
-
330
- @Test
331
- public void resolveCurrentOptions_returnsFirstTabIfInvokedBeforeViewIsCreated() {
332
- uut = createBottomTabs();
333
- assertThat(uut.getCurrentChild()).isEqualTo(tabs.get(0));
334
- }
335
-
336
- @Test
337
- public void buttonPressInvokedOnCurrentTab() {
338
- uut.ensureViewIsCreated();
339
- uut.selectTab(4);
340
-
341
- uut.sendOnNavigationButtonPressed("btn1");
342
- verify(child5, times(1)).sendOnNavigationButtonPressed("btn1");
343
- }
344
-
345
- @Test
346
- public void push() {
347
- uut.selectTab(3);
348
-
349
- SimpleViewController stackChild2 = new SimpleViewController(activity, childRegistry, "stackChild2", new Options());
350
- disablePushAnimation(stackChild2);
351
- hideBackButton(stackChild2);
352
-
353
- assertThat(child4.size()).isEqualTo(1);
354
- child4.push(stackChild2, new CommandListenerAdapter());
355
- assertThat(child4.size()).isEqualTo(2);
356
- }
357
-
358
- @Test
359
- public void oneTimeOptionsAreAppliedOnce() {
360
- Options options = new Options();
361
- options.bottomTabsOptions.currentTabIndex = new Number(1);
362
-
363
- assertThat(uut.getSelectedIndex()).isZero();
364
- uut.mergeOptions(options);
365
- assertThat(uut.getSelectedIndex()).isOne();
366
- assertThat(uut.options.bottomTabsOptions.currentTabIndex.hasValue()).isFalse();
367
- assertThat(uut.initialOptions.bottomTabsOptions.currentTabIndex.hasValue()).isFalse();
368
- }
369
-
370
- @Test
371
- public void selectTab() {
372
- uut.selectTab(1);
373
- verify(tabsAttacher).onTabSelected(tabs.get(1));
374
- }
375
-
376
- @Test
377
- public void selectTab_onViewDidAppearIsInvokedAfterSelection() {
378
- uut.selectTab(1);
379
- verify(child2).onViewDidAppear();
380
- }
381
-
382
- @Test
383
- public void creatingTabs_onViewDidAppearInvokedAfterInitialTabIndexSet() {
384
- Options options = Options.EMPTY.copy();
385
- options.bottomTabsOptions.currentTabIndex = new Number(1);
386
- prepareViewsForTests(options.bottomTabsOptions);
387
- idleMainLooper();
388
- verify(tabs.get(0), times(0)).onViewDidAppear();
389
- verify(tabs.get(1), times(1)).onViewDidAppear();
390
- verify(tabs.get(2), times(0)).onViewDidAppear();
391
- verify(tabs.get(3), times(0)).onViewDidAppear();
392
- verify(tabs.get(4), times(0)).onViewDidAppear();
393
- }
394
-
395
- @Test
396
- public void getTopInset() {
397
- assertThat(child1.getTopInset()).isEqualTo(getStatusBarHeight());
398
- assertThat(child2.getTopInset()).isEqualTo(getStatusBarHeight());
399
-
400
- child1.options.statusBar.drawBehind = new Bool(true);
401
- assertThat(child1.getTopInset()).isEqualTo(0);
402
- assertThat(child2.getTopInset()).isEqualTo(getStatusBarHeight());
403
-
404
- assertThat(stackChild.getTopInset()).isEqualTo(getStatusBarHeight() + child4.getTopBar().getHeight());
405
- }
406
-
407
- @Test
408
- public void getBottomInset_defaultOptionsAreTakenIntoAccount() {
409
- Options defaultOptions = new Options();
410
- defaultOptions.bottomTabsOptions.visible = new Bool(false);
411
-
412
- assertThat(uut.getBottomInset(child1)).isEqualTo(bottomTabs.getHeight());
413
- uut.setDefaultOptions(defaultOptions);
414
- assertThat(uut.getBottomInset(child1)).isZero();
415
- }
416
-
417
- @Test
418
- public void destroy() {
419
- uut.destroy();
420
- verify(tabsAttacher).destroy();
421
- }
422
-
423
- private void prepareViewsForTests() {
424
- prepareViewsForTests(initialOptions.bottomTabsOptions);
425
- }
426
-
427
- private void prepareViewsForTests(BottomTabsOptions bottomTabsOptions) {
428
- perform(uut, ViewController::destroy);
429
- bottomTabs = spy(new BottomTabs(activity) {
430
- @Override
431
- public void superCreateItems() {
432
-
433
- }
434
- });
435
- bottomTabsContainer = spy(new BottomTabsContainer(activity, bottomTabs));
436
-
437
- createChildren();
438
- tabs = Arrays.asList(child1, child2, child3, child4, child5);
439
- initialOptions.bottomTabsOptions = bottomTabsOptions;
440
- presenter = spy(new BottomTabsPresenter(tabs, initialOptions, new BottomTabsAnimator()));
441
- bottomTabPresenter = spy(new BottomTabPresenter(activity, tabs, ImageLoaderMock.mock(), new TypefaceLoaderMock(), initialOptions));
442
- tabsAttacher = spy(new BottomTabsAttacher(tabs, presenter, initialOptions));
443
- uut = createBottomTabs();
444
- activity.setContentView(new FakeParentController(activity, childRegistry, uut).getView());
445
- }
446
-
447
- private void createChildren() {
448
- child1 = spy(new SimpleViewController(activity, childRegistry, "child1", tabOptions));
449
- child2 = spy(new SimpleViewController(activity, childRegistry, "child2", tabOptions));
450
- child3 = spy(new SimpleViewController(activity, childRegistry, "child3", tabOptions));
451
- stackChild = spy(new SimpleViewController(activity, childRegistry, "stackChild", tabOptions));
452
- child4 = spyOnStack(stackChild);
453
- child5 = spy(new SimpleViewController(activity, childRegistry, "child5", tabOptions));
454
- when(child5.handleBack(any())).thenReturn(true);
455
- }
456
-
457
- private StackController spyOnStack(ViewController<?> initialChild) {
458
- StackController build = TestUtils.newStackController(activity)
459
- .setInitialOptions(tabOptions)
460
- .build();
461
- StackController stack = spy(build);
462
- disablePushAnimation(initialChild);
463
- stack.ensureViewIsCreated();
464
- stack.push(initialChild, new CommandListenerAdapter());
465
- return stack;
466
- }
467
-
468
- private BottomTabsController createBottomTabs() {
469
- return new BottomTabsController(activity,
470
- tabs,
471
- childRegistry,
472
- eventEmitter,
473
- imageLoaderMock,
474
- "uut",
475
- initialOptions,
476
- new Presenter(activity, initialOptions),
477
- tabsAttacher,
478
- presenter,
479
- bottomTabPresenter) {
480
- @Override
481
- public void ensureViewIsCreated() {
482
- super.ensureViewIsCreated();
483
- uut.getView().layout(0, 0, 1000, 1000);
484
- }
485
-
486
- @NonNull
487
- @Override
488
- public BottomTabsLayout createView() {
489
- BottomTabsLayout view = super.createView();
490
- bottomTabs.getLayoutParams().height = 100;
491
- return view;
492
- }
493
-
494
- @NonNull
495
- @Override
496
- protected BottomTabsContainer createBottomTabsContainer() {
497
- return bottomTabsContainer;
498
- }
499
-
500
- @NonNull
501
- @Override
502
- protected BottomTabs createBottomTabs() {
503
- return bottomTabs;
504
- }
505
- };
506
- }
507
-
508
- private int getStatusBarHeight() {
509
- return StatusBarUtils.getStatusBarHeight(activity);
510
- }
511
- }