create app group to share database

fix widget layouts / calls
i think widgets work
This commit is contained in:
Trey t
2022-01-26 17:11:41 -06:00
parent 3739bc1aa1
commit 70f29199bb
6 changed files with 93 additions and 94 deletions

View File

@@ -12,5 +12,9 @@
<array> <array>
<string>CloudKit</string> <string>CloudKit</string>
</array> </array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oak.ifeel</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -12,5 +12,9 @@
<array> <array>
<string>CloudKit</string> <string>CloudKit</string>
</array> </array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oak.ifeel</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -26,49 +26,29 @@ class WatchTimelineView: Identifiable {
} }
struct TimeLineCreator { struct TimeLineCreator {
public func getLastTen() -> [MoodEntry] { static func createViews(daysBack: Int) -> [WatchTimelineView] {
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())! var timeLineView = [WatchTimelineView]()
var tenDaysAgo = Calendar.current.date(byAdding: .day, value: -10, to: dateAtEnd)!
tenDaysAgo = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: tenDaysAgo)!
let moodEntry = PersistenceController.shared.getData(startDate: tenDaysAgo, endDate: dateAtEnd, includedDays: [1,2,3,4,5,6,7])
return moodEntry for day in 0..<daysBack{
} let day = Calendar.current.date(byAdding: .day, value: -day, to: Date())!
func createTimeLineViewsfrom(entries: [MoodEntry]) -> [WatchTimelineView] { let dayStart = Calendar.current.startOfDay(for: day)
var returnViews = [WatchTimelineView]() let dayEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: dayStart)!
for pastDays in 0...10 { if let todayEntry = PersistenceController.shared.getData(startDate: dayStart, endDate: dayEnd, includedDays: []).first {
let pastDate = Calendar.current.date(byAdding: .day, value: -pastDays, to: Date())! timeLineView.append(WatchTimelineView(image: todayEntry.mood.icon,
date: dayStart,
if let item = entries.filter({ entry in color: todayEntry.mood.color,
let components = Calendar.current.dateComponents([.day, .month, .year], from: pastDate) graphic: todayEntry.mood.graphic))
let day = components.day
let month = components.month
let year = components.year
let entryComponents = Calendar.current.dateComponents([.day, .month, .year], from: entry.forDate!)
let entryDay = entryComponents.day
let entryMonth = entryComponents.month
let entryYear = entryComponents.year
return day == entryDay && month == entryMonth && year == entryYear
}).first {
let timeLineView = WatchTimelineView(image: item.mood.icon,
date: pastDate,
color: item.mood == Mood.missing ? Color(UIColor.label) : item.mood.color,
graphic: item.mood.graphic)
returnViews.append(timeLineView)
} else { } else {
let timeLineView = WatchTimelineView(image: Mood.missing.icon, timeLineView.append(WatchTimelineView(image: Mood.missing.icon,
date: pastDate, date: dayStart,
color: Color(UIColor.label), color: Mood.missing.color,
graphic: Mood.missing.graphic) graphic: Mood.missing.graphic))
returnViews.append(timeLineView)
} }
} }
returnViews = returnViews.sorted(by: { $0.date > $1.date }) timeLineView = timeLineView.sorted(by: { $0.date > $1.date })
return returnViews return timeLineView
} }
} }
@@ -80,41 +60,29 @@ struct Provider: IntentTimelineProvider {
gets redacted auto gets redacted auto
*/ */
func placeholder(in context: Context) -> SimpleEntry { func placeholder(in context: Context) -> SimpleEntry {
var sampleViews = [WatchTimelineView]() return SimpleEntry(date: Date(),
for pastDay in 0...10 { configuration: ConfigurationIntent(),
let pastDate = Calendar.current.date(byAdding: .day, value: -pastDay, to: Date())! timeLineViews: TimeLineCreator.createViews(daysBack: 10))
let mood = Mood.allValues.randomElement()!
sampleViews.append(WatchTimelineView(image: mood.icon, date: pastDate, color: mood.color, graphic: mood.graphic))
}
return SimpleEntry(date: Date(), configuration: ConfigurationIntent(), timeLineViews: sampleViews)
} }
func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
var timeLineViews = [WatchTimelineView]() let entry = SimpleEntry(date: Date(),
let lastTenEntries = timeLineCreator.getLastTen() configuration: ConfigurationIntent(),
timeLineViews: TimeLineCreator.createViews(daysBack: 10))
if context.isPreview {
for pastDay in 0...10 {
let pastDate = Calendar.current.date(byAdding: .day, value: -pastDay, to: Date())!
let mood = Mood.allValues.randomElement()!
timeLineViews.append( WatchTimelineView(image: mood.icon, date: pastDate, color: mood.color, graphic: mood.graphic))
}
} else {
timeLineViews = timeLineCreator.createTimeLineViewsfrom(entries: lastTenEntries)
}
let entry = SimpleEntry(date: Date(), configuration: configuration, timeLineViews: timeLineViews)
completion(entry) completion(entry)
} }
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let lastTenEntries = timeLineCreator.getLastTen() let entry = SimpleEntry(date: Calendar.current.date(byAdding: .second, value: 15, to: Date())!,
let views = timeLineCreator.createTimeLineViewsfrom(entries: lastTenEntries) configuration: ConfigurationIntent(),
timeLineViews: nil)
let entry = SimpleEntry(date: Date(), configuration: configuration, timeLineViews: views) let midNightEntry = SimpleEntry(date: Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())!,
configuration: ConfigurationIntent(),
timeLineViews: nil)
// TODO: make this update time make more sense let date = Calendar.current.date(byAdding: .second, value: 10, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(Random.tomorrowMidnightThirty)) let timeline = Timeline(entries: [entry, midNightEntry], policy: .after(date))
completion(timeline) completion(timeline)
} }
} }
@@ -122,16 +90,17 @@ struct Provider: IntentTimelineProvider {
struct SimpleEntry: TimelineEntry { struct SimpleEntry: TimelineEntry {
let date: Date let date: Date
let configuration: ConfigurationIntent let configuration: ConfigurationIntent
let timeLineViews: [WatchTimelineView] let timeLineViews: [WatchTimelineView]?
let showStats: Bool let showStats: Bool
init(date: Date, configuration: ConfigurationIntent, timeLineViews: [WatchTimelineView], showStats: Bool = false) { init(date: Date, configuration: ConfigurationIntent, timeLineViews: [WatchTimelineView]?, showStats: Bool = false) {
self.date = date self.date = date
self.configuration = configuration self.configuration = configuration
self.timeLineViews = timeLineViews self.timeLineViews = timeLineViews
self.showStats = showStats self.showStats = showStats
} }
} }
/**********************************************************/ /**********************************************************/
struct FeelsWidgetEntryView : View { struct FeelsWidgetEntryView : View {
@Environment(\.sizeCategory) var sizeCategory @Environment(\.sizeCategory) var sizeCategory
@@ -164,12 +133,18 @@ struct FeelsWidgetEntryView : View {
struct SmallWidgetView: View { struct SmallWidgetView: View {
var entry: Provider.Entry var entry: Provider.Entry
var timeLineView = [WatchTimelineView]()
init(entry: Provider.Entry) {
self.entry = entry
timeLineView = TimeLineCreator.createViews(daysBack: 1)
}
var body: some View { var body: some View {
ZStack { ZStack {
Color(UIColor.secondarySystemBackground) Color(UIColor.secondarySystemBackground)
HStack { HStack {
ForEach([entry.timeLineViews.first!]) { watchView in ForEach(self.timeLineView) { watchView in
EntryCard(timeLineView: watchView) EntryCard(timeLineView: watchView)
} }
} }
@@ -183,20 +158,22 @@ struct SmallWidgetView: View {
struct MediumWidgetView: View { struct MediumWidgetView: View {
var entry: Provider.Entry var entry: Provider.Entry
var timeLineView = [WatchTimelineView]()
var firstGroup: [WatchTimelineView] { init(entry: Provider.Entry) {
Array(self.entry.timeLineViews.prefix(5)) self.entry = entry
timeLineView = TimeLineCreator.createViews(daysBack: 5)
} }
var body: some View { var body: some View {
VStack { VStack {
Spacer() Spacer()
TimeHeaderView(startDate: firstGroup.first!.date, endDate: firstGroup.last!.date) TimeHeaderView(startDate: timeLineView.first!.date, endDate: timeLineView.last!.date)
.frame(minWidth: 0, maxWidth: .infinity) .frame(minWidth: 0, maxWidth: .infinity)
.multilineTextAlignment(.leading) .multilineTextAlignment(.leading)
TimeBodyView(group: firstGroup) TimeBodyView(group: timeLineView)
.clipShape(RoundedRectangle(cornerRadius: 25, style: .continuous)) .clipShape(RoundedRectangle(cornerRadius: 25, style: .continuous))
.frame(minHeight: 0, maxHeight: 55) .frame(minHeight: 0, maxHeight: 55)
.padding() .padding()
@@ -224,10 +201,16 @@ struct FeelsGraphicWidgetEntryView : View {
struct SmallGraphicWidgetView: View { struct SmallGraphicWidgetView: View {
var entry: Provider.Entry var entry: Provider.Entry
var timeLineView = [WatchTimelineView]()
init(entry: Provider.Entry) {
self.entry = entry
timeLineView = TimeLineCreator.createViews(daysBack: 1)
}
var body: some View { var body: some View {
GeometryReader { geo in GeometryReader { geo in
entry.timeLineViews.first!.graphic timeLineView.first!.graphic
.resizable() .resizable()
.scaledToFit() .scaledToFit()
} }
@@ -397,26 +380,19 @@ struct FeelsGraphicWidget: Widget {
} }
struct FeelsWidget_Previews: PreviewProvider { struct FeelsWidget_Previews: PreviewProvider {
static var data: [WatchTimelineView] {
var data = PersistenceController.shared.randomEntries(count: 10)
data.remove(at: 2)
let views = TimeLineCreator().createTimeLineViewsfrom(entries: data)
return views
}
static var previews: some View { static var previews: some View {
Group { Group {
FeelsWidgetEntryView(entry: SimpleEntry(date: Date(), // FeelsWidgetEntryView(entry: SimpleEntry(date: Date(),
configuration: ConfigurationIntent(), // configuration: ConfigurationIntent(),
timeLineViews: FeelsWidget_Previews.data)) // timeLineViews: FeelsWidget_Previews.data))
.previewContext(WidgetPreviewContext(family: .systemSmall)) // .previewContext(WidgetPreviewContext(family: .systemSmall))
.environment(\.sizeCategory, .small) // .environment(\.sizeCategory, .small)
//
FeelsWidgetEntryView(entry: SimpleEntry(date: Date(), // FeelsWidgetEntryView(entry: SimpleEntry(date: Date(),
configuration: ConfigurationIntent(), // configuration: ConfigurationIntent(),
timeLineViews: FeelsWidget_Previews.data)) // timeLineViews: FeelsWidget_Previews.data))
.previewContext(WidgetPreviewContext(family: .systemMedium)) // .previewContext(WidgetPreviewContext(family: .systemMedium))
.environment(\.sizeCategory, .medium) // .environment(\.sizeCategory, .medium)
// //
// FeelsWidgetEntryView(entry: SimpleEntry(date: Date(), // FeelsWidgetEntryView(entry: SimpleEntry(date: Date(),
// configuration: ConfigurationIntent(), // configuration: ConfigurationIntent(),

View File

@@ -12,5 +12,7 @@
<array> <array>
<string>CloudKit</string> <string>CloudKit</string>
</array> </array>
<key>com.apple.security.application-groups</key>
<array/>
</dict> </dict>
</plist> </plist>

View File

@@ -12,5 +12,9 @@
<array> <array>
<string>CloudKit</string> <string>CloudKit</string>
</array> </array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.88oak.ifeel</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -195,7 +195,7 @@ class PersistenceController {
if useCloudKit { if useCloudKit {
container = NSPersistentCloudKitContainer(name: "Feels") container = NSPersistentCloudKitContainer(name: "Feels")
} else { } else {
container = NSPersistentContainer(name: "Feels") container = NSCustomPersistentContainer(name: "Feels")
} }
for description in container.persistentStoreDescriptions { for description in container.persistentStoreDescriptions {
@@ -274,3 +274,12 @@ extension NSManagedObjectContext {
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self]) NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
} }
} }
class NSCustomPersistentContainer: NSPersistentContainer {
override open class func defaultDirectoryURL() -> URL {
var storeURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.88oak.ifeel")
storeURL = storeURL?.appendingPathComponent("Feels.sqlite")
return storeURL!
}
}