From 930f76ea29c748d11059b7cb1549e4d0ac42c0c1 Mon Sep 17 00:00:00 2001 From: 0nko Date: Thu, 20 Nov 2025 20:32:30 +0100 Subject: [PATCH 1/4] Remove SingleOmnibarLayout and LegacyOmnibarLayout --- .../browser/omnibar/LegacyOmnibarLayout.kt | 1013 ----------------- .../browser/omnibar/SingleOmnibarLayout.kt | 241 ---- 2 files changed, 1254 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/browser/omnibar/LegacyOmnibarLayout.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/browser/omnibar/SingleOmnibarLayout.kt diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/LegacyOmnibarLayout.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/LegacyOmnibarLayout.kt deleted file mode 100644 index 97e5122f922e..000000000000 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/LegacyOmnibarLayout.kt +++ /dev/null @@ -1,1013 +0,0 @@ -/* - * Copyright (c) 2024 DuckDuckGo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.duckduckgo.app.browser.omnibar - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.text.Editable -import android.transition.ChangeBounds -import android.transition.Fade -import android.transition.TransitionManager -import android.transition.TransitionSet -import android.util.AttributeSet -import android.view.KeyEvent -import android.view.View -import android.view.ViewGroup -import android.view.animation.OvershootInterpolator -import android.view.inputmethod.EditorInfo -import android.widget.FrameLayout -import android.widget.ImageView -import android.widget.ProgressBar -import android.widget.TextView -import androidx.appcompat.widget.Toolbar -import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.transition.doOnEnd -import androidx.core.view.doOnLayout -import androidx.core.view.isInvisible -import androidx.core.view.isVisible -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.findViewTreeLifecycleOwner -import androidx.lifecycle.findViewTreeViewModelStoreOwner -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope -import com.airbnb.lottie.LottieAnimationView -import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade -import com.duckduckgo.anvil.annotations.InjectWith -import com.duckduckgo.app.browser.PulseAnimation -import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.SmoothProgressAnimator -import com.duckduckgo.app.browser.animations.AddressBarTrackersAnimationFeatureToggle -import com.duckduckgo.app.browser.databinding.IncludeCustomTabToolbarBinding -import com.duckduckgo.app.browser.databinding.IncludeFindInPageBinding -import com.duckduckgo.app.browser.omnibar.Omnibar.InputScreenLaunchListener -import com.duckduckgo.app.browser.omnibar.Omnibar.ItemPressedListener -import com.duckduckgo.app.browser.omnibar.Omnibar.LogoClickListener -import com.duckduckgo.app.browser.omnibar.Omnibar.OmnibarTextState -import com.duckduckgo.app.browser.omnibar.Omnibar.TextListener -import com.duckduckgo.app.browser.omnibar.Omnibar.ViewMode -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.LaunchInputScreen -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.MoveCaretToFront -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartCookiesAnimation -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.StartTrackersAnimation -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.EasterEggLogo -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.PrivacyShield -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.ViewState -import com.duckduckgo.app.browser.omnibar.animations.addressbar.BrowserTrackersAnimatorHelper -import com.duckduckgo.app.browser.omnibar.animations.addressbar.PrivacyShieldAnimationHelper -import com.duckduckgo.app.browser.omnibar.animations.addressbar.TrackersAnimatorListener -import com.duckduckgo.app.browser.omnibar.animations.omnibaranimation.OmnibarAnimationManager -import com.duckduckgo.app.browser.omnibar.model.Decoration -import com.duckduckgo.app.browser.omnibar.model.Decoration.ChangeCustomTabTitle -import com.duckduckgo.app.browser.omnibar.model.Decoration.DisableVoiceSearch -import com.duckduckgo.app.browser.omnibar.model.Decoration.HighlightOmnibarItem -import com.duckduckgo.app.browser.omnibar.model.Decoration.LaunchCookiesAnimation -import com.duckduckgo.app.browser.omnibar.model.Decoration.LaunchTrackersAnimation -import com.duckduckgo.app.browser.omnibar.model.Decoration.Mode -import com.duckduckgo.app.browser.omnibar.model.Decoration.PrivacyShieldChanged -import com.duckduckgo.app.browser.omnibar.model.Decoration.QueueCookiesAnimation -import com.duckduckgo.app.browser.omnibar.model.StateChange -import com.duckduckgo.app.global.view.renderIfChanged -import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager -import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.trackerdetection.model.Entity -import com.duckduckgo.browser.ui.tabs.TabSwitcherButton -import com.duckduckgo.common.ui.DuckDuckGoActivity -import com.duckduckgo.common.ui.view.KeyboardAwareEditText -import com.duckduckgo.common.ui.view.KeyboardAwareEditText.ShowSuggestionsListener -import com.duckduckgo.common.ui.view.gone -import com.duckduckgo.common.ui.view.hide -import com.duckduckgo.common.ui.view.show -import com.duckduckgo.common.utils.ConflatedJob -import com.duckduckgo.common.utils.DispatcherProvider -import com.duckduckgo.common.utils.FragmentViewModelFactory -import com.duckduckgo.common.utils.extensions.replaceTextChangedListener -import com.duckduckgo.common.utils.text.TextChangedWatcher -import com.duckduckgo.di.scopes.FragmentScope -import com.duckduckgo.duckchat.api.DuckAiFeatureState -import com.duckduckgo.duckchat.api.DuckChat -import com.duckduckgo.serp.logos.api.SerpEasterEggLogosToggles -import com.duckduckgo.serp.logos.api.SerpLogos -import com.google.android.material.appbar.AppBarLayout -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch -import logcat.logcat -import javax.inject.Inject -import kotlin.collections.isNotEmpty -import com.duckduckgo.app.global.model.PrivacyShield as PrivacyShieldState -import com.duckduckgo.mobile.android.R as CommonR - -@InjectWith(FragmentScope::class) -open class LegacyOmnibarLayout @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, -) : AppBarLayout(context, attrs, defStyle), - OmnibarView, - OmnibarBehaviour, - TrackersAnimatorListener { - data class TransitionState( - val showClearButton: Boolean, - val showVoiceSearch: Boolean, - val showTabsMenu: Boolean, - val showFireIcon: Boolean, - val showBrowserMenu: Boolean, - val showBrowserMenuHighlight: Boolean, - val showChatMenu: Boolean, - val showSpacer: Boolean, - ) - - @Inject - lateinit var viewModelFactory: FragmentViewModelFactory - - @Inject - lateinit var privacyShieldView: PrivacyShieldAnimationHelper - - @Inject - lateinit var animatorHelper: BrowserTrackersAnimatorHelper - - @Inject - lateinit var pixel: Pixel - - @Inject - lateinit var duckChat: DuckChat - - @Inject - lateinit var duckAiFeatureState: DuckAiFeatureState - - @Inject - lateinit var dispatchers: DispatcherProvider - - @Inject - lateinit var omnibarAnimationManager: OmnibarAnimationManager - - @Inject - lateinit var onboardingDesignExperimentManager: OnboardingDesignExperimentManager - - @Inject - lateinit var serpLogos: SerpLogos - - @Inject - lateinit var serpEasterEggLogosToggles: SerpEasterEggLogosToggles - - @Inject - lateinit var addressBarTrackersAnimationFeatureToggle: AddressBarTrackersAnimationFeatureToggle - - private var previousTransitionState: TransitionState? = null - - private val lifecycleOwner: LifecycleOwner by lazy { - requireNotNull(findViewTreeLifecycleOwner()) - } - - private val pulseAnimation: PulseAnimation by lazy { - PulseAnimation(lifecycleOwner, onboardingDesignExperimentManager) - } - - private var omnibarTextListener: TextListener? = null - private var omnibarItemPressedListener: ItemPressedListener? = null - private var omnibarInputScreenLaunchListener: InputScreenLaunchListener? = null - private var omnibarLogoClickedListener: LogoClickListener? = null - - private var decoration: Decoration? = null - private var lastViewMode: Mode? = null - private var stateBuffer: MutableList = mutableListOf() - - override val findInPage: IncludeFindInPageBinding by lazy { - IncludeFindInPageBinding.bind(findViewById(R.id.findInPage)) - } - override val omnibarTextInput: KeyboardAwareEditText by lazy { findViewById(R.id.omnibarTextInput) } - internal val tabsMenu: TabSwitcherButton by lazy { findViewById(R.id.tabsMenu) } - internal val fireIconMenu: FrameLayout by lazy { findViewById(R.id.fireIconMenu) } - internal val aiChatMenu: View? by lazy { findViewById(R.id.aiChatIconMenu) } - private val aiChatDivider: View by lazy { findViewById(R.id.verticalDivider) } - internal val browserMenu: FrameLayout by lazy { findViewById(R.id.browserMenu) } - internal val browserMenuHighlight: View by lazy { findViewById(R.id.browserMenuHighlight) } - internal val animatedIconBackgroundView: View by lazy { findViewById(R.id.animatedIconBackgroundView) } - internal val cookieAnimation: LottieAnimationView by lazy { findViewById(R.id.cookieAnimation) } - internal val sceneRoot: ViewGroup by lazy { findViewById(R.id.sceneRoot) } - override val omniBarContainer: View by lazy { findViewById(R.id.omniBarContainer) } - override val toolbar: Toolbar by lazy { findViewById(R.id.toolbar) } - internal val toolbarContainer: ViewGroup by lazy { findViewById(R.id.toolbarContainer) } - internal val customTabToolbarContainer by lazy { - IncludeCustomTabToolbarBinding.bind( - findViewById(R.id.customTabToolbarContainer), - ) - } - internal val browserMenuImageView: ImageView by lazy { findViewById(R.id.browserMenuImageView) } - override val shieldIcon: LottieAnimationView by lazy { findViewById(R.id.shieldIcon) } - internal val addressBarTrackersBlockedAnimationShieldIcon: LottieAnimationView by lazy { - findViewById(R.id.addressBarTrackersBlockedAnimationShieldIcon) - } - internal val pageLoadingIndicator: ProgressBar by lazy { findViewById(R.id.pageLoadingIndicator) } - internal val searchIcon: ImageView by lazy { findViewById(R.id.searchIcon) } - override val daxIcon: ImageView by lazy { findViewById(R.id.daxIcon) } - internal val globeIcon: ImageView by lazy { findViewById(R.id.globeIcon) } - internal val clearTextButton: ImageView by lazy { findViewById(R.id.clearTextButton) } - internal val fireIconImageView: ImageView by lazy { findViewById(R.id.fireIconImageView) } - internal val placeholder: View by lazy { findViewById(R.id.placeholder) } - internal val voiceSearchButton: ImageView by lazy { findViewById(R.id.voiceSearchButton) } - internal val trackersAnimation: LottieAnimationView by lazy { findViewById(R.id.trackersAnimation) } - internal val duckPlayerIcon: ImageView by lazy { findViewById(R.id.duckPlayerIcon) } - internal val omniBarButtonTransitionSet: TransitionSet by lazy { - TransitionSet().apply { - ordering = TransitionSet.ORDERING_TOGETHER - addTransition( - ChangeBounds().apply { - duration = omnibarAnimationManager.getChangeBoundsDuration() - interpolator = OvershootInterpolator(omnibarAnimationManager.getTension()) - }, - ) - addTransition( - Fade().apply { - duration = omnibarAnimationManager.getFadeDuration() - addTarget(clearTextButton) - addTarget(voiceSearchButton) - addTarget(fireIconMenu) - addTarget(tabsMenu) - addTarget(aiChatMenu) - addTarget(browserMenu) - }, - ) - } - } - private val omnibarTextInputClickCatcher: View by lazy { findViewById(R.id.omnibarTextInputClickCatcher) } - - internal fun omnibarViews(): List = - listOf( - clearTextButton, - omnibarTextInput, - searchIcon, - ) - - internal fun shieldViews(): List = - listOf( - shieldIcon, - ) - - override var isScrollingEnabled: Boolean - get() { - return if (isAttachedToWindow) { - viewModel.viewState.value.scrollingEnabled - } else { - true - } - } - set(value) { - if (isAttachedToWindow) { - viewModel.onOmnibarScrollingEnabledChanged(value) - } - } - - override val isEditing: Boolean - get() { - return if (isAttachedToWindow) { - viewModel.viewState.value.hasFocus - } else { - false - } - } - - override val isEditingFlow by lazy { - viewModel.viewState.map { - isAttachedToWindow && it.hasFocus - } - } - - override val omnibarType: OmnibarType = OmnibarType.SINGLE_TOP - - private val smoothProgressAnimator by lazy { SmoothProgressAnimator(pageLoadingIndicator) } - - protected val viewModel: OmnibarLayoutViewModel by lazy { - ViewModelProvider( - findViewTreeViewModelStoreOwner()!!, - viewModelFactory, - )[OmnibarLayoutViewModel::class.java] - } - - private val conflatedStateJob = ConflatedJob() - private val conflatedCommandJob = ConflatedJob() - - private var lastSeenPrivacyShield: PrivacyShieldState? = null - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - - val coroutineScope = requireNotNull(findViewTreeLifecycleOwner()?.lifecycleScope) - - conflatedStateJob += - coroutineScope.launch { - viewModel.viewState.flowWithLifecycle(lifecycleOwner.lifecycle).collectLatest { - render(it) - } - } - - conflatedCommandJob += - coroutineScope.launch { - viewModel.commands().flowWithLifecycle(lifecycleOwner.lifecycle).collectLatest { - processCommand(it) - } - } - - if (lastViewMode != null) { - logcat { "Omnibar: onAttachedToWindow lastViewMode $lastViewMode" } - decorateDeferred(lastViewMode!!) - lastViewMode = null - } - - if (decoration != null) { - logcat { "Omnibar: onAttachedToWindow decoration $decoration" } - decorateDeferred(decoration!!) - decoration = null - } - - if (stateBuffer.isNotEmpty()) { - stateBuffer.forEach { - reduce(it) - } - stateBuffer.clear() - } - - animatorHelper.setListener(this) - } - - override fun onDetachedFromWindow() { - conflatedStateJob.cancel() - conflatedCommandJob.cancel() - super.onDetachedFromWindow() - } - - @SuppressLint("ClickableViewAccessibility") - override fun setOmnibarTextListener(textListener: TextListener) { - omnibarTextListener = textListener - - omnibarTextInput.onFocusChangeListener = - OnFocusChangeListener { _, hasFocus: Boolean -> - if (isAttachedToWindow) { - viewModel.onOmnibarFocusChanged(hasFocus, omnibarTextInput.text.toString()) - omnibarTextListener?.onFocusChanged(hasFocus, omnibarTextInput.text.toString()) - } - } - - omnibarTextInput.onBackKeyListener = - object : KeyboardAwareEditText.OnBackKeyListener { - override fun onBackKey(): Boolean { - if (isAttachedToWindow) { - viewModel.onBackKeyPressed() - omnibarTextListener?.onBackKeyPressed() - } - return false - } - } - - omnibarTextInput.setOnEditorActionListener( - TextView.OnEditorActionListener { _, actionId, keyEvent -> - if (isAttachedToWindow) { - if (actionId == EditorInfo.IME_ACTION_GO || keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER) { - viewModel.onEnterKeyPressed() - omnibarTextListener?.onEnterPressed() - return@OnEditorActionListener true - } - } - false - }, - ) - - omnibarTextInput.setOnTouchListener { _, event -> - if (isAttachedToWindow) { - viewModel.onUserTouchedOmnibarTextInput(event.action) - } - false - } - - omnibarTextInput.replaceTextChangedListener( - object : TextChangedWatcher() { - var clearQuery = false - var deleteLastCharacter = false - - override fun afterTextChanged(editable: Editable) { - if (isAttachedToWindow) { - viewModel.onInputStateChanged( - omnibarTextInput.text.toString(), - omnibarTextInput.hasFocus(), - clearQuery, - deleteLastCharacter, - ) - } - omnibarTextListener?.onOmnibarTextChanged( - OmnibarTextState( - omnibarTextInput.text.toString(), - omnibarTextInput.hasFocus(), - ), - ) - } - - override fun beforeTextChanged( - s: CharSequence, - start: Int, - count: Int, - after: Int, - ) { - logcat { "Omnibar: $count characters beginning at $start are about to be replaced by new text with length $after" } - clearQuery = start == 0 && after == 0 - deleteLastCharacter = count == 1 && clearQuery - } - }, - ) - - omnibarTextInput.showSuggestionsListener = - object : ShowSuggestionsListener { - override fun showSuggestions() { - omnibarTextListener?.onShowSuggestions( - OmnibarTextState( - omnibarTextInput.text.toString(), - omnibarTextInput.hasFocus(), - ), - ) - } - } - } - - override fun setOmnibarItemPressedListener(itemPressedListener: ItemPressedListener) { - omnibarItemPressedListener = itemPressedListener - tabsMenu.setOnClickListener { - omnibarItemPressedListener?.onTabsButtonPressed() - } - tabsMenu.setOnLongClickListener { - omnibarItemPressedListener?.onTabsButtonLongPressed() - return@setOnLongClickListener true - } - fireIconMenu.setOnClickListener { - if (isAttachedToWindow) { - viewModel.onFireIconPressed(isPulseAnimationPlaying()) - } - omnibarItemPressedListener?.onFireButtonPressed() - } - browserMenu.setOnClickListener { - omnibarItemPressedListener?.onBrowserMenuPressed() - } - aiChatMenu?.setOnClickListener { - viewModel.onDuckChatButtonPressed() - omnibarItemPressedListener?.onDuckChatButtonPressed() - } - shieldIcon.setOnClickListener { - if (isAttachedToWindow) { - viewModel.onPrivacyShieldButtonPressed() - } - omnibarItemPressedListener?.onPrivacyShieldPressed() - } - clearTextButton.setOnClickListener { - if (isAttachedToWindow) { - viewModel.onClearTextButtonPressed() - } - } - voiceSearchButton.setOnClickListener { - omnibarItemPressedListener?.onVoiceSearchPressed() - } - } - - override fun setLogoClickListener(logoClickListener: LogoClickListener) { - omnibarLogoClickedListener = logoClickListener - } - - open fun render(viewState: ViewState) { - when (viewState.viewMode) { - is ViewMode.CustomTab -> { - renderCustomTabMode(viewState, viewState.viewMode) - } - - else -> { - renderBrowserMode(viewState) - } - } - - if (viewState.leadingIconState == PrivacyShield) { - renderPrivacyShield(viewState.privacyShield, viewState.viewMode) - } else { - lastSeenPrivacyShield = null - } - - renderButtons(viewState) - - omniBarButtonTransitionSet.doOnEnd { - omnibarTextInput.requestLayout() - } - } - - open fun processCommand(command: Command) { - when (command) { - Command.CancelAnimations -> { - cancelAddressBarAnimations() - } - - is StartCookiesAnimation -> { - createCookiesAnimation(command.isCosmetic) - } - - MoveCaretToFront -> { - moveCaretToFront() - } - - is StartTrackersAnimation -> { - startTrackersAnimation(command.entities) - } - - is LaunchInputScreen -> { - omnibarInputScreenLaunchListener?.launchInputScreen(query = command.query) - } - - is Command.EasterEggLogoClicked -> { - onLogoClicked(command.url) - } - } - } - - private fun moveCaretToFront() { - omnibarTextInput.post { - omnibarTextInput.setSelection(0) - } - } - - private fun renderTabIcon(viewState: ViewState) { - if (viewState.shouldUpdateTabsCount) { - tabsMenu.count = viewState.tabCount - tabsMenu.hasUnread = viewState.hasUnreadTabs - } - } - - private fun renderLeadingIconState(viewState: ViewState) { - when (val leadingIconState = viewState.leadingIconState) { - OmnibarLayoutViewModel.LeadingIconState.Search -> { - searchIcon.show() - shieldIcon.gone() - daxIcon.gone() - globeIcon.gone() - duckPlayerIcon.gone() - } - - PrivacyShield -> { - shieldIcon.show() - searchIcon.gone() - daxIcon.gone() - globeIcon.gone() - duckPlayerIcon.gone() - } - - OmnibarLayoutViewModel.LeadingIconState.Dax -> { - if (serpEasterEggLogosToggles.feature().isEnabled()) { - with(daxIcon) { - setOnClickListener(null) - show() - Glide - .with(this) - .load(CommonR.drawable.ic_ddg_logo) - .transition(withCrossFade()) - .placeholder(daxIcon.drawable) - .into(this) - } - } else { - daxIcon.show() - } - shieldIcon.gone() - searchIcon.gone() - globeIcon.gone() - duckPlayerIcon.gone() - } - - OmnibarLayoutViewModel.LeadingIconState.Globe -> { - globeIcon.show() - daxIcon.gone() - shieldIcon.gone() - searchIcon.gone() - duckPlayerIcon.gone() - } - - OmnibarLayoutViewModel.LeadingIconState.DuckPlayer -> { - globeIcon.gone() - daxIcon.gone() - shieldIcon.gone() - searchIcon.gone() - duckPlayerIcon.show() - } - - is EasterEggLogo -> { - daxIcon.show() - Glide - .with(daxIcon) - .load(leadingIconState.logoUrl) - .placeholder(daxIcon.drawable) - .transition(withCrossFade()) - .into(daxIcon) - daxIcon.setOnClickListener { - viewModel.onLogoClicked() - } - globeIcon.gone() - shieldIcon.gone() - searchIcon.gone() - duckPlayerIcon.gone() - } - } - } - - open fun renderButtons(viewState: ViewState) { - val newTransitionState = - TransitionState( - showClearButton = viewState.showClearButton, - showVoiceSearch = viewState.showVoiceSearch, - showTabsMenu = viewState.showTabsMenu && !viewState.showFindInPage, - showFireIcon = viewState.showFireIcon && !viewState.showFindInPage, - showBrowserMenu = viewState.showBrowserMenu && !viewState.showFindInPage, - showBrowserMenuHighlight = viewState.showBrowserMenuHighlight, - showChatMenu = viewState.showChatMenu, - showSpacer = viewState.showClearButton || viewState.showVoiceSearch, - ) - - if (omnibarAnimationManager.isFeatureEnabled() && - previousTransitionState != null && - newTransitionState != previousTransitionState - ) { - TransitionManager.beginDelayedTransition(toolbarContainer, omniBarButtonTransitionSet) - } - - clearTextButton.isVisible = viewState.showClearButton - voiceSearchButton.isVisible = viewState.showVoiceSearch - tabsMenu.isVisible = newTransitionState.showTabsMenu - fireIconMenu.isVisible = newTransitionState.showFireIcon - browserMenu.isVisible = newTransitionState.showBrowserMenu - browserMenuHighlight.isVisible = newTransitionState.showBrowserMenuHighlight - aiChatMenu?.isVisible = newTransitionState.showChatMenu - aiChatDivider.isVisible = (viewState.showVoiceSearch || viewState.showClearButton) && viewState.showChatMenu - - if (omnibarAnimationManager.isFeatureEnabled()) { - toolbarContainer.requestLayout() - } - - previousTransitionState = newTransitionState - - enableTextInputClickCatcher(viewState.showTextInputClickCatcher) - } - - private fun renderBrowserMode(viewState: ViewState) { - renderOutline(viewState.hasFocus) - if (viewState.updateOmnibarText) { - omnibarTextInput.setText(viewState.omnibarText) - } - if (viewState.expanded) { - setExpanded(true, viewState.expandedAnimated) - } - - if (viewState.isLoading) { - pageLoadingIndicator.show() - } - smoothProgressAnimator.onNewProgress(viewState.loadingProgress) { - if (!viewState.isLoading) { - pageLoadingIndicator.hide() - } - } - - isScrollingEnabled = viewState.scrollingEnabled - - renderTabIcon(viewState) - renderPulseAnimation(viewState) - - renderLeadingIconState(viewState) - } - - private fun renderCustomTabMode( - viewState: ViewState, - viewMode: ViewMode.CustomTab, - ) { - logcat { "Omnibar: renderCustomTabMode $viewState" } - configureCustomTabOmnibar(viewMode) - renderCustomTab(viewMode) - } - - override fun decorate(decoration: Decoration) { - logcat { "Omnibar: decorate $decoration" } - if (isAttachedToWindow) { - decorateDeferred(decoration) - } else { - /* TODO (cbarreiro): This is a temporary solution to prevent one-time decorations causing mode to be lost when view is not attached - * As a long-term solution, we should move mode to StateChange, and only have one-time decorations here - */ - if (decoration is Mode) { - val lastMode = lastViewMode?.viewMode - if (lastMode !is ViewMode.CustomTab) { - lastViewMode = decoration - } - this.decoration = null - } else if (this.decoration == null) { - this.decoration = decoration - } - } - } - - private fun decorateDeferred(decoration: Decoration) { - when (decoration) { - is Mode -> { - viewModel.onViewModeChanged(decoration.viewMode) - } - - is PrivacyShieldChanged -> { - viewModel.onPrivacyShieldChanged(decoration.privacyShield) - } - - Decoration.CancelAnimations -> { - cancelAddressBarAnimations() - } - - is LaunchTrackersAnimation -> { - viewModel.onAnimationStarted(decoration) - } - - is LaunchCookiesAnimation -> { - viewModel.onAnimationStarted(decoration) - } - - is QueueCookiesAnimation -> { - createCookiesAnimation(isCosmetic = decoration.isCosmetic, enqueueAnimation = true) - } - - is ChangeCustomTabTitle -> { - viewModel.onCustomTabTitleUpdate(decoration) - } - - is HighlightOmnibarItem -> { - viewModel.onHighlightItem(decoration) - } - - is DisableVoiceSearch -> { - viewModel.onVoiceSearchDisabled(decoration.url) - } - } - } - - override fun reduce(stateChange: StateChange) { - if (isAttachedToWindow) { - reduceDeferred(stateChange) - } else { - logcat { "Omnibar: reduce not attached saving $stateChange" } - this.stateBuffer.add(stateChange) - } - } - - private fun reduceDeferred(stateChange: StateChange) { - viewModel.onExternalStateChange(stateChange) - } - - private fun renderPulseAnimation(viewState: ViewState) { - val targetView = - if (viewState.highlightFireButton.isHighlighted() && viewState.showFireIcon) { - fireIconImageView - } else if (viewState.highlightPrivacyShield.isHighlighted() && viewState.leadingIconState == PrivacyShield) { - placeholder - } else { - null - } - - if (targetView != null) { - if (pulseAnimation.isActive) { - pulseAnimation.stop() - } - doOnLayout { - pulseAnimation.playOn(targetView = targetView) - } - } else { - pulseAnimation.stop() - } - } - - override fun isPulseAnimationPlaying() = pulseAnimation.isActive - - private fun createCookiesAnimation( - isCosmetic: Boolean, - enqueueAnimation: Boolean = false, - ) { - if (this::animatorHelper.isInitialized) { - animatorHelper.createCookiesAnimation( - context, - omnibarViews(), - shieldViews(), - animatedIconBackgroundView, - cookieAnimation, - sceneRoot, - isCosmetic, - enqueueAnimation, - ) - } - } - - private fun cancelAddressBarAnimations() { - if (this::animatorHelper.isInitialized) { - animatorHelper.cancelAnimations(omnibarViews()) - } - } - - private fun startTrackersAnimation(events: List?) { - if (addressBarTrackersAnimationFeatureToggle.feature().isEnabled()) { - animatorHelper.startAddressBarTrackersAnimation( - context = context, - addressBarTrackersBlockedAnimationShieldIcon = addressBarTrackersBlockedAnimationShieldIcon, - sceneRoot = sceneRoot, - animatedIconBackgroundView = animatedIconBackgroundView, - omnibarViews = omnibarViews(), - shieldViews = shieldViews(), - entities = events, - ) - } else { - animatorHelper.startTrackersAnimation( - context = context, - shieldAnimationView = shieldIcon, - trackersAnimationView = trackersAnimation, - omnibarViews = omnibarViews(), - entities = events, - ) - } - } - - private fun renderPrivacyShield( - privacyShieldState: PrivacyShieldState, - viewMode: ViewMode, - ) { - renderIfChanged(privacyShieldState, lastSeenPrivacyShield) { - lastSeenPrivacyShield = privacyShieldState - val shieldIconView = - if (viewMode is ViewMode.Browser) { - shieldIcon - } else { - customTabToolbarContainer.customTabShieldIcon - } - - privacyShieldView.setAnimationView(shieldIconView, privacyShieldState, viewMode) - } - } - - private fun renderOutline(enabled: Boolean) { - omniBarContainer.isPressed = enabled - } - - private fun configureCustomTabOmnibar(customTab: ViewMode.CustomTab) { - if (!customTabToolbarContainer.customTabToolbar.isVisible) { - customTabToolbarContainer.customTabCloseIcon.setOnClickListener { - omnibarItemPressedListener?.onCustomTabClosePressed() - } - - customTabToolbarContainer.customTabShieldIcon.setOnClickListener { _ -> - omnibarItemPressedListener?.onCustomTabPrivacyDashboardPressed() - } - - omniBarContainer.hide() - - toolbar.background = ColorDrawable(customTab.toolbarColor) - toolbarContainer.background = ColorDrawable(customTab.toolbarColor) - - customTabToolbarContainer.customTabToolbar.show() - - browserMenu.isVisible = true - - val foregroundColor = calculateCustomTabBackgroundColor(customTab.toolbarColor) - customTabToolbarContainer.customTabCloseIcon.setColorFilter(foregroundColor) - customTabToolbarContainer.customTabDomain.setTextColor(foregroundColor) - customTabToolbarContainer.customTabDomainOnly.setTextColor(foregroundColor) - customTabToolbarContainer.customTabTitle.setTextColor(foregroundColor) - browserMenuImageView.setColorFilter(foregroundColor) - } - } - - private fun renderCustomTab(viewMode: ViewMode.CustomTab) { - logcat { "Omnibar: updateCustomTabTitle $decoration" } - - viewMode.domain?.let { - customTabToolbarContainer.customTabDomain.text = viewMode.domain - customTabToolbarContainer.customTabDomainOnly.text = viewMode.domain - customTabToolbarContainer.customTabDomain.show() - customTabToolbarContainer.customTabDomainOnly.show() - } - - viewMode.title?.let { - customTabToolbarContainer.customTabTitle.text = viewMode.title - customTabToolbarContainer.customTabTitle.show() - customTabToolbarContainer.customTabDomainOnly.hide() - } - - customTabToolbarContainer.customTabShieldIcon.isInvisible = viewMode.showDuckPlayerIcon - customTabToolbarContainer.customTabDuckPlayerIcon.isVisible = viewMode.showDuckPlayerIcon - } - - private fun calculateCustomTabBackgroundColor(color: Int): Int { - // Handle the case where we did not receive a color. - if (color == 0) { - return if ((context as DuckDuckGoActivity).isDarkThemeEnabled()) Color.WHITE else Color.BLACK - } - - if (color == Color.WHITE || Color.alpha(color) < 128) { - return Color.BLACK - } - val greyValue = - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)).toInt() - return if (greyValue < 186) { - Color.WHITE - } else { - Color.BLACK - } - } - - private fun onLogoClicked(url: String) { - omnibarLogoClickedListener?.onClick(url) - } - - override fun measuredHeight(): Int = measuredHeight - - override fun height(): Int = height - - override fun getTranslation(): Float = translationY - - override fun setTranslation(y: Float) { - translationY = y - } - - override fun isOmnibarScrollingEnabled(): Boolean = isScrollingEnabled - - override fun isBottomNavEnabled(): Boolean = false - - override fun getBehavior(): CoordinatorLayout.Behavior = - when (omnibarType) { - OmnibarType.SINGLE_TOP -> TopAppBarBehavior(context, this) - OmnibarType.SINGLE_BOTTOM -> BottomAppBarBehavior(context, this) - else -> throw IllegalStateException("OmnibarType $omnibarType not supported in OmnibarLayout") - } - - override fun setExpanded(expanded: Boolean) { - when (omnibarType) { - OmnibarType.SINGLE_TOP -> super.setExpanded(expanded) - OmnibarType.SINGLE_BOTTOM -> (behavior as BottomAppBarBehavior).setExpanded(expanded) - else -> throw IllegalStateException("OmnibarType $omnibarType not supported in OmnibarLayout") - } - } - - override fun setExpanded( - expanded: Boolean, - animate: Boolean, - ) { - when (omnibarType) { - OmnibarType.SINGLE_TOP -> super.setExpanded(expanded, animate) - OmnibarType.SINGLE_BOTTOM -> (behavior as BottomAppBarBehavior).setExpanded(expanded) - else -> throw IllegalStateException("OmnibarType $omnibarType not supported in OmnibarLayout") - } - } - - override fun onAnimationFinished() { - omnibarTextListener?.onTrackersCountFinished() - } - - override fun setDraftTextIfNtpOrSerp(query: String) { - viewModel.setDraftTextIfNtpOrSerp(query) - } - - private fun enableTextInputClickCatcher(enabled: Boolean) { - omnibarTextInputClickCatcher.isVisible = enabled - - omnibarTextInput.apply { - isEnabled = !enabled - isFocusable = !enabled - isFocusableInTouchMode = !enabled - } - } - - override fun setInputScreenLaunchListener(listener: InputScreenLaunchListener) { - omnibarInputScreenLaunchListener = listener - omnibarTextInputClickCatcher.setOnClickListener { - viewModel.onTextInputClickCatcherClicked() - } - } - - override fun show() { - visibility = View.VISIBLE - } - - override fun gone() { - visibility = View.GONE - } -} - -interface OmnibarItemPressedListener { - fun onBackButtonPressed() -} diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/SingleOmnibarLayout.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/SingleOmnibarLayout.kt deleted file mode 100644 index eb2407551514..000000000000 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/SingleOmnibarLayout.kt +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2025 DuckDuckGo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.duckduckgo.app.browser.omnibar - -import android.animation.ValueAnimator -import android.content.Context -import android.os.Build -import android.util.AttributeSet -import android.view.View -import android.view.ViewGroup -import android.view.ViewTreeObserver.OnGlobalLayoutListener -import android.widget.ImageView -import androidx.core.view.isGone -import androidx.core.view.isVisible -import androidx.core.view.updateLayoutParams -import com.duckduckgo.anvil.annotations.InjectWith -import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.omnibar.Omnibar.ViewMode -import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.ViewState -import com.duckduckgo.common.ui.view.addBottomShadow -import com.duckduckgo.common.ui.view.gone -import com.duckduckgo.common.ui.view.hide -import com.duckduckgo.common.ui.view.show -import com.duckduckgo.common.ui.view.toPx -import com.duckduckgo.di.scopes.FragmentScope -import com.duckduckgo.navigation.api.GlobalActivityStarter -import com.google.android.material.card.MaterialCardView -import dagger.android.support.AndroidSupportInjection -import javax.inject.Inject -import com.duckduckgo.mobile.android.R as CommonR - -@InjectWith(FragmentScope::class) -class SingleOmnibarLayout @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, -) : LegacyOmnibarLayout(context, attrs, defStyle) { - @Inject - lateinit var globalActivityStarter: GlobalActivityStarter - - private val omnibarCardShadow: MaterialCardView by lazy { findViewById(R.id.omniBarContainerShadow) } - private val iconsContainer: View by lazy { findViewById(R.id.iconsContainer) } - private val shieldIconPulseAnimationContainer: View by lazy { findViewById(R.id.shieldIconPulseAnimationContainer) } - private val omniBarContentContainer: View by lazy { findViewById(R.id.omniBarContentContainer) } - private val backIcon: ImageView by lazy { findViewById(R.id.backIcon) } - private val customTabToolbarContainerWrapper: ViewGroup by lazy { findViewById(R.id.customTabToolbarContainerWrapper) } - - private var isFindInPageVisible = false - private val findInPageLayoutVisibilityChangeListener = - OnGlobalLayoutListener { - val isVisible = findInPage.findInPageContainer.isVisible - if (isFindInPageVisible != isVisible) { - isFindInPageVisible = isVisible - if (isVisible) { - onFindInPageShown() - } else { - onFindInPageHidden() - } - } - } - - private val experimentalOmnibarCardMarginTop by lazy { - resources.getDimensionPixelSize(CommonR.dimen.omnibarCardMarginTop) - } - - private val experimentalOmnibarCardMarginBottom by lazy { - resources.getDimensionPixelSize(CommonR.dimen.omnibarCardMarginBottom) - } - - private val omnibarOutlineWidth by lazy { resources.getDimensionPixelSize(CommonR.dimen.omnibarOutlineWidth) } - private val omnibarOutlineFocusedWidth by lazy { resources.getDimensionPixelSize(CommonR.dimen.omnibarOutlineFocusedWidth) } - - private var focusAnimator: ValueAnimator? = null - - private var singleOmnibarItemPressedListener: OmnibarItemPressedListener? = null - - override val omnibarType: OmnibarType - - init { - val attr = context.theme.obtainStyledAttributes(attrs, R.styleable.OmnibarLayout, defStyle, 0) - omnibarType = OmnibarType.entries[attr.getInt(R.styleable.OmnibarLayout_omnibarPosition, 0)] - - inflate(context, R.layout.view_single_omnibar, this) - - AndroidSupportInjection.inject(this) - - if (Build.VERSION.SDK_INT >= 28) { - omnibarCardShadow.addBottomShadow() - } - - when (omnibarType) { - OmnibarType.SINGLE_TOP -> { - if (Build.VERSION.SDK_INT < 28) { - omnibarCardShadow.cardElevation = 2f.toPx(context) - } - - shieldIconPulseAnimationContainer.updateLayoutParams { - (this as MarginLayoutParams).apply { - if (addressBarTrackersAnimationFeatureToggle.feature().isEnabled()) { - // TODO when the animation is made permanent we should add this adjustment to the actual layout - marginStart = 1.toPx() - } - } - } - } - OmnibarType.SINGLE_BOTTOM -> { - // When omnibar is at the bottom, we're adding an additional space at the top - omnibarCardShadow.updateLayoutParams { - (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop - } - } - - iconsContainer.updateLayoutParams { - (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop - } - } - - shieldIconPulseAnimationContainer.updateLayoutParams { - (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop - if (addressBarTrackersAnimationFeatureToggle.feature().isEnabled()) { - // TODO when the animation is made permanent we should add this adjustment to the actual layout - marginStart = 1.toPx() - } - } - } - - shieldIconPulseAnimationContainer.setPadding( - shieldIconPulseAnimationContainer.paddingLeft, - shieldIconPulseAnimationContainer.paddingTop, - shieldIconPulseAnimationContainer.paddingRight, - 6.toPx(), - ) - - // Try to reduce the bottom omnibar material shadow when not using the custom shadow - if (Build.VERSION.SDK_INT < 28) { - omnibarCardShadow.cardElevation = 0.5f.toPx(context) - } - } - else -> throw IllegalStateException("OmnibarType $omnibarType not supported in SingleOmnibarLayout") - } - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - findInPage.findInPageContainer.viewTreeObserver.addOnGlobalLayoutListener(findInPageLayoutVisibilityChangeListener) - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - focusAnimator?.cancel() - findInPage.findInPageContainer.viewTreeObserver.removeOnGlobalLayoutListener(findInPageLayoutVisibilityChangeListener) - } - - override fun render(viewState: ViewState) { - super.render(viewState) - - if (viewState.hasFocus || isFindInPageVisible) { - animateOmnibarFocusedState(focused = true) - } else { - animateOmnibarFocusedState(focused = false) - } - - omnibarCardShadow.isGone = viewState.viewMode is ViewMode.CustomTab && !isFindInPageVisible - } - - override fun renderButtons(viewState: ViewState) { - super.renderButtons(viewState) - - val showBackArrow = viewState.hasFocus - if (showBackArrow) { - backIcon.show() - searchIcon.gone() - shieldIcon.gone() - daxIcon.gone() - globeIcon.gone() - duckPlayerIcon.gone() - } else { - backIcon.hide() - } - } - - private fun animateOmnibarFocusedState(focused: Boolean) { - // temporarily disable focus animation - } - - private fun onFindInPageShown() { - omniBarContentContainer.hide() - customTabToolbarContainerWrapper.hide() - if (viewModel.viewState.value.viewMode is ViewMode.CustomTab) { - omniBarContainer.show() - browserMenu.gone() - } - animateOmnibarFocusedState(focused = true) - viewModel.onFindInPageRequested() - } - - private fun onFindInPageHidden() { - omniBarContentContainer.show() - customTabToolbarContainerWrapper.show() - if (viewModel.viewState.value.viewMode is ViewMode.CustomTab) { - omniBarContainer.hide() - browserMenu.isVisible = viewModel.viewState.value.showBrowserMenu - } - if (!viewModel.viewState.value.hasFocus) { - animateOmnibarFocusedState(focused = false) - } - viewModel.onFindInPageDismissed() - } - - fun setSingleOmnibarItemPressedListener(itemPressedListener: OmnibarItemPressedListener) { - singleOmnibarItemPressedListener = itemPressedListener - backIcon.setOnClickListener { - viewModel.onBackButtonPressed() - singleOmnibarItemPressedListener?.onBackButtonPressed() - } - } - - companion object { - private const val DEFAULT_ANIMATION_DURATION = 300L - } -} From 9bc2e5c29e126629be39b2a170b32a94947ef3e0 Mon Sep 17 00:00:00 2001 From: 0nko Date: Thu, 20 Nov 2025 20:34:48 +0100 Subject: [PATCH 2/4] Remove the userUnifiedOmnibarLayout feature flag and associated logic --- .../app/browser/BrowserTabFragment.kt | 9 ---- .../duckduckgo/app/browser/omnibar/Omnibar.kt | 44 +------------------ .../omnibar/OmnibarFeatureRepository.kt | 7 +-- .../AndroidBrowserConfigFeature.kt | 8 ---- .../main/res/layout/fragment_browser_tab.xml | 16 ------- .../omnibar/OmnibarFeatureRepositoryTest.kt | 9 +--- .../app/browser/api/OmnibarRepository.kt | 7 --- 7 files changed, 3 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index a12431e75bba..c14f39f0bc93 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -149,7 +149,6 @@ import com.duckduckgo.app.browser.omnibar.Omnibar.LogoClickListener import com.duckduckgo.app.browser.omnibar.Omnibar.OmnibarTextState import com.duckduckgo.app.browser.omnibar.Omnibar.TextListener import com.duckduckgo.app.browser.omnibar.Omnibar.ViewMode -import com.duckduckgo.app.browser.omnibar.OmnibarItemPressedListener import com.duckduckgo.app.browser.omnibar.OmnibarType import com.duckduckgo.app.browser.omnibar.QueryOrigin import com.duckduckgo.app.browser.print.PrintDocumentAdapterFactory @@ -1041,7 +1040,6 @@ class BrowserTabFragment : omnibar = Omnibar( omnibarType = settingsDataStore.omnibarType, binding = binding, - isUnifiedOmnibarEnabled = omnibarRepository.isUnifiedOmnibarLayoutEnabled, ) webViewContainer = binding.webViewContainer @@ -3087,13 +3085,6 @@ class BrowserTabFragment : } }, ) - omnibar.configureOmnibarItemPressedListeners( - object : OmnibarItemPressedListener { - override fun onBackButtonPressed() { - hideKeyboard() - } - }, - ) } private fun configureOmnibarTextInput() { diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/Omnibar.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/Omnibar.kt index 8ded709a9bfa..39fdb46ed47c 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/Omnibar.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/Omnibar.kt @@ -60,7 +60,6 @@ import logcat.logcat class Omnibar( val omnibarType: OmnibarType, private val binding: FragmentBrowserTabBinding, - isUnifiedOmnibarEnabled: Boolean, ) { interface ItemPressedListener { fun onTabsButtonPressed() @@ -154,37 +153,7 @@ class Omnibar( } val omnibarView: OmnibarView by lazy { - if (isUnifiedOmnibarEnabled) { - setupUnifiedOmnibar() - } else { - setupSingleOmnibar() - } - } - - private fun setupSingleOmnibar(): OmnibarView { - binding.rootView.removeView(binding.omnibarLayoutTop) - binding.rootView.removeView(binding.omnibarLayoutBottom) - - return when (omnibarType) { - OmnibarType.SINGLE_TOP -> { - binding.rootView.removeView(binding.singleOmnibarLayoutBottom) - binding.singleOmnibarLayoutTop - } - - OmnibarType.SINGLE_BOTTOM -> { - binding.rootView.removeView(binding.singleOmnibarLayoutTop) - adjustCoordinatorLayoutBehaviorForBottomOmnibar() - binding.singleOmnibarLayoutBottom - } - else -> throw IllegalStateException("Invalid omnibar type for single omnibar setup: $omnibarType") - } - } - - private fun setupUnifiedOmnibar(): OmnibarView { - binding.rootView.removeView(binding.singleOmnibarLayoutTop) - binding.rootView.removeView(binding.singleOmnibarLayoutBottom) - - return when (omnibarType) { + when (omnibarType) { OmnibarType.SINGLE_TOP -> { binding.rootView.removeView(binding.omnibarLayoutBottom) binding.omnibarLayoutTop @@ -235,10 +204,6 @@ class Omnibar( omnibarView.omnibarTextInput } - val omniBarContainer: View by lazy { - omnibarView.omniBarContainer - } - val toolbar: Toolbar by lazy { omnibarView.toolbar } @@ -305,13 +270,6 @@ class Omnibar( omnibarView.setLogoClickListener(logoClickListener) } - fun configureOmnibarItemPressedListeners(listener: OmnibarItemPressedListener) { - val omnibar = omnibarView - if (omnibar is SingleOmnibarLayout) { - omnibar.setSingleOmnibarItemPressedListener(listener) - } - } - fun configureInputScreenLaunchListener(listener: InputScreenLaunchListener) { omnibarView.setInputScreenLaunchListener(listener) } diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarFeatureRepository.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarFeatureRepository.kt index 918c0fe3e255..1cc197439f55 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarFeatureRepository.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarFeatureRepository.kt @@ -44,20 +44,15 @@ open class OmnibarFeatureRepository @Inject constructor( @AppCoroutineScope private val coroutineScope: CoroutineScope, ) : OmnibarRepository, MainProcessLifecycleObserver { private var isSplitOmnibarFlagEnabled: Boolean = false - private var isUnifiedOmnibarFlagEnabled: Boolean = false override val omnibarType: OmnibarType get() = settingsDataStore.omnibarType override val isSplitOmnibarAvailable: Boolean - get() = isSplitOmnibarFlagEnabled && isUnifiedOmnibarFlagEnabled - - override val isUnifiedOmnibarLayoutEnabled: Boolean - get() = isUnifiedOmnibarFlagEnabled + get() = isSplitOmnibarFlagEnabled override fun onStart(owner: LifecycleOwner) { coroutineScope.launch(dispatcherProvider.io()) { - isUnifiedOmnibarFlagEnabled = browserFeatures.useUnifiedOmnibarLayout().isEnabled() isSplitOmnibarFlagEnabled = browserFeatures.splitOmnibar().isEnabled() resetOmnibarTypeIfNecessary() diff --git a/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt b/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt index ee8e2eae377d..c9e0642e5a8f 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt @@ -179,14 +179,6 @@ interface AndroidBrowserConfigFeature { @Toggle.DefaultValue(DefaultFeatureValue.FALSE) fun vpnMenuItem(): Toggle - /** - * @return `true` when the remote config has the global "useUnifiedOmnibarLayout" androidBrowserConfig - * sub-feature flag enabled - * If the remote feature is not present defaults to `true` - */ - @Toggle.DefaultValue(DefaultFeatureValue.TRUE) - fun useUnifiedOmnibarLayout(): Toggle - /** * @return `true` when the remote config has the global "splitOmnibar" androidBrowserConfig * sub-feature flag enabled diff --git a/app/src/main/res/layout/fragment_browser_tab.xml b/app/src/main/res/layout/fragment_browser_tab.xml index 5413015a7d80..067e08d10554 100644 --- a/app/src/main/res/layout/fragment_browser_tab.xml +++ b/app/src/main/res/layout/fragment_browser_tab.xml @@ -28,14 +28,6 @@ android:outlineProvider="none" app:omnibarPosition="top" /> - - - - Date: Thu, 20 Nov 2025 20:40:43 +0100 Subject: [PATCH 3/4] Remove "experimental" from variables and file names --- ...electable_item_rounded_corner_background.xml} | 0 .../app/browser/omnibar/OmnibarLayout.kt | 16 ++++++++-------- .../main/res/layout/activity_system_search.xml | 12 ++++++------ app/src/main/res/layout/include_find_in_page.xml | 6 +++--- .../layout/include_omnibar_toolbar_mockup.xml | 4 ++-- .../include_omnibar_toolbar_mockup_bottom.xml | 4 ++-- .../res/layout/view_browser_navigation_bar.xml | 10 +++++----- .../view_browser_navigation_bar_mockup.xml | 8 ++++---- .../view_new_toolbar_tab_switcher_button.xml | 2 +- app/src/main/res/layout/view_omnibar.xml | 12 ++++++------ app/src/main/res/layout/view_single_omnibar.xml | 12 ++++++------ .../res/layout/item_autocomplete_default.xml | 2 +- .../item_autocomplete_search_suggestion.xml | 2 +- .../view_new_toolbar_tab_switcher_button.xml | 2 +- .../main/res/layout/view_duck_chat_omnibar.xml | 6 +++--- .../res/layout/view_input_mode_switch_widget.xml | 10 +++++----- .../res/layout/view_input_screen_buttons.xml | 4 ++-- 17 files changed, 56 insertions(+), 56 deletions(-) rename android-design-system/design-system/src/main/res/drawable/{selectable_item_experimental_background.xml => selectable_item_rounded_corner_background.xml} (100%) diff --git a/android-design-system/design-system/src/main/res/drawable/selectable_item_experimental_background.xml b/android-design-system/design-system/src/main/res/drawable/selectable_item_rounded_corner_background.xml similarity index 100% rename from android-design-system/design-system/src/main/res/drawable/selectable_item_experimental_background.xml rename to android-design-system/design-system/src/main/res/drawable/selectable_item_rounded_corner_background.xml diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt index d410b51b064b..bffd6956d49b 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayout.kt @@ -233,11 +233,11 @@ class OmnibarLayout @JvmOverloads constructor( } } - private val experimentalOmnibarCardMarginTop by lazy { + private val omnibarCardMarginTop by lazy { resources.getDimensionPixelSize(CommonR.dimen.omnibarCardMarginTop) } - private val experimentalOmnibarCardMarginBottom by lazy { + private val omnibarCardMarginBottom by lazy { resources.getDimensionPixelSize(CommonR.dimen.omnibarCardMarginBottom) } @@ -626,22 +626,22 @@ class OmnibarLayout @JvmOverloads constructor( // When omnibar is at the bottom, we're adding an additional space at the top omnibarCardShadow.updateLayoutParams { (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop + topMargin = omnibarCardMarginBottom + bottomMargin = omnibarCardMarginTop } } iconsContainer.updateLayoutParams { (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop + topMargin = omnibarCardMarginBottom + bottomMargin = omnibarCardMarginTop } } shieldIconPulseAnimationContainer.updateLayoutParams { (this as MarginLayoutParams).apply { - topMargin = experimentalOmnibarCardMarginBottom - bottomMargin = experimentalOmnibarCardMarginTop + topMargin = omnibarCardMarginBottom + bottomMargin = omnibarCardMarginTop if (addressBarTrackersAnimationFeatureToggle.feature().isEnabled()) { // TODO when the animation is made permanent we should add this adjustment to the actual layout marginStart = 1.toPx() diff --git a/app/src/main/res/layout/activity_system_search.xml b/app/src/main/res/layout/activity_system_search.xml index d33e310f2c8a..313d25e2265b 100644 --- a/app/src/main/res/layout/activity_system_search.xml +++ b/app/src/main/res/layout/activity_system_search.xml @@ -139,7 +139,7 @@ android:id="@+id/clearTextButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/clearButtonContentDescription" android:scaleType="center" android:src="@drawable/ic_close_circle_small_secondary_24" @@ -153,7 +153,7 @@ android:id="@+id/voiceSearchButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/voiceSearchIconContentDescription" android:scaleType="center" android:visibility="gone" @@ -180,7 +180,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/browserPopupMenu" android:scaleType="center" android:src="@drawable/ic_ai_chat_24" @@ -384,7 +384,7 @@ android:id="@+id/clearTextButtonBottom" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/clearButtonContentDescription" android:scaleType="center" android:src="@drawable/ic_close_circle_small_secondary_24" @@ -398,7 +398,7 @@ android:id="@+id/voiceSearchButtonBottom" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/voiceSearchIconContentDescription" android:scaleType="center" android:visibility="gone" @@ -425,7 +425,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/browserPopupMenu" android:scaleType="center" android:src="@drawable/ic_ai_chat_24" diff --git a/app/src/main/res/layout/include_find_in_page.xml b/app/src/main/res/layout/include_find_in_page.xml index b139bb84bb5d..5a6b8c4dd05d 100644 --- a/app/src/main/res/layout/include_find_in_page.xml +++ b/app/src/main/res/layout/include_find_in_page.xml @@ -59,7 +59,7 @@ android:id="@+id/previousSearchTermButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/previousSearchTermDescription" android:scaleType="center" android:src="@drawable/ic_chevron_up_24" /> @@ -68,7 +68,7 @@ android:id="@+id/nextSearchTermButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/nextSearchTermDescription" android:scaleType="center" android:src="@drawable/ic_chevron_down_24" /> @@ -77,7 +77,7 @@ android:id="@+id/closeFindInPagePanel" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/closeFindInPageButtonDescription" android:scaleType="center" android:src="@drawable/ic_close_24" /> diff --git a/app/src/main/res/layout/include_omnibar_toolbar_mockup.xml b/app/src/main/res/layout/include_omnibar_toolbar_mockup.xml index 2651e7aa29df..8ffd73c5433a 100644 --- a/app/src/main/res/layout/include_omnibar_toolbar_mockup.xml +++ b/app/src/main/res/layout/include_omnibar_toolbar_mockup.xml @@ -114,7 +114,7 @@ android:id="@+id/browserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/tabsMenu" @@ -145,7 +145,7 @@ android:id="@+id/fireIconMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/tabsMenu" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/include_omnibar_toolbar_mockup_bottom.xml b/app/src/main/res/layout/include_omnibar_toolbar_mockup_bottom.xml index 79a3fddd67f0..4d8a8923474a 100644 --- a/app/src/main/res/layout/include_omnibar_toolbar_mockup_bottom.xml +++ b/app/src/main/res/layout/include_omnibar_toolbar_mockup_bottom.xml @@ -114,7 +114,7 @@ android:id="@+id/browserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/tabsMenu" @@ -145,7 +145,7 @@ android:id="@+id/fireIconMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/tabsMenu" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/view_browser_navigation_bar.xml b/app/src/main/res/layout/view_browser_navigation_bar.xml index 79c377532af9..9af12f658bb9 100644 --- a/app/src/main/res/layout/view_browser_navigation_bar.xml +++ b/app/src/main/res/layout/view_browser_navigation_bar.xml @@ -41,7 +41,7 @@ android:id="@+id/newTabButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:visibility="gone" tools:visibility="visible"> @@ -59,7 +59,7 @@ android:id="@+id/autofillButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:visibility="gone" tools:visibility="visible"> @@ -84,7 +84,7 @@ android:id="@+id/bookmarksButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> + android:background="@drawable/selectable_item_rounded_corner_background"> diff --git a/app/src/main/res/layout/view_omnibar.xml b/app/src/main/res/layout/view_omnibar.xml index f8d5da013ea3..6d1c5f71e95a 100644 --- a/app/src/main/res/layout/view_omnibar.xml +++ b/app/src/main/res/layout/view_omnibar.xml @@ -167,7 +167,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/back" android:gravity="center" android:padding="@dimen/keyline_2" @@ -322,7 +322,7 @@ android:id="@+id/clearTextButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/clearButtonContentDescription" android:scaleType="center" android:src="@drawable/ic_close_circle_small_secondary_24" @@ -336,7 +336,7 @@ android:id="@+id/voiceSearchButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/voiceSearchIconContentDescription" android:scaleType="center" android:visibility="gone" @@ -363,7 +363,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/browserPopupMenu" android:scaleType="center" android:src="@drawable/ic_ai_chat_24" @@ -474,7 +474,7 @@ android:id="@+id/browserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/tabsMenu" @@ -504,7 +504,7 @@ android:id="@+id/fireIconMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/tabsMenu" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/view_single_omnibar.xml b/app/src/main/res/layout/view_single_omnibar.xml index 468b7637f7e3..37342d40fc6e 100644 --- a/app/src/main/res/layout/view_single_omnibar.xml +++ b/app/src/main/res/layout/view_single_omnibar.xml @@ -167,7 +167,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/back" android:gravity="center" android:padding="@dimen/keyline_2" @@ -323,7 +323,7 @@ android:id="@+id/clearTextButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/clearButtonContentDescription" android:scaleType="center" android:src="@drawable/ic_close_circle_small_secondary_24" @@ -337,7 +337,7 @@ android:id="@+id/voiceSearchButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/voiceSearchIconContentDescription" android:scaleType="center" android:visibility="gone" @@ -364,7 +364,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/browserPopupMenu" android:scaleType="center" android:src="@drawable/ic_ai_chat_24" @@ -475,7 +475,7 @@ android:id="@+id/browserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/tabsMenu" @@ -505,7 +505,7 @@ android:id="@+id/fireIconMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/tabsMenu" app:layout_constraintStart_toStartOf="parent" diff --git a/browser/browser-ui/src/main/res/layout/item_autocomplete_default.xml b/browser/browser-ui/src/main/res/layout/item_autocomplete_default.xml index b066d81f8aa3..b71703e2a715 100644 --- a/browser/browser-ui/src/main/res/layout/item_autocomplete_default.xml +++ b/browser/browser-ui/src/main/res/layout/item_autocomplete_default.xml @@ -57,7 +57,7 @@ android:contentDescription="@string/editQueryBeforeSubmitting" android:padding="@dimen/keyline_2" android:src="@drawable/ic_arrow_circle_up_left_16" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/browser/browser-ui/src/main/res/layout/item_autocomplete_search_suggestion.xml b/browser/browser-ui/src/main/res/layout/item_autocomplete_search_suggestion.xml index 4a629926f482..ae9dcf2553e2 100644 --- a/browser/browser-ui/src/main/res/layout/item_autocomplete_search_suggestion.xml +++ b/browser/browser-ui/src/main/res/layout/item_autocomplete_search_suggestion.xml @@ -54,7 +54,7 @@ android:id="@+id/editQueryImage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:contentDescription="@string/editQueryBeforeSubmitting" android:padding="@dimen/keyline_2" android:src="@drawable/ic_arrow_circle_up_left_16" diff --git a/browser/browser-ui/src/main/res/layout/view_new_toolbar_tab_switcher_button.xml b/browser/browser-ui/src/main/res/layout/view_new_toolbar_tab_switcher_button.xml index 47f931fde4be..37234ecbfda3 100644 --- a/browser/browser-ui/src/main/res/layout/view_new_toolbar_tab_switcher_button.xml +++ b/browser/browser-ui/src/main/res/layout/view_new_toolbar_tab_switcher_button.xml @@ -19,7 +19,7 @@ android:id="@+id/tabsButton" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" tools:layout_height="@dimen/toolbarIcon" tools:layout_width="@dimen/toolbarIcon"> diff --git a/duckchat/duckchat-impl/src/main/res/layout/view_duck_chat_omnibar.xml b/duckchat/duckchat-impl/src/main/res/layout/view_duck_chat_omnibar.xml index ace3ded2ddb3..ab4515fe8828 100644 --- a/duckchat/duckchat-impl/src/main/res/layout/view_duck_chat_omnibar.xml +++ b/duckchat/duckchat-impl/src/main/res/layout/view_duck_chat_omnibar.xml @@ -31,7 +31,7 @@ android:id="@+id/duckAiHistoryButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="@id/inputModeWidgetCard" app:layout_constraintEnd_toStartOf="@id/inputModeWidgetCard" app:layout_constraintTop_toTopOf="@id/inputModeWidgetCard" @@ -127,7 +127,7 @@ android:id="@+id/inputFieldFireButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/inputFieldTabsMenu" app:layout_constraintStart_toStartOf="parent" @@ -155,7 +155,7 @@ android:id="@+id/inputFieldBrowserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/inputFieldTabsMenu" diff --git a/duckchat/duckchat-impl/src/main/res/layout/view_input_mode_switch_widget.xml b/duckchat/duckchat-impl/src/main/res/layout/view_input_mode_switch_widget.xml index 877c26ec203a..657b37308529 100644 --- a/duckchat/duckchat-impl/src/main/res/layout/view_input_mode_switch_widget.xml +++ b/duckchat/duckchat-impl/src/main/res/layout/view_input_mode_switch_widget.xml @@ -44,7 +44,7 @@ android:layout_height="@dimen/toolbarIcon" android:layout_gravity="center" android:layout_marginStart="@dimen/keyline_2" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:gravity="center" android:importantForAccessibility="no" android:padding="@dimen/keyline_2" @@ -124,7 +124,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="top" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:gravity="center" android:importantForAccessibility="no" android:scaleType="center" @@ -137,7 +137,7 @@ android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" android:layout_gravity="top" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:gravity="center" android:importantForAccessibility="no" android:scaleType="centerInside" @@ -172,7 +172,7 @@ android:id="@+id/inputFieldFireButton" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/inputFieldTabsMenu" app:layout_constraintStart_toStartOf="parent" @@ -200,7 +200,7 @@ android:id="@+id/inputFieldBrowserMenu" android:layout_width="@dimen/toolbarIcon" android:layout_height="@dimen/toolbarIcon" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/inputFieldTabsMenu" diff --git a/duckchat/duckchat-impl/src/main/res/layout/view_input_screen_buttons.xml b/duckchat/duckchat-impl/src/main/res/layout/view_input_screen_buttons.xml index 23800acce06b..3e171fc6ac16 100644 --- a/duckchat/duckchat-impl/src/main/res/layout/view_input_screen_buttons.xml +++ b/duckchat/duckchat-impl/src/main/res/layout/view_input_screen_buttons.xml @@ -27,7 +27,7 @@ android:layout_marginBottom="8dp" android:layout_width="36dp" android:layout_height="36dp" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:importantForAccessibility="no" android:scaleType="centerInside" android:src="@drawable/ic_microphone_24" @@ -40,7 +40,7 @@ android:layout_width="36dp" android:layout_height="36dp" android:layout_marginStart="8dp" - android:background="@drawable/selectable_item_experimental_background" + android:background="@drawable/selectable_item_rounded_corner_background" android:importantForAccessibility="no" android:scaleType="centerInside" android:src="@drawable/ic_enter_24" From e42c30ef5c0198ab749db91069ad24e1725ab50b Mon Sep 17 00:00:00 2001 From: 0nko Date: Fri, 21 Nov 2025 10:27:01 +0100 Subject: [PATCH 4/4] Remove legacy omnibar layout --- .../main/res/layout/view_single_omnibar.xml | 536 ------------------ 1 file changed, 536 deletions(-) delete mode 100644 app/src/main/res/layout/view_single_omnibar.xml diff --git a/app/src/main/res/layout/view_single_omnibar.xml b/app/src/main/res/layout/view_single_omnibar.xml deleted file mode 100644 index 37342d40fc6e..000000000000 --- a/app/src/main/res/layout/view_single_omnibar.xml +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -