@@ -140,6 +140,7 @@ import com.duckduckgo.app.browser.menu.VpnMenuStore
140140import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials
141141import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
142142import com.duckduckgo.app.browser.model.LongPressTarget
143+ import com.duckduckgo.app.browser.navigation.bar.BrowserNavigationBarViewIntegration
143144import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarObserver
144145import com.duckduckgo.app.browser.newtab.NewTabPageProvider
145146import com.duckduckgo.app.browser.omnibar.Omnibar
@@ -644,6 +645,8 @@ class BrowserTabFragment :
644645
645646 private val binding: FragmentBrowserTabBinding by viewBinding()
646647
648+ private lateinit var browserNavigationBarIntegration: BrowserNavigationBarViewIntegration
649+
647650 private lateinit var omnibar: Omnibar
648651
649652 private lateinit var webViewContainer: FrameLayout
@@ -924,7 +927,7 @@ class BrowserTabFragment :
924927 }
925928
926929 InputScreenActivityResultCodes .MENU_REQUESTED -> {
927- launchPopupMenu()
930+ launchPopupMenu(omnibarFeatureRepository.isSplitOmnibarEnabled )
928931 }
929932
930933 InputScreenActivityResultCodes .TAB_SWITCHER_REQUESTED -> {
@@ -1021,7 +1024,7 @@ class BrowserTabFragment :
10211024 omnibar = Omnibar (
10221025 omnibarType = settingsDataStore.omnibarType,
10231026 binding = binding,
1024- isUnifiedOmnibarEnabled = omnibarFeatureRepository.isUnifiedOmnibarEnabled ,
1027+ isUnifiedOmnibarEnabled = omnibarFeatureRepository.isUnifiedOmnibarFlagEnabled ,
10251028 )
10261029
10271030 webViewContainer = binding.webViewContainer
@@ -1189,6 +1192,14 @@ class BrowserTabFragment :
11891192 viewModel.onNavigationBarBookmarksButtonClicked()
11901193 }
11911194 }
1195+
1196+ browserNavigationBarIntegration = BrowserNavigationBarViewIntegration (
1197+ lifecycleScope = lifecycleScope,
1198+ browserTabFragmentBinding = binding,
1199+ isEnabled = omnibarFeatureRepository.isSplitOmnibarEnabled,
1200+ omnibar = omnibar,
1201+ browserNavigationBarObserver = observer,
1202+ )
11921203 }
11931204
11941205 private fun configureEditModeChangeDetection () {
@@ -1272,6 +1283,8 @@ class BrowserTabFragment :
12721283 )
12731284 requireActivity().window.navigationBarColor = customTabToolbarColor
12741285 requireActivity().window.statusBarColor = customTabToolbarColor
1286+
1287+ browserNavigationBarIntegration.configureCustomTab()
12751288 }
12761289 }
12771290
@@ -1283,8 +1296,8 @@ class BrowserTabFragment :
12831296 private fun createPopupMenu () {
12841297 val popupMenuResourceType =
12851298 when (omnibar.omnibarType) {
1286- OmnibarType .SINGLE_TOP , OmnibarType . SPLIT -> BrowserPopupMenu .ResourceType .TOP
1287- OmnibarType .SINGLE_BOTTOM -> BrowserPopupMenu .ResourceType .BOTTOM
1299+ OmnibarType .SINGLE_TOP -> BrowserPopupMenu .ResourceType .TOP
1300+ OmnibarType .SINGLE_BOTTOM , OmnibarType . SPLIT -> BrowserPopupMenu .ResourceType .BOTTOM
12881301 }
12891302
12901303 popupMenu =
@@ -1409,7 +1422,7 @@ class BrowserTabFragment :
14091422 startActivity(intent)
14101423 }
14111424
1412- private fun launchPopupMenu () {
1425+ private fun launchPopupMenu (anchorToNavigationBar : Boolean ) {
14131426 val isFocusedNtp = omnibar.viewMode == ViewMode .NewTab && omnibar.getText().isEmpty() && omnibar.omnibarTextInput.hasFocus()
14141427
14151428 // small delay added to let keyboard disappear and avoid jarring transition
@@ -1424,7 +1437,12 @@ class BrowserTabFragment :
14241437 }
14251438 }
14261439
1427- popupMenu.show(binding.rootView, omnibar.toolbar)
1440+ if (anchorToNavigationBar) {
1441+ val anchorView = browserNavigationBarIntegration.navigationBarView.popupMenuAnchor
1442+ popupMenu.showAnchoredView(requireActivity(), binding.rootView, anchorView)
1443+ } else {
1444+ popupMenu.show(binding.rootView, omnibar.toolbar)
1445+ }
14281446 viewModel.onPopupMenuLaunched()
14291447 if (isActiveCustomTab()) {
14301448 pixel.fire(CustomTabPixelNames .CUSTOM_TABS_MENU_OPENED )
@@ -1516,6 +1534,7 @@ class BrowserTabFragment :
15161534 webView?.removeEnableSwipeRefreshCallback()
15171535 webView?.stopNestedScroll()
15181536 webView?.stopLoading()
1537+ browserNavigationBarIntegration.onDestroyView()
15191538 super .onDestroyView()
15201539 }
15211540
@@ -1697,6 +1716,8 @@ class BrowserTabFragment :
16971716 errorView.errorLayout.gone()
16981717 sslErrorView.gone()
16991718 maliciousWarningView.gone()
1719+
1720+ browserNavigationBarIntegration.configureNewTabViewMode()
17001721 }
17011722
17021723 private fun showBrowser () {
@@ -1710,6 +1731,8 @@ class BrowserTabFragment :
17101731 sslErrorView.gone()
17111732 maliciousWarningView.gone()
17121733 omnibar.setViewMode(ViewMode .Browser (viewModel.url))
1734+
1735+ browserNavigationBarIntegration.configureBrowserViewMode()
17131736 }
17141737
17151738 private fun showError (
@@ -1731,6 +1754,8 @@ class BrowserTabFragment :
17311754 errorView.yetiIcon.setImageResource(com.duckduckgo.mobile.android.R .drawable.ic_yeti_dark)
17321755 }
17331756 errorView.errorLayout.show()
1757+
1758+ browserNavigationBarIntegration.configureBrowserViewMode()
17341759 }
17351760
17361761 private fun showMaliciousWarning (
@@ -1769,6 +1794,8 @@ class BrowserTabFragment :
17691794 isMainframe = isMainframe,
17701795 ),
17711796 )
1797+
1798+ browserNavigationBarIntegration.configureBrowserViewMode()
17721799 }
17731800
17741801 private fun hideMaliciousWarning (canGoBack : Boolean ) {
@@ -1843,6 +1870,8 @@ class BrowserTabFragment :
18431870 viewModel.onSSLCertificateWarningAction(action, errorResponse.url)
18441871 }
18451872 sslErrorView.show()
1873+
1874+ browserNavigationBarIntegration.configureBrowserViewMode()
18461875 }
18471876
18481877 private fun hideSSLWarning () {
@@ -2284,7 +2313,7 @@ class BrowserTabFragment :
22842313 is Command .ShowAutoconsentAnimation -> showAutoconsentAnimation(it.isCosmetic)
22852314
22862315 is Command .LaunchPopupMenu -> {
2287- launchPopupMenu()
2316+ launchPopupMenu(it.anchorToNavigationBar )
22882317 hideKeyboard()
22892318 }
22902319
@@ -3894,7 +3923,6 @@ class BrowserTabFragment :
38943923 logcat(VERBOSE ) { " Keyboard now hiding" }
38953924 hideKeyboard(omnibar.omnibarTextInput)
38963925 binding.focusDummy.requestFocus()
3897- omnibar.showOutline(false )
38983926 }
38993927 }
39003928
@@ -3919,7 +3947,6 @@ class BrowserTabFragment :
39193947 if (! isHidden) {
39203948 logcat(VERBOSE ) { " Keyboard now showing" }
39213949 showKeyboard(omnibar.omnibarTextInput)
3922- omnibar.showOutline(true )
39233950 }
39243951 }
39253952
@@ -4538,6 +4565,8 @@ class BrowserTabFragment :
45384565 webView?.setBottomMatchingBehaviourEnabled(true ) // only execute if animation is playing
45394566 }
45404567
4568+ browserNavigationBarIntegration.configureFireButtonHighlight(highlighted = viewState.fireButton.isHighlighted())
4569+
45414570 popupMenu.renderState(browserShowing, viewState, tabDisplayedInCustomTabScreen)
45424571
45434572 renderFullscreenMode(viewState)
@@ -4868,6 +4897,8 @@ class BrowserTabFragment :
48684897 omnibar.setViewMode(ViewMode .NewTab )
48694898 omnibar.isScrollingEnabled = false
48704899
4900+ browserNavigationBarIntegration.configureNewTabViewMode()
4901+
48714902 viewModel.onNewTabShown()
48724903 }
48734904
0 commit comments