jellyflood/Swiftfin/App/AppDelegate.swift

75 lines
2.5 KiB
Swift

//
// 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 AVFAudio
import CoreStore
import Defaults
import Logging
import Pulse
import PulseLogHandler
import SwiftUI
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate {
static var orientationLock: UIInterfaceOrientationMask = .all
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback)
} catch {
print("setting category AVAudioSessionCategoryPlayback failed")
}
return true
}
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
AppDelegate.orientationLock
}
static func enterPlaybackOrientation() {
AppDelegate.changeOrientation(.landscape)
}
static func leavePlaybackOrientation() {
if UIDevice.isIPad {
AppDelegate.changeOrientation(.allButUpsideDown)
} else {
// On iPhone, users likely want to return to portrait mode after leaving playback.
// However, we don't want to lock them into portrait mode, so switch back after a delay.
AppDelegate.changeOrientation(.portrait)
// 0.25 seconds is about the time to switch from landscape to portrait.
// Changing orientation again too early will cause the top time/battery bar to remain
// at the side instead of moving up top, like it should.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
AppDelegate.changeOrientation(.allButUpsideDown)
}
}
}
private static func changeOrientation(_ orientation: UIInterfaceOrientationMask) {
guard UIDevice.isPhone || UIDevice.isIPad else { return }
orientationLock = orientation
if #available(iOS 16, *) {
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: orientation))
} else {
UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation")
}
}
}