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 ]