From 719f4ef4eb8c81fb1ddf4f7d95b6f455934834f1 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 27 Jun 2024 14:20:31 +0200 Subject: [PATCH] improve widgets --- HabitRPG/Strings/de.lproj/Mainstrings.strings | 4 +- HabitRPG/Utilities/SceneDelegate.swift | 3 +- Habitica Widgets/HabiticaWidgets.swift | 3 +- Habitica Widgets/RemainingDailiesWidget.swift | 3 +- Habitica Widgets/TaskListWidget.swift | 175 ++++++++++++------ ...tentdefinition => Widget.intentdefinition} | 6 +- Habitica.xcodeproj/project.pbxproj | 12 +- 7 files changed, 130 insertions(+), 76 deletions(-) rename Habitica Widgets/{DailiesCount.intentdefinition => Widget.intentdefinition} (99%) diff --git a/HabitRPG/Strings/de.lproj/Mainstrings.strings b/HabitRPG/Strings/de.lproj/Mainstrings.strings index 51b329d3f..48434ebdb 100644 --- a/HabitRPG/Strings/de.lproj/Mainstrings.strings +++ b/HabitRPG/Strings/de.lproj/Mainstrings.strings @@ -457,7 +457,7 @@ /* (No Comment) */ "tasks.reward" = "Belohnung"; /* (No Comment) */ -"tasks.todo" = "To-Do"; +"tasks.todo" = "To Do"; /* (No Comment) */ "theme.blue" = "Blau"; /* (No Comment) */ @@ -539,7 +539,7 @@ "tasks.habits" = "Gewohnheiten"; "tasks.dailies" = "Tägliche Aufgaben"; "tasks.rewards" = "Belohnungen"; -"tasks.todos" = "To-Dos"; +"tasks.todos" = "To Dos"; "tasks.form.accessibility.enable" = "Aktiviere %@"; "tasks.form.accessibility.disable" = "Deaktiviere %@"; "tasks.work" = "Arbeit"; diff --git a/HabitRPG/Utilities/SceneDelegate.swift b/HabitRPG/Utilities/SceneDelegate.swift index 590d6943d..4d692b222 100644 --- a/HabitRPG/Utilities/SceneDelegate.swift +++ b/HabitRPG/Utilities/SceneDelegate.swift @@ -114,7 +114,8 @@ class SceneDelegate: NSObject, UIWindowSceneDelegate { WidgetCenter.shared.reloadTimelines(ofKind: "DailiesCountWidget") WidgetCenter.shared.reloadTimelines(ofKind: "StatsWidget") WidgetCenter.shared.reloadTimelines(ofKind: "TaskListWidget") - + WidgetCenter.shared.reloadTimelines(ofKind: "TodoTaskListWidget") + WidgetCenter.shared.getCurrentConfigurations { result in switch result { case let .success(info): diff --git a/Habitica Widgets/HabiticaWidgets.swift b/Habitica Widgets/HabiticaWidgets.swift index c3f803656..12aa4b6c4 100644 --- a/Habitica Widgets/HabiticaWidgets.swift +++ b/Habitica Widgets/HabiticaWidgets.swift @@ -14,7 +14,8 @@ struct HabiticaWidgets: WidgetBundle { @WidgetBundleBuilder var body: some Widget { DailiesCountWidget() - TaskListWidget() + DailyTaskListWidget() + TodoTaskListWidget() AddTaskWidgetSingle() AddTaskWidget() StatsWidget() diff --git a/Habitica Widgets/RemainingDailiesWidget.swift b/Habitica Widgets/RemainingDailiesWidget.swift index 016dc8695..88e3c2f91 100644 --- a/Habitica Widgets/RemainingDailiesWidget.swift +++ b/Habitica Widgets/RemainingDailiesWidget.swift @@ -13,7 +13,6 @@ import Habitica_Models import ReactiveSwift struct DailiesCountProvider: IntentTimelineProvider { - func placeholder(in context: Context) -> DailiesCountWidgetEntry { DailiesCountWidgetEntry(date: Date(), widgetFamily: context.family, totalCount: 42, completedCount: 10) @@ -60,7 +59,7 @@ struct DailiesCountWidgetEntry: TimelineEntry { var needsCron = false } -struct DailiesCountWidgetView : View { +struct DailiesCountWidgetView: View { var entry: DailiesCountProvider.Entry private var isLockscreenWidget: Bool { diff --git a/Habitica Widgets/TaskListWidget.swift b/Habitica Widgets/TaskListWidget.swift index 4b2736a1a..165f8cf5c 100644 --- a/Habitica Widgets/TaskListWidget.swift +++ b/Habitica Widgets/TaskListWidget.swift @@ -12,20 +12,26 @@ import Habitica_Models import UIKit struct TaskListProvider: TimelineProvider { + let taskType: TaskType + + init(taskType: TaskType) { + self.taskType = taskType + } + func placeholder(in context: Context) -> TaskListEntry { - TaskListEntry(widgetFamily: context.family) + TaskListEntry(widgetFamily: context.family, taskType: taskType) } func getSnapshot(in context: Context, completion: @escaping (TaskListEntry) -> Void) { - let entry = TaskListEntry(widgetFamily: context.family) + let entry = TaskListEntry(widgetFamily: context.family, taskType: taskType) completion(entry) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { var entries: [TaskListEntry] = [] - TaskManager.shared.getUser().zip(with: TaskManager.shared.getTasks(predicate: NSPredicate(format: "completed == false && type == 'daily' && isDue == true"))) + TaskManager.shared.getUser().zip(with: TaskManager.shared.getTasks(predicate: NSPredicate(format: taskType == .daily ? "completed == false && type == 'daily' && isDue == true": "completed == false && type == 'todo'"))) .on(value: { (user, tasks) in - let entry = TaskListEntry(widgetFamily: context.family, tasks: tasks.value, needsCron: user.needsCron) + let entry = TaskListEntry(widgetFamily: context.family, taskType: taskType, tasks: tasks.value, needsCron: user.needsCron) entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) @@ -37,108 +43,110 @@ struct TaskListProvider: TimelineProvider { struct TaskListEntry: TimelineEntry { var date: Date = Date() var widgetFamily: WidgetFamily + var taskType: TaskType var tasks: [TaskProtocol] = [] var needsCron = false } struct TaskListWidgetView: View { - var entry: TaskListProvider.Entry + var entry: TaskListEntry var body: some View { GeometryReader { geometry in - let maxCount = min(8, (Int(geometry.size.height) - (entry.widgetFamily == .systemMedium ? 12 : 60)) / 30) if entry.widgetFamily == .systemMedium { HStack { VStack(alignment: .leading) { - Text("Dailies").font(.system(size: 13, weight: .semibold)).foregroundColor(.widgetTextSecondary).padding(.top, 4) + Text(entry.taskType == .daily ? "Dailies" : "To Do's").font(.system(size: 13, weight: .semibold)).foregroundColor(.widgetTextSecondary).padding(.top, 4) Text("\(entry.tasks.count)").font(Font.system(size: 34)).foregroundColor(Color("taskListSecondaryText")) Spacer() - if let dailyURL = URL(string: "/user/tasks/daily/add") { - Link(destination: dailyURL, label: { + if let addURL = entry.taskType == .daily ? URL(string: "/user/tasks/daily/add") : URL(string: "/user/tasks/todo/add") { + Link(destination: addURL, label: { Image("Add").foregroundColor(Color("taskListSecondaryText")) }).padding(.bottom, 7) } }.frame(width: 60, alignment: .leading) - MainWidgetContent(entry: entry, maxCount: maxCount) + MainWidgetContent(entry: entry) }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading) .widgetBackground(Color.widgetBackground) } else { VStack(alignment: .leading) { HStack(alignment: .center) { - Text("Today's Dailies").font(.system(size: 20, weight: .semibold)).foregroundColor(Color("taskListPrimaryText")) + Text(entry.taskType == .daily ? "Today's Dailies" : "Your To Do's").font(.system(size: 20, weight: .semibold)).foregroundColor(Color("taskListPrimaryText")) Spacer() - if let dailyURL = URL(string: "/user/tasks/daily/add") { - Link(destination: dailyURL, label: { + if let addURL = entry.taskType == .daily ? URL(string: "/user/tasks/daily/add") : URL(string: "/user/tasks/todo/add") { + Link(destination: addURL, label: { Image("Add").foregroundColor(Color("taskListSecondaryText")) }) } }.padding(EdgeInsets(top: 0, leading: 0, bottom: 1, trailing: 0)) - VStack { - MainWidgetContent(entry: entry, maxCount: maxCount) - } - }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading) + MainWidgetContent(entry: entry) + } + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading) .widgetBackground(Color.widgetBackground) } } - .widgetURL(URL(string: "/user/tasks/daily")) + .widgetURL(URL(string: entry.taskType == .daily ? "/user/tasks/daily" : "/user/tasks/todo")) } } struct MainWidgetContent: View { - var entry: TaskListProvider.Entry - var maxCount: Int + var entry: TaskListEntry var body: some View { - if entry.needsCron { + if entry.needsCron && entry.taskType == .daily { StartDayView(showSpacer: false).frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.widgetBackgroundSecondary.opacity(0.1)) .cornerRadius(6) } else if entry.tasks.isEmpty { VStack { Image("Sparkles") - Text("All done today!").foregroundColor(.widgetText).font(.system(size: 13)) + Text(entry.taskType == .daily ? "All done today!" : "All done!").foregroundColor(.widgetText).font(.body) }.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) .background(Color.widgetBackgroundSecondary.opacity(0.1)) .cornerRadius(6) } else { - TaskListView(tasks: entry.tasks, maxCount: maxCount, isLarge: entry.widgetFamily == .systemLarge) - } - if entry.tasks.count < maxCount { - Spacer() + TaskListView(taskType: entry.taskType, tasks: entry.tasks, isLarge: entry.widgetFamily == .systemLarge) } } } struct TaskListView: View { + var taskType: TaskType var tasks: [TaskProtocol] - var maxCount: Int var isLarge: Bool - var remaining: Int { - return tasks.count - maxCount + func heighWithBodyFont() -> CGFloat { + return UIFont.preferredFont(forTextStyle: .body).pointSize } var body: some View { - VStack(alignment: .leading, spacing: 0) { - let last = (min(tasks.count, maxCount))-1 - ForEach((0...last), id: \.self) { index in - let task = tasks[index] - TaskListItem(task: task, showChecklistCount: isLarge).frame(height: 29) - if index != last || (tasks.count > maxCount && isLarge) { - Rectangle().fill(Color.separator.opacity(0.3)).frame(maxWidth: .infinity, minHeight: 1, maxHeight: 1).padding(.leading, 12) + GeometryReader { reader in + let font = Font.body + let maxCount = Int(reader.size.height / (heighWithBodyFont() + 14)) + let remaining = tasks.count - maxCount + 1 + let last = (min(tasks.count, maxCount - (isLarge ? 1 : 0))) - 1 + VStack(alignment: .leading, spacing: 0) { + ForEach((0...last), id: \.self) { index in + let task = tasks[index] + TaskListItem(task: task, showChecklistCount: isLarge, font: font).padding(.vertical, 6) + if index != last || (tasks.count > maxCount && isLarge) { + Rectangle().fill(Color.separator.opacity(0.3)).frame(maxWidth: .infinity, minHeight: 1, maxHeight: 1).padding(.leading, 12) + } } - } - if tasks.count > maxCount && isLarge { - Text(remaining == 1 ? - "1 more unfinished Daily" : - "\(remaining) more unfinished Dailies") - .foregroundColor(.dailiesWidgetPurple) - .font(.system(size: 12)) - .padding(.leading, 12) - .padding(.top, 6) - } - Spacer() + Spacer() + if tasks.count > maxCount && isLarge { + Text(taskType == .daily ? (remaining == 1 ? + "1 more unfinished Daily" : + "\(remaining) more unfinished Dailies") : (remaining == 1 ? + "1 more unfinished To Do" : + "\(remaining) more unfinished To Do's")) + .foregroundColor(.dailiesWidgetPurple) + .font(.caption) + .padding(.leading, 12) + .padding(.top, 6) + } + }.frame(height: reader.size.height) } } } @@ -146,18 +154,19 @@ struct TaskListView: View { struct TaskListItem: View { var task: TaskProtocol var showChecklistCount: Bool + var font: Font var body: some View { HStack { RoundedRectangle(cornerRadius: 2, style: .continuous) .fill(Color(UIColor.forTaskValue(task.value))) .frame(width: 4, height: 18) - Text(task.text ?? "").font(.system(size: 13)).foregroundColor(Color("taskListTaskText")).lineLimit(2) + Text(task.text ?? "").font(font).foregroundColor(Color("taskListTaskText")).lineLimit(2) let completedCount = task.checklist.filter { $0.completed }.count if showChecklistCount && !task.checklist.isEmpty { Spacer() Text("\(completedCount)/\(task.checklist.count)") - .font(.system(size: 11)) + .font(.caption2) .padding(.horizontal, 4) .padding(.vertical, 2) .foregroundColor(completedCount == task.checklist.count ? Color.widgetTextSecondary : Color.white) @@ -168,7 +177,7 @@ struct TaskListItem: View { } } -struct TaskListWidget: Widget { +struct DailyTaskListWidget: Widget { let kind: String = "TaskListWidget" private var families: [WidgetFamily] = { @@ -180,7 +189,7 @@ struct TaskListWidget: Widget { }() var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: TaskListProvider()) { entry in + StaticConfiguration(kind: kind, provider: TaskListProvider(taskType: .daily)) { entry in TaskListWidgetView(entry: entry) } .configurationDisplayName("Your Dailies") @@ -189,33 +198,77 @@ struct TaskListWidget: Widget { } } +struct TodoTaskListWidget: Widget { + let kind: String = "TodoTaskListWidget" + + private var families: [WidgetFamily] = { + var families: [WidgetFamily] = [.systemMedium, .systemLarge] + if #available(iOSApplicationExtension 15.0, *) { + families.append(.systemExtraLarge) + } + return families + }() + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: TaskListProvider(taskType: .todo)) { entry in + TaskListWidgetView(entry: entry) + } + .configurationDisplayName("Your To Do's") + .description("View your Habitica To Do's") + .supportedFamilies(families) + } +} + struct TaskListWidgetPreview: PreviewProvider { static var previews: some View { Group { - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, tasks: makePreviewDailies().dropLast(8), needsCron: true)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .daily, tasks: makePreviewDailies().dropLast(8), needsCron: true)) .previewContext(WidgetPreviewContext(family: .systemMedium)) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, tasks: makePreviewDailies().dropLast(8), needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .daily, tasks: makePreviewDailies().dropLast(8), needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemMedium)) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, tasks: makePreviewDailies(), needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .daily, tasks: makePreviewDailies(), needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemMedium)) .environment(\.colorScheme, .dark) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, tasks: makePreviewDailies(), needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .daily, tasks: makePreviewDailies(), needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemLarge)) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, tasks: [], needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .daily, tasks: [], needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemLarge)) .environment(\.colorScheme, .dark) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, tasks: [], needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .daily, tasks: [], needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemMedium)) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, tasks: [], needsCron: true)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .daily, tasks: [], needsCron: true)) .previewContext(WidgetPreviewContext(family: .systemLarge)) - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, tasks: makePreviewDailies().dropLast(6), needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .daily, tasks: makePreviewDailies().dropLast(6), needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemLarge)) if #available(iOSApplicationExtension 15.0, *) { - TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, tasks: makePreviewDailies().dropLast(6), needsCron: false)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .daily, tasks: makePreviewDailies().dropLast(6), needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemExtraLarge)) + } + } + Group { + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .todo, tasks: makePreviewDailies().dropLast(8), needsCron: true)) + .previewContext(WidgetPreviewContext(family: .systemMedium)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .todo, tasks: makePreviewDailies().dropLast(8), needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemMedium)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .todo, tasks: makePreviewDailies(), needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemMedium)) + .environment(\.colorScheme, .dark) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .todo, tasks: makePreviewDailies(), needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .todo, tasks: [], needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + .environment(\.colorScheme, .dark) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemMedium, taskType: .todo, tasks: [], needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemMedium)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .todo, tasks: [], needsCron: true)) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .todo, tasks: makePreviewDailies().dropLast(6), needsCron: false)) + .previewContext(WidgetPreviewContext(family: .systemLarge)) + if #available(iOSApplicationExtension 15.0, *) { + TaskListWidgetView(entry: TaskListEntry(widgetFamily: .systemLarge, taskType: .todo, tasks: makePreviewDailies().dropLast(6), needsCron: false)) .previewContext(WidgetPreviewContext(family: .systemExtraLarge)) } } - } } diff --git a/Habitica Widgets/DailiesCount.intentdefinition b/Habitica Widgets/Widget.intentdefinition similarity index 99% rename from Habitica Widgets/DailiesCount.intentdefinition rename to Habitica Widgets/Widget.intentdefinition index 0b878bcc5..d139f4c4f 100644 --- a/Habitica Widgets/DailiesCount.intentdefinition +++ b/Habitica Widgets/Widget.intentdefinition @@ -83,11 +83,11 @@ INIntentDefinitionNamespace fLm7kx INIntentDefinitionSystemVersion - 21G115 + 23A344 INIntentDefinitionToolsBuildVersion - 14B47b + 15F31d INIntentDefinitionToolsVersion - 14.1 + 15.4 INIntents diff --git a/Habitica.xcodeproj/project.pbxproj b/Habitica.xcodeproj/project.pbxproj index 799134925..3773ec2c6 100644 --- a/Habitica.xcodeproj/project.pbxproj +++ b/Habitica.xcodeproj/project.pbxproj @@ -378,8 +378,8 @@ 29BEE6D7252E14F000D456F8 /* HabiticaWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6C7252E144F00D456F8 /* HabiticaWidgets.swift */; }; 29BEE6DC252E14F300D456F8 /* RemainingDailiesWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6CD252E14C000D456F8 /* RemainingDailiesWidget.swift */; }; 29BEE6E7252E1B7700D456F8 /* Color-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6E1252E1B3600D456F8 /* Color-Extensions.swift */; }; - 29BEE6ED252E27B800D456F8 /* DailiesCount.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6EC252E27B800D456F8 /* DailiesCount.intentdefinition */; }; - 29BEE73F252E2CC300D456F8 /* DailiesCount.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6EC252E27B800D456F8 /* DailiesCount.intentdefinition */; }; + 29BEE6ED252E27B800D456F8 /* Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6EC252E27B800D456F8 /* Widget.intentdefinition */; }; + 29BEE73F252E2CC300D456F8 /* Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE6EC252E27B800D456F8 /* Widget.intentdefinition */; }; 29BEE755252E321F00D456F8 /* AvatarWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE754252E321F00D456F8 /* AvatarWidget.swift */; }; 29BEE75A252E33AB00D456F8 /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FEB277202B491600EA245A /* Avatar.swift */; }; 29BEE760252E367600D456F8 /* URLImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BEE75F252E367600D456F8 /* URLImage.swift */; }; @@ -1047,7 +1047,7 @@ 29BEE6C7252E144F00D456F8 /* HabiticaWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HabiticaWidgets.swift; sourceTree = ""; }; 29BEE6CD252E14C000D456F8 /* RemainingDailiesWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemainingDailiesWidget.swift; sourceTree = ""; }; 29BEE6E1252E1B3600D456F8 /* Color-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color-Extensions.swift"; sourceTree = ""; }; - 29BEE6EC252E27B800D456F8 /* DailiesCount.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = DailiesCount.intentdefinition; sourceTree = ""; }; + 29BEE6EC252E27B800D456F8 /* Widget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Widget.intentdefinition; sourceTree = ""; }; 29BEE754252E321F00D456F8 /* AvatarWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarWidget.swift; sourceTree = ""; }; 29BEE75F252E367600D456F8 /* URLImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLImage.swift; sourceTree = ""; }; 29BEE7B4252EE92D00D456F8 /* AddTaskWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddTaskWidget.swift; sourceTree = ""; }; @@ -1861,7 +1861,7 @@ 29BEE6CD252E14C000D456F8 /* RemainingDailiesWidget.swift */, 29BEE6E1252E1B3600D456F8 /* Color-Extensions.swift */, 29BEE631252CCFE100D456F8 /* StatsWidget.swift */, - 29BEE6EC252E27B800D456F8 /* DailiesCount.intentdefinition */, + 29BEE6EC252E27B800D456F8 /* Widget.intentdefinition */, 29BEE754252E321F00D456F8 /* AvatarWidget.swift */, 29BEE75F252E367600D456F8 /* URLImage.swift */, 29BEE7B4252EE92D00D456F8 /* AddTaskWidget.swift */, @@ -3269,7 +3269,7 @@ files = ( 29BEE64D252DD3F400D456F8 /* TaskManager.swift in Sources */, 29A9858125472D1700F04665 /* HabiticaAnalytics.swift in Sources */, - 29BEE6ED252E27B800D456F8 /* DailiesCount.intentdefinition in Sources */, + 29BEE6ED252E27B800D456F8 /* Widget.intentdefinition in Sources */, 29BEE755252E321F00D456F8 /* AvatarWidget.swift in Sources */, 2995F7FC25BAF3B600322CB3 /* RemoteLogger.swift in Sources */, 29BEE632252CCFE100D456F8 /* StatsWidget.swift in Sources */, @@ -3634,7 +3634,7 @@ 29C1360824EE917F00DBC6B3 /* UITableView-Extensions.swift in Sources */, 29D50B7B25F9037A0009CF55 /* AppDelegate-Notifications.swift in Sources */, 2927025724E3EEDE00BCAA77 /* ReportBugViewController.swift in Sources */, - 29BEE73F252E2CC300D456F8 /* DailiesCount.intentdefinition in Sources */, + 29BEE73F252E2CC300D456F8 /* Widget.intentdefinition in Sources */, 49EE3FD8201908AB00CD7608 /* ChallengeButtonStyleProvider.swift in Sources */, D9CE90491E4DCF7D00702578 /* SubscriptionDetailView.swift in Sources */, 291666432BCFD5E70068FCBF /* AvatarShopItemView.swift in Sources */,