1
0
Fork 0
fenix/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsStore.kt

92 lines
3.2 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 mozilla.components.feature.sitepermissions.SitePermissions
import mozilla.components.lib.state.Action
import mozilla.components.lib.state.State
import mozilla.components.lib.state.Store
import org.mozilla.fenix.settings.PhoneFeature
import org.mozilla.fenix.utils.Settings
class WebsitePermissionsStore(
initialState: WebsitePermissionsState
) : Store<WebsitePermissionsState, WebsitePermissionAction>(
initialState, ::reducer
) {
companion object {
fun createStore(
context: Context,
permissions: SitePermissions?,
settings: Settings
) = WebsitePermissionsStore(
WebsitePermissionsState(
camera = initWebsitePermission(context, PhoneFeature.CAMERA, permissions, settings),
microphone = initWebsitePermission(context, PhoneFeature.MICROPHONE, permissions, settings),
notification = initWebsitePermission(context, PhoneFeature.NOTIFICATION, permissions, settings),
location = initWebsitePermission(context, PhoneFeature.LOCATION, permissions, settings)
)
)
private fun initWebsitePermission(
context: Context,
phoneFeature: PhoneFeature,
permissions: SitePermissions?,
settings: Settings
): WebsitePermission {
val shouldBeVisible = phoneFeature.shouldBeVisible(permissions, settings)
return WebsitePermission(
name = phoneFeature.name,
status = phoneFeature.getActionLabel(context, permissions, settings),
visible = shouldBeVisible,
enabled = shouldBeVisible &&
phoneFeature.isAndroidPermissionGranted(context) &&
!phoneFeature.isUserPermissionGranted(permissions, settings)
)
}
private fun PhoneFeature.shouldBeVisible(
sitePermissions: SitePermissions?,
settings: Settings
) = getStatus(sitePermissions, settings) != SitePermissions.Status.NO_DECISION
private fun PhoneFeature.isUserPermissionGranted(
sitePermissions: SitePermissions?,
settings: Settings
) = getStatus(sitePermissions, settings) == SitePermissions.Status.BLOCKED
}
}
data class WebsitePermissionsState(
val camera: WebsitePermission,
val microphone: WebsitePermission,
val notification: WebsitePermission,
val location: WebsitePermission
) : State
sealed class WebsitePermissionAction : Action {
object Stub1 : WebsitePermissionAction()
object Stub2 : WebsitePermissionAction()
}
data class WebsitePermission(
val name: String,
val status: String,
val visible: Boolean,
val enabled: Boolean
)
fun reducer(
state: WebsitePermissionsState,
action: WebsitePermissionAction
): WebsitePermissionsState {
return when (action) {
WebsitePermissionAction.Stub1 -> state
WebsitePermissionAction.Stub2 -> state
}
}