Warning, /network/kdeconnect-ios/KDE Connect/KDE Connect/Swift Backend/SelfDeviceData.swift is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2021 Lucas Wang <lucas.wang@tuta.io> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 // Original header below: 0008 // 0009 // DeviceData.swift 0010 // KDE Connect Test 0011 // 0012 // Created by Lucas Wang on 2021-06-17. 0013 // 0014 0015 import Foundation 0016 import Combine 0017 import UniformTypeIdentifiers 0018 import SwiftUI 0019 import UIKit 0020 0021 @objc 0022 class SelfDeviceData: NSObject, ObservableObject { 0023 @objc 0024 static let shared = SelfDeviceData() 0025 0026 @Published var deviceName: String { 0027 didSet { 0028 UserDefaults.standard.set(deviceName, forKey: "deviceName") 0029 } 0030 } 0031 0032 @Published var chosenTheme: ColorScheme? { 0033 didSet { 0034 UserDefaults.standard.set(chosenTheme?.rawValue, forKey: "chosenTheme") 0035 } 0036 } 0037 0038 @Published var appIcon: AppIcon { 0039 didSet { 0040 UserDefaults.standard.set(appIcon.rawValue, forKey: "appIcon") 0041 } 0042 } 0043 0044 @Published var directIPs: [String] { 0045 didSet { 0046 UserDefaults.standard.set(directIPs, forKey: "directIPs") 0047 } 0048 } 0049 0050 @Published var savePhotosToPhotosLibrary: Bool { 0051 didSet { 0052 UserDefaults.standard.set(savePhotosToPhotosLibrary, 0053 forKey: "savePhotosToPhotosLibrary") 0054 } 0055 } 0056 0057 @Published var saveVideosToPhotosLibrary: Bool { 0058 didSet { 0059 UserDefaults.standard.set(saveVideosToPhotosLibrary, 0060 forKey: "saveVideosToPhotosLibrary") 0061 } 0062 } 0063 0064 @Published var disableUdpBroadcastDiscovery: Bool { 0065 didSet { 0066 UserDefaults.standard.set(disableUdpBroadcastDiscovery, 0067 forKey: "disableUdpBroadcastDiscovery") 0068 } 0069 } 0070 0071 /// Intentionally not persisted 0072 @Published var isDebugging: Bool 0073 @objc 0074 @Published var isDebuggingDiscovery: Bool 0075 @objc 0076 @Published var isDebuggingNetworkPackage: Bool 0077 0078 private override init() { 0079 UserDefaults.standard.register(defaults: [ 0080 "savePhotosToPhotosLibrary": !DeviceType.isMac, 0081 "saveVideosToPhotosLibrary": !DeviceType.isMac, 0082 ]) 0083 self.deviceName = UserDefaults.standard.string(forKey: "deviceName") ?? UIDevice.current.name 0084 self.chosenTheme = UserDefaults.standard.string(forKey: "chosenTheme").flatMap(ColorScheme.init) 0085 self.directIPs = UserDefaults.standard.stringArray(forKey: "directIPs") ?? [] 0086 self.disableUdpBroadcastDiscovery = UserDefaults.standard.bool(forKey: "disableUdpBroadcastDiscovery") 0087 self.appIcon = AppIcon(rawValue: UserDefaults.standard.string(forKey: "appIcon")) ?? .default 0088 self.savePhotosToPhotosLibrary = UserDefaults.standard.bool(forKey: "savePhotosToPhotosLibrary") 0089 self.saveVideosToPhotosLibrary = UserDefaults.standard.bool(forKey: "saveVideosToPhotosLibrary") 0090 #if DEBUG 0091 let launchArguments = Set(ProcessInfo.processInfo.arguments) 0092 self.isDebugging = launchArguments.contains("isDebugging") 0093 self.isDebuggingDiscovery = launchArguments.contains("isDebuggingDiscovery") 0094 self.isDebuggingNetworkPackage = launchArguments.contains("isDebuggingNetworkPackage") 0095 #else 0096 self.isDebugging = false 0097 self.isDebuggingDiscovery = false 0098 self.isDebuggingNetworkPackage = false 0099 #endif 0100 super.init() 0101 } 0102 } 0103 0104 extension ColorScheme: RawRepresentable { 0105 public typealias RawValue = String 0106 0107 public init?(rawValue: String) { 0108 switch rawValue { 0109 case "Light": self = .light 0110 case "Dark": self = .dark 0111 default: return nil 0112 } 0113 } 0114 0115 public var rawValue: String { 0116 switch self { 0117 case .light: return "Light" 0118 case .dark: return "Dark" 0119 @unknown default: return "Unknown" 0120 } 0121 } 0122 } 0123 0124 extension Optional where Wrapped == ColorScheme { 0125 var text: Text { 0126 switch self { 0127 case .none: 0128 return Text("System Default") 0129 case .some(let scheme): 0130 switch scheme { 0131 case .light: return Text("Light") 0132 case .dark: return Text("Dark") 0133 @unknown default: return Text("Unknown Theme") 0134 } 0135 } 0136 } 0137 } 0138 0139 extension Optional: CaseIterable where Wrapped: CaseIterable { 0140 public static var allCases: [Optional<Wrapped>] { 0141 return [nil] + Wrapped.allCases.map(Self.init) 0142 } 0143 } 0144 0145 // The host's SHA256 hash, calculated upon launch so we don't have to calculated it every single time 0146 var hostSHA256Hash: String = "ERROR" 0147 0148 // Array of all UTTypes, used by .fileImporter() to allow importing of all file types 0149 let allUTTypes: [UTType] = [ 0150 .aiff, .aliasFile, .appleArchive, .appleProtectedMPEG4Audio, 0151 .appleProtectedMPEG4Video, .appleScript, .application, 0152 .applicationBundle, .applicationExtension, .arReferenceObject, 0153 .archive, .assemblyLanguageSource, .audio, .audiovisualContent, 0154 .avi, .binaryPropertyList, .bmp, .bookmark, .bundle, .bz2, 0155 .cHeader, .cPlusPlusHeader, .cPlusPlusSource, .cSource, 0156 .calendarEvent, .commaSeparatedText, .compositeContent, 0157 .contact, .content, .data, .database, .delimitedText, .directory, 0158 .diskImage, .emailMessage, .epub, .exe, .executable, .fileURL, 0159 .flatRTFD, .folder, .font, .framework, .gif, .gzip, .heic, .html, 0160 .icns, .ico, .image, .internetLocation, .internetShortcut, .item, 0161 .javaScript, .jpeg, .json, .livePhoto, .log, .m3uPlaylist, 0162 /**.makefile (iOS 15 beta),**/ .message, .midi, .mountPoint, .movie, .mp3, 0163 .mpeg, .mpeg2TransportStream, .mpeg2Video, .mpeg4Audio, 0164 .mpeg4Movie, .objectiveCPlusPlusSource, .objectiveCSource, 0165 .osaScript, .osaScriptBundle, .package, .pdf, .perlScript, 0166 .phpScript, .pkcs12, .plainText, .playlist, .pluginBundle, .png, 0167 .presentation, .propertyList, .pythonScript, .quickLookGenerator, 0168 .quickTimeMovie, .rawImage, .realityFile, .resolvable, .rtf, .rtfd, 0169 .rubyScript, .sceneKitScene, .script, .shellScript, .sourceCode, 0170 .spotlightImporter, .spreadsheet, .svg, .swiftSource, 0171 .symbolicLink, .systemPreferencesPane, .tabSeparatedText, .text, 0172 .threeDContent, .tiff, .toDoItem, .unixExecutable, .url, 0173 .urlBookmarkData, .usd, .usdz, .utf16ExternalPlainText, 0174 .utf16PlainText, .utf8PlainText, .utf8TabSeparatedText, .vCard, 0175 .video, .volume, .wav, .webArchive, .webP, .x509Certificate, .xml, 0176 .xmlPropertyList, .xpcService, .yaml, .zip, 0177 ]