You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.5 KiB
70 lines
2.5 KiB
//
|
|
// IntentHandler.swift
|
|
// LaunchIntents
|
|
//
|
|
// Created by Laurent Morvillier on 25/01/2023.
|
|
//
|
|
|
|
import Intents
|
|
|
|
class IntentHandler: INExtension, SelectCountdownIntentHandling {
|
|
|
|
// func resolveCountdown(for intent: SelectCountdownIntent, with completion: @escaping (CountdownPropertiesResolutionResult) -> Void) {
|
|
// }
|
|
|
|
func resolveCountdown(for intent: SelectCountdownIntent) async -> CountdownPropertiesResolutionResult {
|
|
print("***resolveCountdown")
|
|
if let countdown = intent.countdown {
|
|
return CountdownPropertiesResolutionResult.success(with: countdown)
|
|
} else {
|
|
return CountdownPropertiesResolutionResult.needsValue()
|
|
}
|
|
}
|
|
|
|
// func provideCountdownOptionsCollection(for intent: SelectCountdownIntent, with completion: @escaping (INObjectCollection<CountdownProperties>?, Error?) -> Void) {
|
|
//
|
|
//
|
|
// }
|
|
|
|
func provideCountdownOptionsCollection(for intent: SelectCountdownIntent) async throws -> INObjectCollection<CountdownProperties> {
|
|
print("*** provideCountdownOptionsCollection")
|
|
|
|
do {
|
|
let countdowns = try IntentDataProvider.main.countdowns()
|
|
|
|
let properties: [CountdownProperties] = countdowns.map { countdown in
|
|
|
|
let displayName: String
|
|
let formattedDuration = countdown.duration.minuteSecond
|
|
if let name = countdown.activity?.name, !name.isEmpty {
|
|
displayName = "\(name) (\(formattedDuration))"
|
|
} else {
|
|
displayName = formattedDuration
|
|
}
|
|
|
|
let cp = CountdownProperties(identifier: countdown.objectID.uriRepresentation().absoluteString, display: displayName)
|
|
cp.name = countdown.activity?.name
|
|
cp.duration = NSNumber(value: countdown.duration)
|
|
return cp
|
|
}
|
|
|
|
let collection: INObjectCollection<CountdownProperties> = INObjectCollection(items: properties)
|
|
print("*** provide \(properties.count) countdowns")
|
|
|
|
return collection
|
|
} catch {
|
|
print("error = \(error)")
|
|
throw error
|
|
// completion(nil, error)
|
|
}
|
|
}
|
|
|
|
|
|
override func handler(for intent: INIntent) -> Any {
|
|
// This is the default implementation. If you want different objects to handle different intents,
|
|
// you can override this and return the handler you want for that particular intent.
|
|
|
|
return self
|
|
}
|
|
|
|
}
|
|
|