You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/main/java/org/mozilla/fenix/settings/quicksettings/ClearSiteDataView.kt

119 lines
3.9 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.settings.quicksettings
import android.content.Context
import android.content.DialogInterface
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.core.text.HtmlCompat
import androidx.core.view.isVisible
import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import mozilla.components.ui.widgets.withCenterAlignedButtons
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.QuicksettingsClearSiteDataBinding
import org.mozilla.fenix.ext.components
/**
* Contract declaring all possible user interactions with [ClearSiteDataView].
*/
interface ClearSiteDataViewInteractor {
/**
* Shows the confirmation dialog to clear site data for [baseDomain].
*/
fun onClearSiteDataClicked(baseDomain: String)
}
/**
* MVI View to access the dialog to clear site cookies and data.
*
* @property context An Android [Context].
* @property ioScope [CoroutineScope] with an IO dispatcher used for structured concurrency.
* @property containerView [ViewGroup] in which this View will inflate itself.
* @property containerDivider Divider [View] to manipulate.
* @property interactor [ClearSiteDataViewInteractor] which will have delegated to all user
* interactions.
* @property navController [NavController] used for navigation.
*/
class ClearSiteDataView(
val context: Context,
private val ioScope: CoroutineScope,
val containerView: ViewGroup,
val containerDivider: View,
val interactor: ClearSiteDataViewInteractor,
val navController: NavController,
) {
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
lateinit var websiteUrl: String
val binding = QuicksettingsClearSiteDataBinding.inflate(
LayoutInflater.from(context),
containerView,
true,
)
fun update(webInfoState: WebsiteInfoState) {
websiteUrl = webInfoState.websiteUrl
setVisibility(true)
binding.clearSiteData.setOnClickListener {
askToClear()
navController.popBackStack()
}
}
private fun setVisibility(visible: Boolean) {
binding.root.isVisible = visible
containerDivider.isVisible = visible
}
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal fun askToClear() {
ioScope.launch {
val publicSuffixList = context.components.publicSuffixList
val host = websiteUrl.toUri().host.orEmpty()
val domain = publicSuffixList.getPublicSuffixPlusOne(host).await()
domain?.let { baseDomain ->
launch(Dispatchers.Main) {
showConfirmationDialog(baseDomain)
}
}
}
}
private fun showConfirmationDialog(baseDomain: String) {
AlertDialog.Builder(context).apply {
setMessage(
HtmlCompat.fromHtml(
context.getString(
R.string.confirm_clear_site_data,
baseDomain,
),
HtmlCompat.FROM_HTML_MODE_LEGACY,
),
)
setNegativeButton(R.string.delete_browsing_data_prompt_cancel) { it: DialogInterface, _ ->
it.cancel()
}
setPositiveButton(R.string.delete_browsing_data_prompt_allow) { it: DialogInterface, _ ->
it.dismiss()
interactor.onClearSiteDataClicked(baseDomain)
}
create().withCenterAlignedButtons()
}.show()
}
}