react-native-navigation 7.24.3 → 7.25.0-snapshot.543

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 (141) hide show
  1. package/lib/android/app/build.gradle +12 -9
  2. package/lib/android/app/src/main/java/com/reactnativenavigation/NavigationActivity.java +7 -9
  3. package/lib/android/app/src/main/java/com/reactnativenavigation/options/BottomTabOptions.java +4 -0
  4. package/lib/android/app/src/main/java/com/reactnativenavigation/options/Options.java +2 -0
  5. package/lib/android/app/src/main/java/com/reactnativenavigation/options/OverlayOptions.java +3 -2
  6. package/lib/android/app/src/main/java/com/reactnativenavigation/options/OverlayOptions.kt +31 -0
  7. package/lib/android/app/src/main/java/com/reactnativenavigation/options/layout/LayoutInsets.kt +44 -0
  8. package/lib/android/app/src/main/java/com/reactnativenavigation/options/layout/LayoutOptions.kt +71 -0
  9. package/lib/android/app/src/main/java/com/reactnativenavigation/options/parsers/JSONParser.java +0 -2
  10. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/PrimitiveExt.kt +9 -0
  11. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabPresenter.java +2 -1
  12. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java +31 -4
  13. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/child/ChildController.java +6 -13
  14. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java +32 -10
  15. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/modal/ModalStack.java +4 -0
  16. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/navigator/Navigator.java +25 -6
  17. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManager.kt +104 -33
  18. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/parent/ParentController.java +86 -9
  19. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuController.java +12 -0
  20. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java +18 -1
  21. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java +51 -0
  22. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonController.kt +7 -1
  23. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/Presenter.java +23 -7
  24. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/RootPresenter.java +0 -1
  25. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewController.java +24 -3
  26. package/lib/android/app/src/main/java/com/reactnativenavigation/views/bottomtabs/BottomTabs.java +29 -1
  27. package/lib/android/app/src/main/java/com/reactnativenavigation/views/bottomtabs/BottomTabsContainer.kt +1 -0
  28. package/lib/android/app/src/main/java/com/reactnativenavigation/views/bottomtabs/BottomTabsLayout.java +10 -1
  29. package/lib/android/app/src/main/java/com/reactnativenavigation/views/component/ComponentLayout.java +10 -2
  30. package/lib/android/app/src/main/java/com/reactnativenavigation/views/overlay/AttachedOverlayContainer.kt +69 -0
  31. package/lib/android/app/src/main/java/com/reactnativenavigation/views/overlay/ViewTooltip.java +921 -0
  32. package/lib/android/app/src/main/java/com/reactnativenavigation/views/sidemenu/SideMenuRoot.java +9 -1
  33. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/StackLayout.java +14 -4
  34. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/TopBar.java +0 -1
  35. package/lib/android/app/src/main/java/com/reactnativenavigation/views/toptabs/TopTabsStyleHelper.java +0 -1
  36. package/lib/dist/src/interfaces/Options.d.ts +34 -0
  37. package/lib/ios/RNNBasePresenter.m +17 -0
  38. package/lib/ios/RNNBottomTabsController.m +1 -0
  39. package/lib/ios/RNNComponentViewController.m +5 -0
  40. package/lib/ios/RNNLayoutOptions.h +2 -1
  41. package/lib/ios/RNNLayoutOptions.m +4 -0
  42. package/lib/ios/RNNStackPresenter.m +1 -0
  43. package/lib/src/interfaces/Options.ts +38 -0
  44. package/package.json +3 -1
  45. package/.buildkite/pipeline.yml +0 -59
  46. package/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutOptions.java +0 -48
  47. package/lib/android/app/src/test/java/com/reactnativenavigation/BaseTest.java +0 -178
  48. package/lib/android/app/src/test/java/com/reactnativenavigation/EnvironmentTest.java +0 -43
  49. package/lib/android/app/src/test/java/com/reactnativenavigation/TestActivity.java +0 -23
  50. package/lib/android/app/src/test/java/com/reactnativenavigation/TestApplication.java +0 -35
  51. package/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java +0 -62
  52. package/lib/android/app/src/test/java/com/reactnativenavigation/fakes/IconResolverFake.kt +0 -8
  53. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/BackDrawable.java +0 -30
  54. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/ImageLoaderMock.kt +0 -49
  55. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/Mocks.kt +0 -18
  56. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleComponentViewController.java +0 -15
  57. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleOverlay.java +0 -54
  58. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java +0 -113
  59. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestComponentLayout.java +0 -79
  60. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestComponentViewCreator.java +0 -18
  61. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestReactView.java +0 -71
  62. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TitleBarButtonCreatorMock.java +0 -34
  63. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TitleBarReactViewCreatorMock.java +0 -20
  64. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TopBarBackgroundViewCreatorMock.java +0 -20
  65. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TypefaceLoaderMock.kt +0 -21
  66. package/lib/android/app/src/test/java/com/reactnativenavigation/options/LayoutNodeParserTest.java +0 -51
  67. package/lib/android/app/src/test/java/com/reactnativenavigation/options/OptionsTest.java +0 -315
  68. package/lib/android/app/src/test/java/com/reactnativenavigation/options/OrientationOptionsTest.java +0 -81
  69. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TopBarButtonsTest.kt +0 -95
  70. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TransitionAnimationOptionsTest.kt +0 -122
  71. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/BoolParserTest.java +0 -28
  72. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/ColorParseTest.java +0 -50
  73. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/JSONParserTest.java +0 -64
  74. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/PresenterTest.java +0 -56
  75. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/RenderCheckerTest.java +0 -59
  76. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/SideMenuPresenterTest.java +0 -35
  77. package/lib/android/app/src/test/java/com/reactnativenavigation/react/NavigationModuleTest.java +0 -102
  78. package/lib/android/app/src/test/java/com/reactnativenavigation/react/ReloadListenerTest.java +0 -24
  79. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/AnimationHelper.kt +0 -33
  80. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ButtonPresenterTest.java +0 -241
  81. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ButtonSpanTest.java +0 -57
  82. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/CompatUtilsTest.java +0 -17
  83. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/LayoutFactoryTest.java +0 -78
  84. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/MotionEventTest.kt +0 -47
  85. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/NativeCommandListenerTest.java +0 -60
  86. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/OptionHelper.java +0 -16
  87. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ReflectionUtilsTest.java +0 -26
  88. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/StringUtilsTest.java +0 -19
  89. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/SystemUiUtilsTest.kt +0 -27
  90. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/TitleAndButtonsMeasurerTest.kt +0 -357
  91. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/TitleBarHelper.java +0 -54
  92. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiThreadTest.java +0 -29
  93. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiUtilsTest.java +0 -22
  94. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ViewHelper.java +0 -9
  95. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java +0 -149
  96. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabPresenterTest.java +0 -206
  97. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsAttacherTest.java +0 -62
  98. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.kt +0 -589
  99. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsPresenterTest.kt +0 -173
  100. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/AfterInitialTabTest.java +0 -38
  101. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/AttachModeTest.java +0 -86
  102. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/OnSwitchToTabTest.java +0 -31
  103. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/TogetherTest.java +0 -20
  104. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/button/NavigationIconResolverTest.java +0 -78
  105. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllerTest.java +0 -80
  106. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllersRegistryTest.java +0 -56
  107. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewControllerTest.java +0 -216
  108. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/ExternalComponentViewControllerTest.java +0 -97
  109. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/FragmentCreatorMock.java +0 -34
  110. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/SomeFragment.java +0 -8
  111. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/fakes/FakeParentController.kt +0 -33
  112. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorMock.java +0 -40
  113. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorTest.kt +0 -213
  114. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalPresenterTest.java +0 -319
  115. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java +0 -367
  116. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/NavigatorTest.java +0 -898
  117. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/RootPresenterTest.kt +0 -254
  118. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManagerTest.java +0 -108
  119. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/parent/ParentControllerTest.java +0 -299
  120. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java +0 -446
  121. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/BackButtonHelperTest.java +0 -77
  122. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/FloatingActionButtonTest.java +0 -154
  123. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/IdStackTest.java +0 -114
  124. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackAnimatorTest.kt +0 -241
  125. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt +0 -1165
  126. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt +0 -1081
  127. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TitleBarButtonControllerTest.java +0 -61
  128. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TitleBarReactViewControllerTest.java +0 -43
  129. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarButtonControllerTest.java +0 -120
  130. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarControllerTest.kt +0 -432
  131. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsViewControllerTest.java +0 -249
  132. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewControllerTest.java +0 -337
  133. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/YellowBoxDelegateTest.java +0 -68
  134. package/lib/android/app/src/test/java/com/reactnativenavigation/views/OverlayTouchDelegateTest.java +0 -60
  135. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt +0 -477
  136. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TopBarTest.java +0 -82
  137. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/BaseViewAnimatorTest.kt +0 -109
  138. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/DefaultViewAnimatorCreatorFake.kt +0 -36
  139. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsContainerTest.kt +0 -101
  140. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsTest.kt +0 -40
  141. package/lib/android/app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +0 -1
