Skip to content

Commit

Permalink
ADS: Site Permissions section migration (#2588)
Browse files Browse the repository at this point in the history
  • Loading branch information
nalcalag authored and malmstein committed Jan 12, 2023
1 parent faa50bb commit affb797
Show file tree
Hide file tree
Showing 28 changed files with 394 additions and 373 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import android.view.ViewGroup
import android.widget.CompoundButton
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.appcompat.content.res.AppCompatResources
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
Expand All @@ -48,9 +49,6 @@ import com.duckduckgo.app.sitepermissions.SitePermissionsListViewType.TOGGLE
import com.duckduckgo.mobile.android.databinding.RowOneLineListItemBinding
import com.duckduckgo.mobile.android.ui.menu.PopupMenu
import com.duckduckgo.mobile.android.ui.view.divider.HorizontalDivider
import com.duckduckgo.mobile.android.ui.view.gone
import com.duckduckgo.mobile.android.ui.view.quietlySetIsChecked
import com.duckduckgo.mobile.android.ui.view.show
import kotlinx.coroutines.launch

class SitePermissionsAdapter(
Expand All @@ -62,7 +60,12 @@ class SitePermissionsAdapter(
private var items: List<SitePermissionListItem> = listOf()
private var sitesEmpty: Boolean = true

fun updateItems(sites: List<String>, isLocationEnabled: Boolean, isCameraEnabled: Boolean, isMicEnabled: Boolean) {
fun updateItems(
sites: List<String>,
isLocationEnabled: Boolean,
isCameraEnabled: Boolean,
isMicEnabled: Boolean,
) {
val listItems = mutableListOf<SitePermissionListItem>()
listItems.add(SitePermissionsDescription())
listItems.add(SitePermissionsHeader(R.string.sitePermissionsSettingsEnablePermissionTitle))
Expand All @@ -81,7 +84,10 @@ class SitePermissionsAdapter(
notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): RecyclerView.ViewHolder =
when (SitePermissionsListViewType.values()[viewType]) {
DESCRIPTION -> {
val binding = ViewSitePermissionsDescriptionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
Expand Down Expand Up @@ -109,7 +115,10 @@ class SitePermissionsAdapter(
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
position: Int,
) {
when (val item = items[position]) {
is SitePermissionsHeader -> (holder as SitePermissionsHeaderViewHolder).bind(item.title, sitesEmpty)
is SitePermissionToggle -> (holder as SitePermissionToggleViewHolder).bind(item) { _, isChecked ->
Expand All @@ -136,17 +145,20 @@ class SitePermissionsAdapter(
private val layoutInflater: LayoutInflater,
private val viewModel: SitePermissionsViewModel,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(title: Int, isListEmpty: Boolean) {
fun bind(
title: Int,
isListEmpty: Boolean,
) {
when (title) {
R.string.sitePermissionsSettingsAllowedSitesTitle -> {
binding.overflowMenu.apply {
show()
binding.sitePermissionsSectionHeader.apply {
showOverflowMenuIcon(true)
setOnClickListener { showOverflowMenu(isListEmpty) }
}
}
else -> binding.overflowMenu.gone()
else -> binding.sitePermissionsSectionHeader.showOverflowMenuIcon(false)
}
binding.sitePermissionsSectionTitle.setText(title)
binding.sitePermissionsSectionHeader.setText(title)
}

private fun showOverflowMenu(removeDisabled: Boolean) {
Expand All @@ -155,7 +167,7 @@ class SitePermissionsAdapter(
if (removeDisabled) menuItem.isEnabled = false
popupMenu.apply {
onMenuItemClicked(menuItem) { viewModel.removeAllSitesSelected() }
show(binding.root, binding.overflowMenu)
show(binding.root, binding.sitePermissionsSectionHeader)
}
}
}
Expand All @@ -165,34 +177,37 @@ class SitePermissionsAdapter(
item: SitePermissionToggle,
listener: CompoundButton.OnCheckedChangeListener,
) {
binding.sitePermissionsToggle.setText(item.text)
binding.sitePermissionsToggle.quietlySetIsChecked(item.enable, listener)
val context = binding.root.context
binding.sitePermissionToggle.setPrimaryText(context.getString(item.text))
binding.sitePermissionToggle.quietlySetIsChecked(item.enable, listener)
val iconRes = when (item.text) {
R.string.sitePermissionsSettingsLocation -> {
if (item.enable) {
R.drawable.ic_location
R.drawable.ic_location_24
} else {
R.drawable.ic_location_disabled
R.drawable.ic_location_blocked_24
}
}
R.string.sitePermissionsSettingsCamera -> {
if (item.enable) {
R.drawable.ic_camera
R.drawable.ic_camera_24
} else {
R.drawable.ic_camera_disabled
R.drawable.ic_camera_blocked_24
}
}
R.string.sitePermissionsSettingsMicrophone -> {
if (item.enable) {
R.drawable.ic_microphone
R.drawable.ic_microphone_24
} else {
R.drawable.ic_microphone_disabled
R.drawable.ic_microphone_blocked_24
}
}
else -> null
}
iconRes?.let {
binding.sitePermissionToggleIcon.setImageResource(it)
AppCompatResources.getDrawable(context, it)?.let { drawable ->
binding.sitePermissionToggle.setLeadingIconDrawable(drawable)
}
}
}
}
Expand Down Expand Up @@ -222,7 +237,11 @@ class SitePermissionsAdapter(
sealed class SitePermissionListItem(val viewType: SitePermissionsListViewType) {
class SitePermissionsDescription : SitePermissionListItem(DESCRIPTION)
data class SitePermissionsHeader(@StringRes val title: Int) : SitePermissionListItem(HEADER)
data class SitePermissionToggle(@StringRes val text: Int, val enable: Boolean) : SitePermissionListItem(TOGGLE)
data class SitePermissionToggle(
@StringRes val text: Int,
val enable: Boolean,
) : SitePermissionListItem(TOGGLE)

class Divider : SitePermissionListItem(DIVIDER)
data class SiteAllowedItem(val domain: String) : SitePermissionListItem(SITE_ALLOWED_ITEM)
class EmptySites : SitePermissionListItem(SITES_EMPTY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ package com.duckduckgo.app.sitepermissions.permissionsperwebsite
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.duckduckgo.app.browser.R
import com.duckduckgo.app.browser.databinding.ItemSitePermissionSettingSelectionBinding
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionSettingAdapter.ViewHolder
import com.duckduckgo.site.permissions.store.sitepermissions.SitePermissionAskSettingType
import java.io.Serializable

class PermissionSettingAdapter(private val viewModel: PermissionsPerWebsiteViewModel) : RecyclerView.Adapter<ViewHolder>() {

Expand Down Expand Up @@ -57,50 +54,13 @@ class PermissionSettingAdapter(private val viewModel: PermissionsPerWebsiteViewM
private val viewModel: PermissionsPerWebsiteViewModel,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(setting: WebsitePermissionSetting) {
binding.permissionSettingIcon.setImageResource(setting.icon)
binding.permissionSettingSelectionTitle.setText(setting.title)
binding.permissionSetting.setText(setting.setting.toPrettyStringRes())
binding.root.setOnClickListener {
viewModel.permissionSettingSelected(setting)
val context = binding.root.context
binding.permissionSettingListItem.apply {
setLeadingIcon(setting.icon)
setPrimaryText(context.getString(setting.title))
setSecondaryText(context.getString(setting.setting.stringRes))
setOnClickListener { viewModel.permissionSettingSelected(setting) }
}
}
}
}

data class WebsitePermissionSetting(
val icon: Int,
val title: Int,
val setting: WebsitePermissionSettingType,
) : Serializable

enum class WebsitePermissionSettingType {
ASK,
ASK_DISABLED,
ALLOW,
DENY,
;

fun toPrettyStringRes(): Int =
when (this) {
ASK -> R.string.permissionsPerWebsiteAskSetting
ASK_DISABLED -> R.string.permissionsPerWebsiteAskDisabledSetting
ALLOW -> R.string.permissionsPerWebsiteAllowSetting
DENY -> R.string.permissionsPerWebsiteDenySetting
}

fun toSitePermissionSettingEntityType(): SitePermissionAskSettingType =
when (this) {
ASK, ASK_DISABLED -> SitePermissionAskSettingType.ASK_EVERY_TIME
ALLOW -> SitePermissionAskSettingType.ALLOW_ALWAYS
DENY -> SitePermissionAskSettingType.DENY_ALWAYS
}

companion object {
fun mapToWebsitePermissionSetting(askSettingType: String?): WebsitePermissionSettingType =
when (askSettingType) {
SitePermissionAskSettingType.ALLOW_ALWAYS.name -> ALLOW
SitePermissionAskSettingType.DENY_ALWAYS.name -> DENY
else -> ASK
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,18 @@ import com.duckduckgo.app.global.extensions.websiteFromGeoLocationsApiOrigin
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionsPerWebsiteViewModel.Command
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionsPerWebsiteViewModel.Command.GoBackToSitePermissions
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionsPerWebsiteViewModel.Command.ShowPermissionSettingSelectionDialog
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.ALLOW
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.ASK
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.Companion.getPermissionSettingOptionFromPosition
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.DENY
import com.duckduckgo.di.scopes.ActivityScope
import com.duckduckgo.mobile.android.ui.view.dialog.RadioListAlertDialogBuilder
import com.duckduckgo.mobile.android.ui.viewbinding.viewBinding
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch

@InjectWith(ActivityScope::class)
class PermissionsPerWebsiteActivity : DuckDuckGoActivity(), PermissionsSettingsSelectorFragment.Listener {
class PermissionsPerWebsiteActivity : DuckDuckGoActivity() {

private val viewModel: PermissionsPerWebsiteViewModel by bindViewModel()
private val binding: ActivityPermissionPerWebsiteBinding by viewBinding()
Expand Down Expand Up @@ -74,7 +79,10 @@ class PermissionsPerWebsiteActivity : DuckDuckGoActivity(), PermissionsSettingsS
private fun setViews() {
setupToolbar(toolbar)
supportActionBar?.title = url.websiteFromGeoLocationsApiOrigin()
binding.sitePermissionsSectionTitle.text = String.format(getString(R.string.permissionPerWebsiteText), url.websiteFromGeoLocationsApiOrigin())
binding.sitePermissionsSectionHeader.primaryText = String.format(
getString(R.string.permissionPerWebsiteText),
url.websiteFromGeoLocationsApiOrigin(),
)
binding.permissionsPerWebsiteRecyclerView.adapter = adapter
}

Expand Down Expand Up @@ -104,23 +112,46 @@ class PermissionsPerWebsiteActivity : DuckDuckGoActivity(), PermissionsSettingsS
adapter.updateItems(permissionsSettings)
}

private fun showPermissionSettingSelectionDialog(setting: WebsitePermissionSetting) {
val dialog = PermissionsSettingsSelectorFragment.create(setting, url.websiteFromGeoLocationsApiOrigin())
dialog.show(supportFragmentManager, PERMISSIONS_SETTING_SELECTOR_DIALOG_TAG)
private fun showPermissionSettingSelectionDialog(currentOption: WebsitePermissionSetting) {
val dialogTitle = String.format(
getString(R.string.permissionsPerWebsiteSelectorDialogTitle),
getString(currentOption.title),
url.websiteFromGeoLocationsApiOrigin(),
)
RadioListAlertDialogBuilder(this)
.setTitle(dialogTitle)
.setOptions(
listOf(
ASK.stringRes,
DENY.stringRes,
ALLOW.stringRes,
),
currentOption.setting.order,
)
.setPositiveButton(R.string.dialogSave)
.setNegativeButton(R.string.cancel)
.addEventListener(
object : RadioListAlertDialogBuilder.EventListener() {
override fun onPositiveButtonClicked(selectedItem: Int) {
val permissionSettingSelected = selectedItem.getPermissionSettingOptionFromPosition()
val newPermissionSetting = WebsitePermissionSetting(currentOption.icon, currentOption.title, permissionSettingSelected)
viewModel.onPermissionSettingSelected(newPermissionSetting, url)
}
},
)
.show()
}

companion object {
private const val EXTRA_URL = "URL"
private const val PERMISSIONS_SETTING_SELECTOR_DIALOG_TAG = "PERMISSIONS_SETTING_SELECTOR_DIALOG_TAG"

fun intent(context: Context, url: String): Intent {
fun intent(
context: Context,
url: String,
): Intent {
val intent = Intent(context, PermissionsPerWebsiteActivity::class.java)
intent.putExtra(EXTRA_URL, url)
return intent
}
}

override fun onPermissionSettingSelected(websitePermissionSetting: WebsitePermissionSetting) {
viewModel.onPermissionSettingSelected(websitePermissionSetting, url)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ import com.duckduckgo.app.location.data.LocationPermissionsRepository
import com.duckduckgo.app.settings.db.SettingsDataStore
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionsPerWebsiteViewModel.Command.GoBackToSitePermissions
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.PermissionsPerWebsiteViewModel.Command.ShowPermissionSettingSelectionDialog
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingType.ALLOW
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingType.ASK
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingType.ASK_DISABLED
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingType.DENY
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.ALLOW
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.ASK
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.ASK_DISABLED
import com.duckduckgo.app.sitepermissions.permissionsperwebsite.WebsitePermissionSettingOption.DENY
import com.duckduckgo.di.scopes.ActivityScope
import com.duckduckgo.site.permissions.impl.SitePermissionsRepository
import com.duckduckgo.site.permissions.store.sitepermissions.SitePermissionsEntity
Expand Down Expand Up @@ -77,17 +77,17 @@ class PermissionsPerWebsiteViewModel @Inject constructor(
sitePermissionsEntity: SitePermissionsEntity?,
locationPermissionEntity: LocationPermissionEntity?,
): List<WebsitePermissionSetting> {
var locationSetting = WebsitePermissionSettingType.mapToWebsitePermissionSetting(locationPermissionEntity?.permission?.name)
var locationSetting = WebsitePermissionSettingOption.mapToWebsitePermissionSetting(locationPermissionEntity?.permission?.name)
if (locationSetting == ASK && !settingsDataStore.appLocationPermission) {
locationSetting = ASK_DISABLED
}

var cameraSetting = WebsitePermissionSettingType.mapToWebsitePermissionSetting(sitePermissionsEntity?.askCameraSetting)
var cameraSetting = WebsitePermissionSettingOption.mapToWebsitePermissionSetting(sitePermissionsEntity?.askCameraSetting)
if (cameraSetting == ASK && !sitePermissionsRepository.askCameraEnabled) {
cameraSetting = ASK_DISABLED
}

var micSetting = WebsitePermissionSettingType.mapToWebsitePermissionSetting(sitePermissionsEntity?.askMicSetting)
var micSetting = WebsitePermissionSettingOption.mapToWebsitePermissionSetting(sitePermissionsEntity?.askMicSetting)
if (micSetting == ASK && !sitePermissionsRepository.askMicEnabled) {
micSetting = ASK_DISABLED
}
Expand All @@ -96,23 +96,23 @@ class PermissionsPerWebsiteViewModel @Inject constructor(
}

private fun getSettingsList(
locationSetting: WebsitePermissionSettingType,
cameraSetting: WebsitePermissionSettingType,
micSetting: WebsitePermissionSettingType,
locationSetting: WebsitePermissionSettingOption,
cameraSetting: WebsitePermissionSettingOption,
micSetting: WebsitePermissionSettingOption,
): List<WebsitePermissionSetting> {
return listOf(
WebsitePermissionSetting(
R.drawable.ic_location,
R.drawable.ic_location_24,
R.string.sitePermissionsSettingsLocation,
locationSetting,
),
WebsitePermissionSetting(
R.drawable.ic_camera,
R.drawable.ic_camera_24,
R.string.sitePermissionsSettingsCamera,
cameraSetting,
),
WebsitePermissionSetting(
R.drawable.ic_microphone,
R.drawable.ic_microphone_24,
R.string.sitePermissionsSettingsMicrophone,
micSetting,
),
Expand Down Expand Up @@ -164,7 +164,7 @@ class PermissionsPerWebsiteViewModel @Inject constructor(
_viewState.value = _viewState.value.copy(websitePermissions = getSettingsList(askLocationSetting, askCameraSetting, askMicSetting))
}

private fun updateLocationSetting(locationSetting: WebsitePermissionSettingType, url: String) {
private fun updateLocationSetting(locationSetting: WebsitePermissionSettingOption, url: String) {
val locationPermissionType = when (locationSetting) {
ASK, ASK_DISABLED -> LocationPermissionType.ALLOW_ONCE
DENY -> LocationPermissionType.DENY_ALWAYS
Expand All @@ -176,8 +176,8 @@ class PermissionsPerWebsiteViewModel @Inject constructor(
}

private fun updateSitePermissionsSetting(
askCameraSetting: WebsitePermissionSettingType,
askMicSetting: WebsitePermissionSettingType,
askCameraSetting: WebsitePermissionSettingOption,
askMicSetting: WebsitePermissionSettingOption,
url: String,
) {
val sitePermissionsEntity = SitePermissionsEntity(
Expand Down
Loading

0 comments on commit affb797

Please sign in to comment.