Various fixes

main
Laurent 3 years ago
parent d05483d117
commit bed245f64d
  1. 4
      LeCountdown/Info.plist
  2. 18
      LeCountdown/Utils/Extensions.swift
  3. 2
      LeCountdown/Utils/Shortcut.swift
  4. 9
      LeCountdown/Utils/TimeInterval+Extensions.swift
  5. 2
      LeCountdown/Views/Countdown/CountdownDialView.swift
  6. 45
      LeCountdown/Views/Countdown/CountdownFormView.swift
  7. 27
      LeCountdown/Views/Countdown/NewCountdownView.swift
  8. 11
      LeCountdown/Views/Reusable/MailView.swift
  9. 1
      LeCountdown/fr.lproj/Localizable.strings

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleDisplayName</key>
<string>Enchant</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>BGTaskSchedulerPermittedIdentifiers</key> <key>BGTaskSchedulerPermittedIdentifiers</key>
@ -25,7 +27,7 @@
<array> <array>
<string>LaunchTimerIntent</string> <string>LaunchTimerIntent</string>
<string>SelectTimerIntent</string> <string>SelectTimerIntent</string>
<string>app.kikai.NewCountdown</string> <string>app.enchant.NewCountdown</string>
</array> </array>
<key>UIApplicationSceneManifest</key> <key>UIApplicationSceneManifest</key>
<dict> <dict>

