Skip to content

Commit

Permalink
Settings: prevent screen lock
Browse files Browse the repository at this point in the history
  • Loading branch information
BLeeEZ committed Dec 10, 2023
1 parent 8ce9c00 commit 19a06ec
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 0 deletions.
25 changes: 25 additions & 0 deletions Amperfy/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
UINavigationBar.appearance().shadowImage = UIImage()
}

func configureBatteryMonitoring() {
UIDevice.current.isBatteryMonitoringEnabled =
(AmperKit.shared.storage.settings.screenLockPreventionPreference == .onlyIfCharging)
configureLockScreenPrevention()
NotificationCenter.default.addObserver(self, selector: #selector(batteryStateDidChange), name: UIDevice.batteryStateDidChangeNotification, object: nil)
}

@objc private func batteryStateDidChange(notification: NSNotification) {
configureLockScreenPrevention()
}

func configureLockScreenPrevention() {
os_log("Device Battery Status: %s", log: self.log, type: .info, UIDevice.current.batteryState.description)
switch(AmperKit.shared.storage.settings.screenLockPreventionPreference) {
case .always:
isKeepScreenAlive = true
case .never:
isKeepScreenAlive = false
case .onlyIfCharging:
isKeepScreenAlive = UIDevice.current.batteryState != .unplugged
}
os_log("Lock Screen Prevention: %s", log: self.log, type: .info, isKeepScreenAlive.description)
}

func configureBackgroundFetch() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: Self.refreshTaskId, using: nil) { task in
os_log("Perform task: %s", log: self.log, type: .info, Self.refreshTaskId)
Expand Down Expand Up @@ -167,6 +191,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}

configureDefaultNavigationBarStyle()
configureBatteryMonitoring()
configureBackgroundFetch()
configureNotificationHandling()
initEventLogger()
Expand Down
5 changes: 5 additions & 0 deletions Amperfy/Screens/ViewController/SettingsHostVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ class SettingsHostVC: UIViewController {
self.appDelegate.sleepTimer = newValue
}))

settings.screenLockPreventionPreference = self.appDelegate.storage.settings.screenLockPreventionPreference
changesAgent.append(settings.$screenLockPreventionPreference.sink(receiveValue: { newValue in
self.appDelegate.storage.settings.screenLockPreventionPreference = newValue
}))

settings.isAutoCacheLatestSongs = self.appDelegate.storage.settings.isAutoDownloadLatestSongsActive
changesAgent.append(settings.$isAutoCacheLatestSongs.sink(receiveValue: { newValue in
self.appDelegate.storage.settings.isAutoDownloadLatestSongsActive = newValue
Expand Down
1 change: 1 addition & 0 deletions Amperfy/SwiftUI/Settings/ObservableSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ final class Settings: ObservableObject {
@Published var isOfflineMode = false
@Published var sleepTimerInterval = 0
@Published var sleepTimer: Timer? = nil
@Published var screenLockPreventionPreference: ScreenLockPreventionPreference = .defaultValue
@Published var isAutoCacheLatestSongs = false
@Published var isAutoCacheLatestPodcastEpisodes = false
@Published var isPlayerAutoCachePlayedItems = false
Expand Down
30 changes: 30 additions & 0 deletions Amperfy/SwiftUI/Settings/SettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,24 @@ struct SettingsView: View {

@EnvironmentObject private var settings: Settings

func screenLockPreventionOffPressed() {
settings.screenLockPreventionPreference = .never
UIDevice.current.isBatteryMonitoringEnabled = false
appDelegate.configureLockScreenPrevention()
}

func screenLockPreventionOnPressed() {
settings.screenLockPreventionPreference = .always
UIDevice.current.isBatteryMonitoringEnabled = false
appDelegate.configureLockScreenPrevention()
}

func screenLockPreventionChargingPressed() {
settings.screenLockPreventionPreference = .onlyIfCharging
UIDevice.current.isBatteryMonitoringEnabled = true
appDelegate.configureLockScreenPrevention()
}

var body: some View {
NavigationView {
List {
Expand Down Expand Up @@ -62,6 +80,18 @@ struct SettingsView: View {
}
}

Section(content: {
HStack {
Text("Prevent Screen Lock")
Spacer()
Menu(settings.screenLockPreventionPreference.description) {
Button(ScreenLockPreventionPreference.never.description, action: screenLockPreventionOffPressed)
Button(ScreenLockPreventionPreference.always.description, action: screenLockPreventionOnPressed)
Button(ScreenLockPreventionPreference.onlyIfCharging.description, action: screenLockPreventionChargingPressed)
}
}
})

Section() {
NavigationLink(destination: ServerSettingsView()) {
Text("Server")
Expand Down
17 changes: 17 additions & 0 deletions Amperfy/UtilitiesExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,23 @@ extension UIImage {
}
}

extension UIDevice.BatteryState {
public var description: String {
switch self {
case .unknown:
return "unknown"
case .unplugged:
return "unplugged"
case .charging:
return "charging"
case .full:
return "full"
@unknown default:
return "@unknown default"
}
}
}

/// This fixes in swiftui mutliple picker views side by side to overlapp their touch areas
/// This is effective in addition to use .clipped() which only fixes the overlapping area visually
extension UIPickerView {
Expand Down
28 changes: 28 additions & 0 deletions AmperfyKit/Storage/PersistentStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,25 @@ public enum ArtworkDisplayPreference: Int, CaseIterable {
}
}

public enum ScreenLockPreventionPreference: Int, CaseIterable {
case always = 0
case never = 1
case onlyIfCharging = 2

public static let defaultValue: ScreenLockPreventionPreference = .never

public var description: String {
switch self {
case .always:
return "Always"
case .never:
return "Never"
case .onlyIfCharging:
return "When connected to charger"
}
}
}

public class CoreDataCompanion {
public let context: NSManagedObjectContext
public let library: LibraryStorage
Expand Down Expand Up @@ -114,6 +133,7 @@ public class PersistentStorage {
case ArtworkDownloadSetting = "artworkDownloadSetting"
case ArtworkDisplayPreference = "artworkDisplayPreference"
case SleepTimerInterval = "sleepTimerInterval"
case ScreenLockPreventionPreference = "screenLockPreventionPreference"
case CacheLimit = "cacheLimitInBytes" // limit in byte

case SongActionOnTab = "songActionOnTab"
Expand Down Expand Up @@ -164,6 +184,14 @@ public class PersistentStorage {
set { UserDefaults.standard.set(newValue, forKey: UserDefaultsKey.SleepTimerInterval.rawValue) }
}

public var screenLockPreventionPreference: ScreenLockPreventionPreference {
get {
let screenLockPreventionPreferenceRaw = UserDefaults.standard.object(forKey: UserDefaultsKey.ScreenLockPreventionPreference.rawValue) as? Int ?? ScreenLockPreventionPreference.defaultValue.rawValue
return ScreenLockPreventionPreference(rawValue: screenLockPreventionPreferenceRaw) ?? ScreenLockPreventionPreference.defaultValue
}
set { UserDefaults.standard.set(newValue.rawValue, forKey: UserDefaultsKey.ScreenLockPreventionPreference.rawValue) }
}

public var cacheLimit: Int {
get {
return UserDefaults.standard.object(forKey: UserDefaultsKey.CacheLimit.rawValue) as? Int ?? 0
Expand Down

0 comments on commit 19a06ec

Please sign in to comment.