-
-
Notifications
You must be signed in to change notification settings - Fork 205
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1083 from TortugaPower/refactor-settings
Refactor autolock and autoplay settings
- Loading branch information
Showing
32 changed files
with
424 additions
and
216 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// | ||
// SettingsAutolockView.swift | ||
// BookPlayer | ||
// | ||
// Created by Gianni Carlo on 11/1/24. | ||
// Copyright © 2024 Tortuga Power. All rights reserved. | ||
// | ||
|
||
import BookPlayerKit | ||
import SwiftUI | ||
|
||
struct SettingsAutolockView<Model: SettingsAutolockViewModelProtocol>: View { | ||
|
||
@StateObject var themeViewModel = ThemeViewModel() | ||
@ObservedObject var viewModel: Model | ||
|
||
var body: some View { | ||
if #available(iOS 16.0, *) { | ||
formView | ||
.scrollContentBackground(.hidden) | ||
} else { | ||
formView | ||
} | ||
} | ||
|
||
var formView: some View { | ||
Form { | ||
Section { | ||
Toggle(isOn: $viewModel.autolockDisabled, label: { | ||
Text("settings_autolock_title".localized) | ||
.foregroundColor(themeViewModel.primaryColor) | ||
}) | ||
Toggle(isOn: $viewModel.onlyWhenPoweredEnabled, label: { | ||
Text("settings_power_connected_title".localized) | ||
.foregroundColor(themeViewModel.primaryColor) | ||
}) | ||
.disabled(!viewModel.autolockDisabled) | ||
} footer: { | ||
Text("settings_autolock_description".localized) | ||
.foregroundColor(themeViewModel.secondaryColor) | ||
} | ||
.listRowBackground(themeViewModel.secondarySystemBackgroundColor) | ||
} | ||
.background( | ||
themeViewModel.systemGroupedBackgroundColor | ||
.edgesIgnoringSafeArea(.bottom) | ||
) | ||
.environmentObject(themeViewModel) | ||
.navigationTitle(viewModel.navigationTitle) | ||
.navigationBarTitleDisplayMode(.inline) | ||
.toolbar { | ||
ToolbarItem(placement: .navigationBarLeading) { | ||
Button( | ||
action: viewModel.dismiss, | ||
label: { | ||
Image(systemName: "xmark") | ||
.foregroundColor(themeViewModel.linkColor) | ||
} | ||
) | ||
} | ||
} | ||
} | ||
} | ||
|
||
struct SettingsAutolockViewView_Previews: PreviewProvider { | ||
static var previews: some View { | ||
SettingsAutolockView(viewModel: SettingsAutolockViewModel()) | ||
} | ||
} |
64 changes: 64 additions & 0 deletions
64
BookPlayer/Settings/Autolock/SettingsAutolockViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
// | ||
// SettingsAutolockViewModel.swift | ||
// BookPlayer | ||
// | ||
// Created by Gianni Carlo on 11/1/24. | ||
// Copyright © 2024 Tortuga Power. All rights reserved. | ||
// | ||
|
||
import BookPlayerKit | ||
import SwiftUI | ||
|
||
protocol SettingsAutolockViewModelProtocol: ObservableObject { | ||
var navigationTitle: String { get } | ||
|
||
var autolockDisabled: Bool { get set } | ||
var onlyWhenPoweredEnabled: Bool { get set } | ||
|
||
func dismiss() | ||
} | ||
|
||
final class SettingsAutolockViewModel: SettingsAutolockViewModelProtocol { | ||
/// Available routes | ||
enum Routes { | ||
case dismiss | ||
} | ||
|
||
// MARK: - Properties | ||
|
||
/// Callback to handle actions on this screen | ||
var onTransition: BPTransition<Routes>? | ||
|
||
@Published var autolockDisabled: Bool { | ||
didSet { | ||
UserDefaults.standard.set( | ||
autolockDisabled, | ||
forKey: Constants.UserDefaults.autolockDisabled | ||
) | ||
} | ||
} | ||
|
||
@Published var onlyWhenPoweredEnabled: Bool { | ||
didSet { | ||
UserDefaults.standard.set( | ||
onlyWhenPoweredEnabled, | ||
forKey: Constants.UserDefaults.autolockDisabledOnlyWhenPowered | ||
) | ||
} | ||
} | ||
|
||
let navigationTitle = "settings_autlock_section_title".localized | ||
|
||
init() { | ||
autolockDisabled = UserDefaults.standard.bool( | ||
forKey: Constants.UserDefaults.autolockDisabled | ||
) | ||
onlyWhenPoweredEnabled = UserDefaults.standard.bool( | ||
forKey: Constants.UserDefaults.autolockDisabledOnlyWhenPowered | ||
) | ||
} | ||
|
||
func dismiss() { | ||
onTransition?(.dismiss) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// | ||
// SettingsAutoplayView.swift | ||
// BookPlayer | ||
// | ||
// Created by Gianni Carlo on 8/1/24. | ||
// Copyright © 2024 Tortuga Power. All rights reserved. | ||
// | ||
|
||
import BookPlayerKit | ||
import SwiftUI | ||
|
||
struct SettingsAutoplayView<Model: SettingsAutoplayViewModelProtocol>: View { | ||
|
||
@StateObject var themeViewModel = ThemeViewModel() | ||
@ObservedObject var viewModel: Model | ||
|
||
var body: some View { | ||
if #available(iOS 16.0, *) { | ||
formView | ||
.scrollContentBackground(.hidden) | ||
} else { | ||
formView | ||
} | ||
} | ||
|
||
var formView: some View { | ||
Form { | ||
Section { | ||
Toggle(isOn: $viewModel.autoplayLibraryEnabled, label: { | ||
Text("settings_autoplay_title".localized) | ||
.foregroundColor(themeViewModel.primaryColor) | ||
}) | ||
Toggle(isOn: $viewModel.autoplayRestartFinishedEnabled, label: { | ||
Text("settings_autoplay_restart_title".localized) | ||
.foregroundColor(themeViewModel.primaryColor) | ||
}) | ||
.disabled(!viewModel.autoplayLibraryEnabled) | ||
} footer: { | ||
Text("settings_autoplay_description".localized) | ||
.foregroundColor(themeViewModel.secondaryColor) | ||
} | ||
.listRowBackground(themeViewModel.secondarySystemBackgroundColor) | ||
} | ||
.background( | ||
themeViewModel.systemGroupedBackgroundColor | ||
.edgesIgnoringSafeArea(.bottom) | ||
) | ||
.environmentObject(themeViewModel) | ||
.navigationTitle(viewModel.navigationTitle) | ||
.navigationBarTitleDisplayMode(.inline) | ||
.toolbar { | ||
ToolbarItem(placement: .navigationBarLeading) { | ||
Button( | ||
action: viewModel.dismiss, | ||
label: { | ||
Image(systemName: "xmark") | ||
.foregroundColor(themeViewModel.linkColor) | ||
} | ||
) | ||
} | ||
} | ||
} | ||
} | ||
|
||
struct SettingsAutoplayView_Previews: PreviewProvider { | ||
static var previews: some View { | ||
SettingsAutoplayView(viewModel: SettingsAutoplayViewModel()) | ||
} | ||
} |
Oops, something went wrong.