Skip to content

Commit 5a5234f

Browse files
authored
Split Omnibar: Remove old feature flag (#7045)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1207418217763355/task/1211819634741598?focus=true ### Description This PR removes the `newToolbarFeature` feature flag and all the associated logic. ### Steps to test this PR _Top omnibar_ - [ ] Set the omnibar position to TOP - [ ] Go to the tab switcher - [ ] Verify all the buttons work as expected - [ ] Verify the menu items work as expected - [ ] Verify the selection mode works (tap on Select tabs in the menu) as expected - [ ] Verify the tab scrolling works as expected (create many tabs in the developer mode) _Bottom omnibar_ - [ ] Set the omnibar position to BOTTOM - [ ] Go to the tab switcher - [ ] Verify all the buttons work as expected - [ ] Verify the menu items work as expected - [ ] Verify the selection mode works (tap on Select tabs in the menu) as expected - [ ] Verify the tab scrolling works as expected (create many tabs in the developer mode)
1 parent 0973926 commit 5a5234f

File tree

9 files changed

+58
-516
lines changed

9 files changed

+58
-516
lines changed

app/src/main/java/com/duckduckgo/app/tabs/TabFeatureFlags.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,4 @@ interface TabManagerFeatureFlags {
3232

3333
@Toggle.DefaultValue(DefaultFeatureValue.TRUE)
3434
fun tabInsertionFixes(): Toggle
35-
36-
@Toggle.InternalAlwaysEnabled
37-
@Toggle.DefaultValue(DefaultFeatureValue.FALSE)
38-
fun newToolbarFeature(): Toggle
3935
}

app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt

Lines changed: 31 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import android.widget.FrameLayout
2828
import androidx.activity.OnBackPressedCallback
2929
import androidx.appcompat.app.AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR
3030
import androidx.appcompat.widget.Toolbar
31-
import androidx.coordinatorlayout.widget.CoordinatorLayout
32-
import androidx.core.view.updateLayoutParams
3331
import androidx.lifecycle.Lifecycle
3432
import androidx.lifecycle.flowWithLifecycle
3533
import androidx.lifecycle.lifecycleScope
@@ -89,8 +87,6 @@ import com.duckduckgo.common.ui.view.dialog.TextAlertDialogBuilder
8987
import com.duckduckgo.common.ui.view.gone
9088
import com.duckduckgo.common.ui.view.hide
9189
import com.duckduckgo.common.ui.view.show
92-
import com.duckduckgo.common.ui.view.toDp
93-
import com.duckduckgo.common.ui.view.toPx
9490
import com.duckduckgo.common.ui.viewbinding.viewBinding
9591
import com.duckduckgo.common.utils.DispatcherProvider
9692
import com.duckduckgo.di.scopes.ActivityScope
@@ -211,18 +207,26 @@ class TabSwitcherActivity :
211207

212208
private val binding: ActivityTabSwitcherBinding by viewBinding()
213209
private val popupMenu by lazy {
214-
if (settingsDataStore.omnibarType == OmnibarType.SINGLE_BOTTOM && viewModel.isNewToolbarEnabled) {
215-
PopupMenu(layoutInflater, R.layout.popup_tabs_menu_bottom)
216-
} else {
210+
if (settingsDataStore.omnibarType == OmnibarType.SINGLE_TOP) {
217211
PopupMenu(layoutInflater, R.layout.popup_tabs_menu)
212+
} else {
213+
PopupMenu(layoutInflater, R.layout.popup_tabs_menu_bottom)
218214
}
219215
}
220216

221217
private val snackbarAnchorView by lazy {
222-
if (settingsDataStore.omnibarType == OmnibarType.SINGLE_BOTTOM) {
223-
toolbar
224-
} else {
225-
null
218+
when (settingsDataStore.omnibarType) {
219+
OmnibarType.SINGLE_BOTTOM -> {
220+
toolbar
221+
}
222+
223+
OmnibarType.SINGLE_TOP -> {
224+
null
225+
}
226+
OmnibarType.SPLIT -> {
227+
null
228+
// TODO: add bottom bar
229+
}
226230
}
227231
}
228232

@@ -241,28 +245,12 @@ class TabSwitcherActivity :
241245
setupToolbar(toolbar)
242246
configureRecycler()
243247

244-
if (!viewModel.isNewToolbarEnabled) {
245-
configureFabs()
246-
}
247-
248248
configureObservers()
249249
configureOnBackPressedListener()
250250

251251
initMenuClickListeners()
252252
}
253253

254-
private fun configureFabs() {
255-
binding.mainFab.apply {
256-
setOnClickListener {
257-
viewModel.onFabClicked()
258-
}
259-
}
260-
261-
binding.aiChatFab.setOnClickListener {
262-
viewModel.onDuckAIFabClicked()
263-
}
264-
}
265-
266254
override fun onSaveInstanceState(outState: Bundle) {
267255
super.onSaveInstanceState(outState)
268256

@@ -276,19 +264,18 @@ class TabSwitcherActivity :
276264
private fun configureViewReferences() {
277265
tabsRecycler = findViewById(R.id.tabsRecycler)
278266

279-
if (viewModel.isNewToolbarEnabled) {
280-
when (settingsDataStore.omnibarType) {
281-
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> {
282-
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
283-
}
284-
OmnibarType.SINGLE_BOTTOM -> {
285-
binding.root.removeView(binding.tabSwitcherExperimentToolbarTop.root)
286-
}
267+
when (settingsDataStore.omnibarType) {
268+
OmnibarType.SINGLE_TOP -> {
269+
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
270+
// TODO: remove bottom bar
271+
}
272+
OmnibarType.SINGLE_BOTTOM -> {
273+
binding.root.removeView(binding.tabSwitcherToolbarTop.root)
274+
// TODO: remove bottom bar
275+
}
276+
OmnibarType.SPLIT -> {
277+
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
287278
}
288-
binding.root.removeView(binding.tabSwitcherToolbarTop.root)
289-
} else {
290-
binding.root.removeView(binding.tabSwitcherExperimentToolbarTop.root)
291-
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
292279
}
293280

294281
toolbar = findViewById(R.id.toolbar)
@@ -320,27 +307,7 @@ class TabSwitcherActivity :
320307

321308
tabsRecycler.setHasFixedSize(true)
322309

323-
if (viewModel.isNewToolbarEnabled) {
324-
handleFabStateUpdates()
325-
}
326-
327310
handleSelectionModeCancellation()
328-
329-
if (viewModel.isNewToolbarEnabled) {
330-
// Set the layout params for the tabs recycler view based on omnibar position
331-
tabsContainer.updateLayoutParams {
332-
this as CoordinatorLayout.LayoutParams
333-
this.behavior = null
334-
when (settingsDataStore.omnibarType) {
335-
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> {
336-
this.topMargin = TABS_CONTENT_PADDING_DP.toPx()
337-
}
338-
OmnibarType.SINGLE_BOTTOM -> {
339-
this.bottomMargin = TABS_CONTENT_PADDING_DP.toPx()
340-
}
341-
}
342-
}
343-
}
344311
}
345312

346313
private fun handleSelectionModeCancellation() {
@@ -379,25 +346,6 @@ class TabSwitcherActivity :
379346
)
380347
}
381348

382-
private fun handleFabStateUpdates() {
383-
tabsRecycler.addOnScrollListener(
384-
object : OnScrollListener() {
385-
override fun onScrolled(
386-
recyclerView: RecyclerView,
387-
dx: Int,
388-
dy: Int,
389-
) {
390-
super.onScrolled(recyclerView, dx, dy)
391-
if (dy.toDp(recyclerView.context) > FAB_SCROLL_THRESHOLD) {
392-
binding.mainFab.shrink()
393-
} else if (dy.toDp(recyclerView.context) < -FAB_SCROLL_THRESHOLD) {
394-
binding.mainFab.extend()
395-
}
396-
}
397-
},
398-
)
399-
}
400-
401349
private fun updateToolbarTitle(
402350
mode: Mode,
403351
tabCount: Int,
@@ -615,27 +563,23 @@ class TabSwitcherActivity :
615563
}
616564

617565
override fun onCreateOptionsMenu(menu: Menu): Boolean {
618-
menuInflater.inflate(R.menu.menu_tab_switcher_activity_with_selection, menu)
566+
menuInflater.inflate(R.menu.menu_tab_switcher_activity, menu)
619567

620568
val popupBinding = PopupTabsMenuBinding.bind(popupMenu.contentView)
621569
val viewState = viewModel.selectionViewState.value
622570

623571
val numSelectedTabs = viewModel.selectionViewState.value.numSelectedTabs
624572
menu.createDynamicInterface(
625-
numSelectedTabs,
626-
popupBinding,
627-
binding.mainFab,
628-
binding.aiChatFab,
629-
tabsRecycler,
630-
toolbar,
631-
viewState.dynamicInterface,
573+
numSelectedTabs = numSelectedTabs,
574+
popupMenu = popupBinding,
575+
toolbar = toolbar,
576+
dynamicMenu = viewState.dynamicInterface,
632577
)
633578

634579
return true
635580
}
636581

637582
private fun initMenuClickListeners() {
638-
popupMenu.onMenuItemClicked(popupMenu.contentView.findViewById(R.id.newTabMenuItem)) { onNewTabRequested(fromOverflowMenu = true) }
639583
popupMenu.onMenuItemClicked(popupMenu.contentView.findViewById(R.id.gridLayoutMenuItem)) { viewModel.onGridLayoutSelected() }
640584
popupMenu.onMenuItemClicked(popupMenu.contentView.findViewById(R.id.listLayoutMenuItem)) { viewModel.onListLayoutSelected() }
641585
popupMenu.onMenuItemClicked(popupMenu.contentView.findViewById(R.id.selectAllMenuItem)) { viewModel.onSelectAllTabs() }
@@ -654,7 +598,6 @@ class TabSwitcherActivity :
654598

655599
override fun onOptionsItemSelected(item: MenuItem): Boolean {
656600
when (item.itemId) {
657-
R.id.layoutTypeToolbarButton -> onLayoutTypeToggled()
658601
R.id.fireToolbarButton -> onFireButtonClicked()
659602
R.id.popupMenuToolbarButton -> showPopupMenu(item.itemId)
660603
R.id.newTabToolbarButton -> onNewTabRequested(fromOverflowMenu = false)
@@ -702,10 +645,6 @@ class TabSwitcherActivity :
702645
dialog.show()
703646
}
704647

705-
private fun onLayoutTypeToggled() {
706-
viewModel.onLayoutTypeToggled()
707-
}
708-
709648
override fun onNewTabRequested(fromOverflowMenu: Boolean) {
710649
// clear observers early to stop view updates
711650
removeObservers()

app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherMenuExt.kt

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,22 @@ import android.view.Menu
2020
import androidx.appcompat.content.res.AppCompatResources
2121
import androidx.appcompat.widget.Toolbar
2222
import androidx.core.view.isVisible
23-
import androidx.recyclerview.widget.RecyclerView
2423
import com.duckduckgo.app.browser.R
2524
import com.duckduckgo.app.browser.databinding.PopupTabsMenuBinding
2625
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.ARROW
2726
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.CLOSE
2827
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.DynamicInterface
29-
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.FabType
3028
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.GRID
3129
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.HIDDEN
3230
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.LIST
33-
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
34-
import com.google.android.material.floatingactionbutton.FloatingActionButton
3531
import com.duckduckgo.mobile.android.R as commonR
3632

3733
fun Menu.createDynamicInterface(
3834
numSelectedTabs: Int,
3935
popupMenu: PopupTabsMenuBinding,
40-
mainFab: ExtendedFloatingActionButton,
41-
aiFab: FloatingActionButton,
42-
tabsRecycler: RecyclerView,
4336
toolbar: Toolbar,
4437
dynamicMenu: DynamicInterface,
4538
) {
46-
popupMenu.newTabMenuItem.isVisible = dynamicMenu.isNewTabMenuVisible
4739
popupMenu.selectAllMenuItem.isVisible = dynamicMenu.isSelectAllVisible
4840
popupMenu.deselectAllMenuItem.isVisible = dynamicMenu.isDeselectAllVisible
4941
popupMenu.selectionActionsDivider.isVisible = dynamicMenu.isSelectionActionsDividerVisible
@@ -94,70 +86,12 @@ fun Menu.createDynamicInterface(
9486
}
9587
}
9688

97-
mainFab.apply {
98-
if (dynamicMenu.isMainFabVisible) {
99-
when (dynamicMenu.mainFabType) {
100-
FabType.NEW_TAB -> {
101-
text = resources.getString(R.string.newTabMenuItem)
102-
icon = AppCompatResources.getDrawable(context, commonR.drawable.ic_add_24_solid_color)
103-
}
104-
FabType.CLOSE_TABS -> {
105-
text = resources.getQuantityString(R.plurals.closeTabsMenuItem, numSelectedTabs, numSelectedTabs)
106-
icon = AppCompatResources.getDrawable(context, commonR.drawable.ic_close_24_solid_color)
107-
}
108-
}
109-
110-
show()
111-
extend()
112-
} else {
113-
hide()
114-
}
115-
}
116-
117-
if (dynamicMenu.isAIFabVisible) {
118-
aiFab.show()
119-
} else {
120-
aiFab.hide()
121-
}
122-
12389
toolbar.navigationIcon = when (dynamicMenu.backButtonType) {
12490
ARROW -> AppCompatResources.getDrawable(toolbar.context, commonR.drawable.ic_arrow_left_24)
12591
CLOSE -> AppCompatResources.getDrawable(toolbar.context, commonR.drawable.ic_close_24)
12692
}
12793

128-
findItem(R.id.layoutTypeToolbarButton).apply {
129-
when (dynamicMenu.layoutButtonMode) {
130-
GRID -> {
131-
setIcon(com.duckduckgo.mobile.android.R.drawable.ic_view_grid_24)
132-
title = toolbar.resources.getString(R.string.tabSwitcherGridViewMenu)
133-
isVisible = true
134-
}
135-
LIST -> {
136-
setIcon(com.duckduckgo.mobile.android.R.drawable.ic_view_list_24)
137-
title = toolbar.resources.getString(R.string.tabSwitcherListViewMenu)
138-
isVisible = true
139-
}
140-
HIDDEN -> isVisible = false
141-
}
142-
}
143-
144-
findItem(R.id.popupMenuToolbarButton).isEnabled = dynamicMenu.isMenuButtonEnabled
14594
findItem(R.id.fireToolbarButton).isVisible = dynamicMenu.isFireButtonVisible
14695
findItem(R.id.duckAIToolbarButton).isVisible = dynamicMenu.isDuckAIButtonVisible
14796
findItem(R.id.newTabToolbarButton).isVisible = dynamicMenu.isNewTabButtonVisible
148-
149-
val bottomPadding = if (dynamicMenu.isAIFabVisible) {
150-
tabsRecycler.context.resources.getDimension(R.dimen.recyclerViewTwoFabsBottomPadding)
151-
} else if (dynamicMenu.isMainFabVisible) {
152-
tabsRecycler.context.resources.getDimension(R.dimen.recyclerViewOneFabBottomPadding)
153-
} else {
154-
tabsRecycler.context.resources.getDimension(com.duckduckgo.mobile.android.R.dimen.keyline_2)
155-
}
156-
157-
tabsRecycler.setPadding(
158-
tabsRecycler.paddingLeft,
159-
tabsRecycler.paddingTop,
160-
tabsRecycler.paddingRight,
161-
bottomPadding.toInt(),
162-
)
16397
}

0 commit comments

Comments
 (0)