// // Swiftfin is subject to the terms of the Mozilla Public // License, v2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at https://mozilla.org/MPL/2.0/. // // Copyright (c) 2024 Jellyfin & Jellyfin Contributors // import Defaults import Foundation import SwiftUI import UIKit // TODO: Organize extension UserDefaults { static let generalSuite = UserDefaults(suiteName: "swiftfinstore-general-defaults")! static let universalSuite = UserDefaults(suiteName: "swiftfinstore-universal-defaults")! } extension Defaults.Keys { // Universal settings static let accentColor: Key = .init("accentColor", default: .jellyfinPurple, suite: .universalSuite) static let appAppearance = Key("appAppearance", default: .system, suite: .universalSuite) static let hapticFeedback: Key = .init("hapticFeedback", default: true, suite: .universalSuite) static let lastServerUserID = Defaults.Key("lastServerUserID", suite: .universalSuite) // TODO: Replace with a cache static let libraryFilterStore = Key<[String: ItemFilters]>("libraryFilterStore", default: [:], suite: .generalSuite) enum Customization { static let itemViewType = Key("itemViewType", default: .compactLogo, suite: .generalSuite) static let showPosterLabels = Key("showPosterLabels", default: true, suite: .generalSuite) static let nextUpPosterType = Key("nextUpPosterType", default: .portrait, suite: .generalSuite) static let recentlyAddedPosterType = Key("recentlyAddedPosterType", default: .portrait, suite: .generalSuite) static let latestInLibraryPosterType = Key("latestInLibraryPosterType", default: .portrait, suite: .generalSuite) static let shouldShowMissingSeasons = Key("shouldShowMissingSeasons", default: true, suite: .generalSuite) static let shouldShowMissingEpisodes = Key("shouldShowMissingEpisodes", default: true, suite: .generalSuite) static let similarPosterType = Key("similarPosterType", default: .portrait, suite: .generalSuite) static let searchPosterType = Key("searchPosterType", default: .portrait, suite: .generalSuite) enum CinematicItemViewType { static let usePrimaryImage: Key = .init("cinematicItemViewTypeUsePrimaryImage", default: false, suite: .generalSuite) } enum Episodes { static let useSeriesLandscapeBackdrop = Key("useSeriesBackdrop", default: true, suite: .generalSuite) } enum Indicators { static let showFavorited: Key = .init("showFavoritedIndicator", default: true, suite: .generalSuite) static let showProgress: Key = .init("showProgressIndicator", default: true, suite: .generalSuite) static let showUnplayed: Key = .init("showUnplayedIndicator", default: true, suite: .generalSuite) static let showPlayed: Key = .init("showPlayedIndicator", default: true, suite: .generalSuite) } enum Library { static let gridPosterType = Key("libraryGridPosterType", default: .portrait, suite: .generalSuite) static let cinematicBackground: Key = .init( "Customization.Library.cinematicBackground", default: true, suite: .generalSuite ) static let randomImage: Key = .init("libraryRandomImage", default: true, suite: .generalSuite) static let showFavorites: Key = .init("libraryShowFavorites", default: true, suite: .generalSuite) static let viewType = Key("libraryViewType", default: .grid, suite: .generalSuite) } enum Filters { static let libraryFilterDrawerButtons: Key<[FilterDrawerButtonSelection]> = .init( "defaultLibraryFilterDrawerButtons", default: FilterDrawerButtonSelection.defaultFilterDrawerButtons, suite: .generalSuite ) static let searchFilterDrawerButtons: Key<[FilterDrawerButtonSelection]> = .init( "defaultSearchFilterDrawerButtons", default: FilterDrawerButtonSelection.defaultFilterDrawerButtons, suite: .generalSuite ) } } enum VideoPlayer { static let autoPlayEnabled: Key = .init("autoPlayEnabled", default: true, suite: .generalSuite) static let barActionButtons: Key<[VideoPlayerActionButton]> = .init( "barActionButtons", default: VideoPlayerActionButton.defaultBarActionButtons, suite: .generalSuite ) static let jumpBackwardLength: Key = .init( "jumpBackwardLength", default: .fifteen, suite: .generalSuite ) static let jumpForwardLength: Key = .init( "jumpForwardLength", default: .fifteen, suite: .generalSuite ) static let menuActionButtons: Key<[VideoPlayerActionButton]> = .init( "menuActionButtons", default: VideoPlayerActionButton.defaultMenuActionButtons, suite: .generalSuite ) static let resumeOffset: Key = .init("resumeOffset", default: 0, suite: .generalSuite) static let showJumpButtons: Key = .init("showJumpButtons", default: true, suite: .generalSuite) static let videoPlayerType: Key = .init("videoPlayerType", default: .swiftfin, suite: .generalSuite) enum Gesture { static let horizontalPanGesture: Key = .init( "videoPlayerHorizontalPanGesture", default: .none, suite: .generalSuite ) static let horizontalSwipeGesture: Key = .init( "videoPlayerHorizontalSwipeGesture", default: .none, suite: .generalSuite ) static let longPressGesture: Key = .init( "videoPlayerLongPressGesture", default: .gestureLock, suite: .generalSuite ) static let multiTapGesture: Key = .init("videoPlayerMultiTapGesture", default: .none, suite: .generalSuite) static let doubleTouchGesture: Key = .init( "videoPlayerDoubleTouchGesture", default: .none, suite: .generalSuite ) static let pinchGesture: Key = .init("videoPlayerSwipeGesture", default: .aspectFill, suite: .generalSuite) static let verticalPanGestureLeft: Key = .init( "videoPlayerVerticalPanGestureLeft", default: .none, suite: .generalSuite ) static let verticalPanGestureRight: Key = .init( "videoPlayerVerticalPanGestureRight", default: .none, suite: .generalSuite ) } enum Overlay { static let chapterSlider: Key = .init("chapterSlider", default: true, suite: .generalSuite) static let playbackButtonType: Key = .init( "videoPlayerPlaybackButtonLocation", default: .large, suite: .generalSuite ) static let sliderColor: Key = .init("sliderColor", default: Color.white, suite: .generalSuite) static let sliderType: Key = .init("sliderType", default: .capsule, suite: .generalSuite) // Timestamp static let trailingTimestampType: Key = .init( "trailingTimestamp", default: .timeLeft, suite: .generalSuite ) static let showCurrentTimeWhileScrubbing: Key = .init( "showCurrentTimeWhileScrubbing", default: true, suite: .generalSuite ) static let timestampType: Key = .init("timestampType", default: .split, suite: .generalSuite) } enum Subtitle { static let subtitleColor: Key = .init( "subtitleColor", default: .white, suite: .generalSuite ) static let subtitleFontName: Key = .init( "subtitleFontName", default: UIFont.systemFont(ofSize: 14).fontName, suite: .generalSuite ) static let subtitleSize: Key = .init("subtitleSize", default: 16, suite: .generalSuite) } enum Transition { static let pauseOnBackground: Key = .init("pauseOnBackground", default: false, suite: .generalSuite) static let playOnActive: Key = .init("playOnActive", default: false, suite: .generalSuite) } } // Experimental settings enum Experimental { static let downloads: Key = .init("experimentalDownloads", default: false, suite: .generalSuite) static let syncSubtitleStateWithAdjacent = Key( "experimentalSyncSubtitleState", default: false, suite: .generalSuite ) static let forceDirectPlay = Key("forceDirectPlay", default: false, suite: .generalSuite) static let liveTVAlphaEnabled = Key("liveTVAlphaEnabled", default: false, suite: .generalSuite) static let liveTVForceDirectPlay = Key("liveTVForceDirectPlay", default: false, suite: .generalSuite) } // tvos specific static let downActionShowsMenu = Key("downActionShowsMenu", default: true, suite: .generalSuite) static let confirmClose = Key("confirmClose", default: false, suite: .generalSuite) } // MARK: Debug #if DEBUG extension UserDefaults { static let debugSuite = UserDefaults(suiteName: "swiftfinstore-debug-defaults")! } extension Defaults.Keys { static let sendProgressReports: Key = .init("sendProgressReports", default: true, suite: .debugSuite) } #endif