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
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ open class PopupMenu(
val y = if (anchorMoreToTopOfScreen) {
anchorLocation[1] + anchorView.height + 4.toDp()
} else {
screenHeight - anchorLocation[1] + 4.toDp()
screenHeight - anchorLocation[1] - anchorView.height + 4.toDp()
}

showAtLocation(rootView, gravity, x, y)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ class AppearanceActivity : DuckDuckGoActivity() {
val subtitle =
getString(
when (omnibarType) {
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> R.string.settingsAddressBarPositionTop
OmnibarType.SPLIT, OmnibarType.SINGLE_TOP -> R.string.settingsAddressBarPositionTop
OmnibarType.SINGLE_BOTTOM -> R.string.settingsAddressBarPositionBottom
},
)
Expand Down Expand Up @@ -238,9 +238,9 @@ class AppearanceActivity : DuckDuckGoActivity() {
override fun onPositiveButtonClicked(selectedItem: Int) {
val selectedTheme =
when (selectedItem) {
2 -> DuckDuckGoTheme.LIGHT
3 -> DuckDuckGoTheme.DARK
else -> DuckDuckGoTheme.SYSTEM_DEFAULT
2 -> LIGHT
3 -> DARK
else -> SYSTEM_DEFAULT
}
viewModel.onThemeSelected(selectedTheme)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -765,8 +765,9 @@ open class BrowserActivity : DuckDuckGoActivity() {

val anchorView =
when (settingsDataStore.omnibarType) {
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> null
OmnibarType.SINGLE_TOP -> null
OmnibarType.SINGLE_BOTTOM -> currentTab?.getOmnibar()?.omnibarView?.toolbar ?: binding.fragmentContainer
OmnibarType.SPLIT -> currentTab?.getBottomNavigationBar() ?: binding.fragmentContainer
}
DefaultSnackbar(
parentView = binding.fragmentContainer,
Expand Down
17 changes: 5 additions & 12 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
import com.duckduckgo.app.browser.model.LongPressTarget
import com.duckduckgo.app.browser.navigation.bar.BrowserNavigationBarViewIntegration
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarObserver
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarView
import com.duckduckgo.app.browser.newtab.NewTabPageProvider
import com.duckduckgo.app.browser.omnibar.Omnibar
import com.duckduckgo.app.browser.omnibar.Omnibar.FindInPageListener
Expand Down Expand Up @@ -1190,18 +1191,6 @@ class BrowserTabFragment :
onBrowserMenuButtonPressed()
}

override fun onBackButtonClicked() {
onBackArrowClicked()
}

override fun onBackButtonLongClicked() {
onBackArrowLongClicked()
}

override fun onForwardButtonClicked() {
onForwardArrowClicked()
}

override fun onNewTabButtonClicked() {
viewModel.onNavigationBarNewTabButtonClicked()
}
Expand Down Expand Up @@ -2012,6 +2001,10 @@ class BrowserTabFragment :
}
}

fun getBottomNavigationBar(): BrowserNavigationBarView {
return binding.navigationBar
}

private fun processCommand(it: Command?) {
if (it is NavigationCommand) {
omnibar.cancelTrackersAnimation()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,6 @@ interface BrowserNavigationBarObserver {
fun onMenuButtonClicked() {
}

@EmptySuper
fun onBackButtonClicked() {
}

@EmptySuper
fun onBackButtonLongClicked() {
}

@EmptySuper
fun onForwardButtonClicked() {
}

@EmptySuper
fun onNewTabButtonClicked() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,8 @@ import com.duckduckgo.app.browser.PulseAnimation
import com.duckduckgo.app.browser.databinding.ViewBrowserNavigationBarBinding
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyAutofillButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyBackButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyBackButtonLongClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyBookmarksButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyFireButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyForwardButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyMenuButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyNewTabButtonClicked
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarViewModel.Command.NotifyTabsButtonClicked
Expand Down Expand Up @@ -208,9 +205,6 @@ class BrowserNavigationBarView @JvmOverloads constructor(
NotifyTabsButtonClicked -> browserNavigationBarObserver?.onTabsButtonClicked()
NotifyTabsButtonLongClicked -> browserNavigationBarObserver?.onTabsButtonLongClicked()
NotifyMenuButtonClicked -> browserNavigationBarObserver?.onMenuButtonClicked()
NotifyBackButtonClicked -> browserNavigationBarObserver?.onBackButtonClicked()
NotifyBackButtonLongClicked -> browserNavigationBarObserver?.onBackButtonLongClicked()
NotifyForwardButtonClicked -> browserNavigationBarObserver?.onForwardButtonClicked()
NotifyBookmarksButtonClicked -> browserNavigationBarObserver?.onBookmarksButtonClicked()
NotifyNewTabButtonClicked -> browserNavigationBarObserver?.onNewTabButtonClicked()
NotifyAutofillButtonClicked -> browserNavigationBarObserver?.onAutofillButtonClicked()
Expand All @@ -232,12 +226,13 @@ class BrowserNavigationBarView @JvmOverloads constructor(
enum class ViewMode {
NewTab,
Browser,
TabManager,
}

/**
* Behavior that offsets the navigation bar proportionally to the offset of the top omnibar.
*/
private class BottomViewBehavior(
inner class BottomViewBehavior(
context: Context,
attrs: AttributeSet?,
) : Behavior<View>(context, attrs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,6 @@ class BrowserNavigationBarViewModel @Inject constructor(
it.copy(
newTabButtonVisible = false,
autofillButtonVisible = true,
fireButtonVisible = true,
tabsButtonVisible = true,
)
}
}
Expand All @@ -133,8 +131,17 @@ class BrowserNavigationBarViewModel @Inject constructor(
it.copy(
newTabButtonVisible = true,
autofillButtonVisible = false,
fireButtonVisible = true,
tabsButtonVisible = true,
)
}
}

ViewMode.TabManager -> {
_viewState.update {
it.copy(
newTabButtonVisible = true,
autofillButtonVisible = false,
tabsButtonVisible = false,
bookmarksButtonVisible = false,
)
}
}
Expand All @@ -154,9 +161,6 @@ class BrowserNavigationBarViewModel @Inject constructor(
data object NotifyTabsButtonClicked : Command()
data object NotifyTabsButtonLongClicked : Command()
data object NotifyMenuButtonClicked : Command()
data object NotifyBackButtonClicked : Command()
data object NotifyBackButtonLongClicked : Command()
data object NotifyForwardButtonClicked : Command()
data object NotifyNewTabButtonClicked : Command()
data object NotifyAutofillButtonClicked : Command()
data object NotifyBookmarksButtonClicked : Command()
Expand Down
44 changes: 30 additions & 14 deletions app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ import com.duckduckgo.app.browser.R
import com.duckduckgo.app.browser.databinding.ActivityTabSwitcherBinding
import com.duckduckgo.app.browser.databinding.PopupTabsMenuBinding
import com.duckduckgo.app.browser.favicon.FaviconManager
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarObserver
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarView
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewPersister
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.downloads.DownloadsActivity
Expand All @@ -50,7 +52,6 @@ import com.duckduckgo.app.global.events.db.UserEventsStore
import com.duckduckgo.app.global.view.ClearDataAction
import com.duckduckgo.app.global.view.FireDialog
import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.settings.SettingsActivity
import com.duckduckgo.app.settings.clear.OnboardingExperimentFireAnimationHelper
import com.duckduckgo.app.settings.db.SettingsDataStore
Expand All @@ -72,8 +73,8 @@ import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShareLinks
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowAnimatedTileDismissalDialog
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowUndoBookmarkMessage
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowUndoDeleteTabsMessage
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.Mode
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.Mode.Selection
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.Mode
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.Mode.Selection
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.browser.ui.omnibar.OmnibarType
import com.duckduckgo.common.ui.DuckDuckGoActivity
Expand Down Expand Up @@ -224,8 +225,7 @@ class TabSwitcherActivity :
null
}
OmnibarType.SPLIT -> {
null
// TODO: add bottom bar
binding.navigationBar
}
}
}
Expand All @@ -244,13 +244,32 @@ class TabSwitcherActivity :
configureViewReferences()
setupToolbar(toolbar)
configureRecycler()
configureNavigationBar()

configureObservers()
configureOnBackPressedListener()

initMenuClickListeners()
}

private fun configureNavigationBar() {
binding.navigationBar.browserNavigationBarObserver =
object : BrowserNavigationBarObserver {
override fun onMenuButtonClicked() {
showPopupMenu(binding.navigationBar.popupMenuAnchor.id)
}

override fun onNewTabButtonClicked() {
viewModel.onNewTabRequested()
}

override fun onFireButtonClicked() {
viewModel.onFireButtonTapped()
}
}
binding.navigationBar.setViewMode(BrowserNavigationBarView.ViewMode.TabManager)
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)

Expand All @@ -267,11 +286,9 @@ class TabSwitcherActivity :
when (settingsDataStore.omnibarType) {
OmnibarType.SINGLE_TOP -> {
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
// TODO: remove bottom bar
}
OmnibarType.SINGLE_BOTTOM -> {
binding.root.removeView(binding.tabSwitcherToolbarTop.root)
// TODO: remove bottom bar
}
OmnibarType.SPLIT -> {
binding.root.removeView(binding.tabSwitcherToolbarBottom.root)
Expand Down Expand Up @@ -392,7 +409,7 @@ class TabSwitcherActivity :

private fun configureObservers() {
lifecycleScope.launch {
viewModel.selectionViewState.flowWithLifecycle(lifecycle).collectLatest {
viewModel.viewState.flowWithLifecycle(lifecycle).collectLatest {
tabsRecycler.invalidateItemDecorations()
tabsAdapter.updateData(it.tabSwitcherItems)

Expand Down Expand Up @@ -546,6 +563,7 @@ class TabSwitcherActivity :
is ShowUndoDeleteTabsMessage -> showTabsDeletedSnackbar(command.tabIds)
ShowAnimatedTileDismissalDialog -> showAnimatedTileDismissalDialog()
DismissAnimatedTileDismissalDialog -> tabSwitcherAnimationTileRemovalDialog!!.dismiss()
Command.ShowFireBottomSheet -> onFireButtonClicked()
}
}

Expand All @@ -566,14 +584,15 @@ class TabSwitcherActivity :
menuInflater.inflate(R.menu.menu_tab_switcher_activity, menu)

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

val numSelectedTabs = viewModel.selectionViewState.value.numSelectedTabs
val numSelectedTabs = viewModel.viewState.value.numSelectedTabs
menu.createDynamicInterface(
numSelectedTabs = numSelectedTabs,
popupMenu = popupBinding,
toolbar = toolbar,
dynamicMenu = viewState.dynamicInterface,
navigationBar = binding.navigationBar,
)

return true
Expand All @@ -598,7 +617,7 @@ class TabSwitcherActivity :

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.fireToolbarButton -> onFireButtonClicked()
R.id.fireToolbarButton -> viewModel.onFireButtonTapped()
R.id.popupMenuToolbarButton -> showPopupMenu(item.itemId)
R.id.newTabToolbarButton -> onNewTabRequested(fromOverflowMenu = false)
R.id.duckAIToolbarButton -> viewModel.onDuckAIButtonClicked()
Expand Down Expand Up @@ -627,7 +646,6 @@ class TabSwitcherActivity :
}

private fun onFireButtonClicked() {
pixel.fire(AppPixelName.FORGET_ALL_PRESSED_TABSWITCHING)
val dialog =
FireDialog(
context = this,
Expand Down Expand Up @@ -930,7 +948,5 @@ class TabSwitcherActivity :
private const val TAB_GRID_COLUMN_WIDTH_DP = 180
private const val TAB_GRID_MAX_COLUMN_COUNT = 4
private const val KEY_FIRST_TIME_LOADING = "FIRST_TIME_LOADING"
private const val FAB_SCROLL_THRESHOLD = 7
private const val TABS_CONTENT_PADDING_DP = 56
}
}
17 changes: 11 additions & 6 deletions app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherMenuExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,21 @@ import androidx.appcompat.widget.Toolbar
import androidx.core.view.isVisible
import com.duckduckgo.app.browser.R
import com.duckduckgo.app.browser.databinding.PopupTabsMenuBinding
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.ARROW
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.CLOSE
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.DynamicInterface
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.GRID
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.HIDDEN
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.LayoutMode.LIST
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarView
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.BackButtonType.ARROW
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.BackButtonType.CLOSE
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.DynamicInterface
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.LayoutMode.GRID
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.LayoutMode.HIDDEN
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.LayoutMode.LIST
import com.duckduckgo.mobile.android.R as commonR

fun Menu.createDynamicInterface(
numSelectedTabs: Int,
popupMenu: PopupTabsMenuBinding,
toolbar: Toolbar,
dynamicMenu: DynamicInterface,
navigationBar: BrowserNavigationBarView,
) {
popupMenu.selectAllMenuItem.isVisible = dynamicMenu.isSelectAllVisible
popupMenu.deselectAllMenuItem.isVisible = dynamicMenu.isDeselectAllVisible
Expand Down Expand Up @@ -94,4 +96,7 @@ fun Menu.createDynamicInterface(
findItem(R.id.fireToolbarButton).isVisible = dynamicMenu.isFireButtonVisible
findItem(R.id.duckAIToolbarButton).isVisible = dynamicMenu.isDuckAIButtonVisible
findItem(R.id.newTabToolbarButton).isVisible = dynamicMenu.isNewTabButtonVisible
findItem(R.id.popupMenuToolbarButton).isVisible = dynamicMenu.isMenuButtonVisible

navigationBar.isVisible = dynamicMenu.isBottomBarVisible
}
Loading
Loading