Files
iOS/Sources/App/Utilities/PermissionStatusRow.swift
mat1th 97834bfd5e Update swift lint and format + appy fixes (#2585)
## Summary
Swift lint and swiftformat are outdated. This PR does update those +
applies the new formatting form swiftformat.
There is 1 swift file with a manual change:
`Sources/Vehicle/Templates/Areas/CarPlayAreasViewModel.swift`. This is
done because `swiftlint` did create the following swiftlint error:
`error: Cyclomatic Complexity Violation: Function should have complexity
10 or less; currently complexity is 11 (cyclomatic_complexity)`.

Because it does change a lot of files the question is if we want to
finetune the `swiftformat` rules.

## Screenshots
No user facing changes.

## Link to pull request in Documentation repository
NA

## Any other notes
NA
2024-02-22 13:06:39 +01:00

175 lines
5.7 KiB
Swift

import CoreLocation
import CoreMotion
import Eureka
import Foundation
import Shared
import UIKit
public final class LocationPermissionRow: Row<LabelCellOf<CLAuthorizationStatus>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
displayValueFor = { value in
guard let value else { return nil }
switch value {
case .authorizedAlways:
return L10n.SettingsDetails.Location.LocationPermission.always
case .authorizedWhenInUse:
return L10n.SettingsDetails.Location.LocationPermission.whileInUse
case .denied, .restricted:
return L10n.SettingsDetails.Location.LocationPermission.never
case .notDetermined:
return L10n.SettingsDetails.Location.LocationPermission.needsRequest
@unknown default:
return L10n.SettingsDetails.Location.LocationPermission.never
}
}
}
}
public final class LocationAccuracyRow: Row<LabelCellOf<CLAccuracyAuthorization>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
displayValueFor = { value in
guard let value else { return nil }
switch value {
case .fullAccuracy: return L10n.SettingsDetails.Location.LocationAccuracy.full
case .reducedAccuracy: return L10n.SettingsDetails.Location.LocationAccuracy.reduced
@unknown default:
return L10n.SettingsDetails.Location.LocationAccuracy.reduced
}
}
}
}
public final class MotionPermissionRow: Row<LabelCellOf<CMAuthorizationStatus>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
displayValueFor = { value in
guard let value else { return nil }
switch value {
case .authorized:
return L10n.SettingsDetails.Location.MotionPermission.enabled
case .denied, .restricted:
return L10n.SettingsDetails.Location.MotionPermission.denied
case .notDetermined:
return L10n.SettingsDetails.Location.MotionPermission.needsRequest
@unknown default:
return L10n.SettingsDetails.Location.MotionPermission.denied
}
}
}
}
public final class FocusPermissionRow: Row<LabelCellOf<FocusStatusWrapper.AuthorizationStatus>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
displayValueFor = { value in
guard let value else { return nil }
switch value {
case .authorized:
return L10n.SettingsDetails.Location.MotionPermission.enabled
case .denied, .restricted:
return L10n.SettingsDetails.Location.MotionPermission.denied
case .notDetermined:
return L10n.SettingsDetails.Location.MotionPermission.needsRequest
}
}
}
}
public final class BackgroundRefreshStatusRow: Row<LabelCellOf<UIBackgroundRefreshStatus>>, RowType {
public required init(tag: String?) {
super.init(tag: tag)
displayValueFor = { value in
guard let value else { return nil }
switch value {
case .restricted, .denied:
return L10n.SettingsDetails.Location.BackgroundRefresh.disabled
case .available:
return L10n.SettingsDetails.Location.BackgroundRefresh.enabled
@unknown default:
return L10n.SettingsDetails.Location.BackgroundRefresh.disabled
}
}
}
}
extension Condition {
private static func locationPermissionAlways(from form: Form) -> Bool? {
guard let row = form.rowBy(tag: "locationPermission") as? LocationPermissionRow else {
return nil
}
switch row.value {
case .some(.authorizedAlways):
return true
default:
return false
}
}
private static func locationAccuracyFull(from form: Form) -> Bool? {
guard let row = form.rowBy(tag: "locationAccuracy") as? LocationAccuracyRow else {
return nil
}
switch row.value {
case .some(.fullAccuracy):
return true
default:
return false
}
}
private static func backgroundRefreshAvailable(from form: Form) -> Bool? {
guard let backgroundRefreshRow = form.rowBy(tag: "backgroundRefresh") as? BackgroundRefreshStatusRow else {
return nil
}
switch backgroundRefreshRow.value {
case .some(.available):
return true
default:
return false
}
}
struct LocationCondition: OptionSet {
let rawValue: Int
init(rawValue: Int) { self.rawValue = rawValue }
static let permissionNotAlways = LocationCondition(rawValue: 0b1)
static let accuracyNotFull = LocationCondition(rawValue: 0b10)
static let backgroundRefreshNotAvailable = LocationCondition(rawValue: 0b100)
}
static func location(
conditions: LocationCondition
) -> Condition {
.function(["locationPermission", "locationAccuracy", "backgroundRefresh"], { form in
if conditions.contains(.permissionNotAlways), locationPermissionAlways(from: form) == false {
return true
}
if conditions.contains(.accuracyNotFull), locationAccuracyFull(from: form) == false {
return true
}
if conditions.contains(.backgroundRefreshNotAvailable), backgroundRefreshAvailable(from: form) == false {
return true
}
return false
})
}
}