diff --git a/Shared/en.lproj/Localizable.strings b/Shared/en.lproj/Localizable.strings new file mode 100644 index 0000000..19e7aa2 --- /dev/null +++ b/Shared/en.lproj/Localizable.strings @@ -0,0 +1,21 @@ +/* + Localizable.strings + samsung-pinger + + Created by Виктор Щелочков on 29.09.2023. + +*/ + +"settings_label" = "To be able to ping your device, this widget needs your Samsung's SmartThingsFind tokens and Device ID. This information never leaves your computer and won't be shared with anyone. You can review source code at "; +"instructions_label" = "Don't know how to find these values?"; +"instructions_link" = "View instructions"; +"settings_field_ping_text" = "Ping text (optional):"; +"settings_field_ping_placeholder" = "Samsung Pinger is ringing this phone!"; +"saved_successfully_message" = "Saved successfully!"; +"validation_error_message" = "Validation Error"; +"required_field_error" = " is a required field. If you don't know where to find this token, please refer to instructions in README.md file on GitHub"; +"device_id_validation_error" = "Device ID must only consist of numbers"; +"ringing_view_connecting" = "Connecting..."; +"ringing_view_ringing" = "Ringing your Samsung device..."; +"error" = "Error"; +"save_button" = "Save"; diff --git a/Shared/ru.lproj/Localizable.strings b/Shared/ru.lproj/Localizable.strings new file mode 100644 index 0000000..9e2a519 --- /dev/null +++ b/Shared/ru.lproj/Localizable.strings @@ -0,0 +1,21 @@ +/* + Localizable.strings + samsung-pinger + + Created by Виктор Щелочков on 29.09.2023. + +*/ + +"settings_label" = "Чтобы пинговать ваше устройство, этому виджеты нужны токены SmartThingsFind и Device ID. Эти данные никогда не покидают ваш компьютер и никому не передаются. Узнайте больше на "; +"instructions_label" = "Узнайте, как получить значения ниже:"; +"instructions_link" = "Инструкция"; +"settings_field_ping_text" = "Текст на экране (необязательно):"; +"settings_field_ping_placeholder" = "Samsung Pinger звонит на этот телефон!"; +"saved_successfully_message" = "Успешно сохранено!"; +"validation_error_message" = "Ошибка валидации"; +"required_field_error" = " это обязательное поле. Если вы не знаете, где найти это значение, пожалуйста, обратитесь к инструкции в README.md на GitHub"; +"device_id_validation_error" = "Device ID может состоять только из цифр"; +"ringing_view_connecting" = "Подключение..."; +"ringing_view_ringing" = "Звонок на устройство..."; +"error" = "Ошибка"; +"save_button" = "Сохранить"; diff --git a/samsung-pinger.xcodeproj/project.pbxproj b/samsung-pinger.xcodeproj/project.pbxproj index 51f47d2..86a3d69 100644 --- a/samsung-pinger.xcodeproj/project.pbxproj +++ b/samsung-pinger.xcodeproj/project.pbxproj @@ -23,8 +23,10 @@ A74393AE2AC6C487000A5682 /* samsungsharpsans-bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */; }; A74393B22AC6CBAD000A5682 /* samsungsharpsans-medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */; }; A74393B32AC6CBAD000A5682 /* samsungsharpsans-medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */; }; - A74393B62AC6CDD0000A5682 /* samsungsharpsans-bold.otf in CopyFiles */ = {isa = PBXBuildFile; fileRef = A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */; }; - A74393B72AC6CDD2000A5682 /* samsungsharpsans-medium.otf in CopyFiles */ = {isa = PBXBuildFile; fileRef = A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */; }; + A74393B62AC6CDD0000A5682 /* samsungsharpsans-bold.otf in Copy Files */ = {isa = PBXBuildFile; fileRef = A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */; }; + A74393B72AC6CDD2000A5682 /* samsungsharpsans-medium.otf in Copy Files */ = {isa = PBXBuildFile; fileRef = A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */; }; + A76669EC2AC7317E005FE393 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A76669EF2AC7317E005FE393 /* Localizable.strings */; }; + A76669ED2AC7317E005FE393 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A76669EF2AC7317E005FE393 /* Localizable.strings */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -49,15 +51,16 @@ name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - A74393B52AC6CDBF000A5682 /* CopyFiles */ = { + A74393B52AC6CDBF000A5682 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = Fonts; dstSubfolderSpec = 7; files = ( - A74393B72AC6CDD2000A5682 /* samsungsharpsans-medium.otf in CopyFiles */, - A74393B62AC6CDD0000A5682 /* samsungsharpsans-bold.otf in CopyFiles */, + A74393B72AC6CDD2000A5682 /* samsungsharpsans-medium.otf in Copy Files */, + A74393B62AC6CDD0000A5682 /* samsungsharpsans-bold.otf in Copy Files */, ); + name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ @@ -81,6 +84,8 @@ A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "samsungsharpsans-bold.otf"; sourceTree = ""; }; A74393B02AC6CAEF000A5682 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "samsungsharpsans-medium.otf"; sourceTree = ""; }; + A76669EE2AC7317E005FE393 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + A76669F02AC73184005FE393 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,7 +111,7 @@ A714E6662AC5CE85006C139D = { isa = PBXGroup; children = ( - A74393AA2AC6C43E000A5682 /* Shared */, + A76669EA2AC73083005FE393 /* Shared */, A714E6712AC5CE86006C139D /* samsung-pinger */, A714E68B2AC5CF7D006C139D /* widget */, A714E6862AC5CF7D006C139D /* Frameworks */, @@ -131,6 +136,7 @@ A714E6742AC5CE86006C139D /* ContentView.swift */, A74393A52AC6C174000A5682 /* RingingView.swift */, A714E6762AC5CE87006C139D /* Assets.xcassets */, + A74393AB2AC6C443000A5682 /* fonts */, A714E67B2AC5CE87006C139D /* samsung_pinger.entitlements */, A714E6782AC5CE87006C139D /* Preview Content */, ); @@ -166,21 +172,21 @@ path = widget; sourceTree = ""; }; - A74393AA2AC6C43E000A5682 /* Shared */ = { + A74393AB2AC6C443000A5682 /* fonts */ = { isa = PBXGroup; children = ( - A74393AB2AC6C443000A5682 /* fonts */, + A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */, + A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */, ); - path = Shared; + path = fonts; sourceTree = ""; }; - A74393AB2AC6C443000A5682 /* fonts */ = { + A76669EA2AC73083005FE393 /* Shared */ = { isa = PBXGroup; children = ( - A74393AC2AC6C487000A5682 /* samsungsharpsans-bold.otf */, - A74393B12AC6CBAD000A5682 /* samsungsharpsans-medium.otf */, + A76669EF2AC7317E005FE393 /* Localizable.strings */, ); - path = fonts; + path = Shared; sourceTree = ""; }; /* End PBXGroup section */ @@ -194,7 +200,7 @@ A714E66C2AC5CE85006C139D /* Frameworks */, A714E66D2AC5CE85006C139D /* Resources */, A714E69B2AC5CF7F006C139D /* Embed Foundation Extensions */, - A74393B52AC6CDBF000A5682 /* CopyFiles */, + A74393B52AC6CDBF000A5682 /* Copy Files */, ); buildRules = ( ); @@ -248,6 +254,7 @@ knownRegions = ( en, Base, + ru, ); mainGroup = A714E6662AC5CE85006C139D; productRefGroup = A714E6702AC5CE86006C139D /* Products */; @@ -265,6 +272,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + A76669EC2AC7317E005FE393 /* Localizable.strings in Resources */, A714E67A2AC5CE87006C139D /* Preview Assets.xcassets in Resources */, A74393B22AC6CBAD000A5682 /* samsungsharpsans-medium.otf in Resources */, A714E6772AC5CE87006C139D /* Assets.xcassets in Resources */, @@ -277,6 +285,7 @@ buildActionMask = 2147483647; files = ( A714E6902AC5CF7F006C139D /* Assets.xcassets in Resources */, + A76669ED2AC7317E005FE393 /* Localizable.strings in Resources */, A74393AE2AC6C487000A5682 /* samsungsharpsans-bold.otf in Resources */, A74393B32AC6CBAD000A5682 /* samsungsharpsans-medium.otf in Resources */, ); @@ -315,6 +324,18 @@ }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + A76669EF2AC7317E005FE393 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + A76669EE2AC7317E005FE393 /* en */, + A76669F02AC73184005FE393 /* ru */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ A714E67C2AC5CE87006C139D /* Debug */ = { isa = XCBuildConfiguration; @@ -370,6 +391,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "Samsung Pinger"; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -423,6 +445,7 @@ MACOSX_DEPLOYMENT_TARGET = 13.3; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + PRODUCT_NAME = "Samsung Pinger"; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; @@ -435,10 +458,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_ENTITLEMENTS = "samsung-pinger/samsung_pinger.entitlements"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_ASSET_PATHS = "\"samsung-pinger/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -450,7 +474,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = 1.1; PRODUCT_BUNDLE_IDENTIFIER = "dev.hloth.samsung-pinger"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -464,10 +489,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_ENTITLEMENTS = "samsung-pinger/samsung_pinger.entitlements"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_ASSET_PATHS = "\"samsung-pinger/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -479,7 +505,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = 1.1; PRODUCT_BUNDLE_IDENTIFIER = "dev.hloth.samsung-pinger"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -494,10 +521,10 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = widget/widget.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = widget/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = widget; + INFOPLIST_KEY_CFBundleDisplayName = "Samsung Pinger"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -505,7 +532,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.1; PRODUCT_BUNDLE_IDENTIFIER = "dev.hloth.samsung-pinger.widget"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -521,10 +548,10 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = widget/widget.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = widget/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = widget; + INFOPLIST_KEY_CFBundleDisplayName = "Samsung Pinger"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -532,7 +559,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.1; PRODUCT_BUNDLE_IDENTIFIER = "dev.hloth.samsung-pinger.widget"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/samsung-pinger/ContentView.swift b/samsung-pinger/ContentView.swift index 2a2ce9a..2ff62e7 100644 --- a/samsung-pinger/ContentView.swift +++ b/samsung-pinger/ContentView.swift @@ -20,7 +20,7 @@ struct ContentView: View { var body: some View { VStack(alignment: .leading) { VStack(alignment: .leading) { - Text("To be able to ping your device, this widget needs your Samsung's SmartThingsFind tokens and Device ID. This information never leaves your computer and won't be shared with anyone. You can review source code at ") + Text("settings_label") Button(action: {}) { Text("https://github.com/vityaschel/samsung-pinger").underline() .foregroundColor(Color.blue) @@ -37,14 +37,14 @@ struct ContentView: View { .frame(width: 370, alignment: .leading) .padding(.bottom, 20) HStack { - Text("Don't know how to find these values?") + Text("instructions_label") .fontWeight(.bold) Button(action: { if let url = URL(string: "https://github.com/vityaschel/samsung-pinger#setup") { NSWorkspace.shared.open(url) } }) { - Text("View instructions").underline() + Text("instructions_link").underline() .foregroundColor(Color.blue) }.buttonStyle(PlainButtonStyle()) .onHover { inside in @@ -56,16 +56,16 @@ struct ContentView: View { } } .padding(.bottom, 10) - field(title: "Ping text (optional):", placeholder: "Samsung Pinger is ringing this phone!", text: $pingText) + field(title: NSLocalizedString("settings_field_ping_text", comment: "Ping text (optional)"), placeholder: "settings_field_ping_placeholder", text: $pingText) field(title: "JSESSIONID:", text: $jsessionID) field(title: "WMONID:", text: $wmonID) field(title: "Device ID:", text: $deviceID) HStack { Button(action: saveFields) { - Text("Save") + Text("save_button") } if showMessage { - Text("Saved successfully!") + Text("saved_successfully_message") .fontWeight(.bold) .foregroundColor(.green) } @@ -74,28 +74,28 @@ struct ContentView: View { .padding() .frame(width: 400, alignment: .leading) .alert(isPresented: $showAlert) { - Alert(title: Text("Validation Error"), message: Text(alertMessage), dismissButton: .default(Text("OK"))) + Alert(title: Text("validation_error_message"), message: Text(alertMessage), dismissButton: .default(Text("OK"))) } } func saveFields() { if jsessionID.count == 0 { - alertMessage = "JSESSIONID is a required field. If you don't know where to find this token, please refer to instructions in README.md file on GitHub" + alertMessage = "JSESSIONID" + NSLocalizedString("required_field_error", comment: "Required field") showAlert = true return } if wmonID.count == 0 { - alertMessage = "WMONID is a required field. If you don't know where to find this token, please refer to instructions in README.md file on GitHub" + alertMessage = "WMONID" + NSLocalizedString("required_field_error", comment: "Required field") showAlert = true return } if deviceID.count == 0 { - alertMessage = "Device ID is a required field. If you don't know where to find this token, please refer to instructions in README.md file on GitHub" + alertMessage = "Device ID" + NSLocalizedString("required_field_error", comment: "Required field") showAlert = true return } if !NSPredicate(format: "SELF MATCHES %@", "^[0-9]+$").evaluate(with: deviceID) { - alertMessage = "Device ID must only consist of numbers" + alertMessage = NSLocalizedString("device_id_validation_error", comment: "Device ID must only consist of numbers") showAlert = true return } diff --git a/samsung-pinger/Info.plist b/samsung-pinger/Info.plist index d55ed1e..2953df6 100644 --- a/samsung-pinger/Info.plist +++ b/samsung-pinger/Info.plist @@ -3,12 +3,16 @@ ATSApplicationFontsPath - Shared/fonts/ + fonts/ UIAppFonts samsungsharpsans-bold.otf samsungsharpsans-medium.otf + CFBundleDisplayName + Samsung Pinger + CFBundleName + Samsung Pinger UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/samsung-pinger/RingingView.swift b/samsung-pinger/RingingView.swift index 39664ce..e7bafd0 100644 --- a/samsung-pinger/RingingView.swift +++ b/samsung-pinger/RingingView.swift @@ -11,6 +11,10 @@ struct RingingView: View { @Binding var showAlert: Bool @Binding var alertMessage: String @Binding var ringState: String + + var setupCompleted: Bool { + return ringState != "incomplete-setup" + } var body: some View { ZStack { @@ -24,17 +28,27 @@ struct RingingView: View { // .offset(y: 20) .edgesIgnoringSafeArea(.all) - VStack { - Text(ringState == "connecting" ? "Connecting..." : "Ringing your Samsung device...") - .foregroundColor(Color.white) - .font(.custom("Samsung Sharp Sans", size: 20)) - .fontWeight(Font.Weight.medium) + if setupCompleted { + VStack { + Text(ringState == "connecting" ? "ringing_view_connecting" : "ringing_view_ringing") + .foregroundColor(Color.white) + .font(.custom("Samsung Sharp Sans", size: 20).weight(.medium)) + } + } else { + VStack { + Text("Samsung Pinger is not configured") + .foregroundColor(Color.white) + .font(.custom("Samsung Sharp Sans", size: 20).weight(.medium)) + Text("To be able to ring your device, Samsung Pinger must be configured from within app's settings, that can be found when launching the app manually.") + .foregroundColor(Color.white) + .font(.custom("Samsung Sharp Sans", size: 20).weight(.medium)) + } } } .frame(width: 400, height: 300) .alert(isPresented: $showAlert) { Alert( - title: Text("Error"), + title: Text("error"), message: Text(alertMessage), dismissButton: .default(Text("OK")) ) diff --git a/Shared/fonts/samsungsharpsans-bold.otf b/samsung-pinger/fonts/samsungsharpsans-bold.otf similarity index 100% rename from Shared/fonts/samsungsharpsans-bold.otf rename to samsung-pinger/fonts/samsungsharpsans-bold.otf diff --git a/Shared/fonts/samsungsharpsans-medium.otf b/samsung-pinger/fonts/samsungsharpsans-medium.otf similarity index 100% rename from Shared/fonts/samsungsharpsans-medium.otf rename to samsung-pinger/fonts/samsungsharpsans-medium.otf diff --git a/samsung-pinger/samsung_pingerApp.swift b/samsung-pinger/samsung_pingerApp.swift index f3c2399..7cd6a6c 100644 --- a/samsung-pinger/samsung_pingerApp.swift +++ b/samsung-pinger/samsung_pingerApp.swift @@ -8,6 +8,16 @@ import SwiftUI import Foundation import AppKit +import CoreText + +func registerCustomFont(fileName: String, withExtension fileExtension: String) { + guard let fontURL = Bundle.main.url(forResource: fileName, withExtension: fileExtension) else { + print("Failed to find font URL for \(fileName).\(fileExtension)") + return + } + + CTFontManagerRegisterFontsForURL(fontURL as CFURL, .process, nil) +} class WindowState: ObservableObject { @Published var ringAction: Bool = false @@ -17,14 +27,30 @@ class WindowState: ObservableObject { struct samsung_pingerApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + init() { + registerCustomFont(fileName: "samsungsharpsans-bold", withExtension: "otf") + registerCustomFont(fileName: "samsungsharpsans-medium", withExtension: "otf") + } + var body: some Scene { WindowGroup { MainView() } - .windowResizability(.contentSize) +// .windowResizability(.contentSize) + .windowResizabilityContentSize() } } +extension Scene { + func windowResizabilityContentSize() -> some Scene { + if #available(macOS 13.0, *) { + return windowResizability(.contentSize) + } else { + return self + } + } +} + struct MainView: View { @StateObject private var state = WindowState() @@ -48,9 +74,6 @@ struct MainView: View { RingingView(showAlert: $showAlert, alertMessage: $alertMessage, ringState: $ringState) .frame(width: 400, height: 300) .fixedSize() -// .onAppear { -// setTitleBarVisible(false) -// } .onReceive(NotificationCenter.default.publisher(for: NSApplication.willUpdateNotification), perform: { _ in for window in NSApplication.shared.windows { window.standardWindowButton(.zoomButton)?.isEnabled = false @@ -65,14 +88,16 @@ struct MainView: View { handle(url: url) } } - - - private func handleNewWindow(id: UUID) { - // Logic to decide what to do with a new window - } private func handle(url: URL) { if url.absoluteString == "samsung-pinger-widget://ring" { + if ( + UserDefaults.standard.string(forKey: "wmonID")?.isEmpty == true || + UserDefaults.standard.string(forKey: "jsessionID")?.isEmpty == true || + UserDefaults.standard.string(forKey: "deviceID")?.isEmpty == true + ) { + return + } state.ringAction = true } diff --git a/widget/Info.plist b/widget/Info.plist index d79d4ae..115779e 100644 --- a/widget/Info.plist +++ b/widget/Info.plist @@ -4,13 +4,6 @@ ATSApplicationFontsPath Shared/fonts/ - CFBundleDisplayName - Samsung Pinger - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - CFBundleURLTypes @@ -22,9 +15,15 @@ + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + UIAppFonts - samsungsharpsans-bold.otf + Shared/fonts/samsungsharpsans-bold.otf + Shared/fonts/samsungsharpsans-medium.otf diff --git a/widget/widget.swift b/widget/widget.swift index a56ebc8..3081dfc 100644 --- a/widget/widget.swift +++ b/widget/widget.swift @@ -11,7 +11,7 @@ import Intents struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(/*date: Date(), configuration: ConfigurationIntent()*/) + SimpleEntry() } func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { @@ -20,20 +20,6 @@ struct Provider: IntentTimelineProvider { } func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline) -> ()) { -// var entries: [SimpleEntry] = [] -// -// // Generate a timeline consisting of five entries an hour apart, starting from the current date. -// let currentDate = Date() -// for hourOffset in 0 ..< 5 { -// let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! -// let entry = SimpleEntry(date: entryDate, configuration: configuration) -// entries.append(entry) -// } -// -// let timeline = Timeline(entries: entries, policy: .atEnd) -// completion(timeline) - -// let entryDate = Date() let entry = SimpleEntry(/*date: entryDate*/) let timeline = Timeline(entries: [entry], policy: .never) completion(timeline) @@ -54,10 +40,9 @@ struct widgetEntryView : View { .fill(Color.black) .edgesIgnoringSafeArea(.all) VStack { - Text("Ring my Samsung") + Text("Ring my\nSamsung") .foregroundColor(Color.white) - .font(.custom("Samsung Sharp Sans", size: 20)) - .fontWeight(.bold) + .font(.custom("Samsung Sharp Sans", size: 20).weight(.bold)) } } .widgetURL(URL(string: "samsung-pinger-widget://ring"))