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() + } + } }