@@ -3,74 +3,145 @@ package com.reactnativenavigation.viewcontrollers.overlay
3
3
  import android.content.res.Configuration
4
4
  import android.view.View
5
5
  import android.view.ViewGroup
6
+ import com.reactnativenavigation.options.OverlayAttachOptions
7
+ import com.reactnativenavigation.options.OverlayOptions
6
8
  import com.reactnativenavigation.react.CommandListener
7
9
  import com.reactnativenavigation.utils.CoordinatorLayoutUtils
10
+ import com.reactnativenavigation.utils.removeFromParent
11
+ import com.reactnativenavigation.viewcontrollers.component.ComponentViewController
8
12
  import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController
9
13
  import com.reactnativenavigation.views.BehaviourDelegate
14
+ import com.reactnativenavigation.views.overlay.ViewTooltip
15
+
16
+ private fun View.closeNow() {
17
+ if (this is ViewTooltip.TooltipView) {
18
+ this.closeNow()
19
+ } else {
20
+ removeFromParent()
21
+ }
22
+ }
23
+
24
+ private class OverlayEntry(
25
+ var overlayView: View,
26
+ val viewController: ViewController<*>
27
+ )
10
28
 
11
29
  class OverlayManager {
12
- private val overlayRegistry = mutableMapOf<String, ViewController<*>>()
13
- fun show(overlaysContainer: ViewGroup, overlay: ViewController<*>, listener: CommandListener) {
14
- overlaysContainer.visibility = View.VISIBLE
15
- overlayRegistry[overlay.id] = overlay
16
- overlay.addOnAppearedListener {
17
- overlay.onViewDidAppear()
18
- listener.onSuccess(overlay.id)
30
+ private val overlayRegistry = mutableMapOf<String, OverlayEntry>()
31
+ var mainOverlayContainer: ViewGroup? = null
32
+ var findController: (String) -> ViewController<*>? = { null }
33
+ var findAnchorView: (OverlayAttachOptions) -> View? = { null }
34
+
35
+ fun show(overlayController: ViewController<*>, overlayOptions: OverlayOptions, listener: CommandListener) {
36
+ val overlayAttachOptions = overlayOptions.overlayAttachOptions
37
+ if (overlayAttachOptions.anchorId.hasValue()) {
38
+ anchorOverlayInParent(overlayAttachOptions, overlayController, listener)
39
+ } else {
40
+ attachOverlayToParent(overlayAttachOptions, overlayController, listener)
19
41
  }
20
- overlaysContainer.addView(
21
- overlay.view,
22
- CoordinatorLayoutUtils.matchParentWithBehaviour(BehaviourDelegate(overlay))
23
- )
42
+ }
43
+
44
+ private fun attachOverlayToParent(
45
+ overlayAttachOptions: OverlayAttachOptions,
46
+ overlayController: ViewController<*>,
47
+ listener: CommandListener
48
+ ) {
49
+ val parent = if (overlayAttachOptions.layoutId.hasValue()) {
50
+ findController(overlayAttachOptions.layoutId.get())?.view
51
+ } else mainOverlayContainer
52
+
53
+ parent?.let {
54
+ it.visibility = View.VISIBLE
55
+ registerOverlay(overlayController.view,overlayController, listener)
56
+ it.addView(
57
+ overlayController.view,
58
+ CoordinatorLayoutUtils.matchParentWithBehaviour(BehaviourDelegate(overlayController))
59
+ )
60
+ } ?: listener.onError("Cannot find layout with id " + overlayAttachOptions.layoutId)
61
+ }
62
+
63
+ private fun anchorOverlayInParent(
64
+ overlayAttachOptions: OverlayAttachOptions,
65
+ overlayController: ViewController<*>,
66
+ listener: CommandListener
67
+ ) {
68
+ val hostController = findController(overlayAttachOptions.layoutId.get())
69
+ if (hostController != null) {
70
+ val anchorView: View? = findAnchorView(overlayAttachOptions)
71
+ if (anchorView != null) {
72
+ if(overlayController is ComponentViewController){
73
+ overlayController.ignoreInsets(true)
74
+ }
75
+ val anchoredView =
76
+ hostController.showAnchoredOverlay(anchorView, overlayAttachOptions, overlayController)
77
+ anchoredView?.let {
78
+ registerOverlay(it,overlayController, listener)
79
+ } ?: listener.onError("Parent could not create anchored view, it could be null parent")
80
+ } else {
81
+ listener.onError("Cannot find anchor view with id " + overlayAttachOptions.anchorId)
82
+ }
83
+ } else {
84
+ listener.onError("Cannot find layout with id " + overlayAttachOptions.layoutId)
85
+ }
86
+ }
87
+
88
+ private fun registerOverlay(
89
+ view:View,
90
+ viewController: ViewController<*>,
91
+ listener: CommandListener
92
+ ) {
93
+ overlayRegistry[viewController.id] = OverlayEntry(view, viewController)
94
+ viewController.onViewDidAppear()
95
+ listener.onSuccess(viewController.id)
24
96
  }
25
97
 
26
98
  fun onConfigurationChanged(configuration: Configuration?) {
27
- overlayRegistry.values.forEach { controller -> controller.onConfigurationChanged(configuration) }
99
+ overlayRegistry.values.forEach { entry -> entry.viewController.onConfigurationChanged(configuration) }
28
100
  }
29
101
 
30
- fun dismiss(overlaysContainer: ViewGroup, componentId: String, listener: CommandListener) {
102
+ fun dismiss(componentId: String, listener: CommandListener) {
31
103
  val overlay = overlayRegistry.remove(componentId)
32
104
  if (overlay == null) {
33
105
  listener.onError("Could not dismiss Overlay. Overlay with id $componentId was not found.")
34
106
  } else {
35
- destroyOverlay(overlaysContainer, overlay)
107
+ destroyOverlay(overlay)
36
108
  listener.onSuccess(componentId)
37
109
  }
38
110
  }
39
111
 
40
- fun dismissAll(overlaysContainer: ViewGroup, listener: CommandListener) {
41
- destroy(overlaysContainer)
42
- listener.onSuccess("")
112
+ fun dismissAll() {
113
+ destroy()
43
114
  }
44
115
 
45
- fun destroy(overlaysContainer: ViewGroup) {
46
- val removedOverlays = overlayRegistry.values.map { overlay ->
47
- destroyOverlay(overlaysContainer, overlay)
48
- overlay.id
49
- }.toList()
50
- removedOverlays.forEach {
51
- overlayRegistry.remove(it)
116
+ fun destroy() {
117
+ val entries = overlayRegistry.entries
118
+ while (entries.isNotEmpty()) {
119
+ val first = entries.first()
120
+ val attachOverlayEntry = first.value
121
+ attachOverlayEntry.overlayView.closeNow()
122
+ attachOverlayEntry.viewController.destroy()
123
+ overlayRegistry.remove(first.key)
52
124
  }
125
+ mainOverlayContainer?.visibility = View.GONE
53
126
  }
54
127
 
55
128
  fun size() = overlayRegistry.size
56
129
 
57
130
  fun findControllerById(id: String?): ViewController<*>? {
58
- return overlayRegistry[id]
131
+ return overlayRegistry[id]?.viewController
59
132
  }
60
133
 
61
- private fun destroyOverlay(overlaysContainer: ViewGroup, overlay: ViewController<*>) {
62
- overlay.destroy()
63
- if (isEmpty) overlaysContainer.visibility = View.GONE
134
+ private fun destroyOverlay(overlay: OverlayEntry?) {
135
+ overlay?.overlayView?.closeNow()
136
+ overlay?.viewController?.destroy()
137
+ if (overlayRegistry.isEmpty()) mainOverlayContainer?.visibility = View.GONE
64
138
  }
65
139
 
66
- private val isEmpty: Boolean
67
- get() = size() == 0
68
-
69
140
  fun onHostPause() {
70
- overlayRegistry.values.forEach(ViewController<*>::onViewDisappear)
141
+ overlayRegistry.values.forEach { it.viewController.onViewDisappear() }
71
142
  }
72
143
 
73
144
  fun onHostResume() {
74
- overlayRegistry.values.forEach(ViewController<*>::onViewDidAppear)
145
+ overlayRegistry.values.forEach { it.viewController.onViewDidAppear() }
75
146
  }
76
147
  }
@@ -1,30 +1,34 @@
1
1
  package com.reactnativenavigation.viewcontrollers.parent;
2
2
 
3
+ import static com.reactnativenavigation.utils.CollectionUtils.forEach;
4
+ import static com.reactnativenavigation.utils.ObjectUtils.perform;
5
+
3
6
  import android.app.Activity;
4
7
  import android.content.res.Configuration;
5
8
  import android.view.View;
6
9
  import android.view.ViewGroup;
7
10
 
11
+ import androidx.annotation.CallSuper;
12
+ import androidx.annotation.CheckResult;
13
+ import androidx.annotation.NonNull;
14
+ import androidx.annotation.Nullable;
15
+ import androidx.viewpager.widget.ViewPager;
16
+
8
17
  import com.reactnativenavigation.options.Options;
18
+ import com.reactnativenavigation.options.OverlayAttachOptions;
9
19
  import com.reactnativenavigation.options.params.Bool;
10
20
  import com.reactnativenavigation.utils.CollectionUtils;
11
21
  import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabsController;
12
22
  import com.reactnativenavigation.viewcontrollers.child.ChildController;
13
23
  import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry;
24
+ import com.reactnativenavigation.viewcontrollers.stack.StackController;
14
25
  import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
15
26
  import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
16
27
  import com.reactnativenavigation.views.component.Component;
17
28
 
18
29
  import java.util.Collection;
19
-
20
- import androidx.annotation.CallSuper;
21
- import androidx.annotation.CheckResult;
22
- import androidx.annotation.NonNull;
23
- import androidx.annotation.Nullable;
24
- import androidx.viewpager.widget.ViewPager;
25
-
26
- import static com.reactnativenavigation.utils.CollectionUtils.*;
27
- import static com.reactnativenavigation.utils.ObjectUtils.perform;
30
+ import java.util.Collections;
31
+ import java.util.List;
28
32
 
29
33
  public abstract class ParentController<T extends ViewGroup> extends ChildController<T> {
30
34
 
@@ -88,6 +92,10 @@ public abstract class ParentController<T extends ViewGroup> extends ChildControl
88
92
 
89
93
  public abstract ViewController<?> getCurrentChild();
90
94
 
95
+ public List<ViewController<?>> getChildren(){
96
+ return Collections.emptyList();
97
+ }
98
+
91
99
  @NonNull
92
100
  @Override
93
101
  public abstract T createView();
@@ -103,6 +111,51 @@ public abstract class ParentController<T extends ViewGroup> extends ChildControl
103
111
  return perform(getParentController(), null, ParentController::getBottomTabsController);
104
112
  }
105
113
 
114
+ @Override
115
+ protected View findTooltipAnchorView(OverlayAttachOptions options) {
116
+ final String id = options.anchorId.get();
117
+ View found = null;
118
+ final View topBarView = findTopBarViewById(id);
119
+ if (topBarView != null) {
120
+ found = topBarView;
121
+ } else {
122
+ final View bottomTabViewById = findBottomTabViewById(id);
123
+ if (bottomTabViewById != null) {
124
+ found = bottomTabViewById;
125
+ }
126
+ }
127
+ return found;
128
+ }
129
+
130
+ @Nullable
131
+ protected View findTopBarViewById(String id) {
132
+ final View[] found = {null};
133
+ lookup((controller) -> {
134
+ if (controller instanceof StackController) {
135
+ final StackController stackController = (StackController) controller;
136
+ final View topBarViewById = stackController.presenter.findTopBarViewById(id);
137
+ found[0] = topBarViewById;
138
+ return topBarViewById != null;
139
+ }
140
+ return false;
141
+ });
142
+ return found[0];
143
+ }
144
+
145
+ @Nullable
146
+ protected View findBottomTabViewById(@NonNull String id) {
147
+ final View[] found = {null};
148
+ lookup((controller) -> {
149
+ if (controller instanceof BottomTabsController) {
150
+ BottomTabsController bottomTabsController = (BottomTabsController) controller;
151
+ found[0] = bottomTabsController.getTabViewByTag(id);
152
+ return found[0] != null;
153
+ }
154
+ return false;
155
+ });
156
+ return found[0];
157
+ }
158
+
106
159
  @Nullable
107
160
  @Override
108
161
  public ViewController<?> findController(final String id) {
@@ -204,6 +257,30 @@ public abstract class ParentController<T extends ViewGroup> extends ChildControl
204
257
  return getCurrentChild().getCurrentComponentName();
205
258
  }
206
259
 
260
+ protected interface LookupPredicate<T> {
261
+ boolean test(T t);
262
+ }
263
+ public ViewController<?> lookup(LookupPredicate<ViewController<?>> predicate){
264
+ if(predicate.test(this)){
265
+ return this;
266
+ }else{
267
+ final List<ViewController<?>> children = getChildren();
268
+ for(ViewController<?> child : children){
269
+ if(child instanceof ParentController){
270
+ ViewController<?> result= ((ParentController<?>) child).lookup(predicate);
271
+ if(result!=null){
272
+ return result;
273
+ }
274
+ }else{
275
+ if(predicate.test(child)){
276
+ return child;
277
+ }
278
+ }
279
+ }
280
+ return null;
281
+ }
282
+ }
283
+
207
284
  public void onConfigurationChanged(Configuration newConfig) {
208
285
  super.onConfigurationChanged(newConfig);
209
286
  Collection<? extends ViewController<?>> childControllers = getChildControllers();
@@ -3,8 +3,10 @@ package com.reactnativenavigation.viewcontrollers.sidemenu;
3
3
  import android.app.Activity;
4
4
  import android.view.Gravity;
5
5
  import android.view.View;
6
+ import android.view.ViewGroup;
6
7
 
7
8
  import com.reactnativenavigation.options.Options;
9
+ import com.reactnativenavigation.options.OverlayAttachOptions;
8
10
  import com.reactnativenavigation.options.SideMenuRootOptions;
9
11
  import com.reactnativenavigation.options.params.Bool;
10
12
  import com.reactnativenavigation.react.CommandListener;
@@ -12,6 +14,7 @@ import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry;
12
14
  import com.reactnativenavigation.viewcontrollers.parent.ParentController;
13
15
  import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
14
16
  import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
17
+ import com.reactnativenavigation.views.overlay.ViewTooltip;
15
18
  import com.reactnativenavigation.views.sidemenu.SideMenu;
16
19
  import com.reactnativenavigation.views.sidemenu.SideMenuRoot;
17
20
 
@@ -65,6 +68,15 @@ public class SideMenuController extends ParentController<SideMenuRoot> implement
65
68
  return root;
66
69
  }
67
70
 
71
+ @Override
72
+ public ViewTooltip.TooltipView showAnchoredOverlay(@NonNull View anchorView, @NonNull OverlayAttachOptions overlayAttachOptions, @NonNull ViewController<?> overlayViewController) {
73
+ if (view != null) {
74
+ return view.getAttachedOverlayContainer().addAnchoredView(anchorView, overlayViewController.getView(),
75
+ overlayAttachOptions.gravity.get());
76
+ }
77
+ return null;
78
+ }
79
+
68
80
  @Override
69
81
  public void sendOnNavigationButtonPressed(String buttonId) {
70
82
  center.sendOnNavigationButtonPressed(buttonId);
@@ -8,6 +8,7 @@ import android.view.ViewGroup;
8
8
  import com.facebook.react.ReactRootView;
9
9
  import com.reactnativenavigation.options.ButtonOptions;
10
10
  import com.reactnativenavigation.options.Options;
11
+ import com.reactnativenavigation.options.OverlayAttachOptions;
11
12
  import com.reactnativenavigation.options.StackAnimationOptions;
12
13
  import com.reactnativenavigation.react.CommandListener;
13
14
  import com.reactnativenavigation.react.CommandListenerAdapter;
@@ -19,6 +20,7 @@ import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarController;
19
20
  import com.reactnativenavigation.viewcontrollers.stack.topbar.button.BackButtonHelper;
20
21
  import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
21
22
  import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
23
+ import com.reactnativenavigation.views.overlay.ViewTooltip;
22
24
  import com.reactnativenavigation.views.component.Component;
23
25
  import com.reactnativenavigation.views.stack.StackBehaviour;
24
26
  import com.reactnativenavigation.views.stack.StackLayout;
@@ -32,6 +34,7 @@ import java.util.Iterator;
32
34
  import java.util.List;
33
35
 
34
36
  import androidx.annotation.NonNull;
37
+ import androidx.annotation.Nullable;
35
38
  import androidx.annotation.RestrictTo;
36
39
  import androidx.annotation.Size;
37
40
  import androidx.annotation.VisibleForTesting;
@@ -51,7 +54,7 @@ public class StackController extends ParentController<StackLayout> {
51
54
  private final EventEmitter eventEmitter;
52
55
  private final TopBarController topBarController;
53
56
  private final BackButtonHelper backButtonHelper;
54
- private final StackPresenter presenter;
57
+ public final StackPresenter presenter;
55
58
  private final FabPresenter fabPresenter;
56
59
 
57
60
  public StackController(Activity activity, List<ViewController<?>> children, ChildControllersRegistry childRegistry, EventEmitter eventEmitter, TopBarController topBarController, StackAnimator animator, String id, Options initialOptions, BackButtonHelper backButtonHelper, StackPresenter stackPresenter, Presenter presenter, FabPresenter fabPresenter) {
@@ -478,6 +481,20 @@ public class StackController extends ParentController<StackLayout> {
478
481
  return false;
479
482
  }
480
483
 
484
+ @Override
485
+ public ViewTooltip.TooltipView showAnchoredOverlay(@NonNull View anchorView, @NonNull OverlayAttachOptions overlayAttachOptions, @NonNull ViewController<?> overlayViewController) {
486
+ if(view!=null){
487
+ return( (StackLayout)view).getAttachedOverlayContainer().addAnchoredView(anchorView, overlayViewController.getView(),
488
+ overlayAttachOptions.gravity.get());
489
+ }
490
+ return null;
491
+ }
492
+
493
+ @Override
494
+ public List<ViewController<?>> getChildren() {
495
+ return stack.values();
496
+ }
497
+
481
498
  @Override
482
499
  public int getTopInset(ViewController<?> child) {
483
500
  return presenter.getTopInset(resolveChildOptions(child));
@@ -10,6 +10,8 @@ import static com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarContr
10
10
  import android.animation.Animator;
11
11
  import android.app.Activity;
12
12
  import android.graphics.Color;
13
+ import android.util.Pair;
14
+ import android.view.MenuItem;
13
15
  import android.view.View;
14
16
  import android.view.ViewGroup;
15
17
  import android.view.ViewGroup.LayoutParams;
@@ -49,10 +51,12 @@ import com.reactnativenavigation.viewcontrollers.viewcontroller.IReactView;
49
51
  import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
50
52
  import com.reactnativenavigation.views.stack.topbar.TopBar;
51
53
  import com.reactnativenavigation.views.stack.topbar.TopBarBackgroundViewCreator;
54
+ import com.reactnativenavigation.views.stack.topbar.titlebar.ButtonBar;
52
55
  import com.reactnativenavigation.views.stack.topbar.titlebar.TitleBarButtonCreator;
53
56
  import com.reactnativenavigation.views.stack.topbar.titlebar.TitleBarReactViewCreator;
54
57
 
55
58
  import java.util.ArrayList;
59
+ import java.util.Collection;
56
60
  import java.util.Collections;
57
61
  import java.util.HashMap;
58
62
  import java.util.List;
@@ -674,4 +678,51 @@ public class StackPresenter {
674
678
  public int getTopInset(Options resolvedOptions) {
675
679
  return resolvedOptions.withDefaultOptions(defaultOptions).topBar.isHiddenOrDrawBehind() ? 0 : topBarController.getHeight();
676
680
  }
681
+
682
+
683
+ private TitleBarReactViewController findTitleById(String id){
684
+ final Collection<TitleBarReactViewController> values = titleControllers.values();
685
+ for(TitleBarReactViewController child: values){
686
+ if(child.getId().equals(id)){
687
+ return child;
688
+ }
689
+ }
690
+ return null;
691
+ }
692
+ private Pair<ButtonController, ButtonBar> findButtonById(String id){
693
+ final Collection<Map<String, ButtonController>> leftControllers = leftButtonControllers.values();
694
+ final Collection<Map<String, ButtonController>> rightControllers = rightButtonControllers.values();
695
+ for(Map<String, ButtonController> map : leftControllers){
696
+ if(map.containsKey(id)){
697
+ return Pair.create(map.get(id),topBar.getLeftButtonBar());
698
+ }
699
+ }
700
+ for(Map<String, ButtonController> map : rightControllers){
701
+ if(map.containsKey(id)){
702
+ return Pair.create(map.get(id),topBar.getRightButtonBar());
703
+ }
704
+ }
705
+ return null;
706
+ }
707
+ @Nullable
708
+ public View findTopBarViewById(String id) {
709
+ final Pair<ButtonController, ButtonBar> buttonById = findButtonById(id);
710
+ if(buttonById!=null){
711
+ final View view = buttonById.first.getNullableView();
712
+ if(view==null){
713
+ final MenuItem menuItem = buttonById.first.getMenuItem();
714
+ if(menuItem!=null){
715
+ final int order = menuItem.getOrder();
716
+ return buttonById.second.getChildAt(order/10);
717
+ }
718
+ }
719
+ return view;
720
+ }else {
721
+ final TitleBarReactViewController titleById = findTitleById(id);
722
+ if(titleById!=null){
723
+ return titleById.getView();
724
+ }
725
+ }
726
+ return null;
727
+ }
677
728
  }
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
4
4
  import android.app.Activity
5
5
  import android.view.Menu
6
6
  import android.view.MenuItem
7
+ import android.view.View
7
8
  import androidx.appcompat.widget.Toolbar
8
9
  import com.reactnativenavigation.options.ButtonOptions
9
10
  import com.reactnativenavigation.options.Options
@@ -22,7 +23,8 @@ open class ButtonController(activity: Activity,
22
23
  private val viewCreator: TitleBarButtonCreator,
23
24
  private val onPressListener: OnClickListener) : ViewController<TitleBarReactButtonView>(activity, button.id, YellowBoxDelegate(activity), Options(), ViewControllerOverlay(activity)), MenuItem.OnMenuItemClickListener {
24
25
 
25
- private var menuItem: MenuItem? = null
26
+ var menuItem: MenuItem? = null
27
+ private set
26
28
 
27
29
  interface OnClickListener {
28
30
  fun onPress(button: ButtonOptions)
@@ -113,4 +115,8 @@ open class ButtonController(activity: Activity,
113
115
  }
114
116
  }
115
117
 
118
+ fun getNullableView(): View?{
119
+ return view
120
+ }
121
+
116
122
  }
@@ -5,18 +5,17 @@ import android.graphics.Color;
5
5
  import android.graphics.drawable.ColorDrawable;
6
6
  import android.graphics.drawable.Drawable;
7
7
  import android.graphics.drawable.LayerDrawable;
8
- import android.os.Build;
9
8
  import android.view.View;
9
+ import android.view.ViewGroup;
10
10
  import android.view.ViewGroup.MarginLayoutParams;
11
11
  import android.view.Window;
12
12
 
13
- import androidx.core.content.ContextCompat;
14
-
15
13
  import com.reactnativenavigation.options.NavigationBarOptions;
16
14
  import com.reactnativenavigation.options.Options;
17
15
  import com.reactnativenavigation.options.OrientationOptions;
18
16
  import com.reactnativenavigation.options.StatusBarOptions;
19
17
  import com.reactnativenavigation.options.StatusBarOptions.TextColorScheme;
18
+ import com.reactnativenavigation.options.layout.LayoutInsets;
20
19
  import com.reactnativenavigation.options.params.Bool;
21
20
  import com.reactnativenavigation.utils.SystemUiUtils;
22
21
  import com.reactnativenavigation.viewcontrollers.parent.ParentController;
@@ -25,6 +24,7 @@ import com.reactnativenavigation.viewcontrollers.navigator.Navigator;
25
24
  public class Presenter {
26
25
  private final Activity activity;
27
26
  private Options defaultOptions;
27
+
28
28
  public Presenter(Activity activity, Options defaultOptions) {
29
29
  this.activity = activity;
30
30
  this.defaultOptions = defaultOptions;
@@ -40,9 +40,15 @@ public class Presenter {
40
40
  }
41
41
 
42
42
  public void mergeOptions(ViewController<?> viewController, Options options) {
43
- final Options withDefaults = viewController.resolveCurrentOptions().copy().mergeWith(options).withDefaultOptions(defaultOptions);
43
+ final Options withDefaults = viewController.resolveCurrentOptions().copy().mergeWith(options).withDefaultOptions(defaultOptions);
44
44
  mergeStatusBarOptions(viewController.getView(), withDefaults.statusBar);
45
45
  mergeNavigationBarOptions(withDefaults.navigationBar);
46
+ applyLayoutInsetsOnMostTopParent(viewController,withDefaults.layout.getInsets());
47
+ }
48
+
49
+ private void applyLayoutInsetsOnMostTopParent(ViewController<?> viewController, LayoutInsets layoutInsets) {
50
+ final ViewController<?> topMostParent = viewController.getTopMostParent();
51
+ applyLayoutInsets(topMostParent.getView(), layoutInsets);
46
52
  }
47
53
 
48
54
  public void applyOptions(ViewController view, Options options) {
@@ -65,6 +71,16 @@ public class Presenter {
65
71
  private void applyViewOptions(ViewController view, Options options) {
66
72
  applyBackgroundColor(view, options);
67
73
  applyTopMargin(view.getView(), options);
74
+ applyLayoutInsetsOnMostTopParent(view, options.layout.getInsets());
75
+ }
76
+
77
+ private void applyLayoutInsets(ViewGroup view, LayoutInsets layoutInsets) {
78
+ if ( view!=null && layoutInsets.hasValue()) {
79
+ view.setPadding(layoutInsets.getLeft() == null ? view.getPaddingLeft() : layoutInsets.getLeft(),
80
+ layoutInsets.getTop() == null ? view.getPaddingTop() : layoutInsets.getTop(),
81
+ layoutInsets.getRight() == null ?view.getPaddingRight() : layoutInsets.getRight(),
82
+ layoutInsets.getBottom() == null ? view.getPaddingBottom() : layoutInsets.getBottom());
83
+ }
68
84
  }
69
85
 
70
86
  private void applyTopMargin(View view, Options options) {
@@ -209,12 +225,12 @@ public class Presenter {
209
225
  }
210
226
 
211
227
  private void setNavigationBarBackgroundColor(NavigationBarOptions navigationBar) {
212
- int navigationBarDefaultColor = SystemUiUtils.INSTANCE.getNavigationBarDefaultColor();
213
- navigationBarDefaultColor = navigationBarDefaultColor==-1?Color.BLACK:navigationBarDefaultColor;
228
+ int navigationBarDefaultColor = SystemUiUtils.INSTANCE.getNavigationBarDefaultColor();
229
+ navigationBarDefaultColor = navigationBarDefaultColor == -1 ? Color.BLACK : navigationBarDefaultColor;
214
230
  if (navigationBar.backgroundColor.canApplyValue()) {
215
231
  int color = navigationBar.backgroundColor.get(navigationBarDefaultColor);
216
232
  SystemUiUtils.setNavigationBarBackgroundColor(activity.getWindow(), color, isColorLight(color));
217
- }else{
233
+ } else {
218
234
  SystemUiUtils.setNavigationBarBackgroundColor(activity.getWindow(), navigationBarDefaultColor, isColorLight(navigationBarDefaultColor));
219
235
 
220
236
  }
@@ -11,7 +11,6 @@ import androidx.annotation.VisibleForTesting;
11
11
  import androidx.coordinatorlayout.widget.CoordinatorLayout;
12
12
 
13
13
  import kotlin.Unit;
14
- import kotlin.jvm.functions.Function0;
15
14
 
16
15
  import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
17
16
 
@@ -1,5 +1,8 @@
1
1
  package com.reactnativenavigation.viewcontrollers.viewcontroller;
2
2
 
3
+ import static com.reactnativenavigation.utils.CollectionUtils.forEach;
4
+ import static com.reactnativenavigation.utils.ObjectUtils.perform;
5
+
3
6
  import android.app.Activity;
4
7
  import android.content.res.Configuration;
5
8
  import android.view.View;
@@ -9,11 +12,13 @@ import android.view.ViewTreeObserver;
9
12
 
10
13
  import androidx.annotation.CallSuper;
11
14
  import androidx.annotation.CheckResult;
15
+ import androidx.annotation.NonNull;
12
16
  import androidx.annotation.Nullable;
13
17
  import androidx.annotation.VisibleForTesting;
14
18
  import androidx.coordinatorlayout.widget.CoordinatorLayout;
15
19
 
16
20
  import com.reactnativenavigation.options.Options;
21
+ import com.reactnativenavigation.options.OverlayAttachOptions;
17
22
  import com.reactnativenavigation.options.params.Bool;
18
23
  import com.reactnativenavigation.options.params.NullBool;
19
24
  import com.reactnativenavigation.react.CommandListener;
@@ -25,15 +30,13 @@ import com.reactnativenavigation.viewcontrollers.parent.ParentController;
25
30
  import com.reactnativenavigation.viewcontrollers.stack.StackController;
26
31
  import com.reactnativenavigation.viewcontrollers.viewcontroller.overlay.ViewControllerOverlay;
27
32
  import com.reactnativenavigation.views.BehaviourAdapter;
33
+ import com.reactnativenavigation.views.overlay.ViewTooltip;
28
34
  import com.reactnativenavigation.views.component.Component;
29
35
  import com.reactnativenavigation.views.component.Renderable;
30
36
 
31
37
  import java.util.ArrayList;
32
38
  import java.util.List;
33
39
 
34
- import static com.reactnativenavigation.utils.CollectionUtils.forEach;
35
- import static com.reactnativenavigation.utils.ObjectUtils.perform;
36
-
37
40
  public abstract class ViewController<T extends ViewGroup> implements ViewTreeObserver.OnGlobalLayoutListener,
38
41
  ViewGroup.OnHierarchyChangeListener,
39
42
  BehaviourAdapter {
@@ -157,6 +160,14 @@ public abstract class ViewController<T extends ViewGroup> implements ViewTreeObs
157
160
  }
158
161
  }
159
162
 
163
+ public ViewController<?> getTopMostParent(){
164
+ if(parentController!=null){
165
+ return parentController.getTopMostParent();
166
+ }else{
167
+ return this;
168
+ }
169
+ }
170
+
160
171
  @CallSuper
161
172
  public void applyOptions(Options options) {
162
173
 
@@ -289,6 +300,7 @@ public abstract class ViewController<T extends ViewGroup> implements ViewTreeObs
289
300
  if (view.getParent() instanceof ViewGroup) {
290
301
  ((ViewManager) view.getParent()).removeView(view);
291
302
  }
303
+ setParentController(null);
292
304
  view = null;
293
305
  isDestroyed = true;
294
306
  }
@@ -383,6 +395,15 @@ public abstract class ViewController<T extends ViewGroup> implements ViewTreeObs
383
395
 
384
396
  }
385
397
 
398
+ protected View findTooltipAnchorView(OverlayAttachOptions options) {
399
+ return null;
400
+ }
401
+
402
+ public ViewTooltip.TooltipView showAnchoredOverlay(@NonNull View anchorView,
403
+ @NonNull OverlayAttachOptions overlayAttachOptions,
404
+ @NonNull ViewController<?> overlayViewController) {
405
+ return null;
406
+ }
386
407
  public int getBottomInset() {
387
408
  return perform(parentController, 0, p -> p.getBottomInset(this));
388
409
  }