Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 6 additions & 35 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import androidx.webkit.ServiceWorkerClientCompat
import androidx.webkit.ServiceWorkerControllerCompat
import androidx.webkit.WebViewFeature
import com.duckduckgo.anvil.annotations.InjectWith
import com.duckduckgo.app.browser.BrowserActivity.Companion.DUCK_AI_ANIM_READY_DELAY_MS
import com.duckduckgo.app.browser.BrowserViewModel.Command
import com.duckduckgo.app.browser.animations.slideAndFadeInFromLeft
import com.duckduckgo.app.browser.animations.slideAndFadeInFromRight
Expand All @@ -73,27 +74,22 @@ import com.duckduckgo.app.downloads.DownloadsScreens.DownloadsScreenNoParams
import com.duckduckgo.app.feedback.ui.common.FeedbackActivity
import com.duckduckgo.app.fire.DataClearer
import com.duckduckgo.app.fire.DataClearerForegroundAppRestartPixel
import com.duckduckgo.app.firebutton.FireButtonStore
import com.duckduckgo.app.global.ApplicationClearDataState
import com.duckduckgo.app.global.events.db.UserEventsStore
import com.duckduckgo.app.global.intentText
import com.duckduckgo.app.global.rating.PromptCount
import com.duckduckgo.app.global.sanitize
import com.duckduckgo.app.global.view.ClearDataAction
import com.duckduckgo.app.global.view.FireDialog
import com.duckduckgo.app.global.view.FireDialogProvider
import com.duckduckgo.app.global.view.renderIfChanged
import com.duckduckgo.app.onboarding.ui.page.DefaultBrowserPage
import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.pixels.AppPixelName.FIRE_DIALOG_CANCEL
import com.duckduckgo.app.settings.clear.OnboardingExperimentFireAnimationHelper
import com.duckduckgo.app.settings.db.SettingsDataStore
import com.duckduckgo.app.statistics.pixels.Pixel
import com.duckduckgo.app.statistics.pixels.Pixel.PixelParameter
import com.duckduckgo.app.tabs.model.TabEntity
import com.duckduckgo.app.tabs.ui.DefaultSnackbar
import com.duckduckgo.app.tabs.ui.TabSwitcherActivity
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.autofill.api.emailprotection.EmailProtectionLinkVerifier
import com.duckduckgo.browser.api.ui.BrowserScreens.BookmarksScreenNoParams
import com.duckduckgo.browser.api.ui.BrowserScreens.SettingsScreenNoParams
Expand Down Expand Up @@ -158,9 +154,6 @@ open class BrowserActivity : DuckDuckGoActivity() {
@Inject
lateinit var dataClearerForegroundAppRestartPixel: DataClearerForegroundAppRestartPixel

@Inject
lateinit var userEventsStore: UserEventsStore

@Inject
lateinit var serviceWorkerClientCompat: ServiceWorkerClientCompat

Expand All @@ -176,15 +169,9 @@ open class BrowserActivity : DuckDuckGoActivity() {

@Inject lateinit var dispatcherProvider: DispatcherProvider

@Inject
lateinit var fireButtonStore: FireButtonStore

@Inject
lateinit var externalIntentProcessingState: ExternalIntentProcessingState

@Inject
lateinit var appBuildConfig: AppBuildConfig

@Inject
lateinit var swipingTabsFeature: SwipingTabsFeatureProvider

Expand All @@ -200,18 +187,15 @@ open class BrowserActivity : DuckDuckGoActivity() {
@Inject
lateinit var syncUrlIdentifier: SyncUrlIdentifier

@Inject
lateinit var onboardingDesignExperimentManager: OnboardingDesignExperimentManager

@Inject
lateinit var onboardingExperimentFireAnimationHelper: OnboardingExperimentFireAnimationHelper

@Inject
lateinit var omnibarEntryConverter: OmnibarEntryConverter

@Inject
lateinit var newAddressBarOptionManager: NewAddressBarOptionManager

@Inject
lateinit var fireDialogProvider: FireDialogProvider

private val lastActiveTabs = TabList()

private var duckAiFragment: DuckChatWebViewFragment? = null
Expand Down Expand Up @@ -804,20 +788,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
val params = mapOf(PixelParameter.FROM_FOCUSED_NTP to launchedFromFocusedNtp.toString())
pixel.fire(AppPixelName.FORGET_ALL_PRESSED_BROWSING, params)

val dialog =
FireDialog(
context = this,
clearPersonalDataAction = clearPersonalDataAction,
pixel = pixel,
settingsDataStore = settingsDataStore,
userEventsStore = userEventsStore,
appCoroutineScope = appCoroutineScope,
dispatcherProvider = dispatcherProvider,
fireButtonStore = fireButtonStore,
appBuildConfig = appBuildConfig,
onboardingDesignExperimentManager = onboardingDesignExperimentManager,
onboardingExperimentFireAnimationHelper = onboardingExperimentFireAnimationHelper,
)
val dialog = fireDialogProvider.createFireDialog(context = this)
dialog.setOnShowListener { currentTab?.onFireDialogVisibilityChanged(isVisible = true) }
dialog.setOnCancelListener {
pixel.fire(FIRE_DIALOG_CANCEL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.duckduckgo.app.browser.databinding.ActivityDataClearingBinding
import com.duckduckgo.app.fire.fireproofwebsite.ui.FireproofWebsitesActivity
import com.duckduckgo.app.firebutton.FireButtonViewModel.AutomaticallyClearData
import com.duckduckgo.app.firebutton.FireButtonViewModel.Command
import com.duckduckgo.app.global.view.FireDialogProvider
import com.duckduckgo.app.pixels.AppPixelName
import com.duckduckgo.app.settings.FireAnimationActivity
import com.duckduckgo.app.settings.clear.ClearWhatOption
Expand Down Expand Up @@ -61,6 +62,9 @@ class FireButtonActivity : DuckDuckGoActivity() {
@Inject
lateinit var appBuildConfig: AppBuildConfig

@Inject
lateinit var fireDialogProvider: FireDialogProvider

private val viewModel: FireButtonViewModel by bindViewModel()
private val binding: ActivityDataClearingBinding by viewBinding()

Expand All @@ -86,6 +90,7 @@ class FireButtonActivity : DuckDuckGoActivity() {
automaticallyClearWhenSetting.setClickListener { viewModel.onAutomaticallyClearWhenClicked() }
selectedFireAnimationSetting.setClickListener { viewModel.userRequestedToChangeFireAnimation() }
clearDuckAiDataSetting.setOnCheckedChangeListener { _, isChecked -> viewModel.onClearDuckAiDataToggled(isChecked) }
clearDataAction.setClickListener { viewModel.onClearDataActionClicked() }
}
}

Expand All @@ -97,6 +102,7 @@ class FireButtonActivity : DuckDuckGoActivity() {
updateAutomaticClearDataOptions(it.automaticallyClearData, it.clearDuckAiData)
updateSelectedFireAnimation(it.selectedFireAnimation)
updateClearDuckAiDataSetting(it.clearDuckAiData, it.showClearDuckAiDataSetting)
updateClearDataAction(it.clearDuckAiData)
}
}.launchIn(lifecycleScope)

Expand Down Expand Up @@ -133,12 +139,23 @@ class FireButtonActivity : DuckDuckGoActivity() {
binding.clearDuckAiDataSetting.visibility = if (isVisible) View.VISIBLE else View.GONE
}

private fun updateClearDataAction(clearDuckAiData: Boolean) {
if (clearDuckAiData) {
binding.clearDataAction.setPrimaryText(resources.getString(R.string.fireClearAllPlusDuckChats))
binding.clearDataAction.setSecondaryText(resources.getString(R.string.settingsClearDataActionPlusDuckChatsSecondaryText))
} else {
binding.clearDataAction.setPrimaryText(resources.getString(R.string.fireClearAll))
binding.clearDataAction.setSecondaryText(resources.getString(R.string.settingsClearDataActionSecondaryText))
}
}

private fun processCommand(it: Command) {
when (it) {
is Command.LaunchFireproofWebsites -> launchFireproofWebsites()
is Command.ShowClearWhatDialog -> launchAutomaticallyClearWhatDialog(it.option, it.clearDuckAi)
is Command.ShowClearWhenDialog -> launchAutomaticallyClearWhenDialog(it.option)
is Command.LaunchFireAnimationSettings -> launchFireAnimationSelector(it.animation)
is Command.LaunchFireDialog -> launchFireDialog()
}
}

Expand Down Expand Up @@ -270,6 +287,11 @@ class FireButtonActivity : DuckDuckGoActivity() {
.show()
}

private fun launchFireDialog() {
val dialog = fireDialogProvider.createFireDialog(context = this)
dialog.show()
}

companion object {
const val LAUNCH_FROM_NOTIFICATION_PIXEL_NAME = "LAUNCH_FROM_NOTIFICATION_PIXEL_NAME"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class FireButtonViewModel @Inject constructor(
val selectedFireAnimation: FireAnimation = FireAnimation.HeroFire,
val clearDuckAiData: Boolean = false,
val showClearDuckAiDataSetting: Boolean = false,
val clerDataWithDuckAiChats: Boolean = false,
)

data class AutomaticallyClearData(
Expand All @@ -75,6 +76,7 @@ class FireButtonViewModel @Inject constructor(

data class ShowClearWhenDialog(val option: ClearWhenOption) : Command()
data class LaunchFireAnimationSettings(val animation: FireAnimation) : Command()
data object LaunchFireDialog : Command()
}

private val viewState = MutableStateFlow(ViewState())
Expand Down Expand Up @@ -213,6 +215,10 @@ class FireButtonViewModel @Inject constructor(
}
}

fun onClearDataActionClicked() {
viewModelScope.launch { command.send(Command.LaunchFireDialog) }
}

private fun ClearWhatOption.pixelEvent(): Pixel.PixelName {
return when (this) {
ClearWhatOption.CLEAR_NONE -> AppPixelName.AUTOMATIC_CLEAR_DATA_WHAT_OPTION_NONE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Copyright (c) 2025 DuckDuckGo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.duckduckgo.app.global.view

import android.content.Context
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.firebutton.FireButtonStore
import com.duckduckgo.app.global.events.db.UserEventsStore
import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager
import com.duckduckgo.app.settings.clear.OnboardingExperimentFireAnimationHelper
import com.duckduckgo.app.settings.db.SettingsDataStore
import com.duckduckgo.app.statistics.pixels.Pixel
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
import com.squareup.anvil.annotations.ContributesBinding
import dagger.SingleInstanceIn
import kotlinx.coroutines.CoroutineScope
import javax.inject.Inject

interface FireDialogProvider {
fun createFireDialog(context: Context): FireDialog
}

@ContributesBinding(scope = AppScope::class)
@SingleInstanceIn(scope = AppScope::class)
class FireDialogLauncherImpl @Inject constructor() : FireDialogProvider {

@Inject
lateinit var clearPersonalDataAction: ClearDataAction

@Inject
lateinit var pixel: Pixel

@Inject
lateinit var settingsDataStore: SettingsDataStore

@Inject
lateinit var userEventsStore: UserEventsStore

@AppCoroutineScope
@Inject
lateinit var appCoroutineScope: CoroutineScope

@Inject
lateinit var dispatcherProvider: DispatcherProvider

@Inject
lateinit var fireButtonStore: FireButtonStore

@Inject
lateinit var appBuildConfig: AppBuildConfig

@Inject
lateinit var onboardingDesignExperimentManager: OnboardingDesignExperimentManager

@Inject
lateinit var onboardingExperimentFireAnimationHelper: OnboardingExperimentFireAnimationHelper

override fun createFireDialog(context: Context): FireDialog = FireDialog(
context = context,
clearPersonalDataAction = clearPersonalDataAction,
pixel = pixel,
settingsDataStore = settingsDataStore,
userEventsStore = userEventsStore,
appCoroutineScope = appCoroutineScope,
dispatcherProvider = dispatcherProvider,
fireButtonStore = fireButtonStore,
appBuildConfig = appBuildConfig,
onboardingDesignExperimentManager = onboardingDesignExperimentManager,
onboardingExperimentFireAnimationHelper = onboardingExperimentFireAnimationHelper,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,9 @@ import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarObserv
import com.duckduckgo.app.browser.navigation.bar.view.BrowserNavigationBarView
import com.duckduckgo.app.browser.omnibar.OmnibarType
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewPersister
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.downloads.DownloadsActivity
import com.duckduckgo.app.firebutton.FireButtonStore
import com.duckduckgo.app.global.events.db.UserEventsStore
import com.duckduckgo.app.global.view.ClearDataAction
import com.duckduckgo.app.global.view.FireDialog
import com.duckduckgo.app.onboardingdesignexperiment.OnboardingDesignExperimentManager
import com.duckduckgo.app.global.view.FireDialogProvider
import com.duckduckgo.app.settings.SettingsActivity
import com.duckduckgo.app.settings.clear.OnboardingExperimentFireAnimationHelper
import com.duckduckgo.app.settings.db.SettingsDataStore
import com.duckduckgo.app.statistics.pixels.Pixel
import com.duckduckgo.app.tabs.TabManagerFeatureFlags
Expand All @@ -77,7 +71,6 @@ import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowUndoBookmarkM
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowUndoDeleteTabsMessage
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.Mode
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.ViewState.Mode.Selection
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.common.ui.DuckDuckGoActivity
import com.duckduckgo.common.ui.menu.PopupMenu
import com.duckduckgo.common.ui.view.button.ButtonType
Expand All @@ -101,7 +94,6 @@ import kotlinx.coroutines.launch
import logcat.LogPriority.WARN
import logcat.asLog
import logcat.logcat
import java.util.ArrayList
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlin.math.max
Expand All @@ -120,9 +112,6 @@ class TabSwitcherActivity :
@Inject
lateinit var settingsDataStore: SettingsDataStore

@Inject
lateinit var clearPersonalDataAction: ClearDataAction

@Inject
lateinit var gridViewColumnCalculator: GridViewColumnCalculator

Expand All @@ -135,22 +124,6 @@ class TabSwitcherActivity :
@Inject
lateinit var faviconManager: FaviconManager

@Inject
lateinit var userEventsStore: UserEventsStore

@Inject
@AppCoroutineScope
lateinit var appCoroutineScope: CoroutineScope

@Inject
lateinit var dispatcherProvider: DispatcherProvider

@Inject
lateinit var fireButtonStore: FireButtonStore

@Inject
lateinit var appBuildConfig: AppBuildConfig

@Inject
lateinit var duckChat: DuckChat

Expand All @@ -161,10 +134,7 @@ class TabSwitcherActivity :
lateinit var tabManagerFeatureFlags: TabManagerFeatureFlags

@Inject
lateinit var onboardingDesignExperimentManager: OnboardingDesignExperimentManager

@Inject
lateinit var onboardingExperimentFireAnimationHelper: OnboardingExperimentFireAnimationHelper
lateinit var fireDialogProvider: FireDialogProvider

@Inject
lateinit var omnibarRepository: OmnibarRepository
Expand Down Expand Up @@ -655,20 +625,7 @@ class TabSwitcherActivity :
}

private fun onFireButtonClicked() {
val dialog =
FireDialog(
context = this,
clearPersonalDataAction = clearPersonalDataAction,
pixel = pixel,
settingsDataStore = settingsDataStore,
userEventsStore = userEventsStore,
appCoroutineScope = appCoroutineScope,
dispatcherProvider = dispatcherProvider,
fireButtonStore = fireButtonStore,
appBuildConfig = appBuildConfig,
onboardingDesignExperimentManager = onboardingDesignExperimentManager,
onboardingExperimentFireAnimationHelper = onboardingExperimentFireAnimationHelper,
)
val dialog = fireDialogProvider.createFireDialog(context = this)
dialog.show()
}

Expand Down
Loading
Loading