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 ac45bf4079e0..a65fe5e49921 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
@@ -37,6 +37,7 @@ import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
+import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
@@ -75,6 +76,7 @@ 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.clipboard.ClipboardInteractor
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
@@ -202,6 +204,9 @@ class OmnibarLayout @JvmOverloads constructor(
@Inject
lateinit var omnibarRepository: OmnibarRepository
+ @Inject
+ lateinit var clipboardInteractor: ClipboardInteractor
+
private var previousTransitionState: TransitionState? = null
private val lifecycleOwner: LifecycleOwner by lazy {
@@ -586,6 +591,10 @@ class OmnibarLayout @JvmOverloads constructor(
duckAISidebar.setOnClickListener {
omnibarItemPressedListener?.onDuckAISidebarButtonPressed()
}
+ newCustomTabToolbarContainer.customTabInnerContainer.setOnLongClickListener {
+ viewModel.onCustomTabUrlLongClicked()
+ true
+ }
}
override fun setLogoClickListener(logoClickListener: LogoClickListener) {
@@ -722,6 +731,17 @@ class OmnibarLayout @JvmOverloads constructor(
200,
)
}
+
+ is Command.CopyUrlToClipboard -> {
+ copyUrlToClipboardAndShowToast(command)
+ }
+ }
+ }
+
+ private fun copyUrlToClipboardAndShowToast(command: Command.CopyUrlToClipboard) {
+ val notificationShownAutomatically = clipboardInteractor.copyToClipboard(toCopy = command.url, isSensitive = false)
+ if (!notificationShownAutomatically) {
+ Toast.makeText(context, R.string.urlCopiedToClipboard, Toast.LENGTH_SHORT).show()
}
}
diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt
index ae5ab676757c..17080b3e830c 100644
--- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt
+++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModel.kt
@@ -246,6 +246,7 @@ class OmnibarLayoutViewModel @Inject constructor(
data class LaunchInputScreen(val query: String) : Command()
data class EasterEggLogoClicked(val url: String) : Command()
data object FocusInputField : Command()
+ data class CopyUrlToClipboard(val url: String) : Command()
}
sealed class LeadingIconState {
@@ -1076,6 +1077,15 @@ class OmnibarLayoutViewModel @Inject constructor(
}
}
+ fun onCustomTabUrlLongClicked() {
+ viewModelScope.launch {
+ val url = _viewState.value.url
+ if (url.isNotEmpty()) {
+ command.send(Command.CopyUrlToClipboard(url))
+ }
+ }
+ }
+
private data class NewTabPixelParams(
val isNtp: Boolean,
val isFocused: Boolean,
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 0e5df35c5902..58c6d6c043d9 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -72,6 +72,7 @@
Опции
Споделяне на връзка
Копиране на адреса на връзката
+ URL адресът е копиран в клипборда
Намери следващ
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 26a24196b12d..5f26d525d58f 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -74,6 +74,7 @@
Možnosti
Sdílet odkaz
Kopírovat adresu odkazu
+ Adresa URL se zkopírovala do schránky
Najít další
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index dde96adbbb0a..ae7236fc7938 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -72,6 +72,7 @@
Valgmuligheder
Del link
Kopiér linkadresse
+ URL kopieret til udklipsholder
Find næste
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 7ed03219fe7b..a92c4b983737 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -72,6 +72,7 @@
Optionen
Link teilen
Link-Adresse kopieren
+ URL in Zwischenablage kopiert
Nächstes Ergebnis
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 20db622c7de4..0ce70b08cf43 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -72,6 +72,7 @@
Επιλογές
Κοινή χρήση συνδέσμου
Αντιγραφή διεύθυνσης συνδέσμου
+ Έγινε αντιγραφή της διεύθυνσης URL στο πρόχειρο
Εύρεση επόμενου
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 08d0e9b76d18..28edc7c2ca7f 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -72,6 +72,7 @@
Opciones
Compartir enlace
Copiar dirección de enlace
+ URL copiada en el portapapeles
Buscar siguiente
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 5d68051a5b8b..1b50d6fdd00c 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -72,6 +72,7 @@
Valikud
Jaga linki
Kopeeri lingi aadress
+ URL kopeeriti lõikelauale
Otsi järgmine
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 7386b4928c78..0045b0a3180b 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -72,6 +72,7 @@
Valinnat
Jaa linkki
Kopioi linkin osoite
+ URL kopioitu leikepöydälle
Etsi seuraava
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d439e819a0b5..810a6697fb53 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -72,6 +72,7 @@
Options
Partager le lien
Copier l\'adresse du lien
+ URL copiée dans le presse-papiers
Suivant
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 85381c7c96b2..e3ef7d621254 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -74,6 +74,7 @@
Opcije
Podijeli poveznicu
Kopiraj adresu poveznice
+ URL je kopiran u međuspremnik
Pronađi sljedeće
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 90a2803e35e7..27aea096cc39 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -72,6 +72,7 @@
Opciók
Link megosztása
Link címének másolása
+ URL a vágólapra másolva
Következő keresése
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 20f0f3d5daa4..244ace921a26 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -72,6 +72,7 @@
Opzioni
Condividi link
Copia l\'indirizzo del link
+ URL copiato negli appunti
Trova successivo
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 05e54334aaa1..a052befc56ea 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -74,6 +74,7 @@
Parinktys
Bendrinti nuorodą
Kopijuoti nuorodos adresą
+ URL nukopijuotas į iškarpinę
Rasti kitą
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index d90ff9fa0a00..d6c7f3d23806 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -73,6 +73,7 @@
Opcijas
Kopīgot saiti
Kopēt saites adresi
+ URL ir nokopēts starpliktuvē
Atrast nākamo
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 1e0f2e5e2b65..4e1a9c7ca828 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -72,6 +72,7 @@
Alternativer
Del lenke
Kopier lenke
+ URL-adressen er kopiert til utklippstavlen
Finn neste
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index df53898725d8..5048dacb19ff 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -72,6 +72,7 @@
Opties
Link delen
Adres link kopiëren
+ URL gekopieerd naar klembord
Volgende zoeken
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 9f306c4eddef..6fb9c953170b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -74,6 +74,7 @@
Opcje
Udostępnij link
Skopiuj adres linku
+ URL skopiowany do schowka
Znajdź następny element
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index a06dba9e88a2..03f07f967483 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -72,6 +72,7 @@
Opções
Partilhar ligação
Copiar endereço de ligação
+ URL copiado para a área de transferência
Encontrar seguinte
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 7280c043d4f0..aefd024844fe 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -73,6 +73,7 @@
Opțiuni
Trimite linkul
Copiază adresa linkului
+ Adresa URL a fost copiată în clipboard
Arată rezultatul următor
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 848128fa5360..79970c0cf2c3 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -74,6 +74,7 @@
Параметры
Поделиться ссылкой
Скопировать ссылку
+ URL скопирован в буфер обмена
Найти следующий
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index a511d34c3286..3a473b9c856d 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -74,6 +74,7 @@
Možnosti
Zdieľať odkaz
Kopírovať adresu odkazu
+ URL adresa bola skopírovaná do schránky
Hľadať ďalšie
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index cd0044807a1a..302e18f75069 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -74,6 +74,7 @@
Možnosti
Daj povezavo v skupno rabo
Kopiraj naslov povezave
+ URL je kopiran v odložišče
Najdi naslednje
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 3a08df934565..9f8c0db033e3 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -72,6 +72,7 @@
Alternativ
Dela länk
Kopia länkadress
+ URL har kopierats till urklipp
Hitta nästa
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 6972e5311134..53c2b60a3074 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -72,6 +72,7 @@
Seçenekler
Bağlantıyı paylaş
Bağlantı Adresini Kopyala
+ URL panoya kopyalandı
Sonrakini bul
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d8b22b033ab0..1c6e6644d5a7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -71,6 +71,7 @@
Options
Share Link
Copy Link Address
+ URL copied to clipboard
Find next
diff --git a/app/src/test/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModelTest.kt
index 282343f5dc72..fdb8ed51e44e 100644
--- a/app/src/test/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModelTest.kt
+++ b/app/src/test/java/com/duckduckgo/app/browser/omnibar/OmnibarLayoutViewModelTest.kt
@@ -9,6 +9,7 @@ import com.duckduckgo.app.browser.DuckDuckGoUrlDetectorImpl
import com.duckduckgo.app.browser.defaultbrowsing.prompts.AdditionalDefaultBrowserPrompts
import com.duckduckgo.app.browser.omnibar.Omnibar.ViewMode
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command
+import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.CopyUrlToClipboard
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.Command.LaunchInputScreen
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState
import com.duckduckgo.app.browser.omnibar.OmnibarLayoutViewModel.LeadingIconState.Search
@@ -2466,4 +2467,44 @@ class OmnibarLayoutViewModelTest {
assertTrue(viewState.updateOmnibarText)
}
}
+
+ @Test
+ fun whenCustomTabUrlLongClickedWithValidUrlThenCopyUrlToClipboardCommandSent() = runTest {
+ givenSiteLoaded(RANDOM_URL)
+
+ testee.onCustomTabUrlLongClicked()
+
+ testee.commands().test {
+ val command = awaitItem()
+ assertTrue(command is Command.CopyUrlToClipboard)
+ assertEquals(RANDOM_URL, (command as Command.CopyUrlToClipboard).url)
+ cancelAndIgnoreRemainingEvents()
+ }
+ }
+
+ @Test
+ fun whenCustomTabUrlLongClickedWithEmptyUrlThenNoCommandSent() = runTest {
+ givenSiteLoaded(EMPTY_URL)
+
+ testee.onCustomTabUrlLongClicked()
+
+ testee.commands().test {
+ expectNoEvents()
+ }
+ }
+
+ @Test
+ fun whenCustomTabUrlLongClickedThenCommandContainsCurrentViewStateUrl() = runTest {
+ val expectedUrl = "https://example.com/test"
+ givenSiteLoaded(expectedUrl)
+
+ testee.onCustomTabUrlLongClicked()
+
+ testee.commands().test {
+ val command = awaitItem()
+ assertTrue(command is Command.CopyUrlToClipboard)
+ assertEquals(expectedUrl, (command as Command.CopyUrlToClipboard).url)
+ cancelAndIgnoreRemainingEvents()
+ }
+ }
}