Skip to content

Commit

Permalink
Merge branch 'hotfix/5.227.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
CDRussell committed Feb 24, 2025
2 parents 4cdb239 + e87ba67 commit 8168a29
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 121 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,12 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
tabsAdapter.getTabSwitcherItem(position)?.let { tab ->
when (tab) {
is TabSwitcherItem.Tab -> {
launch { viewModel.onTabDeleted(tab.tabEntity) }
launch {
viewModel.onMarkTabAsDeletable(
tab = tab.tabEntity,
swipeGestureUsed = deletedBySwipe,
)
}
}
}
}
Expand Down
38 changes: 28 additions & 10 deletions app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
Expand All @@ -35,12 +37,12 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.duckduckgo.app.browser.databinding.ItemTabGridBinding
import com.duckduckgo.app.browser.databinding.ItemTabListBinding
import com.duckduckgo.app.browser.favicon.FaviconManager
import com.duckduckgo.app.browser.tabpreview.TabEntityDiffCallback.Companion.DIFF_KEY_PREVIEW
import com.duckduckgo.app.browser.tabpreview.TabEntityDiffCallback.Companion.DIFF_KEY_TITLE
import com.duckduckgo.app.browser.tabpreview.TabEntityDiffCallback.Companion.DIFF_KEY_URL
import com.duckduckgo.app.browser.tabpreview.TabEntityDiffCallback.Companion.DIFF_KEY_VIEWED
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewPersister
import com.duckduckgo.app.browser.tabs.adapter.TabSwitcherItemDiffCallback
import com.duckduckgo.app.browser.tabs.adapter.TabSwitcherItemDiffCallback.Companion.DIFF_KEY_PREVIEW
import com.duckduckgo.app.browser.tabs.adapter.TabSwitcherItemDiffCallback.Companion.DIFF_KEY_TITLE
import com.duckduckgo.app.browser.tabs.adapter.TabSwitcherItemDiffCallback.Companion.DIFF_KEY_URL
import com.duckduckgo.app.browser.tabs.adapter.TabSwitcherItemDiffCallback.Companion.DIFF_KEY_VIEWED
import com.duckduckgo.app.tabs.model.TabEntity
import com.duckduckgo.app.tabs.model.TabSwitcherData.LayoutType
import com.duckduckgo.app.tabs.ui.TabSwitcherAdapter.TabSwitcherViewHolder.Companion.GRID_TAB
Expand Down Expand Up @@ -115,6 +117,19 @@ class TabSwitcherAdapter(
}
}

@VisibleForTesting
fun createCloseClickListener(
bindingAdapterPosition: () -> Int,
tabSwitcherListener: TabSwitcherListener,
): View.OnClickListener {
return View.OnClickListener {
val position = bindingAdapterPosition()
if (position != RecyclerView.NO_POSITION) {
tabSwitcherListener.onTabDeleted(position = position, deletedBySwipe = false)
}
}
}

private fun bindListTab(holder: TabSwitcherViewHolder.ListTabViewHolder, tab: TabEntity) {
val context = holder.binding.root.context
holder.title.text = extractTabTitle(tab, context)
Expand All @@ -124,7 +139,7 @@ class TabSwitcherAdapter(
loadFavicon(tab, holder.favicon)
attachTabClickListeners(
tabViewHolder = holder,
bindingAdapterPosition = holder.bindingAdapterPosition,
bindingAdapterPosition = { holder.bindingAdapterPosition },
tab = tab,
)
}
Expand All @@ -138,7 +153,7 @@ class TabSwitcherAdapter(
loadTabPreviewImage(tab, glide, holder)
attachTabClickListeners(
tabViewHolder = holder,
bindingAdapterPosition = holder.bindingAdapterPosition,
bindingAdapterPosition = { holder.bindingAdapterPosition },
tab = tab,
)
}
Expand Down Expand Up @@ -252,15 +267,18 @@ class TabSwitcherAdapter(
}
}

private fun attachTabClickListeners(tabViewHolder: TabViewHolder, bindingAdapterPosition: Int, tab: TabEntity) {
private fun attachTabClickListeners(tabViewHolder: TabViewHolder, bindingAdapterPosition: () -> Int, tab: TabEntity) {
tabViewHolder.rootView.setOnClickListener {
if (!isDragging) {
itemClickListener.onTabSelected(tab)
}
}
tabViewHolder.close.setOnClickListener {
itemClickListener.onTabDeleted(bindingAdapterPosition, false)
}
tabViewHolder.close.setOnClickListener(
createCloseClickListener(
bindingAdapterPosition = bindingAdapterPosition,
tabSwitcherListener = itemClickListener,
),
)
}

fun updateData(updatedList: List<TabSwitcherItem>) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* 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.tabs.tabs.ui

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.duckduckgo.app.browser.favicon.FaviconManager
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewPersister
import com.duckduckgo.app.tabs.ui.TabSwitcherAdapter
import com.duckduckgo.app.tabs.ui.TabSwitcherListener
import com.duckduckgo.common.utils.DispatcherProvider
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify

@RunWith(AndroidJUnit4::class)
class TabSwitcherAdapterTestAndroid {

private val mockTabSwitchListener: TabSwitcherListener = mock()
private val testee: TabSwitcherAdapter = createMockTabSwitcherAdapter(
listener = mockTabSwitchListener,
)

@Test
fun `close click listener returns current position`() {
var currentPosition = 5
val positionProvider = { currentPosition }

val clickListener = testee.createCloseClickListener(positionProvider, mockTabSwitchListener)

clickListener.onClick(mock())
verify(mockTabSwitchListener).onTabDeleted(5, false)

currentPosition = 3

clickListener.onClick(mock())
verify(mockTabSwitchListener).onTabDeleted(3, false)
}

fun createMockTabSwitcherAdapter(
listener: TabSwitcherListener,
): TabSwitcherAdapter {
return TabSwitcherAdapter(
itemClickListener = listener,
webViewPreviewPersister = mock<WebViewPreviewPersister>(),
lifecycleOwner = mock(),
faviconManager = mock<FaviconManager>(),
dispatchers = mock<DispatcherProvider>(),
)
}
}
2 changes: 1 addition & 1 deletion app/version/version.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION=5.227.0
VERSION=5.227.1

0 comments on commit 8168a29

Please sign in to comment.