@ -22,13 +22,6 @@ extension String {
} }
//extension Sequence where Element : RawRepresentable<Int> {
// var stringRepresentation: String {
// let ids = self.compactMap { formatter.string(from: NSNumber(value: $0.rawValue)) }
// return ids.joined(separator: separator)
// }
//}
extension Sequence where Element : StringRepresentable { extension Sequence where Element : StringRepresentable {
var stringRepresentation: String { var stringRepresentation: String {
let ids = self.compactMap { $0.stringValue } let ids = self.compactMap { $0.stringValue }
@ -43,3 +36,14 @@ protocol StringRepresentable {
extension String: StringRepresentable { extension String: StringRepresentable {
var stringValue: String { self } var stringValue: String { self }
} }
extension Bundle {
var applicationName: String {
if let displayName: String = self.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
return displayName
} else if let name: String = self.localizedInfoDictionary?["CFBundleName"] as? String {
return name
}
return "No Name Found"
}
}

@ -13,7 +13,7 @@ import UniformTypeIdentifiers
enum Shortcut: String { enum Shortcut: String {
case newCountdown = "app.kikai.NewCountdown" case newCountdown = "app.enchant.NewCountdown"
var userActivity: NSUserActivity { var userActivity: NSUserActivity {
let activity = NSUserActivity(activityType: self.rawValue) let activity = NSUserActivity(activityType: self.rawValue)

@ -10,12 +10,17 @@ import Foundation
extension TimeInterval { extension TimeInterval {
var hourMinuteSecond: String { var hourMinuteSecond: String {
return String(format:"%d:%02d:%02d", hour, minute, second) let h = self.hour
if h > 0 {
return String(format:"%d:%02d:%02d", hour, minute, second)
} else {
return self.minuteSecond
}
} }
var hourMinuteSecondHS: String { var hourMinuteSecondHS: String {
let h = self.hour let h = self.hour
if h > 1 { if h > 0 {
return String(format:"%d:%02d:%02d", hour, minute, second) return String(format:"%d:%02d:%02d", hour, minute, second)
} else { } else {
return String(format:"%02d:%02d.%02d", minute, second, hundredth) return String(format:"%02d:%02d.%02d", minute, second, hundredth)

@ -22,7 +22,7 @@ struct CountdownDialView: View {
Text(countdown.activity?.name?.uppercased() ?? "") Text(countdown.activity?.name?.uppercased() ?? "")
.foregroundColor(isEditing ? .white : .black) .foregroundColor(isEditing ? .white : .black)
.multilineTextAlignment(.leading) .multilineTextAlignment(.leading)
Text(countdown.duration.minuteSecond) Text(countdown.duration.hourMinuteSecond)
.fontWeight(.semibold) .fontWeight(.semibold)
.foregroundColor(.accentColor) .foregroundColor(.accentColor)
} }

@ -9,6 +9,7 @@ import SwiftUI
enum CountdownField: Int, Hashable { enum CountdownField: Int, Hashable {
case name case name
case hours
case minutes case minutes
case seconds case seconds
} }
@ -19,9 +20,11 @@ struct CountdownFormView : View {
@EnvironmentObject var model: TimerModel @EnvironmentObject var model: TimerModel
var nameBinding: Binding<String>
var secondsBinding: Binding<String> var secondsBinding: Binding<String>
var minutesBinding: Binding<String> var minutesBinding: Binding<String>
var nameBinding: Binding<String> var hoursBinding: Binding<String>
var imageBinding: Binding<CoolPic> var imageBinding: Binding<CoolPic>
@ -32,15 +35,27 @@ struct CountdownFormView : View {
var body: some View { var body: some View {
Group { Group {
Section("Name") { Section {
TextField("Name", text: nameBinding) TextField("Name", text: nameBinding)
.focused($focusedField, equals: .name) .focused($focusedField, equals: .name)
.onSubmit { .onSubmit {
self.focusNextField($focusedField) self.focusNextField($focusedField)
} }
} header: {
Text("Name")
} footer: {
if !self.nameBinding.wrappedValue.isEmpty {
Text("Ask Siri: \(Bundle.main.applicationName) \(self.nameBinding.wrappedValue)!")
}
} }
Section("Duration") {
Section {
TextField("Hours", text: hoursBinding)
.keyboardType(.numberPad)
.focused($focusedField, equals: .hours)
.onSubmit {
self.focusNextField($focusedField)
}
TextField("Minutes", text: minutesBinding) TextField("Minutes", text: minutesBinding)
.keyboardType(.numberPad) .keyboardType(.numberPad)
.focused($focusedField, equals: .minutes) .focused($focusedField, equals: .minutes)
@ -53,6 +68,8 @@ struct CountdownFormView : View {
.onSubmit { .onSubmit {
self.focusedField = nil self.focusedField = nil
} }
} header: {
LabeledContent("Duration", value: self.duration().hourMinuteSecond).font(.footnote)
} }
SoundFormView( SoundFormView(
@ -64,6 +81,23 @@ struct CountdownFormView : View {
} }
func duration() -> TimeInterval {
let formatter = NumberFormatter()
var hours: Int = 0
var minutes: Int = 0
var seconds: Int = 0
if let h = formatter.number(from: hoursBinding.wrappedValue) {
hours = h.intValue
}
if let m = formatter.number(from: minutesBinding.wrappedValue) {
minutes = m.intValue
}
if let s = formatter.number(from: secondsBinding.wrappedValue) {
seconds = s.intValue
}
return Double(seconds) + 60 * Double(minutes) + 60 * 60 * Double(hours)
}
} }
struct CountdownFormView_Previews: PreviewProvider { struct CountdownFormView_Previews: PreviewProvider {
@ -74,9 +108,10 @@ struct CountdownFormView_Previews: PreviewProvider {
Form { Form {
CountdownFormView( CountdownFormView(
nameBinding: .constant(""),
secondsBinding: .constant(""), secondsBinding: .constant(""),
minutesBinding: .constant(""), minutesBinding: .constant(""),
nameBinding: .constant(""), hoursBinding: .constant(""),
imageBinding: .constant(.pic3), imageBinding: .constant(.pic3),
repeatCountBinding: .constant(2), repeatCountBinding: .constant(2),
intervalRepeatBinding: .constant(2)) intervalRepeatBinding: .constant(2))

@ -51,10 +51,12 @@ struct CountdownEditView : View {
var preset: Preset? = nil var preset: Preset? = nil
@Binding var isPresented: Bool @Binding var isPresented: Bool
@State var nameString: String = ""
@State var secondsString: String = "" @State var secondsString: String = ""
@State var minutesString: String = "" @State var minutesString: String = ""
@State var nameString: String = "" @State var hoursString: String = ""
@State var soundRepeatCount: Int16 = 0 @State var soundRepeatCount: Int16 = 0
@State var image: CoolPic = .pic1 @State var image: CoolPic = .pic1
@ -115,9 +117,10 @@ struct CountdownEditView : View {
CountdownFormView( CountdownFormView(
focusedField: _focusedField, focusedField: _focusedField,
nameBinding: $nameString,
secondsBinding: $secondsString, secondsBinding: $secondsString,
minutesBinding: $minutesString, minutesBinding: $minutesString,
nameBinding: $nameString, hoursBinding: $hoursString,
imageBinding: $image, imageBinding: $image,
repeatCountBinding: $soundRepeatCount) repeatCountBinding: $soundRepeatCount)
.environmentObject(self.model) .environmentObject(self.model)
@ -250,13 +253,16 @@ struct CountdownEditView : View {
fileprivate func _loadCountdown(_ countdown: Countdown) { fileprivate func _loadCountdown(_ countdown: Countdown) {
let minutes = Int(countdown.duration / 60.0) let hours = Int(countdown.duration / 3600.0)
let seconds = countdown.duration - Double(minutes * 60) let minutes = countdown.duration - Double(hours * 3600)
let seconds = countdown.duration - Double(hours * 3600) - Double(minutes * 60)
if hours > 0 {
self.hoursString = self._numberFormatter.string(from: NSNumber(value: hours)) ?? ""
}
if minutes > 0 { if minutes > 0 {
self.minutesString = self._numberFormatter.string(from: NSNumber(value: minutes)) ?? "" self.minutesString = self._numberFormatter.string(from: NSNumber(value: minutes)) ?? ""
} }
if seconds > 0 { if seconds > 0 {
self.secondsString = self._numberFormatter.string(from: NSNumber(value: seconds)) ?? "" self.secondsString = self._numberFormatter.string(from: NSNumber(value: seconds)) ?? ""
} }
@ -285,6 +291,10 @@ struct CountdownEditView : View {
return self._numberFormatter.number(from: self.minutesString)?.doubleValue ?? 0.0 return self._numberFormatter.number(from: self.minutesString)?.doubleValue ?? 0.0
} }
fileprivate var _hours: Double {
return self._numberFormatter.number(from: self.hoursString)?.doubleValue ?? 0.0
}
fileprivate func _cancel() { fileprivate func _cancel() {
self.viewContext.rollback() self.viewContext.rollback()
self.isPresented = false self.isPresented = false
@ -299,10 +309,9 @@ struct CountdownEditView : View {
cd = Countdown(context: viewContext) cd = Countdown(context: viewContext)
} }
cd.duration = self._minutes * 60.0 + self._seconds cd.duration = self._hours * 3600.0 + self._minutes * 60.0 + self._seconds
if self._isNewCountdown { if self._isNewCountdown {
let max: Int16 let max: Int16
do { do {
let request = AbstractTimer.fetchRequest() let request = AbstractTimer.fetchRequest()
let timers = try viewContext.fetch(request) let timers = try viewContext.fetch(request)
@ -312,7 +321,6 @@ struct CountdownEditView : View {
} else { } else {
max = 0 max = 0
} }
} catch { } catch {
max = 0 max = 0
} }
@ -346,7 +354,6 @@ struct CountdownEditView : View {
} else { } else {
cd.activity = CoreDataRequests.getOrCreateActivity(name: trimmed) cd.activity = CoreDataRequests.getOrCreateActivity(name: trimmed)
} }
} }
self._saveContext() self._saveContext()

@ -55,14 +55,3 @@ struct MailView: UIViewControllerRepresentable {
} }
} }
fileprivate extension Bundle {
var applicationName: String {
if let displayName: String = self.infoDictionary?["CFBundleDisplayName"] as? String {
return displayName
} else if let name: String = self.infoDictionary?["CFBundleName"] as? String {
return name
}
return ""
}
}

@ -258,3 +258,4 @@
"month" = "mois"; "month" = "mois";
"year" = "an"; "year" = "an";
"Get fully enchanted" = "Enchantement permanent"; "Get fully enchanted" = "Enchantement permanent";
"Ask Siri: %@ %@!" = "Dites à Siri: %@ %@!";

Loading…
Cancel
Save