From 6525e42f585b4fbe4fab5f56071af7d72e0ff070 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Fri, 5 Feb 2021 10:38:31 +0000 Subject: [PATCH 01/10] Do not dismiss dax dialogs when clicking outside. Finish animation if dialog is not dismissible when the user clicks outisde. --- app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt | 12 ++++++------ .../java/com/duckduckgo/app/global/view/DaxDialog.kt | 6 ++++-- .../app/global/view/TypeAnimationTextView.kt | 8 ++++++-- 3 files changed, 16 insertions(+), 10 deletions(-) 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 9f7226e38079..2aa2e1ab0713 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 @@ -132,7 +132,7 @@ sealed class DaxDialogCta( ) : Cta, DialogCta, DaxCta { override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(getDaxText(activity), activity.resources.getString(okButton)) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) @@ -175,7 +175,8 @@ sealed class DaxDialogCta( TypewriterDaxDialog.newInstance( daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), - toolbarDimmed = false + toolbarDimmed = false, + dismissible = false ) override fun getDaxText(context: Context): String { @@ -231,7 +232,7 @@ sealed class DaxDialogCta( } override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton)) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) private fun isFromSameNetworkDomain(): Boolean = mainTrackerDomains.any { siteHost.contains(it) } } @@ -248,14 +249,13 @@ sealed class DaxDialogCta( appInstallStore ) { override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton)) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) } companion object { private const val MAX_TRACKERS_SHOWS = 2 const val SERP = "duckduckgo" private val mainTrackerDomains = listOf("facebook", "google") - private val networkPropertyPercentages = mapOf(Pair("Google", "90%"), Pair("Facebook", "40%")) val mainTrackerNetworks = listOf("Facebook", "Google") } } @@ -343,7 +343,7 @@ sealed class DaxFireDialogCta( cancelPixel = null, ctaPixelParam = DAX_FIRE_DIALOG_CTA, onboardingStore = onboardingStore, - appInstallStore = appInstallStore + appInstallStore = appInstallStore, ) } diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 899dfddca6e3..6e2ed704866f 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -161,10 +161,12 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { dismiss() } - if (dismissible) { - dialogContainer.setOnClickListener { + dialogContainer.setOnClickListener { + if (dismissible) { dialogText.cancelAnimation() dismiss() + } else { + dialogText.finishAnimation(daxText) } } } diff --git a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt index 8d459d4bad53..4f11427cd875 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt @@ -40,8 +40,7 @@ class TypeAnimationTextView @JvmOverloads constructor( if (isCancellable) { setOnClickListener { if (typingAnimationJob?.isActive == true) { - cancelAnimation() - text = inputText + finishAnimation(textDialog) afterAnimation() } } @@ -57,6 +56,11 @@ class TypeAnimationTextView @JvmOverloads constructor( } } + fun finishAnimation(textDialog: String) { + typingAnimationJob?.cancel() + text = textDialog.html(context) + } + fun cancelAnimation() = typingAnimationJob?.cancel() override fun onDetachedFromWindow() { From 4afff97264dcc095737f9649b9fd32d1e411a2cf Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Fri, 5 Feb 2021 11:43:01 +0000 Subject: [PATCH 02/10] Second tap dismisses the dialog --- app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 6e2ed704866f..933b8fe7ba45 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -167,6 +167,7 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { dismiss() } else { dialogText.finishAnimation(daxText) + dismissible = true } } } From 341304b90154312091535856869761f3357d9bea Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Fri, 5 Feb 2021 12:07:29 +0000 Subject: [PATCH 03/10] If animation has finished, tapping outside dismisses the dialog. --- app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt | 2 +- .../com/duckduckgo/app/global/view/TypeAnimationTextView.kt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 933b8fe7ba45..83ea5d0c5d0a 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -162,7 +162,7 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { } dialogContainer.setOnClickListener { - if (dismissible) { + if (dismissible || dialogText.isAnimationFinished()) { dialogText.cancelAnimation() dismiss() } else { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt index 4f11427cd875..540564f9fc86 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt @@ -56,6 +56,8 @@ class TypeAnimationTextView @JvmOverloads constructor( } } + fun isAnimationFinished() = typingAnimationJob?.isActive == false + fun finishAnimation(textDialog: String) { typingAnimationJob?.cancel() text = textDialog.html(context) From 96a947725dec24952ad76fb4dbbf966556526884 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Tue, 9 Feb 2021 10:11:50 +0000 Subject: [PATCH 04/10] Finish animation for Dax CTAs --- .../duckduckgo/app/browser/BrowserTabFragment.kt | 7 +++++++ .../com/duckduckgo/app/global/view/DaxDialog.kt | 7 ++++--- .../app/global/view/TypeAnimationTextView.kt | 14 ++++++++------ .../app/onboarding/ui/page/WelcomePage.kt | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) 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 fcdf4074bd31..663ac9c8541b 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -114,6 +114,7 @@ import kotlinx.android.synthetic.main.fragment_browser_tab.* import kotlinx.android.synthetic.main.include_add_widget_instruction_buttons.view.* import kotlinx.android.synthetic.main.include_cta_buttons.view.* import kotlinx.android.synthetic.main.include_dax_dialog_cta.* +import kotlinx.android.synthetic.main.include_dax_dialog_cta.view.* import kotlinx.android.synthetic.main.include_find_in_page.* import kotlinx.android.synthetic.main.include_new_browser_tab.* import kotlinx.android.synthetic.main.include_omnibar_toolbar.* @@ -1793,6 +1794,7 @@ class BrowserTabFragment : ddgLogo.show() lastSeenCtaViewState = viewState + resetNewTabLayoutClickListener() if (viewState.cta != null) { showCta(viewState.cta) } else { @@ -1835,6 +1837,11 @@ class BrowserTabFragment : hideHomeCta() hideHomeTopCta() configuration.showCta(daxCtaContainer) + newTabLayout.setOnClickListener { daxCtaContainer.dialogTextCta.finishAnimation() } + } + + private fun resetNewTabLayoutClickListener() { + newTabLayout.setOnClickListener(null) } private fun showHomeTopCta(configuration: HomeTopPanelCta) { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 83ea5d0c5d0a..aba8f38892bb 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -162,12 +162,13 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { } dialogContainer.setOnClickListener { - if (dismissible || dialogText.isAnimationFinished()) { + if (dismissible) { dialogText.cancelAnimation() dismiss() } else { - dialogText.finishAnimation(daxText) - dismissible = true + if (!dialogText.isAnimationFinished()) { + dialogText.finishAnimation() + } } } } diff --git a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt index 540564f9fc86..c3c346688849 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt @@ -17,6 +17,7 @@ package com.duckduckgo.app.global.view import android.content.Context +import android.text.Spanned import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView import kotlinx.coroutines.* @@ -34,21 +35,22 @@ class TypeAnimationTextView @JvmOverloads constructor( private var typingAnimationJob: Job? = null private var delayAfterAnimationInMs: Long = 300 var typingDelayInMs: Long = 20 + lateinit var textInDialog: Spanned fun startTypingAnimation(textDialog: String, isCancellable: Boolean = true, afterAnimation: () -> Unit = {}) { - val inputText = textDialog.html(context) + textInDialog = textDialog.html(context) if (isCancellable) { setOnClickListener { if (typingAnimationJob?.isActive == true) { - finishAnimation(textDialog) + finishAnimation() afterAnimation() } } } typingAnimationJob = launch { - inputText.mapIndexed { index, _ -> - text = inputText.subSequence(0, index + 1) + textInDialog.mapIndexed { index, _ -> + text = textInDialog.subSequence(0, index + 1) delay(typingDelayInMs) } delay(delayAfterAnimationInMs) @@ -58,9 +60,9 @@ class TypeAnimationTextView @JvmOverloads constructor( fun isAnimationFinished() = typingAnimationJob?.isActive == false - fun finishAnimation(textDialog: String) { + fun finishAnimation() { typingAnimationJob?.cancel() - text = textDialog.html(context) + text = textInDialog } fun cancelAnimation() = typingAnimationJob?.cancel() 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 02b15bfd125e..415ea4f64fa1 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 @@ -66,6 +66,7 @@ class WelcomePage : OnboardingPageFragment() { configureDaxCta() beginWelcomeAnimation(ctaText) + setSkipAnimationListener() } override fun onAttach(context: Context) { @@ -145,6 +146,7 @@ class WelcomePage : OnboardingPageFragment() { context?.let { ctaText = it.getString(R.string.onboardingDaxText) hiddenTextCta.text = ctaText.html(it) + dialogTextCta.textInDialog = ctaText.html(it) dialogTextCta.setTextColor(ContextCompat.getColor(it, R.color.grayishBrown)) cardView.backgroundTintList = ContextCompat.getColorStateList(it, R.color.white) } @@ -167,6 +169,18 @@ class WelcomePage : OnboardingPageFragment() { } } + private fun setSkipAnimationListener() { + longDescriptionContainer.setOnClickListener { + if (!dialogTextCta.isAnimationFinished()) { + welcomeAnimation?.cancel() + dialogTextCta.finishAnimation() + welcomeContent.alpha = 0f + daxCtaContainer.alpha = 1f + setPrimaryCtaListenerAfterWelcomeAlphaAnimation() + } + } + } + private fun setPrimaryCtaListenerAfterWelcomeAlphaAnimation() { primaryCta.setOnClickListener { event(WelcomePageView.Event.OnPrimaryCtaClicked) } } From 44ed20d02e9fe7e7436bb8c75a6ae95e03ca92d8 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Tue, 9 Feb 2021 10:16:32 +0000 Subject: [PATCH 05/10] Undo unnecessary change --- app/src/main/java/com/duckduckgo/app/cta/ui/Cta.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2aa2e1ab0713..01d451ab4272 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 @@ -343,7 +343,7 @@ sealed class DaxFireDialogCta( cancelPixel = null, ctaPixelParam = DAX_FIRE_DIALOG_CTA, onboardingStore = onboardingStore, - appInstallStore = appInstallStore, + appInstallStore = appInstallStore ) } From 08b15abc642219074ec76eadfcfa77097e78c4d2 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Wed, 10 Feb 2021 09:30:03 +0000 Subject: [PATCH 06/10] Welcome page new behaviour and new icon --- .../duckduckgo/app/global/view/DaxDialog.kt | 2 +- .../app/global/view/TypeAnimationTextView.kt | 8 +- .../app/onboarding/ui/page/WelcomePage.kt | 33 ++++---- app/src/main/res/drawable/ic_dax_icon.xml | 75 +++++++++---------- 4 files changed, 63 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index aba8f38892bb..1f2e01e2e0f7 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -166,7 +166,7 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { dialogText.cancelAnimation() dismiss() } else { - if (!dialogText.isAnimationFinished()) { + if (!dialogText.hasAnimationFinished()) { dialogText.finishAnimation() } } diff --git a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt index c3c346688849..73bfce40f492 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt @@ -41,7 +41,7 @@ class TypeAnimationTextView @JvmOverloads constructor( textInDialog = textDialog.html(context) if (isCancellable) { setOnClickListener { - if (typingAnimationJob?.isActive == true) { + if (hasAnimationStarted()) { finishAnimation() afterAnimation() } @@ -58,10 +58,12 @@ class TypeAnimationTextView @JvmOverloads constructor( } } - fun isAnimationFinished() = typingAnimationJob?.isActive == false + fun hasAnimationStarted() = typingAnimationJob?.isActive == true + + fun hasAnimationFinished() = typingAnimationJob?.isCompleted == true fun finishAnimation() { - typingAnimationJob?.cancel() + cancelAnimation() text = textInDialog } 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 415ea4f64fa1..b20bc7836a18 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 @@ -51,6 +51,7 @@ class WelcomePage : OnboardingPageFragment() { private var ctaText: String = "" private var welcomeAnimation: ViewPropertyAnimatorCompat? = null private var typingAnimation: ViewPropertyAnimatorCompat? = null + private var welcomeAnimationSkipped = false // we use a BroadcastChannel because we don't want to emit the last value upon subscription private val events = BroadcastChannel(1) @@ -65,7 +66,7 @@ class WelcomePage : OnboardingPageFragment() { super.onActivityCreated(savedInstanceState) configureDaxCta() - beginWelcomeAnimation(ctaText) + scheduleWelcomeAnimation() setSkipAnimationListener() } @@ -153,11 +154,23 @@ class WelcomePage : OnboardingPageFragment() { triangle.setImageResource(R.drawable.ic_triangle_bubble_white) } - private fun beginWelcomeAnimation(ctaText: String) { + private fun setSkipAnimationListener() { + longDescriptionContainer.setOnClickListener { + if (dialogTextCta.hasAnimationStarted()) { + finishTypingAnimation() + } else if (!welcomeAnimationSkipped){ + welcomeAnimation?.cancel() + scheduleWelcomeAnimation(0L) + } + welcomeAnimationSkipped = true + } + } + + private fun scheduleWelcomeAnimation(startDelay: Long = ANIMATION_DELAY) { welcomeAnimation = ViewCompat.animate(welcomeContent as View) .alpha(MIN_ALPHA) .setDuration(ANIMATION_DURATION) - .setStartDelay(ANIMATION_DELAY) + .setStartDelay(startDelay) .withEndAction { typingAnimation = ViewCompat.animate(daxCtaContainer) .alpha(MAX_ALPHA) @@ -169,16 +182,10 @@ class WelcomePage : OnboardingPageFragment() { } } - private fun setSkipAnimationListener() { - longDescriptionContainer.setOnClickListener { - if (!dialogTextCta.isAnimationFinished()) { - welcomeAnimation?.cancel() - dialogTextCta.finishAnimation() - welcomeContent.alpha = 0f - daxCtaContainer.alpha = 1f - setPrimaryCtaListenerAfterWelcomeAlphaAnimation() - } - } + private fun finishTypingAnimation() { + welcomeAnimation?.cancel() + dialogTextCta.finishAnimation() + setPrimaryCtaListenerAfterWelcomeAlphaAnimation() } private fun setPrimaryCtaListenerAfterWelcomeAlphaAnimation() { diff --git a/app/src/main/res/drawable/ic_dax_icon.xml b/app/src/main/res/drawable/ic_dax_icon.xml index ea6e5b3b5cbf..392c832cdd97 100644 --- a/app/src/main/res/drawable/ic_dax_icon.xml +++ b/app/src/main/res/drawable/ic_dax_icon.xml @@ -1,5 +1,5 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 397770636e062d85e5896135a3b8995b1af648ab Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Wed, 10 Feb 2021 09:37:05 +0000 Subject: [PATCH 07/10] Change variable name --- .../com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 b20bc7836a18..f6d01d7cf037 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 @@ -51,7 +51,7 @@ class WelcomePage : OnboardingPageFragment() { private var ctaText: String = "" private var welcomeAnimation: ViewPropertyAnimatorCompat? = null private var typingAnimation: ViewPropertyAnimatorCompat? = null - private var welcomeAnimationSkipped = false + private var welcomeAnimationFinished = false // we use a BroadcastChannel because we don't want to emit the last value upon subscription private val events = BroadcastChannel(1) @@ -158,11 +158,11 @@ class WelcomePage : OnboardingPageFragment() { longDescriptionContainer.setOnClickListener { if (dialogTextCta.hasAnimationStarted()) { finishTypingAnimation() - } else if (!welcomeAnimationSkipped){ + } else if (!welcomeAnimationFinished){ welcomeAnimation?.cancel() scheduleWelcomeAnimation(0L) } - welcomeAnimationSkipped = true + welcomeAnimationFinished = true } } @@ -176,6 +176,7 @@ class WelcomePage : OnboardingPageFragment() { .alpha(MAX_ALPHA) .setDuration(ANIMATION_DURATION) .withEndAction { + welcomeAnimationFinished = true dialogTextCta.startTypingAnimation(ctaText) setPrimaryCtaListenerAfterWelcomeAlphaAnimation() } From 98069b24062b177760ba3d637c3f3268a4a4c124 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Wed, 10 Feb 2021 09:46:55 +0000 Subject: [PATCH 08/10] spotless --- .../java/com/duckduckgo/app/onboarding/ui/page/WelcomePage.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f6d01d7cf037..50e44338c409 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 @@ -158,7 +158,7 @@ class WelcomePage : OnboardingPageFragment() { longDescriptionContainer.setOnClickListener { if (dialogTextCta.hasAnimationStarted()) { finishTypingAnimation() - } else if (!welcomeAnimationFinished){ + } else if (!welcomeAnimationFinished) { welcomeAnimation?.cancel() scheduleWelcomeAnimation(0L) } From 2adf646acd3979788fd34a6c0e713f3c8904be4d Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Thu, 11 Feb 2021 10:44:18 +0000 Subject: [PATCH 09/10] Amend code as per PR comments --- .../duckduckgo/app/browser/BrowserTabFragment.kt | 4 ++-- .../main/java/com/duckduckgo/app/cta/ui/Cta.kt | 9 ++++----- .../com/duckduckgo/app/global/view/DaxDialog.kt | 2 +- .../app/global/view/TypeAnimationTextView.kt | 16 +++++++++------- .../main/res/layout/include_new_browser_tab.xml | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) 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 663ac9c8541b..de701ebb767c 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -1794,7 +1794,7 @@ class BrowserTabFragment : ddgLogo.show() lastSeenCtaViewState = viewState - resetNewTabLayoutClickListener() + removeNewTabLayoutClickListener() if (viewState.cta != null) { showCta(viewState.cta) } else { @@ -1840,7 +1840,7 @@ class BrowserTabFragment : newTabLayout.setOnClickListener { daxCtaContainer.dialogTextCta.finishAnimation() } } - private fun resetNewTabLayoutClickListener() { + private fun removeNewTabLayoutClickListener() { newTabLayout.setOnClickListener(null) } 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 01d451ab4272..ce98c72b4346 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 @@ -132,7 +132,7 @@ sealed class DaxDialogCta( ) : Cta, DialogCta, DaxCta { override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton)) override fun pixelCancelParameters(): Map = mapOf(Pixel.PixelParameter.CTA_SHOWN to ctaPixelParam) @@ -175,8 +175,7 @@ sealed class DaxDialogCta( TypewriterDaxDialog.newInstance( daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), - toolbarDimmed = false, - dismissible = false + toolbarDimmed = false ) override fun getDaxText(context: Context): String { @@ -232,7 +231,7 @@ sealed class DaxDialogCta( } override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton)) private fun isFromSameNetworkDomain(): Boolean = mainTrackerDomains.any { siteHost.contains(it) } } @@ -249,7 +248,7 @@ sealed class DaxDialogCta( appInstallStore ) { override fun createCta(activity: FragmentActivity): DaxDialog = - TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton), dismissible = false) + TypewriterDaxDialog.newInstance(daxText = getDaxText(activity), primaryButtonText = activity.resources.getString(okButton)) } companion object { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 1f2e01e2e0f7..14d240907a55 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -198,7 +198,7 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { primaryButtonText: String, secondaryButtonText: String? = "", toolbarDimmed: Boolean = true, - dismissible: Boolean = true, + dismissible: Boolean = false, typingDelayInMs: Long = DEFAULT_TYPING_DELAY, showHideButton: Boolean = true ): TypewriterDaxDialog { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt index 73bfce40f492..ab9a0c6a44c7 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/TypeAnimationTextView.kt @@ -35,7 +35,7 @@ class TypeAnimationTextView @JvmOverloads constructor( private var typingAnimationJob: Job? = null private var delayAfterAnimationInMs: Long = 300 var typingDelayInMs: Long = 20 - lateinit var textInDialog: Spanned + var textInDialog: Spanned? = null fun startTypingAnimation(textDialog: String, isCancellable: Boolean = true, afterAnimation: () -> Unit = {}) { textInDialog = textDialog.html(context) @@ -49,12 +49,14 @@ class TypeAnimationTextView @JvmOverloads constructor( } typingAnimationJob = launch { - textInDialog.mapIndexed { index, _ -> - text = textInDialog.subSequence(0, index + 1) - delay(typingDelayInMs) + textInDialog?.let { + it.mapIndexed { index, _ -> + text = it.subSequence(0, index + 1) + delay(typingDelayInMs) + } + delay(delayAfterAnimationInMs) + afterAnimation() } - delay(delayAfterAnimationInMs) - afterAnimation() } } @@ -64,7 +66,7 @@ class TypeAnimationTextView @JvmOverloads constructor( fun finishAnimation() { cancelAnimation() - text = textInDialog + textInDialog?.let { text = it } } fun cancelAnimation() = typingAnimationJob?.cancel() diff --git a/app/src/main/res/layout/include_new_browser_tab.xml b/app/src/main/res/layout/include_new_browser_tab.xml index df4521ae1bc9..f6c9bfe78b18 100644 --- a/app/src/main/res/layout/include_new_browser_tab.xml +++ b/app/src/main/res/layout/include_new_browser_tab.xml @@ -22,6 +22,7 @@ android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" android:animateLayoutChanges="true" + android:foreground="@android:color/transparent" tools:context="com.duckduckgo.app.browser.BrowserActivity" tools:showIn="@layout/fragment_browser_tab"> From 7ddf81a1cf6886c15c79b68d57f56570c149d8f1 Mon Sep 17 00:00:00 2001 From: Marcos Holgado Date: Fri, 12 Feb 2021 10:41:01 +0000 Subject: [PATCH 10/10] Change default value for dismissible --- app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt index 14d240907a55..4d4654eb1205 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/DaxDialog.kt @@ -51,7 +51,7 @@ class TypewriterDaxDialog : DialogFragment(), DaxDialog { private var primaryButtonText: String = "" private var secondaryButtonText: String = "" private var toolbarDimmed: Boolean = true - private var dismissible: Boolean = true + private var dismissible: Boolean = false private var typingDelayInMs: Long = DEFAULT_TYPING_DELAY private var showHideButton: Boolean = true