Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -990,6 +990,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
if (this::omnibarToolbarMockupBottomBinding.isInitialized) {
omnibarToolbarMockupBottomBinding.appBarLayoutMockup.visibility = View.GONE
}
binding.navigationBarMockup.root.gone()
},
300,
)
Expand Down Expand Up @@ -1399,11 +1400,11 @@ open class BrowserActivity : DuckDuckGoActivity() {
when (settingsDataStore.omnibarType) {
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> {
if (Build.VERSION.SDK_INT < 28) {
binding.topMockupSingleToolbar.mockOmniBarContainerShadow.cardElevation = 2f.toPx(this)
binding.topMockupToolbar.mockOmniBarContainerShadow.cardElevation = 2f.toPx(this)
}

binding.bottomMockupSingleToolbar.appBarLayoutMockup.gone()
omnibarToolbarMockupBinding = binding.topMockupSingleToolbar
binding.bottomMockupToolbar.appBarLayoutMockup.gone()
omnibarToolbarMockupBinding = binding.topMockupToolbar

if (!duckAiFeatureState.showOmnibarShortcutOnNtpAndOnFocus.value) {
omnibarToolbarMockupBinding.aiChatIconMockup.isVisible = false
Expand All @@ -1412,15 +1413,22 @@ open class BrowserActivity : DuckDuckGoActivity() {
if (Build.VERSION.SDK_INT >= 28) {
omnibarToolbarMockupBinding.mockOmniBarContainerShadow.addBottomShadow()
}

if (settingsDataStore.omnibarType == OmnibarType.SPLIT) {
binding.topMockupToolbar.tabsMenu.gone()
binding.topMockupToolbar.browserMenu.gone()
binding.topMockupToolbar.fireIconMenu.gone()
binding.navigationBarMockup.root.show()
}
}

OmnibarType.SINGLE_BOTTOM -> {
if (Build.VERSION.SDK_INT < 28) {
binding.bottomMockupSingleToolbar.mockOmniBarContainerShadow.cardElevation = 0.5f.toPx(this)
binding.bottomMockupToolbar.mockOmniBarContainerShadow.cardElevation = 0.5f.toPx(this)
}

binding.topMockupSingleToolbar.appBarLayoutMockup.gone()
omnibarToolbarMockupBottomBinding = binding.bottomMockupSingleToolbar
binding.topMockupToolbar.appBarLayoutMockup.gone()
omnibarToolbarMockupBottomBinding = binding.bottomMockupToolbar

if (!duckAiFeatureState.showOmnibarShortcutOnNtpAndOnFocus.value) {
omnibarToolbarMockupBottomBinding.aiChatIconMockup.isVisible = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -930,7 +930,10 @@ class BrowserTabFragment :
}

InputScreenActivityResultCodes.MENU_REQUESTED -> {
launchPopupMenu(omnibarFeatureRepository.isSplitOmnibarEnabled)
launchPopupMenu(
anchorToNavigationBar = omnibarFeatureRepository.isSplitOmnibarEnabled,
addExtraDelay = omnibarFeatureRepository.isSplitOmnibarEnabled,
)
}

InputScreenActivityResultCodes.TAB_SWITCHER_REQUESTED -> {
Expand Down Expand Up @@ -1425,11 +1428,12 @@ class BrowserTabFragment :
startActivity(intent)
}

private fun launchPopupMenu(anchorToNavigationBar: Boolean) {
private fun launchPopupMenu(anchorToNavigationBar: Boolean, addExtraDelay: Boolean = false) {
val isFocusedNtp = omnibar.viewMode == ViewMode.NewTab && omnibar.getText().isEmpty() && omnibar.omnibarTextInput.hasFocus()

val delay = if (addExtraDelay) POPUP_MENU_DELAY * 2 else POPUP_MENU_DELAY
// small delay added to let keyboard disappear and avoid jarring transition
binding.rootView.postDelayed(POPUP_MENU_DELAY) {
binding.rootView.postDelayed(delay) {
if (isAdded) {
// Check if VPN menu item will be shown to non-subscribed user and increment count
val currentViewState = viewModel.browserViewState.value
Expand Down Expand Up @@ -1631,7 +1635,7 @@ class BrowserTabFragment :
.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED)
.collectLatest { hasFavorites ->
binding.includeNewBrowserTab.topNtpOutlineStroke.isVisible = hasFavorites
binding.includeNewBrowserTab.bottomNtpOutlineStroke.isVisible = hasFavorites
binding.includeNewBrowserTab.bottomNtpOutlineStroke.isVisible = hasFavorites && !omnibarFeatureRepository.isSplitOmnibarEnabled
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,9 @@ class BrowserNavigationBarViewModel @Inject constructor(
}

data class ViewState(
val isVisible: Boolean = false,
val newTabButtonVisible: Boolean = false,
val autofillButtonVisible: Boolean = true,
val isVisible: Boolean = true,
val newTabButtonVisible: Boolean = true,
val autofillButtonVisible: Boolean = false,
val bookmarksButtonVisible: Boolean = true,
val fireButtonVisible: Boolean = true,
val fireButtonHighlighted: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,16 @@ class Omnibar(
binding.rootView.removeView(binding.singleOmnibarLayoutBottom)

return when (omnibarType) {
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> {
OmnibarType.SINGLE_TOP -> {
binding.rootView.removeView(binding.omnibarLayoutBottom)
binding.omnibarLayoutTop
}

OmnibarType.SPLIT -> {
binding.rootView.removeView(binding.omnibarLayoutBottom)
binding.bottomBrowserOutlineStroke.gone()
binding.includeNewBrowserTab.bottomNtpOutlineStroke.gone()
binding.omnibarLayoutTop
}
OmnibarType.SINGLE_BOTTOM -> {
binding.rootView.removeView(binding.omnibarLayoutTop)
adjustCoordinatorLayoutBehaviorForBottomOmnibar()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -779,9 +779,12 @@ class OmnibarLayout @JvmOverloads constructor(
showSpacer = viewState.showClearButton || viewState.showVoiceSearch,
)

if (omnibarAnimationManager.isFeatureEnabled() &&
previousTransitionState != null &&
newTransitionState != previousTransitionState
if (omnibarAnimationManager.isFeatureEnabled() && previousTransitionState != null &&
(
newTransitionState.showFireIcon != previousTransitionState?.showFireIcon ||
newTransitionState.showTabsMenu != previousTransitionState?.showTabsMenu ||
newTransitionState.showBrowserMenu != previousTransitionState?.showBrowserMenu
)
) {
TransitionManager.beginDelayedTransition(toolbarContainer, omniBarButtonTransitionSet)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique
import com.duckduckgo.app.tabs.model.TabRepository
import com.duckduckgo.app.trackerdetection.model.Entity
import com.duckduckgo.browser.api.UserBrowserProperties
import com.duckduckgo.browser.ui.omnibar.OmnibarType
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.FragmentScope
import com.duckduckgo.duckchat.api.DuckAiFeatureState
Expand Down Expand Up @@ -103,9 +104,14 @@ class OmnibarLayoutViewModel @Inject constructor(
private val serpEasterEggLogosToggles: SerpEasterEggLogosToggles,
) : ViewModel() {

private val isSplitOmnibarEnabled = settingsDataStore.omnibarType == OmnibarType.SPLIT

private val _viewState = MutableStateFlow(
ViewState(
showChatMenu = duckAiFeatureState.showOmnibarShortcutInAllStates.value,
showFireIcon = !isSplitOmnibarEnabled,
showTabsMenu = !isSplitOmnibarEnabled,
showBrowserMenu = !isSplitOmnibarEnabled,
),
)

Expand Down Expand Up @@ -256,7 +262,7 @@ class OmnibarLayoutViewModel @Inject constructor(
) {
logcat { "Omnibar: onOmnibarFocusChanged" }
val showClearButton = hasFocus && inputFieldText.isNotBlank()
val showControls = inputFieldText.isBlank()
val showControls = inputFieldText.isBlank() && !isSplitOmnibarEnabled

if (hasFocus) {
viewModelScope.launch {
Expand Down Expand Up @@ -326,9 +332,9 @@ class OmnibarLayoutViewModel @Inject constructor(
previousLeadingIconState = null,
highlightFireButton = HighlightableButton.Visible(highlighted = false),
showClearButton = false,
showTabsMenu = true,
showFireIcon = true,
showBrowserMenu = true,
showTabsMenu = !isSplitOmnibarEnabled,
showFireIcon = !isSplitOmnibarEnabled,
showBrowserMenu = !isSplitOmnibarEnabled,
showVoiceSearch = shouldShowVoiceSearch(
hasFocus = false,
query = _viewState.value.omnibarText,
Expand Down Expand Up @@ -481,17 +487,16 @@ class OmnibarLayoutViewModel @Inject constructor(
AppPixelName.ADDRESS_BAR_SERP_ENTRY_CLEARED,
AppPixelName.ADDRESS_BAR_WEBSITE_ENTRY_CLEARED,
)
val showControls = true

_viewState.update {
it.copy(
omnibarText = "",
updateOmnibarText = true,
expanded = true,
showClearButton = false,
showBrowserMenu = showControls,
showTabsMenu = showControls,
showFireIcon = showControls,
showBrowserMenu = !isSplitOmnibarEnabled,
showTabsMenu = !isSplitOmnibarEnabled,
showFireIcon = !isSplitOmnibarEnabled,
)
}
}
Expand Down Expand Up @@ -546,7 +551,7 @@ class OmnibarLayoutViewModel @Inject constructor(
deleteLastCharacter: Boolean,
) {
val showClearButton = hasFocus && query.isNotBlank()
val showControls = !hasFocus || query.isBlank()
val showControls = (!hasFocus || query.isBlank()) && !isSplitOmnibarEnabled

logcat { "Omnibar: onInputStateChanged query $query hasFocus $hasFocus clearQuery $clearQuery deleteLastCharacter $deleteLastCharacter" }

Expand Down
Loading
Loading