From 42ee60c6771f3827fbfb6a0b0609f50952b11b9c Mon Sep 17 00:00:00 2001 From: Dax Mobile <44842493+daxmobile@users.noreply.github.com> Date: Tue, 28 May 2024 10:41:11 +0200 Subject: [PATCH 01/12] Update content scope scripts to version 5.18.0 (#4592) Task/Issue URL: https://app.asana.com/0/488551667048375/1207418287456970/f ----- - Automated content scope scripts dependency update This PR updates the content scope scripts dependency to the latest available version and copies the necessary files. If tests have failed, see https://app.asana.com/0/1202561462274611/1203986899650836/f for further information on what to do next. - [x] All tests must pass Co-authored-by: daxmobile --- package-lock.json | 50 ++++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65a0a4fa28f7..b3aea2d8d87f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@duckduckgo/autoconsent": "^10.8.0", "@duckduckgo/autofill": "github:duckduckgo/duckduckgo-autofill#10.2.0", - "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.17.0", + "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.18.0", "@duckduckgo/privacy-dashboard": "github:duckduckgo/privacy-dashboard#3.5.0", "@duckduckgo/privacy-reference-tests": "github:duckduckgo/privacy-reference-tests#1708702034" }, @@ -23,12 +23,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -36,21 +36,21 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -69,7 +69,7 @@ "hasInstallScript": true }, "node_modules/@duckduckgo/content-scope-scripts": { - "resolved": "git+ssh://git@github.com/duckduckgo/content-scope-scripts.git#fa861c4eccb21d235e34070b208b78bdc32ece08", + "resolved": "git+ssh://git@github.com/duckduckgo/content-scope-scripts.git#1f563c01d5da4777120b672d7473c36947a0c727", "hasInstallScript": true, "workspaces": [ "packages/special-pages", @@ -333,12 +333,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -471,9 +471,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -529,6 +529,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -621,6 +622,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -771,12 +773,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { diff --git a/package.json b/package.json index 3fa8785a8388..f64e3292599d 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "dependencies": { "@duckduckgo/autoconsent": "^10.8.0", "@duckduckgo/autofill": "github:duckduckgo/duckduckgo-autofill#10.2.0", - "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.17.0", + "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.18.0", "@duckduckgo/privacy-dashboard": "github:duckduckgo/privacy-dashboard#3.5.0", "@duckduckgo/privacy-reference-tests": "github:duckduckgo/privacy-reference-tests#1708702034" } From a12b7a6b19dc3add14d44e98ed7329ec7f106e55 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Tue, 28 May 2024 11:27:51 +0100 Subject: [PATCH 02/12] Update copy when deleting passwords to consider whether sync enabled or not (#4445) Task/Issue URL: https://app.asana.com/0/488551667048375/1206638124888258/f ### Description Copy changes around deleting passwords (now showing a different message when sync is enabled vs disabled). Translations will come in https://github.com/duckduckgo/Android/pull/4446 # Steps to test this PR ## Sync Disabled ### single saved password - [ ] Disable sync (or leave it disabled if off already) - [ ] Visit password management screen (overflow -> passwords) - [ ] Add a single saved password (so you only have 1 total). - [ ] Return to password management screen - [ ] Then choose overflow -> Delete All Passwords - [ ] Verify the dialog title is **Are you sure you want to delete this password?** - [ ] Verify the dialog message says "password" (singular) and "account" (singular) - [ ] Verify the dialog message says it'll be "deleted from this device" - [ ] Cancel the prompt. Click on the overflow of the saved password, and choose **Delete**. Ensure the last two checks you just did are still valid for this scenario. ### multiple saved passwords - [ ] Add a second saved password (so you now have 2 total), and return to password management screen - [ ] Then choose overflow -> Delete All Passwords - [ ] Verify the dialog title is **Are you sure you want to delete 2 passwords** - [ ] Verify the dialog message says "password**s**" and "account**s**" - [ ] Verify the dialog message says it'll be "deleted from this device" ## Sync Enabled ### multiple saved passwords - [ ] Enable sync - [ ] Visit password management screen (overflow -> passwords). Ensure you have > 1 saved password. - [ ] Then choose overflow -> Delete All Passwords - [ ] Verify the dialog title is **Are you sure you want to delete 2 passwords** - [ ] Verify the dialog message says "password**s**" and "account**s**" - [ ] Verify the dialog message says it'll be "deleted from all synced devices" ### single saved password - [ ] Enable sync - [ ] Visit password management screen (overflow -> passwords). Ensure you have exactly 1 saved password. - [ ] Then choose overflow -> Delete All Passwords - [ ] Verify the dialog title is **Are you sure you want to delete this password?** - [ ] Verify the dialog message says "password" (singular) and "account" (singular) - [ ] Verify the dialog message says it'll be "deleted from all synced devices" --- .../AutofillManagementCredentialsMode.kt | 40 +++++--- .../viewing/AutofillManagementListMode.kt | 97 +++++++++---------- .../AutofillManagementStringBuilder.kt | 80 +++++++++++++++ .../res/values-bg/strings-autofill-impl.xml | 8 -- .../res/values-cs/strings-autofill-impl.xml | 10 -- .../res/values-da/strings-autofill-impl.xml | 8 -- .../res/values-de/strings-autofill-impl.xml | 8 -- .../res/values-el/strings-autofill-impl.xml | 8 -- .../res/values-es/strings-autofill-impl.xml | 8 -- .../res/values-et/strings-autofill-impl.xml | 8 -- .../res/values-fi/strings-autofill-impl.xml | 8 -- .../res/values-fr/strings-autofill-impl.xml | 8 -- .../res/values-hr/strings-autofill-impl.xml | 10 -- .../res/values-hu/strings-autofill-impl.xml | 8 -- .../res/values-it/strings-autofill-impl.xml | 8 -- .../res/values-lt/strings-autofill-impl.xml | 10 -- .../res/values-lv/strings-autofill-impl.xml | 9 -- .../res/values-nb/strings-autofill-impl.xml | 8 -- .../res/values-nl/strings-autofill-impl.xml | 8 -- .../res/values-pl/strings-autofill-impl.xml | 10 -- .../res/values-pt/strings-autofill-impl.xml | 8 -- .../res/values-ro/strings-autofill-impl.xml | 9 -- .../res/values-ru/strings-autofill-impl.xml | 10 -- .../res/values-sk/strings-autofill-impl.xml | 10 -- .../res/values-sl/strings-autofill-impl.xml | 10 -- .../res/values-sv/strings-autofill-impl.xml | 8 -- .../res/values-tr/strings-autofill-impl.xml | 8 -- .../src/main/res/values/donottranslate.xml | 20 ++++ .../main/res/values/strings-autofill-impl.xml | 7 -- ...AutofillManagementStringBuilderImplTest.kt | 87 +++++++++++++++++ 30 files changed, 259 insertions(+), 280 deletions(-) create mode 100644 autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilder.kt create mode 100644 autofill/autofill-impl/src/test/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilderImplTest.kt diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementCredentialsMode.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementCredentialsMode.kt index 582d9a1eb87d..6d04d0b24ece 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementCredentialsMode.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementCredentialsMode.kt @@ -104,6 +104,9 @@ class AutofillManagementCredentialsMode : DuckDuckGoFragment(R.layout.fragment_a @Inject lateinit var browserNav: BrowserNav + @Inject + lateinit var stringBuilder: AutofillManagementStringBuilder + // we need to revert the toolbar title when this fragment is destroyed, so will track its initial value private var initialActionBarTitle: String? = null @@ -176,21 +179,28 @@ class AutofillManagementCredentialsMode : DuckDuckGoFragment(R.layout.fragment_a private fun launchDeleteLoginConfirmationDialog() { this.context?.let { - TextAlertDialogBuilder(it) - .setTitle(R.string.autofillDeleteLoginDialogTitle) - .setMessage(R.string.credentialManagementDeletePasswordConfirmationMessage) - .setDestructiveButtons(true) - .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) - .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) - .addEventListener( - object : TextAlertDialogBuilder.EventListener() { - override fun onPositiveButtonClicked() { - viewModel.onDeleteCurrentCredentials() - viewModel.onExitCredentialMode() - } - }, - ) - .show() + lifecycleScope.launch(dispatchers.io()) { + val dialogTitle = stringBuilder.stringForDeletePasswordDialogConfirmationTitle(numberToDelete = 1) + val dialogMessage = stringBuilder.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 1) + + withContext(dispatchers.main()) { + TextAlertDialogBuilder(it) + .setTitle(dialogTitle) + .setMessage(dialogMessage) + .setDestructiveButtons(true) + .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) + .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) + .addEventListener( + object : TextAlertDialogBuilder.EventListener() { + override fun onPositiveButtonClicked() { + viewModel.onDeleteCurrentCredentials() + viewModel.onExitCredentialMode() + } + }, + ) + .show() + } + } } } diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementListMode.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementListMode.kt index 4d7c3a726b6e..c51a52d61905 100644 --- a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementListMode.kt +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementListMode.kt @@ -69,6 +69,7 @@ import com.duckduckgo.di.scopes.FragmentScope import com.duckduckgo.mobile.android.R as CommonR import javax.inject.Inject import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @InjectWith(FragmentScope::class) class AutofillManagementListMode : DuckDuckGoFragment(R.layout.fragment_autofill_management_list_mode) { @@ -100,6 +101,9 @@ class AutofillManagementListMode : DuckDuckGoFragment(R.layout.fragment_autofill @Inject lateinit var deviceAuthenticator: DeviceAuthenticator + @Inject + lateinit var stringBuilder: AutofillManagementStringBuilder + val viewModel by lazy { ViewModelProvider(requireActivity(), viewModelFactory)[AutofillSettingsViewModel::class.java] } @@ -350,61 +354,54 @@ class AutofillManagementListMode : DuckDuckGoFragment(R.layout.fragment_autofill private fun launchDeleteLoginConfirmationDialog(loginCredentials: LoginCredentials) { this.context?.let { - TextAlertDialogBuilder(it) - .setTitle(R.string.autofillDeleteLoginDialogTitle) - .setMessage(R.string.credentialManagementDeletePasswordConfirmationMessage) - .setDestructiveButtons(true) - .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) - .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) - .addEventListener( - object : TextAlertDialogBuilder.EventListener() { - override fun onPositiveButtonClicked() { - viewModel.onDeleteCredentials(loginCredentials) - } - }, - ) - .show() + lifecycleScope.launch(dispatchers.io()) { + val dialogTitle = stringBuilder.stringForDeletePasswordDialogConfirmationTitle(numberToDelete = 1) + val dialogMessage = stringBuilder.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 1) + + withContext(dispatchers.main()) { + TextAlertDialogBuilder(it) + .setTitle(dialogTitle) + .setMessage(dialogMessage) + .setDestructiveButtons(true) + .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) + .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) + .addEventListener( + object : TextAlertDialogBuilder.EventListener() { + override fun onPositiveButtonClicked() { + viewModel.onDeleteCredentials(loginCredentials) + } + }, + ) + .show() + } + } } } private fun launchDeleteAllLoginsConfirmationDialog(numberToDelete: Int) { - val displayStrings = getDisplayStringsForDeletingAllLogins(numberToDelete) - this.context?.let { - TextAlertDialogBuilder(it) - .setTitle(displayStrings.first) - .setMessage(displayStrings.second) - .setDestructiveButtons(true) - .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) - .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) - .setCancellable(true) - .addEventListener( - object : TextAlertDialogBuilder.EventListener() { - override fun onPositiveButtonClicked() { - viewModel.onDeleteAllPasswordsConfirmed() - } - }, - ) - .show() - } - } - - /** - * Returns a pair of strings for the title and message of the delete all logins confirmation dialog. - * - * The strings will change depending on if there is only one login to delete or multiple. - */ - private fun getDisplayStringsForDeletingAllLogins(numberToDelete: Int): Pair { - return if (numberToDelete == 1) { - Pair( - getString(R.string.autofillDeleteLoginDialogTitle), - getString(R.string.credentialManagementDeletePasswordConfirmationMessage), - ) - } else { - Pair( - resources.getQuantityString(R.plurals.credentialManagementDeleteAllPasswordsConfirmationTitle, numberToDelete, numberToDelete), - getString(R.string.credentialManagementDeleteAllPasswordsConfirmationMessage), - ) + lifecycleScope.launch(dispatchers.io()) { + val dialogTitle = stringBuilder.stringForDeletePasswordDialogConfirmationTitle(numberToDelete) + val dialogMessage = stringBuilder.stringForDeletePasswordDialogConfirmationMessage(numberToDelete) + + withContext(dispatchers.main()) { + TextAlertDialogBuilder(it) + .setTitle(dialogTitle) + .setMessage(dialogMessage) + .setDestructiveButtons(true) + .setPositiveButton(R.string.autofillDeleteLoginDialogDelete) + .setNegativeButton(R.string.autofillDeleteLoginDialogCancel) + .setCancellable(true) + .addEventListener( + object : TextAlertDialogBuilder.EventListener() { + override fun onPositiveButtonClicked() { + viewModel.onDeleteAllPasswordsConfirmed() + } + }, + ) + .show() + } + } } } diff --git a/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilder.kt b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilder.kt new file mode 100644 index 000000000000..2650349500c6 --- /dev/null +++ b/autofill/autofill-impl/src/main/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilder.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2024 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.autofill.impl.ui.credential.management.viewing + +import android.content.Context +import android.content.res.Resources +import com.duckduckgo.autofill.impl.R +import com.duckduckgo.common.utils.DispatcherProvider +import com.duckduckgo.di.scopes.FragmentScope +import com.duckduckgo.sync.api.DeviceSyncState +import com.squareup.anvil.annotations.ContributesBinding +import javax.inject.Inject +import kotlinx.coroutines.withContext + +interface AutofillManagementStringBuilder { + fun stringForDeletePasswordDialogConfirmationTitle(numberToDelete: Int): String + suspend fun stringForDeletePasswordDialogConfirmationMessage(numberToDelete: Int): String +} + +@ContributesBinding(FragmentScope::class) +class AutofillManagementStringBuilderImpl @Inject constructor( + private val context: Context, + private val deviceSyncState: DeviceSyncState, + private val dispatchers: DispatcherProvider, +) : AutofillManagementStringBuilder { + + override fun stringForDeletePasswordDialogConfirmationTitle(numberToDelete: Int): String { + if (numberToDelete == 1) { + return context.getString(R.string.credentialManagementDeleteAllPasswordsDialogConfirmationTitleSingular) + } + + return context.resources.getQuantityString( + R.plurals.credentialManagementDeleteAllPasswordsDialogConfirmationTitlePlural, + numberToDelete, + numberToDelete, + ) + } + + override suspend fun stringForDeletePasswordDialogConfirmationMessage(numberToDelete: Int): String { + val firstMessage = context.resources.deleteAllPasswordsWarning(numberToDelete) + val secondMessage = if (numberToDelete == 1) { + context.resources.getString(R.string.credentialManagementDeleteAllSecondInstructionSingular) + } else { + context.resources.getQuantityString(R.plurals.credentialManagementDeleteAllSecondInstructionPlural, numberToDelete) + } + return "$firstMessage $secondMessage" + } + + private suspend fun Resources.deleteAllPasswordsWarning(numberToDelete: Int): String { + return withContext(dispatchers.io()) { + return@withContext if (deviceSyncState.isUserSignedInOnDevice()) { + if (numberToDelete == 1) { + getString(R.string.credentialManagementDeleteAllPasswordsFirstInstructionSyncedSingular) + } else { + getQuantityString(R.plurals.credentialManagementDeleteAllPasswordsFirstInstructionSyncedPlural, numberToDelete) + } + } else { + if (numberToDelete == 1) { + getString(R.string.credentialManagementDeleteAllPasswordsDialogFirstInstructionNotSyncedSingular) + } else { + getQuantityString(R.plurals.credentialManagementDeleteAllPasswordsDialogFirstInstructionNotSyncedPlural, numberToDelete) + } + } + } + } +} diff --git a/autofill/autofill-impl/src/main/res/values-bg/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-bg/strings-autofill-impl.xml index 30cc04e0c5b7..eeaddaf8e626 100644 --- a/autofill/autofill-impl/src/main/res/values-bg/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-bg/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Паролите се съхраняват сигурно на Вашето устройство. Добавяне на парола Заглавие - Сигурни ли сте, че искате да изтриете тази парола? Паролата е изтрита Последна актуализация %1$s Искате ли да продължите да запазвате пароли? @@ -152,13 +151,6 @@ Отмени Изтриване на всички пароли - - Сигурни ли сте, че искате да изтриете %1$d парола? - Сигурни ли сте, че искате да изтриете %1$d пароли? - - - Вашата парола ще бъде изтрита от всички синхронизирани устройства. Уверете се, че все още имате друг начин за достъп до акаунта си. - Вашите пароли ще бъдат изтрити от всички синхронизирани устройства. Уверете се, че все още имате друг начин за достъп до Вашите акаунти. %1$d изтрита парола diff --git a/autofill/autofill-impl/src/main/res/values-cs/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-cs/strings-autofill-impl.xml index bda9d0ad955b..687084db4ce6 100644 --- a/autofill/autofill-impl/src/main/res/values-cs/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-cs/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Hesla se bezpečně ukládají do tvého zařízení. Přidat heslo Název - Opravdu chceš smazat tohle heslo? Heslo smazáno Poslední aktualizace %1$s Chceš dál ukládat hesla? @@ -152,15 +151,6 @@ Zrušit Smazat všechna hesla - - Opravdu chceš smazat %1$d heslo? - Opravdu chceš smazat %1$d hesla? - Opravdu chceš smazat %1$d hesla? - Opravdu chceš smazat %1$d hesel? - - - Tvoje heslo se smaže ze všech synchronizovaných zařízení. Zkontroluj si předtím, že se i tak dostaneš ke svému účtu. - Tvoje hesla se smažou ze všech synchronizovaných zařízení. Zkontroluj si předtím, že se k účtům i tak dostaneš. %1$d smazané heslo diff --git a/autofill/autofill-impl/src/main/res/values-da/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-da/strings-autofill-impl.xml index 4a0e04c02501..3ec7929ed60d 100644 --- a/autofill/autofill-impl/src/main/res/values-da/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-da/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Adgangskoder gemmes sikkert på din enhed. Tilføj adgangskode Titel - Er du sikker på, at du vil slette denne adgangskode? Adgangskode slettet Sidst opdateret %1$s Vil du fortsætte med at gemme adgangskoder? @@ -152,13 +151,6 @@ Annuller Slet alle adgangskoder - - Er du sikker på, at du vil slette %1$d adgangskode? - Er du sikker på, at du vil slette %1$d adgangskoder? - - - Din adgangskode slettes fra alle synkroniserede enheder. Husk at sikre, at du stadig har adgang til din konto. - Dine adgangskoder slettes fra alle synkroniserede enheder. Husk at sikre, at du stadig har adgang til dine konti. %1$d adgangskode slettet diff --git a/autofill/autofill-impl/src/main/res/values-de/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-de/strings-autofill-impl.xml index 8a735af08b69..6b95ce37042f 100644 --- a/autofill/autofill-impl/src/main/res/values-de/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-de/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Passwörter werden sicher auf deinem Gerät gespeichert. Passwort hinzufügen Titel - Möchtest du dieses Passwort wirklich löschen? Passwort gelöscht Zuletzt aktualisiert %1$s Möchtest du weiterhin Passwörter speichern? @@ -152,13 +151,6 @@ Abbrechen Alle Passwörter löschen - - Möchtest du dieses %1$d Passwort wirklich löschen? - Möchtest du diese %1$d Passwörter wirklich löschen? - - - Dein Passwort wird von allen synchronisierten Geräten gelöscht. Vergewissere dich, dass du weiterhin eine Möglichkeit hast, auf dein Konto zuzugreifen. - Deine Passwörter werden von allen synchronisierten Geräten gelöscht. Vergewissere dich, dass du weiterhin eine Möglichkeit hast, auf deine Konten zuzugreifen. %1$d Passwort gelöscht diff --git a/autofill/autofill-impl/src/main/res/values-el/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-el/strings-autofill-impl.xml index c70f97f1c3ec..0f6d9ec16961 100644 --- a/autofill/autofill-impl/src/main/res/values-el/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-el/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Οι κωδικοί πρόσβασης αποθηκεύονται με ασφάλεια στη συσκευή σας. Προσθήκη κωδικού πρόσβασης Τίτλος - Θέλετε σίγουρα να διαγράψετε αυτόν τον κωδικό πρόσβασης; Διαγραφή κωδικού πρόσβασης Τελευταία ενημέρωση %1$s Θέλετε να συνεχίσετε να αποθηκεύετε κωδικούς πρόσβασης; @@ -152,13 +151,6 @@ Ακύρωση Διαγραφή όλων των κωδικών πρόσβασης - - Θέλετε σίγουρα να διαγράψετε %1$d κωδικούς πρόσβασης; - Θέλετε σίγουρα να διαγράψετε %1$d κωδικούς πρόσβασης; - - - Ο κωδικός πρόσβασής σας θα διαγραφεί από όλες τις συγχρονισμένες συσκευές. Βεβαιωθείτε ότι έχετε ακόμα τρόπο πρόσβασης στον λογαριασμό σας. - Οι κωδικοί πρόσβασής σας θα διαγραφούν από όλες τις συγχρονισμένες συσκευές. Βεβαιωθείτε ότι έχετε ακόμα τρόπο πρόσβασης στους λογαριασμούς σας. %1$d κωδικός πρόσβασης διαγράφηκε diff --git a/autofill/autofill-impl/src/main/res/values-es/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-es/strings-autofill-impl.xml index 41226cbc371a..52a25487dd16 100644 --- a/autofill/autofill-impl/src/main/res/values-es/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-es/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Las contraseñas se almacenan de forma segura en tu dispositivo. Añadir contraseña Título - ¿Seguro de que quieres borrar esta contraseña? Contraseña borrada Última actualización %1$s ¿Quieres seguir guardando contraseñas? @@ -152,13 +151,6 @@ Cancelar Borrar todas las contraseñas - - ¿Seguro de que quieres borrar %1$d contraseña? - ¿Seguro de que quieres borrar %1$d contraseñas? - - - Tu contraseña se borrará en todos los dispositivos sincronizados. Asegúrate de seguir teniendo una forma de acceder a tu cuenta. - Tus contraseñas se borrarán en todos los dispositivos sincronizados. Asegúrate de seguir teniendo una forma de acceder a tus cuentas. %1$d contraseña borrada diff --git a/autofill/autofill-impl/src/main/res/values-et/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-et/strings-autofill-impl.xml index 8b30cdf8e4fd..5549c4f11b86 100644 --- a/autofill/autofill-impl/src/main/res/values-et/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-et/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Paroolid salvestatakse turvaliselt sinu seadmesse. Parooli lisamine Pealkiri - Kas oled kindel, et soovid selle parooli kustutada? Parool on kustutatud Viimati uuendatud %1$s Kas soovid jätkata paroolide salvestamist? @@ -152,13 +151,6 @@ Loobu Kustuta kõik paroolid - - Kas soovid kindlasti %1$d parooli kustutada? - Kas soovid kindlasti %1$d parooli kustutada? - - - Sinu parool kustutatakse kõigist sünkroonitud seadmetest. Veendu, et sulle jääks endiselt mõni viis oma kontole pääsemiseks. - Sinu paroolid kustutatakse kõikidest sünkroonitud seadmetest. Veendu, et sulle jääks endiselt mõni viis oma kontodele pääsemiseks. %1$d parool kustutatud diff --git a/autofill/autofill-impl/src/main/res/values-fi/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-fi/strings-autofill-impl.xml index b34a59fb8377..15ad227060ae 100644 --- a/autofill/autofill-impl/src/main/res/values-fi/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-fi/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Salasanat tallennetaan laitteellesi turvallisesti. Lisää salasana Otsikko - Haluatko varmasti poistaa tämän salasanan? Salasana poistettu Viimeksi päivitetty %1$s Haluatko jatkaa salasanojen tallentamista? @@ -152,13 +151,6 @@ Peruuta Poista kaikki salasanat - - Haluatko varmasti poistaa %1$d salasanan? - Haluatko varmasti poistaa %1$d salasanaa? - - - Salasanasi poistetaan kaikista synkronoiduista laitteista. Varmista, että pääset yhä käyttämään tiliäsi. - Salasanasi poistetaan kaikista synkronoiduista laitteista. Varmista, että pääset yhä käyttämään tilejäsi. %1$d salasana poistettu diff --git a/autofill/autofill-impl/src/main/res/values-fr/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-fr/strings-autofill-impl.xml index 6e7552a2e5d5..4c12afa4837f 100644 --- a/autofill/autofill-impl/src/main/res/values-fr/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-fr/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Les mots de passe sont stockés en toute sécurité sur votre appareil. Ajouter un mot de passe Titre - Voulez-vous vraiment supprimer ce mot de passe ? Le mot de passe a été supprimé Dernière modification : %1$s Voulez-vous continuer à enregistrer vos mots de passe ? @@ -152,13 +151,6 @@ Annuler Supprimer tous les mots de passe - - Voulez-vous vraiment supprimer %1$d mot de passe ? - Voulez-vous vraiment supprimer %1$d mots de passe ? - - - Votre mot de passe sera supprimé de tous les appareils synchronisés. Assurez-vous d\'avoir toujours un moyen d\'accéder à votre compte. - Vos mots de passe seront supprimés de tous les appareils synchronisés. Assurez-vous d\'avoir toujours un moyen d\'accéder à vos comptes. %1$d mot de passe supprimé diff --git a/autofill/autofill-impl/src/main/res/values-hr/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-hr/strings-autofill-impl.xml index c445d6ec5e89..2a8ccef04a74 100644 --- a/autofill/autofill-impl/src/main/res/values-hr/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-hr/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Lozinke su sigurno pohranjene na tvom uređaju. Dodaj lozinku Naslov - Sigurno želiš izbrisati ovu lozinku? Lozinka je izbrisana Posljednje ažuriranje: %1$s Želiš li nastaviti spremati lozinke? @@ -152,15 +151,6 @@ Odustani Izbriši sve lozinke - - Sigurno želiš izbrisati %1$d lozinku? - Sigurno želiš izbrisati %1$d lozinke? - Sigurno želiš izbrisati %1$d lozinki? - Sigurno želiš izbrisati %1$d lozinki? - - - Tvoja lozinka bit će izbrisana sa svih sinkroniziranih uređaja. Uvjeri se da i dalje imaš način pristupa svom računu. - Tvoje lozinke bit će izbrisane sa svih sinkroniziranih uređaja. Uvjeri se da i dalje imaš način pristupa svojim računima. Izbrisana je %1$d lozinka diff --git a/autofill/autofill-impl/src/main/res/values-hu/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-hu/strings-autofill-impl.xml index 7252cc0cc410..405b69f9bd74 100644 --- a/autofill/autofill-impl/src/main/res/values-hu/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-hu/strings-autofill-impl.xml @@ -126,7 +126,6 @@ A jelszavakat az eszközöd biztonságosan tárolja. Jelszó hozzáadása Cím - Biztosan törlöd ezt a jelszót? Jelszó törölve Utolsó frissítés: %1$s Továbbra is szeretnéd menteni a jelszavakat? @@ -152,13 +151,6 @@ Mégsem Minden jelszó törlése - - Biztosan törölni szeretnél %1$d jelszót? - Biztosan törölni szeretnél %1$d jelszót? - - - A jelszó az összes szinkronizált eszközről törölve lesz. Győződj meg róla, hogy továbbra is hozzáférsz a fiókodhoz. - A jelszavak az összes szinkronizált eszközről törölve lesznek. Győződj meg róla, hogy továbbra is hozzáférsz a fiókjaidhoz. %1$d jelszó törölve diff --git a/autofill/autofill-impl/src/main/res/values-it/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-it/strings-autofill-impl.xml index 1e0968dd9c58..596d42f67098 100644 --- a/autofill/autofill-impl/src/main/res/values-it/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-it/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Le password sono archiviate in modo sicuro sul tuo dispositivo. Aggiungi password Titolo - Eliminare questa password? Password eliminata Ultimo aggiornamento %1$s Continuare a salvare le password? @@ -152,13 +151,6 @@ Annulla Elimina tutte le password - - Eliminare %1$d password? - Eliminare %1$d password? - - - La password verrà eliminata da tutti i dispositivi sincronizzati. Assicurati di avere ancora la possibilità di accedere al tuo account. - Le password verranno eliminate da tutti i dispositivi sincronizzati. Assicurati di avere ancora la possibilità di accedere ai tuoi account. %1$d password eliminata diff --git a/autofill/autofill-impl/src/main/res/values-lt/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-lt/strings-autofill-impl.xml index 948544841c34..8dc5d3a0087f 100644 --- a/autofill/autofill-impl/src/main/res/values-lt/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-lt/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Slaptažodžiai saugiai saugomi jūsų įrenginyje. Pridėti slaptažodį Pavadinimas - Ar tikrai norite ištrinti šį slaptažodį? Slaptažodis ištrintas Paskutinį kartą atnaujinta %1$s Ar norite toliau saugoti slaptažodžius? @@ -152,15 +151,6 @@ Atšaukti Ištrinti visus slaptažodžius - - Ar tikrai norite ištrinti %1$d slaptažodį? - Ar tikrai norite ištrinti %1$d slaptažodžius? - Ar tikrai norite ištrinti %1$d slaptažodžio? - Ar tikrai norite ištrinti %1$d slaptažodžių? - - - Jūsų slaptažodis bus ištrintas iš visų sinchronizuojamų įrenginių. Įsitikinkite, kad vis dar turite būdą, kaip pasiekti paskyrą. - Jūsų slaptažodžiai bus ištrinti iš visų sinchronizuojamų įrenginių. Įsitikinkite, kad vis dar turite būdą, kaip pasiekti paskyras. %1$d slaptažodis ištrintas diff --git a/autofill/autofill-impl/src/main/res/values-lv/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-lv/strings-autofill-impl.xml index 9e2f198ef53b..5c9c426c8cc4 100644 --- a/autofill/autofill-impl/src/main/res/values-lv/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-lv/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Paroles tiek droši glabātas tavā ierīcē. Pievienot paroli Nosaukums - Vai tiešām vēlies dzēst šo paroli? Parole dzēsta Pēdējoreiz atjaunināts %1$s Vai vēlaties turpināt saglabāt paroles? @@ -152,14 +151,6 @@ Atcelt Dzēst visas paroles - - Vai tiešām vēlies dzēst %1$d paroles? - Vai tiešām vēlies dzēst %1$d paroli? - Vai tiešām vēlies dzēst %1$d paroles? - - - Parole tiks dzēsta no visām sinhronizētajām ierīcēm. Pārliecinies, vai joprojām varēsi piekļūt savam kontam. - Paroles tiks dzēstas no visām sinhronizētajām ierīcēm. Pārliecinies, vai joprojām varēsi piekļūt savam kontam. %1$d paroles izdzēstas diff --git a/autofill/autofill-impl/src/main/res/values-nb/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-nb/strings-autofill-impl.xml index 6ca5722c152d..a0f4aa4c1c35 100644 --- a/autofill/autofill-impl/src/main/res/values-nb/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-nb/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Passord lagres på enheten din på en sikker måte. Legg til passord Tittel - Er du sikker på at du vil slette dette passordet? Passordet er slettet Sist oppdatert %1$s Vil du fortsette å lagre passord? @@ -152,13 +151,6 @@ Avbryt Slett alle passord - - Er du sikker på at du vil slette %1$d passord? - Er du sikker på at du vil slette %1$d passord? - - - Passordet ditt blir slettet fra alle synkroniserte enheter. Sørg for at du fortsatt har tilgang til kontoen din. - Passordene dine slettes fra alle synkroniserte enheter. Sørg for at du fortsatt har tilgang til kontoene dine. %1$d passord er slettet diff --git a/autofill/autofill-impl/src/main/res/values-nl/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-nl/strings-autofill-impl.xml index 8f3c954de6a0..c4e5c10c2638 100644 --- a/autofill/autofill-impl/src/main/res/values-nl/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-nl/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Wachtwoorden worden veilig opgeslagen op je apparaat. Wachtwoord toevoegen Titel - Weet je zeker dat je dit wachtwoord wilt verwijderen? Wachtwoord verwijderd Laatst bijgewerkt op %1$s Wil je wachtwoorden blijven opslaan? @@ -152,13 +151,6 @@ Annuleren Alle wachtwoorden verwijderen - - Weet je zeker dat je %1$d wachtwoord wilt verwijderen? - Weet je zeker dat je %1$d wachtwoorden wilt verwijderen? - - - Je wachtwoord wordt verwijderd van alle gesynchroniseerde apparaten. Zorg ervoor dat je nog steeds toegang hebt tot je account. - Je wachtwoorden worden verwijderd van alle gesynchroniseerde apparaten. Zorg ervoor dat je nog steeds toegang hebt tot je accounts. %1$d wachtwoord verwijderd diff --git a/autofill/autofill-impl/src/main/res/values-pl/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-pl/strings-autofill-impl.xml index f08ebfb86ef2..a9fd6831cf37 100644 --- a/autofill/autofill-impl/src/main/res/values-pl/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-pl/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Hasła są bezpiecznie przechowywane na Twoim urządzeniu. Dodaj hasło Tytuł - Czy na pewno chcesz usunąć to hasło? Hasło usunięte Ostatnia aktualizacja %1$s Czy chcesz nadal zapisywać hasła? @@ -152,15 +151,6 @@ Anuluj Usuń wszystkie hasła - - Czy na pewno chcesz usunąć %1$d hasło? - Czy na pewno chcesz usunąć %1$d hasła? - Czy na pewno chcesz usunąć %1$d haseł? - Czy na pewno chcesz usunąć %1$d hasła? - - - Twoje hasło zostanie usunięte ze wszystkich zsynchronizowanych urządzeń. Upewnij się, że nadal masz możliwość dostępu do swojego konta. - Twoje hasła zostaną usunięte ze wszystkich zsynchronizowanych urządzeń. Upewnij się, że nadal masz możliwość dostępu do swoich kont. Usunięto %1$d hasło diff --git a/autofill/autofill-impl/src/main/res/values-pt/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-pt/strings-autofill-impl.xml index 4ce154035d7a..90abbc4173c0 100644 --- a/autofill/autofill-impl/src/main/res/values-pt/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-pt/strings-autofill-impl.xml @@ -126,7 +126,6 @@ As palavras-passe são armazenadas com segurança no teu dispositivo. Adicionar palavra-passe Título - Tens a certeza de que pretendes eliminar esta palavra-passe? Palavra-passe eliminada Última atualização a %1$s Pretendes continuar a guardar palavras-passe? @@ -152,13 +151,6 @@ Cancelar Eliminar todas as palavras-passe - - Tens a certeza de que pretendes eliminar %1$d palavra-passe? - Tens a certeza de que pretendes eliminar %1$d palavras-passe? - - - A tua palavra-passe será eliminada de todos os dispositivos sincronizados. Confirma que ainda tens uma forma de aceder à conta. - As tuas palavras-passe serão eliminadas de todos os dispositivos sincronizados. Confirma que ainda tens uma forma de aceder às contas. %1$d palavra-passe eliminada diff --git a/autofill/autofill-impl/src/main/res/values-ro/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-ro/strings-autofill-impl.xml index dc635070746f..fb357086cc37 100644 --- a/autofill/autofill-impl/src/main/res/values-ro/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-ro/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Parolele sunt stocate în siguranță pe dispozitivul tău. Adaugă parola Titlu - Sigur dorești să ștergi această parolă? Parolă ștearsă Ultima actualizare %1$s Dorești să continui să salvezi parolele? @@ -152,14 +151,6 @@ Anulare Șterge toate parolele - - Sigur dorești să ștergi %1$d parolă? - Sigur dorești să ștergi %1$d parole? - Sigur dorești să ștergi această %1$d de parole? - - - Parola ta va fi ștearsă de pe toate dispozitivele sincronizate. Asigură-te că ai în continuare posibilitatea de a-ți accesa contul. - Parolele tale vor fi șterse de pe toate dispozitivele sincronizate. Asigură-te că ai în continuare posibilitatea de a-ți accesa conturile. %1$d parolă ștearsă diff --git a/autofill/autofill-impl/src/main/res/values-ru/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-ru/strings-autofill-impl.xml index 6ac5672c8147..7df59927d55f 100644 --- a/autofill/autofill-impl/src/main/res/values-ru/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-ru/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Пароли надежно защищены и хранятся на вашем устройстве. Добавление пароля Название - Вы точно хотите удалить этот пароль? Пароль удален Последнее обновление: %1$s Продолжить сохранять пароли? @@ -152,15 +151,6 @@ Отменить Удалить все пароли - - Вы точно хотите удалить %1$d пароль? - Вы точно хотите удалить %1$d пароля? - Вы точно хотите удалить %1$d паролей? - Вы точно хотите удалить пароли (%1$d)? - - - Пароль будет удален со всех синхронизированных устройств. Обязательно убедитесь, что вы можете войти в свою учетную запись другим способом. - Пароли будут удалены со всех синхронизированных устройств. Убедитесь, что вы по-прежнему можете войти в свои учетные записи. Удален %1$d пароль diff --git a/autofill/autofill-impl/src/main/res/values-sk/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-sk/strings-autofill-impl.xml index 0ffbe0cb2600..49cbd0029a60 100644 --- a/autofill/autofill-impl/src/main/res/values-sk/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-sk/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Heslá sú zabezpečeným spôsobom uložené vo vašom zariadení. Pridať heslo Názov - Naozaj chcete odstrániť toto heslo? Heslo bolo odstránené Naposledy aktualizované %1$s Chcete pokračovať v ukladaní hesiel? @@ -152,15 +151,6 @@ Zrušiť Odstránenie všetkých hesiel - - Naozaj chcete odstrániť %1$d heslo? - Naozaj chcete odstrániť %1$d heslá? - Naozaj chcete odstrániť %1$d hesla? - Naozaj chcete odstrániť %1$d hesiel? - - - Vaše heslo sa odstráni zo všetkých synchronizovaných zariadení. Zabezpečte si prístup k svojmu účtu. - Vaše heslá sa odstránia zo všetkých synchronizovaných zariadení. Zabezpečte si prístup k svojim účtom. Bolo odstránené %1$d heslo diff --git a/autofill/autofill-impl/src/main/res/values-sl/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-sl/strings-autofill-impl.xml index 5d17b40a3f14..942a427489f9 100644 --- a/autofill/autofill-impl/src/main/res/values-sl/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-sl/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Gesla so varno shranjena v vaši napravi. Dodajte geslo Naslov - Ali ste prepričani, da želite izbrisati to geslo? Geslo je izbrisano Nazadnje posodobljeno dne %1$s Ali želite še naprej shranjevati gesla? @@ -152,15 +151,6 @@ Prekliči Brisanje vseh gesel - - Ali ste prepričani, da želite izbrisati %1$d geslo? - Ali ste prepričani, da želite izbrisati %1$d gesli? - Ali ste prepričani, da želite izbrisati %1$d gesla? - Ali ste prepričani, da želite izbrisati %1$d gesel? - - - Vaše geslo bo izbrisano iz vseh sinhroniziranih naprav. Prepričajte se, da imate še vedno možnost dostopa do svojega računa. - Vaša gesla bodo izbrisana iz vseh sinhroniziranih naprav. Prepričajte se, da imate še vedno možnost dostopa do svojih računov. %1$d geslo je bilo izbrisano diff --git a/autofill/autofill-impl/src/main/res/values-sv/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-sv/strings-autofill-impl.xml index ce3fe1e1d21b..3582cc363d18 100644 --- a/autofill/autofill-impl/src/main/res/values-sv/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-sv/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Lösenord lagras säkert på din enhet. Lägg till lösenord Rubrik - Är du säker på att du vill radera detta lösenord? Lösenordet har raderats Uppdaterades senast %1$s Vill du fortsätta spara lösenord? @@ -152,13 +151,6 @@ Avbryt Radera alla lösenord - - Är du säker på att du vill radera %1$d lösenord? - Är du säker på att du vill radera %1$d lösenord? - - - Ditt lösenord kommer att raderas från alla synkroniserade enheter. Se till att du har kvar ett sätt att komma åt ditt konto. - Dina lösenord raderas från alla synkroniserade enheter. Se till att du har kvar ett sätt att komma åt dina konton. %1$d lösenord raderat diff --git a/autofill/autofill-impl/src/main/res/values-tr/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values-tr/strings-autofill-impl.xml index 050e8708f509..1dcb771c96dc 100644 --- a/autofill/autofill-impl/src/main/res/values-tr/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values-tr/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Şifreler cihazınızda güvenli bir şekilde saklanır. Şifre Ekle Title - Bu şifreyi silmek istediğinizden emin misiniz? Şifre silindi Son güncelleme %1$s Şifreleri kaydetmeye devam etmek istiyor musunuz? @@ -152,13 +151,6 @@ Vazgeç Tüm Şifreleri Sil - - Bu %1$d şifreyi silmek istediğinizden emin misiniz? - Bu %1$d şifreyi silmek istediğinizden emin misiniz? - - - Şifreniz senkronize edilen tüm cihazlardan silinecek. Hesabınıza başka bir şekilde erişebilecek olduğunuzdan emin olun. - Şifreleriniz senkronize edilen tüm cihazlardan silinecektir. Hesaplarınıza başka bir şekilde erişebilecek olduğunuzdan emin olun. %1$d şifre silindi diff --git a/autofill/autofill-impl/src/main/res/values/donottranslate.xml b/autofill/autofill-impl/src/main/res/values/donottranslate.xml index c8b768fb87e2..146be810ce81 100644 --- a/autofill/autofill-impl/src/main/res/values/donottranslate.xml +++ b/autofill/autofill-impl/src/main/res/values/donottranslate.xml @@ -15,4 +15,24 @@ --> + + Your password will be deleted from this device. + + Your passwords will be deleted from this device. + + + Your password will be deleted from all synced devices. + + Your passwords will be deleted from all synced devices. + + + Are you sure you want to delete this password? + + Are you sure you want to delete %1$d passwords? + + + Make sure you still have a way to access your account. + + Make sure you still have a way to access your accounts. + \ No newline at end of file diff --git a/autofill/autofill-impl/src/main/res/values/strings-autofill-impl.xml b/autofill/autofill-impl/src/main/res/values/strings-autofill-impl.xml index 8d3bfcd22371..08dee3cd0557 100644 --- a/autofill/autofill-impl/src/main/res/values/strings-autofill-impl.xml +++ b/autofill/autofill-impl/src/main/res/values/strings-autofill-impl.xml @@ -126,7 +126,6 @@ Passwords are stored securely on your device. Add Password Title - Are you sure you want to delete this password? Password deleted Last updated %1$s Do you want to keep saving passwords? @@ -152,12 +151,6 @@ Cancel Delete All Passwords - - Are you sure you want to delete %1$d passwords? - - - Your password will be deleted from all synced devices. Make sure you still have a way to access your account. - Your passwords will be deleted from all synced devices. Make sure you still have a way to access your accounts. %1$d password deleted diff --git a/autofill/autofill-impl/src/test/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilderImplTest.kt b/autofill/autofill-impl/src/test/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilderImplTest.kt new file mode 100644 index 000000000000..29b9005c639c --- /dev/null +++ b/autofill/autofill-impl/src/test/java/com/duckduckgo/autofill/impl/ui/credential/management/viewing/AutofillManagementStringBuilderImplTest.kt @@ -0,0 +1,87 @@ +package com.duckduckgo.autofill.impl.ui.credential.management.viewing + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.duckduckgo.common.test.CoroutineTestRule +import com.duckduckgo.sync.api.DeviceSyncState +import kotlinx.coroutines.test.runTest +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@RunWith(AndroidJUnit4::class) +class AutofillManagementStringBuilderImplTest { + + @get:Rule + val coroutineTestRule: CoroutineTestRule = CoroutineTestRule() + + private val context = InstrumentationRegistry.getInstrumentation().targetContext + private val deviceSyncState: DeviceSyncState = mock() + + private val testee = AutofillManagementStringBuilderImpl( + context = context, + deviceSyncState = deviceSyncState, + dispatchers = coroutineTestRule.testDispatcherProvider, + ) + + @Test + fun whenDeletingOneLoginThenBuildsCorrectTitle() { + val str = testee.stringForDeletePasswordDialogConfirmationTitle(numberToDelete = 1) + assertEquals(DELETE_DIALOG_TITLE_1_PASSWORD, str) + } + + @Test + fun whenDeletingMultipleLoginsThenBuildsCorrectTitle() { + val str = testee.stringForDeletePasswordDialogConfirmationTitle(numberToDelete = 2) + assertEquals(DELETE_DIALOG_TITLE_2_PASSWORDS, str) + } + + @Test + fun whenDeletingOneLoginWithSyncEnabledThenBuildsCorrectMessage() = runTest { + configureSyncState(enabled = true) + val str = testee.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 1) + assertEquals("$DELETE_DIALOG_MESSAGE_1_SYNC_ENABLED_SINGULAR $DELETE_DIALOG_MESSAGE_2_SINGULAR", str) + } + + @Test + fun whenDeletingOneLoginWithSyncDisabledThenBuildsCorrectMessage() = runTest { + configureSyncState(enabled = false) + val str = testee.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 1) + assertEquals("$DELETE_DIALOG_MESSAGE_1_SYNC_DISABLED_SINGULAR $DELETE_DIALOG_MESSAGE_2_SINGULAR", str) + } + + @Test + fun whenDeletingTwoLoginsWithSyncEnabledThenBuildsCorrectMessage() = runTest { + configureSyncState(enabled = true) + val str = testee.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 2) + assertEquals("$DELETE_DIALOG_MESSAGE_1_SYNC_ENABLED_PLURAL $DELETE_DIALOG_MESSAGE_2_PLURAL", str) + } + + @Test + fun whenDeletingTwoLoginsWithSyncDisabledThenBuildsCorrectMessage() = runTest { + configureSyncState(enabled = false) + val str = testee.stringForDeletePasswordDialogConfirmationMessage(numberToDelete = 2) + assertEquals("$DELETE_DIALOG_MESSAGE_1_SYNC_DISABLED_PLURAL $DELETE_DIALOG_MESSAGE_2_PLURAL", str) + } + + private fun configureSyncState(enabled: Boolean) { + whenever(deviceSyncState.isUserSignedInOnDevice()).thenReturn(enabled) + } + + private companion object { + private const val DELETE_DIALOG_TITLE_1_PASSWORD = "Are you sure you want to delete this password?" + private const val DELETE_DIALOG_TITLE_2_PASSWORDS = "Are you sure you want to delete 2 passwords?" + + private const val DELETE_DIALOG_MESSAGE_1_SYNC_ENABLED_SINGULAR = "Your password will be deleted from all synced devices." + private const val DELETE_DIALOG_MESSAGE_1_SYNC_ENABLED_PLURAL = "Your passwords will be deleted from all synced devices." + + private const val DELETE_DIALOG_MESSAGE_1_SYNC_DISABLED_SINGULAR = "Your password will be deleted from this device." + private const val DELETE_DIALOG_MESSAGE_1_SYNC_DISABLED_PLURAL = "Your passwords will be deleted from this device." + + private const val DELETE_DIALOG_MESSAGE_2_SINGULAR = "Make sure you still have a way to access your account." + private const val DELETE_DIALOG_MESSAGE_2_PLURAL = "Make sure you still have a way to access your accounts." + } +} From 313b65103fd89a37550b495d79e4b0c1c0bdfc8f Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 29 May 2024 14:53:50 +0100 Subject: [PATCH 03/12] Load library outside instance creation (#4595) Task/Issue URL: https://app.asana.com/0/488551667048375/1207420696563461/f ### Description Load native crash library off class instance construction ### Steps to test this PR _Test_ - [x] fresh install and/or update from this branch - [x] open the app - [x] verify `Native crash handler init pixel sent on main` shows in logcat - [x] verify `Native crash handler successfully initialized on main` shows in logcat - [x] enable AppTP - [x] verify `Native crash handler init pixel sent on vpn` shows in logcat - [x] verify `Native crash handler successfully initialized on vpn` shows in logcat - [x] fire button - [x] verify `Native crash handler init pixel sent on main` shows in logcat - [x] verify `Native crash handler successfully initialized on main` shows in logcat - [x] execute `adb shell am force-stop com.duckduckgo.mobile.android.debug` - [x] launch app - [x] verify `Native crash handler init pixel sent on main` shows in logcat - [x] verify `Native crash handler successfully initialized on main` shows in logcat - [x] verify `Native crash handler init pixel sent on vpn` shows in logcat - [x] verify `Native crash handler successfully initialized on vpn` shows in logcat - [x] disable AppTP - [x] execute `adb shell am force-stop com.duckduckgo.mobile.android.debug` and re-launch app - [x] verify `Native crash handler init pixel sent on main` shows in logcat - [x] verify `Native crash handler successfully initialized on main` shows in logcat _Test main process crash_ - [x] Apply the following patch, rebuild and fresh install ```diff Subject: [PATCH] fix --- Index: anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt --- a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt (revision 3eb803331a644de40af37e35fc0b355770961350) +++ b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt (date 1716898016639) @@ -35,6 +35,7 @@ import logcat.LogPriority.ERROR import logcat.asLog import logcat.logcat +import kotlin.concurrent.thread @ContributesMultibinding( scope = AppScope::class, @@ -57,10 +58,15 @@ private val processName: String by lazy { if (isMainProcess) "main" else "vpn" } private external fun jni_register_sighandler(logLevel: Int, appVersion: String, processName: String, isCustomTab: Boolean) + private external fun jni_crash() override fun onCreate(owner: LifecycleOwner) { if (isMainProcess) { asyncLoadNativeLibrary() + thread { + Thread.sleep(2000) + jni_crash() + } } else { logcat(ERROR) { "ndk-crash: onCreate wrongly called in a secondary process" } } Index: anrs/anrs-impl/src/main/cpp/jni.cpp IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/anrs/anrs-impl/src/main/cpp/jni.cpp b/anrs/anrs-impl/src/main/cpp/jni.cpp --- a/anrs/anrs-impl/src/main/cpp/jni.cpp (revision 3eb803331a644de40af37e35fc0b355770961350) +++ b/anrs/anrs-impl/src/main/cpp/jni.cpp (date 1716897983303) @@ -74,3 +74,19 @@ jobject /* this */) { native_crash_handler_fini(); } + +// Our custom test exception. Anything "publicly" inheriting std::exception will work +class MyException : public std::exception { +public: + const char* what() const noexcept override { + return "This is a really important crash message!"; + } +}; + +extern "C" JNIEXPORT void JNICALL +Java_com_duckduckgo_app_anr_ndk_NativeCrashInit_jni_1crash( + JNIEnv* env, + jobject /* this */) { + throw MyException(); // This can be replaced with any foreign function call that throws. +} + ``` - [x] launch app - [x] verify `Native crash handler init pixel sent on main` shows in logcat - [x] verify `Native crash handler successfully initialized on main` shows in logcat - [x] verify `Native crash pixel sent on main` shows in logcat - [x] verify app crashed too _Test crash in vpn process_ - [x] Apply the following patch, rebuild and fresh install ```diff Subject: [PATCH] fix --- Index: anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt --- a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt (revision 3eb803331a644de40af37e35fc0b355770961350) +++ b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt (date 1716990529537) @@ -35,6 +35,7 @@ import logcat.LogPriority.ERROR import logcat.asLog import logcat.logcat +import kotlin.concurrent.thread @ContributesMultibinding( scope = AppScope::class, @@ -57,6 +58,7 @@ private val processName: String by lazy { if (isMainProcess) "main" else "vpn" } private external fun jni_register_sighandler(logLevel: Int, appVersion: String, processName: String, isCustomTab: Boolean) + private external fun jni_crash() override fun onCreate(owner: LifecycleOwner) { if (isMainProcess) { @@ -69,6 +71,10 @@ override fun onVpnProcessCreated() { if (!isMainProcess) { asyncLoadNativeLibrary() + thread { + Thread.sleep(2000) + jni_crash() + } } else { logcat(ERROR) { "ndk-crash: onCreate wrongly called in the main process" } } Index: anrs/anrs-impl/src/main/cpp/jni.cpp IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/anrs/anrs-impl/src/main/cpp/jni.cpp b/anrs/anrs-impl/src/main/cpp/jni.cpp --- a/anrs/anrs-impl/src/main/cpp/jni.cpp (revision 3eb803331a644de40af37e35fc0b355770961350) +++ b/anrs/anrs-impl/src/main/cpp/jni.cpp (date 1716990529535) @@ -74,3 +74,19 @@ jobject /* this */) { native_crash_handler_fini(); } + +// Our custom test exception. Anything "publicly" inheriting std::exception will work +class MyException : public std::exception { +public: + const char* what() const noexcept override { + return "This is a really important crash message!"; + } +}; + +extern "C" JNIEXPORT void JNICALL +Java_com_duckduckgo_app_anr_ndk_NativeCrashInit_jni_1crash( + JNIEnv* env, + jobject /* this */) { + throw MyException(); // This can be replaced with any foreign function call that throws. +} + ``` - [x] launch app and enable AppTP - [x] verify `Native crash handler init pixel sent on vpn` shows in logcat - [x] verify `Native crash handler successfully initialized on vpn` shows in logcat - [x] verify `Native crash pixel sent on vpn` shows in logcat (The VPN will automatically try to re-start, creating and endless loop, expected) --- .../duckduckgo/app/anr/ndk/NativeCrashInit.kt | 48 +++++++++---------- .../library-loader-api/build.gradle | 2 +- .../library/loader/LibraryLoader.kt | 7 +++ 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt index bb5c2d1ab3da..3ee91fb31ff3 100644 --- a/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt +++ b/anrs/anrs-impl/src/main/java/com/duckduckgo/app/anr/ndk/NativeCrashInit.kt @@ -20,21 +20,18 @@ import android.content.Context import android.util.Log import androidx.lifecycle.LifecycleOwner import com.duckduckgo.app.browser.customtabs.CustomTabDetector -import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.di.IsMainProcess import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver import com.duckduckgo.app.lifecycle.VpnProcessLifecycleObserver import com.duckduckgo.appbuildconfig.api.AppBuildConfig import com.duckduckgo.appbuildconfig.api.isInternalBuild -import com.duckduckgo.common.utils.DispatcherProvider +import com.duckduckgo.common.utils.checkMainThread import com.duckduckgo.di.scopes.AppScope import com.duckduckgo.library.loader.LibraryLoader +import com.duckduckgo.library.loader.LibraryLoader.LibraryLoaderListener import com.squareup.anvil.annotations.ContributesMultibinding import dagger.SingleInstanceIn import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import logcat.LogPriority.ERROR import logcat.asLog import logcat.logcat @@ -49,33 +46,21 @@ import logcat.logcat ) @SingleInstanceIn(AppScope::class) class NativeCrashInit @Inject constructor( - context: Context, + private val context: Context, @IsMainProcess private val isMainProcess: Boolean, private val customTabDetector: CustomTabDetector, private val appBuildConfig: AppBuildConfig, private val nativeCrashFeature: NativeCrashFeature, - private val dispatcherProvider: DispatcherProvider, - @AppCoroutineScope private val coroutineScope: CoroutineScope, -) : MainProcessLifecycleObserver, VpnProcessLifecycleObserver { +) : MainProcessLifecycleObserver, VpnProcessLifecycleObserver, LibraryLoaderListener { private val isCustomTab: Boolean by lazy { customTabDetector.isCustomTab() } private val processName: String by lazy { if (isMainProcess) "main" else "vpn" } - init { - try { - LibraryLoader.loadLibrary(context, "crash-ndk") - } catch (ignored: Throwable) { - logcat(ERROR) { "ndk-crash: Error loading crash-ndk lib: ${ignored.asLog()}" } - } - } - private external fun jni_register_sighandler(logLevel: Int, appVersion: String, processName: String, isCustomTab: Boolean) override fun onCreate(owner: LifecycleOwner) { if (isMainProcess) { - coroutineScope.launch { - jniRegisterNativeSignalHandler() - } + asyncLoadNativeLibrary() } else { logcat(ERROR) { "ndk-crash: onCreate wrongly called in a secondary process" } } @@ -83,18 +68,21 @@ class NativeCrashInit @Inject constructor( override fun onVpnProcessCreated() { if (!isMainProcess) { - coroutineScope.launch { - jniRegisterNativeSignalHandler() - } + asyncLoadNativeLibrary() } else { logcat(ERROR) { "ndk-crash: onCreate wrongly called in the main process" } } } - private suspend fun jniRegisterNativeSignalHandler() = withContext(dispatcherProvider.io()) { + override fun success() { + // do not call on main thread + checkMainThread() + runCatching { - if (isMainProcess && !nativeCrashFeature.nativeCrashHandling().isEnabled()) return@withContext - if (!isMainProcess && !nativeCrashFeature.nativeCrashHandlingSecondaryProcess().isEnabled()) return@withContext + logcat(ERROR) { "ndk-crash: Library loaded in process $processName" } + + if (isMainProcess && !nativeCrashFeature.nativeCrashHandling().isEnabled()) return + if (!isMainProcess && !nativeCrashFeature.nativeCrashHandlingSecondaryProcess().isEnabled()) return val logLevel = if (appBuildConfig.isDebug || appBuildConfig.isInternalBuild()) { Log.VERBOSE @@ -106,4 +94,12 @@ class NativeCrashInit @Inject constructor( logcat(ERROR) { "ndk-crash: Error calling jni_register_sighandler: ${it.asLog()}" } } } + + override fun failure(t: Throwable?) { + logcat(ERROR) { "ndk-crash: error loading library in process $processName: ${t?.asLog()}" } + } + + private fun asyncLoadNativeLibrary() { + LibraryLoader.loadLibrary(context, "crash-ndk", this) + } } diff --git a/library-loader/library-loader-api/build.gradle b/library-loader/library-loader-api/build.gradle index 0a2fd6dcc9d0..81d8ca45bc43 100644 --- a/library-loader/library-loader-api/build.gradle +++ b/library-loader/library-loader-api/build.gradle @@ -23,7 +23,7 @@ apply from: "$rootProject.projectDir/gradle/android-library.gradle" dependencies { - implementation "com.getkeepsafe.relinker:relinker:_" + api "com.getkeepsafe.relinker:relinker:_" } android { diff --git a/library-loader/library-loader-api/src/main/java/com/duckduckgo/library/loader/LibraryLoader.kt b/library-loader/library-loader-api/src/main/java/com/duckduckgo/library/loader/LibraryLoader.kt index e973c8f123a4..f761a852ac5e 100644 --- a/library-loader/library-loader-api/src/main/java/com/duckduckgo/library/loader/LibraryLoader.kt +++ b/library-loader/library-loader-api/src/main/java/com/duckduckgo/library/loader/LibraryLoader.kt @@ -18,11 +18,18 @@ package com.duckduckgo.library.loader import android.content.Context import com.getkeepsafe.relinker.ReLinker +import com.getkeepsafe.relinker.ReLinker.LoadListener class LibraryLoader { companion object { fun loadLibrary(context: Context, name: String) { ReLinker.loadLibrary(context, name) } + + fun loadLibrary(context: Context, name: String, listener: LibraryLoaderListener) { + ReLinker.loadLibrary(context, name, listener) + } } + + interface LibraryLoaderListener : LoadListener } From 01157684199796db3f04d124ed8b553e4a682d5a Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 29 May 2024 21:45:24 +0100 Subject: [PATCH 04/12] Check possible active plugin or plugin point naming clashes (#4596) --- ...ntributesActivePluginPointCodeGenerator.kt | 23 +++ .../lint/WrongPluginPointCollectorDetector.kt | 4 +- .../WrongPluginPointCollectorDetectorTest.kt | 146 ++++++++---------- .../com/duckduckgo/lint/utils/PluginUtils.kt | 47 ++++++ 4 files changed, 139 insertions(+), 81 deletions(-) create mode 100644 lint-rules/src/test/java/com/duckduckgo/lint/utils/PluginUtils.kt diff --git a/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesActivePluginPointCodeGenerator.kt b/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesActivePluginPointCodeGenerator.kt index 07c7b7874246..a600240933ca 100644 --- a/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesActivePluginPointCodeGenerator.kt +++ b/anvil/anvil-compiler/src/main/java/com/duckduckgo/anvil/compiler/ContributesActivePluginPointCodeGenerator.kt @@ -49,6 +49,7 @@ import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.asClassName import dagger.Binds import java.io.File +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.name.FqName @@ -123,6 +124,16 @@ class ContributesActivePluginPointCodeGenerator : CodeGenerator { val pluginClassType = vmClass.pluginClassName(ContributesActivePluginPoint::class.fqName) ?: vmClass.asClassName() val featureName = "pluginPoint${pluginClassType.simpleName}" + // Check if there's another plugin point class that has the same class simplename + // we can't allow that because the backing remote feature would be the same + val existingFeature = featureBackedClassNames.putIfAbsent(featureName, vmClass.fqName) + if (existingFeature != null) { + throw AnvilCompilationException( + "${vmClass.fqName} plugin point naming is duplicated, previous found in $existingFeature", + element = vmClass.clazz.identifyingElement, + ) + } + val content = FileSpec.buildFile(generatedPackage, pluginPointClassFileName) { // This is the normal plugin point addType( @@ -304,6 +315,16 @@ class ContributesActivePluginPointCodeGenerator : CodeGenerator { val pluginRemoteFeatureStoreClassName = "${vmClass.shortName}_ActivePlugin_RemoteFeature_MultiProcessStore" val pluginPriority = vmClass.annotations.firstOrNull { it.fqName == ContributesActivePlugin::class.fqName }?.priorityOrNull() + // Check if there's another plugin class, in the same plugin point, that has the same class simplename + // we can't allow that because the backing remote feature would be the same + val existingFeature = featureBackedClassNames.putIfAbsent("${featureName}_$parentFeatureName", vmClass.fqName) + if (existingFeature != null) { + throw AnvilCompilationException( + "${vmClass.fqName} plugin name is duplicated, previous found in $existingFeature", + element = vmClass.clazz.identifyingElement, + ) + } + val content = FileSpec.buildFile(generatedPackage, pluginClassName) { // First create the class that will contribute the active plugin. // We do expect that the plugins are define using the "ContributesActivePlugin" annotation but are also injected @@ -570,6 +591,8 @@ class ContributesActivePluginPointCodeGenerator : CodeGenerator { } companion object { + internal val featureBackedClassNames = ConcurrentHashMap() + private val pluginPointFqName = FqName("com.duckduckgo.common.utils.plugins.PluginPoint") private val dispatcherProviderFqName = FqName("com.duckduckgo.common.utils.DispatcherProvider") private val activePluginPointFqName = FqName("com.duckduckgo.common.utils.plugins.InternalActivePluginPoint") diff --git a/lint-rules/src/main/java/com/duckduckgo/lint/WrongPluginPointCollectorDetector.kt b/lint-rules/src/main/java/com/duckduckgo/lint/WrongPluginPointCollectorDetector.kt index f60e7af6f4b2..0e54c402d9c4 100644 --- a/lint-rules/src/main/java/com/duckduckgo/lint/WrongPluginPointCollectorDetector.kt +++ b/lint-rules/src/main/java/com/duckduckgo/lint/WrongPluginPointCollectorDetector.kt @@ -84,7 +84,7 @@ class WrongPluginPointCollectorDetector : Detector(), SourceCodeScanner { } private fun PsiClass.isActivePlugin(): Boolean { - return this.isSubtypeOf("com.duckduckgo.common.utils.plugins.ActivePluginPoint.ActivePlugin") + return this.isSubtypeOf("com.duckduckgo.common.utils.plugins.ActivePlugin") } private fun handleField(node: UField) { node.type.let { psiType -> @@ -95,7 +95,7 @@ class WrongPluginPointCollectorDetector : Detector(), SourceCodeScanner { for (typeArgument in typeArguments) { val typeArgumentClass = (typeArgument as? PsiClassType)?.resolve() if (typeArgumentClass?.isSubtypeOf( - "com.duckduckgo.common.utils.plugins.ActivePluginPoint.ActivePlugin" + "com.duckduckgo.common.utils.plugins.ActivePlugin" ) == true) { context.reportError(node, WRONG_PLUGIN_POINT_ISSUE) } diff --git a/lint-rules/src/test/java/com/duckduckgo/lint/WrongPluginPointCollectorDetectorTest.kt b/lint-rules/src/test/java/com/duckduckgo/lint/WrongPluginPointCollectorDetectorTest.kt index dbed099b65ea..4e4bfd97287e 100644 --- a/lint-rules/src/test/java/com/duckduckgo/lint/WrongPluginPointCollectorDetectorTest.kt +++ b/lint-rules/src/test/java/com/duckduckgo/lint/WrongPluginPointCollectorDetectorTest.kt @@ -19,40 +19,40 @@ package com.duckduckgo.lint import com.android.tools.lint.checks.infrastructure.TestFiles.kt import com.android.tools.lint.checks.infrastructure.TestLintTask.lint import com.duckduckgo.lint.WrongPluginPointCollectorDetector.Companion.WRONG_PLUGIN_POINT_ISSUE +import com.duckduckgo.lint.utils.PLUGIN_POINT_ANNOTATIONS_API +import com.duckduckgo.lint.utils.PLUGIN_POINT_API import org.junit.Test class WrongPluginPointCollectorDetectorTest { @Test fun `test normal plugin point constructor parameter collecting active plugins`() { lint() - .files(kt(""" - package com.duckduckgo.common.utils.plugins - - interface PluginPoint { - fun getPlugins(): Collection - } - - interface ActivePluginPoint { - interface ActivePlugin { - suspend fun isActive(): Boolean = true - } - } - - interface MyPlugin - interface MyPluginActivePlugin : ActivePluginPoint.ActivePlugin + .files( + PLUGIN_POINT_API, + PLUGIN_POINT_ANNOTATIONS_API, + kt(""" + package com.test.plugins - class Duck(private val pp: PluginPoint) { - fun quack() { + import com.duckduckgo.common.utils.plugins.ActivePlugin + import com.duckduckgo.common.utils.plugins.PluginPoint + import com.duckduckgo.anvil.annotations.ContributesActivePlugin + + interface MyPlugin + interface MyPluginActivePlugin : ActivePlugin + + class Duck(private val pp: PluginPoint) { + fun quack() { + } } - } - """).indented()) + """).indented() + ) .issues(WRONG_PLUGIN_POINT_ISSUE) .run() .expect(""" - src/com/duckduckgo/common/utils/plugins/PluginPoint.kt:16: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] + src/com/test/plugins/MyPlugin.kt:10: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] class Duck(private val pp: PluginPoint) { ~~~~ - src/com/duckduckgo/common/utils/plugins/PluginPoint.kt:16: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] + src/com/test/plugins/MyPlugin.kt:10: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] class Duck(private val pp: PluginPoint) { ~~ 2 errors, 0 warnings @@ -62,26 +62,23 @@ class WrongPluginPointCollectorDetectorTest { @Test fun `test active plugin point constructor parameter collecting active plugins`() { lint() - .files(kt(""" - package com.duckduckgo.common.utils.plugins - - interface PluginPoint { - fun getPlugins(): Collection - } - - interface ActivePluginPoint { - interface ActivePlugin { - suspend fun isActive(): Boolean = true - } - } - - interface MyPlugin - interface MyPluginActivePlugin : ActivePluginPoint.ActivePlugin + .files( + PLUGIN_POINT_API, + PLUGIN_POINT_ANNOTATIONS_API, + kt(""" + package com.test.plugins + + import com.duckduckgo.common.utils.plugins.ActivePlugin + import com.duckduckgo.common.utils.plugins.PluginPoint + import com.duckduckgo.anvil.annotations.ContributesActivePlugin - class Duck(private val pp: PluginPoint) { - fun quack() { + interface MyPlugin + interface MyPluginActivePlugin : ActivePlugin + + class Duck(private val pp: PluginPoint) { + fun quack() { + } } - } """).indented()) .issues(WRONG_PLUGIN_POINT_ISSUE) .run() @@ -91,33 +88,30 @@ class WrongPluginPointCollectorDetectorTest { @Test fun `test normal plugin point field collecting active plugins`() { lint() - .files(kt(""" - package com.duckduckgo.common.utils.plugins - - interface PluginPoint { - fun getPlugins(): Collection - } - - interface ActivePluginPoint { - interface ActivePlugin { - suspend fun isActive(): Boolean = true - } - } + .files( + PLUGIN_POINT_API, + PLUGIN_POINT_ANNOTATIONS_API, + kt(""" + package com.test.plugins - interface MyPlugin - interface MyPluginActivePlugin : ActivePluginPoint.ActivePlugin + import com.duckduckgo.common.utils.plugins.ActivePlugin + import com.duckduckgo.common.utils.plugins.PluginPoint + import com.duckduckgo.anvil.annotations.ContributesActivePlugin - class Duck { - private val pp: PluginPoint - - fun quack() { + interface MyPlugin + interface MyPluginActivePlugin : ActivePlugin + + class Duck { + private val pp: PluginPoint + + fun quack() { + } } - } """).indented()) .issues(WRONG_PLUGIN_POINT_ISSUE) .run() .expect(""" - src/com/duckduckgo/common/utils/plugins/PluginPoint.kt:17: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] + src/com/test/plugins/MyPlugin.kt:11: Error: PluginPoint cannot be collector of ActivePlugin(s) [WrongPluginPointCollectorDetector] private val pp: PluginPoint ~~ 1 errors, 0 warnings @@ -127,28 +121,22 @@ class WrongPluginPointCollectorDetectorTest { @Test fun `test active plugin point field collecting active plugins`() { lint() - .files(kt(""" - package com.duckduckgo.common.utils.plugins - - interface PluginPoint { - fun getPlugins(): Collection - } - - interface ActivePluginPoint { - interface ActivePlugin { - suspend fun isActive(): Boolean = true - } - } - - interface MyPlugin - interface MyPluginActivePlugin : ActivePluginPoint.ActivePlugin + .files( + PLUGIN_POINT_API, + PLUGIN_POINT_ANNOTATIONS_API, + kt(""" + package com.test.plugins - class Duck { - private val pp: PluginPoint - - fun quack() { + import com.duckduckgo.common.utils.plugins.ActivePlugin + import com.duckduckgo.common.utils.plugins.PluginPoint + import com.duckduckgo.anvil.annotations.ContributesActivePlugin + + class Duck { + private val pp: PluginPoint + + fun quack() { + } } - } """).indented()) .issues(WRONG_PLUGIN_POINT_ISSUE) .run() diff --git a/lint-rules/src/test/java/com/duckduckgo/lint/utils/PluginUtils.kt b/lint-rules/src/test/java/com/duckduckgo/lint/utils/PluginUtils.kt new file mode 100644 index 000000000000..13ad9fa3f9de --- /dev/null +++ b/lint-rules/src/test/java/com/duckduckgo/lint/utils/PluginUtils.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024 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.lint.utils + +import com.android.tools.lint.checks.infrastructure.TestFiles + +internal val PLUGIN_POINT_API = TestFiles.kt( + """ + package com.duckduckgo.common.utils.plugins + + interface PluginPoint { + fun getPlugins(): Collection + } + interface InternalActivePluginPoint { + suspend fun getPlugins(): Collection + } + interface ActivePlugin { + suspend fun isActive(): Boolean = true + } + typealias ActivePluginPoint = InternalActivePluginPoint<@JvmSuppressWildcards T> + """ +).indented() +internal val PLUGIN_POINT_ANNOTATIONS_API = TestFiles.kt( + """ + package com.duckduckgo.anvil.annotations + + annotation class ContributesActivePlugin + annotation class ContributesActivePluginPoint( + val boundType: KClass<*> = Unit::class, + ) + + """ +).indented() From 446bd748654c2f9c26e5af58ba7c6134f383f4f1 Mon Sep 17 00:00:00 2001 From: Noelia Alcala Date: Thu, 30 May 2024 13:07:05 +0100 Subject: [PATCH 05/12] Update search suggestions translations (#4582) Task/Issue URL: https://app.asana.com/0/0/1207432247916613/f ### Description Translations for site and search suggestions ### Steps to test this PR _(Optional)_ - [x] Check CI checks pass ### No UI changes --------- Co-authored-by: root --- app/src/main/res/values-bg/strings.xml | 9 +++++++-- app/src/main/res/values-cs/strings.xml | 9 +++++++-- app/src/main/res/values-da/strings.xml | 9 +++++++-- app/src/main/res/values-de/strings.xml | 9 +++++++-- app/src/main/res/values-el/strings.xml | 9 +++++++-- app/src/main/res/values-es/strings.xml | 9 +++++++-- app/src/main/res/values-et/strings.xml | 9 +++++++-- app/src/main/res/values-fi/strings.xml | 9 +++++++-- app/src/main/res/values-fr/strings.xml | 9 +++++++-- app/src/main/res/values-hr/strings.xml | 9 +++++++-- app/src/main/res/values-hu/strings.xml | 9 +++++++-- app/src/main/res/values-it/strings.xml | 9 +++++++-- app/src/main/res/values-lt/strings.xml | 9 +++++++-- app/src/main/res/values-lv/strings.xml | 9 +++++++-- app/src/main/res/values-nb/strings.xml | 9 +++++++-- app/src/main/res/values-nl/strings.xml | 9 +++++++-- app/src/main/res/values-pl/strings.xml | 9 +++++++-- app/src/main/res/values-pt/strings.xml | 9 +++++++-- app/src/main/res/values-ro/strings.xml | 9 +++++++-- app/src/main/res/values-ru/strings.xml | 9 +++++++-- app/src/main/res/values-sk/strings.xml | 9 +++++++-- app/src/main/res/values-sl/strings.xml | 9 +++++++-- app/src/main/res/values-sv/strings.xml | 9 +++++++-- app/src/main/res/values-tr/strings.xml | 9 +++++++-- app/src/main/res/values/strings.xml | 9 +++++++-- 25 files changed, 175 insertions(+), 50 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c0fb3aae7209..6f03ddfe1ade 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -843,10 +843,14 @@ Стартиране на сърфирането Опитайте търсене! Търсенето в DuckDuckGo винаги е анонимно. - как се казва „патица“ на испански - прогнозата на мощните патици + как се казва „патица“ на английски + как се казва „патица“ на испански + как се нарича патицата на английски + как се казва „патица“ на испански + актьори в аватар местното време Изненадайте ме! + рецепти за вечеря Опитайте да посетите сайт! Ще блокирам тракерите, за да не ви шпионират. espn.com @@ -868,5 +872,6 @@ Fire Button.

Изпробвайте го! ☝️️]]>
"Справихте се!" Запомнете: всеки път, когато сърфирате с мен, аз ще подрязвам крилцата на досадните реклами. 👌 + Готово! diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index afdd6ab55adb..88cec3687799 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -853,10 +853,14 @@ Spustit procházení Vyzkoušejte vyhledávání! Tvoje vyhledávání v DuckDuckGo je vždycky anonymní. - jak se řekne „kachna“ španělsky - herci z filmu Šampióni + jak se řekne anglicky „kachna“ + jak se řekne „kachna“ španělsky + jak se řekne anglicky kachna + jak se řekne španělsky „kachna“ + obsazení avatara aktuální počasí Překvap mě! + recepty na večeři Zkus přejít na nějaký web! Zablokuju trackery, aby tě nemohly šmírovat. espn.com @@ -882,5 +886,6 @@ Fire Button.

Zkus ji! ☝️️]]>
"A je to!" Pamatuj: Když se mnou na webu surfuješ, příšerné reklamy zaženeš. 👌 + Všechno je hotové! diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c261a4b036ed..32dd301477ee 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -843,10 +843,14 @@ Start søgning Prøv at søge! Dine DuckDuckGo-søgninger er altid anonyme. - hvordan siger man \"and\" på spansk - mighty ducks film + hvordan siger man \"and\" på engelsk + hvordan siger man \"and\" på spansk + hvordan siger man and på engelsk + hvordan siger man \"and\" på spansk + skuespillere i avatar lokalt vejr Overrask mig! + middagsopskrifter Prøv at besøge en hjemmeside! Jeg blokerer trackere, så de ikke kan udspionere dig. espn.com @@ -868,5 +872,6 @@ Fire Button.

Prøv det! ☝️️]]>
"Du har forstået det!" Husk: hver gang du browser med mig, mister en uhyggelig annonce sine vinger. 👌 + Helt færdig! diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f90186cc0150..53c20b19ef36 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -843,10 +843,14 @@ Mit dem Browsen beginnen Suche ausprobieren! Deine DuckDuckGo-Suchanfragen sind immer anonym. - wie sagt man „Ente“ auf Spanisch - Besetzung von Mighty Ducks + wie sagt man „Ente“ auf Englisch + wie sagt man „Ente“ auf Spanisch + wie sagt man Ente auf Englisch + wie sagt man „Ente“ auf Spanisch + Besetzung von Avatar Lokales Wetter Überrasche mich! + Dinner-Rezepte Versuche, eine Website zu besuchen! Ich blockiere Tracker, damit sie dich nicht ausspionieren können. espn.com @@ -868,5 +872,6 @@ Fire Button.

Versuch es doch mal! ☝️️]]>
"Du schaffst das!" Hinweis: Jedes Mal, wenn du mit mir browst, verliert eine gruselige Anzeige ihren Schrecken. 👌 + Alles erledigt! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index aaff316401ef..e4f45cee978e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -843,10 +843,14 @@ Έναρξη περιήγησης Δοκίμασε μια αναζήτηση! Οι αναζητήσεις σας στο DuckDuckGo είναι πάντα ανώνυμες. - πώς μπορείτε να πείτε «duck» στα ισπανικά - Mighty Ducks Cast + πώς να πείτε «πάπια» στα αγγλικά + πώς μπορείτε να πείτε «duck» στα ισπανικά + πώς να πείτε πάπια στα αγγλικά + πώς μπορείτε να πείτε πάπια στα ισπανικά + οι ηθοποιοί του avatar τοπικός καιρός Κάνε μου έκπληξη! + συνταγές για δείπνο Δοκιμάστε να επισκεφτείτε έναν ιστότοπο! Θα εμποδίσω τις εφαρμογές παρακολούθησης ώστε να μην μπορούν να σας κατασκοπεύουν. espn.com @@ -868,5 +872,6 @@ Fire Button.

Δοκιμάστε το! ☝️️]]>
"Το έχετε!" Να θυμάστε: κάθε φορά που περιηγείστε μαζί μου, μια ανατριχιαστική διαφήμιση χάνει τη δύναμή της! 👌 + Όλα έτοιμα! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7dda35846ae3..04df56794e18 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -843,10 +843,14 @@ Empezar a navegar Prueba una búsqueda! Tus búsquedas en DuckDuckGo son siempre anónimas. - cómo se dice «pato» en inglés - reparto de Mighty Ducks + cómo se dice «pato» en inglés + cómo se dice «pato» en inglés + cómo se dice «pato» en inglés + cómo se dice «duck» en español + reparto de Avatar el tiempo local ¡Sorpréndeme! + recetas para la cena ¡Intenta visitar un sitio! Bloquearé los rastreadores para que no puedan espiarte. espn.com @@ -868,5 +872,6 @@ Fire Button.

¡Pruébalo! ☝️️]]>
"¡Lo estás haciendo muy bien!" Recuerda: cada vez que navegas conmigo corto las alas a un anuncio horrible. 👌 + ¡Todo listo! diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index e6705efc8ab0..ed5a441dd057 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -843,10 +843,14 @@ Alusta sirvimist Proovige otsingut! Sinu DuckDuckGo otsingud on alati anonüümsed. - kuidas öelda „part“ hispaania keeles - Mighty Ducks näitlejad + kuidas öelda „part“ inglise keeles + kuidas öelda „part“ hispaania keeles + kuidas öelda part inglise keeles + kuidas öelda part hispaania keeles + Avatari näitlejad kohalik ilm Üllata mind! + õhtusöögi retseptid Proovi külastada saiti! Ma blokeerin jälgijaid, et nad ei saaks sind luurata. espn.com @@ -868,5 +872,6 @@ Fire Button abil.

Proovi! ☝️️]]>
"Sa saad hakkama!" Pea meeles: iga kord kui minuga sirvid, kaotab jube reklaam oma tiivad. 👌 + Kõik valmis! diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 1306fc34078e..4f726f33a700 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -843,10 +843,14 @@ Aloita selailu Kokeile hakua! DuckDuckGo-hakusi ovat aina nimettömiä. - kuinka sanotaan \"duck\" espanjaksi - mighty ducks cast + miten sanotaan \"ankka\" englanniksi + kuinka sanotaan \"duck\" espanjaksi + miten sanotaan ankka englanniksi + miten sanotaan ankka espanjaksi + avatarmuotti paikallissää Yllätä minut! + illallisreseptejä Siirry sivustolle! Estän jäljittäjät, jotta ne eivät voi vakoilla sinua. espn.com @@ -868,5 +872,6 @@ Fire Button -painikkeella.

Kokeile nyt! ☝️️]]>
"Hyvin menee!" Muista, että joka kerta kun käytät minua selaamiseen, rasittavat mainokset katoavat. 👌 + Valmista! diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9b694871d221..27be1a565b85 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -843,10 +843,14 @@ Commencer la navigation Essayez une recherche ! Vos recherches sur DuckDuckGo sont toujours anonymes. - comment dire « duck » en espagnol - casting de mighty ducks + comment dire « canard » en anglais + comment dire « duck » en espagnol + comment dire canard en anglais + comment dire « canard » en espagnol + casting d\'avatar météo locale Surprenez-moi ! + recettes pour le dîner Essayez de visiter un site ! Je bloquerai les traqueurs afin qu\'ils ne puissent pas vous espionner. espn.com @@ -868,5 +872,6 @@ Fire Button.

Essayez par vous-même ! ☝️️]]>
"Bien joué !" Pensez-y : chaque fois que vous naviguez avec moi, une publicité douteuse disparaît. 👌 + C\'est fait ! diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 8ed6aa052742..8c51c0cc0cdd 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -853,10 +853,14 @@ Započni pretraživanje Isprobajte pretragu! Tvoja su DuckDuckGo pretraživanja uvijek anonimna. - kako se kaže \"patka\" na španjolskom - moćne patke + kako se kaže \"patka\" na engleskom + kako se kaže \"patka\" na španjolskom + kako se kaže patka na engleskom + kako se kaže \"patka\" na španjolskom + uloge u filmu Avatar lokalno vrijeme Iznenadi me! + recepti za večeru Pokušaj posjetiti web-mjesto! Blokirat ću tragače kako te ne bi mogli špijunirati. espn.com @@ -882,5 +886,6 @@ Fire Buttona.

Probaj! ☝️️]]>
"Možeš ti to!" Zapamti: svaki put kada me koristiš za pregledavanje, grozne reklame odlaze u zaborav. 👌 + Gotovo! diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 03e8d4278df0..9e608fca4078 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -843,10 +843,14 @@ Böngészés indítása Keress rá! A DuckDuckGo-kereséseid mindig névtelenek. - hogyan mondják spanyolul, hogy „kacsa” - kerge kacsák szereposztása + hogyan mondják angolul, hogy „kacsa” + hogyan mondják spanyolul, hogy „kacsa” + hogyan mondják angolul, hogy kacsa + hogyan mondják spanyolul, hogy kacsa + avatar szereposztása helyi időjárás Lepj meg! + vacsorareceptek Próbálj meg ellátogatni egy webhelyre! Én blokkolom a nyomkövetőket, hogy ne tudjanak kémkedni utánad. espn.com @@ -868,5 +872,6 @@ Fire Button használatával.

Próbáld ki! ☝️️]]>
"Megvan, ez az!" Ne feledd: minden alkalommal, amikor velem böngészel, egy undok hirdetés elveszíti az erejét. 👌 + Minden kész! diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5c54c5578b5e..b0e75446ad57 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -843,10 +843,14 @@ Inizia a navigare Prova una ricerca! Le tue ricerche su DuckDuckGo sono sempre anonime. - come si dice \"anatra\" in spagnolo - cast delle papere potenti + come si dice \"anatra\" in inglese + come si dice \"anatra\" in spagnolo + come si dice anatra in inglese + come si dice anatra in spagnolo + cast di avatar meteo locale Sorprendimi! + ricette per la cena Prova a visitare un sito! Bloccherò i sistemi di tracciamento in modo che non possano spiarti. espn.com @@ -868,5 +872,6 @@ Fire Button.

Provalo! ☝️️]]>
"Ben fatto!" Ricorda: quando navighi con me gli annunci inquietanti non possono seguirti. 👌 + Fatto! diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ed9cff25ace9..cd2a2d6d5791 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -853,10 +853,14 @@ Pradėti naršyti Išmėgink paiešką! Jūsų „DuckDuckGo“ paieškos visada yra anoniminės. - kaip pasakyti „antis“ ispanų kalba - mighty ducks aktoriai + kaip pasakyti „antis“ anglų kalba + kaip pasakyti „antis“ ispanų kalba + kaip pasakyti antis anglų kalba + kaip pasakyti antis ispanų kalba + įsikūnijimo aktoriai vietinis oras Nustebink mane! + vakarienės receptai Pabandyk apsilankyti svetainėje! Užblokuosiu stebėjimo priemones, kad jos negalėtų tavęs šnipinėti. espn.com @@ -882,5 +886,6 @@ Fire Button.

Išbandykite! ☝️️]]>
"Atlikote!" Įsidėmėkite: kiekvieną kartą, kai naršai su manimi, bauginantis skelbimas praranda galią. 👌 + Viskas! diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 311ee12a3724..53d18c70a454 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -848,10 +848,14 @@ Sākt pārlūkošanu Izmēģini meklēt! Tavi DuckDuckGo meklējumi vienmēr ir anonīmi. - kā spāniski pateikt “pīle” - mighty ducks aktieri + kā angliski pateikt “pīle” + kā spāniski pateikt “pīle” + kā angliski pateikt “pīle” + kā spāniski pateikt “pīle” + avatara aktieru sastāvs vietējie laikapstākļi Pārsteidz mani! + vakariņu receptes Pamēģini apmeklēt kādu vietni! Es nobloķēšu izsekotājus, lai tie nevarētu tevi izspiegot. espn.com @@ -875,5 +879,6 @@ Fire Button.

Izmēģini! ☝️️]]>
"Izdevās!" Atceries: katru reizi, kad pārlūkosi kopā ar mani, uzmācīgās reklāmas zaudēs savu spēku! 👌 + Viss pabeigts! diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 3daf0498490a..f4ba311183f8 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -843,10 +843,14 @@ Begynn å surfe Prøv et søk! DuckDuckGo-søkene dine er alltid anonyme. - hvordan si «duck» på spansk - mighty ducks rolleinnehavere + hva heter «and» på engelsk + hvordan si «duck» på spansk + hva heter and på engelsk + hva heter and på spansk + rollebesetningen i avatar lokalt vær Overrask meg! + middagsoppskrifter Prøv å besøke et nettsted! Jeg blokkerer sporingsforsøk slik at de ikke kan spionere på deg. espn.com @@ -868,5 +872,6 @@ Fire Button.

Prøv det! ☝️️]]>
"Dette går bra!" Husk: Hver gang du surfer med meg, klippes vingene på en uhyggelig annonse. 👌 + Ferdig! diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 552c646430c5..504636385cc0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -843,10 +843,14 @@ Beginnen met browsen Probeer een zoekopdracht! Je DuckDuckGo-zoekopdrachten zijn altijd anoniem. - hoe zeg je \'eend\' in het Spaans? - cast van Mighty Ducks + hoe zeg je \'eend\' in het Engels? + hoe zeg je \'eend\' in het Spaans? + hoe zeg je \'eend\' in het Engels? + hoe zeg je \'eend\' in het Spaans? + cast van avatar lokaal weer Verras me! + recepten voor het avondeten Bezoek eens een site! Ik blokkeer trackers zodat ze je niet kunnen bespioneren. espn.com @@ -868,5 +872,6 @@ Fire Button.

Probeer het maar! ☝️️]]>
"Je kunt het!" Denk eraan: elke keer als je met mij browset, verliest een enge advertentie zijn vleugels. 👌 + Helemaal klaar! diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d12bb706a3af..a1270dd75e31 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -853,10 +853,14 @@ Rozpocznij przeglądanie Spróbuj coś wyszukać! Wyszukiwania w DuckDuckGo zawsze są anonimowe. - jak się mówi „kaczka” po hiszpańsku - obsada potężnych kaczorów + jak się mówi „kaczka” po angielsku + jak się mówi „kaczka” po hiszpańsku + jak się mówi kaczka po angielsku + jak się mówi kaczka po hiszpańsku + obsada avatara pogoda lokalna Zaskocz mnie! + przepisy na obiad Spróbuj odwiedzić witrynę! Zablokuję mechanizmy śledzące, aby nie mogły Cię szpiegować. espn.com @@ -882,5 +886,6 @@ Fire Button.

Wypróbuj go! ☝️️]]>
"Udało się!" Pamiętaj: za każdym razem, gdy przeglądasz ze mną Internet, jakaś wstrętna reklama przestaje działać. 👌 + Wszystko gotowe! diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c6f9bf849f38..991b98ee9ce5 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -843,10 +843,14 @@ Iniciar a navegação Tente uma pesquisa! As tuas pesquisas no DuckDuckGo são sempre anónimas. - como dizer \"pato\" em espanhol - elenco do filme A Hora dos Campeões + como dizer \"pato\" em inglês + como dizer \"pato\" em espanhol + como dizer pato em inglês + como dizer pato em espanhol + elenco de avatar meteorologia local Surpreende-me! + receitas de jantar Experimenta visitar um site! Bloquearei rastreadores para que não te espiem. espn.com @@ -868,5 +872,6 @@ Fire Button.

Experimenta! ☝️️]]>
"Tu consegues!" Lembra-te: sempre que navegas comigo, um anúncio assustador perde as suas asas. 👌 + Já está! diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 3decd70bf6f9..4dbe6e2e6615 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -848,10 +848,14 @@ Începe navigarea Încearcă o căutare! Căutările tale DuckDuckGo sunt întotdeauna anonime. - cum se spune „rață” în spaniolă - distribuție mighty ducks + cum se spune „rață” în engleză + cum se spune „rață” în spaniolă + cum se spune rață în engleză + cum se spune rață în spaniolă + distribuția din avatar vremea locală Surprinde-mă! + rețete pentru cină Încearcă să vizitezi un site! Voi bloca instrumentele de urmărire ca să nu te mai spioneze. espn.com @@ -875,5 +879,6 @@ Fire Button.

Încearcă! ☝️️]]>
"Ai ghicit!" Reține: de fiecare dată când navighezi cu mine, o reclamă terifiantă își pierde aripile. 👌 + Gata! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7af6a2a90f72..6ca51bd53c75 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -853,10 +853,14 @@ Начать просмотр Попробуйте поискать! Ваши поисковые запросы в DuckDuckGo всегда анонимны. - Как сказать «утка» по-испански? - Кто играет главные роли в фильме «Могучие утята»? + Как сказать «утка» по-английски? + Как сказать «утка» по-испански? + как сказать «утка» на английском? + как сказать «утка» по-испански + актерский состав аватара Местная погода Удиви меня! + рецепты на ужин Попробуйте посетить сайт! Мы заблокируем трекеры и пресечем слежку. espn.com @@ -882,5 +886,6 @@ Fire Button моментально стирает из браузера данные о посещении сайтов.

Давайте попробуем! ☝️️]]>
"Проще некуда!" Бродить по сайтам с нами — значит подрезать крылья назойливой рекламе. 👌 + Всё готово! diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4dd0964168a4..f548450331dc 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -853,10 +853,14 @@ Začnite prehliadať Skúste vyhľadávanie! Vyhľadávania v službe DuckDuckGo sú vždy anonymné. - ako sa povie „kačica“ po španielsky - mocné kačice obsadenie + ako sa povie „kačica“ po anglicky + ako sa povie „kačica“ po španielsky + ako sa povie „kačica“ po anglicky + ako sa povie „kačica“ po španielsky + obsadenie avatara Miestne počasie Prekvapte ma! + Recepty na večeru Skúste navštíviť stránku! Zablokujem sledovacie zariadenia, ktoré by vás mohli špehovať. espn.com @@ -882,5 +886,6 @@ Fire Button.

Skúste to! ☝️️]]>
"Hotovo!" Pamätajte: zakaždým, keď prehliadate v našej aplikácii, tak čudným reklamám pristrihávate krídla. 👌 + Všetko je hotové! diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 4c299938fffc..a0a4e1c533d5 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -853,10 +853,14 @@ Začni brskanje Preizkusi z iskanjem! Vaša iskanja v DuckDuckGo so vedno anonimna. - kako se reče »raca« v španščini - zasedba mogočnih racmanov + kako se reče »raca« v angleščini + kako se reče »raca« v španščini + kako se reče raca v angleščini + kako se reče raca v španščini + igralska zasedba avatarja lokalno vreme Preseneti me! + recepti za večerjo Poskusite obiskati spletno stran! Blokiral bom sledilnike, da ne bodo vohunili za vami. espn.com @@ -882,5 +886,6 @@ Fire Button.

Poskusite! ☝️️]]>
"Uspelo vam bo!" Ne pozabite: Vedno kadar brskate z mano, shrljivemu oglasu pristrižete peruti. 👌 + Končano! diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index fcb91ba23709..57ac5a80931b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -843,10 +843,14 @@ Börja bläddra Pröva att söka! Dina DuckDuckGo-sökningar är alltid anonyma. - vad heter ”anka” på spanska - medverkande i mighty ducks + hur säger man ”anka” på engelska + vad heter ”anka” på spanska + hur säger man anka på engelska + hur säger man anka på spanska + rollbesättningen för avatar lokalt väder Överraska mig! + middagsrecept Prova att besöka en webbplats! Jag blockerar spårare så att de inte kan spionera på dig. espn.com @@ -868,5 +872,6 @@ Fire Button.

Prova! ☝️️]]>
"Du klarar det här!" Kom ihåg: varje gång du surfar med mig förlorar en läskig annons sina vingar. 👌 + Allt klart! diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 96a6314f736d..a40be6259707 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -843,10 +843,14 @@ Gezinmeye Başla Bir şeyler arayın! DuckDuckGo aramalarınız her zaman anonimdir. - ispanyolca \"ördek\" nasıl denir - mighty ducks oyuncu kadrosu + ingilizcede \"ördek\" nasıl denir + ispanyolca \"ördek\" nasıl denir + ingilizcede ördek nasıl denir + ispanyolcada ördek nasıl denir + avatar oyuncu kadrosu yerel hava durumu Şaşırt beni! + akşam yemeği tarifleri Bir siteyi ziyaret etmeyi deneyin! Sizi gözetlemelerini önlemek için izleyicileri engelleyeceğim. espn.com @@ -868,5 +872,6 @@ Fire Button ile göz atma etkinliğinizi anında temizleyin.

Hemen deneyin! ☝️️]]>
"İşte bu kadar!" Unutmayın: İnterneti benimle ne kadar çok gezerseniz rahatsız edici reklamları da o kadar az görürsünüz. 👌 + Hepsi tamam! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfbd370c7f85..1625557c87e7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -842,10 +842,14 @@ Start Browsing Try a search! Your DuckDuckGo searches are always anonymous. - how to say “duck” in spanish - mighty ducks cast + how to say “duck” in english + how to say “duck” in spanish + how to say duck in english + how to say duck in spanish + cast of avatar local weather Surprise me! + dinner recipes Try visiting a site! I\'ll block trackers so they can\'t spy on you. espn.com @@ -867,5 +871,6 @@ Fire Button.

Give it a try! ☝️️]]>
You\'ve got this!" Remember: every time you browse with me a creepy ad loses its wings. 👌 + All done! From e8d23b61ddd88b17c6ab234190c92d623433cab7 Mon Sep 17 00:00:00 2001 From: Dax Mobile <44842493+daxmobile@users.noreply.github.com> Date: Thu, 30 May 2024 15:42:25 +0200 Subject: [PATCH 06/12] Update autoconsent to v10.9.0 (#4598) Task/Issue URL: https://app.asana.com/0/1207444284182411/1207444284182411 Autoconsent Release: https://github.com/duckduckgo/autoconsent/releases/tag/v10.9.0 ## Description Updates Autoconsent to version [v10.9.0](https://github.com/duckduckgo/autoconsent/releases/tag/v10.9.0). ### Autoconsent v10.9.0 release notes See release notes [here](https://github.com/duckduckgo/autoconsent/blob/v10.9.0/CHANGELOG.md) ## Steps to test This release has been tested during Autoconsent development. You can check the release notes for more information. 1. Make sure that there's no unexpected failures in CI checks 2. (optional) smoke test some of the sites mentioned in the release notes 3. If there are problems, reach out to a CPM DRI Co-authored-by: muodov --- .../libs/autoconsent-bundle.js | 2 +- autoconsent/autoconsent-impl/libs/rules.json | 150 ++++++++++++++++-- package-lock.json | 8 +- package.json | 2 +- 4 files changed, 140 insertions(+), 22 deletions(-) diff --git a/autoconsent/autoconsent-impl/libs/autoconsent-bundle.js b/autoconsent/autoconsent-impl/libs/autoconsent-bundle.js index 6e5da860dc44..7a4cd14c40d1 100644 --- a/autoconsent/autoconsent-impl/libs/autoconsent-bundle.js +++ b/autoconsent/autoconsent-impl/libs/autoconsent-bundle.js @@ -1 +1 @@ -!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,n=null,o=!1){let i=null;return i=null!=n?Array.from(n.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(i=i.filter((e=>{const n=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const o of t.textFilter)if(-1!==n.indexOf(o.toLowerCase())){e=!0;break}return e}if(null!=t.textFilter)return-1!==n.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(i=i.filter((e=>{const n=window.getComputedStyle(e);let o=!0;for(const e of t.styleFilters){const t=n[e.option];o=e.negated?o&&t!==e.value:o&&t===e.value}return o}))),null!=t.displayFilter&&(i=i.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(i=i.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(i=i.filter((n=>{const o=e.base;e.setBase(n);const i=e.find(t.childFilter);return e.setBase(o),null!=i.target}))),o?i:(i.length>1&&console.warn("Multiple possible targets: ",i,t,n),i[0])}static find(t,n=!1){const o=[];if(null!=t.parent){const i=e.findElement(t.parent,null,n);if(null!=i){if(i instanceof Array)return i.forEach((i=>{const s=e.findElement(t.target,i,n);s instanceof Array?s.forEach((e=>{o.push({parent:i,target:e})})):o.push({parent:i,target:s})})),o;{const s=e.findElement(t.target,i,n);s instanceof Array?s.forEach((e=>{o.push({parent:i,target:e})})):o.push({parent:i,target:s})}}}else{const i=e.findElement(t.target,null,n);i instanceof Array?i.forEach((e=>{o.push({parent:null,target:e})})):o.push({parent:null,target:i})}return 0===o.length&&o.push({parent:null,target:null}),n?o:(1!==o.length&&console.warn("Multiple results found, even though multiple false",o),o[0])}};e.base=null;var t=e;function n(e){const n=t.find(e);return"css"===e.type?!!n.target:"checkbox"===e.type?!!n.target&&n.target.checked:void 0}async function o(e,c){switch(e.type){case"click":return async function(e){const n=t.find(e);null!=n.target&&n.target.click();return s(i)}(e);case"list":return async function(e,t){for(const n of e.actions)await o(n,t)}(e,c);case"consent":return async function(e,t){for(const i of e.consents){const e=-1!==t.indexOf(i.type);if(i.matcher&&i.toggleAction){n(i.matcher)!==e&&await o(i.toggleAction)}else e?await o(i.trueAction):await o(i.falseAction)}}(e,c);case"ifcss":return async function(e,n){const i=t.find(e);i.target?e.falseAction&&await o(e.falseAction,n):e.trueAction&&await o(e.trueAction,n)}(e,c);case"waitcss":return async function(e){await new Promise((n=>{let o=e.retries||10;const i=e.waitTime||250,s=()=>{const c=t.find(e);(e.negated&&c.target||!e.negated&&!c.target)&&o>0?(o-=1,setTimeout(s,i)):n()};s()}))}(e);case"foreach":return async function(e,n){const i=t.find(e,!0),s=t.base;for(const s of i)s.target&&(t.setBase(s.target),await o(e.action,n));t.setBase(s)}(e,c);case"hide":return async function(e){const n=t.find(e);n.target&&n.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const n=t.find(e),o=t.find(e.dragTarget);if(n.target){const e=n.target.getBoundingClientRect(),t=o.target.getBoundingClientRect();let i=t.top-e.top,s=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(s=0),"x"===this.config.axis.toLowerCase()&&(i=0);const c=window.screenX+e.left+e.width/2,r=window.screenY+e.top+e.height/2,a=e.left+e.width/2,l=e.top+e.height/2,u=document.createEvent("MouseEvents");u.initMouseEvent("mousedown",!0,!0,window,0,c,r,a,l,!1,!1,!1,!1,0,n.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,c+s,r+i,a+s,l+i,!1,!1,!1,!1,0,n.target);const h=document.createEvent("MouseEvents");h.initMouseEvent("mouseup",!0,!0,window,0,c+s,r+i,a+s,l+i,!1,!1,!1,!1,0,n.target),n.target.dispatchEvent(u),await this.waitTimeout(10),n.target.dispatchEvent(d),await this.waitTimeout(10),n.target.dispatchEvent(h)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await s(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(n){console.warn("eval error",n,e.code),t(!1)}}))}(e);default:throw"Unknown action type: "+e.type}}var i=0;function s(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function c(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var r=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},a={pending:new Map,sendContentMessage:null};var l={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!!window.Cookiebot,EVAL_COOKIEBOT_2:()=>!window.Cookiebot.hasResponse&&!0===window.Cookiebot.dialog?.visible,EVAL_COOKIEBOT_3:()=>window.Cookiebot.withdraw()||!0,EVAL_COOKIEBOT_4:()=>window.Cookiebot.hide()||!0,EVAL_COOKIEBOT_5:()=>!0===window.Cookiebot.declined,EVAL_KLARO_1:()=>{const e=globalThis.klaroConfig||globalThis.klaro?.getManager&&globalThis.klaro.getManager().config;if(!e)return!0;const t=(e.services||e.apps).filter((e=>!e.required)).map((e=>e.name));if(klaro&&klaro.getManager){const e=klaro.getManager();return t.every((t=>!e.consents[t]))}if(klaroConfig&&"cookie"===klaroConfig.storageMethod){const e=klaroConfig.cookieName||klaroConfig.storageName,n=JSON.parse(decodeURIComponent(document.cookie.split(";").find((t=>t.trim().startsWith(e))).split("=")[1]));return Object.keys(n).filter((e=>t.includes(e))).every((e=>!1===n[e]))}},EVAL_KLARO_OPEN_POPUP:()=>{klaro.show(void 0,!0)},EVAL_KLARO_TRY_API_OPT_OUT:()=>{if(window.klaro&&"function"==typeof klaro.show&&"function"==typeof klaro.getManager)try{return klaro.getManager().changeAll(!1),klaro.getManager().saveAndApplyConsents(),!0}catch(e){return console.warn(e),!1}return!1},EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_TRUSTARC_FRAME_TEST:()=>window&&window.QueryString&&"0"===window.QueryString.preferences,EVAL_TRUSTARC_FRAME_GTM:()=>window&&window.QueryString&&"1"===window.QueryString.gtm,EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_ALMACMP_0:()=>document.cookie.includes('"name":"Google","consent":false'),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_ARBEITSAGENTUR_TEST:()=>document.cookie.includes("cookie_consent=denied"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BAHN_TEST:()=>1===utag.gdpr.getSelectedCategories().length,EVAL_BING_0:()=>document.cookie.includes("AL=0")&&document.cookie.includes("AD=0")&&document.cookie.includes("SM=0"),EVAL_BLOCKSY_0:()=>document.cookie.includes("blocksy_cookies_consent_accepted=no"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CC_BANNER2_0:()=>!!document.cookie.match(/sncc=[^;]+D%3Dtrue/),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COOKIECONSENT2_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COOKIECONSENT3_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_LAW_INFO_DETECT:()=>!!window.CLI,EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"==e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_COOKIEYES_0:()=>document.cookie.includes("advertisement:no"),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DNDBEYOND_TEST:()=>document.cookie.includes("cookie-consent=denied"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ez-consent-tcf/),EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_HEMA_TEST_0:()=>document.cookie.includes("cookies_rejected=1"),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_IWINK_TEST:()=>document.cookie.includes("cookie_permission_granted=no"),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC|GHCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||(e.checked="moove_gdpr_strict_cookies"===e.name||"moove_gdpr_strict_cookies"===e.id)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_OPERA_0:()=>document.cookie.includes("cookie_consent_essential=true")&&!document.cookie.includes("cookie_consent_marketing=true"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_SIRDATA_UNBLOCK_SCROLL:()=>(document.documentElement.classList.forEach((e=>{e.startsWith("sd-cmp-")&&document.documentElement.classList.remove(e)})),!0),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_SVT_TEST:()=>document.cookie.includes('cookie-consent-1={"optedIn":true,"functionality":false,"statistics":false}'),EVAL_TAKEALOT_0:()=>document.body.classList.remove("freeze")||(document.body.style="")||!0,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)?.[0].includes("false"),EVAL_TAUNTON_TEST:()=>document.cookie.includes("taunton_user_consent_submitted=true"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_DONOTSELL:()=>utag.gdpr.dns?.setDnsState(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TEALIUM_DONOTSELL_CHECK:()=>1!==utag.gdpr.dns?.getDnsState(),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_UBUNTU_COM_0:()=>document.cookie.includes("_cookies_accepted=essential"),EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XE_TEST:()=>document.cookie.includes("xeConsentState={%22performance%22:false%2C%22marketing%22:false%2C%22compliance%22:false}"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var u={main:!0,frame:!1,urlPattern:""},d=class{constructor(e){this.runContext=u,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=l[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);const n=this.autoconsent.config.logs;if(this.autoconsent.config.isMainWorld){n.evals&&console.log("inline eval:",e,t);let o=!1;try{o=!!t.call(globalThis)}catch(t){n.evals&&console.error("error evaluating rule",e,t)}return Promise.resolve(o)}const o=`(${t.toString()})()`;return n.evals&&console.log("async eval:",e,o),function(e,t){const n=c();a.sendContentMessage({type:"eval",id:n,code:e,snippetId:t});const o=new r(n);return a.pending.set(o.id,o),o.promise}(o,e).catch((t=>(n.evals&&console.error("error evaluating rule",e,t),!1)))}checkRunContext(){const e={...u,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}click(e,t=!1){return this.autoconsent.domActions.click(e,t)}elementExists(e){return this.autoconsent.domActions.elementExists(e)}elementVisible(e,t){return this.autoconsent.domActions.elementVisible(e,t)}waitForElement(e,t){return this.autoconsent.domActions.waitForElement(e,t)}waitForVisible(e,t,n){return this.autoconsent.domActions.waitForVisible(e,t,n)}waitForThenClick(e,t,n){return this.autoconsent.domActions.waitForThenClick(e,t,n)}wait(e){return this.autoconsent.domActions.wait(e)}hide(e,t){return this.autoconsent.domActions.hide(e,t)}prehide(e){return this.autoconsent.domActions.prehide(e)}undoPrehide(){return this.autoconsent.domActions.undoPrehide()}querySingleReplySelector(e,t){return this.autoconsent.domActions.querySingleReplySelector(e,t)}querySelectorChain(e){return this.autoconsent.domActions.querySelectorChain(e)}elementSelector(e){return this.autoconsent.domActions.elementSelector(e)}},h=class extends d{constructor(e,t){super(t),this.rule=e,this.name=e.name,this.runContext=e.runContext||u}get hasSelfTest(){return!!this.rule.test}get isIntermediate(){return!!this.rule.intermediate}get isCosmetic(){return!!this.rule.cosmetic}get prehideSelectors(){return this.rule.prehideSelectors}async detectCmp(){return!!this.rule.detectCmp&&this._runRulesParallel(this.rule.detectCmp)}async detectPopup(){return!!this.rule.detectPopup&&this._runRulesSequentially(this.rule.detectPopup)}async optOut(){const e=this.autoconsent.config.logs;return!!this.rule.optOut&&(e.lifecycle&&console.log("Initiated optOut()",this.rule.optOut),this._runRulesSequentially(this.rule.optOut))}async optIn(){const e=this.autoconsent.config.logs;return!!this.rule.optIn&&(e.lifecycle&&console.log("Initiated optIn()",this.rule.optIn),this._runRulesSequentially(this.rule.optIn))}async openCmp(){return!!this.rule.openCmp&&this._runRulesSequentially(this.rule.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.rule.test):super.test()}async evaluateRuleStep(e){const t=[],n=this.autoconsent.config.logs;if(e.exists&&t.push(this.elementExists(e.exists)),e.visible&&t.push(this.elementVisible(e.visible,e.check)),e.eval){const n=this.mainWorldEval(e.eval);t.push(n)}if(e.waitFor&&t.push(this.waitForElement(e.waitFor,e.timeout)),e.waitForVisible&&t.push(this.waitForVisible(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(this.click(e.click,e.all)),e.waitForThenClick&&t.push(this.waitForThenClick(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(this.wait(e.wait)),e.hide&&t.push(this.hide(e.hide,e.method)),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;const o=await this.evaluateRuleStep(e.if);n.rulesteps&&console.log("Condition is",o),o?t.push(this._runRulesSequentially(e.then)):e.else?t.push(this._runRulesSequentially(e.else)):t.push(!0)}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return n.errors&&console.warn("Unrecognized rule",e),!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){const t=this.autoconsent.config.logs;for(const n of e){t.rulesteps&&console.log("Running rule...",n);const e=await this.evaluateRuleStep(n);if(t.rulesteps&&console.log("...rule result",e),!e&&!n.optional)return!1}return!0}},p=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=u,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>n(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>n(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||o(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}};function m(e="autoconsent-css-rules"){const t=`style#${e}`,n=document.querySelector(t);if(n&&n instanceof HTMLStyleElement)return n;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,n=document.createElement("style");return n.id=e,t.appendChild(n),n}}function _(e,t,n="display"){const o=`${t} { ${"opacity"===n?"opacity: 0":"display: none"} !important; z-index: -1 !important; pointer-events: none !important; } `;return e instanceof HTMLStyleElement&&(e.innerText+=o,t.length>0)}async function f(e,t,n){const o=await e();return!o&&t>0?new Promise((o=>{setTimeout((async()=>{o(f(e,t-1,n))}),n)})):Promise.resolve(o)}function E(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function g(e){const t={enabled:!0,autoAction:"optOut",disabledCmps:[],enablePrehide:!0,enableCosmeticRules:!0,detectRetries:20,isMainWorld:!1,prehideTimeout:2e3,logs:{lifecycle:!1,rulesteps:!1,evals:!1,errors:!0,messages:!1}},n=(o=t,globalThis.structuredClone?structuredClone(o):JSON.parse(JSON.stringify(o)));var o;for(const o of Object.keys(t))void 0!==e[o]&&(n[o]=e[o]);return n}var w="#truste-show-consent",A="#truste-consent-track",y=[class extends d{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${A}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!0}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=this.elementExists(`${w},${A}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return this.elementVisible(`#truste-consent-content,#trustarc-banner-overlay,${A}`,"all")}openFrame(){this.click(w)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(_(m(),`.truste_popframe, .truste_overlay, .truste_box_overlay, ${A}`),this.click(w),setTimeout((()=>{m().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,this.click("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends d{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return this.elementVisible("#defaultpreferencemanager","any")&&this.elementVisible(".mainContent","any")}async navigateToSettings(){return await f((async()=>this.elementExists(".shp")||this.elementVisible(".advance","any")||this.elementExists(".switch span:first-child")),10,500),this.elementExists(".shp")&&this.click(".shp"),await this.waitForElement(".prefPanel",5e3),this.elementVisible(".advance","any")&&this.click(".advance"),await f((()=>this.elementVisible(".switch span:first-child","any")),5,1e3)}async optOut(){if(await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST"))return!0;let e=3e3;return await this.mainWorldEval("EVAL_TRUSTARC_FRAME_GTM")&&(e=1500),await f((()=>"complete"===document.readyState),20,100),await this.waitForElement(".mainContent[aria-hidden=false]",e),!!this.click(".rejectAll")||(this.elementExists(".prefPanel")&&await this.waitForElement('.prefPanel[style="visibility: visible;"]',e),this.click("#catDetails0")?(this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",e),!0):this.click(".required")?(this.waitForThenClick("#gwt-debug-close_id",e),!0):(await this.navigateToSettings(),this.click(".switch span:nth-child(1):not(.active)",!0),this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",10*e),!0))}async optIn(){return this.click(".call")||(await this.navigateToSettings(),this.click(".switch span:nth-child(2)",!0),this.click(".submit"),this.waitForElement("#gwt-debug-close_id",3e5).then((()=>{this.click("#gwt-debug-close_id")}))),!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST")}},class extends d{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#CybotCookiebotDialogBodyUnderlay,#dtcookie-container,#cookiebanner,#cb-cookieoverlay,.modal--cookie-banner,#cookiebanner_outer,#CookieBanner"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return await this.mainWorldEval("EVAL_COOKIEBOT_1")}async detectPopup(){return this.mainWorldEval("EVAL_COOKIEBOT_2")}async optOut(){await this.wait(500);let e=await this.mainWorldEval("EVAL_COOKIEBOT_3");return await this.wait(500),e=e&&await this.mainWorldEval("EVAL_COOKIEBOT_4"),e}async optIn(){return this.elementExists("#dtcookie-container")?this.click(".h-dtcookie-accept"):(this.click(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),this.click("#CybotCookiebotDialogBodyLevelButtonAccept"),this.click("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_COOKIEBOT_5")}},class extends d{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!0,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname||"/ccpa_pm/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await this.waitForElement(".priv-save-btn",2e3):(await this.waitForElement(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL,.sp_choice_type_SAVE_AND_EXIT",2e3),!this.elementExists(".sp_choice_type_9")))}async optIn(){return await this.waitForElement(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!this.click(".sp_choice_type_11")||!!this.click(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname||"/ccpa_pm/index.html"===location.pathname}async optOut(){const e=this.autoconsent.config.logs;if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return this.click(".priv-save-btn")}if(!this.isManagerOpen()){if(!await this.waitForElement(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!this.elementExists(".sp_choice_type_12"))return this.click(".sp_choice_type_13");this.click(".sp_choice_type_12"),await f((()=>this.isManagerOpen()),200,100)}await this.waitForElement(".type-modal",2e4),this.waitForThenClick(".ccpa-stack .pm-switch[aria-checked=true] .slider",500,!0);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",n=await Promise.race([this.waitForElement(e,2e3).then((e=>e?0:-1)),this.waitForElement(t,2e3).then((e=>e?1:-1)),this.waitForElement(".pm-features",2e3).then((e=>e?2:-1))]);if(0===n)return await this.wait(1500),this.click(e);1===n?this.click(t):2===n&&(await this.waitForElement(".pm-features",1e4),this.click(".checked > span",!0),this.click(".chevron"))}catch(t){e.errors&&console.warn(t)}return this.click(".sp_choice_type_SAVE_AND_EXIT")}},class extends d{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||this.elementExists("#cmpbox")}async detectPopup(){return this.apiAvailable?(await this.wait(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):this.elementVisible("#cmpbox .cmpmore","any")}async optOut(){return await this.wait(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!this.click(".cmpboxbtnno")||(this.elementExists(".cmpwelcomeprpsbtn")?(this.click(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),this.click(".cmpboxbtnsave"),!0):(this.click(".cmpboxbtncustom"),await this.waitForElement(".cmptblbox",2e3),this.click(".cmptdchoice > a[aria-checked=true]",!0),this.click(".cmpboxbtnyescustomchoices"),this.hide("#cmpwrapper,#cmpbox","display"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):this.click(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends d{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#_evidon_banner")}async detectPopup(){return this.elementVisible("#_evidon_banner","any")}async optOut(){return this.click("#_evidon-decline-button")||(_(m(),"#evidon-prefdiag-overlay,#evidon-prefdiag-background"),this.click("#_evidon-option-button"),await this.waitForElement("#evidon-prefdiag-overlay",5e3),this.click("#evidon-prefdiag-decline")),!0}async optIn(){return this.click("#_evidon-accept-button")}},class extends d{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#onetrust-banner-sdk,#onetrust-pc-sdk")}async detectPopup(){return this.elementVisible("#onetrust-banner-sdk,#onetrust-pc-sdk","any")}async optOut(){return this.elementVisible("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies","any")?this.click("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies"):(this.elementExists("#onetrust-pc-btn-handler")?this.click("#onetrust-pc-btn-handler"):this.click(".ot-sdk-show-settings,button.js-cookie-settings"),await this.waitForElement("#onetrust-consent-sdk",2e3),await this.wait(1e3),this.click("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await this.wait(1e3),await this.waitForElement(".save-preference-btn-handler,.js-consent-save",2e3),this.click(".save-preference-btn-handler,.js-consent-save"),await this.waitForVisible("#onetrust-banner-sdk",5e3,"none"),!0)}async optIn(){return this.click("#onetrust-accept-btn-handler,#accept-recommended-btn-handler,.js-accept-cookies")}async test(){return await f((()=>this.mainWorldEval("EVAL_ONETRUST_1")),10,500)}},class extends d{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):this.elementExists(".klaro > .cookie-notice")}async detectPopup(){return this.elementVisible(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!await this.mainWorldEval("EVAL_KLARO_TRY_API_OPT_OUT")||(!!this.click(".klaro .cn-decline")||(await this.mainWorldEval("EVAL_KLARO_OPEN_POPUP"),!!this.click(".klaro .cn-decline")||(this.click(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked,.required,.only-required),.cm-purpose:not(.cm-toggle-all) > div > input:not(.half-checked,.required,.only-required)",!0),this.click(".cm-btn-accept,.cm-button"))))}async optIn(){return!!this.click(".klaro .cm-btn-accept-all")||(this.settingsOpen?(this.click(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),this.click(".cm-btn-accept")):this.click(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends d{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".unic .unic-box,.unic .unic-bar,.unic .unic-modal")}async detectPopup(){return this.elementVisible(".unic .unic-box,.unic .unic-bar,.unic .unic-modal","any")}async optOut(){if(await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await this.waitForElement(".unic input[type=checkbox]",1e3)){await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const n of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(n))return e.click(),await this.wait(500),!0}}return!1}async optIn(){return this.waitForThenClick(".unic #unic-agree")}async test(){await this.wait(1e3);return!this.elementExists(".unic .unic-box,.unic .unic-bar")}},class extends d{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".cmp-root .cmp-receptacle")}async detectPopup(){return this.elementVisible(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await this.waitForThenClick(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await this.waitForElement(".cmp-view-tab-tabs"))return!1;await this.waitForThenClick(".cmp-view-tab-tabs > :first-child"),await this.waitForThenClick(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await f((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await this.click(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return this.waitForThenClick(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends d{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return this.elementExists("tiktok-cookie-banner")}async detectPopup(){return E(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no decline button found"),!1)}async optIn(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no accept button found"),!1)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends d{constructor(){super(...arguments),this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return this.elementVisible("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return this.waitForThenClick("button[data-testid=save-btn]")}async optIn(){return this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await f((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}},class extends d{constructor(){super(...arguments),this.name="tumblr-com",this.runContext={urlPattern:"^https://(www\\.)?tumblr\\.com/"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}get prehideSelectors(){return["#cmp-app-container"]}async detectCmp(){return this.elementExists("#cmp-app-container")}async detectPopup(){return this.elementVisible("#cmp-app-container","any")}async optOut(){let e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary");return!!t&&(t.click(),await f((()=>{const e=document.querySelector("#cmp-app-container iframe");return!!e.contentDocument?.querySelector(".cmp__dialog input")}),5,500),e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary"),!!t&&(t.click(),!0))}async optIn(){const e=document.querySelector("#cmp-app-container iframe").contentDocument.querySelector(".cmp-components-button.is-primary");return!!e&&(e.click(),!0)}}],C=class{constructor(e){this.autoconsentInstance=e}click(e,t=!1){const n=this.elementSelector(e);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[click]",e,t,n),n.length>0&&(t?n.forEach((e=>e.click())):n[0].click()),n.length>0}elementExists(e){return this.elementSelector(e).length>0}elementVisible(e,t){const n=this.elementSelector(e),o=new Array(n.length);return n.forEach(((e,t)=>{o[t]=E(e)})),"none"===t?o.every((e=>!e)):0!==o.length&&("any"===t?o.some((e=>e)):o.every((e=>e)))}waitForElement(e,t=1e4){const n=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForElement]",e),f((()=>this.elementSelector(e).length>0),n,200)}waitForVisible(e,t=1e4,n="any"){return f((()=>this.elementVisible(e,n)),Math.ceil(t/200),200)}async waitForThenClick(e,t=1e4,n=!1){return await this.waitForElement(e,t),this.click(e,n)}wait(e){return new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}hide(e,t){return _(m(),e,t)}prehide(e){const t=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[prehide]",t,location.href),_(t,e,"opacity")}undoPrehide(){const e=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[undoprehide]",e,location.href),e&&e.remove(),!!e}querySingleReplySelector(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const n=e.slice(6),o=document.evaluate(n,t,null,XPathResult.ANY_TYPE,null);let i=null;const s=[];for(;i=o.iterateNext();)s.push(i);return s}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}querySelectorChain(e){let t,n=document;for(const o of e){if(t=this.querySingleReplySelector(o,n),0===t.length)return[];n=t[0]}return t}elementSelector(e){return"string"==typeof e?this.querySingleReplySelector(e):this.querySelectorChain(e)}};const k=new class{constructor(e,t=null,n=null){if(this.id=c(),this.rules=[],this.foundCmp=null,this.state={lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],selfTest:null},a.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,n);else{n&&this.parseDeclarativeRules(n);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}this.domActions=new C(this)}initialize(e,t){const n=g(e);if(n.logs.lifecycle&&console.log("autoconsent init",window.location.href),this.config=n,n.enabled){if(t&&this.parseDeclarativeRules(t),this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,n),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}else n.logs.lifecycle&&console.log("autoconsent is disabled")}addDynamicRules(){y.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new h(e,this))}addConsentomaticCMP(e,t){this.rules.push(new p(`com_${e}`,t))}start(){window.requestIdleCallback?window.requestIdleCallback((()=>this._start()),{timeout:500}):this._start()}async _start(){const e=this.config.logs;e.lifecycle&&console.log(`Detecting CMPs on ${window.location.href}`),this.updateState({lifecycle:"started"});const t=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:t.map((e=>e.name))}),0===t.length)return e.lifecycle&&console.log("no CMP found",location.href),this.config.enablePrehide&&this.undoPrehide(),this.updateState({lifecycle:"nothingDetected"}),!1;this.updateState({lifecycle:"cmpDetected"});const n=[],o=[];for(const e of t)e.isCosmetic?o.push(e):n.push(e);let i=!1,s=await this.detectPopups(n,(async e=>{i=await this.handlePopup(e)}));if(0===s.length&&(s=await this.detectPopups(o,(async e=>{i=await this.handlePopup(e)}))),0===s.length)return e.lifecycle&&console.log("no popup found"),this.config.enablePrehide&&this.undoPrehide(),!1;if(s.length>1){const t={msg:"Found multiple CMPs, check the detection rules.",cmps:s.map((e=>e.name))};e.errors&&console.warn(t.msg,t.cmps),this.sendContentMessage({type:"autoconsentError",details:t})}return i}async findCmp(e){const t=this.config.logs;this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const n=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(t.lifecycle&&console.log(`Found CMP: ${e.name} ${window.location.href}`),this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),n.push(e))}catch(n){t.errors&&console.warn(`error detecting ${e.name}`,n)}return 0===n.length&&e>0?(await this.domActions.wait(500),this.findCmp(e-1)):n}async detectPopup(e){if(await this.waitForPopup(e).catch((t=>(this.config.logs.errors&&console.warn(`error waiting for a popup for ${e.name}`,t),!1))))return this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),e;throw new Error("Popup is not shown")}async detectPopups(e,t){const n=e.map((e=>this.detectPopup(e)));await Promise.any(n).then((e=>{t(e)})).catch((()=>null));const o=await Promise.allSettled(n),i=[];for(const e of o)"fulfilled"===e.status&&i.push(e.value);return i}async handlePopup(e){return this.updateState({lifecycle:"openPopupDetected"}),this.config.enablePrehide&&!this.state.prehideOn&&this.prehideElements(),this.foundCmp=e,"optOut"===this.config.autoAction?await this.doOptOut():"optIn"===this.config.autoAction?await this.doOptIn():(this.config.logs.lifecycle&&console.log("waiting for opt-out signal...",location.href),!0)}async doOptOut(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptOut"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt out on ${window.location.href}`),t=await this.foundCmp.optOut(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt out result ${t}`)):(e.errors&&console.log("no CMP to opt out"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optOutSucceeded":"optOutFailed"}),t}async doOptIn(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptIn"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt in on ${window.location.href}`),t=await this.foundCmp.optIn(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt in result ${t}`)):(e.errors&&console.log("no CMP to opt in"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:!1,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optInSucceeded":"optInFailed"}),t}async doSelfTest(){const e=this.config.logs;let t;return this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: self-test on ${window.location.href}`),t=await this.foundCmp.test()):(e.errors&&console.log("no CMP to self test"),t=!1),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,url:location.href}),this.updateState({selfTest:t}),t}async waitForPopup(e,t=5,n=500){const o=this.config.logs;o.lifecycle&&console.log("checking if popup is open...",e.name);const i=await e.detectPopup().catch((t=>(o.errors&&console.warn(`error detecting popup for ${e.name}`,t),!1)));return!i&&t>0?(await this.domActions.wait(n),this.waitForPopup(e,t-1,n)):(o.lifecycle&&console.log(e.name,"popup is "+(i?"open":"not open")),i)}prehideElements(){const e=this.config.logs,t=this.rules.filter((e=>e.prehideSelectors&&e.checkRunContext())).reduce(((e,t)=>[...e,...t.prehideSelectors]),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&(e.lifecycle&&console.log("Process is taking too long, unhiding elements"),this.undoPrehide())}),this.config.prehideTimeout||2e3),this.domActions.prehide(t.join(","))}undoPrehide(){return this.updateState({prehideOn:!1}),this.domActions.undoPrehide()}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){const t=this.config?.logs;switch(t?.messages&&console.log("received from background",e,window.location.href),e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const n=a.pending.get(e);n?(a.pending.delete(e),n.timer&&window.clearTimeout(n.timer),n.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{AutoconsentAndroid.process(JSON.stringify(e))}));window.autoconsentMessageCallback=e=>{k.receiveMessageCallback(e)}}(); +!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,n=null,o=!1){let i=null;return i=null!=n?Array.from(n.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(i=i.filter((e=>{const n=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const o of t.textFilter)if(-1!==n.indexOf(o.toLowerCase())){e=!0;break}return e}if(null!=t.textFilter)return-1!==n.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(i=i.filter((e=>{const n=window.getComputedStyle(e);let o=!0;for(const e of t.styleFilters){const t=n[e.option];o=e.negated?o&&t!==e.value:o&&t===e.value}return o}))),null!=t.displayFilter&&(i=i.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(i=i.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(i=i.filter((n=>{const o=e.base;e.setBase(n);const i=e.find(t.childFilter);return e.setBase(o),null!=i.target}))),o?i:(i.length>1&&console.warn("Multiple possible targets: ",i,t,n),i[0])}static find(t,n=!1){const o=[];if(null!=t.parent){const i=e.findElement(t.parent,null,n);if(null!=i){if(i instanceof Array)return i.forEach((i=>{const s=e.findElement(t.target,i,n);s instanceof Array?s.forEach((e=>{o.push({parent:i,target:e})})):o.push({parent:i,target:s})})),o;{const s=e.findElement(t.target,i,n);s instanceof Array?s.forEach((e=>{o.push({parent:i,target:e})})):o.push({parent:i,target:s})}}}else{const i=e.findElement(t.target,null,n);i instanceof Array?i.forEach((e=>{o.push({parent:null,target:e})})):o.push({parent:null,target:i})}return 0===o.length&&o.push({parent:null,target:null}),n?o:(1!==o.length&&console.warn("Multiple results found, even though multiple false",o),o[0])}};e.base=null;var t=e;function n(e){const n=t.find(e);return"css"===e.type?!!n.target:"checkbox"===e.type?!!n.target&&n.target.checked:void 0}async function o(e,c){switch(e.type){case"click":return async function(e){const n=t.find(e);null!=n.target&&n.target.click();return s(i)}(e);case"list":return async function(e,t){for(const n of e.actions)await o(n,t)}(e,c);case"consent":return async function(e,t){for(const i of e.consents){const e=-1!==t.indexOf(i.type);if(i.matcher&&i.toggleAction){n(i.matcher)!==e&&await o(i.toggleAction)}else e?await o(i.trueAction):await o(i.falseAction)}}(e,c);case"ifcss":return async function(e,n){const i=t.find(e);i.target?e.falseAction&&await o(e.falseAction,n):e.trueAction&&await o(e.trueAction,n)}(e,c);case"waitcss":return async function(e){await new Promise((n=>{let o=e.retries||10;const i=e.waitTime||250,s=()=>{const c=t.find(e);(e.negated&&c.target||!e.negated&&!c.target)&&o>0?(o-=1,setTimeout(s,i)):n()};s()}))}(e);case"foreach":return async function(e,n){const i=t.find(e,!0),s=t.base;for(const s of i)s.target&&(t.setBase(s.target),await o(e.action,n));t.setBase(s)}(e,c);case"hide":return async function(e){const n=t.find(e);n.target&&n.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const n=t.find(e),o=t.find(e.dragTarget);if(n.target){const e=n.target.getBoundingClientRect(),t=o.target.getBoundingClientRect();let i=t.top-e.top,s=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(s=0),"x"===this.config.axis.toLowerCase()&&(i=0);const c=window.screenX+e.left+e.width/2,r=window.screenY+e.top+e.height/2,a=e.left+e.width/2,l=e.top+e.height/2,u=document.createEvent("MouseEvents");u.initMouseEvent("mousedown",!0,!0,window,0,c,r,a,l,!1,!1,!1,!1,0,n.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,c+s,r+i,a+s,l+i,!1,!1,!1,!1,0,n.target);const h=document.createEvent("MouseEvents");h.initMouseEvent("mouseup",!0,!0,window,0,c+s,r+i,a+s,l+i,!1,!1,!1,!1,0,n.target),n.target.dispatchEvent(u),await this.waitTimeout(10),n.target.dispatchEvent(d),await this.waitTimeout(10),n.target.dispatchEvent(h)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await s(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(n){console.warn("eval error",n,e.code),t(!1)}}))}(e);default:throw"Unknown action type: "+e.type}}var i=0;function s(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function c(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var r=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},a={pending:new Map,sendContentMessage:null};var l={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!!window.Cookiebot,EVAL_COOKIEBOT_2:()=>!window.Cookiebot.hasResponse&&!0===window.Cookiebot.dialog?.visible,EVAL_COOKIEBOT_3:()=>window.Cookiebot.withdraw()||!0,EVAL_COOKIEBOT_4:()=>window.Cookiebot.hide()||!0,EVAL_COOKIEBOT_5:()=>!0===window.Cookiebot.declined,EVAL_KLARO_1:()=>{const e=globalThis.klaroConfig||globalThis.klaro?.getManager&&globalThis.klaro.getManager().config;if(!e)return!0;const t=(e.services||e.apps).filter((e=>!e.required)).map((e=>e.name));if(klaro&&klaro.getManager){const e=klaro.getManager();return t.every((t=>!e.consents[t]))}if(klaroConfig&&"cookie"===klaroConfig.storageMethod){const e=klaroConfig.cookieName||klaroConfig.storageName,n=JSON.parse(decodeURIComponent(document.cookie.split(";").find((t=>t.trim().startsWith(e))).split("=")[1]));return Object.keys(n).filter((e=>t.includes(e))).every((e=>!1===n[e]))}},EVAL_KLARO_OPEN_POPUP:()=>{klaro.show(void 0,!0)},EVAL_KLARO_TRY_API_OPT_OUT:()=>{if(window.klaro&&"function"==typeof klaro.show&&"function"==typeof klaro.getManager)try{return klaro.getManager().changeAll(!1),klaro.getManager().saveAndApplyConsents(),!0}catch(e){return console.warn(e),!1}return!1},EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_TRUSTARC_FRAME_TEST:()=>window&&window.QueryString&&"0"===window.QueryString.preferences,EVAL_TRUSTARC_FRAME_GTM:()=>window&&window.QueryString&&"1"===window.QueryString.gtm,EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_ALMACMP_0:()=>document.cookie.includes('"name":"Google","consent":false'),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_ARBEITSAGENTUR_TEST:()=>document.cookie.includes("cookie_consent=denied"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BAHN_TEST:()=>1===utag.gdpr.getSelectedCategories().length,EVAL_BING_0:()=>document.cookie.includes("AL=0")&&document.cookie.includes("AD=0")&&document.cookie.includes("SM=0"),EVAL_BLOCKSY_0:()=>document.cookie.includes("blocksy_cookies_consent_accepted=no"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CC_BANNER2_0:()=>!!document.cookie.match(/sncc=[^;]+D%3Dtrue/),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COOKIECONSENT2_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COOKIECONSENT3_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_LAW_INFO_DETECT:()=>!!window.CLI,EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"==e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_COOKIEYES_0:()=>document.cookie.includes("advertisement:no"),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DNDBEYOND_TEST:()=>document.cookie.includes("cookie-consent=denied"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ez-consent-tcf/),EVAL_FIDES_DETECT_POPUP:()=>window.Fides?.initialized,EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_HEMA_TEST_0:()=>document.cookie.includes("cookies_rejected=1"),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_IWINK_TEST:()=>document.cookie.includes("cookie_permission_granted=no"),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_KETCH_TEST:()=>document.cookie.includes("_ketch_consent_v1_"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC|GHCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||(e.checked="moove_gdpr_strict_cookies"===e.name||"moove_gdpr_strict_cookies"===e.id)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_OPERA_0:()=>document.cookie.includes("cookie_consent_essential=true")&&!document.cookie.includes("cookie_consent_marketing=true"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_ROBLOX_TEST:()=>document.cookie.includes("RBXcb"),EVAL_SIRDATA_UNBLOCK_SCROLL:()=>(document.documentElement.classList.forEach((e=>{e.startsWith("sd-cmp-")&&document.documentElement.classList.remove(e)})),!0),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_SVT_TEST:()=>document.cookie.includes('cookie-consent-1={"optedIn":true,"functionality":false,"statistics":false}'),EVAL_TAKEALOT_0:()=>document.body.classList.remove("freeze")||(document.body.style="")||!0,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)?.[0].includes("false"),EVAL_TAUNTON_TEST:()=>document.cookie.includes("taunton_user_consent_submitted=true"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_DONOTSELL:()=>utag.gdpr.dns?.setDnsState(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TEALIUM_DONOTSELL_CHECK:()=>1!==utag.gdpr.dns?.getDnsState(),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_UBUNTU_COM_0:()=>document.cookie.includes("_cookies_accepted=essential"),EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XE_TEST:()=>document.cookie.includes("xeConsentState={%22performance%22:false%2C%22marketing%22:false%2C%22compliance%22:false}"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var u={main:!0,frame:!1,urlPattern:""},d=class{constructor(e){this.runContext=u,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=l[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);const n=this.autoconsent.config.logs;if(this.autoconsent.config.isMainWorld){n.evals&&console.log("inline eval:",e,t);let o=!1;try{o=!!t.call(globalThis)}catch(t){n.evals&&console.error("error evaluating rule",e,t)}return Promise.resolve(o)}const o=`(${t.toString()})()`;return n.evals&&console.log("async eval:",e,o),function(e,t){const n=c();a.sendContentMessage({type:"eval",id:n,code:e,snippetId:t});const o=new r(n);return a.pending.set(o.id,o),o.promise}(o,e).catch((t=>(n.evals&&console.error("error evaluating rule",e,t),!1)))}checkRunContext(){const e={...u,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}click(e,t=!1){return this.autoconsent.domActions.click(e,t)}elementExists(e){return this.autoconsent.domActions.elementExists(e)}elementVisible(e,t){return this.autoconsent.domActions.elementVisible(e,t)}waitForElement(e,t){return this.autoconsent.domActions.waitForElement(e,t)}waitForVisible(e,t,n){return this.autoconsent.domActions.waitForVisible(e,t,n)}waitForThenClick(e,t,n){return this.autoconsent.domActions.waitForThenClick(e,t,n)}wait(e){return this.autoconsent.domActions.wait(e)}hide(e,t){return this.autoconsent.domActions.hide(e,t)}prehide(e){return this.autoconsent.domActions.prehide(e)}undoPrehide(){return this.autoconsent.domActions.undoPrehide()}querySingleReplySelector(e,t){return this.autoconsent.domActions.querySingleReplySelector(e,t)}querySelectorChain(e){return this.autoconsent.domActions.querySelectorChain(e)}elementSelector(e){return this.autoconsent.domActions.elementSelector(e)}},h=class extends d{constructor(e,t){super(t),this.rule=e,this.name=e.name,this.runContext=e.runContext||u}get hasSelfTest(){return!!this.rule.test}get isIntermediate(){return!!this.rule.intermediate}get isCosmetic(){return!!this.rule.cosmetic}get prehideSelectors(){return this.rule.prehideSelectors}async detectCmp(){return!!this.rule.detectCmp&&this._runRulesParallel(this.rule.detectCmp)}async detectPopup(){return!!this.rule.detectPopup&&this._runRulesSequentially(this.rule.detectPopup)}async optOut(){const e=this.autoconsent.config.logs;return!!this.rule.optOut&&(e.lifecycle&&console.log("Initiated optOut()",this.rule.optOut),this._runRulesSequentially(this.rule.optOut))}async optIn(){const e=this.autoconsent.config.logs;return!!this.rule.optIn&&(e.lifecycle&&console.log("Initiated optIn()",this.rule.optIn),this._runRulesSequentially(this.rule.optIn))}async openCmp(){return!!this.rule.openCmp&&this._runRulesSequentially(this.rule.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.rule.test):super.test()}async evaluateRuleStep(e){const t=[],n=this.autoconsent.config.logs;if(e.exists&&t.push(this.elementExists(e.exists)),e.visible&&t.push(this.elementVisible(e.visible,e.check)),e.eval){const n=this.mainWorldEval(e.eval);t.push(n)}if(e.waitFor&&t.push(this.waitForElement(e.waitFor,e.timeout)),e.waitForVisible&&t.push(this.waitForVisible(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(this.click(e.click,e.all)),e.waitForThenClick&&t.push(this.waitForThenClick(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(this.wait(e.wait)),e.hide&&t.push(this.hide(e.hide,e.method)),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;const o=await this.evaluateRuleStep(e.if);n.rulesteps&&console.log("Condition is",o),o?t.push(this._runRulesSequentially(e.then)):e.else?t.push(this._runRulesSequentially(e.else)):t.push(!0)}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return n.errors&&console.warn("Unrecognized rule",e),!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){const t=this.autoconsent.config.logs;for(const n of e){t.rulesteps&&console.log("Running rule...",n);const e=await this.evaluateRuleStep(n);if(t.rulesteps&&console.log("...rule result",e),!e&&!n.optional)return!1}return!0}},p=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=u,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>n(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>n(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||o(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}};function m(e="autoconsent-css-rules"){const t=`style#${e}`,n=document.querySelector(t);if(n&&n instanceof HTMLStyleElement)return n;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,n=document.createElement("style");return n.id=e,t.appendChild(n),n}}function _(e,t,n="display"){const o=`${t} { ${"opacity"===n?"opacity: 0":"display: none"} !important; z-index: -1 !important; pointer-events: none !important; } `;return e instanceof HTMLStyleElement&&(e.innerText+=o,t.length>0)}async function E(e,t,n){const o=await e();return!o&&t>0?new Promise((o=>{setTimeout((async()=>{o(E(e,t-1,n))}),n)})):Promise.resolve(o)}function f(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function g(e){const t={enabled:!0,autoAction:"optOut",disabledCmps:[],enablePrehide:!0,enableCosmeticRules:!0,detectRetries:20,isMainWorld:!1,prehideTimeout:2e3,logs:{lifecycle:!1,rulesteps:!1,evals:!1,errors:!0,messages:!1}},n=(o=t,globalThis.structuredClone?structuredClone(o):JSON.parse(JSON.stringify(o)));var o;for(const o of Object.keys(t))void 0!==e[o]&&(n[o]=e[o]);return n}var w="#truste-show-consent",A="#truste-consent-track",C=[class extends d{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${A}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!0}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=this.elementExists(`${w},${A}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return this.elementVisible(`#truste-consent-content,#trustarc-banner-overlay,${A}`,"all")}openFrame(){this.click(w)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(_(m(),`.truste_popframe, .truste_overlay, .truste_box_overlay, ${A}`),this.click(w),setTimeout((()=>{m().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,this.click("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends d{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return this.elementVisible("#defaultpreferencemanager","any")&&this.elementVisible(".mainContent","any")}async navigateToSettings(){return await E((async()=>this.elementExists(".shp")||this.elementVisible(".advance","any")||this.elementExists(".switch span:first-child")),10,500),this.elementExists(".shp")&&this.click(".shp"),await this.waitForElement(".prefPanel",5e3),this.elementVisible(".advance","any")&&this.click(".advance"),await E((()=>this.elementVisible(".switch span:first-child","any")),5,1e3)}async optOut(){if(await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST"))return!0;let e=3e3;return await this.mainWorldEval("EVAL_TRUSTARC_FRAME_GTM")&&(e=1500),await E((()=>"complete"===document.readyState),20,100),await this.waitForElement(".mainContent[aria-hidden=false]",e),!!this.click(".rejectAll")||(this.elementExists(".prefPanel")&&await this.waitForElement('.prefPanel[style="visibility: visible;"]',e),this.click("#catDetails0")?(this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",e),!0):this.click(".required")?(this.waitForThenClick("#gwt-debug-close_id",e),!0):(await this.navigateToSettings(),this.click(".switch span:nth-child(1):not(.active)",!0),this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",10*e),!0))}async optIn(){return this.click(".call")||(await this.navigateToSettings(),this.click(".switch span:nth-child(2)",!0),this.click(".submit"),this.waitForElement("#gwt-debug-close_id",3e5).then((()=>{this.click("#gwt-debug-close_id")}))),!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST")}},class extends d{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#CybotCookiebotDialogBodyUnderlay,#dtcookie-container,#cookiebanner,#cb-cookieoverlay,.modal--cookie-banner,#cookiebanner_outer,#CookieBanner"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return await this.mainWorldEval("EVAL_COOKIEBOT_1")}async detectPopup(){return this.mainWorldEval("EVAL_COOKIEBOT_2")}async optOut(){await this.wait(500);let e=await this.mainWorldEval("EVAL_COOKIEBOT_3");return await this.wait(500),e=e&&await this.mainWorldEval("EVAL_COOKIEBOT_4"),e}async optIn(){return this.elementExists("#dtcookie-container")?this.click(".h-dtcookie-accept"):(this.click(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),this.click("#CybotCookiebotDialogBodyLevelButtonAccept"),this.click("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_COOKIEBOT_5")}},class extends d{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!0,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname||"/ccpa_pm/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await this.waitForElement(".priv-save-btn",2e3):(await this.waitForElement(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL,.sp_choice_type_SAVE_AND_EXIT",2e3),!this.elementExists(".sp_choice_type_9")))}async optIn(){return await this.waitForElement(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!this.click(".sp_choice_type_11")||!!this.click(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname||"/ccpa_pm/index.html"===location.pathname}async optOut(){const e=this.autoconsent.config.logs;if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return this.click(".priv-save-btn")}if(!this.isManagerOpen()){if(!await this.waitForElement(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!this.elementExists(".sp_choice_type_12"))return this.click(".sp_choice_type_13");this.click(".sp_choice_type_12"),await E((()=>this.isManagerOpen()),200,100)}await this.waitForElement(".type-modal",2e4),this.waitForThenClick(".ccpa-stack .pm-switch[aria-checked=true] .slider",500,!0);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",n=await Promise.race([this.waitForElement(e,2e3).then((e=>e?0:-1)),this.waitForElement(t,2e3).then((e=>e?1:-1)),this.waitForElement(".pm-features",2e3).then((e=>e?2:-1))]);if(0===n)return await this.wait(1500),this.click(e);1===n?this.click(t):2===n&&(await this.waitForElement(".pm-features",1e4),this.click(".checked > span",!0),this.click(".chevron"))}catch(t){e.errors&&console.warn(t)}return this.click(".sp_choice_type_SAVE_AND_EXIT")}},class extends d{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||this.elementExists("#cmpbox")}async detectPopup(){return this.apiAvailable?(await this.wait(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):this.elementVisible("#cmpbox .cmpmore","any")}async optOut(){return await this.wait(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!this.click(".cmpboxbtnno")||(this.elementExists(".cmpwelcomeprpsbtn")?(this.click(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),this.click(".cmpboxbtnsave"),!0):(this.click(".cmpboxbtncustom"),await this.waitForElement(".cmptblbox",2e3),this.click(".cmptdchoice > a[aria-checked=true]",!0),this.click(".cmpboxbtnyescustomchoices"),this.hide("#cmpwrapper,#cmpbox","display"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):this.click(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends d{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#_evidon_banner")}async detectPopup(){return this.elementVisible("#_evidon_banner","any")}async optOut(){return this.click("#_evidon-decline-button")||(_(m(),"#evidon-prefdiag-overlay,#evidon-prefdiag-background,#_evidon-background"),await this.waitForThenClick("#_evidon-option-button"),await this.waitForElement("#evidon-prefdiag-overlay",5e3),await this.wait(500),await this.waitForThenClick("#evidon-prefdiag-decline")),!0}async optIn(){return this.click("#_evidon-accept-button")}},class extends d{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#onetrust-banner-sdk,#onetrust-pc-sdk")}async detectPopup(){return this.elementVisible("#onetrust-banner-sdk,#onetrust-pc-sdk","any")}async optOut(){return this.elementVisible("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies","any")?this.click("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies"):(this.elementExists("#onetrust-pc-btn-handler")?this.click("#onetrust-pc-btn-handler"):this.click(".ot-sdk-show-settings,button.js-cookie-settings"),await this.waitForElement("#onetrust-consent-sdk",2e3),await this.wait(1e3),this.click("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await this.wait(1e3),await this.waitForElement(".save-preference-btn-handler,.js-consent-save",2e3),this.click(".save-preference-btn-handler,.js-consent-save"),await this.waitForVisible("#onetrust-banner-sdk",5e3,"none"),!0)}async optIn(){return this.click("#onetrust-accept-btn-handler,#accept-recommended-btn-handler,.js-accept-cookies")}async test(){return await E((()=>this.mainWorldEval("EVAL_ONETRUST_1")),10,500)}},class extends d{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):this.elementExists(".klaro > .cookie-notice")}async detectPopup(){return this.elementVisible(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!await this.mainWorldEval("EVAL_KLARO_TRY_API_OPT_OUT")||(!!this.click(".klaro .cn-decline")||(await this.mainWorldEval("EVAL_KLARO_OPEN_POPUP"),!!this.click(".klaro .cn-decline")||(this.click(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked,.required,.only-required),.cm-purpose:not(.cm-toggle-all) > div > input:not(.half-checked,.required,.only-required)",!0),this.click(".cm-btn-accept,.cm-button"))))}async optIn(){return!!this.click(".klaro .cm-btn-accept-all")||(this.settingsOpen?(this.click(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),this.click(".cm-btn-accept")):this.click(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends d{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".unic .unic-box,.unic .unic-bar,.unic .unic-modal")}async detectPopup(){return this.elementVisible(".unic .unic-box,.unic .unic-bar,.unic .unic-modal","any")}async optOut(){if(await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await this.waitForElement(".unic input[type=checkbox]",1e3)){await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const n of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(n))return e.click(),await this.wait(500),!0}}return!1}async optIn(){return this.waitForThenClick(".unic #unic-agree")}async test(){await this.wait(1e3);return!this.elementExists(".unic .unic-box,.unic .unic-bar")}},class extends d{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".cmp-root .cmp-receptacle")}async detectPopup(){return this.elementVisible(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await this.waitForThenClick(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await this.waitForElement(".cmp-view-tab-tabs"))return!1;await this.waitForThenClick(".cmp-view-tab-tabs > :first-child"),await this.waitForThenClick(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await E((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await this.click(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return this.waitForThenClick(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends d{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return this.elementExists("tiktok-cookie-banner")}async detectPopup(){return f(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no decline button found"),!1)}async optIn(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no accept button found"),!1)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends d{constructor(){super(...arguments),this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return this.elementVisible("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return this.waitForThenClick("button[data-testid=save-btn]")}async optIn(){return this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await E((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}},class extends d{constructor(){super(...arguments),this.name="tumblr-com",this.runContext={urlPattern:"^https://(www\\.)?tumblr\\.com/"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}get prehideSelectors(){return["#cmp-app-container"]}async detectCmp(){return this.elementExists("#cmp-app-container")}async detectPopup(){return this.elementVisible("#cmp-app-container","any")}async optOut(){let e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary");return!!t&&(t.click(),await E((()=>{const e=document.querySelector("#cmp-app-container iframe");return!!e.contentDocument?.querySelector(".cmp__dialog input")}),5,500),e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary"),!!t&&(t.click(),!0))}async optIn(){const e=document.querySelector("#cmp-app-container iframe").contentDocument.querySelector(".cmp-components-button.is-primary");return!!e&&(e.click(),!0)}}],y=class{constructor(e){this.autoconsentInstance=e}click(e,t=!1){const n=this.elementSelector(e);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[click]",e,t,n),n.length>0&&(t?n.forEach((e=>e.click())):n[0].click()),n.length>0}elementExists(e){return this.elementSelector(e).length>0}elementVisible(e,t){const n=this.elementSelector(e),o=new Array(n.length);return n.forEach(((e,t)=>{o[t]=f(e)})),"none"===t?o.every((e=>!e)):0!==o.length&&("any"===t?o.some((e=>e)):o.every((e=>e)))}waitForElement(e,t=1e4){const n=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForElement]",e),E((()=>this.elementSelector(e).length>0),n,200)}waitForVisible(e,t=1e4,n="any"){return E((()=>this.elementVisible(e,n)),Math.ceil(t/200),200)}async waitForThenClick(e,t=1e4,n=!1){return await this.waitForElement(e,t),this.click(e,n)}wait(e){return new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}hide(e,t){return _(m(),e,t)}prehide(e){const t=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[prehide]",t,location.href),_(t,e,"opacity")}undoPrehide(){const e=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[undoprehide]",e,location.href),e&&e.remove(),!!e}querySingleReplySelector(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const n=e.slice(6),o=document.evaluate(n,t,null,XPathResult.ANY_TYPE,null);let i=null;const s=[];for(;i=o.iterateNext();)s.push(i);return s}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}querySelectorChain(e){let t,n=document;for(const o of e){if(t=this.querySingleReplySelector(o,n),0===t.length)return[];n=t[0]}return t}elementSelector(e){return"string"==typeof e?this.querySingleReplySelector(e):this.querySelectorChain(e)}};const k=new class{constructor(e,t=null,n=null){if(this.id=c(),this.rules=[],this.foundCmp=null,this.state={lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],selfTest:null},a.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,n);else{n&&this.parseDeclarativeRules(n);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}this.domActions=new y(this)}initialize(e,t){const n=g(e);if(n.logs.lifecycle&&console.log("autoconsent init",window.location.href),this.config=n,n.enabled){if(t&&this.parseDeclarativeRules(t),this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,n),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}else n.logs.lifecycle&&console.log("autoconsent is disabled")}addDynamicRules(){C.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new h(e,this))}addConsentomaticCMP(e,t){this.rules.push(new p(`com_${e}`,t))}start(){window.requestIdleCallback?window.requestIdleCallback((()=>this._start()),{timeout:500}):this._start()}async _start(){const e=this.config.logs;e.lifecycle&&console.log(`Detecting CMPs on ${window.location.href}`),this.updateState({lifecycle:"started"});const t=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:t.map((e=>e.name))}),0===t.length)return e.lifecycle&&console.log("no CMP found",location.href),this.config.enablePrehide&&this.undoPrehide(),this.updateState({lifecycle:"nothingDetected"}),!1;this.updateState({lifecycle:"cmpDetected"});const n=[],o=[];for(const e of t)e.isCosmetic?o.push(e):n.push(e);let i=!1,s=await this.detectPopups(n,(async e=>{i=await this.handlePopup(e)}));if(0===s.length&&(s=await this.detectPopups(o,(async e=>{i=await this.handlePopup(e)}))),0===s.length)return e.lifecycle&&console.log("no popup found"),this.config.enablePrehide&&this.undoPrehide(),!1;if(s.length>1){const t={msg:"Found multiple CMPs, check the detection rules.",cmps:s.map((e=>e.name))};e.errors&&console.warn(t.msg,t.cmps),this.sendContentMessage({type:"autoconsentError",details:t})}return i}async findCmp(e){const t=this.config.logs;this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const n=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(t.lifecycle&&console.log(`Found CMP: ${e.name} ${window.location.href}`),this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),n.push(e))}catch(n){t.errors&&console.warn(`error detecting ${e.name}`,n)}return 0===n.length&&e>0?(await this.domActions.wait(500),this.findCmp(e-1)):n}async detectPopup(e){if(await this.waitForPopup(e).catch((t=>(this.config.logs.errors&&console.warn(`error waiting for a popup for ${e.name}`,t),!1))))return this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),e;throw new Error("Popup is not shown")}async detectPopups(e,t){const n=e.map((e=>this.detectPopup(e)));await Promise.any(n).then((e=>{t(e)})).catch((()=>null));const o=await Promise.allSettled(n),i=[];for(const e of o)"fulfilled"===e.status&&i.push(e.value);return i}async handlePopup(e){return this.updateState({lifecycle:"openPopupDetected"}),this.config.enablePrehide&&!this.state.prehideOn&&this.prehideElements(),this.foundCmp=e,"optOut"===this.config.autoAction?await this.doOptOut():"optIn"===this.config.autoAction?await this.doOptIn():(this.config.logs.lifecycle&&console.log("waiting for opt-out signal...",location.href),!0)}async doOptOut(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptOut"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt out on ${window.location.href}`),t=await this.foundCmp.optOut(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt out result ${t}`)):(e.errors&&console.log("no CMP to opt out"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optOutSucceeded":"optOutFailed"}),t}async doOptIn(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptIn"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt in on ${window.location.href}`),t=await this.foundCmp.optIn(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt in result ${t}`)):(e.errors&&console.log("no CMP to opt in"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:!1,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optInSucceeded":"optInFailed"}),t}async doSelfTest(){const e=this.config.logs;let t;return this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: self-test on ${window.location.href}`),t=await this.foundCmp.test()):(e.errors&&console.log("no CMP to self test"),t=!1),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,url:location.href}),this.updateState({selfTest:t}),t}async waitForPopup(e,t=5,n=500){const o=this.config.logs;o.lifecycle&&console.log("checking if popup is open...",e.name);const i=await e.detectPopup().catch((t=>(o.errors&&console.warn(`error detecting popup for ${e.name}`,t),!1)));return!i&&t>0?(await this.domActions.wait(n),this.waitForPopup(e,t-1,n)):(o.lifecycle&&console.log(e.name,"popup is "+(i?"open":"not open")),i)}prehideElements(){const e=this.config.logs,t=this.rules.filter((e=>e.prehideSelectors&&e.checkRunContext())).reduce(((e,t)=>[...e,...t.prehideSelectors]),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&(e.lifecycle&&console.log("Process is taking too long, unhiding elements"),this.undoPrehide())}),this.config.prehideTimeout||2e3),this.domActions.prehide(t.join(","))}undoPrehide(){return this.updateState({prehideOn:!1}),this.domActions.undoPrehide()}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){const t=this.config?.logs;switch(t?.messages&&console.log("received from background",e,window.location.href),e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const n=a.pending.get(e);n?(a.pending.delete(e),n.timer&&window.clearTimeout(n.timer),n.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{AutoconsentAndroid.process(JSON.stringify(e))}));window.autoconsentMessageCallback=e=>{k.receiveMessageCallback(e)}}(); diff --git a/autoconsent/autoconsent-impl/libs/rules.json b/autoconsent/autoconsent-impl/libs/rules.json index 078861f46dc2..29a15061c63f 100644 --- a/autoconsent/autoconsent-impl/libs/rules.json +++ b/autoconsent/autoconsent-impl/libs/rules.json @@ -374,7 +374,6 @@ }, { "name": "aquasana.com", - "cosmetic": true, "prehideSelectors": [ "#consent-tracking" ], @@ -390,12 +389,24 @@ ], "optIn": [ { - "click": "#accept_consent" + "waitForThenClick": "#consent-tracking .affirm.btn" } ], "optOut": [ { - "hide": "#consent-tracking" + "if": { + "exists": "#consent-tracking .decline.btn" + }, + "then": [ + { + "click": "#consent-tracking .decline.btn" + } + ], + "else": [ + { + "hide": "#consent-tracking" + } + ] } ] }, @@ -1571,7 +1582,20 @@ ], "else": [ { - "hide": "[aria-describedby=\"cookieconsent:desc\"]" + "if": { + "exists": ".cmp-pref-link" + }, + "then": [ + { + "click": ".cmp-pref-link" + }, + { + "waitForThenClick": ".cmp-body [id*=rejectAll]" + }, + { + "waitForThenClick": ".cmp-body .cmp-save-btn" + } + ] } ] } @@ -1965,6 +1989,51 @@ } ] }, + { + "name": "cookiecuttr", + "vendorUrl": "https://github.com/cdwharton/cookieCuttr", + "cosmetic": false, + "runContext": { + "main": true, + "frame": false, + "urlPattern": "" + }, + "prehideSelectors": [ + ".cc-cookies" + ], + "detectCmp": [ + { + "exists": ".cc-cookies .cc-cookie-accept" + } + ], + "detectPopup": [ + { + "visible": ".cc-cookies .cc-cookie-accept" + } + ], + "optIn": [ + { + "waitForThenClick": ".cc-cookies .cc-cookie-accept" + } + ], + "optOut": [ + { + "if": { + "exists": ".cc-cookies .cc-cookie-decline" + }, + "then": [ + { + "click": ".cc-cookies .cc-cookie-decline" + } + ], + "else": [ + { + "hide": ".cc-cookies" + } + ] + } + ] + }, { "name": "cookiefirst.com", "prehideSelectors": [ @@ -2884,16 +2953,19 @@ "detectPopup": [ { "visible": "#fides-overlay #fides-banner" + }, + { + "eval": "EVAL_FIDES_DETECT_POPUP" } ], "optIn": [ { - "waitForThenClick": "#fides-banner [data-testid=\"Accept all-btn\"]" + "waitForThenClick": "#fides-banner .fides-accept-all-button" } ], "optOut": [ { - "waitForThenClick": "#fides-banner [data-testid=\"Reject all-btn\"]" + "waitForThenClick": "#fides-banner .fides-reject-all-button" } ] }, @@ -3738,29 +3810,34 @@ }, "then": [ { - "waitForThenClick": "#lanyard_root div[class*=buttons] > button[class*=secondaryButton]", + "waitForThenClick": "#lanyard_root div[class*=buttons] > button[class*=secondaryButton], #lanyard_root button[class*=buttons-secondary]", "comment": "can be either settings or reject button" } ] }, { - "waitFor": "#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description]", + "waitFor": "#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences", "timeout": 1000, "optional": true }, { "if": { - "exists": "#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description]" + "exists": "#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences" }, "then": [ { - "waitForThenClick": "#lanyard_root button[class*=rejectButton]" + "waitForThenClick": "#lanyard_root button[class*=rejectButton], #lanyard_root button[class*=rejectAllButton]" }, { - "click": "#lanyard_root button[class*=confirmButton],#lanyard_root div[class*=actions_] > button:nth-child(1)" + "click": "#lanyard_root button[class*=confirmButton],#lanyard_root div[class*=actions_] > button:nth-child(1), #lanyard_root button[class*=actionButton]" } ] } + ], + "test": [ + { + "eval": "EVAL_KETCH_TEST" + } ] }, { @@ -5162,6 +5239,42 @@ } ] }, + { + "name": "roblox", + "vendorUrl": "https://roblox.com", + "cosmetic": false, + "runContext": { + "main": true, + "frame": false, + "urlPattern": "^https://(www\\.)?roblox\\.com/" + }, + "prehideSelectors": [], + "detectCmp": [ + { + "exists": ".cookie-banner-wrapper" + } + ], + "detectPopup": [ + { + "visible": ".cookie-banner-wrapper .cookie-banner" + } + ], + "optIn": [ + { + "waitForThenClick": ".cookie-banner-wrapper button.btn-cta-lg" + } + ], + "optOut": [ + { + "waitForThenClick": ".cookie-banner-wrapper button.btn-secondary-lg" + } + ], + "test": [ + { + "eval": "EVAL_ROBLOX_TEST" + } + ] + }, { "name": "rog-forum.asus.com", "runContext": { @@ -6583,27 +6696,32 @@ }, { "name": "uswitch.com", + "runContext": { + "main": true, + "frame": false, + "urlPattern": "^https://(www\\.)?uswitch\\.com/" + }, "prehideSelectors": [ - "#cookie-banner-wrapper" + ".ucb" ], "detectCmp": [ { - "exists": "#cookie-banner-wrapper" + "exists": ".ucb-banner" } ], "detectPopup": [ { - "visible": "#cookie-banner-wrapper" + "visible": ".ucb-banner" } ], "optIn": [ { - "click": "#cookie_banner_accept_mobile" + "waitForThenClick": ".ucb-banner .ucb-btn-accept" } ], "optOut": [ { - "click": "#cookie_banner_save" + "waitForThenClick": ".ucb-banner .ucb-btn-save" } ] }, diff --git a/package-lock.json b/package-lock.json index b3aea2d8d87f..726dacc900a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ddg-android", "version": "1.0.0", "dependencies": { - "@duckduckgo/autoconsent": "^10.8.0", + "@duckduckgo/autoconsent": "^10.9.0", "@duckduckgo/autofill": "github:duckduckgo/duckduckgo-autofill#10.2.0", "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.18.0", "@duckduckgo/privacy-dashboard": "github:duckduckgo/privacy-dashboard#3.5.0", @@ -60,9 +60,9 @@ } }, "node_modules/@duckduckgo/autoconsent": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-10.8.0.tgz", - "integrity": "sha512-n4axPmOsDxK9X6UYUb+S7KWqvppG75IemnH+pK1SAp01+US4ez+t7fzq4VQU19dy0EpGyC1bUnsB2BzdhUx65g==" + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-10.9.0.tgz", + "integrity": "sha512-eTlPFmW7QzThb9OGDWSSnUmB8Kq74YDO1N63cC/XsBHruaeN13N60GwhcL2/p4C05Gfkv8AhyOl/fTvUjya/hg==" }, "node_modules/@duckduckgo/autofill": { "resolved": "git+ssh://git@github.com/duckduckgo/duckduckgo-autofill.git#6493e296934bf09277c03df45f11f4619711cb24", diff --git a/package.json b/package.json index f64e3292599d..76d22c97002a 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "rollup-plugin-terser": "^7.0.2" }, "dependencies": { - "@duckduckgo/autoconsent": "^10.8.0", + "@duckduckgo/autoconsent": "^10.9.0", "@duckduckgo/autofill": "github:duckduckgo/duckduckgo-autofill#10.2.0", "@duckduckgo/content-scope-scripts": "github:duckduckgo/content-scope-scripts#5.18.0", "@duckduckgo/privacy-dashboard": "github:duckduckgo/privacy-dashboard#3.5.0", From 98591186905ae6f4956ed69302862e5ae8dcad0a Mon Sep 17 00:00:00 2001 From: Noelia Alcala Date: Fri, 31 May 2024 09:32:50 +0100 Subject: [PATCH 07/12] Release Extended Onboarding to all users (#4583) Task/Issue URL: https://app.asana.com/0/1201807753394693/1207407312592960/f ### Description Remove old onboarding and release new extended onboarding to all users ### Steps to test this PR _Pre onboarding_ - Fresh install - [x] check new pre-onboarding flow with comparison chart is showing _Search suggestions dialog_ - Finish pre-onboarding - [x] Check new search suggestions dialog is displayed in the new tab page _SERP Dax dialog_ - Tap on a search option - [x] Check new SERP dialog is displayed - [x] Check dialog is not dismissed when you can interact with the webView - Tap on a link - [x] Check dialog is dismissed _Site suggestions Dax dialog_ - Clear storage - Install from branch - Finish pre-onboarding - Once in the browser, perform a search - SERP dialog will display - Tap on `Got it!` button - [x] Check new Site Suggestions dialog is displayed - Tap on `Surprise me!` option - [x] Check you navigate to `britannica.com/animal/duck` ... _Trackers Blocked Dax dialog_ - [x] Check new Trackers blocked dax dialog is displayed - [x] Check privacy shield is highlighted after typing animation is finished - Tap on privacy shield - Go back to browser - [x] Check highlight is dismissed - Tap on `Got it!` button ... _Fire Button Dax dialog_ - [x] Check new Fire dax dialog is shown - [x] Check fire button highlight is on - Tap on fire button - [x] Check dialog is dismissed - [x] Check fire button highlight is off - Clear data ... _End onboarding dialog_ - [x] Check new end dax dialog is shown after clear data ... _No Trackers Dax dialog_ - Go to `wikipedia.org` - [x] Check no trackers dax dialog has the new UI ... _Trackers Network Dax dialog_ - Go to `instagram.com` - [x] Check network dax dialog has the new UI ### UI changes https://github.com/duckduckgo/Android/assets/20798495/27dcc663-f9e5-4ef5-b809-cf3a8763a992 --- .../app/browser/BrowserTabViewModelTest.kt | 138 ++--- .../duckduckgo/app/cta/ui/CtaViewModelTest.kt | 116 ++-- .../duckduckgo/app/browser/BrowserActivity.kt | 8 +- .../app/browser/BrowserTabFragment.kt | 130 +--- .../app/browser/BrowserTabViewModel.kt | 94 ++- .../app/browser/commands/Command.kt | 11 +- .../BrowserLottieTrackersAnimatorHelper.kt | 41 +- .../BrowserTrackersAnimatorHelper.kt | 8 - .../java/com/duckduckgo/app/cta/ui/Cta.kt | 468 +++++++++++---- .../com/duckduckgo/app/cta/ui/CtaViewModel.kt | 101 +--- .../duckduckgo/app/cta/ui/ExperimentCta.kt | 555 ------------------ .../com/duckduckgo/app/di/AppComponent.kt | 2 - .../duckduckgo/app/global/view/FireDialog.kt | 34 +- .../app/launch/LaunchBridgeActivity.kt | 7 +- .../duckduckgo/app/launch/LaunchViewModel.kt | 7 +- .../app/onboarding/di/OnboardingModule.kt | 12 +- .../app/onboarding/di/WelcomePageModule.kt | 45 -- .../app/onboarding/ui/OnboardingActivity.kt | 16 +- .../onboarding/ui/OnboardingPageBuilder.kt | 12 +- .../onboarding/ui/OnboardingPageManager.kt | 17 +- .../app/onboarding/ui/page/WelcomePage.kt | 270 ++++++--- .../ui/page/WelcomePageViewModel.kt | 168 ++++-- .../experiment/ExperimentDaxBubbleCardView.kt | 67 --- .../page/experiment/ExperimentWelcomePage.kt | 307 ---------- .../ExperimentWelcomePageViewModel.kt | 151 ----- ...endedOnboardingExperimentVariantManager.kt | 57 -- .../ExtendedOnboardingFeatureToggles.kt | 11 +- .../OnboardingExperimentPixel.kt | 2 +- .../com/duckduckgo/app/pixels/AppPixelName.kt | 1 - .../app/settings/db/SettingsDataStore.kt | 2 + .../app/tabs/ui/TabSwitcherActivity.kt | 5 - .../onboarding_background_large.png | Bin 174105 -> 0 bytes .../onboarding_background_small.png | Bin 94766 -> 0 bytes .../onboarding_background_large.png | Bin 293861 -> 0 bytes .../res/drawable/onboarding_background.xml | 21 - .../content_onboarding_welcome.xml | 68 --- ...ml => content_onboarding_welcome_page.xml} | 2 +- .../res/layout/content_onboarding_welcome.xml | 77 --- ...ml => content_onboarding_welcome_page.xml} | 2 +- .../main/res/layout/fragment_browser_tab.xml | 10 +- ...> include_dax_dialog_intro_bubble_cta.xml} | 2 +- .../res/layout/include_new_browser_tab.xml | 5 +- ...=> include_onboarding_view_dax_dialog.xml} | 8 +- ....xml => pre_onboarding_dax_dialog_cta.xml} | 2 +- .../main/res/layout/sheet_fire_clear_data.xml | 14 +- .../java/com/duckduckgo/app/cta/ui/CtaTest.kt | 47 +- .../app/launch/LaunchViewModelTest.kt | 9 +- .../ui/OnboardingPageManagerPageCountTest.kt | 3 - .../ui/OnboardingPageManagerTest.kt | 4 - .../ui/page/WelcomePageViewModelTest.kt | 196 ++++--- .../common/ui/view/shape/DaxBubbleCardView.kt | 37 +- .../duckduckgo/common/ui/view/shape/Shapes.kt | 24 +- .../src/main/res/values/attrs-dax-dialog.xml | 22 +- 53 files changed, 1084 insertions(+), 2332 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/cta/ui/ExperimentCta.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/di/WelcomePageModule.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentDaxBubbleCardView.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePage.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePageViewModel.kt delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingExperimentVariantManager.kt rename app/src/main/java/com/duckduckgo/app/onboarding/ui/page/{experiment => extendedonboarding}/ExtendedOnboardingFeatureToggles.kt (80%) rename app/src/main/java/com/duckduckgo/app/onboarding/ui/page/{experiment => extendedonboarding}/OnboardingExperimentPixel.kt (97%) delete mode 100644 app/src/main/res/drawable-hdpi/onboarding_background_large.png delete mode 100644 app/src/main/res/drawable-hdpi/onboarding_background_small.png delete mode 100644 app/src/main/res/drawable-w600dp/onboarding_background_large.png delete mode 100644 app/src/main/res/drawable/onboarding_background.xml delete mode 100644 app/src/main/res/layout-land/content_onboarding_welcome.xml rename app/src/main/res/layout-land/{content_onboarding_welcome_experiment.xml => content_onboarding_welcome_page.xml} (98%) delete mode 100644 app/src/main/res/layout/content_onboarding_welcome.xml rename app/src/main/res/layout/{content_onboarding_welcome_experiment.xml => content_onboarding_welcome_page.xml} (98%) rename app/src/main/res/layout/{include_dax_dialog_intro_experiment_cta.xml => include_dax_dialog_intro_bubble_cta.xml} (99%) rename app/src/main/res/layout/{include_experiment_view_dax_dialog.xml => include_onboarding_view_dax_dialog.xml} (97%) rename app/src/main/res/layout/{experiment_pre_onboarding_dax_dialog_cta.xml => pre_onboarding_dax_dialog_cta.xml} (98%) rename app/src/main/res/drawable-w600dp/onboarding_background.xml => common/common-ui/src/main/res/values/attrs-dax-dialog.xml (58%) diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt index cdac091eba15..770ab00cb3c9 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -66,7 +66,7 @@ import com.duckduckgo.app.browser.camera.CameraHardwareChecker import com.duckduckgo.app.browser.certificates.BypassedSSLCertificatesRepository import com.duckduckgo.app.browser.certificates.remoteconfig.SSLCertificatesFeature import com.duckduckgo.app.browser.commands.Command -import com.duckduckgo.app.browser.commands.Command.HideExperimentOnboardingDialog +import com.duckduckgo.app.browser.commands.Command.HideOnboardingDaxDialog import com.duckduckgo.app.browser.commands.Command.LaunchPrivacyPro import com.duckduckgo.app.browser.commands.Command.LoadExtractedUrl import com.duckduckgo.app.browser.commands.Command.ShowBackNavigationHistory @@ -104,10 +104,8 @@ import com.duckduckgo.app.cta.model.DismissedCta import com.duckduckgo.app.cta.ui.Cta import com.duckduckgo.app.cta.ui.CtaViewModel import com.duckduckgo.app.cta.ui.DaxBubbleCta -import com.duckduckgo.app.cta.ui.DaxDialogCta -import com.duckduckgo.app.cta.ui.ExperimentDaxBubbleOptionsCta -import com.duckduckgo.app.cta.ui.ExperimentOnboardingDaxDialogCta import com.duckduckgo.app.cta.ui.HomePanelCta +import com.duckduckgo.app.cta.ui.OnboardingDaxDialogCta import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteDao import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepositoryImpl @@ -126,8 +124,8 @@ import com.duckduckgo.app.location.data.LocationPermissionsRepositoryImpl import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.OnboardingStore import com.duckduckgo.app.onboarding.store.UserStageStore -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager -import com.duckduckgo.app.onboarding.ui.page.experiment.OnboardingExperimentPixel +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao @@ -443,7 +441,7 @@ class BrowserTabViewModelTest { private val androidBrowserConfig: AndroidBrowserConfigFeature = mock() - private val mockToggle: Toggle = mock() + private val mockEnabledToggle: Toggle = mock { on { it.isEnabled() } doReturn true } private val mockPrivacyProtectionsPopupManager: PrivacyProtectionsPopupManager = mock() @@ -458,7 +456,7 @@ class BrowserTabViewModelTest { private val mockFaviconFetchingPrompt: FaviconsFetchingPrompt = mock() private val mockSSLCertificatesFeature: SSLCertificatesFeature = mock() private val mockBypassedSSLCertificatesRepository: BypassedSSLCertificatesRepository = mock() - private val mockExtendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager = mock() + private val mockExtendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles = mock() private val mockUserBrowserProperties: UserBrowserProperties = mock() @Before @@ -485,9 +483,9 @@ class BrowserTabViewModelTest { whenever(mockSavedSitesRepository.getBookmarks()).thenReturn(bookmarksListFlow.consumeAsFlow()) whenever(mockRemoteMessagingRepository.messageFlow()).thenReturn(remoteMessageFlow.consumeAsFlow()) whenever(mockSettingsDataStore.automaticFireproofSetting).thenReturn(AutomaticFireproofSetting.ASK_EVERY_TIME) - whenever(androidBrowserConfig.screenLock()).thenReturn(mockToggle) - whenever(mockSSLCertificatesFeature.allowBypass()).thenReturn(mockToggle) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(false) + whenever(androidBrowserConfig.screenLock()).thenReturn(mockEnabledToggle) + whenever(mockSSLCertificatesFeature.allowBypass()).thenReturn(mockEnabledToggle) + whenever(mockExtendedOnboardingFeatureToggles.aestheticUpdates()).thenReturn(mockEnabledToggle) whenever(subscriptions.shouldLaunchPrivacyProForUrl(any())).thenReturn(false) remoteMessagingModel = givenRemoteMessagingModel(mockRemoteMessagingRepository, mockPixel, coroutineRule.testDispatcherProvider) @@ -505,7 +503,7 @@ class BrowserTabViewModelTest { dispatchers = coroutineRule.testDispatcherProvider, duckDuckGoUrlDetector = DuckDuckGoUrlDetectorImpl(), surveyRepository = mockSurveyRepository, - extendedOnboardingExperimentVariantManager = mockExtendedOnboardingExperimentVariantManager, + extendedOnboardingFeatureToggles = mockExtendedOnboardingFeatureToggles, ) val siteFactory = SiteFactoryImpl( @@ -597,7 +595,7 @@ class BrowserTabViewModelTest { subscriptions = subscriptions, sslCertificatesFeature = mockSSLCertificatesFeature, bypassedSSLCertificatesRepository = mockBypassedSSLCertificatesRepository, - extendedOnboardingExperimentVariantManager = mockExtendedOnboardingExperimentVariantManager, + extendedOnboardingFeatureToggles = mockExtendedOnboardingFeatureToggles, userBrowserProperties = mockUserBrowserProperties, ) @@ -2345,7 +2343,7 @@ class BrowserTabViewModelTest { @Test fun whenRegisterDaxBubbleCtaDismissedThenRegisterInDatabase() = runTest { - val cta = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.registerDaxBubbleCtaDismissed() @@ -2354,7 +2352,7 @@ class BrowserTabViewModelTest { @Test fun whenRegisterDaxBubbleCtaDismissedThenCtaChangedToNull() = runTest { - val cta = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.registerDaxBubbleCtaDismissed() @@ -2371,7 +2369,7 @@ class BrowserTabViewModelTest { @Test fun whenUserClickedCtaButtonThenFirePixel() { - val cta = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) setCta(cta) testee.onUserClickCtaOkButton() verify(mockPixel).fire(cta.okPixel!!, cta.pixelOkParameters()) @@ -2431,32 +2429,6 @@ class BrowserTabViewModelTest { verify(mockPixel).fire(cta.cancelPixel!!, cta.pixelCancelParameters()) } - @Test - fun whenUserClickedHideDaxDialogThenHideDaxDialogCommandSent() { - val cta = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) - setCta(cta) - testee.onUserHideDaxDialog() - val command = captureCommands().lastValue - assertTrue(command is Command.DaxCommand.HideDaxDialog) - } - - @Test - fun whenUserDismissDaxTrackersBlockedDialogThenFinishTrackerAnimationCommandSent() { - val cta = DaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList(), "") - setCta(cta) - testee.onDaxDialogDismissed() - val command = captureCommands().lastValue - assertTrue(command is Command.DaxCommand.FinishPartialTrackerAnimation) - } - - @Test - fun whenUserDismissDifferentThanDaxTrackersBlockedDialogThenFinishTrackerAnimationCommandNotSent() { - val cta = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) - setCta(cta) - testee.onDaxDialogDismissed() - assertCommandNotIssued() - } - @Test fun whenUserDismissedCtaThenRegisterInDatabase() = runTest { val cta = HomePanelCta.AddWidgetAuto @@ -4881,14 +4853,14 @@ class BrowserTabViewModelTest { @Test fun whenProcessJsCallbackMessageScreenLockNotEnabledDoNotSendCommand() = runTest { - whenever(mockToggle.isEnabled()).thenReturn(false) + whenever(mockEnabledToggle.isEnabled()).thenReturn(false) testee.processJsCallbackMessage("myFeature", "screenLock", "myId", JSONObject("""{ "my":"object"}""")) assertCommandNotIssued() } @Test fun whenProcessJsCallbackMessageScreenLockEnabledSendCommand() = runTest { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) testee.processJsCallbackMessage("myFeature", "screenLock", "myId", JSONObject("""{ "my":"object"}""")) assertCommandIssued { assertEquals("object", this.data.params.getString("my")) @@ -4900,14 +4872,14 @@ class BrowserTabViewModelTest { @Test fun whenProcessJsCallbackMessageScreenUnlockNotEnabledDoNotSendCommand() = runTest { - whenever(mockToggle.isEnabled()).thenReturn(false) + whenever(mockEnabledToggle.isEnabled()).thenReturn(false) testee.processJsCallbackMessage("myFeature", "screenUnlock", "myId", JSONObject("""{ "my":"object"}""")) assertCommandNotIssued() } @Test fun whenProcessJsCallbackMessageScreenUnlockEnabledSendCommand() = runTest { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) testee.processJsCallbackMessage("myFeature", "screenUnlock", "myId", JSONObject("""{ "my":"object"}""")) assertCommandIssued() } @@ -5075,7 +5047,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenAllowBypassSSLCertificatesFeatureDisabledThenSSLCertificateErrorsAreIgnored() { - whenever(mockToggle.isEnabled()).thenReturn(false) + whenever(mockEnabledToggle.isEnabled()).thenReturn(false) val url = "http://example.com" givenCurrentSite(url) @@ -5090,7 +5062,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenSslCertificateIssueReceivedForLoadingSiteThenShowSslWarningCommandSentAndViewStatesUpdated() { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" givenCurrentSite(url) @@ -5111,7 +5083,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenSslCertificateIssueReceivedForAnotherSiteThenShowSslWarningCommandNotSentAndViewStatesNotUpdated() { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" givenCurrentSite(url) @@ -5127,7 +5099,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenInFreshStartAndSslCertificateIssueReceivedThenShowSslWarningCommandSentAndViewStatesUpdated() = runTest { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" val site: Site = mock() whenever(site.url).thenReturn(url) @@ -5196,7 +5168,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenSslCertificateActionProceedThenPixelsFiredAndViewStatesUpdated() { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" val certificate = aRSASslCertificate() val sslErrorResponse = SslErrorResponse(SslError(SslError.SSL_EXPIRED, certificate, url), EXPIRED, url) @@ -5215,7 +5187,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenWebViewRefreshedThenSSLErrorStateIsNone() { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" val certificate = aRSASslCertificate() val sslErrorResponse = SslErrorResponse(SslError(SslError.SSL_EXPIRED, certificate, url), EXPIRED, url) @@ -5230,7 +5202,7 @@ class BrowserTabViewModelTest { @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q) fun whenResetSSLErrorThenBrowserErrorStateIsLoading() { - whenever(mockToggle.isEnabled()).thenReturn(true) + whenever(mockEnabledToggle.isEnabled()).thenReturn(true) val url = "http://example.com" val certificate = aRSASslCertificate() val sslErrorResponse = SslErrorResponse(SslError(SslError.SSL_EXPIRED, certificate, url), EXPIRED, url) @@ -5287,42 +5259,18 @@ class BrowserTabViewModelTest { } @Test - fun whenOnboardingExperimentEnabledThenSetBrowserBackgroundWithNewDrawable() = runTest { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) - - testee.configureBrowserBackground() - - assertCommandIssued { - assertEquals(R.drawable.onboarding_experiment_background_bitmap, this.backgroundRes) - } - } - - @Test - fun whenOnboardingExperimentDisabledThenSetBrowserBackgroundWithNoDrawable() = runTest { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(false) - - testee.configureBrowserBackground() - - assertCommandIssued { - assertEquals(0, this.backgroundRes) - } - } - - @Test - fun givenOnboardingExperimentEnabledWhenTrackersBlockedCtaShownThenPrivacyShieldIsHighlighted() = runTest { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) - val cta = ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) + fun whenTrackersBlockedCtaShownThenPrivacyShieldIsHighlighted() = runTest { + val cta = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) testee.ctaViewState.value = ctaViewState().copy(cta = cta) - testee.onExperimentDaxTypingAnimationFinished() + testee.onOnboardingDaxTypingAnimationFinished() assertTrue(browserViewState().showPrivacyShield.isHighlighted()) } @Test - fun givenOnboardingExperimentEnabledAndPrivacyShieldHighlightedWhenShieldIconSelectedThenStopPulse() = runTest { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) - val cta = ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) + fun givenPrivacyShieldHighlightedWhenShieldIconSelectedThenStopPulse() = runTest { + val cta = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) testee.ctaViewState.value = ctaViewState().copy(cta = cta) testee.onPrivacyShieldSelected() @@ -5330,9 +5278,8 @@ class BrowserTabViewModelTest { } @Test - fun givenOnboardingExperimentEnabledAndPrivacyShieldHighlightedWhenShieldIconSelectedThenSendPixel() = runTest { + fun givenPrivacyShieldHighlightedWhenShieldIconSelectedThenSendPixel() = runTest { whenever(mockUserBrowserProperties.daysSinceInstalled()).thenReturn(0) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) testee.browserViewState.value = browserViewState().copy(showPrivacyShield = HighlightableButton.Visible(highlighted = true)) val testParams = mapOf("daysSinceInstall" to "0", "from_onboarding" to "true") @@ -5341,33 +5288,31 @@ class BrowserTabViewModelTest { } @Test - fun givenOnboardingExperimentEnabledWhenUserDismissDaxTrackersBlockedDialogThenFinishPrivacyShieldPulse() { - val cta = ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) + fun whenUserDismissDaxTrackersBlockedDialogThenFinishPrivacyShieldPulse() { + val cta = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, emptyList()) setCta(cta) - testee.onDaxDialogDismissed() + testee.onUserDismissedCta() assertFalse(browserViewState().showPrivacyShield.isHighlighted()) } @Test - fun givenOnboardingExperimentCtaShownWhenUserSubmittedQueryThenDismissCta() { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) + fun givenOnboardingCtaShownWhenUserSubmittedQueryThenDismissCta() { whenever(mockOmnibarConverter.convertQueryToUrl("foo", null)).thenReturn("foo.com") - val cta = ExperimentOnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) + val cta = OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.onUserSubmittedQuery("foo") - assertCommandIssued { - assertEquals(cta, this.experimentCta) + assertCommandIssued { + assertEquals(cta, this.onboardingCta) } } @Test fun givenSuggestedSearchesDialogShownWhenUserSubmittedQueryThenCustomSearchPixelIsSent() { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) whenever(mockOmnibarConverter.convertQueryToUrl("foo", null)).thenReturn("foo.com") - val cta = ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.onUserSubmittedQuery("foo") @@ -5378,7 +5323,7 @@ class BrowserTabViewModelTest { @Test fun givenSuggestedSearchesDialogShownWhenUserSubmittedQueryDifferentFromOptionsThenPixelIsNotSent() { whenever(mockOmnibarConverter.convertQueryToUrl("mighty ducks cast", null)).thenReturn("mighty ducks cast") - val cta = ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.onUserSubmittedQuery("mighty ducks cast") @@ -5388,9 +5333,8 @@ class BrowserTabViewModelTest { @Test fun givenSuggestedSitesDialogShownWhenUserSubmittedQueryThenCustomSitePixelIsSent() { - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) whenever(mockOmnibarConverter.convertQueryToUrl("foo", null)).thenReturn("foo.com") - val cta = ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta(mockOnboardingStore, mockAppInstallStore) + val cta = DaxBubbleCta.DaxIntroVisitSiteOptionsCta(mockOnboardingStore, mockAppInstallStore) testee.ctaViewState.value = CtaViewState(cta = cta) testee.onUserSubmittedQuery("foo") diff --git a/app/src/androidTest/java/com/duckduckgo/app/cta/ui/CtaViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/cta/ui/CtaViewModelTest.kt index 65523b8e763b..2aabae8b2edb 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/cta/ui/CtaViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/cta/ui/CtaViewModelTest.kt @@ -32,7 +32,7 @@ import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.OnboardingStore import com.duckduckgo.app.onboarding.store.UserStageStore -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles import com.duckduckgo.app.pixels.AppPixelName.* import com.duckduckgo.app.privacy.db.UserAllowListRepository import com.duckduckgo.app.privacy.model.HttpsStatus @@ -52,6 +52,7 @@ import com.duckduckgo.app.trackerdetection.model.TrackingEvent import com.duckduckgo.app.widget.ui.WidgetCapabilities import com.duckduckgo.common.test.CoroutineTestRule import com.duckduckgo.common.test.InstantSchedulersRule +import com.duckduckgo.feature.toggles.api.Toggle import java.util.concurrent.TimeUnit import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.drop @@ -115,7 +116,7 @@ class CtaViewModelTest { private lateinit var mockSurveyRepository: SurveyRepository @Mock - private lateinit var mockExtendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager + private lateinit var mockExtendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles private val requiredDaxOnboardingCtas: List = listOf( CtaId.DAX_INTRO, @@ -137,11 +138,12 @@ class CtaViewModelTest { .allowMainThreadQueries() .build() + val mockToggle: Toggle = mock { on { it.isEnabled() } doReturn true } + whenever(mockExtendedOnboardingFeatureToggles.aestheticUpdates()).thenReturn(mockToggle) whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) whenever(mockUserAllowListRepository.isDomainInUserAllowList(any())).thenReturn(false) whenever(mockDismissedCtaDao.dismissedCtas()).thenReturn(db.dismissedCtaDao().dismissedCtas()) whenever(mockTabRepository.flowTabs).thenReturn(db.tabsDao().flowTabs()) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(false) testee = CtaViewModel( appInstallStore = mockAppInstallStore, @@ -156,7 +158,7 @@ class CtaViewModelTest { dispatchers = coroutineRule.testDispatcherProvider, duckDuckGoUrlDetector = DuckDuckGoUrlDetectorImpl(), surveyRepository = mockSurveyRepository, - extendedOnboardingExperimentVariantManager = mockExtendedOnboardingExperimentVariantManager, + extendedOnboardingFeatureToggles = mockExtendedOnboardingFeatureToggles, ) } @@ -202,7 +204,7 @@ class CtaViewModelTest { @Test fun whenCtaShownAndCtaIsDaxAndCanNotSendPixelThenPixelIsNotFired() { - testee.onCtaShown(DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore)) + testee.onCtaShown(DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore)) verify(mockPixel, never()).fire(eq(SURVEY_CTA_SHOWN), any(), any(), eq(COUNT)) } @@ -256,32 +258,20 @@ class CtaViewModelTest { fun whenCtaDismissedAndAllDaxOnboardingCtasShownThenStageCompleted() = runTest { givenDaxOnboardingActive() givenShownDaxOnboardingCtas(requiredDaxOnboardingCtas) - testee.onUserDismissedCta(DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore)) + testee.onUserDismissedCta(OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore)) verify(mockUserStageStore).stageCompleted(AppStage.DAX_ONBOARDING) } @Test - fun whenHideTipsForeverThenPixelIsFired() = runTest { - testee.hideTipsForever(HomePanelCta.AddWidgetAuto) - verify(mockPixel).fire(eq(ONBOARDING_DAX_ALL_CTA_HIDDEN), any(), any(), eq(COUNT)) - } - - @Test - fun whenHideTipsForeverThenHideTipsSetToTrueOnSettings() = runTest { - testee.hideTipsForever(HomePanelCta.AddWidgetAuto) - verify(mockSettingsDataStore).hideTips = true - } - - @Test - fun whenHideTipsForeverThenDaxOnboardingStageCompleted() = runTest { - testee.hideTipsForever(HomePanelCta.AddWidgetAuto) - verify(mockUserStageStore).stageCompleted(AppStage.DAX_ONBOARDING) + fun whenRegisterDaxBubbleIntroCtaThenDatabaseNotified() = runTest { + testee.registerDaxBubbleCtaDismissed(DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore)) + verify(mockDismissedCtaDao).insert(DismissedCta(CtaId.DAX_INTRO)) } @Test - fun whenRegisterDaxBubbleIntroCtaThenDatabaseNotified() = runTest { - testee.registerDaxBubbleCtaDismissed(DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore)) - verify(mockDismissedCtaDao).insert(DismissedCta(CtaId.DAX_INTRO)) + fun whenRegisterDaxBubbleIntroVisitSiteCtaThenDatabaseNotified() = runTest { + testee.registerDaxBubbleCtaDismissed(DaxBubbleCta.DaxIntroVisitSiteOptionsCta(mockOnboardingStore, mockAppInstallStore)) + verify(mockDismissedCtaDao).insert(DismissedCta(CtaId.DAX_INTRO_VISIT_SITE)) } @Test @@ -371,10 +361,10 @@ class CtaViewModelTest { "Facebook", ) - val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) as DaxDialogCta + val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) as OnboardingDaxDialogCta - assertTrue(value is DaxDialogCta.DaxMainNetworkCta) - val actualText = (value as DaxDialogCta.DaxMainNetworkCta).getDaxText(context) + assertTrue(value is OnboardingDaxDialogCta.DaxMainNetworkCta) + val actualText = (value as OnboardingDaxDialogCta.DaxMainNetworkCta).getTrackersDescription(context) assertEquals(expectedCtaText, actualText) } @@ -382,7 +372,7 @@ class CtaViewModelTest { fun whenRefreshCtaWhileBrowsingOnSiteOwnedByMajorTrackerThenReturnNetworkCta() = runTest { givenDaxOnboardingActive() val site = site(url = "http://m.instagram.com", entity = TestEntity("Facebook", "Facebook", 9.0)) - val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) as DaxDialogCta + val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) as OnboardingDaxDialogCta val expectedCtaText = context.resources.getString( R.string.daxMainNetworkOwnedCtaText, "Facebook", @@ -390,8 +380,8 @@ class CtaViewModelTest { "Facebook", ) - assertTrue(value is DaxDialogCta.DaxMainNetworkCta) - val actualText = (value as DaxDialogCta.DaxMainNetworkCta).getDaxText(context) + assertTrue(value is OnboardingDaxDialogCta.DaxMainNetworkCta) + val actualText = (value as OnboardingDaxDialogCta.DaxMainNetworkCta).getTrackersDescription(context) assertEquals(expectedCtaText, actualText) } @@ -410,7 +400,7 @@ class CtaViewModelTest { val site = site(url = "http://www.cnn.com", trackerCount = 1, events = listOf(trackingEvent)) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxTrackersBlockedCta) + assertTrue(value is OnboardingDaxDialogCta.DaxTrackersBlockedCta) } @Test @@ -428,16 +418,16 @@ class CtaViewModelTest { val site = site(url = "http://www.cnn.com", trackerCount = 1, events = listOf(trackingEvent)) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxTrackersBlockedCta) + assertTrue(value is OnboardingDaxDialogCta.DaxTrackersBlockedCta) } @Test - fun whenRefreshCtaWhileBrowsingAndNoTrackersInformationThenReturnNoSerpCta() = runTest { + fun whenRefreshCtaWhileBrowsingAndNoTrackersInformationThenReturnNoTrackersCta() = runTest { givenDaxOnboardingActive() val site = site(url = "http://www.cnn.com", trackerCount = 1) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxNoSerpCta) + assertTrue(value is OnboardingDaxDialogCta.DaxNoTrackersCta) } @Test @@ -446,16 +436,16 @@ class CtaViewModelTest { val site = site(url = "http://www.duckduckgo.com") val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxSerpCta) + assertTrue(value is OnboardingDaxDialogCta.DaxSerpCta) } @Test - fun whenRefreshCtaWhileBrowsingThenReturnNoSerpCta() = runTest { + fun whenRefreshCtaWhileBrowsingThenReturnNoTrackersCta() = runTest { givenDaxOnboardingActive() val site = site(url = "http://www.wikipedia.com") val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxNoSerpCta) + assertTrue(value is OnboardingDaxDialogCta.DaxNoTrackersCta) } @Test @@ -464,7 +454,7 @@ class CtaViewModelTest { val site = site(url = "http://www.wikipedia.com") val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = true, site = site) - assertTrue(value is DaxDialogCta.DaxNoSerpCta) + assertTrue(value is OnboardingDaxDialogCta.DaxNoTrackersCta) } @Test @@ -473,7 +463,7 @@ class CtaViewModelTest { val site = site(url = "http://www.wikipedia.com") val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false, site = site) - assertTrue(value !is DaxDialogCta) + assertFalse(value is OnboardingDaxDialogCta) } @Test @@ -483,13 +473,23 @@ class CtaViewModelTest { whenever(mockDismissedCtaDao.exists(CtaId.DAX_DIALOG_SERP)).thenReturn(true) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) - assertTrue(value is DaxBubbleCta.DaxIntroCta) + assertTrue(value is DaxBubbleCta.DaxIntroSearchOptionsCta) } @Test - fun whenRefreshCtaOnHomeTabAndIntroCtaWasShownThenEndCtaShown() = runTest { + fun whenRefreshCtaOnHomeTabAndIntroCtaWasShownThenVisitSiteCtaShown() = runTest { givenDaxOnboardingActive() whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(true) + + val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) + assertTrue(value is DaxBubbleCta.DaxIntroVisitSiteOptionsCta) + } + + @Test + fun whenRefreshCtaOnHomeTabAndIntroAndVisitSiteCtasWereShownThenEndCtaShown() = runTest { + givenDaxOnboardingActive() + whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(true) + whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO_VISIT_SITE)).thenReturn(true) givenAtLeastOneDaxDialogCtaShown() val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) @@ -636,25 +636,6 @@ class CtaViewModelTest { launch.cancel() } - @Test - fun whenFirstTimeUserClicksOnFireButtonThenFireDialogCtaReturned() = runTest { - givenDaxOnboardingActive() - - val fireDialogCta = testee.getFireDialogCta() - - assertTrue(fireDialogCta is DaxFireDialogCta.TryClearDataCta) - } - - @Test - fun whenFirstTimeUserClicksOnFireButtonButUserHidAllTipsThenFireDialogCtaIsNull() = runTest { - givenDaxOnboardingActive() - whenever(mockSettingsDataStore.hideTips).thenReturn(true) - - val fireDialogCta = testee.getFireDialogCta() - - assertNull(fireDialogCta) - } - @Test fun whenFireCtaDismissedThenFireDialogCtaIsNull() = runTest { givenDaxOnboardingActive() @@ -666,20 +647,19 @@ class CtaViewModelTest { } @Test - fun givenExperimentEnabledWhenRefreshCtaOnHomeTabAndIntroCtaWasNotPreviouslyShownThenSearchSuggestionsCtaShown() = runTest { + fun whenRefreshCtaOnHomeTabAndIntroCtaWasNotPreviouslyShownThenSearchSuggestionsCtaShown() = runTest { givenDaxOnboardingActive() whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(false) whenever(mockDismissedCtaDao.exists(CtaId.DAX_DIALOG_SERP)).thenReturn(true) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) - assertTrue(value is ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroSearchOptionsCta) + assertTrue(value is DaxBubbleCta.DaxIntroSearchOptionsCta) } @Test - fun whenRegisterDaxExperimentVisitSiteCtaThenDatabaseNotified() = runTest { + fun whenRegisterDismissedDaxIntroVisitSiteCtaThenDatabaseNotified() = runTest { testee.registerDaxBubbleCtaDismissed( - ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta( + DaxBubbleCta.DaxIntroVisitSiteOptionsCta( mockOnboardingStore, mockAppInstallStore, ), @@ -692,10 +672,9 @@ class CtaViewModelTest { givenDaxOnboardingActive() whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(true) whenever(mockDismissedCtaDao.exists(CtaId.DAX_DIALOG_TRACKERS_FOUND)).thenReturn(false) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) - assertTrue(value is ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta) + assertTrue(value is DaxBubbleCta.DaxIntroVisitSiteOptionsCta) } @Test @@ -703,10 +682,9 @@ class CtaViewModelTest { givenDaxOnboardingActive() whenever(mockDismissedCtaDao.exists(CtaId.DAX_INTRO)).thenReturn(true) whenever(mockDismissedCtaDao.exists(CtaId.DAX_DIALOG_TRACKERS_FOUND)).thenReturn(true) - whenever(mockExtendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()).thenReturn(true) val value = testee.refreshCta(coroutineRule.testDispatcher, isBrowserShowing = false) - assertFalse(value is ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta) + assertFalse(value is DaxBubbleCta.DaxIntroVisitSiteOptionsCta) } private suspend fun givenDaxOnboardingActive() { diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index 18494e367606..39da910fb283 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -41,7 +41,6 @@ import com.duckduckgo.app.browser.BrowserViewModel.Command.Query import com.duckduckgo.app.browser.databinding.ActivityBrowserBinding import com.duckduckgo.app.browser.databinding.IncludeOmnibarToolbarMockupBinding import com.duckduckgo.app.browser.shortcut.ShortcutBuilder -import com.duckduckgo.app.cta.ui.CtaViewModel import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.downloads.DownloadsActivity import com.duckduckgo.app.feedback.ui.common.FeedbackActivity @@ -56,7 +55,6 @@ import com.duckduckgo.app.global.view.renderIfChanged import com.duckduckgo.app.onboarding.ui.page.DefaultBrowserPage import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.AppPixelName.FIRE_DIALOG_CANCEL -import com.duckduckgo.app.pixels.AppPixelName.FIRE_DIALOG_PROMOTED_CANCEL import com.duckduckgo.app.playstore.PlayStoreUtils import com.duckduckgo.app.settings.SettingsActivity import com.duckduckgo.app.settings.db.SettingsDataStore @@ -102,9 +100,6 @@ open class BrowserActivity : DuckDuckGoActivity() { @Inject lateinit var dataClearerForegroundAppRestartPixel: DataClearerForegroundAppRestartPixel - @Inject - lateinit var ctaViewModel: CtaViewModel - @Inject lateinit var userEventsStore: UserEventsStore @@ -441,7 +436,6 @@ open class BrowserActivity : DuckDuckGoActivity() { val dialog = FireDialog( context = this, clearPersonalDataAction = clearPersonalDataAction, - ctaViewModel = ctaViewModel, pixel = pixel, settingsDataStore = settingsDataStore, userEventsStore = userEventsStore, @@ -453,7 +447,7 @@ open class BrowserActivity : DuckDuckGoActivity() { } dialog.setOnShowListener { currentTab?.onFireDialogVisibilityChanged(isVisible = true) } dialog.setOnCancelListener { - pixel.fire(if (dialog.ctaVisible) FIRE_DIALOG_PROMOTED_CANCEL else FIRE_DIALOG_CANCEL) + pixel.fire(FIRE_DIALOG_CANCEL) currentTab?.onFireDialogVisibilityChanged(isVisible = false) } dialog.show() diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 6fd29776b4f3..883efc1fd1c6 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -166,7 +166,6 @@ import com.duckduckgo.app.browser.webshare.WebShareChooser import com.duckduckgo.app.browser.webview.DummyWebMessageListenerFeature import com.duckduckgo.app.browser.webview.WebContentDebugging import com.duckduckgo.app.cta.ui.* -import com.duckduckgo.app.cta.ui.DaxDialogCta.* import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.fire.fireproofwebsite.data.website @@ -230,7 +229,6 @@ import com.duckduckgo.common.ui.DuckDuckGoActivity import com.duckduckgo.common.ui.DuckDuckGoFragment import com.duckduckgo.common.ui.store.BrowserAppTheme import com.duckduckgo.common.ui.view.DaxDialog -import com.duckduckgo.common.ui.view.DaxDialogListener import com.duckduckgo.common.ui.view.KeyboardAwareEditText import com.duckduckgo.common.ui.view.KeyboardAwareEditText.ShowSuggestionsListener import com.duckduckgo.common.ui.view.dialog.ActionBottomSheetDialog @@ -563,11 +561,11 @@ class BrowserTabFragment : private val daxDialogCta get() = binding.includeNewBrowserTab.includeDaxDialogCta - private val daxDialogIntroExperimentCta - get() = binding.includeNewBrowserTab.includeDaxDialogIntroExperimentCta + private val daxDialogIntroBubbleCta + get() = binding.includeNewBrowserTab.includeDaxDialogIntroBubbleCta - private val daxDialogExperimentOnboardingCta - get() = binding.includeOnboardingDaxDialogExperiment + private val daxDialogOnboardingCta + get() = binding.includeOnboardingDaxDialog private val smoothProgressAnimator by lazy { SmoothProgressAnimator(omnibar.pageLoadingIndicator) } @@ -1493,8 +1491,6 @@ class BrowserTabFragment : is Command.GenerateWebViewPreviewImage -> generateWebViewPreviewImage() is Command.LaunchTabSwitcher -> launchTabSwitcher() is Command.ShowErrorWithAction -> showErrorSnackbar(it) - is Command.DaxCommand.FinishPartialTrackerAnimation -> finishPartialTrackerAnimation() - is Command.DaxCommand.HideDaxDialog -> showHideTipsDialog(it.cta) is Command.HideWebContent -> webView?.hide() is Command.ShowWebContent -> webView?.show() is Command.CheckSystemLocationPermission -> checkSystemLocationPermission(it.domain, it.deniedForever) @@ -1545,12 +1541,11 @@ class BrowserTabFragment : is Command.ScreenLock -> screenLock(it.data) is Command.ScreenUnlock -> screenUnlock() is Command.ShowFaviconsPrompt -> showFaviconsPrompt() - is Command.SetBrowserBackground -> setBrowserBackground(it.backgroundRes) is Command.ShowWebPageTitle -> showWebPageTitleInCustomTab(it.title, it.url) is Command.ShowSSLError -> showSSLWarning(it.handler, it.error) is Command.HideSSLError -> hideSSLWarning() is Command.LaunchScreen -> launchScreen(it.screen, it.payload) - is Command.HideExperimentOnboardingDialog -> hideOnboardingDaxDialog(it.experimentCta) + is Command.HideOnboardingDaxDialog -> hideOnboardingDaxDialog(it.onboardingCta) else -> { // NO OP } @@ -2274,8 +2269,7 @@ class BrowserTabFragment : @SuppressLint("SetJavaScriptEnabled") private fun configureWebView() { - viewModel.configureBrowserBackground() - binding.experimentDaxDialogContent.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) + binding.daxDialogOnboardingCtaContent.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) webView = layoutInflater.inflate( R.layout.include_duckduckgo_browser_webview, @@ -2400,11 +2394,7 @@ class BrowserTabFragment : faviconPrompt.show() } - private fun setBrowserBackground(backgroundRes: Int) { - newBrowserTab.browserBackground.setBackgroundResource(backgroundRes) - } - - private fun hideOnboardingDaxDialog(experimentCta: ExperimentOnboardingDaxDialogCta) { + private fun hideOnboardingDaxDialog(experimentCta: OnboardingDaxDialogCta) { experimentCta.hideOnboardingCta(binding) } @@ -2916,7 +2906,6 @@ class BrowserTabFragment : if (newBrowserTab.ctaContainer.isNotEmpty()) { renderer.renderHomeCta() } - renderer.recreateDaxDialogCta() configureQuickAccessGridLayout(quickAccessItems.quickAccessRecyclerView) configureQuickAccessGridLayout(binding.quickAccessSuggestionsRecyclerView) decorator.recreatePopupMenu() @@ -3130,16 +3119,6 @@ class BrowserTabFragment : } } - private fun finishPartialTrackerAnimation() { - animatorHelper.finishPartialTrackerAnimation() - } - - private fun showHideTipsDialog(cta: Cta) { - context?.let { - launchHideTipsDialog(it, cta) - } - } - private fun showBackNavigationHistory(history: ShowBackNavigationHistory) { activity?.let { context -> NavigationHistorySheet( @@ -3176,27 +3155,6 @@ class BrowserTabFragment : } } - private fun launchHideTipsDialog( - context: Context, - cta: Cta, - ) { - TextAlertDialogBuilder(context) - .setTitle(R.string.hideTipsTitle) - .setMessage(getString(R.string.hideTipsText)) - .setPositiveButton(R.string.hideTipsButton) - .setNegativeButton(android.R.string.no) - .addEventListener( - object : TextAlertDialogBuilder.EventListener() { - override fun onPositiveButtonClicked() { - launch { - ctaViewModel.hideTipsForever(cta) - } - } - }, - ) - .show() - } - fun omnibarViews(): List = listOf(omnibar.clearTextButton, omnibar.omnibarTextInput, omnibar.searchIcon) override fun onAnimationFinished() { @@ -3661,7 +3619,6 @@ class BrowserTabFragment : activity?.let { activity -> animatorHelper.startTrackersAnimation( context = activity, - shouldRunPartialAnimation = lastSeenCtaViewState?.cta is DaxTrackersBlockedCta, shieldAnimationView = omnibar.shieldIcon, trackersAnimationView = omnibar.trackersAnimation, omnibarViews = omnibarViews(), @@ -3874,99 +3831,48 @@ class BrowserTabFragment : ) { when (configuration) { is HomePanelCta -> showHomeCta(configuration, favorites) - is DaxBubbleCta -> showDaxCta(configuration) - is ExperimentDaxBubbleOptionsCta -> showDaxExperimentCta(configuration) + is DaxBubbleCta -> showDaxOnboardingBubbleCta(configuration) is BubbleCta -> showBubbleCta(configuration) - is DialogCta -> showDaxDialogCta(configuration) - is ExperimentOnboardingDaxDialogCta -> showExperimentDialogCta(configuration) + is OnboardingDaxDialogCta -> showOnboardingDialogCta(configuration) } newBrowserTab.messageCta.gone() } - fun recreateDaxDialogCta() { - val configuration = lastSeenCtaViewState?.cta - if (configuration is DaxDialogCta) { - activity?.let { activity -> - configuration.createCta(activity, daxListener).apply { - showDialogHidingPrevious(this, DAX_DIALOG_DIALOG_TAG) - } - } - } - } - - private fun showDaxDialogCta(configuration: DialogCta) { - hideHomeCta() - hideDaxCta() - activity?.let { activity -> - configuration.createCta(activity, daxListener).apply { - showDialogIfNotExist(this, DAX_DIALOG_DIALOG_TAG) - } - viewModel.onCtaShown() - } - } - - private val daxListener = object : DaxDialogListener { - override fun onDaxDialogDismiss() { - viewModel.onDaxDialogDismissed() - } - - override fun onDaxDialogHideClick() { - viewModel.onUserHideDaxDialog() - } - - override fun onDaxDialogPrimaryCtaClick() { - viewModel.onUserClickCtaOkButton() - } - - override fun onDaxDialogSecondaryCtaClick() { - viewModel.onUserClickCtaSecondaryButton() - } - } - - private fun showDaxCta(configuration: DaxBubbleCta) { - hideHomeBackground() - hideHomeCta() - configuration.showCta(daxDialogCta.daxCtaContainer) - newBrowserTab.newTabLayout.setOnClickListener { daxDialogCta.dialogTextCta.finishAnimation() } - - viewModel.onCtaShown() - } - - private fun showDaxExperimentCta(configuration: ExperimentDaxBubbleOptionsCta) { + private fun showDaxOnboardingBubbleCta(configuration: DaxBubbleCta) { hideHomeBackground() hideHomeCta() configuration.apply { - showCta(daxDialogIntroExperimentCta.daxCtaContainer) + showCta(daxDialogIntroBubbleCta.daxCtaContainer) setOnOptionClicked { userEnteredQuery(it.link) pixel.fire(it.pixel) } } - newBrowserTab.newTabLayout.setOnClickListener { daxDialogIntroExperimentCta.dialogTextCta.finishAnimation() } + newBrowserTab.newTabLayout.setOnClickListener { daxDialogIntroBubbleCta.dialogTextCta.finishAnimation() } viewModel.onCtaShown() } @SuppressLint("ClickableViewAccessibility") - private fun showExperimentDialogCta(configuration: ExperimentOnboardingDaxDialogCta) { + private fun showOnboardingDialogCta(configuration: OnboardingDaxDialogCta) { hideHomeBackground() hideHomeCta() - val onTypingAnimationFinished = if (configuration is ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta) { - { viewModel.onExperimentDaxTypingAnimationFinished() } + val onTypingAnimationFinished = if (configuration is OnboardingDaxDialogCta.DaxTrackersBlockedCta) { + { viewModel.onOnboardingDaxTypingAnimationFinished() } } else { {} } configuration.showOnboardingCta(binding, { viewModel.onUserClickCtaOkButton() }, onTypingAnimationFinished) - if (configuration is ExperimentOnboardingDaxDialogCta.DaxSiteSuggestionsCta) { + if (configuration is OnboardingDaxDialogCta.DaxSiteSuggestionsCta) { configuration.setOnOptionClicked( - daxDialogExperimentOnboardingCta, + daxDialogOnboardingCta, ) { userEnteredQuery(it.link) pixel.fire(it.pixel) viewModel.onUserClickCtaOkButton() } } - binding.webViewContainer.setOnClickListener { daxDialogIntroExperimentCta.dialogTextCta.finishAnimation() } + binding.webViewContainer.setOnClickListener { daxDialogIntroBubbleCta.dialogTextCta.finishAnimation() } viewModel.onCtaShown() } diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index 637585c274e0..b0c77705e268 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -103,8 +103,8 @@ import com.duckduckgo.app.browser.viewstate.PrivacyShieldViewState import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState import com.duckduckgo.app.browser.webview.SslWarningLayout.Action import com.duckduckgo.app.cta.ui.* -import com.duckduckgo.app.cta.ui.ExperimentDaxBubbleOptionsCta.DaxDialogIntroOption -import com.duckduckgo.app.cta.ui.ExperimentOnboardingDaxDialogCta +import com.duckduckgo.app.cta.ui.DaxBubbleCta.DaxDialogIntroOption +import com.duckduckgo.app.cta.ui.OnboardingDaxDialogCta import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepository @@ -121,8 +121,8 @@ import com.duckduckgo.app.global.model.domainMatchesUrl import com.duckduckgo.app.location.GeoLocationPermissions import com.duckduckgo.app.location.data.LocationPermissionType import com.duckduckgo.app.location.data.LocationPermissionsRepository -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager -import com.duckduckgo.app.onboarding.ui.page.experiment.OnboardingExperimentPixel +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao @@ -254,7 +254,7 @@ class BrowserTabViewModel @Inject constructor( private val privacyProtectionsToggleUsageListener: PrivacyProtectionsToggleUsageListener, private val privacyProtectionsPopupExperimentExternalPixels: PrivacyProtectionsPopupExperimentExternalPixels, private val faviconsFetchingPrompt: FaviconsFetchingPrompt, - private val extendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager, + private val extendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles, private val subscriptions: Subscriptions, private val sslCertificatesFeature: SSLCertificatesFeature, private val bypassedSSLCertificatesRepository: BypassedSSLCertificatesRepository, @@ -719,19 +719,19 @@ class BrowserTabViewModel @Inject constructor( return } - if (currentCtaViewState().cta is ExperimentOnboardingDaxDialogCta) { - onDismissExperimentDaxDialog(currentCtaViewState().cta as ExperimentOnboardingDaxDialogCta) + if (currentCtaViewState().cta is OnboardingDaxDialogCta) { + onDismissOnboardingDaxDialog(currentCtaViewState().cta as OnboardingDaxDialogCta) } when (currentCtaViewState().cta) { - is ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroSearchOptionsCta -> { + is DaxBubbleCta.DaxIntroSearchOptionsCta -> { if (!DaxDialogIntroOption.getSearchOptions().map { it.link }.contains(query)) { pixel.fire(OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_CUSTOM) } } - is ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta, - is ExperimentOnboardingDaxDialogCta.DaxSiteSuggestionsCta, + is DaxBubbleCta.DaxIntroVisitSiteOptionsCta, + is OnboardingDaxDialogCta.DaxSiteSuggestionsCta, -> { if (!DaxDialogIntroOption.getSitesOptions().map { it.link }.contains(query)) { pixel.fire(OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_CUSTOM) @@ -2448,8 +2448,7 @@ class BrowserTabViewModel @Inject constructor( } private fun showOrHideKeyboard(cta: Cta?) { - command.value = - if (cta is DialogCta || cta is HomePanelCta) HideKeyboard else ShowKeyboard + command.value = if (cta is HomePanelCta) HideKeyboard else ShowKeyboard } fun registerDaxBubbleCtaDismissed() { @@ -2466,7 +2465,7 @@ class BrowserTabViewModel @Inject constructor( command.value = when (cta) { is HomePanelCta.Survey -> LaunchSurvey(cta.survey) is HomePanelCta.AddWidgetAuto, is HomePanelCta.AddWidgetInstructions -> LaunchAddWidget - is ExperimentOnboardingDaxDialogCta -> onExperimentCtaOkButtonClicked(cta) + is OnboardingDaxDialogCta -> onOnboardingCtaOkButtonClicked(cta) else -> return } } @@ -2520,19 +2519,6 @@ class BrowserTabViewModel @Inject constructor( } } - fun onUserHideDaxDialog() { - val cta = currentCtaViewState().cta ?: return - command.value = DaxCommand.HideDaxDialog(cta) - } - - fun onDaxDialogDismissed() { - val cta = currentCtaViewState().cta ?: return - if (cta is DaxDialogCta.DaxTrackersBlockedCta) { - command.value = DaxCommand.FinishPartialTrackerAnimation - } - onUserDismissedCta() - } - fun onUserDismissedCta() { val cta = currentCtaViewState().cta ?: return viewModelScope.launch { @@ -3170,70 +3156,62 @@ class BrowserTabViewModel @Inject constructor( } } - fun configureBrowserBackground() { - val backgroundRes: Int = - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) R.drawable.onboarding_experiment_background_bitmap else 0 - viewModelScope.launch { - command.value = SetBrowserBackground(backgroundRes) - } - } - - private fun onExperimentCtaOkButtonClicked(experimentCta: ExperimentOnboardingDaxDialogCta): Command? { + private fun onOnboardingCtaOkButtonClicked(onboardingCta: OnboardingDaxDialogCta): Command? { viewModelScope.launch { - ctaViewModel.onUserDismissedCta(experimentCta) + ctaViewModel.onUserDismissedCta(onboardingCta) } - return when (experimentCta) { - is ExperimentOnboardingDaxDialogCta.DaxSerpCta -> { + return when (onboardingCta) { + is OnboardingDaxDialogCta.DaxSerpCta -> { viewModelScope.launch { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - val cta = withContext(dispatchers.io()) { ctaViewModel.getExperimentSiteSuggestionsDialogCta() } + if (extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled()) { + val cta = withContext(dispatchers.io()) { ctaViewModel.getSiteSuggestionsDialogCta() } ctaViewState.value = currentCtaViewState().copy(cta = cta) if (cta == null) { - command.value = HideExperimentOnboardingDialog(experimentCta) + command.value = HideOnboardingDaxDialog(onboardingCta) } } } null } - is ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta, - is ExperimentOnboardingDaxDialogCta.DaxNoTrackersCta, - is ExperimentOnboardingDaxDialogCta.DaxMainNetworkCta, + is OnboardingDaxDialogCta.DaxTrackersBlockedCta, + is OnboardingDaxDialogCta.DaxNoTrackersCta, + is OnboardingDaxDialogCta.DaxMainNetworkCta, -> { if (currentBrowserViewState().showPrivacyShield.isHighlighted()) { browserViewState.value = currentBrowserViewState().copy(showPrivacyShield = HighlightableButton.Visible(highlighted = false)) } viewModelScope.launch { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - val cta = withContext(dispatchers.io()) { ctaViewModel.getExperimentFireDialogCta() } + if (extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled()) { + val cta = withContext(dispatchers.io()) { ctaViewModel.getFireDialogCta() } ctaViewState.value = currentCtaViewState().copy(cta = cta) if (cta == null) { - command.value = HideExperimentOnboardingDialog(experimentCta) + command.value = HideOnboardingDaxDialog(onboardingCta) } } } null } - else -> HideExperimentOnboardingDialog(experimentCta) + else -> HideOnboardingDaxDialog(onboardingCta) } } - private fun onDismissExperimentDaxDialog(cta: ExperimentOnboardingDaxDialogCta) { - if (cta is ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta) { + private fun onDismissOnboardingDaxDialog(cta: OnboardingDaxDialogCta) { + if (cta is OnboardingDaxDialogCta.DaxTrackersBlockedCta) { browserViewState.value = currentBrowserViewState().copy(showPrivacyShield = HighlightableButton.Visible(highlighted = false)) } onUserDismissedCta() - command.value = HideExperimentOnboardingDialog(cta) + command.value = HideOnboardingDaxDialog(cta) } fun onFireMenuSelected() { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { + if (extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled()) { val cta = currentCtaViewState().cta - if (cta is ExperimentOnboardingDaxDialogCta.DaxFireButtonCta) { + if (cta is OnboardingDaxDialogCta.DaxFireButtonCta) { onUserDismissedCta() - command.value = HideExperimentOnboardingDialog(cta) + command.value = HideOnboardingDaxDialog(cta) } if (currentBrowserViewState().fireButton.isHighlighted()) { viewModelScope.launch { @@ -3244,7 +3222,7 @@ class BrowserTabViewModel @Inject constructor( } fun onPrivacyShieldSelected() { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled() && currentBrowserViewState().showPrivacyShield.isHighlighted()) { + if (extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled() && currentBrowserViewState().showPrivacyShield.isHighlighted()) { browserViewState.value = currentBrowserViewState().copy(showPrivacyShield = HighlightableButton.Visible(highlighted = false)) pixel.fire( pixel = PrivacyDashboardPixels.PRIVACY_DASHBOARD_FIRST_TIME_OPENED, @@ -3257,14 +3235,14 @@ class BrowserTabViewModel @Inject constructor( } } - fun onExperimentDaxTypingAnimationFinished() { + fun onOnboardingDaxTypingAnimationFinished() { browserViewState.value = currentBrowserViewState().copy(showPrivacyShield = HighlightableButton.Visible(highlighted = true)) } override fun onShouldOverride() { val cta = currentCtaViewState().cta - if (cta is ExperimentOnboardingDaxDialogCta) { - onDismissExperimentDaxDialog(cta) + if (cta is OnboardingDaxDialogCta) { + onDismissOnboardingDaxDialog(cta) } } diff --git a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt index d10843665986..42dba93f4e36 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt @@ -34,8 +34,7 @@ import com.duckduckgo.app.browser.history.NavigationHistoryEntry import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials import com.duckduckgo.app.browser.model.BasicAuthenticationRequest import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState -import com.duckduckgo.app.cta.ui.Cta -import com.duckduckgo.app.cta.ui.ExperimentOnboardingDaxDialogCta +import com.duckduckgo.app.cta.ui.OnboardingDaxDialogCta import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.survey.model.Survey import com.duckduckgo.autofill.api.domain.app.LoginCredentials @@ -200,11 +199,6 @@ sealed class Command { class ShowEmailProtectionChooseEmailPrompt(val address: String) : Command() object ShowEmailProtectionInContextSignUpPrompt : Command() - sealed class DaxCommand : Command() { - object FinishPartialTrackerAnimation : DaxCommand() - class HideDaxDialog(val cta: Cta) : DaxCommand() - } - class CancelIncomingAutofillRequest(val url: String) : Command() object LaunchAutofillSettings : Command() class EditWithSelectedQuery(val query: String) : Command() @@ -231,12 +225,11 @@ sealed class Command { data class ScreenLock(val data: JsCallbackData) : Command() object ScreenUnlock : Command() data object ShowFaviconsPrompt : Command() - data class SetBrowserBackground(val backgroundRes: Int) : Command() data class ShowSSLError(val handler: SslErrorHandler, val error: SslErrorResponse) : Command() data object HideSSLError : Command() class LaunchScreen( val screen: String, val payload: String, ) : Command() - data class HideExperimentOnboardingDialog(val experimentCta: ExperimentOnboardingDaxDialogCta) : Command() + data class HideOnboardingDaxDialog(val onboardingCta: OnboardingDaxDialogCta) : Command() } diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt index 5aa5a42b5000..ecc6a375a677 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserLottieTrackersAnimatorHelper.kt @@ -57,9 +57,6 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( private lateinit var cookieViewBackground: View private var cookieCosmeticHide: Boolean = false - private var runPartialAnimation: Boolean = false - private var completePartialAnimation: Boolean = false - private var enqueueCookiesAnimation = false private var isCookiesAnimationRunning = false private var hasCookiesAnimationBeenCanceled = false @@ -69,16 +66,14 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( override fun startTrackersAnimation( context: Context, - shouldRunPartialAnimation: Boolean, shieldAnimationView: LottieAnimationView, trackersAnimationView: LottieAnimationView, omnibarViews: List, entities: List?, ) { if (isCookiesAnimationRunning) return // If cookies animation is running let it finish to avoid weird glitches with the other animations - if (trackersAnimationView.isAnimating || this.runPartialAnimation) return + if (trackersAnimationView.isAnimating) return - this.runPartialAnimation = shouldRunPartialAnimation this.trackersAnimation = trackersAnimationView this.shieldAnimation = shieldAnimationView @@ -103,17 +98,13 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( this.addAnimatorListener( object : AnimatorListener { override fun onAnimationStart(animation: Animator) { - if (completePartialAnimation) return animateOmnibarOut(omnibarViews).start() } override fun onAnimationEnd(animation: Animator) { - if (!runPartialAnimation) { - animateOmnibarIn(omnibarViews).start() - completePartialAnimation = false - tryToStartCookiesAnimation(context, omnibarViews) - listener?.onAnimationFinished() - } + animateOmnibarIn(omnibarViews).start() + tryToStartCookiesAnimation(context, omnibarViews) + listener?.onAnimationFinished() } override fun onAnimationCancel(animation: Animator) { @@ -124,13 +115,8 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( }, ) - if (runPartialAnimation) { - this.setMaxProgress(0.5f) - shieldAnimationView.setMaxProgress(0.5f) - } else { - this.setMaxProgress(1f) - shieldAnimationView.setMaxProgress(1f) - } + this.setMaxProgress(1f) + shieldAnimationView.setMaxProgress(1f) shieldAnimationView.playAnimation() this.playAnimation() } @@ -149,7 +135,7 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( this.cookieView = cookieAnimationView this.cookieCosmeticHide = cookieCosmeticHide - if (this.trackersAnimation?.isAnimating != true && !runPartialAnimation) { + if (this.trackersAnimation?.isAnimating != true) { startCookiesAnimation(context, omnibarViews) } else { enqueueCookiesAnimation = true @@ -172,19 +158,6 @@ class BrowserLottieTrackersAnimatorHelper @Inject constructor( omnibarViews.forEach { it.alpha = 1f } } - override fun finishPartialTrackerAnimation() { - val trackersAnimation = this.trackersAnimation ?: return - val shieldAnimation = this.shieldAnimation ?: return - - runPartialAnimation = false - completePartialAnimation = true - - trackersAnimation.setMinAndMaxProgress(0.5f, 1f) - shieldAnimation.setMinAndMaxProgress(0.5f, 1f) - trackersAnimation.playAnimation() - shieldAnimation.playAnimation() - } - private fun tryToStartCookiesAnimation( context: Context, omnibarViews: List, diff --git a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt index a85f001f5101..74958925e909 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/omnibar/animations/BrowserTrackersAnimatorHelper.kt @@ -30,7 +30,6 @@ interface BrowserTrackersAnimatorHelper { * Then it plays both animations, [shieldAnimationView] and [trackersAnimationView], at the same time. * When the animations starts, views in [omnibarViews] will fade out. When animation finishes, view in [omnibarViews] will fade in. * - * @param shouldRunPartialAnimation indicates if animation should pause, at 50% of progress, until {@link finishPartialTrackerAnimation()} is called. * @param shieldAnimationView holder of the privacy shield animation. * @param trackersAnimationView holder of the trackers animations. * @param omnibarViews are the views that should be hidden while the animation is running @@ -38,7 +37,6 @@ interface BrowserTrackersAnimatorHelper { */ fun startTrackersAnimation( context: Context, - shouldRunPartialAnimation: Boolean, shieldAnimationView: LottieAnimationView, trackersAnimationView: LottieAnimationView, omnibarViews: List, @@ -80,12 +78,6 @@ interface BrowserTrackersAnimatorHelper { * removes [TrackersAnimatorListener] */ fun removeListener() - - /** - * Finishes a partial tracker animation. - * See startTrackersAnimation.shouldRunPartialAnimation for more details. - */ - fun finishPartialTrackerAnimation() } /** diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt index 4daf955aa3e8..2846bbe8cbd8 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt @@ -26,30 +26,33 @@ import android.widget.TextView import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.annotation.VisibleForTesting -import androidx.fragment.app.DialogFragment +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.transition.AutoTransition +import androidx.transition.TransitionManager import com.duckduckgo.app.browser.R +import com.duckduckgo.app.browser.databinding.FragmentBrowserTabBinding +import com.duckduckgo.app.browser.databinding.IncludeOnboardingViewDaxDialogBinding import com.duckduckgo.app.cta.model.CtaId +import com.duckduckgo.app.cta.ui.DaxBubbleCta.DaxDialogIntroOption import com.duckduckgo.app.cta.ui.DaxCta.Companion.MAX_DAYS_ALLOWED import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.global.install.daysInstalled import com.duckduckgo.app.onboarding.store.OnboardingStore +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelValues.DAX_FIRE_DIALOG_CTA import com.duckduckgo.app.trackerdetection.model.Entity -import com.duckduckgo.common.ui.view.DaxDialogListener import com.duckduckgo.common.ui.view.TypeAnimationTextView -import com.duckduckgo.common.ui.view.TypewriterDaxDialog +import com.duckduckgo.common.ui.view.button.DaxButton import com.duckduckgo.common.ui.view.gone import com.duckduckgo.common.ui.view.hide import com.duckduckgo.common.ui.view.show +import com.duckduckgo.common.ui.view.text.DaxTextView import com.duckduckgo.common.utils.baseHost import com.duckduckgo.common.utils.extensions.html -interface DialogCta { - fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment -} - interface ViewCta { fun showCta(view: View) } @@ -75,23 +78,29 @@ interface Cta { fun pixelOkParameters(): Map } -sealed class DaxDialogCta( +interface OnboardingDaxCta { + fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) + + fun hideOnboardingCta( + binding: FragmentBrowserTabBinding, + ) +} + +sealed class OnboardingDaxDialogCta( override val ctaId: CtaId, + @StringRes open val description: Int?, + @StringRes open val buttonText: Int?, override val shownPixel: Pixel.PixelName?, override val okPixel: Pixel.PixelName?, override val cancelPixel: Pixel.PixelName?, override var ctaPixelParam: String, override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, -) : Cta, DialogCta, DaxCta { - - // This is not an empty CTA. We pass empty values because they actual implementation of DaxDialogCta will take care of them - override fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment = - TypewriterDaxDialog.newInstance( - daxText = "", - primaryButtonText = "", - hideButtonText = "", - ) +) : Cta, DaxCta, OnboardingDaxCta { override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) @@ -99,11 +108,42 @@ sealed class DaxDialogCta( override fun pixelShownParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to addCtaToHistory(ctaPixelParam)) + override fun hideOnboardingCta(binding: FragmentBrowserTabBinding) { + binding.includeOnboardingDaxDialog.root.gone() + } + + internal fun setOnboardingDialogView( + daxText: String, + buttonText: String?, + binding: FragmentBrowserTabBinding, + onTypingAnimationFinished: () -> Unit = {}, + ) { + val daxDialog = binding.includeOnboardingDaxDialog + + daxDialog.root.show() + daxDialog.dialogTextCta.text = "" + daxDialog.hiddenTextCta.text = daxText.html(binding.root.context) + buttonText?.let { + daxDialog.primaryCta.show() + daxDialog.primaryCta.alpha = MIN_ALPHA + daxDialog.primaryCta.text = buttonText + } ?: daxDialog.primaryCta.gone() + binding.includeOnboardingDaxDialog.onboardingDialogSuggestionsContent.gone() + binding.includeOnboardingDaxDialog.onboardingDialogContent.show() + daxDialog.root.alpha = MAX_ALPHA + daxDialog.dialogTextCta.startTypingAnimation(daxText, true) { + ViewCompat.animate(daxDialog.primaryCta).alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION + onTypingAnimationFinished.invoke() + } + } + class DaxSerpCta( override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, - ) : DaxDialogCta( + ) : OnboardingDaxDialogCta( CtaId.DAX_DIALOG_SERP, + R.string.onboardingSerpDaxDialogDescription, + R.string.onboardingSerpDaxDialogButton, AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -111,14 +151,18 @@ sealed class DaxDialogCta( onboardingStore, appInstallStore, ) { - override fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment { - val dialog = TypewriterDaxDialog.newInstance( - daxText = context.getString(R.string.daxSerpCtaText), - primaryButtonText = context.getString(R.string.daxDialogPhew), - hideButtonText = context.getString(R.string.daxDialogHideButton), + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + setOnboardingDialogView( + daxText = description?.let { context.getString(it) }.orEmpty(), + buttonText = buttonText?.let { context.getString(it) }, + binding = binding, ) - dialog.setDaxDialogListener(daxDialogListener) - return dialog + binding.includeOnboardingDaxDialog.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } } } @@ -126,9 +170,10 @@ sealed class DaxDialogCta( override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, val trackers: List, - val host: String, - ) : DaxDialogCta( + ) : OnboardingDaxDialogCta( CtaId.DAX_DIALOG_TRACKERS_FOUND, + null, + R.string.onboardingTrackersBlockedDaxDialogButton, AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -136,21 +181,27 @@ sealed class DaxDialogCta( onboardingStore, appInstallStore, ) { - - override fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment { - val dialog = TypewriterDaxDialog.newInstance( - daxText = getDaxText(context), - primaryButtonText = context.getString(R.string.daxDialogHighFive), - toolbarDimmed = false, - hideButtonText = context.getString(R.string.daxDialogHideButton), + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + setOnboardingDialogView( + daxText = getTrackersDescription(context, trackers), + buttonText = buttonText?.let { context.getString(it) }, + binding = binding, + onTypingAnimationFinished = onTypingAnimationFinished, ) - dialog.setDaxDialogListener(daxDialogListener) - return dialog + binding.includeOnboardingDaxDialog.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } } @VisibleForTesting - fun getDaxText(context: Context): String { - val trackers = trackers + fun getTrackersDescription( + context: Context, + trackersEntities: List, + ): String { + val trackers = trackersEntities .map { it.displayName } .distinct() @@ -159,9 +210,9 @@ sealed class DaxDialogCta( val size = trackers.size - trackersFiltered.size val quantityString = if (size == 0) { - context.resources.getQuantityString(R.plurals.daxTrackersBlockedCtaZeroText, trackersFiltered.size) + context.resources.getQuantityString(R.plurals.onboardingTrackersBlockedZeroDialogDescription, trackersFiltered.size) } else { - context.resources.getQuantityString(R.plurals.daxTrackersBlockedCtaText, size, size) + context.resources.getQuantityString(R.plurals.onboardingTrackersBlockedDialogDescription, size, size) } return "$trackersText$quantityString" } @@ -172,8 +223,10 @@ sealed class DaxDialogCta( override val appInstallStore: AppInstallStore, val network: String, private val siteHost: String, - ) : DaxDialogCta( + ) : OnboardingDaxDialogCta( CtaId.DAX_DIALOG_NETWORK, + null, + R.string.daxDialogGotIt, AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -182,18 +235,22 @@ sealed class DaxDialogCta( appInstallStore, ) { - override fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment { - val dialog = TypewriterDaxDialog.newInstance( - daxText = getDaxText(context), - primaryButtonText = context.getString(R.string.daxDialogGotIt), - hideButtonText = context.getString(R.string.daxDialogHideButton), + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + setOnboardingDialogView( + daxText = getTrackersDescription(context), + buttonText = buttonText?.let { context.getString(it) }, + binding = binding, ) - dialog.setDaxDialogListener(daxDialogListener) - return dialog + binding.includeOnboardingDaxDialog.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } } @VisibleForTesting - fun getDaxText(context: Context): String { + fun getTrackersDescription(context: Context): String { return if (isFromSameNetworkDomain()) { context.resources.getString( R.string.daxMainNetworkCtaText, @@ -214,11 +271,13 @@ sealed class DaxDialogCta( private fun isFromSameNetworkDomain(): Boolean = mainTrackerDomains.any { siteHost.contains(it) } } - class DaxNoSerpCta( + class DaxNoTrackersCta( override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, - ) : DaxDialogCta( + ) : OnboardingDaxDialogCta( CtaId.DAX_DIALOG_OTHER, + R.string.daxNonSerpCtaText, + R.string.daxDialogGotIt, AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -226,28 +285,126 @@ sealed class DaxDialogCta( onboardingStore, appInstallStore, ) { - override fun createCta(context: Context, daxDialogListener: DaxDialogListener): DialogFragment { - val dialog = TypewriterDaxDialog.newInstance( - daxText = context.getString(R.string.daxNonSerpCtaText), - primaryButtonText = context.getString(R.string.daxDialogGotIt), - hideButtonText = context.getString(R.string.daxDialogHideButton), + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + setOnboardingDialogView( + daxText = description?.let { context.getString(it) }.orEmpty(), + buttonText = buttonText?.let { context.getString(it) }, + binding = binding, ) - dialog.setDaxDialogListener(daxDialogListener) - return dialog + binding.includeOnboardingDaxDialog.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } + } + } + + class DaxFireButtonCta( + override val onboardingStore: OnboardingStore, + override val appInstallStore: AppInstallStore, + ) : OnboardingDaxDialogCta( + CtaId.DAX_FIRE_BUTTON, + R.string.onboardingFireButtonDaxDialogDescription, + null, + AppPixelName.ONBOARDING_DAX_CTA_SHOWN, + AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, + null, + DAX_FIRE_DIALOG_CTA, + onboardingStore, + appInstallStore, + ) { + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + val daxDialog = binding.includeOnboardingDaxDialog + val daxText = description?.let { context.getString(it) }.orEmpty() + + daxDialog.primaryCta.gone() + daxDialog.dialogTextCta.text = "" + daxDialog.hiddenTextCta.text = daxText.html(binding.root.context) + TransitionManager.beginDelayedTransition(binding.includeOnboardingDaxDialog.cardView, AutoTransition()) + daxDialog.dialogTextCta.startTypingAnimation(daxText, true) + } + } + + class DaxSiteSuggestionsCta( + override val onboardingStore: OnboardingStore, + override val appInstallStore: AppInstallStore, + ) : OnboardingDaxDialogCta( + CtaId.DAX_INTRO_VISIT_SITE, + R.string.onboardingSitesDaxDialogDescription, + null, + AppPixelName.ONBOARDING_DAX_CTA_SHOWN, + AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, + null, + Pixel.PixelValues.DAX_INITIAL_VISIT_SITE_CTA, + onboardingStore, + appInstallStore, + ) { + override fun showOnboardingCta( + binding: FragmentBrowserTabBinding, + onPrimaryCtaClicked: () -> Unit, + onTypingAnimationFinished: () -> Unit, + ) { + val context = binding.root.context + val daxDialog = binding.includeOnboardingDaxDialog + val daxText = description?.let { context.getString(it) }.orEmpty() + + binding.includeOnboardingDaxDialog.onboardingDialogContent.gone() + binding.includeOnboardingDaxDialog.onboardingDialogSuggestionsContent.show() + daxDialog.suggestionsDialogTextCta.text = "" + daxDialog.suggestionsHiddenTextCta.text = daxText.html(context) + TransitionManager.beginDelayedTransition(binding.includeOnboardingDaxDialog.cardView, AutoTransition()) + daxDialog.suggestionsDialogTextCta.startTypingAnimation(daxText, true) { + val optionsViews = listOf( + daxDialog.daxDialogOption1, + daxDialog.daxDialogOption2, + daxDialog.daxDialogOption3, + daxDialog.daxDialogOption4, + ) + + optionsViews.forEachIndexed { index, buttonView -> + val options = DaxDialogIntroOption.getSitesOptions() + options[index].setOptionView(buttonView) + ViewCompat.animate(buttonView).alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION + } + } + } + + fun setOnOptionClicked( + daxDialog: IncludeOnboardingViewDaxDialogBinding, + onOptionClicked: (DaxDialogIntroOption) -> Unit, + ) { + val options = DaxDialogIntroOption.getSitesOptions() + daxDialog.daxDialogOption1.setOnClickListener { onOptionClicked.invoke(options[0]) } + daxDialog.daxDialogOption2.setOnClickListener { onOptionClicked.invoke(options[1]) } + daxDialog.daxDialogOption3.setOnClickListener { onOptionClicked.invoke(options[2]) } + daxDialog.daxDialogOption4.setOnClickListener { onOptionClicked.invoke(options[3]) } } } companion object { - private const val MAX_TRACKERS_SHOWS = 2 + const val SERP = "duckduckgo" - private val mainTrackerDomains = listOf("facebook", "google") val mainTrackerNetworks = listOf("Facebook", "Google") + + private const val MAX_TRACKERS_SHOWS = 2 + private val mainTrackerDomains = listOf("facebook", "google") + private const val DAX_DIALOG_APPEARANCE_ANIMATION = 400L + private const val MAX_ALPHA = 1.0f + private const val MIN_ALPHA = 0.0f } } sealed class DaxBubbleCta( override val ctaId: CtaId, + @StringRes open val title: Int, @StringRes open val description: Int, + open val options: List?, override val shownPixel: Pixel.PixelName?, override val okPixel: Pixel.PixelName?, override val cancelPixel: Pixel.PixelName?, @@ -256,13 +413,55 @@ sealed class DaxBubbleCta( override val appInstallStore: AppInstallStore, ) : Cta, ViewCta, DaxCta { + private var ctaView: View? = null + override fun showCta(view: View) { + ctaView = view + val daxTitle = view.context.getString(title) val daxText = view.context.getString(description) + + if (options.isNullOrEmpty()) { + view.findViewById(R.id.daxDialogOption1).gone() + view.findViewById(R.id.daxDialogOption2).gone() + view.findViewById(R.id.daxDialogOption3).gone() + view.findViewById(R.id.daxDialogOption4).gone() + } else { + options?.let { + val optionsViews = listOf( + view.findViewById(R.id.daxDialogOption1), + view.findViewById(R.id.daxDialogOption2), + view.findViewById(R.id.daxDialogOption3), + view.findViewById(R.id.daxDialogOption4), + ) + optionsViews.forEachIndexed { index, buttonView -> + it[index].setOptionView(buttonView) + ViewCompat.animate(buttonView).alpha(1f).setDuration(500L).startDelay = 2800L + } + } + } view.show() - view.alpha = 1f - view.findViewById(R.id.hiddenTextCta).text = daxText.html(view.context) - view.findViewById(R.id.primaryCta).hide() - view.findViewById(R.id.dialogTextCta).startTypingAnimation(daxText, true) + view.findViewById(R.id.dialogTextCta).text = "" + view.findViewById(R.id.hiddenTextCta).text = daxText.html(view.context) + view.findViewById(R.id.daxBubbleDialogTitle).apply { + alpha = 0f + text = daxTitle.html(view.context) + } + ViewCompat.animate(view).alpha(1f).setDuration(500).setStartDelay(600) + .withEndAction { + ViewCompat.animate(view.findViewById(R.id.daxBubbleDialogTitle)).alpha(1f).setDuration(500) + .withEndAction { + view.findViewById(R.id.dialogTextCta).startTypingAnimation(daxText, true) + } + } + } + + fun setOnOptionClicked(onOptionClicked: (DaxDialogIntroOption) -> Unit) { + options?.let { options -> + ctaView?.findViewById(R.id.daxDialogOption1)?.setOnClickListener { onOptionClicked.invoke(options[0]) } + ctaView?.findViewById(R.id.daxDialogOption2)?.setOnClickListener { onOptionClicked.invoke(options[1]) } + ctaView?.findViewById(R.id.daxDialogOption3)?.setOnClickListener { onOptionClicked.invoke(options[2]) } + ctaView?.findViewById(R.id.daxDialogOption4)?.setOnClickListener { onOptionClicked.invoke(options[3]) } + } } override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) @@ -271,12 +470,14 @@ sealed class DaxBubbleCta( override fun pixelShownParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to addCtaToHistory(ctaPixelParam)) - class DaxIntroCta( + data class DaxIntroSearchOptionsCta( override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, ) : DaxBubbleCta( CtaId.DAX_INTRO, - R.string.daxIntroCtaText, + R.string.onboardingSearchDaxDialogTitle, + R.string.onboardingSearchDaxDialogDescription, + DaxDialogIntroOption.getSearchOptions(), AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -285,12 +486,30 @@ sealed class DaxBubbleCta( appInstallStore, ) - class DaxEndCta( + data class DaxIntroVisitSiteOptionsCta( + override val onboardingStore: OnboardingStore, + override val appInstallStore: AppInstallStore, + ) : DaxBubbleCta( + CtaId.DAX_INTRO_VISIT_SITE, + R.string.onboardingSitesDaxDialogTitle, + R.string.onboardingSitesDaxDialogDescription, + DaxDialogIntroOption.getSitesOptions(), + AppPixelName.ONBOARDING_DAX_CTA_SHOWN, + AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, + null, + Pixel.PixelValues.DAX_INITIAL_VISIT_SITE_CTA, + onboardingStore, + appInstallStore, + ) + + data class DaxEndCta( override val onboardingStore: OnboardingStore, override val appInstallStore: AppInstallStore, ) : DaxBubbleCta( CtaId.DAX_END, - R.string.daxEndCtaText, + R.string.onboardingEndDaxDialogTitle, + R.string.onboardingEndDaxDialogDescription, + null, AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -298,6 +517,78 @@ sealed class DaxBubbleCta( onboardingStore, appInstallStore, ) + + data class DaxDialogIntroOption( + @StringRes val textRes: Int, + @DrawableRes val iconRes: Int, + val link: String, + val pixel: PixelName, + ) { + fun setOptionView(buttonView: DaxButton) { + buttonView.apply { + text = this.context.getString(textRes) + icon = ContextCompat.getDrawable(this.context, iconRes) + } + } + + companion object { + fun getSearchOptions(): List = + listOf( + DaxDialogIntroOption( + R.string.onboardingSearchDaxDialogOption1, + com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, + "how to say duck in spanish", + PixelName.ONBOARDING_SEARCH_SAY_DUCK, + ), + DaxDialogIntroOption( + R.string.onboardingSearchDaxDialogOption2, + com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, + "mighty ducks cast", + PixelName.ONBOARDING_SEARCH_MIGHTY_DUCK, + ), + DaxDialogIntroOption( + R.string.onboardingSearchDaxDialogOption3, + com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, + "local weather", + PixelName.ONBOARDING_SEARCH_WEATHER, + ), + DaxDialogIntroOption( + R.string.onboardingSearchDaxDialogOption4, + com.duckduckgo.mobile.android.R.drawable.ic_wand_16, + "chocolate chip cookie recipes", + PixelName.ONBOARDING_SEARCH_SURPRISE_ME, + ), + ) + + fun getSitesOptions(): List = + listOf( + DaxDialogIntroOption( + R.string.onboardingSitesDaxDialogOption1, + com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, + "espn.com", + PixelName.ONBOARDING_VISIT_SITE_ESPN, + ), + DaxDialogIntroOption( + R.string.onboardingSitesDaxDialogOption2, + com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, + "yahoo.com", + PixelName.ONBOARDING_VISIT_SITE_YAHOO, + ), + DaxDialogIntroOption( + R.string.onboardingSitesDaxDialogOption3, + com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, + "ebay.com", + PixelName.ONBOARDING_VISIT_SITE_EBAY, + ), + DaxDialogIntroOption( + R.string.onboardingSitesDaxDialogOption4, + com.duckduckgo.mobile.android.R.drawable.ic_wand_16, + "britannica.com/animal/duck", + PixelName.ONBOARDING_VISIT_SITE_SURPRISE_ME, + ), + ) + } + } } sealed class BubbleCta( @@ -345,47 +636,6 @@ sealed class BubbleCta( } } -sealed class DaxFireDialogCta( - override val ctaId: CtaId, - @StringRes open val description: Int, - override val shownPixel: Pixel.PixelName?, - override val okPixel: Pixel.PixelName?, - override val cancelPixel: Pixel.PixelName?, - override var ctaPixelParam: String, - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, -) : Cta, ViewCta, DaxCta { - - override fun showCta(view: View) { - val daxText = view.context.getString(description) - view.show() - view.alpha = 1f - view.findViewById(R.id.hiddenTextCta).text = daxText.html(view.context) - view.findViewById(R.id.primaryCta).gone() - view.findViewById(R.id.dialogTextCta).startTypingAnimation(daxText, true) - } - - override fun pixelCancelParameters(): Map = emptyMap() - - override fun pixelOkParameters(): Map = emptyMap() - - override fun pixelShownParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to addCtaToHistory(ctaPixelParam)) - - class TryClearDataCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : DaxFireDialogCta( - ctaId = CtaId.DAX_FIRE_BUTTON, - description = R.string.daxClearDataCtaText, - shownPixel = AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - okPixel = null, - cancelPixel = null, - ctaPixelParam = DAX_FIRE_DIALOG_CTA, - onboardingStore = onboardingStore, - appInstallStore = appInstallStore, - ) -} - sealed class HomePanelCta( override val ctaId: CtaId, @DrawableRes open val image: Int, diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt index 2709fa42b48c..cc3ebf6a88ec 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt @@ -30,8 +30,7 @@ import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.domain import com.duckduckgo.app.global.model.orderedTrackerBlockedEntities import com.duckduckgo.app.onboarding.store.* -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager -import com.duckduckgo.app.pixels.AppPixelName +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.ExtendedOnboardingFeatureToggles import com.duckduckgo.app.privacy.db.UserAllowListRepository import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel @@ -64,7 +63,7 @@ class CtaViewModel @Inject constructor( private val dispatchers: DispatcherProvider, private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector, private val surveyRepository: SurveyRepository, - private val extendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager, + private val extendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles, ) { val surveyLiveData: LiveData = surveyRepository.getScheduledLiveSurvey() @@ -109,12 +108,6 @@ class CtaViewModel @Inject constructor( return wasCleared } - suspend fun hideTipsForever(cta: Cta) { - settingsDataStore.hideTips = true - pixel.fire(AppPixelName.ONBOARDING_DAX_ALL_CTA_HIDDEN, cta.pixelCancelParameters()) - userStageStore.stageCompleted(AppStage.DAX_ONBOARDING) - } - fun onCtaShown(cta: Cta) { cta.shownPixel?.let { val canSendPixel = when (cta) { @@ -129,7 +122,7 @@ class CtaViewModel @Inject constructor( suspend fun registerDaxBubbleCtaDismissed(cta: Cta) { withContext(dispatchers.io()) { - if (cta is DaxBubbleCta || cta is ExperimentDaxBubbleOptionsCta) { + if (cta is DaxBubbleCta) { dismissedCtaDao.insert(DismissedCta(cta.ctaId)) completeStageIfDaxOnboardingCompleted() } @@ -190,51 +183,33 @@ class CtaViewModel @Inject constructor( } } - suspend fun getFireDialogCta(): DaxFireDialogCta? { - if (!daxOnboardingActive()) return null - - return withContext(dispatchers.io()) { - if (hideTips() || daxDialogFireEducationShown() || extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - return@withContext null - } - return@withContext DaxFireDialogCta.TryClearDataCta(onboardingStore, appInstallStore) - } - } - - suspend fun getExperimentFireDialogCta(): ExperimentOnboardingDaxDialogCta.DaxFireButtonCta? { + suspend fun getFireDialogCta(): OnboardingDaxDialogCta.DaxFireButtonCta? { if (!daxOnboardingActive() || daxDialogFireEducationShown()) return null return withContext(dispatchers.io()) { - return@withContext ExperimentOnboardingDaxDialogCta.DaxFireButtonCta(onboardingStore, appInstallStore) + return@withContext OnboardingDaxDialogCta.DaxFireButtonCta(onboardingStore, appInstallStore) } } - suspend fun getExperimentSiteSuggestionsDialogCta(): ExperimentOnboardingDaxDialogCta.DaxSiteSuggestionsCta? { + suspend fun getSiteSuggestionsDialogCta(): OnboardingDaxDialogCta.DaxSiteSuggestionsCta? { if (!daxOnboardingActive() || !canShowDaxIntroVisitSiteCta()) return null return withContext(dispatchers.io()) { - return@withContext ExperimentOnboardingDaxDialogCta.DaxSiteSuggestionsCta(onboardingStore, appInstallStore) + return@withContext OnboardingDaxDialogCta.DaxSiteSuggestionsCta(onboardingStore, appInstallStore) } } private suspend fun getHomeCta(): Cta? { + val onboardingEnabled = extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled() return when { - canShowDaxIntroCta() -> { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroSearchOptionsCta(onboardingStore, appInstallStore) - } else { - DaxBubbleCta.DaxIntroCta(onboardingStore, appInstallStore) - } + canShowDaxIntroCta() && onboardingEnabled -> { + DaxBubbleCta.DaxIntroSearchOptionsCta(onboardingStore, appInstallStore) } - canShowDaxIntroVisitSiteCta() && extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled() -> { - ExperimentDaxBubbleOptionsCta.ExperimentDaxIntroVisitSiteOptionsCta(onboardingStore, appInstallStore) + canShowDaxIntroVisitSiteCta() && onboardingEnabled -> { + DaxBubbleCta.DaxIntroVisitSiteOptionsCta(onboardingStore, appInstallStore) } - canShowDaxCtaEndOfJourney() -> { - if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentDaxBubbleOptionsCta.ExperimentDaxEndCta(onboardingStore, appInstallStore) - } else { - DaxBubbleCta.DaxEndCta(onboardingStore, appInstallStore) - } + canShowDaxCtaEndOfJourney() && onboardingEnabled -> { + DaxBubbleCta.DaxEndCta(onboardingStore, appInstallStore) } canShowWidgetCta() -> { @@ -297,46 +272,33 @@ class CtaViewModel @Inject constructor( if (!canShowDaxDialogCta()) return null - // Trackers blocked - if (!daxDialogTrackersFoundShown() && !isSerpUrl(it.url) && it.orderedTrackerBlockedEntities().isNotEmpty()) { - return if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentOnboardingDaxDialogCta.DaxTrackersBlockedCta( + if (extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled()) { + // Trackers blocked + if (!daxDialogTrackersFoundShown() && !isSerpUrl(it.url) && it.orderedTrackerBlockedEntities().isNotEmpty()) { + return OnboardingDaxDialogCta.DaxTrackersBlockedCta( onboardingStore, appInstallStore, it.orderedTrackerBlockedEntities(), ) - } else { - DaxDialogCta.DaxTrackersBlockedCta(onboardingStore, appInstallStore, it.orderedTrackerBlockedEntities(), host) } - } - // Is major network - if (it.entity != null) { - it.entity?.let { entity -> - if (!daxDialogNetworkShown() && DaxDialogCta.mainTrackerNetworks.contains(entity.displayName)) { - return if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentOnboardingDaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host) - } else { - DaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host) + // Is major network + if (it.entity != null) { + it.entity?.let { entity -> + if (!daxDialogNetworkShown() && OnboardingDaxDialogCta.mainTrackerNetworks.contains(entity.displayName)) { + return OnboardingDaxDialogCta.DaxMainNetworkCta(onboardingStore, appInstallStore, entity.displayName, host) } } } - } - // SERP - if (isSerpUrl(it.url) && !daxDialogSerpShown()) { - return if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentOnboardingDaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore) - } else { - DaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore) + // SERP + if (isSerpUrl(it.url) && !daxDialogSerpShown()) { + return OnboardingDaxDialogCta.DaxSerpCta(onboardingStore, appInstallStore) } - } - if (!isSerpUrl(it.url) && !daxDialogOtherShown() && !daxDialogTrackersFoundShown() && !daxDialogNetworkShown()) { - return if (extendedOnboardingExperimentVariantManager.isAestheticUpdatesEnabled()) { - ExperimentOnboardingDaxDialogCta.DaxNoTrackersCta(onboardingStore, appInstallStore) - } else { - DaxDialogCta.DaxNoSerpCta(onboardingStore, appInstallStore) + // No trackers blocked + if (!isSerpUrl(it.url) && !daxDialogOtherShown() && !daxDialogTrackersFoundShown() && !daxDialogNetworkShown()) { + return OnboardingDaxDialogCta.DaxNoTrackersCta(onboardingStore, appInstallStore) } } return null @@ -345,8 +307,6 @@ class CtaViewModel @Inject constructor( private fun daxDialogIntroShown(): Boolean = dismissedCtaDao.exists(CtaId.DAX_INTRO) - private fun daxDialogIntroVisitSiteShown(): Boolean = dismissedCtaDao.exists(CtaId.DAX_INTRO_VISIT_SITE) - private fun daxDialogEndShown(): Boolean = dismissedCtaDao.exists(CtaId.DAX_END) private fun daxDialogSerpShown(): Boolean = dismissedCtaDao.exists(CtaId.DAX_DIALOG_SERP) @@ -361,7 +321,7 @@ class CtaViewModel @Inject constructor( private fun pulseFireButtonShown(): Boolean = dismissedCtaDao.exists(CtaId.DAX_FIRE_BUTTON_PULSE) - private fun isSerpUrl(url: String): Boolean = url.contains(DaxDialogCta.SERP) + private fun isSerpUrl(url: String): Boolean = url.contains(OnboardingDaxDialogCta.SERP) private suspend fun daxOnboardingActive(): Boolean = userStageStore.daxOnboardingActive() @@ -411,6 +371,7 @@ class CtaViewModel @Inject constructor( } } + @Deprecated("New users won't have this option available since extended onboarding") private fun hideTips() = settingsDataStore.hideTips companion object { diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/ExperimentCta.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/ExperimentCta.kt deleted file mode 100644 index 5873f8e508c6..000000000000 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/ExperimentCta.kt +++ /dev/null @@ -1,555 +0,0 @@ -/* - * Copyright (c) 2024 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.app.cta.ui - -import android.content.Context -import android.net.Uri -import android.view.View -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import androidx.annotation.VisibleForTesting -import androidx.core.content.ContextCompat -import androidx.core.view.ViewCompat -import androidx.transition.AutoTransition -import androidx.transition.TransitionManager -import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.databinding.FragmentBrowserTabBinding -import com.duckduckgo.app.browser.databinding.IncludeExperimentViewDaxDialogBinding -import com.duckduckgo.app.cta.model.CtaId -import com.duckduckgo.app.cta.ui.ExperimentDaxBubbleOptionsCta.DaxDialogIntroOption -import com.duckduckgo.app.global.install.AppInstallStore -import com.duckduckgo.app.onboarding.store.OnboardingStore -import com.duckduckgo.app.onboarding.ui.page.experiment.OnboardingExperimentPixel.PixelName -import com.duckduckgo.app.pixels.AppPixelName -import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.trackerdetection.model.Entity -import com.duckduckgo.common.ui.view.TypeAnimationTextView -import com.duckduckgo.common.ui.view.button.DaxButton -import com.duckduckgo.common.ui.view.gone -import com.duckduckgo.common.ui.view.show -import com.duckduckgo.common.ui.view.text.DaxTextView -import com.duckduckgo.common.utils.baseHost -import com.duckduckgo.common.utils.extensions.html -import com.duckduckgo.mobile.android.R as commonR - -sealed class ExperimentDaxBubbleOptionsCta( - override val ctaId: CtaId, - @StringRes open val title: Int, - @StringRes open val description: Int, - open val options: List?, - override val shownPixel: Pixel.PixelName?, - override val okPixel: Pixel.PixelName?, - override val cancelPixel: Pixel.PixelName?, - override var ctaPixelParam: String, - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, -) : Cta, ViewCta, DaxCta { - - private var ctaView: View? = null - - override fun showCta(view: View) { - ctaView = view - val daxTitle = view.context.getString(title) - val daxText = view.context.getString(description) - - if (options.isNullOrEmpty()) { - view.findViewById(R.id.daxDialogOption1).gone() - view.findViewById(R.id.daxDialogOption2).gone() - view.findViewById(R.id.daxDialogOption3).gone() - view.findViewById(R.id.daxDialogOption4).gone() - } else { - options?.let { - val optionsViews = listOf( - view.findViewById(R.id.daxDialogOption1), - view.findViewById(R.id.daxDialogOption2), - view.findViewById(R.id.daxDialogOption3), - view.findViewById(R.id.daxDialogOption4), - ) - optionsViews.forEachIndexed { index, buttonView -> - it[index].setOptionView(buttonView) - ViewCompat.animate(buttonView).alpha(1f).setDuration(500L).startDelay = 2800L - } - } - } - view.show() - view.findViewById(R.id.dialogTextCta).text = "" - view.findViewById(R.id.hiddenTextCta).text = daxText.html(view.context) - view.findViewById(R.id.experimentDialogTitle).apply { - alpha = 0f - text = daxTitle.html(view.context) - } - ViewCompat.animate(view).alpha(1f).setDuration(500).setStartDelay(600) - .withEndAction { - ViewCompat.animate(view.findViewById(R.id.experimentDialogTitle)).alpha(1f).setDuration(500) - .withEndAction { - view.findViewById(R.id.dialogTextCta).startTypingAnimation(daxText, true) - } - } - } - - fun setOnOptionClicked(onOptionClicked: (DaxDialogIntroOption) -> Unit) { - options?.let { options -> - ctaView?.findViewById(R.id.daxDialogOption1)?.setOnClickListener { onOptionClicked.invoke(options[0]) } - ctaView?.findViewById(R.id.daxDialogOption2)?.setOnClickListener { onOptionClicked.invoke(options[1]) } - ctaView?.findViewById(R.id.daxDialogOption3)?.setOnClickListener { onOptionClicked.invoke(options[2]) } - ctaView?.findViewById(R.id.daxDialogOption4)?.setOnClickListener { onOptionClicked.invoke(options[3]) } - } - } - - override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) - - override fun pixelOkParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) - - override fun pixelShownParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to addCtaToHistory(ctaPixelParam)) - - data class ExperimentDaxIntroSearchOptionsCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentDaxBubbleOptionsCta( - CtaId.DAX_INTRO, - R.string.onboardingSearchDaxDialogTitle, - R.string.onboardingSearchDaxDialogDescription, - DaxDialogIntroOption.getSearchOptions(), - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_INITIAL_CTA, - onboardingStore, - appInstallStore, - ) - - data class ExperimentDaxIntroVisitSiteOptionsCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentDaxBubbleOptionsCta( - CtaId.DAX_INTRO_VISIT_SITE, - R.string.onboardingSitesDaxDialogTitle, - R.string.onboardingSitesDaxDialogDescription, - DaxDialogIntroOption.getSitesOptions(), - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_INITIAL_VISIT_SITE_CTA, - onboardingStore, - appInstallStore, - ) - - data class ExperimentDaxEndCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentDaxBubbleOptionsCta( - CtaId.DAX_END, - R.string.onboardingEndDaxDialogTitle, - R.string.onboardingEndDaxDialogDescription, - null, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_END_CTA, - onboardingStore, - appInstallStore, - ) - - data class DaxDialogIntroOption( - @StringRes val textRes: Int, - @DrawableRes val iconRes: Int, - val link: String, - val pixel: PixelName, - ) { - fun setOptionView(buttonView: DaxButton) { - buttonView.apply { - text = this.context.getString(textRes) - icon = ContextCompat.getDrawable(this.context, iconRes) - } - } - - companion object { - fun getSearchOptions(): List = - listOf( - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption1, - commonR.drawable.ic_find_search_16, - "how to say duck in spanish", - PixelName.ONBOARDING_SEARCH_SAY_DUCK, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption2, - commonR.drawable.ic_find_search_16, - "mighty ducks cast", - PixelName.ONBOARDING_SEARCH_MIGHTY_DUCK, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption3, - commonR.drawable.ic_find_search_16, - "local weather", - PixelName.ONBOARDING_SEARCH_WEATHER, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption4, - commonR.drawable.ic_wand_16, - "chocolate chip cookie recipes", - PixelName.ONBOARDING_SEARCH_SURPRISE_ME, - ), - ) - - fun getSitesOptions(): List = - listOf( - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption1, - commonR.drawable.ic_globe_gray_16dp, - "espn.com", - PixelName.ONBOARDING_VISIT_SITE_ESPN, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption2, - commonR.drawable.ic_globe_gray_16dp, - "yahoo.com", - PixelName.ONBOARDING_VISIT_SITE_YAHOO, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption3, - commonR.drawable.ic_globe_gray_16dp, - "ebay.com", - PixelName.ONBOARDING_VISIT_SITE_EBAY, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption4, - commonR.drawable.ic_wand_16, - "britannica.com/animal/duck", - PixelName.ONBOARDING_VISIT_SITE_SURPRISE_ME, - ), - ) - } - } -} - -interface ExperimentDaxCta { - fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) - - fun hideOnboardingCta( - binding: FragmentBrowserTabBinding, - ) -} - -sealed class ExperimentOnboardingDaxDialogCta( - override val ctaId: CtaId, - @StringRes open val description: Int?, - @StringRes open val buttonText: Int?, - override val shownPixel: Pixel.PixelName?, - override val okPixel: Pixel.PixelName?, - override val cancelPixel: Pixel.PixelName?, - override var ctaPixelParam: String, - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, -) : Cta, ExperimentDaxCta, DaxCta { - - override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) - - override fun pixelOkParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) - - override fun pixelShownParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to addCtaToHistory(ctaPixelParam)) - - override fun hideOnboardingCta(binding: FragmentBrowserTabBinding) { - binding.includeOnboardingDaxDialogExperiment.root.gone() - } - - internal fun setOnboardingDialogView( - daxText: String, - buttonText: String?, - binding: FragmentBrowserTabBinding, - onTypingAnimationFinished: () -> Unit = {}, - ) { - val daxDialog = binding.includeOnboardingDaxDialogExperiment - - daxDialog.root.show() - daxDialog.dialogTextCta.text = "" - daxDialog.hiddenTextCta.text = daxText.html(binding.root.context) - buttonText?.let { - daxDialog.primaryCta.show() - daxDialog.primaryCta.alpha = MIN_ALPHA - daxDialog.primaryCta.text = buttonText - } ?: daxDialog.primaryCta.gone() - binding.includeOnboardingDaxDialogExperiment.onboardingDialogSuggestionsContent.gone() - binding.includeOnboardingDaxDialogExperiment.onboardingDialogContent.show() - daxDialog.root.alpha = MAX_ALPHA - daxDialog.dialogTextCta.startTypingAnimation(daxText, true) { - ViewCompat.animate(daxDialog.primaryCta).alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION - onTypingAnimationFinished.invoke() - } - } - - class DaxSerpCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_DIALOG_SERP, - R.string.onboardingSerpDaxDialogDescription, - R.string.onboardingSerpDaxDialogButton, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_SERP_CTA, - onboardingStore, - appInstallStore, - ) { - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - setOnboardingDialogView( - daxText = description?.let { context.getString(it) }.orEmpty(), - buttonText = buttonText?.let { context.getString(it) }, - binding = binding, - ) - binding.includeOnboardingDaxDialogExperiment.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } - } - } - - class DaxTrackersBlockedCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - val trackers: List, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_DIALOG_TRACKERS_FOUND, - null, - R.string.onboardingTrackersBlockedDaxDialogButton, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_TRACKERS_BLOCKED_CTA, - onboardingStore, - appInstallStore, - ) { - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - setOnboardingDialogView( - daxText = getTrackersDescription(context, trackers), - buttonText = buttonText?.let { context.getString(it) }, - binding = binding, - onTypingAnimationFinished = onTypingAnimationFinished, - ) - binding.includeOnboardingDaxDialogExperiment.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } - } - - private fun getTrackersDescription( - context: Context, - trackersEntities: List, - ): String { - val trackers = trackersEntities - .map { it.displayName } - .distinct() - - val trackersFiltered = trackers.take(MAX_TRACKERS_SHOWS) - val trackersText = trackersFiltered.joinToString(", ") - val size = trackers.size - trackersFiltered.size - val quantityString = - if (size == 0) { - context.resources.getQuantityString(R.plurals.onboardingTrackersBlockedZeroDialogDescription, trackersFiltered.size) - } else { - context.resources.getQuantityString(R.plurals.onboardingTrackersBlockedDialogDescription, size, size) - } - return "$trackersText$quantityString" - } - } - - class DaxMainNetworkCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - val network: String, - private val siteHost: String, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_DIALOG_NETWORK, - null, - R.string.daxDialogGotIt, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_NETWORK_CTA_1, - onboardingStore, - appInstallStore, - ) { - - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - setOnboardingDialogView( - daxText = getTrackersDescription(context), - buttonText = buttonText?.let { context.getString(it) }, - binding = binding, - ) - binding.includeOnboardingDaxDialogExperiment.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } - } - - @VisibleForTesting - fun getTrackersDescription(context: Context): String { - return if (isFromSameNetworkDomain()) { - context.resources.getString( - R.string.daxMainNetworkCtaText, - network, - Uri.parse(siteHost).baseHost?.removePrefix("m."), - network, - ) - } else { - context.resources.getString( - R.string.daxMainNetworkOwnedCtaText, - network, - Uri.parse(siteHost).baseHost?.removePrefix("m."), - network, - ) - } - } - - private fun isFromSameNetworkDomain(): Boolean = mainTrackerDomains.any { siteHost.contains(it) } - } - - class DaxNoTrackersCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_DIALOG_OTHER, - R.string.daxNonSerpCtaText, - R.string.daxDialogGotIt, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_NO_TRACKERS_CTA, - onboardingStore, - appInstallStore, - ) { - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - setOnboardingDialogView( - daxText = description?.let { context.getString(it) }.orEmpty(), - buttonText = buttonText?.let { context.getString(it) }, - binding = binding, - ) - binding.includeOnboardingDaxDialogExperiment.primaryCta.setOnClickListener { onPrimaryCtaClicked.invoke() } - } - } - - class DaxFireButtonCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_FIRE_BUTTON, - R.string.onboardingFireButtonDaxDialogDescription, - null, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_FIRE_DIALOG_CTA, - onboardingStore, - appInstallStore, - ) { - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - val daxDialog = binding.includeOnboardingDaxDialogExperiment - val daxText = description?.let { context.getString(it) }.orEmpty() - - daxDialog.primaryCta.gone() - daxDialog.dialogTextCta.text = "" - daxDialog.hiddenTextCta.text = daxText.html(binding.root.context) - TransitionManager.beginDelayedTransition(binding.includeOnboardingDaxDialogExperiment.cardView, AutoTransition()) - daxDialog.dialogTextCta.startTypingAnimation(daxText, true) - } - } - - class DaxSiteSuggestionsCta( - override val onboardingStore: OnboardingStore, - override val appInstallStore: AppInstallStore, - ) : ExperimentOnboardingDaxDialogCta( - CtaId.DAX_INTRO_VISIT_SITE, - R.string.onboardingSitesDaxDialogDescription, - null, - AppPixelName.ONBOARDING_DAX_CTA_SHOWN, - AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, - null, - Pixel.PixelValues.DAX_INITIAL_VISIT_SITE_CTA, - onboardingStore, - appInstallStore, - ) { - override fun showOnboardingCta( - binding: FragmentBrowserTabBinding, - onPrimaryCtaClicked: () -> Unit, - onTypingAnimationFinished: () -> Unit, - ) { - val context = binding.root.context - val daxDialog = binding.includeOnboardingDaxDialogExperiment - val daxText = description?.let { context.getString(it) }.orEmpty() - - binding.includeOnboardingDaxDialogExperiment.onboardingDialogContent.gone() - binding.includeOnboardingDaxDialogExperiment.onboardingDialogSuggestionsContent.show() - daxDialog.suggestionsDialogTextCta.text = "" - daxDialog.suggestionsHiddenTextCta.text = daxText.html(context) - TransitionManager.beginDelayedTransition(binding.includeOnboardingDaxDialogExperiment.cardView, AutoTransition()) - daxDialog.suggestionsDialogTextCta.startTypingAnimation(daxText, true) { - val optionsViews = listOf( - daxDialog.daxDialogOption1, - daxDialog.daxDialogOption2, - daxDialog.daxDialogOption3, - daxDialog.daxDialogOption4, - ) - - optionsViews.forEachIndexed { index, buttonView -> - val options = DaxDialogIntroOption.getSitesOptions() - options[index].setOptionView(buttonView) - ViewCompat.animate(buttonView).alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION - } - } - } - - fun setOnOptionClicked( - daxDialog: IncludeExperimentViewDaxDialogBinding, - onOptionClicked: (DaxDialogIntroOption) -> Unit, - ) { - val options = DaxDialogIntroOption.getSitesOptions() - daxDialog.daxDialogOption1.setOnClickListener { onOptionClicked.invoke(options[0]) } - daxDialog.daxDialogOption2.setOnClickListener { onOptionClicked.invoke(options[1]) } - daxDialog.daxDialogOption3.setOnClickListener { onOptionClicked.invoke(options[2]) } - daxDialog.daxDialogOption4.setOnClickListener { onOptionClicked.invoke(options[3]) } - } - } - - companion object { - private const val MAX_TRACKERS_SHOWS = 2 - private val mainTrackerDomains = listOf("facebook", "google") - private const val DAX_DIALOG_APPEARANCE_ANIMATION = 400L - private const val MAX_ALPHA = 1.0f - private const val MIN_ALPHA = 0.0f - } -} diff --git a/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt b/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt index f77e2f8eedb9..37e46316c085 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt @@ -24,7 +24,6 @@ import com.duckduckgo.app.browser.rating.di.RatingModule import com.duckduckgo.app.email.di.EmailModule import com.duckduckgo.app.global.DuckDuckGoApplication import com.duckduckgo.app.onboarding.di.OnboardingModule -import com.duckduckgo.app.onboarding.di.WelcomePageModule import com.duckduckgo.app.surrogates.di.ResourceSurrogateModule import com.duckduckgo.app.usage.di.AppUsageModule import com.duckduckgo.di.scopes.AppScope @@ -66,7 +65,6 @@ import retrofit2.Retrofit FileModule::class, CoroutinesModule::class, CertificateTrustedStoreModule::class, - WelcomePageModule::class, FormatterModule::class, EmailModule::class, ], diff --git a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt index bc6ed0a91b6e..32fd3d06b949 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt @@ -25,14 +25,8 @@ import android.provider.Settings import android.provider.Settings.Global.ANIMATOR_DURATION_SCALE import android.view.LayoutInflater import androidx.core.content.ContextCompat -import androidx.core.view.doOnDetach -import androidx.core.view.isVisible -import androidx.lifecycle.lifecycleScope import com.airbnb.lottie.RenderMode -import com.duckduckgo.app.browser.databinding.IncludeDaxDialogCtaBinding import com.duckduckgo.app.browser.databinding.SheetFireClearDataBinding -import com.duckduckgo.app.cta.ui.CtaViewModel -import com.duckduckgo.app.cta.ui.DaxFireDialogCta import com.duckduckgo.app.global.events.db.UserEventKey import com.duckduckgo.app.global.events.db.UserEventsStore import com.duckduckgo.app.global.view.FireDialog.FireDialogClearAllEvent.AnimationFinished @@ -58,7 +52,6 @@ private const val ANIMATION_SPEED_INCREMENT = 0.15f @SuppressLint("NoBottomSheetDialog") class FireDialog( context: Context, - private val ctaViewModel: CtaViewModel, private val clearPersonalDataAction: ClearDataAction, private val pixel: Pixel, private val settingsDataStore: SettingsDataStore, @@ -68,11 +61,8 @@ class FireDialog( ) : BottomSheetDialog(context, com.duckduckgo.mobile.android.R.style.Widget_DuckDuckGo_FireDialog) { private lateinit var binding: SheetFireClearDataBinding - private lateinit var fireCtaBinding: IncludeDaxDialogCtaBinding var clearStarted: (() -> Unit) = {} - val ctaVisible: Boolean - get() = if (this::fireCtaBinding.isInitialized) fireCtaBinding.daxCtaContainer.isVisible else false private val accelerateAnimatorUpdateListener = object : ValueAnimator.AnimatorUpdateListener { override fun onAnimationUpdate(animation: ValueAnimator) { @@ -88,20 +78,12 @@ class FireDialog( init { val inflater = LayoutInflater.from(context) binding = SheetFireClearDataBinding.inflate(inflater) - binding.fireCtaViewStub.setOnInflateListener { _, inflated -> - fireCtaBinding = IncludeDaxDialogCtaBinding.bind(inflated) - } setContentView(binding.root) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - lifecycleScope.launch { - ctaViewModel.getFireDialogCta()?.let { - configureFireDialogCta(it) - } - } binding.clearAllOption.setOnClickListener { onClearOptionClicked() } @@ -126,22 +108,8 @@ class FireDialog( binding.fireAnimationView.enableMergePathsForKitKatAndAbove(true) } - private fun configureFireDialogCta(cta: DaxFireDialogCta) { - binding.fireCtaViewStub.inflate() - cta.showCta(fireCtaBinding.daxCtaContainer) - ctaViewModel.onCtaShown(cta) - onClearDataOptionsDismissed = { - appCoroutineScope.launch(dispatcherProvider.io()) { - ctaViewModel.onUserDismissedCta(cta) - } - } - fireCtaBinding.daxCtaContainer.doOnDetach { - onClearDataOptionsDismissed() - } - } - private fun onClearOptionClicked() { - pixel.enqueueFire(if (ctaVisible) FIRE_DIALOG_PROMOTED_CLEAR_PRESSED else FIRE_DIALOG_CLEAR_PRESSED) + pixel.enqueueFire(FIRE_DIALOG_CLEAR_PRESSED) pixel.enqueueFire( pixel = FIRE_DIALOG_ANIMATION, parameters = mapOf(FIRE_ANIMATION to settingsDataStore.selectedFireAnimation.getPixelValue()), diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt index d31b776ec9e1..6d621d25b639 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchBridgeActivity.kt @@ -49,16 +49,17 @@ class LaunchBridgeActivity : DuckDuckGoActivity() { private fun processCommand(it: LaunchViewModel.Command) { when (it) { is LaunchViewModel.Command.Onboarding -> { - showOnboarding(it.forceLightTheme) + showOnboarding() } + is LaunchViewModel.Command.Home -> { showHome() } } } - private fun showOnboarding(forceLightTheme: Boolean) { - startActivity(OnboardingActivity.intent(this, forceLightTheme)) + private fun showOnboarding() { + startActivity(OnboardingActivity.intent(this)) finish() } diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt index 5f09db926eda..2b95f7680c6f 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt @@ -21,7 +21,6 @@ import com.duckduckgo.anvil.annotations.ContributesViewModel import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.store.isNewUser -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.referral.AppInstallationReferrerStateListener.Companion.MAX_REFERRER_WAIT_TIME_MS import com.duckduckgo.di.scopes.ActivityScope @@ -33,14 +32,13 @@ import timber.log.Timber class LaunchViewModel @Inject constructor( private val userStageStore: UserStageStore, private val appReferrerStateListener: AppInstallationReferrerStateListener, - private val extendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager, ) : ViewModel() { val command: SingleLiveEvent = SingleLiveEvent() sealed class Command { - data class Onboarding(val forceLightTheme: Boolean = true) : Command() + data object Onboarding : Command() data class Home(val replaceExistingSearch: Boolean = false) : Command() } @@ -48,8 +46,7 @@ class LaunchViewModel @Inject constructor( waitForReferrerData() if (userStageStore.isNewUser()) { - extendedOnboardingExperimentVariantManager.setExperimentVariants() - command.value = Command.Onboarding(forceLightTheme = !extendedOnboardingExperimentVariantManager.isComparisonChartEnabled()) + command.value = Command.Onboarding } else { command.value = Command.Home() } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/di/OnboardingModule.kt b/app/src/main/java/com/duckduckgo/app/onboarding/di/OnboardingModule.kt index e94eb09d107b..562497875641 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/di/OnboardingModule.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/di/OnboardingModule.kt @@ -18,11 +18,13 @@ package com.duckduckgo.app.onboarding.di import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector import com.duckduckgo.app.global.DefaultRoleBrowserDialog +import com.duckduckgo.app.global.RealDefaultRoleBrowserDialog +import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.onboarding.ui.OnboardingFragmentPageBuilder import com.duckduckgo.app.onboarding.ui.OnboardingPageBuilder import com.duckduckgo.app.onboarding.ui.OnboardingPageManager import com.duckduckgo.app.onboarding.ui.OnboardingPageManagerWithTrackerBlocking -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager +import com.duckduckgo.appbuildconfig.api.AppBuildConfig import com.duckduckgo.di.scopes.AppScope import dagger.Module import dagger.Provides @@ -36,13 +38,11 @@ class OnboardingModule { defaultRoleBrowserDialog: DefaultRoleBrowserDialog, onboardingPageBuilder: OnboardingPageBuilder, defaultBrowserDetector: DefaultBrowserDetector, - extendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager, ): OnboardingPageManager { return OnboardingPageManagerWithTrackerBlocking( defaultRoleBrowserDialog, onboardingPageBuilder, defaultBrowserDetector, - extendedOnboardingExperimentVariantManager, ) } @@ -51,4 +51,10 @@ class OnboardingModule { fun onboardingPageBuilder(): OnboardingPageBuilder { return OnboardingFragmentPageBuilder() } + + @Provides + fun defaultRoleBrowserDialog( + appInstallStore: AppInstallStore, + appBuildConfig: AppBuildConfig, + ): DefaultRoleBrowserDialog = RealDefaultRoleBrowserDialog(appInstallStore, appBuildConfig) } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/di/WelcomePageModule.kt b/app/src/main/java/com/duckduckgo/app/onboarding/di/WelcomePageModule.kt deleted file mode 100644 index b40c2e24c970..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/di/WelcomePageModule.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2018 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.app.onboarding.di - -import android.content.Context -import com.duckduckgo.app.global.DefaultRoleBrowserDialog -import com.duckduckgo.app.global.RealDefaultRoleBrowserDialog -import com.duckduckgo.app.global.install.AppInstallStore -import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModelFactory -import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.appbuildconfig.api.AppBuildConfig -import dagger.Module -import dagger.Provides - -@Module -class WelcomePageModule { - - @Provides - fun welcomePageViewModelFactory( - appInstallStore: AppInstallStore, - context: Context, - pixel: Pixel, - defaultRoleBrowserDialog: DefaultRoleBrowserDialog, - ) = WelcomePageViewModelFactory(appInstallStore, context, pixel, defaultRoleBrowserDialog) - - @Provides - fun defaultRoleBrowserDialog( - appInstallStore: AppInstallStore, - appBuildConfig: AppBuildConfig, - ): DefaultRoleBrowserDialog = RealDefaultRoleBrowserDialog(appInstallStore, appBuildConfig) -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingActivity.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingActivity.kt index 5c0e806220d7..643b9d8867c2 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingActivity.kt @@ -25,7 +25,6 @@ import com.duckduckgo.app.browser.databinding.ActivityOnboardingBinding import com.duckduckgo.common.ui.DuckDuckGoActivity import com.duckduckgo.common.ui.viewbinding.viewBinding import com.duckduckgo.di.scopes.ActivityScope -import com.duckduckgo.mobile.android.R @InjectWith(ActivityScope::class) class OnboardingActivity : DuckDuckGoActivity() { @@ -39,13 +38,8 @@ class OnboardingActivity : DuckDuckGoActivity() { private val viewPager get() = binding.viewPager - private var forceLightTheme: Boolean = true - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - forceLightTheme = intent.getBooleanExtra(EXTRA_FORCE_LIGHT_THEME, true) - val onboardingTheme = if (forceLightTheme) R.style.Theme_DuckDuckGo_Light else R.style.Theme_DuckDuckGo - setTheme(onboardingTheme) setContentView(binding.root) configurePager() } @@ -59,7 +53,7 @@ class OnboardingActivity : DuckDuckGoActivity() { } } - fun onOnboardingDone() { + private fun onOnboardingDone() { viewModel.onOnboardingDone() startActivity(BrowserActivity.intent(this@OnboardingActivity)) finish() @@ -85,12 +79,8 @@ class OnboardingActivity : DuckDuckGoActivity() { companion object { - private const val EXTRA_FORCE_LIGHT_THEME = "FORCE_LIGHT_THEME" - - fun intent(context: Context, forceLightTheme: Boolean): Intent { - return Intent(context, OnboardingActivity::class.java).apply { - putExtra(EXTRA_FORCE_LIGHT_THEME, forceLightTheme) - } + fun intent(context: Context): Intent { + return Intent(context, OnboardingActivity::class.java) } } } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageBuilder.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageBuilder.kt index b139c81459dd..b00635400b8a 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageBuilder.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageBuilder.kt @@ -18,23 +18,19 @@ package com.duckduckgo.app.onboarding.ui import com.duckduckgo.app.onboarding.ui.page.DefaultBrowserPage import com.duckduckgo.app.onboarding.ui.page.WelcomePage -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage interface OnboardingPageBuilder { - fun buildWelcomePage(): WelcomePage - fun buildExperimentWelcomePage(): ExperimentWelcomePage + fun buildExperimentWelcomePage(): WelcomePage fun buildDefaultBrowserPage(): DefaultBrowserPage sealed class OnboardingPageBlueprint { - object DefaultBrowserBlueprint : OnboardingPageBlueprint() - object WelcomeBlueprint : OnboardingPageBlueprint() - object ExperimentWelcomeBluePrint : OnboardingPageBlueprint() + data object DefaultBrowserBlueprint : OnboardingPageBlueprint() + data object ExperimentWelcomeBluePrint : OnboardingPageBlueprint() } } class OnboardingFragmentPageBuilder : OnboardingPageBuilder { - override fun buildWelcomePage() = WelcomePage() - override fun buildExperimentWelcomePage() = ExperimentWelcomePage() + override fun buildExperimentWelcomePage() = WelcomePage() override fun buildDefaultBrowserPage() = DefaultBrowserPage() } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManager.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManager.kt index 3a2774ef8701..5b6a9059b3bf 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManager.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManager.kt @@ -21,12 +21,9 @@ import com.duckduckgo.app.global.DefaultRoleBrowserDialog import com.duckduckgo.app.onboarding.ui.OnboardingPageBuilder.OnboardingPageBlueprint import com.duckduckgo.app.onboarding.ui.OnboardingPageBuilder.OnboardingPageBlueprint.DefaultBrowserBlueprint import com.duckduckgo.app.onboarding.ui.OnboardingPageBuilder.OnboardingPageBlueprint.ExperimentWelcomeBluePrint -import com.duckduckgo.app.onboarding.ui.OnboardingPageBuilder.OnboardingPageBlueprint.WelcomeBlueprint import com.duckduckgo.app.onboarding.ui.page.DefaultBrowserPage import com.duckduckgo.app.onboarding.ui.page.OnboardingPageFragment import com.duckduckgo.app.onboarding.ui.page.WelcomePage -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager interface OnboardingPageManager { fun pageCount(): Int @@ -38,7 +35,6 @@ class OnboardingPageManagerWithTrackerBlocking( private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog, private val onboardingPageBuilder: OnboardingPageBuilder, private val defaultWebBrowserCapability: DefaultBrowserDetector, - private val extendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager, ) : OnboardingPageManager { private val pages = mutableListOf() @@ -48,11 +44,7 @@ class OnboardingPageManagerWithTrackerBlocking( override fun buildPageBlueprints() { pages.clear() - if (extendedOnboardingExperimentVariantManager.isComparisonChartEnabled()) { - pages.add(ExperimentWelcomeBluePrint) - } else { - pages.add(WelcomeBlueprint) - } + pages.add(ExperimentWelcomeBluePrint) if (shouldShowDefaultBrowserPage()) { pages.add((DefaultBrowserBlueprint)) @@ -61,7 +53,6 @@ class OnboardingPageManagerWithTrackerBlocking( override fun buildPage(position: Int): OnboardingPageFragment? { return when (pages.getOrNull(position)) { - is WelcomeBlueprint -> buildWelcomePage() is ExperimentWelcomeBluePrint -> buildExperimentWelcomePage() is DefaultBrowserBlueprint -> buildDefaultBrowserPage() else -> null @@ -78,11 +69,7 @@ class OnboardingPageManagerWithTrackerBlocking( return onboardingPageBuilder.buildDefaultBrowserPage() } - private fun buildWelcomePage(): WelcomePage { - return onboardingPageBuilder.buildWelcomePage() - } - - private fun buildExperimentWelcomePage(): ExperimentWelcomePage { + private fun buildExperimentWelcomePage(): WelcomePage { return onboardingPageBuilder.buildExperimentWelcomePage() } } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt index af442a43c000..3aa3e8788b55 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 DuckDuckGo + * Copyright (c) 2024 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,114 +18,100 @@ package com.duckduckgo.app.onboarding.ui.page import android.Manifest import android.annotation.SuppressLint -import android.app.Activity.RESULT_OK +import android.app.Activity import android.content.Intent import android.graphics.Color import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.res.ResourcesCompat import androidx.core.view.ViewCompat import androidx.core.view.ViewPropertyAnimatorCompat +import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.transition.AutoTransition +import androidx.transition.TransitionManager import com.duckduckgo.anvil.annotations.InjectWith import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.databinding.ContentOnboardingWelcomeBinding +import com.duckduckgo.app.browser.databinding.ContentOnboardingWelcomePageBinding +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.CELEBRATION +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.COMPARISON_CHART +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.INITIAL +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.Finish +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowComparisonChart +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowDefaultBrowserDialog +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowSuccessDialog import com.duckduckgo.appbuildconfig.api.AppBuildConfig +import com.duckduckgo.common.ui.view.gone +import com.duckduckgo.common.ui.view.show import com.duckduckgo.common.ui.viewbinding.viewBinding -import com.duckduckgo.common.utils.DispatcherProvider +import com.duckduckgo.common.utils.FragmentViewModelFactory import com.duckduckgo.common.utils.extensions.html import com.duckduckgo.di.scopes.FragmentScope import javax.inject.Inject -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import nl.dionsegijn.konfetti.models.Shape +import nl.dionsegijn.konfetti.models.Size -@ExperimentalCoroutinesApi @InjectWith(FragmentScope::class) -class WelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome) { +class WelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome_page) { @Inject - lateinit var viewModelFactory: WelcomePageViewModelFactory + lateinit var viewModelFactory: FragmentViewModelFactory @Inject lateinit var appBuildConfig: AppBuildConfig - @Inject - lateinit var dispatcherProvider: DispatcherProvider - - private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { - // In case of screen rotation while the notifications permissions prompt is shown on screen a DENY result is received - // as the dialog gets automatically dismissed and recreated. Proceed with the welcome animation only if the dialog is not - // displayed on top of the onboarding. - if (view?.windowVisibility == View.VISIBLE) { - // Nothing to do at this point with the result. Proceed with the welcome animation. - scheduleWelcomeAnimation(ANIMATION_DELAY_AFTER_NOTIFICATIONS_PERMISSIONS_HANDLED) - } + private val binding: ContentOnboardingWelcomePageBinding by viewBinding() + private val viewModel by lazy { + ViewModelProvider(this, viewModelFactory)[WelcomePageViewModel::class.java] } private var ctaText: String = "" + private var hikerAnimation: ViewPropertyAnimatorCompat? = null private var welcomeAnimation: ViewPropertyAnimatorCompat? = null private var typingAnimation: ViewPropertyAnimatorCompat? = null private var welcomeAnimationFinished = false - // we use replay = 0 because we don't want to emit the last value upon subscription - private val events = MutableSharedFlow(replay = 0, extraBufferCapacity = 1) - - private val welcomePageViewModel: WelcomePageViewModel by lazy { - ViewModelProvider(this, viewModelFactory)[WelcomePageViewModel::class.java] + private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { permissionGranted -> + if (permissionGranted) { + viewModel.notificationRuntimePermissionGranted() + } + if (view?.windowVisibility == View.VISIBLE) { + scheduleWelcomeAnimation(ANIMATION_DELAY_AFTER_NOTIFICATIONS_PERMISSIONS_HANDLED) + } } - private val binding: ContentOnboardingWelcomeBinding by viewBinding() + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + val binding = ContentOnboardingWelcomePageBinding.inflate(inflater, container, false) + viewModel.commands.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).onEach { + when (it) { + is ShowComparisonChart -> configureDaxCta(COMPARISON_CHART) + is ShowDefaultBrowserDialog -> showDefaultBrowserDialog(it.intent) + is ShowSuccessDialog -> configureDaxCta(CELEBRATION) + is Finish -> onContinuePressed() + } + }.launchIn(lifecycleScope) + return binding.root + } override fun onViewCreated( view: View, savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - - configureDaxCta() requestNotificationsPermissions() setSkipAnimationListener() - - lifecycleScope.launch { - events - .flatMapLatest { welcomePageViewModel.reduce(it) } - .flowOn(dispatcherProvider.io()) - .collect(::render) - } - } - - @SuppressLint("InlinedApi") - private fun requestNotificationsPermissions() { - if (appBuildConfig.sdkInt >= android.os.Build.VERSION_CODES.TIRAMISU) { - requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS) - } else { - scheduleWelcomeAnimation() - } - } - - private fun render(state: WelcomePageView.State) { - when (state) { - WelcomePageView.State.Idle -> {} - is WelcomePageView.State.ShowDefaultBrowserDialog -> { - showDefaultBrowserDialog(state.intent) - } - WelcomePageView.State.Finish -> { - onContinuePressed() - } - } - } - - private fun event(event: WelcomePageView.Event) { - lifecycleScope.launch(dispatcherProvider.io()) { - events.emit(event) - } - } - - private fun showDefaultBrowserDialog(intent: Intent) { - startActivityForResult(intent, DEFAULT_BROWSER_ROLE_MANAGER_DIALOG) } override fun onResume() { @@ -145,33 +131,81 @@ class WelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome) data: Intent?, ) { if (requestCode == DEFAULT_BROWSER_ROLE_MANAGER_DIALOG) { - if (resultCode == RESULT_OK) { - event(WelcomePageView.Event.OnDefaultBrowserSet) + if (resultCode == Activity.RESULT_OK) { + viewModel.onDefaultBrowserSet() } else { - event(WelcomePageView.Event.OnDefaultBrowserNotSet) + viewModel.onDefaultBrowserNotSet() } } else { super.onActivityResult(requestCode, resultCode, data) } } - private fun applyFullScreenFlags() { - activity?.window?.apply { - clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) - addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - statusBarColor = Color.TRANSPARENT - navigationBarColor = Color.BLACK + @SuppressLint("InlinedApi") + private fun requestNotificationsPermissions() { + if (appBuildConfig.sdkInt >= android.os.Build.VERSION_CODES.TIRAMISU) { + viewModel.notificationRuntimePermissionRequested() + requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + scheduleWelcomeAnimation() } - ViewCompat.requestApplyInsets(binding.longDescriptionContainer) } - private fun configureDaxCta() { + private fun configureDaxCta(onboardingDialogType: PreOnboardingDialogType) { context?.let { - ctaText = it.getString(R.string.onboardingDaxText) - binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) - binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) + viewModel.onDialogShown(onboardingDialogType) + when (onboardingDialogType) { + INITIAL -> { + ctaText = it.getString(R.string.preOnboardingDaxDialog1Title) + binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) + binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) + binding.daxDialogCta.daxDialogContentImage.gone() + + scheduleTypingAnimation { + binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog1Button) + binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(INITIAL) } + ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION + } + } + + COMPARISON_CHART -> { + binding.daxDialogCta.dialogTextCta.text = "" + TransitionManager.beginDelayedTransition(binding.daxDialogCta.cardView, AutoTransition()) + ctaText = it.getString(R.string.preOnboardingDaxDialog2Title) + binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) + binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) + binding.daxDialogCta.primaryCta.alpha = MIN_ALPHA + binding.daxDialogCta.comparisonChart.root.show() + binding.daxDialogCta.comparisonChart.root.alpha = MIN_ALPHA + + scheduleTypingAnimation { + binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog2Button) + binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(COMPARISON_CHART) } + ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION + ViewCompat.animate(binding.daxDialogCta.comparisonChart.root).alpha(MAX_ALPHA).duration = ANIMATION_DURATION + } + } + + CELEBRATION -> { + binding.daxDialogCta.dialogTextCta.text = "" + binding.daxDialogCta.comparisonChart.root.gone() + binding.daxDialogCta.primaryCta.alpha = MIN_ALPHA + ctaText = it.getString(R.string.preOnboardingDaxDialog3Title) + binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) + binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) + binding.daxDialogCta.daxDialogContentImage.alpha = MIN_ALPHA + binding.daxDialogCta.daxDialogContentImage.show() + binding.daxDialogCta.daxDialogContentImage.setImageResource(R.drawable.ic_success_128) + launchKonfetti() + + scheduleTypingAnimation { + ViewCompat.animate(binding.daxDialogCta.daxDialogContentImage).alpha(MAX_ALPHA).duration = ANIMATION_DURATION + binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog3Button) + binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(CELEBRATION) } + ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION + } + } + } } } @@ -181,6 +215,7 @@ class WelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome) finishTypingAnimation() } else if (!welcomeAnimationFinished) { welcomeAnimation?.cancel() + hikerAnimation?.cancel() scheduleWelcomeAnimation(0L) } welcomeAnimationFinished = true @@ -188,33 +223,78 @@ class WelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome) } private fun scheduleWelcomeAnimation(startDelay: Long = ANIMATION_DELAY) { + ViewCompat.animate(binding.foregroundImageView) + .alpha(MIN_ALPHA) + .setDuration(ANIMATION_DURATION).startDelay = startDelay welcomeAnimation = ViewCompat.animate(binding.welcomeContent as View) .alpha(MIN_ALPHA) .setDuration(ANIMATION_DURATION) .setStartDelay(startDelay) .withEndAction { - typingAnimation = ViewCompat.animate(binding.daxDialogCta.daxCtaContainer) - .alpha(MAX_ALPHA) - .setDuration(ANIMATION_DURATION) - .withEndAction { - welcomeAnimationFinished = true - binding.daxDialogCta.dialogTextCta.startTypingAnimation(ctaText) - setPrimaryCtaListenerAfterWelcomeAlphaAnimation() - } + configureDaxCta(INITIAL) + } + } + + private fun scheduleTypingAnimation(afterAnimation: () -> Unit = {}) { + typingAnimation = ViewCompat.animate(binding.daxDialogCta.daxCtaContainer) + .alpha(MAX_ALPHA) + .setDuration(ANIMATION_DURATION) + .withEndAction { + welcomeAnimationFinished = true + binding.daxDialogCta.dialogTextCta.startTypingAnimation(ctaText, afterAnimation = afterAnimation) } } private fun finishTypingAnimation() { welcomeAnimation?.cancel() - binding.daxDialogCta.dialogTextCta.finishAnimation() - setPrimaryCtaListenerAfterWelcomeAlphaAnimation() + hikerAnimation?.cancel() + } + + private fun showDefaultBrowserDialog(intent: Intent) { + startActivityForResult(intent, DEFAULT_BROWSER_ROLE_MANAGER_DIALOG) } - private fun setPrimaryCtaListenerAfterWelcomeAlphaAnimation() { - binding.daxDialogCta.primaryCta.setOnClickListener { event(WelcomePageView.Event.OnPrimaryCtaClicked) } + private fun launchKonfetti() { + val magenta = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.magenta, null) + val blue = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.blue30, null) + val purple = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.purple, null) + val green = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.green, null) + val yellow = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.yellow, null) + + val displayWidth = resources.displayMetrics.widthPixels + + binding.setAsDefaultKonfetti.build() + .addColors(magenta, blue, purple, green, yellow) + .setDirection(0.0, 359.0) + .setSpeed(4f, 9f) + .setFadeOutEnabled(true) + .setTimeToLive(1500L) + .addShapes(Shape.Rectangle(1f)) + .addSizes(Size(8)) + .setPosition(displayWidth / 2f, displayWidth / 2f, -50f, -50f) + .streamFor(60, 2000L) + } + + private fun applyFullScreenFlags() { + activity?.window?.apply { + clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) + addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + statusBarColor = Color.TRANSPARENT + navigationBarColor = Color.BLACK + } + ViewCompat.requestApplyInsets(binding.longDescriptionContainer) } companion object { + + enum class PreOnboardingDialogType { + INITIAL, + COMPARISON_CHART, + CELEBRATION, + } + private const val MIN_ALPHA = 0f private const val MAX_ALPHA = 1f private const val ANIMATION_DURATION = 400L diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt index 12e7e4864719..8096a6726f43 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModel.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 DuckDuckGo + * Copyright (c) 2024 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,95 +18,143 @@ package com.duckduckgo.app.onboarding.ui.page import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import com.duckduckgo.anvil.annotations.ContributesViewModel import com.duckduckgo.app.global.DefaultRoleBrowserDialog import com.duckduckgo.app.global.install.AppInstallStore +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.CELEBRATION +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.COMPARISON_CHART +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType.INITIAL +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.Finish +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowComparisonChart +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowDefaultBrowserDialog +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowSuccessDialog +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.NOTIFICATION_RUNTIME_PERMISSION_SHOWN +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_AFFIRMATION_SHOWN +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_AFFIRMATION_SHOWN_UNIQUE +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_CHOOSE_BROWSER_PRESSED +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_COMPARISON_CHART_SHOWN +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_INTRO_SHOWN +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.PREONBOARDING_INTRO_SHOWN_UNIQUE +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelParameter import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.UNIQUE +import com.duckduckgo.di.scopes.FragmentScope +import javax.inject.Inject +import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch @SuppressLint("StaticFieldLeak") -class WelcomePageViewModel( - private val appInstallStore: AppInstallStore, +@ContributesViewModel(FragmentScope::class) +class WelcomePageViewModel @Inject constructor( + private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog, private val context: Context, private val pixel: Pixel, - private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog, + private val appInstallStore: AppInstallStore, ) : ViewModel() { - fun reduce(event: WelcomePageView.Event): Flow { - return when (event) { - WelcomePageView.Event.OnPrimaryCtaClicked -> onPrimaryCtaClicked() - WelcomePageView.Event.OnDefaultBrowserSet -> onDefaultBrowserSet() - WelcomePageView.Event.OnDefaultBrowserNotSet -> onDefaultBrowserNotSet() - } + private val _commands = Channel(1, DROP_OLDEST) + val commands: Flow = _commands.receiveAsFlow() + + sealed interface Command { + data object ShowComparisonChart : Command + data class ShowDefaultBrowserDialog(val intent: Intent) : Command + data object ShowSuccessDialog : Command + data object Finish : Command } - private fun onPrimaryCtaClicked(): Flow = flow { - if (defaultRoleBrowserDialog.shouldShowDialog()) { - val intent = defaultRoleBrowserDialog.createIntent(context) - if (intent != null) { - emit(WelcomePageView.State.ShowDefaultBrowserDialog(intent)) - } else { - pixel.fire(AppPixelName.DEFAULT_BROWSER_DIALOG_NOT_SHOWN) - emit(WelcomePageView.State.Finish) + fun onPrimaryCtaClicked(currentDialog: PreOnboardingDialogType) { + when (currentDialog) { + INITIAL -> { + viewModelScope.launch { + _commands.send(ShowComparisonChart) + } + } + + COMPARISON_CHART -> { + viewModelScope.launch { + val isDDGDefaultBrowser = + if (defaultRoleBrowserDialog.shouldShowDialog()) { + val intent = defaultRoleBrowserDialog.createIntent(context) + if (intent != null) { + _commands.send(ShowDefaultBrowserDialog(intent)) + } else { + pixel.fire(AppPixelName.DEFAULT_BROWSER_DIALOG_NOT_SHOWN) + _commands.send(Finish) + } + false + } else { + _commands.send(Finish) + true + } + pixel.fire( + PREONBOARDING_CHOOSE_BROWSER_PRESSED, + mapOf(PixelParameter.DEFAULT_BROWSER to isDDGDefaultBrowser.toString()), + ) + } + } + + CELEBRATION -> { + viewModelScope.launch { + _commands.send(Finish) + } } - } else { - emit(WelcomePageView.State.Finish) } } - private fun onDefaultBrowserSet(): Flow = flow { + fun onDefaultBrowserSet() { defaultRoleBrowserDialog.dialogShown() - appInstallStore.defaultBrowser = true + pixel.fire(AppPixelName.DEFAULT_BROWSER_SET, mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString())) - pixel.fire( - AppPixelName.DEFAULT_BROWSER_SET, - mapOf( - Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString(), - ), - ) - - emit(WelcomePageView.State.Finish) + viewModelScope.launch { + _commands.send(ShowSuccessDialog) + } } - private fun onDefaultBrowserNotSet(): Flow = flow { + fun onDefaultBrowserNotSet() { defaultRoleBrowserDialog.dialogShown() - appInstallStore.defaultBrowser = false + pixel.fire(AppPixelName.DEFAULT_BROWSER_NOT_SET, mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString())) - pixel.fire( - AppPixelName.DEFAULT_BROWSER_NOT_SET, - mapOf( - Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString(), - ), - ) + viewModelScope.launch { + _commands.send(Finish) + } + } - emit(WelcomePageView.State.Finish) + fun notificationRuntimePermissionRequested() { + pixel.fire(NOTIFICATION_RUNTIME_PERMISSION_SHOWN) } -} -@Suppress("UNCHECKED_CAST") -class WelcomePageViewModelFactory( - private val appInstallStore: AppInstallStore, - private val context: Context, - private val pixel: Pixel, - private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog, -) : ViewModelProvider.NewInstanceFactory() { + fun notificationRuntimePermissionGranted() { + pixel.fire( + AppPixelName.NOTIFICATIONS_ENABLED, + mapOf(PixelParameter.FROM_ONBOARDING to true.toString()), + ) + } - override fun create(modelClass: Class): T { - return with(modelClass) { - when { - isAssignableFrom(WelcomePageViewModel::class.java) -> WelcomePageViewModel( - appInstallStore, - context, - pixel, - defaultRoleBrowserDialog, - ) - else -> throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") + fun onDialogShown(onboardingDialogType: PreOnboardingDialogType) { + when (onboardingDialogType) { + INITIAL -> { + pixel.fire(PREONBOARDING_INTRO_SHOWN) + pixel.fire(PREONBOARDING_INTRO_SHOWN_UNIQUE, type = UNIQUE) } - } as T + COMPARISON_CHART -> { + pixel.fire(PREONBOARDING_COMPARISON_CHART_SHOWN) + pixel.fire(PixelName.PREONBOARDING_COMPARISON_CHART_SHOWN_UNIQUE, type = UNIQUE) + } + CELEBRATION -> { + pixel.fire(PREONBOARDING_AFFIRMATION_SHOWN) + pixel.fire(PREONBOARDING_AFFIRMATION_SHOWN_UNIQUE, type = UNIQUE) + } + } } } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentDaxBubbleCardView.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentDaxBubbleCardView.kt deleted file mode 100644 index ed07b80b39c8..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentDaxBubbleCardView.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2024 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.app.onboarding.ui.page.experiment - -import android.content.Context -import android.content.res.ColorStateList -import android.util.AttributeSet -import com.duckduckgo.common.ui.view.getColorFromAttr -import com.duckduckgo.mobile.android.R -import com.google.android.material.card.MaterialCardView -import com.google.android.material.shape.EdgeTreatment -import com.google.android.material.shape.ShapeAppearanceModel -import com.google.android.material.shape.ShapePath - -class ExperimentDaxBubbleCardView -@JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = R.attr.cardViewStyle, -) : MaterialCardView(context, attrs, defStyleAttr) { - - init { - val cornderRadius = resources.getDimension(R.dimen.mediumShapeCornerRadius) - val cornerSize = resources.getDimension(R.dimen.daxBubbleDialogEdge) - val distanceFromEdge = resources.getDimension(R.dimen.daxBubbleDialogDistanceFromEdge) - val edgeTreatment = ExperimentDaxBubbleEdgeTreatment(cornerSize, distanceFromEdge) - - setCardBackgroundColor(ColorStateList.valueOf(context.getColorFromAttr(R.attr.daxColorSurface))) - shapeAppearanceModel = ShapeAppearanceModel.builder() - .setAllCornerSizes(cornderRadius) - .setLeftEdge(edgeTreatment) - .build() - } - - class ExperimentDaxBubbleEdgeTreatment( - private val size: Float, - private val distanceFromEdge: Float, - ) : EdgeTreatment() { - override fun getEdgePath( - length: Float, - center: Float, - interpolation: Float, - shapePath: ShapePath, - ) { - val d = length - distanceFromEdge - shapePath.lineTo(d - size * interpolation, 0f) - shapePath.lineTo(d, -size * interpolation) - shapePath.lineTo(d + size * interpolation, 0f) - shapePath.lineTo(length, 0f) - } - } -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePage.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePage.kt deleted file mode 100644 index 0a2d125c399f..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePage.kt +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright (c) 2024 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.app.onboarding.ui.page.experiment - -import android.Manifest -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import androidx.activity.result.contract.ActivityResultContracts -import androidx.core.content.res.ResourcesCompat -import androidx.core.view.ViewCompat -import androidx.core.view.ViewPropertyAnimatorCompat -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope -import androidx.transition.AutoTransition -import androidx.transition.TransitionManager -import com.duckduckgo.anvil.annotations.InjectWith -import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.databinding.ContentOnboardingWelcomeExperimentBinding -import com.duckduckgo.app.onboarding.ui.page.OnboardingPageFragment -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.CELEBRATION -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.COMPARISON_CHART -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.INITIAL -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.Finish -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowComparisonChart -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowDefaultBrowserDialog -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowSuccessDialog -import com.duckduckgo.appbuildconfig.api.AppBuildConfig -import com.duckduckgo.common.ui.view.gone -import com.duckduckgo.common.ui.view.show -import com.duckduckgo.common.ui.viewbinding.viewBinding -import com.duckduckgo.common.utils.FragmentViewModelFactory -import com.duckduckgo.common.utils.extensions.html -import com.duckduckgo.di.scopes.FragmentScope -import javax.inject.Inject -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import nl.dionsegijn.konfetti.models.Shape -import nl.dionsegijn.konfetti.models.Size - -@InjectWith(FragmentScope::class) -class ExperimentWelcomePage : OnboardingPageFragment(R.layout.content_onboarding_welcome_experiment) { - - @Inject - lateinit var viewModelFactory: FragmentViewModelFactory - - @Inject - lateinit var appBuildConfig: AppBuildConfig - - private val binding: ContentOnboardingWelcomeExperimentBinding by viewBinding() - private val viewModel by lazy { - ViewModelProvider(this, viewModelFactory)[ExperimentWelcomePageViewModel::class.java] - } - - private var ctaText: String = "" - private var hikerAnimation: ViewPropertyAnimatorCompat? = null - private var welcomeAnimation: ViewPropertyAnimatorCompat? = null - private var typingAnimation: ViewPropertyAnimatorCompat? = null - private var welcomeAnimationFinished = false - - private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { permissionGranted -> - if (permissionGranted) { - viewModel.notificationRuntimePermissionGranted() - } - if (view?.windowVisibility == View.VISIBLE) { - scheduleWelcomeAnimation(ANIMATION_DELAY_AFTER_NOTIFICATIONS_PERMISSIONS_HANDLED) - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - val binding = ContentOnboardingWelcomeExperimentBinding.inflate(inflater, container, false) - viewModel.commands.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).onEach { - when (it) { - is ShowComparisonChart -> configureDaxCta(COMPARISON_CHART) - is ShowDefaultBrowserDialog -> showDefaultBrowserDialog(it.intent) - is ShowSuccessDialog -> configureDaxCta(CELEBRATION) - is Finish -> onContinuePressed() - } - }.launchIn(lifecycleScope) - return binding.root - } - - override fun onViewCreated( - view: View, - savedInstanceState: Bundle?, - ) { - super.onViewCreated(view, savedInstanceState) - requestNotificationsPermissions() - setSkipAnimationListener() - } - - override fun onResume() { - super.onResume() - applyFullScreenFlags() - } - - override fun onDestroyView() { - super.onDestroyView() - welcomeAnimation?.cancel() - typingAnimation?.cancel() - } - - override fun onActivityResult( - requestCode: Int, - resultCode: Int, - data: Intent?, - ) { - if (requestCode == DEFAULT_BROWSER_ROLE_MANAGER_DIALOG) { - if (resultCode == Activity.RESULT_OK) { - viewModel.onDefaultBrowserSet() - } else { - viewModel.onDefaultBrowserNotSet() - } - } else { - super.onActivityResult(requestCode, resultCode, data) - } - } - - @SuppressLint("InlinedApi") - private fun requestNotificationsPermissions() { - if (appBuildConfig.sdkInt >= android.os.Build.VERSION_CODES.TIRAMISU) { - viewModel.notificationRuntimePermissionRequested() - requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS) - } else { - scheduleWelcomeAnimation() - } - } - - private fun configureDaxCta(onboardingDialogType: PreOnboardingDialogType) { - context?.let { - viewModel.onDialogShown(onboardingDialogType) - when (onboardingDialogType) { - INITIAL -> { - ctaText = it.getString(R.string.preOnboardingDaxDialog1Title) - binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) - binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) - binding.daxDialogCta.experimentDialogContentImage.gone() - - scheduleTypingAnimation { - binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog1Button) - binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(INITIAL) } - ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION - } - } - - COMPARISON_CHART -> { - binding.daxDialogCta.dialogTextCta.text = "" - TransitionManager.beginDelayedTransition(binding.daxDialogCta.cardView, AutoTransition()) - ctaText = it.getString(R.string.preOnboardingDaxDialog2Title) - binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) - binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) - binding.daxDialogCta.primaryCta.alpha = MIN_ALPHA - binding.daxDialogCta.comparisonChart.root.show() - binding.daxDialogCta.comparisonChart.root.alpha = MIN_ALPHA - - scheduleTypingAnimation { - binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog2Button) - binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(COMPARISON_CHART) } - ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION - ViewCompat.animate(binding.daxDialogCta.comparisonChart.root).alpha(MAX_ALPHA).duration = ANIMATION_DURATION - } - } - - CELEBRATION -> { - binding.daxDialogCta.dialogTextCta.text = "" - binding.daxDialogCta.comparisonChart.root.gone() - binding.daxDialogCta.primaryCta.alpha = MIN_ALPHA - ctaText = it.getString(R.string.preOnboardingDaxDialog3Title) - binding.daxDialogCta.hiddenTextCta.text = ctaText.html(it) - binding.daxDialogCta.dialogTextCta.textInDialog = ctaText.html(it) - binding.daxDialogCta.experimentDialogContentImage.alpha = MIN_ALPHA - binding.daxDialogCta.experimentDialogContentImage.show() - binding.daxDialogCta.experimentDialogContentImage.setImageResource(R.drawable.ic_success_128) - launchKonfetti() - - scheduleTypingAnimation { - ViewCompat.animate(binding.daxDialogCta.experimentDialogContentImage).alpha(MAX_ALPHA).duration = ANIMATION_DURATION - binding.daxDialogCta.primaryCta.text = it.getString(R.string.preOnboardingDaxDialog3Button) - binding.daxDialogCta.primaryCta.setOnClickListener { viewModel.onPrimaryCtaClicked(CELEBRATION) } - ViewCompat.animate(binding.daxDialogCta.primaryCta).alpha(MAX_ALPHA).duration = ANIMATION_DURATION - } - } - } - } - } - - private fun setSkipAnimationListener() { - binding.longDescriptionContainer.setOnClickListener { - if (binding.daxDialogCta.dialogTextCta.hasAnimationStarted()) { - finishTypingAnimation() - } else if (!welcomeAnimationFinished) { - welcomeAnimation?.cancel() - hikerAnimation?.cancel() - scheduleWelcomeAnimation(0L) - } - welcomeAnimationFinished = true - } - } - - private fun scheduleWelcomeAnimation(startDelay: Long = ANIMATION_DELAY) { - ViewCompat.animate(binding.foregroundImageView) - .alpha(MIN_ALPHA) - .setDuration(ANIMATION_DURATION).startDelay = startDelay - welcomeAnimation = ViewCompat.animate(binding.welcomeContent as View) - .alpha(MIN_ALPHA) - .setDuration(ANIMATION_DURATION) - .setStartDelay(startDelay) - .withEndAction { - configureDaxCta(INITIAL) - } - } - - private fun scheduleTypingAnimation(afterAnimation: () -> Unit = {}) { - typingAnimation = ViewCompat.animate(binding.daxDialogCta.daxCtaContainer) - .alpha(MAX_ALPHA) - .setDuration(ANIMATION_DURATION) - .withEndAction { - welcomeAnimationFinished = true - binding.daxDialogCta.dialogTextCta.startTypingAnimation(ctaText, afterAnimation = afterAnimation) - } - } - - private fun finishTypingAnimation() { - welcomeAnimation?.cancel() - hikerAnimation?.cancel() - } - - private fun showDefaultBrowserDialog(intent: Intent) { - startActivityForResult(intent, DEFAULT_BROWSER_ROLE_MANAGER_DIALOG) - } - - private fun launchKonfetti() { - val magenta = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.magenta, null) - val blue = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.blue30, null) - val purple = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.purple, null) - val green = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.green, null) - val yellow = ResourcesCompat.getColor(resources, com.duckduckgo.mobile.android.R.color.yellow, null) - - val displayWidth = resources.displayMetrics.widthPixels - - binding.setAsDefaultKonfetti.build() - .addColors(magenta, blue, purple, green, yellow) - .setDirection(0.0, 359.0) - .setSpeed(4f, 9f) - .setFadeOutEnabled(true) - .setTimeToLive(1500L) - .addShapes(Shape.Rectangle(1f)) - .addSizes(Size(8)) - .setPosition(displayWidth / 2f, displayWidth / 2f, -50f, -50f) - .streamFor(60, 2000L) - } - - private fun applyFullScreenFlags() { - activity?.window?.apply { - clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) - addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - statusBarColor = Color.TRANSPARENT - navigationBarColor = Color.BLACK - } - ViewCompat.requestApplyInsets(binding.longDescriptionContainer) - } - - companion object { - - enum class PreOnboardingDialogType { - INITIAL, - COMPARISON_CHART, - CELEBRATION, - } - - private const val MIN_ALPHA = 0f - private const val MAX_ALPHA = 1f - private const val ANIMATION_DURATION = 400L - private const val ANIMATION_DELAY = 1400L - private const val ANIMATION_DELAY_AFTER_NOTIFICATIONS_PERMISSIONS_HANDLED = 800L - - private const val DEFAULT_BROWSER_ROLE_MANAGER_DIALOG = 101 - } -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePageViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePageViewModel.kt deleted file mode 100644 index c76dc1777c76..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExperimentWelcomePageViewModel.kt +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2024 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.app.onboarding.ui.page.experiment - -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.duckduckgo.anvil.annotations.ContributesViewModel -import com.duckduckgo.app.global.DefaultRoleBrowserDialog -import com.duckduckgo.app.global.install.AppInstallStore -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.CELEBRATION -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.COMPARISON_CHART -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePage.Companion.PreOnboardingDialogType.INITIAL -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.Finish -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowComparisonChart -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowDefaultBrowserDialog -import com.duckduckgo.app.onboarding.ui.page.experiment.ExperimentWelcomePageViewModel.Command.ShowSuccessDialog -import com.duckduckgo.app.pixels.AppPixelName -import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.UNIQUE -import com.duckduckgo.di.scopes.FragmentScope -import javax.inject.Inject -import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch - -@SuppressLint("StaticFieldLeak") -@ContributesViewModel(FragmentScope::class) -class ExperimentWelcomePageViewModel @Inject constructor( - private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog, - private val context: Context, - private val pixel: Pixel, - private val appInstallStore: AppInstallStore, -) : ViewModel() { - - private val _commands = Channel(1, DROP_OLDEST) - val commands: Flow = _commands.receiveAsFlow() - - sealed interface Command { - data object ShowComparisonChart : Command - data class ShowDefaultBrowserDialog(val intent: Intent) : Command - data object ShowSuccessDialog : Command - data object Finish : Command - } - - fun onPrimaryCtaClicked(currentDialog: PreOnboardingDialogType) { - when (currentDialog) { - INITIAL -> { - viewModelScope.launch { - _commands.send(ShowComparisonChart) - } - } - - COMPARISON_CHART -> { - viewModelScope.launch { - val isDDGDefaultBrowser = - if (defaultRoleBrowserDialog.shouldShowDialog()) { - val intent = defaultRoleBrowserDialog.createIntent(context) - if (intent != null) { - _commands.send(ShowDefaultBrowserDialog(intent)) - } else { - pixel.fire(AppPixelName.DEFAULT_BROWSER_DIALOG_NOT_SHOWN) - _commands.send(Finish) - } - false - } else { - _commands.send(Finish) - true - } - pixel.fire( - OnboardingExperimentPixel.PixelName.PREONBOARDING_CHOOSE_BROWSER_PRESSED, - mapOf(OnboardingExperimentPixel.PixelParameter.DEFAULT_BROWSER to isDDGDefaultBrowser.toString()), - ) - } - } - - CELEBRATION -> { - viewModelScope.launch { - _commands.send(Finish) - } - } - } - } - - fun onDefaultBrowserSet() { - defaultRoleBrowserDialog.dialogShown() - appInstallStore.defaultBrowser = true - pixel.fire(AppPixelName.DEFAULT_BROWSER_SET, mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString())) - - viewModelScope.launch { - _commands.send(ShowSuccessDialog) - } - } - - fun onDefaultBrowserNotSet() { - defaultRoleBrowserDialog.dialogShown() - appInstallStore.defaultBrowser = false - pixel.fire(AppPixelName.DEFAULT_BROWSER_NOT_SET, mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString())) - - viewModelScope.launch { - _commands.send(Finish) - } - } - - fun notificationRuntimePermissionRequested() { - pixel.fire(OnboardingExperimentPixel.PixelName.NOTIFICATION_RUNTIME_PERMISSION_SHOWN) - } - - fun notificationRuntimePermissionGranted() { - pixel.fire( - AppPixelName.NOTIFICATIONS_ENABLED, - mapOf(OnboardingExperimentPixel.PixelParameter.FROM_ONBOARDING to true.toString()), - ) - } - - fun onDialogShown(onboardingDialogType: PreOnboardingDialogType) { - when (onboardingDialogType) { - INITIAL -> { - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_INTRO_SHOWN) - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_INTRO_SHOWN_UNIQUE, type = UNIQUE) - } - COMPARISON_CHART -> { - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_COMPARISON_CHART_SHOWN) - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_COMPARISON_CHART_SHOWN_UNIQUE, type = UNIQUE) - } - CELEBRATION -> { - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_AFFIRMATION_SHOWN) - pixel.fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_AFFIRMATION_SHOWN_UNIQUE, type = UNIQUE) - } - } - } -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingExperimentVariantManager.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingExperimentVariantManager.kt deleted file mode 100644 index 0f0cf35c286b..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingExperimentVariantManager.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2024 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.app.onboarding.ui.page.experiment - -import com.duckduckgo.di.scopes.AppScope -import com.duckduckgo.experiments.api.VariantConfig -import com.duckduckgo.experiments.api.VariantFilters -import com.duckduckgo.experiments.api.VariantManager -import com.squareup.anvil.annotations.ContributesBinding -import javax.inject.Inject - -interface ExtendedOnboardingExperimentVariantManager { - fun setExperimentVariants() - fun isComparisonChartEnabled(): Boolean - fun isAestheticUpdatesEnabled(): Boolean -} - -@ContributesBinding(AppScope::class) -class ExtendedOnboardingExperimentVariantManagerImpl @Inject constructor( - private val variantManager: VariantManager, - private val extendedOnboardingFeatureToggles: ExtendedOnboardingFeatureToggles, -) : ExtendedOnboardingExperimentVariantManager { - - private val isExtendedOnboardingEnabled: Boolean = true - - override fun setExperimentVariants() { - val variants = listOf( - VariantConfig("ms", 1.0, VariantFilters(locale = listOf("en_US", "en_GB", "en_CA", "en_IN", "en_AU"))), - VariantConfig("mt", 1.0, VariantFilters(locale = listOf("en_US", "en_GB", "en_CA", "en_IN", "en_AU"))), - ) - variantManager.updateVariants(variants) - } - - override fun isComparisonChartEnabled(): Boolean { - val isRemoteFeatureEnabled = extendedOnboardingFeatureToggles.comparisonChart().isEnabled() - val isLocalFeatureEnabled = isExtendedOnboardingEnabled && variantManager.getVariantKey() == "mt" - return isRemoteFeatureEnabled || isLocalFeatureEnabled - } - - override fun isAestheticUpdatesEnabled(): Boolean { - return extendedOnboardingFeatureToggles.aestheticUpdates().isEnabled() - } -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingFeatureToggles.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/ExtendedOnboardingFeatureToggles.kt similarity index 80% rename from app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingFeatureToggles.kt rename to app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/ExtendedOnboardingFeatureToggles.kt index 272dda622ceb..0c9e66f54672 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/ExtendedOnboardingFeatureToggles.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/ExtendedOnboardingFeatureToggles.kt @@ -14,26 +14,21 @@ * limitations under the License. */ -package com.duckduckgo.app.onboarding.ui.page.experiment +package com.duckduckgo.app.onboarding.ui.page.extendedonboarding import com.duckduckgo.anvil.annotations.ContributesRemoteFeature import com.duckduckgo.di.scopes.AppScope import com.duckduckgo.feature.toggles.api.Toggle -import com.duckduckgo.feature.toggles.api.Toggle.Experiment @ContributesRemoteFeature( scope = AppScope::class, featureName = "extendedOnboarding", ) interface ExtendedOnboardingFeatureToggles { - @Toggle.DefaultValue(false) - fun self(): Toggle @Toggle.DefaultValue(false) - @Experiment - fun comparisonChart(): Toggle + fun self(): Toggle - @Toggle.DefaultValue(false) - @Experiment + @Toggle.DefaultValue(true) fun aestheticUpdates(): Toggle } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/OnboardingExperimentPixel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/OnboardingExperimentPixel.kt similarity index 97% rename from app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/OnboardingExperimentPixel.kt rename to app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/OnboardingExperimentPixel.kt index e8426b5110e0..a22db231aeac 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/experiment/OnboardingExperimentPixel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/extendedonboarding/OnboardingExperimentPixel.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.duckduckgo.app.onboarding.ui.page.experiment +package com.duckduckgo.app.onboarding.ui.page.extendedonboarding import com.duckduckgo.app.statistics.pixels.Pixel diff --git a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt index 9158d9055ed8..00d285a36a65 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt @@ -241,7 +241,6 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName { FIRE_DIALOG_PROMOTED_CLEAR_PRESSED("m_fdp_p"), FIRE_DIALOG_CLEAR_PRESSED("m_fd_p"), - FIRE_DIALOG_PROMOTED_CANCEL("m_fdp_c"), FIRE_DIALOG_CANCEL("m_fd_c"), FIRE_DIALOG_ANIMATION("m_fd_a"), diff --git a/app/src/main/java/com/duckduckgo/app/settings/db/SettingsDataStore.kt b/app/src/main/java/com/duckduckgo/app/settings/db/SettingsDataStore.kt index b1e31b1a2f66..a4e889167bac 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/db/SettingsDataStore.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/db/SettingsDataStore.kt @@ -34,6 +34,8 @@ import javax.inject.Inject interface SettingsDataStore { var lastExecutedJobId: String? + + @Deprecated(message = "hideTips variable is deprecated and no longer available in onboarding") var hideTips: Boolean var autoCompleteSuggestionsEnabled: Boolean var appIcon: AppIcon diff --git a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt index ce7f76d5b04e..1d58362a4c72 100644 --- a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherActivity.kt @@ -30,7 +30,6 @@ import com.duckduckgo.anvil.annotations.InjectWith import com.duckduckgo.app.browser.R import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.browser.tabpreview.WebViewPreviewPersister -import com.duckduckgo.app.cta.ui.CtaViewModel import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.downloads.DownloadsActivity import com.duckduckgo.app.global.events.db.UserEventsStore @@ -80,9 +79,6 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine @Inject lateinit var pixel: Pixel - @Inject - lateinit var ctaViewModel: CtaViewModel - @Inject lateinit var faviconManager: FaviconManager @@ -214,7 +210,6 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine val dialog = FireDialog( context = this, clearPersonalDataAction = clearPersonalDataAction, - ctaViewModel = ctaViewModel, pixel = pixel, settingsDataStore = settingsDataStore, userEventsStore = userEventsStore, diff --git a/app/src/main/res/drawable-hdpi/onboarding_background_large.png b/app/src/main/res/drawable-hdpi/onboarding_background_large.png deleted file mode 100644 index e9d5a6e85d0371afc8d71af307356a0ef7305e10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174105 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 diff --git a/app/src/main/res/drawable-hdpi/onboarding_background_small.png b/app/src/main/res/drawable-hdpi/onboarding_background_small.png deleted file mode 100644 index 198a6e7487f3cb404fad90e4423604ba1fe5e856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94766 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%0D9~{qOi; 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

CJ4Ojmy5&A`FN{L+nCZ`EPf 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 diff --git a/app/src/main/res/drawable/onboarding_background.xml b/app/src/main/res/drawable/onboarding_background.xml deleted file mode 100644 index e62fa3e1ef09..000000000000 --- a/app/src/main/res/drawable/onboarding_background.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/content_onboarding_welcome.xml b/app/src/main/res/layout-land/content_onboarding_welcome.xml deleted file mode 100644 index cbd033476bf6..000000000000 --- a/app/src/main/res/layout-land/content_onboarding_welcome.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/content_onboarding_welcome_experiment.xml b/app/src/main/res/layout-land/content_onboarding_welcome_page.xml similarity index 98% rename from app/src/main/res/layout-land/content_onboarding_welcome_experiment.xml rename to app/src/main/res/layout-land/content_onboarding_welcome_page.xml index 8730c2bd4616..fab0baed9fe8 100644 --- a/app/src/main/res/layout-land/content_onboarding_welcome_experiment.xml +++ b/app/src/main/res/layout-land/content_onboarding_welcome_page.xml @@ -77,7 +77,7 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/content_onboarding_welcome_experiment.xml b/app/src/main/res/layout/content_onboarding_welcome_page.xml similarity index 98% rename from app/src/main/res/layout/content_onboarding_welcome_experiment.xml rename to app/src/main/res/layout/content_onboarding_welcome_page.xml index bc58af148d82..40a9d8b40396 100644 --- a/app/src/main/res/layout/content_onboarding_welcome_experiment.xml +++ b/app/src/main/res/layout/content_onboarding_welcome_page.xml @@ -76,7 +76,7 @@ @@ -96,7 +96,7 @@ android:id="@+id/swipeRefreshContainer" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_below="@id/experimentDaxDialogContent"> + android:layout_below="@id/daxDialogOnboardingCtaContent"> diff --git a/app/src/main/res/layout/include_dax_dialog_intro_experiment_cta.xml b/app/src/main/res/layout/include_dax_dialog_intro_bubble_cta.xml similarity index 99% rename from app/src/main/res/layout/include_dax_dialog_intro_experiment_cta.xml rename to app/src/main/res/layout/include_dax_dialog_intro_bubble_cta.xml index 042ee08e6450..0ace4cfcb2e4 100644 --- a/app/src/main/res/layout/include_dax_dialog_intro_experiment_cta.xml +++ b/app/src/main/res/layout/include_dax_dialog_intro_bubble_cta.xml @@ -51,7 +51,7 @@ android:orientation="vertical"> @@ -82,8 +83,8 @@ - - + + > \ No newline at end of file diff --git a/app/src/main/res/layout/experiment_pre_onboarding_dax_dialog_cta.xml b/app/src/main/res/layout/pre_onboarding_dax_dialog_cta.xml similarity index 98% rename from app/src/main/res/layout/experiment_pre_onboarding_dax_dialog_cta.xml rename to app/src/main/res/layout/pre_onboarding_dax_dialog_cta.xml index aa070ba17c27..21f83cd7a084 100644 --- a/app/src/main/res/layout/experiment_pre_onboarding_dax_dialog_cta.xml +++ b/app/src/main/res/layout/pre_onboarding_dax_dialog_cta.xml @@ -76,7 +76,7 @@ - - - + android:layout_gravity="bottom"> - + \ No newline at end of file diff --git a/app/src/test/java/com/duckduckgo/app/cta/ui/CtaTest.kt b/app/src/test/java/com/duckduckgo/app/cta/ui/CtaTest.kt index 35f49ba9c451..3e984ff44cf8 100644 --- a/app/src/test/java/com/duckduckgo/app/cta/ui/CtaTest.kt +++ b/app/src/test/java/com/duckduckgo/app/cta/ui/CtaTest.kt @@ -32,7 +32,9 @@ import com.duckduckgo.app.trackerdetection.model.TrackerStatus import com.duckduckgo.app.trackerdetection.model.TrackerType import com.duckduckgo.app.trackerdetection.model.TrackingEvent import java.util.concurrent.TimeUnit -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mock @@ -120,7 +122,7 @@ class CtaTest { @Test fun whenCtaIsBubbleTypeReturnCorrectCancelParameters() { - val testee = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val testee = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) val value = testee.pixelCancelParameters() assertEquals(1, value.size) @@ -130,7 +132,7 @@ class CtaTest { @Test fun whenCtaIsBubbleTypeReturnCorrectOkParameters() { - val testee = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val testee = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) val value = testee.pixelOkParameters() assertEquals(1, value.size) @@ -143,7 +145,7 @@ class CtaTest { whenever(mockOnboardingStore.onboardingDialogJourney).thenReturn(null) whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis()) - val testee = DaxBubbleCta.DaxIntroCta(mockOnboardingStore, mockAppInstallStore) + val testee = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) val expectedValue = "${testee.ctaPixelParam}:0" val value = testee.pixelShownParameters() @@ -231,7 +233,7 @@ class CtaTest { @Test fun whenCtaIsDialogTypeReturnCorrectCancelParameters() { - val testee = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) + val testee = OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) val value = testee.pixelCancelParameters() assertEquals(1, value.size) @@ -241,7 +243,7 @@ class CtaTest { @Test fun whenCtaIsDialogTypeReturnCorrectOkParameters() { - val testee = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) + val testee = OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) val value = testee.pixelOkParameters() assertEquals(1, value.size) @@ -253,7 +255,7 @@ class CtaTest { fun whenCtaIsDialogTypeReturnCorrectShownParameters() { whenever(mockOnboardingStore.onboardingDialogJourney).thenReturn(null) whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis()) - val testee = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) + val testee = OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) val expectedValue = "${testee.ctaPixelParam}:0" val value = testee.pixelShownParameters() @@ -267,7 +269,7 @@ class CtaTest { val existingJourney = "s:0-t:1" whenever(mockOnboardingStore.onboardingDialogJourney).thenReturn(existingJourney) whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) - val testee = DaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) + val testee = OnboardingDaxDialogCta.DaxSerpCta(mockOnboardingStore, mockAppInstallStore) val expectedValue = "$existingJourney-${testee.ctaPixelParam}:1" val value = testee.pixelShownParameters() @@ -282,8 +284,8 @@ class CtaTest { TestingEntity("Amazon", "Amazon", 9.0), ) - val testee = DaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers, "http://www.trackers.com") - val value = testee.getDaxText(mockActivity) + val testee = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers) + val value = testee.getTrackersDescription(mockActivity, trackers) assertEquals("Facebook, OtherwithMultiple", value) } @@ -295,8 +297,8 @@ class CtaTest { TestingEntity("Other", "Other", 9.0), ) - val testee = DaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers, "http://www.trackers.com") - val value = testee.getDaxText(mockActivity) + val testee = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers) + val value = testee.getTrackersDescription(mockActivity, trackers) assertEquals("Facebook, OtherwithZero", value) } @@ -326,13 +328,12 @@ class CtaTest { val site = site(events = trackers) val testee = - DaxDialogCta.DaxTrackersBlockedCta( + OnboardingDaxDialogCta.DaxTrackersBlockedCta( mockOnboardingStore, mockAppInstallStore, site.orderedTrackerBlockedEntities(), - "http://www.trackers.com", ) - val value = testee.getDaxText(mockActivity) + val value = testee.getTrackersDescription(mockActivity, site.orderedTrackerBlockedEntities()) assertEquals("Other, FacebookwithZero", value) } @@ -361,13 +362,12 @@ class CtaTest { ) val site = site(events = trackers) - val testee = DaxDialogCta.DaxTrackersBlockedCta( + val testee = OnboardingDaxDialogCta.DaxTrackersBlockedCta( mockOnboardingStore, mockAppInstallStore, site.orderedTrackerBlockedEntities(), - "http://www.trackers.com", ) - val value = testee.getDaxText(mockActivity) + val value = testee.getTrackersDescription(mockActivity, site.orderedTrackerBlockedEntities()) assertEquals("FacebookwithZero", value) } @@ -396,13 +396,12 @@ class CtaTest { ) val site = site(events = trackers) - val testee = DaxDialogCta.DaxTrackersBlockedCta( + val testee = OnboardingDaxDialogCta.DaxTrackersBlockedCta( mockOnboardingStore, mockAppInstallStore, site.orderedTrackerBlockedEntities(), - "http://www.trackers.com", ) - val value = testee.getDaxText(mockActivity) + val value = testee.getTrackersDescription(mockActivity, site.orderedTrackerBlockedEntities()) assertEquals("OtherwithZero", value) } @@ -415,8 +414,8 @@ class CtaTest { TestingEntity("Facebook", "Facebook", 9.0), ) - val testee = DaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers, "http://www.trackers.com") - val value = testee.getDaxText(mockActivity) + val testee = OnboardingDaxDialogCta.DaxTrackersBlockedCta(mockOnboardingStore, mockAppInstallStore, trackers) + val value = testee.getTrackersDescription(mockActivity, trackers) assertEquals("FacebookwithZero", value) } @@ -426,7 +425,7 @@ class CtaTest { val existingJourney = "s:0-t:1" whenever(mockOnboardingStore.onboardingDialogJourney).thenReturn(existingJourney) whenever(mockAppInstallStore.installTimestamp).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) - val testee = DaxFireDialogCta.TryClearDataCta(mockOnboardingStore, mockAppInstallStore) + val testee = OnboardingDaxDialogCta.DaxFireButtonCta(mockOnboardingStore, mockAppInstallStore) val expectedValue = "$existingJourney-${testee.ctaPixelParam}:1" val value = testee.pixelShownParameters() diff --git a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt index 595361186e68..fcc9c1bb38f4 100644 --- a/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt +++ b/app/src/test/java/com/duckduckgo/app/launch/LaunchViewModelTest.kt @@ -22,7 +22,6 @@ import com.duckduckgo.app.launch.LaunchViewModel.Command.Home import com.duckduckgo.app.launch.LaunchViewModel.Command.Onboarding import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.UserStageStore -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager import com.duckduckgo.app.referral.StubAppReferrerFoundStateListener import com.duckduckgo.common.test.CoroutineTestRule import kotlinx.coroutines.test.runTest @@ -45,7 +44,6 @@ class LaunchViewModelTest { private val userStageStore = mock() private val mockCommandObserver: Observer = mock() - private val mockExtendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager = mock() private lateinit var testee: LaunchViewModel @@ -59,7 +57,6 @@ class LaunchViewModelTest { testee = LaunchViewModel( userStageStore, StubAppReferrerFoundStateListener("xx"), - mockExtendedOnboardingExperimentVariantManager, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -74,7 +71,6 @@ class LaunchViewModelTest { testee = LaunchViewModel( userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = 1_000), - mockExtendedOnboardingExperimentVariantManager, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -89,7 +85,6 @@ class LaunchViewModelTest { testee = LaunchViewModel( userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), - mockExtendedOnboardingExperimentVariantManager, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.NEW) testee.command.observeForever(mockCommandObserver) @@ -101,7 +96,7 @@ class LaunchViewModelTest { @Test fun whenOnboardingShouldNotShowAndReferrerDataReturnsQuicklyThenCommandIsHome() = runTest { - testee = LaunchViewModel(userStageStore, StubAppReferrerFoundStateListener("xx"), mockExtendedOnboardingExperimentVariantManager) + testee = LaunchViewModel(userStageStore, StubAppReferrerFoundStateListener("xx")) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) testee.determineViewToShow() @@ -113,7 +108,6 @@ class LaunchViewModelTest { testee = LaunchViewModel( userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = 1_000), - mockExtendedOnboardingExperimentVariantManager, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) @@ -126,7 +120,6 @@ class LaunchViewModelTest { testee = LaunchViewModel( userStageStore, StubAppReferrerFoundStateListener("xx", mockDelayMs = Long.MAX_VALUE), - mockExtendedOnboardingExperimentVariantManager, ) whenever(userStageStore.getUserAppStage()).thenReturn(AppStage.DAX_ONBOARDING) testee.command.observeForever(mockCommandObserver) diff --git a/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerPageCountTest.kt b/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerPageCountTest.kt index fed05b13d554..5c24c75310ed 100644 --- a/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerPageCountTest.kt +++ b/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerPageCountTest.kt @@ -18,7 +18,6 @@ package com.duckduckgo.app.onboarding.ui import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector import com.duckduckgo.app.global.DefaultRoleBrowserDialog -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -34,7 +33,6 @@ class OnboardingPageManagerPageCountTest(private val testCase: TestCase) { private val onboardingPageBuilder: OnboardingPageBuilder = mock() private val mockDefaultBrowserDetector: DefaultBrowserDetector = mock() private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog = mock() - private val mockExtendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager = mock() @Before fun setup() { @@ -42,7 +40,6 @@ class OnboardingPageManagerPageCountTest(private val testCase: TestCase) { defaultRoleBrowserDialog, onboardingPageBuilder, mockDefaultBrowserDetector, - mockExtendedOnboardingExperimentVariantManager, ) } diff --git a/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerTest.kt b/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerTest.kt index f0e497f1f418..c7df015bd0ad 100644 --- a/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerTest.kt +++ b/app/src/test/java/com/duckduckgo/app/onboarding/ui/OnboardingPageManagerTest.kt @@ -18,7 +18,6 @@ package com.duckduckgo.app.onboarding.ui import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector import com.duckduckgo.app.global.DefaultRoleBrowserDialog -import com.duckduckgo.app.onboarding.ui.page.experiment.ExtendedOnboardingExperimentVariantManager import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -31,16 +30,13 @@ class OnboardingPageManagerTest { private val onboardingPageBuilder: OnboardingPageBuilder = mock() private val mockDefaultBrowserDetector: DefaultBrowserDetector = mock() private val defaultRoleBrowserDialog: DefaultRoleBrowserDialog = mock() - private val mockExtendedOnboardingExperimentVariantManager: ExtendedOnboardingExperimentVariantManager = mock() @Before fun setup() { - whenever(mockExtendedOnboardingExperimentVariantManager.isComparisonChartEnabled()).thenReturn(false) testee = OnboardingPageManagerWithTrackerBlocking( defaultRoleBrowserDialog, onboardingPageBuilder, mockDefaultBrowserDetector, - mockExtendedOnboardingExperimentVariantManager, ) } diff --git a/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt b/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt index 5e2f08c9067f..1ad68876a795 100644 --- a/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt +++ b/app/src/test/java/com/duckduckgo/app/onboarding/ui/page/WelcomePageViewModelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 DuckDuckGo + * Copyright (c) 2024 DuckDuckGo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,136 +16,172 @@ package com.duckduckgo.app.onboarding.ui.page +import android.content.Context import android.content.Intent -import androidx.arch.core.executor.testing.InstantTaskExecutorRule import app.cash.turbine.test import com.duckduckgo.app.global.DefaultRoleBrowserDialog import com.duckduckgo.app.global.install.AppInstallStore +import com.duckduckgo.app.onboarding.ui.page.WelcomePage.Companion.PreOnboardingDialogType +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.Finish +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowComparisonChart +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowDefaultBrowserDialog +import com.duckduckgo.app.onboarding.ui.page.WelcomePageViewModel.Command.ShowSuccessDialog +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.common.test.CoroutineTestRule -import kotlin.time.ExperimentalTime -import kotlinx.coroutines.ObsoleteCoroutinesApi -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertTrue -import org.junit.Before +import org.junit.Assert import org.junit.Rule import org.junit.Test -import org.mockito.Mock -import org.mockito.MockitoAnnotations -import org.mockito.kotlin.any import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -@ObsoleteCoroutinesApi -@ExperimentalTime class WelcomePageViewModelTest { - @get:Rule - var instantTaskExecutorRule = InstantTaskExecutorRule() - @get:Rule @Suppress("unused") val coroutineRule = CoroutineTestRule() - @Mock - private lateinit var pixel: Pixel + private val mockDefaultRoleBrowserDialog: DefaultRoleBrowserDialog = mock() + private val mockContext: Context = mock() + private val mockPixel: Pixel = mock() + private val mockAppInstallStore: AppInstallStore = mock() + + private val testee: WelcomePageViewModel by lazy { + WelcomePageViewModel( + mockDefaultRoleBrowserDialog, + mockContext, + mockPixel, + mockAppInstallStore, + ) + } + + @Test + fun whenInitialDialogIsShownThenSendPixel() { + testee.onDialogShown(PreOnboardingDialogType.INITIAL) - @Mock - private lateinit var appInstallStore: AppInstallStore + verify(mockPixel).fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_INTRO_SHOWN) + } - @Mock - private lateinit var defaultRoleBrowserDialog: DefaultRoleBrowserDialog + @Test + fun whenComparisonChartDialogIsShownThenSendPixel() { + testee.onDialogShown(PreOnboardingDialogType.COMPARISON_CHART) - private val events = MutableSharedFlow(replay = 1) + verify(mockPixel).fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_COMPARISON_CHART_SHOWN) + } - private lateinit var viewModel: WelcomePageViewModel + @Test + fun whenAffirmationDialogIsShownThenSendPixel() { + testee.onDialogShown(PreOnboardingDialogType.CELEBRATION) - private lateinit var viewEvents: Flow + verify(mockPixel).fire(OnboardingExperimentPixel.PixelName.PREONBOARDING_AFFIRMATION_SHOWN) + } - @Before - fun setup() { - MockitoAnnotations.openMocks(this) - viewModel = WelcomePageViewModel( - appInstallStore = appInstallStore, - context = mock(), - pixel = pixel, - defaultRoleBrowserDialog = defaultRoleBrowserDialog, - ) + @Test + fun whenNotificationsRuntimePermissionsAreRequestedSendPixel() { + testee.notificationRuntimePermissionRequested() - viewEvents = events.flatMapLatest { viewModel.reduce(it) } + verify(mockPixel).fire(OnboardingExperimentPixel.PixelName.NOTIFICATION_RUNTIME_PERMISSION_SHOWN) } @Test - fun whenOnPrimaryCtaClickedAndShouldNotShowDialogThenFireAndFinish() = runTest { - whenever(defaultRoleBrowserDialog.shouldShowDialog()).thenReturn(false) + fun whenNotificationsRuntimePermissionsAreGrantedThenSendPixel() { + testee.notificationRuntimePermissionGranted() - events.emit(WelcomePageView.Event.OnPrimaryCtaClicked) + verify(mockPixel).fire( + AppPixelName.NOTIFICATIONS_ENABLED, + mapOf(OnboardingExperimentPixel.PixelParameter.FROM_ONBOARDING to true.toString()), + ) + } - viewEvents.test { - assertTrue(awaitItem() == WelcomePageView.State.Finish) + @Test + fun givenInitialDialogWhenOnPrimaryCtaClickedThenShowComparisonChart() = runTest { + testee.onPrimaryCtaClicked(PreOnboardingDialogType.INITIAL) + + testee.commands.test { + val command = awaitItem() + Assert.assertTrue(command is ShowComparisonChart) } } @Test - fun whenOnPrimaryCtaClickedAndShouldShowDialogAndShowThenFireAndEmitShowDialog() = runTest { - whenever(defaultRoleBrowserDialog.shouldShowDialog()).thenReturn(true) - val intent = Intent() - whenever(defaultRoleBrowserDialog.createIntent(any())).thenReturn(intent) + fun givenComparisonChartDialogWhenOnPrimaryCtaClickedThenSendPixel() { + whenever(mockDefaultRoleBrowserDialog.shouldShowDialog()).thenReturn(true) + testee.onPrimaryCtaClicked(PreOnboardingDialogType.COMPARISON_CHART) - events.emit(WelcomePageView.Event.OnPrimaryCtaClicked) + verify(mockPixel).fire( + OnboardingExperimentPixel.PixelName.PREONBOARDING_CHOOSE_BROWSER_PRESSED, + mapOf(OnboardingExperimentPixel.PixelParameter.DEFAULT_BROWSER to "false"), + ) + } - viewEvents.test { - assertTrue(awaitItem() == WelcomePageView.State.ShowDefaultBrowserDialog(intent)) + @Test + fun whenChooseBrowserClickedIfDDGNotSetAsDefaultThenShowChooseBrowserDialog() = runTest { + val mockIntent: Intent = mock() + whenever(mockDefaultRoleBrowserDialog.createIntent(mockContext)).thenReturn(mockIntent) + whenever(mockDefaultRoleBrowserDialog.shouldShowDialog()).thenReturn(true) + testee.onPrimaryCtaClicked(PreOnboardingDialogType.COMPARISON_CHART) + + testee.commands.test { + val command = awaitItem() + Assert.assertTrue(command is ShowDefaultBrowserDialog) } } @Test - fun whenOnPrimaryCtaClickedAndShouldShowDialogNullIntentThenFireAndFinish() = runTest { - whenever(defaultRoleBrowserDialog.shouldShowDialog()).thenReturn(true) - whenever(defaultRoleBrowserDialog.createIntent(any())).thenReturn(null) + fun whenChooseBrowserClickedIfDDGSetAsDefaultThenFinishFlow() = runTest { + whenever(mockDefaultRoleBrowserDialog.shouldShowDialog()).thenReturn(false) + testee.onPrimaryCtaClicked(PreOnboardingDialogType.COMPARISON_CHART) - events.emit(WelcomePageView.Event.OnPrimaryCtaClicked) - - viewEvents.test { - assertTrue(awaitItem() == WelcomePageView.State.Finish) - verify(pixel).fire(AppPixelName.DEFAULT_BROWSER_DIALOG_NOT_SHOWN) + testee.commands.test { + val command = awaitItem() + Assert.assertTrue(command is Finish) } } @Test - fun whenOnDefaultBrowserSetThenCallDialogShownFireAndFinish() = runTest { - events.emit(WelcomePageView.Event.OnDefaultBrowserSet) - - viewEvents.test { - assertTrue(awaitItem() == WelcomePageView.State.Finish) - verify(defaultRoleBrowserDialog).dialogShown() - verify(pixel).fire( - AppPixelName.DEFAULT_BROWSER_SET, - mapOf( - Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString(), - ), - ) + fun whenDDGIsNOTSetAsDefaultBrowserFromSystemDialogThenSetPreferenceAndSendPixel() { + testee.onDefaultBrowserNotSet() + + verify(mockDefaultRoleBrowserDialog).dialogShown() + verify(mockAppInstallStore).defaultBrowser = false + verify(mockPixel).fire( + AppPixelName.DEFAULT_BROWSER_NOT_SET, + mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString()), + ) + } + + @Test + fun whenDDGIsSetAsDefaultBrowserFromSystemDialogThenSetPreferenceAndSendPixel() { + testee.onDefaultBrowserSet() + + verify(mockDefaultRoleBrowserDialog).dialogShown() + verify(mockAppInstallStore).defaultBrowser = true + verify(mockPixel).fire( + AppPixelName.DEFAULT_BROWSER_SET, + mapOf(Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString()), + ) + } + + @Test + fun whenDDGIsSetAsDefaultBrowserFromOnboardingThenShowCelebrationScreen() = runTest { + testee.onDefaultBrowserSet() + + testee.commands.test { + val command = awaitItem() + Assert.assertTrue(command is ShowSuccessDialog) } } @Test - fun whenOnDefaultBrowserNotSetThenCallDialogShownFireAndFinish() = runTest { - events.emit(WelcomePageView.Event.OnDefaultBrowserNotSet) - - viewEvents.test { - assertTrue(awaitItem() == WelcomePageView.State.Finish) - verify(defaultRoleBrowserDialog).dialogShown() - verify(pixel).fire( - AppPixelName.DEFAULT_BROWSER_NOT_SET, - mapOf( - Pixel.PixelParameter.DEFAULT_BROWSER_SET_FROM_ONBOARDING to true.toString(), - ), - ) + fun givenCelebrationDialogWhenOnPrimaryCtaClickedThenFinishFlow() = runTest { + testee.onPrimaryCtaClicked(PreOnboardingDialogType.CELEBRATION) + + testee.commands.test { + val command = awaitItem() + Assert.assertTrue(command is Finish) } } } diff --git a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/DaxBubbleCardView.kt b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/DaxBubbleCardView.kt index 1a69d7b6d770..10d4cd465c9d 100644 --- a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/DaxBubbleCardView.kt +++ b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/DaxBubbleCardView.kt @@ -33,15 +33,42 @@ constructor( ) : MaterialCardView(context, attrs, defStyleAttr) { init { + val attr = context.theme.obtainStyledAttributes(attrs, R.styleable.DaxBubbleCardView, defStyleAttr, 0) + val edgePosition = EdgePosition.from(attr.getInt(R.styleable.DaxBubbleCardView_edgePosition, 0)) + val cornderRadius = resources.getDimension(R.dimen.mediumShapeCornerRadius) val cornerSize = resources.getDimension(R.dimen.daxBubbleDialogEdge) val distanceFromEdge = resources.getDimension(R.dimen.daxBubbleDialogDistanceFromEdge) - val edgeTreatment = DaxBubbleEdgeTreatment(cornerSize, distanceFromEdge) + val edgeTreatment = DaxBubbleEdgeTreatment(cornerSize, distanceFromEdge, edgePosition) setCardBackgroundColor(ColorStateList.valueOf(context.getColorFromAttr(R.attr.daxColorSurface))) - shapeAppearanceModel = ShapeAppearanceModel.builder() - .setAllCornerSizes(cornderRadius) - .setTopEdge(edgeTreatment) - .build() + + shapeAppearanceModel = when (edgePosition) { + EdgePosition.TOP -> ShapeAppearanceModel.builder() + .setAllCornerSizes(cornderRadius) + .setTopEdge(edgeTreatment) + .build() + + EdgePosition.LEFT -> ShapeAppearanceModel.builder() + .setAllCornerSizes(cornderRadius) + .setLeftEdge(edgeTreatment) + .build() + } + } + + enum class EdgePosition { + TOP, + LEFT, + ; + + companion object { + fun from(value: Int): EdgePosition { + // same order as attrs-dax-dialog.xml + return when (value) { + 1 -> LEFT + else -> TOP + } + } + } } } diff --git a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/Shapes.kt b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/Shapes.kt index 75c33fea4253..370961c9e7b5 100644 --- a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/Shapes.kt +++ b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/shape/Shapes.kt @@ -16,6 +16,7 @@ package com.duckduckgo.common.ui.view.shape +import com.duckduckgo.common.ui.view.shape.DaxBubbleCardView.EdgePosition import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.EdgeTreatment import com.google.android.material.shape.MaterialShapeDrawable @@ -31,9 +32,12 @@ class DaxBubbleEdgeTreatment * of the side of the triangle coincident with the rest of the edge is 2 * size. * @param inside true if the triangle should be "cut out" of the shape (i.e. inward-facing); false * if the triangle should extend out of the shape. + * @param edgePosition TOP for positioning triangle on the top side of the dialog; LEFT for + * positioning triangle on the left side of the dialog */( private val size: Float, private val distanceFromEdge: Float, + private val edgePosition: EdgePosition = EdgePosition.TOP, ) : EdgeTreatment() { override fun getEdgePath( length: Float, @@ -41,10 +45,22 @@ class DaxBubbleEdgeTreatment interpolation: Float, shapePath: ShapePath, ) { - shapePath.lineTo(distanceFromEdge - size * interpolation, 0f) - shapePath.lineTo(distanceFromEdge, -size * interpolation) - shapePath.lineTo(distanceFromEdge + size * interpolation, 0f) - shapePath.lineTo(length, 0f) + when (edgePosition) { + EdgePosition.TOP -> { + shapePath.lineTo(distanceFromEdge - size * interpolation, 0f) + shapePath.lineTo(distanceFromEdge, -size * interpolation) + shapePath.lineTo(distanceFromEdge + size * interpolation, 0f) + shapePath.lineTo(length, 0f) + } + + EdgePosition.LEFT -> { + val d = length - distanceFromEdge + shapePath.lineTo(d - size * interpolation, 0f) + shapePath.lineTo(d, -size * interpolation) + shapePath.lineTo(d + size * interpolation, 0f) + shapePath.lineTo(length, 0f) + } + } } } diff --git a/app/src/main/res/drawable-w600dp/onboarding_background.xml b/common/common-ui/src/main/res/values/attrs-dax-dialog.xml similarity index 58% rename from app/src/main/res/drawable-w600dp/onboarding_background.xml rename to common/common-ui/src/main/res/values/attrs-dax-dialog.xml index c0e7b377b464..1b6e9b2335fa 100644 --- a/app/src/main/res/drawable-w600dp/onboarding_background.xml +++ b/common/common-ui/src/main/res/values/attrs-dax-dialog.xml @@ -1,6 +1,5 @@ - - - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file From ed999f27210085e8b31bdbdd2d51d9e174551386 Mon Sep 17 00:00:00 2001 From: Josh Leibstein Date: Fri, 31 May 2024 17:27:07 +0100 Subject: [PATCH 08/12] Adapt autocomplete item to system font size (#4588) --- app/src/main/res/layout/item_autocomplete_search_suggestion.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_autocomplete_search_suggestion.xml b/app/src/main/res/layout/item_autocomplete_search_suggestion.xml index 54230ac18fd5..d626eecde7a9 100644 --- a/app/src/main/res/layout/item_autocomplete_search_suggestion.xml +++ b/app/src/main/res/layout/item_autocomplete_search_suggestion.xml @@ -41,7 +41,7 @@ Date: Mon, 3 Jun 2024 11:50:26 +0100 Subject: [PATCH 09/12] Search and Site suggestions localisation (#4604) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/1201807753394693/1207407312592957/f ### Description Localised search and site suggestions in onboarding ### Steps to test this PR _**en_US**_ _Search Suggestions_ - Fresh install - Once in the browser, check search suggestions: - [x] Option 1 -> `how to say “duck” in spanish` - [x] Option 2 -> `mighty ducks cast` - [x] Option 3 -> `local weather` - [x] Option 4 -> `Surprise me!` - Tap on option 4: Surprise me - [x] Check it goes to `chocolate chip cookie recipes` search _Site Suggestions_ - Open a new tab - Check site suggestions: - [x] Option 1 -> `espn.com` - [x] Option 2 -> `yahoo.com` - [x] Option 3 -> `ebay.com` - [x] Option 4 -> `Surprise me!` - Tap on option 4: Surprise me - [x] Check it goes to [britannica.com/animal/duck](https://britannica.com/animal/duck) site _**en_GB**_ _Search Suggestions_ - Fresh install - Once in the browser, check search suggestions: - [x] Option 1 -> `how to say “duck” in spanish` - [x] Option 2 -> `cast of avatar` - [x] Option 3 -> `local weather` - [x] Option 4 -> `Surprise me!` - Tap on option 4: Surprise me - [x] Check it goes to `dinner recipes` search _Site Suggestions_ - Open a new tab - Check site suggestions: - [x] Option 1 -> `skysports.com` - [x] Option 2 -> `bbc.co.uk` - [x] Option 3 -> `ebay.com` - [x] Option 4 -> `Surprise me!` - Tap on option 4: Surprise me - [x] Check it goes to [britannica.com/animal/duck](https://britannica.com/animal/duck) site _**de_DE**_ _Search Suggestions_ - Fresh install - Once in the browser, check search suggestions: - [x] Option 1 -> `wie sagt man „Ente“ auf Englisch` - [x] Option 2 -> `Besetzung von Avatar` - [x] Option 3 -> `Lokales Wetter` - [x] Option 4 -> `Überrasche mich!` - Tap on option 4: Überrasche mich! - [x] Check it goes to `Dinner-Rezepte` search _Site Suggestions_ - Open a new tab - Check site suggestions: - [x] Option 1 -> `kicker.de` - [x] Option 2 -> `tagesschau.de` - [x] Option 3 -> `ebay.com` - [x] Option 4 -> `Überrasche mich!` - Tap on option 4: Überrasche mich! - [x] Check it goes to [https://www.duden.de/rechtschreibung/Ente](https://www.duden.de/rechtschreibung/Ente) site ### No UI changes --- .../app/browser/BrowserTabViewModelTest.kt | 11 -- .../app/browser/BrowserTabViewModel.kt | 5 +- .../java/com/duckduckgo/app/cta/ui/Cta.kt | 70 +------ .../com/duckduckgo/app/cta/ui/CtaViewModel.kt | 4 + .../java/com/duckduckgo/app/di/StoreModule.kt | 4 +- .../store/OnboardingSharedPreferences.kt | 36 ---- .../app/onboarding/store/OnboardingStore.kt | 4 + .../onboarding/store/OnboardingStoreImpl.kt | 181 ++++++++++++++++++ 8 files changed, 199 insertions(+), 116 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingSharedPreferences.kt create mode 100644 app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStoreImpl.kt diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt index 770ab00cb3c9..fc044cb3e26c 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -5320,17 +5320,6 @@ class BrowserTabViewModelTest { verify(mockPixel).fire(OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_CUSTOM) } - @Test - fun givenSuggestedSearchesDialogShownWhenUserSubmittedQueryDifferentFromOptionsThenPixelIsNotSent() { - whenever(mockOmnibarConverter.convertQueryToUrl("mighty ducks cast", null)).thenReturn("mighty ducks cast") - val cta = DaxBubbleCta.DaxIntroSearchOptionsCta(mockOnboardingStore, mockAppInstallStore) - testee.ctaViewState.value = CtaViewState(cta = cta) - - testee.onUserSubmittedQuery("mighty ducks cast") - - verify(mockPixel, never()).fire(OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_CUSTOM) - } - @Test fun givenSuggestedSitesDialogShownWhenUserSubmittedQueryThenCustomSitePixelIsSent() { whenever(mockOmnibarConverter.convertQueryToUrl("foo", null)).thenReturn("foo.com") diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index b0c77705e268..5fd6541deefe 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -103,7 +103,6 @@ import com.duckduckgo.app.browser.viewstate.PrivacyShieldViewState import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState import com.duckduckgo.app.browser.webview.SslWarningLayout.Action import com.duckduckgo.app.cta.ui.* -import com.duckduckgo.app.cta.ui.DaxBubbleCta.DaxDialogIntroOption import com.duckduckgo.app.cta.ui.OnboardingDaxDialogCta import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity @@ -725,7 +724,7 @@ class BrowserTabViewModel @Inject constructor( when (currentCtaViewState().cta) { is DaxBubbleCta.DaxIntroSearchOptionsCta -> { - if (!DaxDialogIntroOption.getSearchOptions().map { it.link }.contains(query)) { + if (!ctaViewModel.isSuggestedSearchOption(query)) { pixel.fire(OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_CUSTOM) } } @@ -733,7 +732,7 @@ class BrowserTabViewModel @Inject constructor( is DaxBubbleCta.DaxIntroVisitSiteOptionsCta, is OnboardingDaxDialogCta.DaxSiteSuggestionsCta, -> { - if (!DaxDialogIntroOption.getSitesOptions().map { it.link }.contains(query)) { + if (!ctaViewModel.isSuggestedSiteOption(query)) { pixel.fire(OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_CUSTOM) } } diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt index 2846bbe8cbd8..f19606264a32 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt @@ -368,7 +368,7 @@ sealed class OnboardingDaxDialogCta( ) optionsViews.forEachIndexed { index, buttonView -> - val options = DaxDialogIntroOption.getSitesOptions() + val options = onboardingStore.getSitesOptions() options[index].setOptionView(buttonView) ViewCompat.animate(buttonView).alpha(MAX_ALPHA).duration = DAX_DIALOG_APPEARANCE_ANIMATION } @@ -379,7 +379,7 @@ sealed class OnboardingDaxDialogCta( daxDialog: IncludeOnboardingViewDaxDialogBinding, onOptionClicked: (DaxDialogIntroOption) -> Unit, ) { - val options = DaxDialogIntroOption.getSitesOptions() + val options = onboardingStore.getSitesOptions() daxDialog.daxDialogOption1.setOnClickListener { onOptionClicked.invoke(options[0]) } daxDialog.daxDialogOption2.setOnClickListener { onOptionClicked.invoke(options[1]) } daxDialog.daxDialogOption3.setOnClickListener { onOptionClicked.invoke(options[2]) } @@ -477,7 +477,7 @@ sealed class DaxBubbleCta( CtaId.DAX_INTRO, R.string.onboardingSearchDaxDialogTitle, R.string.onboardingSearchDaxDialogDescription, - DaxDialogIntroOption.getSearchOptions(), + onboardingStore.getSearchOptions(), AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -493,7 +493,7 @@ sealed class DaxBubbleCta( CtaId.DAX_INTRO_VISIT_SITE, R.string.onboardingSitesDaxDialogTitle, R.string.onboardingSitesDaxDialogDescription, - DaxDialogIntroOption.getSitesOptions(), + onboardingStore.getSitesOptions(), AppPixelName.ONBOARDING_DAX_CTA_SHOWN, AppPixelName.ONBOARDING_DAX_CTA_OK_BUTTON, null, @@ -519,75 +519,17 @@ sealed class DaxBubbleCta( ) data class DaxDialogIntroOption( - @StringRes val textRes: Int, + val optionText: String, @DrawableRes val iconRes: Int, val link: String, val pixel: PixelName, ) { fun setOptionView(buttonView: DaxButton) { buttonView.apply { - text = this.context.getString(textRes) + text = optionText icon = ContextCompat.getDrawable(this.context, iconRes) } } - - companion object { - fun getSearchOptions(): List = - listOf( - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption1, - com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, - "how to say duck in spanish", - PixelName.ONBOARDING_SEARCH_SAY_DUCK, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption2, - com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, - "mighty ducks cast", - PixelName.ONBOARDING_SEARCH_MIGHTY_DUCK, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption3, - com.duckduckgo.mobile.android.R.drawable.ic_find_search_16, - "local weather", - PixelName.ONBOARDING_SEARCH_WEATHER, - ), - DaxDialogIntroOption( - R.string.onboardingSearchDaxDialogOption4, - com.duckduckgo.mobile.android.R.drawable.ic_wand_16, - "chocolate chip cookie recipes", - PixelName.ONBOARDING_SEARCH_SURPRISE_ME, - ), - ) - - fun getSitesOptions(): List = - listOf( - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption1, - com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, - "espn.com", - PixelName.ONBOARDING_VISIT_SITE_ESPN, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption2, - com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, - "yahoo.com", - PixelName.ONBOARDING_VISIT_SITE_YAHOO, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption3, - com.duckduckgo.mobile.android.R.drawable.ic_globe_gray_16dp, - "ebay.com", - PixelName.ONBOARDING_VISIT_SITE_EBAY, - ), - DaxDialogIntroOption( - R.string.onboardingSitesDaxDialogOption4, - com.duckduckgo.mobile.android.R.drawable.ic_wand_16, - "britannica.com/animal/duck", - PixelName.ONBOARDING_VISIT_SITE_SURPRISE_ME, - ), - ) - } } } diff --git a/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt b/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt index cc3ebf6a88ec..53e71d1c4d58 100644 --- a/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/cta/ui/CtaViewModel.kt @@ -374,6 +374,10 @@ class CtaViewModel @Inject constructor( @Deprecated("New users won't have this option available since extended onboarding") private fun hideTips() = settingsDataStore.hideTips + fun isSuggestedSearchOption(query: String): Boolean = onboardingStore.getSearchOptions().map { it.link }.contains(query) + + fun isSuggestedSiteOption(query: String): Boolean = onboardingStore.getSitesOptions().map { it.link }.contains(query) + companion object { private const val MAX_TABS_OPEN_FIRE_EDUCATION = 2 } diff --git a/app/src/main/java/com/duckduckgo/app/di/StoreModule.kt b/app/src/main/java/com/duckduckgo/app/di/StoreModule.kt index ee496688f270..8c503d432702 100644 --- a/app/src/main/java/com/duckduckgo/app/di/StoreModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/StoreModule.kt @@ -24,8 +24,8 @@ import com.duckduckgo.app.global.install.AppInstallSharedPreferences import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver import com.duckduckgo.app.onboarding.store.AppUserStageStore -import com.duckduckgo.app.onboarding.store.OnboardingSharedPreferences import com.duckduckgo.app.onboarding.store.OnboardingStore +import com.duckduckgo.app.onboarding.store.OnboardingStoreImpl import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.statistics.store.StatisticsDataStore import com.duckduckgo.app.statistics.store.StatisticsSharedPreferences @@ -51,7 +51,7 @@ abstract class StoreModule { abstract fun bindThemingStore(themeDataStore: ThemingSharedPreferences): ThemingDataStore @Binds - abstract fun bindOnboardingStore(onboardingStore: OnboardingSharedPreferences): OnboardingStore + abstract fun bindOnboardingStore(onboardingStore: OnboardingStoreImpl): OnboardingStore @Binds abstract fun bindTabRepository(tabRepository: TabDataRepository): TabRepository diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingSharedPreferences.kt b/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingSharedPreferences.kt deleted file mode 100644 index 418c9ce543ee..000000000000 --- a/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingSharedPreferences.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2018 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.app.onboarding.store - -import android.content.Context -import android.content.SharedPreferences -import androidx.core.content.edit -import javax.inject.Inject - -class OnboardingSharedPreferences @Inject constructor(private val context: Context) : OnboardingStore { - - override var onboardingDialogJourney: String? - get() = preferences.getString(ONBOARDING_JOURNEY, null) - set(dialogJourney) = preferences.edit { putString(ONBOARDING_JOURNEY, dialogJourney) } - - private val preferences: SharedPreferences by lazy { context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE) } - - companion object { - const val FILENAME = "com.duckduckgo.app.onboarding.settings" - const val ONBOARDING_JOURNEY = "onboardingJourney" - } -} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStore.kt b/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStore.kt index a47413af77cb..70db74af85d1 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStore.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStore.kt @@ -16,6 +16,10 @@ package com.duckduckgo.app.onboarding.store +import com.duckduckgo.app.cta.ui.DaxBubbleCta.DaxDialogIntroOption + interface OnboardingStore { var onboardingDialogJourney: String? + fun getSearchOptions(): List + fun getSitesOptions(): List } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStoreImpl.kt b/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStoreImpl.kt new file mode 100644 index 000000000000..98628f7b3ab2 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/onboarding/store/OnboardingStoreImpl.kt @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018 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.app.onboarding.store + +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import com.duckduckgo.app.browser.R +import com.duckduckgo.app.cta.ui.DaxBubbleCta.DaxDialogIntroOption +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_MIGHTY_DUCK +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_SAY_DUCK +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_SURPRISE_ME +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_SEARCH_WEATHER +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_EBAY +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_ESPN +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_SURPRISE_ME +import com.duckduckgo.app.onboarding.ui.page.extendedonboarding.OnboardingExperimentPixel.PixelName.ONBOARDING_VISIT_SITE_YAHOO +import com.duckduckgo.mobile.android.R.drawable +import java.util.Locale +import javax.inject.Inject + +class OnboardingStoreImpl @Inject constructor(private val context: Context) : OnboardingStore { + + private val preferences: SharedPreferences by lazy { context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE) } + + override var onboardingDialogJourney: String? + get() = preferences.getString(ONBOARDING_JOURNEY, null) + set(dialogJourney) = preferences.edit { putString(ONBOARDING_JOURNEY, dialogJourney) } + + override fun getSearchOptions(): List { + val country = Locale.getDefault().country + val language = Locale.getDefault().language + + return listOf( + DaxDialogIntroOption( + optionText = if (language == "en") { + context.getString(R.string.onboardingSearchDaxDialogOption1English) + } else { + context.getString(R.string.onboardingSearchDaxDialogOption1) + }, + iconRes = drawable.ic_find_search_16, + link = if (language == "en") "how to say duck in spanish" else context.getString(R.string.onboardingSearchQueryOption1), + pixel = ONBOARDING_SEARCH_SAY_DUCK, + ), + DaxDialogIntroOption( + optionText = if (country == "US") "mighty ducks cast" else context.getString(R.string.onboardingSearchDaxDialogOption2), + iconRes = drawable.ic_find_search_16, + link = if (country == "US") "mighty ducks cast" else context.getString(R.string.onboardingSearchDaxDialogOption2), + pixel = ONBOARDING_SEARCH_MIGHTY_DUCK, + ), + DaxDialogIntroOption( + optionText = context.getString(R.string.onboardingSearchDaxDialogOption3), + iconRes = drawable.ic_find_search_16, + link = context.getString(R.string.onboardingSearchDaxDialogOption3), + pixel = ONBOARDING_SEARCH_WEATHER, + ), + DaxDialogIntroOption( + optionText = context.getString(R.string.onboardingSearchDaxDialogOption4), + iconRes = drawable.ic_wand_16, + link = if (country == "US") "chocolate chip cookie recipes" else context.getString(R.string.onboardingSearchQueryOption4), + pixel = ONBOARDING_SEARCH_SURPRISE_ME, + ), + ) + } + + override fun getSitesOptions(): List { + val site1: String + val site2: String + val site3: String + val site4Query: String + when (Locale.getDefault().country) { + "ID" -> { + site1 = "bolasport.com " + site2 = "kompas.com" + site3 = "tokopedia.com" + site4Query = "britannica.com/animal/duck" + } + + "GB" -> { + site1 = "skysports.com " + site2 = "bbc.co.uk" + site3 = "ebay.com" + site4Query = "britannica.com/animal/duck" + } + + "DE" -> { + site1 = "kicker.de" + site2 = "tagesschau.de" + site3 = "ebay.com" + site4Query = "duden.de/rechtschreibung/Ente" + } + + "CA" -> { + site1 = "tsn.ca" + site2 = "cbc.ca" + site3 = "canadiantire.ca" + site4Query = "britannica.com/animal/duck" + } + + "NL" -> { + site1 = "voetbalprimeur.nl" + site2 = "nu.nl" + site3 = "bol.com" + site4Query = "woorden.org/woord/eend" + } + + "AU" -> { + site1 = "afl.com.au" + site2 = "abc.net.au" + site3 = "ebay.com" + site4Query = "britannica.com/animal/duck" + } + + "SE" -> { + site1 = "svenskafans.com" + site2 = "dn.se" + site3 = "tradera.com" + site4Query = "synonymer.se/sv-syn/anka" + } + + "IE" -> { + site1 = "skysports.com" + site2 = "bbc.co.uk " + site3 = "ebay.com" + site4Query = "britannica.com/animal/duck" + } + + else -> { + site1 = "espn.com" + site2 = "yahoo.com" + site3 = "ebay.com" + site4Query = "britannica.com/animal/duck" + } + } + return listOf( + DaxDialogIntroOption( + optionText = site1, + iconRes = drawable.ic_globe_gray_16dp, + link = site1, + pixel = ONBOARDING_VISIT_SITE_ESPN, + ), + DaxDialogIntroOption( + optionText = site2, + iconRes = drawable.ic_globe_gray_16dp, + link = site2, + pixel = ONBOARDING_VISIT_SITE_YAHOO, + ), + DaxDialogIntroOption( + optionText = site3, + iconRes = drawable.ic_globe_gray_16dp, + link = site3, + pixel = ONBOARDING_VISIT_SITE_EBAY, + ), + DaxDialogIntroOption( + optionText = context.getString(R.string.onboardingSitesDaxDialogOption4), + iconRes = drawable.ic_wand_16, + link = site4Query, + pixel = ONBOARDING_VISIT_SITE_SURPRISE_ME, + ), + ) + } + + companion object { + const val FILENAME = "com.duckduckgo.app.onboarding.settings" + const val ONBOARDING_JOURNEY = "onboardingJourney" + } +} From 9046e953624bc62c16183910f840af54061bf773 Mon Sep 17 00:00:00 2001 From: Noelia Alcala Date: Mon, 3 Jun 2024 12:28:39 +0100 Subject: [PATCH 10/12] Fix onboarding dialog when onBackPressed() (#4606) Task/Issue URL: https://app.asana.com/0/488551667048375/1207453843423106/f ### Description Hide onboarding dialog when back pressed ### Steps to test this PR - [x] Fresh install - [x] Go to browser - [x] Navigate to a site - [x] Check onboarding dialog appears - [x] Go back - [x] Check dialog is gone - [x] Go forward - [x] Check dialog works as expected ### No UI changes --- .../main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 883efc1fd1c6..227f232df83a 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -3927,6 +3927,8 @@ class BrowserTabFragment : private fun hideDaxCta() { daxDialogCta.dialogTextCta.cancelAnimation() daxDialogCta.daxCtaContainer.hide() + daxDialogOnboardingCta.dialogTextCta.cancelAnimation() + daxDialogOnboardingCta.daxCtaContainer.gone() } private fun hideHomeCta() { From 2096b44807dbc2532155685c27f838abfe40a00e Mon Sep 17 00:00:00 2001 From: Noelia Alcala Date: Tue, 4 Jun 2024 00:08:05 +0100 Subject: [PATCH 11/12] Onboarding maestro tests updated (#4607) Task/Issue URL: https://app.asana.com/0/1201807753394693/1207385761777710/f ### Description Update maestro tests with new onboarding ### Steps to test this PR _[Optional]_ - [ ] Run maestro tests ### No UI changes --- ...ovided_but_incorrect_(dsl_not_needed).yaml | 10 +++++----- ...domain_(i.e.,_abcedf)_(u3_not_needed).yaml | 10 +++++----- ...main_(i.e.,_abcedf)__(dsl_not_needed).yaml | 10 +++++----- ....search-company-site)_(u3_not_needed).yaml | 10 +++++----- ...earch-company-site)__(dsl_not_needed).yaml | 10 +++++----- ...no_ad_domain_param;_u3_param_included.yaml | 12 ++++++------ ...o_ad_domain_param;_dsl_param_included.yaml | 10 +++++----- ...ad_domain_param,_but_missing_u3_param.yaml | 10 +++++----- ...d_domain_param,_but_missing_dsl_param.yaml | 10 +++++----- ...n_provided,_but_empty_(u3_not_needed).yaml | 10 +++++----- ..._provided,_but_empty_(dsl_not_needed).yaml | 8 +------- ...d;_ad_domain_provided_(u3_not_needed).yaml | 10 +++++----- ...;_ad_domain_provided_(dsl_not_needed).yaml | 10 +++++----- ...rovided_but_incorrect_(u3_not_needed).yaml | 10 +++++----- .../1-_design-system-components.yaml | 2 +- .../custom_tabs/custom_tabs_navigation.yaml | 8 ++++++-- .../custom_tabs_navigation_new_tab.yaml | 8 ++++++-- .../fire_button/fire_during_onboarding.yaml | 6 +++--- .../1_-_permissions_allowed.yaml | 11 +++++++---- .../2_-_permissions_denied.yaml | 19 +++++++++++-------- ...,_utm_source_and_1_standard_parameter.yaml | 6 ------ ...Parameters,_utm_source_and_utm_medium.yaml | 6 ------ ...d,_fb_source_and_1_standard_parameter.yaml | 6 ------ ...s,_link_which_should_not_be_rewritten.yaml | 6 ------ .../1_-_Single-site,_single-tab,_session.yaml | 6 ------ .../2_-_Single-site,_new-tab,_session.yaml | 6 ------ ...le-site,_new-tab,_session_variant_two.yaml | 6 ------ .../4_-_Single-site,_multi-tab_session.yaml | 6 ------ .../5_-_Multi-site,_single-tab,_session.yaml | 6 ------ .maestro/privacy_tests/6_-_Multi-tab.yaml | 6 ------ .../7_-_Browser_restart_mid-session.yaml | 6 ------ .../8_-_Navigation_with_back_forward.yaml | 6 ------ .../9_-_Navigation_with_refresh.yaml | 6 ------ .../2_-_AddressBarSpoof,_aboutblank.yaml | 2 +- .maestro/shared/onboarding.yaml | 7 +++++-- .maestro/tabs/open_multiple_tabs.yaml | 9 +++------ 36 files changed, 110 insertions(+), 180 deletions(-) diff --git a/.maestro/ad_click_detection_flows/10_-_m.js_bing-provided;_ad_domain_provided_but_incorrect_(dsl_not_needed).yaml b/.maestro/ad_click_detection_flows/10_-_m.js_bing-provided;_ad_domain_provided_but_incorrect_(dsl_not_needed).yaml index 0ceea023b48f..8aec68aa04ea 100644 --- a/.maestro/ad_click_detection_flows/10_-_m.js_bing-provided;_ad_domain_provided_but_incorrect_(dsl_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/10_-_m.js_bing-provided;_ad_domain_provided_but_incorrect_(dsl_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-10" - tapOn: diff --git a/.maestro/ad_click_detection_flows/11_-_y.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)_(u3_not_needed).yaml b/.maestro/ad_click_detection_flows/11_-_y.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)_(u3_not_needed).yaml index 7d8872dd4c4a..3ea65b724986 100644 --- a/.maestro/ad_click_detection_flows/11_-_y.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)_(u3_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/11_-_y.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)_(u3_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-11" - tapOn: diff --git a/.maestro/ad_click_detection_flows/12_-_m.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)__(dsl_not_needed).yaml b/.maestro/ad_click_detection_flows/12_-_m.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)__(dsl_not_needed).yaml index 72e9df36e591..60518d18cb23 100644 --- a/.maestro/ad_click_detection_flows/12_-_m.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)__(dsl_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/12_-_m.js_bing-provided;_ad_domain_provided_but_it's_not_a_domain_(i.e.,_abcedf)__(dsl_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-12" - tapOn: diff --git a/.maestro/ad_click_detection_flows/13_-_y.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)_(u3_not_needed).yaml b/.maestro/ad_click_detection_flows/13_-_y.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)_(u3_not_needed).yaml index 4368591e517f..71a9bb7f7f89 100644 --- a/.maestro/ad_click_detection_flows/13_-_y.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)_(u3_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/13_-_y.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)_(u3_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-13" - tapOn: diff --git a/.maestro/ad_click_detection_flows/14_-_m.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)__(dsl_not_needed).yaml b/.maestro/ad_click_detection_flows/14_-_m.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)__(dsl_not_needed).yaml index 367acf429c5a..c56e646d6dfa 100644 --- a/.maestro/ad_click_detection_flows/14_-_m.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)__(dsl_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/14_-_m.js_bing-provided;_ad_domain_provided_but_it's_a_subdomain_of_advertiser_(i.e.,_foo.www.search-company-site)__(dsl_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-14" - tapOn: diff --git a/.maestro/ad_click_detection_flows/1_-_y.js_heuristic;_no_ad_domain_param;_u3_param_included.yaml b/.maestro/ad_click_detection_flows/1_-_y.js_heuristic;_no_ad_domain_param;_u3_param_included.yaml index a3dec88cb267..0ef176c05d60 100644 --- a/.maestro/ad_click_detection_flows/1_-_y.js_heuristic;_no_ad_domain_param;_u3_param_included.yaml +++ b/.maestro/ad_click_detection_flows/1_-_y.js_heuristic;_no_ad_domain_param;_u3_param_included.yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-1" - tapOn: @@ -38,7 +38,7 @@ tags: - assertVisible: text: "convert.ad-company.site" - assertVisible: - text: "ad-company.site" + text: "ad-company.site" - action: back - assertVisible: text: "View Non-Tracker Companies" diff --git a/.maestro/ad_click_detection_flows/2_-_m.js_heuristic;_no_ad_domain_param;_dsl_param_included.yaml b/.maestro/ad_click_detection_flows/2_-_m.js_heuristic;_no_ad_domain_param;_dsl_param_included.yaml index fdeaedc8ace6..72a9657fc690 100644 --- a/.maestro/ad_click_detection_flows/2_-_m.js_heuristic;_no_ad_domain_param;_dsl_param_included.yaml +++ b/.maestro/ad_click_detection_flows/2_-_m.js_heuristic;_no_ad_domain_param;_dsl_param_included.yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-2" - tapOn: diff --git a/.maestro/ad_click_detection_flows/3_-_y.js_heuristic;_no_ad_domain_param,_but_missing_u3_param.yaml b/.maestro/ad_click_detection_flows/3_-_y.js_heuristic;_no_ad_domain_param,_but_missing_u3_param.yaml index 6f03754c53c9..8602adaf986a 100644 --- a/.maestro/ad_click_detection_flows/3_-_y.js_heuristic;_no_ad_domain_param,_but_missing_u3_param.yaml +++ b/.maestro/ad_click_detection_flows/3_-_y.js_heuristic;_no_ad_domain_param,_but_missing_u3_param.yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-3" - tapOn: diff --git a/.maestro/ad_click_detection_flows/4_-_m.js_heuristic;_no_ad_domain_param,_but_missing_dsl_param.yaml b/.maestro/ad_click_detection_flows/4_-_m.js_heuristic;_no_ad_domain_param,_but_missing_dsl_param.yaml index 4d4150810b94..d01859f75c24 100644 --- a/.maestro/ad_click_detection_flows/4_-_m.js_heuristic;_no_ad_domain_param,_but_missing_dsl_param.yaml +++ b/.maestro/ad_click_detection_flows/4_-_m.js_heuristic;_no_ad_domain_param,_but_missing_dsl_param.yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-4" - tapOn: diff --git a/.maestro/ad_click_detection_flows/5_-_y.js_heuristic;_ad_domain_provided,_but_empty_(u3_not_needed).yaml b/.maestro/ad_click_detection_flows/5_-_y.js_heuristic;_ad_domain_provided,_but_empty_(u3_not_needed).yaml index 39763d3a7d79..77bfcdeb067f 100644 --- a/.maestro/ad_click_detection_flows/5_-_y.js_heuristic;_ad_domain_provided,_but_empty_(u3_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/5_-_y.js_heuristic;_ad_domain_provided,_but_empty_(u3_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/ad_click_detection_flows/6_-_m.js_heuristic;_ad_domain_provided,_but_empty_(dsl_not_needed).yaml b/.maestro/ad_click_detection_flows/6_-_m.js_heuristic;_ad_domain_provided,_but_empty_(dsl_not_needed).yaml index ac44ce94465d..497894c02606 100644 --- a/.maestro/ad_click_detection_flows/6_-_m.js_heuristic;_ad_domain_provided,_but_empty_(dsl_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/6_-_m.js_heuristic;_ad_domain_provided,_but_empty_(dsl_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -11,12 +11,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-6" - tapOn: diff --git a/.maestro/ad_click_detection_flows/7_-_y.js_bing-provided;_ad_domain_provided_(u3_not_needed).yaml b/.maestro/ad_click_detection_flows/7_-_y.js_bing-provided;_ad_domain_provided_(u3_not_needed).yaml index ecedc4749564..03c5726d820f 100644 --- a/.maestro/ad_click_detection_flows/7_-_y.js_bing-provided;_ad_domain_provided_(u3_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/7_-_y.js_bing-provided;_ad_domain_provided_(u3_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-7" - tapOn: diff --git a/.maestro/ad_click_detection_flows/8_-_m.js_bing-provided;_ad_domain_provided_(dsl_not_needed).yaml b/.maestro/ad_click_detection_flows/8_-_m.js_bing-provided;_ad_domain_provided_(dsl_not_needed).yaml index 63f0f7db37dd..1eed52397431 100644 --- a/.maestro/ad_click_detection_flows/8_-_m.js_bing-provided;_ad_domain_provided_(dsl_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/8_-_m.js_bing-provided;_ad_domain_provided_(dsl_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-8" - tapOn: diff --git a/.maestro/ad_click_detection_flows/9_-_y.js_bing-provided;_ad_domain_provided_but_incorrect_(u3_not_needed).yaml b/.maestro/ad_click_detection_flows/9_-_y.js_bing-provided;_ad_domain_provided_but_incorrect_(u3_not_needed).yaml index 4b6346a8c1c5..89f7bd91f795 100644 --- a/.maestro/ad_click_detection_flows/9_-_y.js_bing-provided;_ad_domain_provided_but_incorrect_(u3_not_needed).yaml +++ b/.maestro/ad_click_detection_flows/9_-_y.js_bing-provided;_ad_domain_provided_but_incorrect_(u3_not_needed).yaml @@ -1,6 +1,6 @@ appId: com.duckduckgo.mobile.android tags: - - adClickTest + - adClickTest --- - launchApp: clearState: true @@ -12,11 +12,11 @@ tags: - assertVisible: text: ".*Got It.*" - tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" + text: "Got It" +- tapOn: + id: "com.duckduckgo.mobile.android:id/fireIconMenu" - tapOn: - text: "HIDE TIPS FOREVER" + text: "Cancel" - assertVisible: id: "ad-id-9" - tapOn: diff --git a/.maestro/ads_preview_flows/1-_design-system-components.yaml b/.maestro/ads_preview_flows/1-_design-system-components.yaml index b5555f774300..af6f0181bb10 100644 --- a/.maestro/ads_preview_flows/1-_design-system-components.yaml +++ b/.maestro/ads_preview_flows/1-_design-system-components.yaml @@ -66,7 +66,7 @@ tags: - tapOn: id: "com.duckduckgo.mobile.android:id/primaryCta" - tapOn: "LAYOUTS" -- tapOn: "Primary" +- assertVisible: "Expandable Layout" - tapOn: "INTERACTIVE" - tapOn: id: "com.duckduckgo.mobile.android:id/switch_one" diff --git a/.maestro/custom_tabs/custom_tabs_navigation.yaml b/.maestro/custom_tabs/custom_tabs_navigation.yaml index 3598fe4b8778..b17a0c86cca7 100644 --- a/.maestro/custom_tabs/custom_tabs_navigation.yaml +++ b/.maestro/custom_tabs/custom_tabs_navigation.yaml @@ -8,8 +8,11 @@ tags: stopApp: true - assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" + text: ".*Ready for a better, more private internet?.*" - tapOn: "let's do it!" +- assertVisible: + text: ".*Privacy protections activated.*" +- tapOn: "choose your browser" - runFlow: when: visible: "set as default" @@ -17,7 +20,8 @@ tags: - tapOn: "duckduckgo" - tapOn: "set as default" - assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + text: ".*Awesome! Welcome to the duck side.*" + - tapOn: "start browsing" - tapOn: id: "com.duckduckgo.mobile.android:id/browserMenuImageView" diff --git a/.maestro/custom_tabs/custom_tabs_navigation_new_tab.yaml b/.maestro/custom_tabs/custom_tabs_navigation_new_tab.yaml index f4c4ba5674a6..84bb91b15edf 100644 --- a/.maestro/custom_tabs/custom_tabs_navigation_new_tab.yaml +++ b/.maestro/custom_tabs/custom_tabs_navigation_new_tab.yaml @@ -8,8 +8,11 @@ tags: stopApp: true - assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" + text: ".*Ready for a better, more private internet?.*" - tapOn: "let's do it!" +- assertVisible: + text: ".*Privacy protections activated.*" +- tapOn: "choose your browser" - runFlow: when: visible: "set as default" @@ -17,7 +20,8 @@ tags: - tapOn: "duckduckgo" - tapOn: "set as default" - assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + text: ".*Awesome! Welcome to the duck side.*" + - tapOn: "start browsing" - tapOn: id: "com.duckduckgo.mobile.android:id/browserMenuImageView" diff --git a/.maestro/fire_button/fire_during_onboarding.yaml b/.maestro/fire_button/fire_during_onboarding.yaml index 3d355d3dd777..ea5da487ba66 100644 --- a/.maestro/fire_button/fire_during_onboarding.yaml +++ b/.maestro/fire_button/fire_during_onboarding.yaml @@ -18,13 +18,13 @@ tags: text: ".*keep browsing.*" - tapOn: text: "got it" +- assertVisible: + text: ".*browsing activity with the fire button.*" - tapOn: id: "com.duckduckgo.mobile.android:id/fireIconImageView" -- assertVisible: "Personal data can build up in your browser.*" - tapOn: "Cancel" -- assertNotVisible: "Personal data can build up in your browser.*" +- assertNotVisible: ".*browsing activity with the Fire Button.*" - tapOn: id: "com.duckduckgo.mobile.android:id/fireIconImageView" -- assertNotVisible: "Personal data can build up in your browser.*" - tapOn: "Clear All Tabs And Data" - assertVisible: "You've got this!.*" \ No newline at end of file diff --git a/.maestro/notifications_permissions_android13_plus/1_-_permissions_allowed.yaml b/.maestro/notifications_permissions_android13_plus/1_-_permissions_allowed.yaml index 9b689829a654..e77d22ea7d72 100644 --- a/.maestro/notifications_permissions_android13_plus/1_-_permissions_allowed.yaml +++ b/.maestro/notifications_permissions_android13_plus/1_-_permissions_allowed.yaml @@ -11,15 +11,18 @@ appId: com.duckduckgo.mobile.android text: ".*Welcome to DuckDuckGo!.*" optional: true - assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" + text: ".*Ready for a better, more private internet?.*" - tapOn: "let's do it!" +- assertVisible: + text: ".*Privacy protections activated.*" +- tapOn: "choose your browser" - tapOn: "cancel" - assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + text: ".*Try a search!.*" - tapOn: - id: "com.duckduckgo.mobile.android:id/browserMenuImageView" + id: "com.duckduckgo.mobile.android:id/browserMenuImageView" - tapOn: - text: "Downloads" + text: "Downloads" - assertVisible: text: ".*No files downloaded yet.*" - assertNotVisible: diff --git a/.maestro/notifications_permissions_android13_plus/2_-_permissions_denied.yaml b/.maestro/notifications_permissions_android13_plus/2_-_permissions_denied.yaml index 3385855ae1f3..fa3f2d62cdb2 100644 --- a/.maestro/notifications_permissions_android13_plus/2_-_permissions_denied.yaml +++ b/.maestro/notifications_permissions_android13_plus/2_-_permissions_denied.yaml @@ -11,20 +11,23 @@ appId: com.duckduckgo.mobile.android text: ".*Welcome to DuckDuckGo!.*" optional: true - assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" + text: ".*Ready for a better, more private internet?.*" - tapOn: "let's do it!" +- assertVisible: + text: ".*Privacy protections activated.*" +- tapOn: "choose your browser" - tapOn: "cancel" - assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + text: ".*Try a search!.*" - tapOn: - id: "com.duckduckgo.mobile.android:id/browserMenuImageView" + id: "com.duckduckgo.mobile.android:id/browserMenuImageView" - tapOn: - text: "Downloads" + text: "Downloads" - assertVisible: - text: ".*Find out when downloads are ready.*" + text: ".*Find out when downloads are ready.*" - assertVisible: - text: ".*Get a notification when downloads complete.*" + text: ".*Get a notification when downloads complete.*" - assertVisible: - text: ".*Notify Me.*" + text: ".*Notify Me.*" - assertVisible: - text: ".*No files downloaded yet.*" + text: ".*No files downloaded yet.*" diff --git a/.maestro/privacy_tests/10_-_Query_Parameters,_utm_source_and_1_standard_parameter.yaml b/.maestro/privacy_tests/10_-_Query_Parameters,_utm_source_and_1_standard_parameter.yaml index dca7184ce425..b9fdf8a9c1ef 100644 --- a/.maestro/privacy_tests/10_-_Query_Parameters,_utm_source_and_1_standard_parameter.yaml +++ b/.maestro/privacy_tests/10_-_Query_Parameters,_utm_source_and_1_standard_parameter.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: text: "Link with utm_source and 1 standard parameter" - tapOn: diff --git a/.maestro/privacy_tests/11_-_Query_Parameters,_utm_source_and_utm_medium.yaml b/.maestro/privacy_tests/11_-_Query_Parameters,_utm_source_and_utm_medium.yaml index 8396ddd457d0..cf82b9c50670 100644 --- a/.maestro/privacy_tests/11_-_Query_Parameters,_utm_source_and_utm_medium.yaml +++ b/.maestro/privacy_tests/11_-_Query_Parameters,_utm_source_and_utm_medium.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: text: "Link with utm_source and utm_medium" - tapOn: diff --git a/.maestro/privacy_tests/12_-_Query_Parameters,_fbclid,_fb_source_and_1_standard_parameter.yaml b/.maestro/privacy_tests/12_-_Query_Parameters,_fbclid,_fb_source_and_1_standard_parameter.yaml index c50489dee67c..4f83e6a142f4 100644 --- a/.maestro/privacy_tests/12_-_Query_Parameters,_fbclid,_fb_source_and_1_standard_parameter.yaml +++ b/.maestro/privacy_tests/12_-_Query_Parameters,_fbclid,_fb_source_and_1_standard_parameter.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: text: "Link with fbclid, fb_source and 1 standard parameter" - tapOn: diff --git a/.maestro/privacy_tests/13_-_Query_Parameters,_link_which_should_not_be_rewritten.yaml b/.maestro/privacy_tests/13_-_Query_Parameters,_link_which_should_not_be_rewritten.yaml index 738642978237..b13c29934dd9 100644 --- a/.maestro/privacy_tests/13_-_Query_Parameters,_link_which_should_not_be_rewritten.yaml +++ b/.maestro/privacy_tests/13_-_Query_Parameters,_link_which_should_not_be_rewritten.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: text: "Link which should not be rewritten" - tapOn: diff --git a/.maestro/privacy_tests/1_-_Single-site,_single-tab,_session.yaml b/.maestro/privacy_tests/1_-_Single-site,_single-tab,_session.yaml index 0bbc2a9d852b..ed353acc275f 100644 --- a/.maestro/privacy_tests/1_-_Single-site,_single-tab,_session.yaml +++ b/.maestro/privacy_tests/1_-_Single-site,_single-tab,_session.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/2_-_Single-site,_new-tab,_session.yaml b/.maestro/privacy_tests/2_-_Single-site,_new-tab,_session.yaml index 0c3f7c17eb1d..513cde79094d 100644 --- a/.maestro/privacy_tests/2_-_Single-site,_new-tab,_session.yaml +++ b/.maestro/privacy_tests/2_-_Single-site,_new-tab,_session.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - longPressOn: diff --git a/.maestro/privacy_tests/3_-_Single-site,_new-tab,_session_variant_two.yaml b/.maestro/privacy_tests/3_-_Single-site,_new-tab,_session_variant_two.yaml index 89faea769b61..3df9866959f8 100644 --- a/.maestro/privacy_tests/3_-_Single-site,_new-tab,_session_variant_two.yaml +++ b/.maestro/privacy_tests/3_-_Single-site,_new-tab,_session_variant_two.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/4_-_Single-site,_multi-tab_session.yaml b/.maestro/privacy_tests/4_-_Single-site,_multi-tab_session.yaml index 23a7afbf2dbb..7d1cf8490672 100644 --- a/.maestro/privacy_tests/4_-_Single-site,_multi-tab_session.yaml +++ b/.maestro/privacy_tests/4_-_Single-site,_multi-tab_session.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/5_-_Multi-site,_single-tab,_session.yaml b/.maestro/privacy_tests/5_-_Multi-site,_single-tab,_session.yaml index 32691fbaeb5d..8b82d4288268 100644 --- a/.maestro/privacy_tests/5_-_Multi-site,_single-tab,_session.yaml +++ b/.maestro/privacy_tests/5_-_Multi-site,_single-tab,_session.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/6_-_Multi-tab.yaml b/.maestro/privacy_tests/6_-_Multi-tab.yaml index 02152f84d979..e82e3c8eb39f 100644 --- a/.maestro/privacy_tests/6_-_Multi-tab.yaml +++ b/.maestro/privacy_tests/6_-_Multi-tab.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/7_-_Browser_restart_mid-session.yaml b/.maestro/privacy_tests/7_-_Browser_restart_mid-session.yaml index 4a8d5be3184f..762e819d4cdb 100644 --- a/.maestro/privacy_tests/7_-_Browser_restart_mid-session.yaml +++ b/.maestro/privacy_tests/7_-_Browser_restart_mid-session.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/8_-_Navigation_with_back_forward.yaml b/.maestro/privacy_tests/8_-_Navigation_with_back_forward.yaml index f62dbfbe56cb..6008c45fea9c 100644 --- a/.maestro/privacy_tests/8_-_Navigation_with_back_forward.yaml +++ b/.maestro/privacy_tests/8_-_Navigation_with_back_forward.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/privacy_tests/9_-_Navigation_with_refresh.yaml b/.maestro/privacy_tests/9_-_Navigation_with_refresh.yaml index a804f5fbde05..e8767fa87122 100644 --- a/.maestro/privacy_tests/9_-_Navigation_with_refresh.yaml +++ b/.maestro/privacy_tests/9_-_Navigation_with_refresh.yaml @@ -9,12 +9,6 @@ tags: - pressKey: Enter - assertVisible: text: ".*Got It.*" -- tapOn: - text: "HIDE" -- assertVisible: - text: "HIDE TIPS FOREVER" -- tapOn: - text: "HIDE TIPS FOREVER" - assertVisible: id: "ad-id-5" - tapOn: diff --git a/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml b/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml index 3f64af8b6dcf..f5e8af78fce1 100644 --- a/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml +++ b/.maestro/security_tests/2_-_AddressBarSpoof,_aboutblank.yaml @@ -15,7 +15,7 @@ tags: - extendedWaitUntil: notVisible: "Not DDG." # Spoofed content not visible timeout: 10000 -- tapOn: "Phew!" +- tapOn: "Got it!" - copyTextFrom: id: "omnibarTextInput" - assertTrue: ${maestro.copiedText == "about:blank" || maestro.copiedText == "https://duckduckgo.com/"} \ No newline at end of file diff --git a/.maestro/shared/onboarding.yaml b/.maestro/shared/onboarding.yaml index 666f1d9d144b..104804220109 100644 --- a/.maestro/shared/onboarding.yaml +++ b/.maestro/shared/onboarding.yaml @@ -1,8 +1,11 @@ appId: com.duckduckgo.mobile.android --- - assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" + text: ".*Ready for a better, more private internet?.*" - tapOn: "let's do it!" +- assertVisible: + text: ".*Privacy protections activated.*" +- tapOn: "choose your browser" - tapOn: "cancel" - assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + text: ".*Try a search!.*" diff --git a/.maestro/tabs/open_multiple_tabs.yaml b/.maestro/tabs/open_multiple_tabs.yaml index a558e07a1eb1..90b6b871aeac 100644 --- a/.maestro/tabs/open_multiple_tabs.yaml +++ b/.maestro/tabs/open_multiple_tabs.yaml @@ -6,12 +6,9 @@ tags: - launchApp: clearState: true stopApp: true -- assertVisible: - text: ".*Not to worry! Searching and browsing privately.*" -- tapOn: "let's do it!" -- tapOn: "cancel" -- assertVisible: - text: ".*I'll also upgrade the security of your connection if possible.*" + +- runFlow: ../shared/onboarding.yaml + - tapOn: text: "search or type URL" - inputText: "https://privacy-test-pages.site" From 4c34c1996a58eba005764df593fc45e1fb2ca3d7 Mon Sep 17 00:00:00 2001 From: Dax the Deployer Date: Tue, 4 Jun 2024 04:27:04 -0400 Subject: [PATCH 12/12] Updated release notes and version number for new release - 5.203.0 --- app/version/release-notes | 3 ++- app/version/version.properties | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/version/release-notes b/app/version/release-notes index a43a0bfbca62..4185fb90429d 100644 --- a/app/version/release-notes +++ b/app/version/release-notes @@ -1 +1,2 @@ -Bug fixes and other improvements \ No newline at end of file +With Sync & Backup enabled, you'll now see more helpful confirmation details when deleting passwords. +As usual we also included some bug fixes and improvements. \ No newline at end of file diff --git a/app/version/version.properties b/app/version/version.properties index ea0a9ebd32f4..2315d7d57c45 100644 --- a/app/version/version.properties +++ b/app/version/version.properties @@ -1 +1 @@ -VERSION=5.202.0 \ No newline at end of file +VERSION=5.203.0 \ No newline at end of file