diff --git a/Turn Touch iOS.xcodeproj/project.pbxproj b/Turn Touch iOS.xcodeproj/project.pbxproj index 37c9ac4..1ac64e6 100644 --- a/Turn Touch iOS.xcodeproj/project.pbxproj +++ b/Turn Touch iOS.xcodeproj/project.pbxproj @@ -24,6 +24,9 @@ 172590542459235600055830 /* TTModeIfttt.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF534C2E1EB0351A002EE584 /* TTModeIfttt.swift */; }; 172590552459276D00055830 /* TTModeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFB41B781CEEA8E500CD5F09 /* TTModeTab.swift */; }; 172590562459277A00055830 /* TTDiamondView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF0F10D61CF6697A00CC1F29 /* TTDiamondView.swift */; }; + 174A15FC24592A2D00F4AA2E /* TTActionDiamondView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFC9FE941D021A0400038817 /* TTActionDiamondView.swift */; }; + 174A15FD24592A3800F4AA2E /* TTDiamondLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF0F10DB1CF669BE00CC1F29 /* TTDiamondLabel.swift */; }; + 174A15FF24592CD700F4AA2E /* Preferences.plist in Resources */ = {isa = PBXBuildFile; fileRef = FF0F10BF1CF5638D00CC1F29 /* Preferences.plist */; }; 17AE44062458FF9C00D06762 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17AE44052458FF9C00D06762 /* NotificationCenter.framework */; }; 17AE44092458FF9C00D06762 /* WidgetExtensionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17AE44082458FF9C00D06762 /* WidgetExtensionViewController.swift */; }; 17AE440C2458FF9C00D06762 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 17AE440A2458FF9C00D06762 /* MainInterface.storyboard */; }; @@ -927,6 +930,7 @@ /* Begin PBXFileReference section */ 170C8DC5245906150089B2C0 /* WidgetDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetDelegate.swift; sourceTree = ""; }; + 174A15FE24592C6700F4AA2E /* Turn Touch Widget.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Turn Touch Widget.entitlements"; sourceTree = ""; }; 17AE44042458FF9C00D06762 /* Turn Touch Widget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Turn Touch Widget.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 17AE44052458FF9C00D06762 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 17AE44082458FF9C00D06762 /* WidgetExtensionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetExtensionViewController.swift; sourceTree = ""; }; @@ -1437,6 +1441,7 @@ 17AE44072458FF9C00D06762 /* Widget Extension */ = { isa = PBXGroup; children = ( + 174A15FE24592C6700F4AA2E /* Turn Touch Widget.entitlements */, 17AE44082458FF9C00D06762 /* WidgetExtensionViewController.swift */, 170C8DC5245906150089B2C0 /* WidgetDelegate.swift */, 17AE440A2458FF9C00D06762 /* MainInterface.storyboard */, @@ -2409,6 +2414,7 @@ buildActionMask = 2147483647; files = ( 17AE440C2458FF9C00D06762 /* MainInterface.storyboard in Resources */, + 174A15FF24592CD700F4AA2E /* Preferences.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3107,6 +3113,7 @@ 170C8DC6245906150089B2C0 /* WidgetDelegate.swift in Sources */, 1725905024591EFC00055830 /* TTBatchActions.swift in Sources */, 1725904824591E5400055830 /* TTMode.swift in Sources */, + 174A15FC24592A2D00F4AA2E /* TTActionDiamondView.swift in Sources */, 172590542459235600055830 /* TTModeIfttt.swift in Sources */, 172590532459231C00055830 /* TTModeMenuContainer.swift in Sources */, 1725904A24591E6000055830 /* TTActionMap.swift in Sources */, @@ -3116,6 +3123,7 @@ 172590552459276D00055830 /* TTModeTab.swift in Sources */, 1725904924591E6000055830 /* TTAction.swift in Sources */, 1725904B24591E8200055830 /* TTModeDouble.swift in Sources */, + 174A15FD24592A3800F4AA2E /* TTDiamondLabel.swift in Sources */, 1725904C24591ED900055830 /* UIColor+hex.swift in Sources */, 170C8DC7245907A70089B2C0 /* TTModeDirection.swift in Sources */, 17AE44092458FF9C00D06762 /* WidgetExtensionViewController.swift in Sources */, @@ -3479,6 +3487,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Widget Extension/Turn Touch Widget.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = 6Z7QW53WB6; @@ -3507,6 +3516,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Widget Extension/Turn Touch Widget.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = 6Z7QW53WB6; diff --git a/Turn Touch iOS/AppDelegate.swift b/Turn Touch iOS/AppDelegate.swift index 0b19c14..e7d0d5d 100644 --- a/Turn Touch iOS/AppDelegate.swift +++ b/Turn Touch iOS/AppDelegate.swift @@ -30,7 +30,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate print(" ---> centralManagerIdentifiers: \(String(describing: centralManagerIdentifiers))") } -// print(UserDefaults.standardUserDefaults().dictionaryRepresentation()) +// print(preferences()UserDefaults().dictionaryRepresentation()) UIApplication.shared.beginReceivingRemoteControlEvents() bluetoothMonitor = TTBluetoothMonitor() @@ -76,8 +76,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate print(" ---> applicationDidEnterBackground") self.recordState() -// let prefs = UserDefaults.standardUserDefaults() -// prefs.synchronize() } func applicationWillEnterForeground(_ application: UIApplication) { @@ -99,8 +97,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. print(" ---> applicationWillTerminate"); bluetoothMonitor.terminate() - let prefs = UserDefaults.standard - prefs.synchronize() } func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool { @@ -137,11 +133,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate } func erasePreferences() { - UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) + preferences().removePersistentDomain(forName: Bundle.main.bundleIdentifier!) } func loadPreferences() { - let prefs = UserDefaults.standard + migratePreferencesToGroup() + + let prefs = preferences() let defaultPrefsFile = Bundle.main.path(forResource: "Preferences", ofType: "plist") let defaultPrefs = NSDictionary(contentsOfFile: defaultPrefsFile!) as! [String: AnyObject] prefs.register(defaults: defaultPrefs) @@ -154,8 +152,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate prefs.synchronize() } + func migratePreferencesToGroup() { + let localDefaults = UserDefaults.standard + let localDictionary = localDefaults.dictionaryRepresentation() + let groupDefaults = preferences() + let didMigrateToAppGroups = "TT:didMigrateToAppGroups" + + if !groupDefaults.bool(forKey: didMigrateToAppGroups) { + for key in localDictionary.keys { + if key.hasPrefix("TT:") { + groupDefaults.set(localDictionary[key], forKey: key) + } + } + + groupDefaults.set(true, forKey: didMigrateToAppGroups) + } + } + func processDefaultSettings() { - let defaults = UserDefaults.standard + let defaults = preferences() defaults.synchronize() guard let settingsBundle = Bundle.main.path(forResource: "Settings", ofType: "bundle") as NSString? else { @@ -251,7 +266,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate } func startLocationMonitoring() { - let prefs = UserDefaults.standard + let prefs = preferences() if let coords = prefs.dictionary(forKey: "TT:geofence:1") as? [String: NSNumber] { let center = CLLocationCoordinate2D(latitude: coords["lat"] as! CLLocationDegrees, longitude: coords["long"] as! CLLocationDegrees) @@ -305,6 +320,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate } -func appDelegate () -> AppDelegate { +func appDelegate() -> AppDelegate { return UIApplication.shared.delegate as! AppDelegate } + +func preferences() -> UserDefaults { + return UserDefaults(suiteName: "group.com.turntouch.ios-remote") ?? UserDefaults.standard +} diff --git a/Turn Touch iOS/Bluetooth/TTBluetoothMonitor.swift b/Turn Touch iOS/Bluetooth/TTBluetoothMonitor.swift index 3abc65a..33298cd 100644 --- a/Turn Touch iOS/Bluetooth/TTBluetoothMonitor.swift +++ b/Turn Touch iOS/Bluetooth/TTBluetoothMonitor.swift @@ -124,8 +124,8 @@ class TTBluetoothMonitor: NSObject, CBCentralManagerDelegate, CBPeripheralDelega func knownPeripheralIdentifiers() -> [UUID] { var identifiers: [UUID] = [] - let preferences = UserDefaults.standard - let pairedDevices = preferences.array(forKey: "TT:devices:paired") as! [String]? + let prefs = preferences() + let pairedDevices = prefs.array(forKey: "TT:devices:paired") as! [String]? if pairedDevices != nil { for identifier: String in pairedDevices! { identifiers.append(NSUUID(uuidString: identifier)! as UUID) @@ -376,7 +376,7 @@ class TTBluetoothMonitor: NSObject, CBCentralManagerDelegate, CBPeripheralDelega func forgetDevice(_ device: TTDevice) { var pairedDevicesArray: [String] = [] - let prefs = UserDefaults.standard + let prefs = preferences() if let pairedDevices = prefs.array(forKey: "TT:devices:paired") as! [String]? { for identifier: String in pairedDevices { if identifier != device.uuid { @@ -749,7 +749,7 @@ class TTBluetoothMonitor: NSObject, CBCentralManagerDelegate, CBPeripheralDelega let emptyNickname = NSMutableData(length: 32) let deviceNickname = device.nickname let deviceNicknameData = device.nickname?.data(using: String.Encoding.utf8) - let prefs = UserDefaults.standard + let prefs = preferences() let nicknameKey = "TT:device:\(device.uuid ?? "?"):nickname" let existingNickname = prefs.string(forKey: nicknameKey) @@ -785,7 +785,7 @@ class TTBluetoothMonitor: NSObject, CBCentralManagerDelegate, CBPeripheralDelega func writeNicknameToDevice(_ device: TTDevice, nickname: String) { var data = NSMutableData(data: nickname.data(using: String.Encoding.utf8)!) - let prefs = UserDefaults.standard + let prefs = preferences() if data.length > 32 { var dataString = String(data: data as Data, encoding: String.Encoding.utf8) @@ -849,14 +849,14 @@ class TTBluetoothMonitor: NSObject, CBCentralManagerDelegate, CBPeripheralDelega // MARK: Pairing func pairDeviceSuccess(_ peripheral: CBPeripheral) { - let preferences = UserDefaults.standard - var pairedDevices = preferences.array(forKey: "TT:devices:paired") as! [String]? + let prefs = preferences() + var pairedDevices = prefs.array(forKey: "TT:devices:paired") as! [String]? if pairedDevices == nil { pairedDevices = [] } pairedDevices?.append(peripheral.identifier.uuidString) - preferences.set(pairedDevices, forKey: "TT:devices:paired") - preferences.synchronize() + prefs.set(pairedDevices, forKey: "TT:devices:paired") + prefs.synchronize() if let device = foundDevices.deviceForPeripheral(peripheral) { device.isPaired = foundDevices.isDevicePaired(device) diff --git a/Turn Touch iOS/Models/TTBatchActions.swift b/Turn Touch iOS/Models/TTBatchActions.swift index 3c2537c..1fd8065 100644 --- a/Turn Touch iOS/Models/TTBatchActions.swift +++ b/Turn Touch iOS/Models/TTBatchActions.swift @@ -26,7 +26,7 @@ class TTBatchActions: NSObject { } func assembleBatchAction(in direction: TTModeDirection) -> [TTAction] { - let prefs = UserDefaults.standard + let prefs = preferences() var batchActions: [TTAction] = [] let key = self.batchActionKey(in: direction) let batchActionKeys: [String]? = prefs.object(forKey: key) as? [String] diff --git a/Turn Touch iOS/Models/TTDevice.swift b/Turn Touch iOS/Models/TTDevice.swift index e2edca9..5761bff 100644 --- a/Turn Touch iOS/Models/TTDevice.swift +++ b/Turn Touch iOS/Models/TTDevice.swift @@ -38,7 +38,7 @@ class TTDevice: NSObject { peripheral = newPeripheral uuid = peripheral.identifier.uuidString - let prefs = UserDefaults.standard + let prefs = preferences() let nicknameKey = "TT:device:\(uuid ?? "nil"):nickname" nickname = prefs.string(forKey: nicknameKey) } @@ -79,7 +79,7 @@ class TTDevice: NSObject { func setFirmwareVersion(firmwareVersion version: Int) { firmwareVersion = version - let prefs = UserDefaults.standard + let prefs = preferences() let latestVersion = prefs.integer(forKey: "TT:firmware:version") isFirmwareOld = firmwareVersion! < latestVersion diff --git a/Turn Touch iOS/Models/TTDeviceList.swift b/Turn Touch iOS/Models/TTDeviceList.swift index f5e2b08..3dc3167 100644 --- a/Turn Touch iOS/Models/TTDeviceList.swift +++ b/Turn Touch iOS/Models/TTDeviceList.swift @@ -144,7 +144,7 @@ class TTDeviceList: NSObject { // MARK: Pairing func isPeripheralPaired(_ peripheral: CBPeripheral) -> Bool { - let prefs = UserDefaults.standard + let prefs = preferences() let pairedDevices = prefs.array(forKey: "TT:devices:paired") as! [String]? if pairedDevices == nil { @@ -176,7 +176,7 @@ class TTDeviceList: NSObject { } func totalPairedCount() -> Int { - let prefs = UserDefaults.standard + let prefs = preferences() let pairedDevices = prefs.array(forKey: "TT:devices:paired") as! [String]? if pairedDevices == nil { diff --git a/Turn Touch iOS/Models/TTMode.swift b/Turn Touch iOS/Models/TTMode.swift index dc09207..627f913 100644 --- a/Turn Touch iOS/Models/TTMode.swift +++ b/Turn Touch iOS/Models/TTMode.swift @@ -170,7 +170,7 @@ class TTMode : NSObject, TTModeProtocol { } func setCustomTitle(_ title: String?, direction: TTModeDirection) { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(direction) let actionName = self.actionNameInDirection(direction) @@ -216,7 +216,7 @@ class TTMode : NSObject, TTModeProtocol { } // First check if given custom title - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(direction) let prefKey = "TT:\(mode.nameOfClass)-\(modeDirectionName):action:\(actionName)-\(actionDirectionName):customTitle" @@ -279,7 +279,7 @@ class TTMode : NSObject, TTModeProtocol { return action.actionName } - let prefs = UserDefaults.standard + let prefs = preferences() let mode = self.modeInDirection(direction) let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) @@ -348,7 +348,7 @@ class TTMode : NSObject, TTModeProtocol { // MARK: Mode options func modeOptionValue(_ optionName: String) -> Any? { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) if modeDirection == .no_DIRECTION { @@ -391,7 +391,7 @@ class TTMode : NSObject, TTModeProtocol { // MARK: Changing mode settings func changeDirection(_ direction: TTModeDirection, toAction actionClassName: String) { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(direction) @@ -409,7 +409,7 @@ class TTMode : NSObject, TTModeProtocol { print(" ---> BUSTED: \(optionValue)") return } - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) var optionKey = "TT:mode:\(self.nameOfClass)-\(modeDirectionName):option:\(optionName)" @@ -430,7 +430,7 @@ class TTMode : NSObject, TTModeProtocol { // MARK: Action options func actionOptionValue(_ optionName: String, actionName: String, direction: TTModeDirection) -> Any? { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(direction) @@ -486,7 +486,7 @@ class TTMode : NSObject, TTModeProtocol { func batchActionOptionValue(batchActionKey: String, optionName: String, actionName: String, actionDirection: TTModeDirection) -> Any? { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(actionDirection) let optionKey = "TT:mode:\(modeDirectionName):action:\(actionDirectionName):batchactions:\(batchActionKey):actionoption:\(optionName)" @@ -553,7 +553,7 @@ class TTMode : NSObject, TTModeProtocol { print(" ---> BUSTED: \(optionValue)") return } - let prefs = UserDefaults.standard + let prefs = preferences() let inspectingModeDirection = direction ?? appDelegate().modeMap.inspectingModeDirection let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(inspectingModeDirection) @@ -568,7 +568,7 @@ class TTMode : NSObject, TTModeProtocol { func changeBatchActionOption(_ batchActionKey: String, optionName: String, to optionValue: Any, direction: TTModeDirection? = nil, actionDirection: TTModeDirection? = nil) { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(direction ?? modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(actionDirection ?? appDelegate().modeMap.inspectingModeDirection) let optionKey = "TT:mode:\(modeDirectionName):action:\(actionDirectionName):batchactions:\(batchActionKey):actionoption:\(optionName)" @@ -580,7 +580,7 @@ class TTMode : NSObject, TTModeProtocol { } func removeActionOption(_ optionName: String, direction: TTModeDirection?=nil) { - let prefs = UserDefaults.standard + let prefs = preferences() let inspectingModeDirection = direction ?? appDelegate().modeMap.inspectingModeDirection let modeDirectionName = appDelegate().modeMap.directionName(modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(inspectingModeDirection) @@ -595,7 +595,7 @@ class TTMode : NSObject, TTModeProtocol { func removeBatchActionOption(_ batchActionKey: String, optionName: String, direction: TTModeDirection? = nil, actionDirection: TTModeDirection? = nil) { - let prefs = UserDefaults.standard + let prefs = preferences() let modeDirectionName = appDelegate().modeMap.directionName(direction ?? modeDirection) let actionDirectionName = appDelegate().modeMap.directionName(actionDirection ?? appDelegate().modeMap.inspectingModeDirection) let optionKey = "TT:mode:\(modeDirectionName):action:\(actionDirectionName):batchactions:\(batchActionKey):actionoption:\(optionName)" diff --git a/Turn Touch iOS/Models/TTModeMap.swift b/Turn Touch iOS/Models/TTModeMap.swift index 3dea921..6b8be2e 100644 --- a/Turn Touch iOS/Models/TTModeMap.swift +++ b/Turn Touch iOS/Models/TTModeMap.swift @@ -91,7 +91,7 @@ class TTModeMap: NSObject { override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "selectedModeDirection" { - let prefs = UserDefaults.standard + let prefs = preferences() let original = prefs.integer(forKey: "TT:selectedModeDirection") if original != self.selectedModeDirection.rawValue { prefs.set(self.selectedModeDirection.rawValue, forKey: "TT:selectedModeDirection") @@ -108,7 +108,7 @@ class TTModeMap: NSObject { // MARK: Actions func buttonAppMode() -> TTButtonAppMode { - let prefs = UserDefaults.standard + let prefs = preferences() if let appModePref = prefs.string(forKey: "TT:buttonAppMode"), let appMode: TTButtonAppMode = TTButtonAppMode(rawValue: appModePref) { @@ -119,7 +119,7 @@ class TTModeMap: NSObject { } var buttonActionMode: TTButtonActionMode { - let prefs = UserDefaults.standard + let prefs = preferences() if let actionModePref = prefs.string(forKey: "TT:buttonActionMode"), let actionMode: TTButtonActionMode = TTButtonActionMode(rawValue: actionModePref) { @@ -139,7 +139,7 @@ class TTModeMap: NSObject { } func setupModes() { - let prefs = UserDefaults.standard + let prefs = preferences() let buttonAppMode = self.buttonAppMode() for direction: String in ["north", "east", "west", "south"] { @@ -184,7 +184,7 @@ class TTModeMap: NSObject { } func savedSelectedModeDirection() -> TTModeDirection { - let prefs = UserDefaults.standard + let prefs = preferences() let direction = TTModeDirection(rawValue: prefs.integer(forKey: "TT:selectedModeDirection"))! if buttonAppMode() == .SixteenButtons { @@ -263,7 +263,7 @@ class TTModeMap: NSObject { } func notifyModeChange(direction: TTModeDirection) { - let prefs = UserDefaults.standard + let prefs = preferences() var url: URL? switch direction { @@ -402,7 +402,7 @@ class TTModeMap: NSObject { } func vibrate() { - let prefs = UserDefaults.standard + let prefs = preferences() if prefs.bool(forKey: "TT:pref:vibrate_on_action") { if #available(iOS 10.0, *) { // does nothing on iPhone 6s @@ -451,7 +451,7 @@ class TTModeMap: NSObject { } func recordUsage(additionalParams: [String: Any]) { - let prefs = UserDefaults.standard + let prefs = preferences() if !prefs.bool(forKey: "TT:pref:share_usage_stats") { return } @@ -530,7 +530,7 @@ class TTModeMap: NSObject { func addBatchAction(for actionName: String) { // Adding batch action using the menu, selecting and inspecting directions - let prefs = UserDefaults.standard + let prefs = preferences() let batchKey = self.batchKey() var batchActionKeys = self.batchActionKeys() let uuid = UUID().uuidString @@ -552,7 +552,7 @@ class TTModeMap: NSObject { func addBatchAction(modeDirection: TTModeDirection, actionDirection: TTModeDirection, modeClassName: String, actionName: String) -> String { // Adding batch actions automatically - let prefs = UserDefaults.standard + let prefs = preferences() var batchActionKeys = self.batchActionKeys(modeDirection: modeDirection, actionDirection: actionDirection) let uuid = UUID().uuidString let newActionKey = "\(modeClassName):\(actionName):\(uuid[.. [String] { - let prefs = UserDefaults.standard + let prefs = preferences() var batchActionKeys: [String] = [] if let batchActionsPrefs = prefs.object(forKey: self.batchKey(modeDirection: modeDirection, actionDirection: actionDirection)) as? [String] { @@ -611,7 +611,7 @@ class TTModeMap: NSObject { // MARK: Changing modes, actions, batch actions func changeDirection(_ direction: TTModeDirection, toMode modeClassName: String) { - let prefs = UserDefaults.standard + let prefs = preferences() let directionName = self.directionName(direction) let prefKey = "TT:\(self.modeRoot()):\(directionName)" @@ -725,7 +725,7 @@ class TTModeMap: NSObject { func userId() -> String { var uuid: NSUUID! - let prefs = UserDefaults.standard + let prefs = preferences() if let uuidString = NSUbiquitousKeyValueStore.default.string(forKey: TTModeIftttConstants.kIftttUserIdKey) { uuid = NSUUID(uuidString: uuidString) @@ -752,7 +752,7 @@ class TTModeMap: NSObject { func deviceId() -> String { var uuid: NSUUID! - let prefs = UserDefaults.standard + let prefs = preferences() if let uuidString = prefs.string(forKey: TTModeIftttConstants.kIftttDeviceIdKey) { uuid = NSUUID(uuidString: uuidString) @@ -771,7 +771,7 @@ class TTModeMap: NSObject { // Mark: Button App Modes func switchButtonAppMode(_ buttonAppMode: TTButtonAppMode) { - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(buttonAppMode.rawValue, forKey: "TT:buttonAppMode") prefs.synchronize() @@ -788,7 +788,7 @@ class TTModeMap: NSObject { } func switchPerformActionMode(_ buttonActionMode: TTButtonActionMode) { - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(buttonActionMode.rawValue, forKey: "TT:buttonActionMode") prefs.synchronize() diff --git a/Turn Touch iOS/Modes/Bose/TTModeBose.swift b/Turn Touch iOS/Modes/Bose/TTModeBose.swift index 19d052f..8efe932 100644 --- a/Turn Touch iOS/Modes/Bose/TTModeBose.swift +++ b/Turn Touch iOS/Modes/Bose/TTModeBose.swift @@ -63,7 +63,7 @@ class TTModeBose : TTMode, TTModeBoseMulticastDelegate, TTModeBoseDeviceDelegate } func resetKnownDevices() { - let prefs = UserDefaults.standard + let prefs = preferences() prefs.removeObject(forKey: TTModeBoseConstants.kBoseFoundDevices) prefs.synchronize() @@ -71,7 +71,7 @@ class TTModeBose : TTMode, TTModeBoseMulticastDelegate, TTModeBoseDeviceDelegate } func assembleFoundDevices() { - let prefs = UserDefaults.standard + let prefs = preferences() TTModeBose.foundDevices = [] if let foundDevices = prefs.array(forKey: TTModeBoseConstants.kBoseFoundDevices) as? [[String: AnyObject]] { @@ -451,7 +451,7 @@ class TTModeBose : TTMode, TTModeBoseMulticastDelegate, TTModeBoseDeviceDelegate "macAddress": device.macAddress!]) } - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(foundDevices, forKey: TTModeBoseConstants.kBoseFoundDevices) prefs.synchronize() } diff --git a/Turn Touch iOS/Modes/Hue/TTModeHue.swift b/Turn Touch iOS/Modes/Hue/TTModeHue.swift index 1c86e19..d99c842 100644 --- a/Turn Touch iOS/Modes/Hue/TTModeHue.swift +++ b/Turn Touch iOS/Modes/Hue/TTModeHue.swift @@ -797,7 +797,7 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso TTModeHue.bridgesTried = [] } - let prefs = UserDefaults.standard + let prefs = preferences() let savedBridges = prefs.array(forKey: TTModeHueConstants.kHueSavedBridges) as? [[String: String]] ?? [] var bridgeUntried = false @@ -895,7 +895,7 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso func bridgeSelected(_ bridge: HueBridge) { print(" ---> Selected bridge: \(bridge)") - let prefs = UserDefaults.standard + let prefs = preferences() TTModeHue.latestBridge = bridge self.saveRecentBridge() @@ -906,7 +906,7 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso func delayReconnectToFoundBridges() { -// let prefs = UserDefaults.standard +// let prefs = preferences() // let savedBridges = prefs.array(forKey: TTModeHueConstants.kHueSavedBridges) as? [[String: String]] // // if let bridgeCount = savedBridges?.count, bridgeCount > 0 { @@ -1041,7 +1041,7 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso } func saveRecentBridge(username: String? = nil) { - let prefs = UserDefaults.standard + let prefs = preferences() guard let latestBridge = TTModeHue.latestBridge else { print(" ---> ERROR: No latest bridge? How did we get here?") @@ -1085,7 +1085,7 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso } func removeSavedBridge(serialNumber: String) { - let prefs = UserDefaults.standard + let prefs = preferences() var previouslyFoundBridges = prefs.array(forKey: TTModeHueConstants.kHueSavedBridges) as? [[String: String]] ?? [] previouslyFoundBridges = previouslyFoundBridges.filter({ (bridge) -> Bool in @@ -1495,10 +1495,10 @@ class TTModeHue: TTMode, BridgeFinderDelegate, BridgeAuthenticatorDelegate, Reso TTModeHue.waitingOnScenes = true TTModeHue.hueSdk.stopHeartbeat() - let cacheX = UserDefaults.standard.value(forKey: "CacheX") + let cacheX = preferences().value(forKey: "CacheX") print(" ---> Deleting Hue cache: \(String(describing: cacheX))") - UserDefaults.standard.removeObject(forKey: "CacheX") - UserDefaults.standard.synchronize() + preferences().removeObject(forKey: "CacheX") + preferences().synchronize() DispatchQueue.global().async { DispatchQueue.main.sync { diff --git a/Turn Touch iOS/Modes/Ifttt/TTModeIfttt.swift b/Turn Touch iOS/Modes/Ifttt/TTModeIfttt.swift index 283e095..6f4431a 100644 --- a/Turn Touch iOS/Modes/Ifttt/TTModeIfttt.swift +++ b/Turn Touch iOS/Modes/Ifttt/TTModeIfttt.swift @@ -222,7 +222,7 @@ class TTModeIfttt: TTMode { func collectTriggers() -> [[String: String]] { var triggers: [[String: String]] = [] - let prefs = UserDefaults.standard + let prefs = preferences() // Primary modes first for modeDirection: TTModeDirection in [.north, .east, .west, .south] { diff --git a/Turn Touch iOS/Modes/Sonos/TTModeSonos.swift b/Turn Touch iOS/Modes/Sonos/TTModeSonos.swift index 539b26c..a035e08 100644 --- a/Turn Touch iOS/Modes/Sonos/TTModeSonos.swift +++ b/Turn Touch iOS/Modes/Sonos/TTModeSonos.swift @@ -344,7 +344,7 @@ class TTModeSonos: TTMode { } func selectedDevice(coordinator: Bool = false) -> SonosController? { - var devices = self.foundDevices() + let devices = self.foundDevices() if devices.count == 0 { return nil } @@ -372,7 +372,7 @@ class TTModeSonos: TTMode { func cachedDevices() -> [SonosController] { var cachedDevices: [SonosController] = [] - let prefs = UserDefaults.standard + let prefs = preferences() guard let devices = prefs.array(forKey: TTModeSonosConstants.kSonosCachedDevices) as? [[String: Any]] else { return [] } @@ -412,7 +412,7 @@ class TTModeSonos: TTMode { cachedDevices.append(cachedDevice) } - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(cachedDevices, forKey: TTModeSonosConstants.kSonosCachedDevices) prefs.synchronize() } diff --git a/Turn Touch iOS/Modes/Spotify/TTModeSpotify.swift b/Turn Touch iOS/Modes/Spotify/TTModeSpotify.swift index 11f3cb6..65f0705 100644 --- a/Turn Touch iOS/Modes/Spotify/TTModeSpotify.swift +++ b/Turn Touch iOS/Modes/Spotify/TTModeSpotify.swift @@ -75,10 +75,10 @@ class TTModeSpotify : TTMode, SPTAppRemotePlayerStateDelegate { class var accessToken: String? { get { - return UserDefaults.standard.string(forKey: TTModeSpotifyConstants.kSpotifyAccessToken) + return preferences().string(forKey: TTModeSpotifyConstants.kSpotifyAccessToken) } set { - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(newValue, forKey: TTModeSpotifyConstants.kSpotifyAccessToken) prefs.synchronize() @@ -224,7 +224,7 @@ class TTModeSpotify : TTMode, SPTAppRemotePlayerStateDelegate { // MARK: Action methods override func activate() { - TTModeSpotify.accessToken = UserDefaults.standard.string(forKey: TTModeSpotifyConstants.kSpotifyAccessToken) + TTModeSpotify.accessToken = preferences().string(forKey: TTModeSpotifyConstants.kSpotifyAccessToken) if !TTModeSpotify.appRemote.isConnected { self.beginConnectingToSpotify() diff --git a/Turn Touch iOS/Modes/Wemo/TTModeWemo.swift b/Turn Touch iOS/Modes/Wemo/TTModeWemo.swift index 0af3643..a1eaeb8 100644 --- a/Turn Touch iOS/Modes/Wemo/TTModeWemo.swift +++ b/Turn Touch iOS/Modes/Wemo/TTModeWemo.swift @@ -64,7 +64,7 @@ class TTModeWemo: TTMode, TTModeWemoMulticastDelegate, TTModeWemoDeviceDelegate } func resetKnownDevices() { - let prefs = UserDefaults.standard + let prefs = preferences() prefs.removeObject(forKey: TTModeWemoConstants.kWemoFoundDevices) prefs.synchronize() @@ -72,7 +72,7 @@ class TTModeWemo: TTMode, TTModeWemoMulticastDelegate, TTModeWemoDeviceDelegate } func assembleFoundDevices() { - let prefs = UserDefaults.standard + let prefs = preferences() TTModeWemo.foundDevices = [] if let foundDevices = prefs.array(forKey: TTModeWemoConstants.kWemoFoundDevices) as? [[String: AnyObject]] { @@ -336,7 +336,7 @@ class TTModeWemo: TTMode, TTModeWemoMulticastDelegate, TTModeWemoDeviceDelegate "serialNumber": device.serialNumber ?? "", "macAddress": device.macAddress ?? ""]) } - let prefs = UserDefaults.standard + let prefs = preferences() prefs.set(foundDevices, forKey: TTModeWemoConstants.kWemoFoundDevices) prefs.synchronize() } diff --git a/Turn Touch iOS/Turn Touch iOS.entitlements b/Turn Touch iOS/Turn Touch iOS.entitlements index a07b91a..9d218d9 100644 --- a/Turn Touch iOS/Turn Touch iOS.entitlements +++ b/Turn Touch iOS/Turn Touch iOS.entitlements @@ -10,5 +10,9 @@ com.apple.developer.ubiquity-kvstore-identifier $(TeamIdentifierPrefix)com.turntouch.ios-remote + com.apple.security.application-groups + + group.com.turntouch.ios-remote + diff --git a/Turn Touch iOS/Views/Main/TTDeviceTitleView.swift b/Turn Touch iOS/Views/Main/TTDeviceTitleView.swift index e128ebc..6e86c4a 100644 --- a/Turn Touch iOS/Views/Main/TTDeviceTitleView.swift +++ b/Turn Touch iOS/Views/Main/TTDeviceTitleView.swift @@ -81,7 +81,7 @@ class TTDeviceTitleView: UIView, TTTitleMenuDelegate, DFUServiceDelegate, DFUPro self.addConstraint(NSLayoutConstraint(item: stateLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0)) - let latestVersion = UserDefaults.standard.integer(forKey: "TT:firmware:version") + let latestVersion = preferences().integer(forKey: "TT:firmware:version") upgradeButton.isHidden = false upgradeButton.translatesAutoresizingMaskIntoConstraints = false upgradeButton.titleLabel!.textAlignment = .right @@ -292,7 +292,7 @@ class TTDeviceTitleView: UIView, TTTitleMenuDelegate, DFUServiceDelegate, DFUPro // Please, read the field documentation before use. dfuInitiator.enableUnsafeExperimentalButtonlessServiceInSecureDfu = true - let latestFirmware = String(format: "%02d", UserDefaults.standard.integer(forKey: "TT:firmware:version")) + let latestFirmware = String(format: "%02d", preferences().integer(forKey: "TT:firmware:version")) let fileUrl = Bundle.main.url(forResource: "nrf51_\(latestFirmware)", withExtension: "zip", subdirectory: "DFU")! let selectedFirmware = DFUFirmware(urlToZipFile: fileUrl) diff --git a/Turn Touch iOS/Views/Modal/TTGeofencingViewController.swift b/Turn Touch iOS/Views/Modal/TTGeofencingViewController.swift index 41b706f..1f68dd8 100644 --- a/Turn Touch iOS/Views/Modal/TTGeofencingViewController.swift +++ b/Turn Touch iOS/Views/Modal/TTGeofencingViewController.swift @@ -68,7 +68,7 @@ class TTGeofencingViewController: UIViewController, MKMapViewDelegate, CLLocatio } @objc func save(_ sender: UIBarButtonItem!) { - let prefs = UserDefaults.standard + let prefs = preferences() let center = mapView.camera.centerCoordinate prefs.set(["lat": NSNumber(value: center.latitude), @@ -93,7 +93,7 @@ class TTGeofencingViewController: UIViewController, MKMapViewDelegate, CLLocatio if let lastLocation = locations.last, lastLocation.timestamp.timeIntervalSinceNow > -5.0 { if !regionHasBeenCentered { regionHasBeenCentered = true - let prefs = UserDefaults.standard + let prefs = preferences() if let coords = prefs.dictionary(forKey: "TT:geofence:1") as? [String: NSNumber] { let center = CLLocationCoordinate2D(latitude: coords["lat"] as! CLLocationDegrees, longitude: coords["long"] as! CLLocationDegrees) diff --git a/Widget Extension/Turn Touch Widget.entitlements b/Widget Extension/Turn Touch Widget.entitlements new file mode 100644 index 0000000..471f7f2 --- /dev/null +++ b/Widget Extension/Turn Touch Widget.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.turntouch.ios-remote + + + diff --git a/Widget Extension/WidgetDelegate.swift b/Widget Extension/WidgetDelegate.swift index 9d4c633..76e15ce 100644 --- a/Widget Extension/WidgetDelegate.swift +++ b/Widget Extension/WidgetDelegate.swift @@ -34,7 +34,10 @@ class WidgetDelegate: UIResponder { } func loadPreferences() { - let prefs = UserDefaults.standard + guard let prefs = UserDefaults(suiteName: "group.dejal.turntouch.ios-remote") else { + return + } + let defaultPrefsFile = Bundle.main.path(forResource: "Preferences", ofType: "plist") let defaultPrefs = NSDictionary(contentsOfFile: defaultPrefsFile!) as! [String: AnyObject] prefs.register(defaults: defaultPrefs) @@ -43,12 +46,10 @@ class WidgetDelegate: UIResponder { prefs.set(Bundle.main.infoDictionary!["CFBundleShortVersionString"], forKey: "version") prefs.set(Bundle.main.infoDictionary!["CFBundleVersion"], forKey: "build_number") - - prefs.synchronize() } func processDefaultSettings() { - let defaults = UserDefaults.standard + let defaults = preferences() defaults.synchronize() guard let settingsBundle = Bundle.main.path(forResource: "Settings", ofType: "bundle") as NSString? else { @@ -86,3 +87,7 @@ class WidgetDelegate: UIResponder { func appDelegate() -> WidgetDelegate { return WidgetDelegate.shared } + +func preferences() -> UserDefaults { + return UserDefaults(suiteName: "group.com.turntouch.ios-remote") ?? UserDefaults.standard +} diff --git a/Widget Extension/WidgetExtensionViewController.swift b/Widget Extension/WidgetExtensionViewController.swift index 1d19e38..14715c9 100644 --- a/Widget Extension/WidgetExtensionViewController.swift +++ b/Widget Extension/WidgetExtensionViewController.swift @@ -14,8 +14,8 @@ class WidgetExtensionViewController: UIViewController, NCWidgetProviding { var modeTabsView = UIStackView() var modeTabs: [TTModeTab] = [] var modeTabsConstraint: NSLayoutConstraint! -// var actionDiamondView = TTActionDiamondView(diamondType: .interactive) -// var actionDiamondConstraint: NSLayoutConstraint! + var actionDiamondView = TTActionDiamondView(diamondType: .interactive) + var actionDiamondConstraint: NSLayoutConstraint! override func viewDidLoad() { super.viewDidLoad() @@ -58,38 +58,38 @@ class WidgetExtensionViewController: UIViewController, NCWidgetProviding { self.view.addConstraint(NSLayoutConstraint(item: stackView, attribute: .right, relatedBy: .equal, toItem: self.view, attribute: .right, multiplier: 1.0, constant: 0.0)) -// if appDelegate().modeMap.buttonAppMode() == .SixteenButtons { -// modeTabs = [ -// TTModeTab(modeDirection:.north), -// TTModeTab(modeDirection:.east), -// TTModeTab(modeDirection:.west), -// TTModeTab(modeDirection:.south), -// ] -// } else { -// modeTabs = [ -// TTModeTab(modeDirection: .single), -// TTModeTab(modeDirection: .double), -// TTModeTab(modeDirection: .hold) -// ] -// } -// for view in modeTabs { -// modeTabsView.addArrangedSubview(view) -// } -// modeTabsView.axis = .horizontal -// modeTabsView.distribution = .fillEqually -// modeTabsView.alignment = .fill -// modeTabsView.spacing = 0 -// modeTabsView.contentMode = .scaleToFill -// stackView.addArrangedSubview(modeTabsView); -// -// modeTabsConstraint = NSLayoutConstraint(item: modeTabsView, attribute: .height, relatedBy: .equal, -// toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 92.0) -// stackView.addConstraint(modeTabsConstraint) -// -// actionDiamondConstraint = NSLayoutConstraint(item: actionDiamondView, attribute: .height, relatedBy: .equal, -// toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 420) -// stackView.addConstraint(actionDiamondConstraint) -// stackView.addArrangedSubview(actionDiamondView) + if appDelegate().modeMap.buttonAppMode() == .SixteenButtons { + modeTabs = [ + TTModeTab(modeDirection:.north), + TTModeTab(modeDirection:.east), + TTModeTab(modeDirection:.west), + TTModeTab(modeDirection:.south), + ] + } else { + modeTabs = [ + TTModeTab(modeDirection: .single), + TTModeTab(modeDirection: .double), + TTModeTab(modeDirection: .hold) + ] + } + for view in modeTabs { + modeTabsView.addArrangedSubview(view) + } + modeTabsView.axis = .horizontal + modeTabsView.distribution = .fillEqually + modeTabsView.alignment = .fill + modeTabsView.spacing = 0 + modeTabsView.contentMode = .scaleToFill + stackView.addArrangedSubview(modeTabsView); + + modeTabsConstraint = NSLayoutConstraint(item: modeTabsView, attribute: .height, relatedBy: .equal, + toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 92.0) + stackView.addConstraint(modeTabsConstraint) + + actionDiamondConstraint = NSLayoutConstraint(item: actionDiamondView, attribute: .height, relatedBy: .equal, + toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 420) + stackView.addConstraint(actionDiamondConstraint) + stackView.addArrangedSubview(actionDiamondView) // if appDelegate().modeMap.buttonAppMode() == .TwelveButtons, let modeTitleView = modeTitleView { // modeTitleView.alpha = 0