Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/fastlane-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
xcode-version: latest-stable
- uses: actions/checkout@v4
- name: Use sample configuration
run: cp BeeSwift/Config.swift.sample BeeKit/Config.swift
run: cp BeeKit/Config.swift.sample BeeKit/Config.swift
- name: Setup ruby and install gems
uses: ruby/setup-ruby@v1
with:
Expand Down
File renamed without changes.
24 changes: 12 additions & 12 deletions BeeSwift/DataPoint.swift → BeeKit/DataPoint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
import Foundation
import SwiftyJSON

protocol DataPoint {
public protocol DataPoint {
var requestid: String { get }
var daystamp: String { get }
var value: NSNumber { get }
var comment: String { get }
}

/// A data point received from the server. This will have had an ID allocated
struct ExistingDataPoint : DataPoint {
let id: String
let requestid: String
let daystamp: String
let value: NSNumber
let comment: String
public struct ExistingDataPoint : DataPoint {
public let id: String
public let requestid: String
public let daystamp: String
public let value: NSNumber
public let comment: String

init(json: JSON) {
// To maximize compatibility with server changes we only parse fields
Expand All @@ -34,9 +34,9 @@ struct ExistingDataPoint : DataPoint {
}

/// A data point we have created locally (e.g. from user input, or HealthKit)
struct NewDataPoint : DataPoint {
let requestid: String
let daystamp: String
let value: NSNumber
let comment: String
public struct NewDataPoint : DataPoint {
public let requestid: String
public let daystamp: String
public let value: NSNumber
public let comment: String
}
File renamed without changes.
102 changes: 51 additions & 51 deletions BeeSwift/Goal.swift → BeeKit/Goal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,52 +13,52 @@ import OSLog
import UserNotifications
import UIKit

class Goal {
public class Goal {
private let logger = Logger(subsystem: "com.beeminder.beeminder", category: "Goal")

// Ignore automatic datapoint updates where the difference is a smaller fraction than this. This
// prevents effectively no-op updates due to float rounding
private let datapointValueEpsilon = 0.00000001

var autodata: String = ""
var delta_text: String = ""
var graph_url: String?
var healthKitMetric: String?
var id: String = ""
var lane: NSNumber?
var losedate: NSNumber = 0
var pledge: NSNumber = 0
var rate: NSNumber?
var runits: String = ""
var yaxis: String = ""
var slug: String = ""
var thumb_url: String?
var title: String = ""
var won: NSNumber = 0
var yaw: NSNumber = 0
var dir: NSNumber = 0
var safebump: NSNumber?
var safebuf: NSNumber?
var curval: NSNumber?
var limsum: String?
var safesum: String?
var initday: NSNumber?
var deadline: NSNumber = 0
var leadtime: NSNumber?
var alertstart: NSNumber?
var lasttouch: NSNumber?
var use_defaults: NSNumber?
var queued: Bool?
var todayta: Bool = false
var hhmmformat: Bool = false
var recent_data: [ExistingDataPoint]?
public var autodata: String = ""
public var delta_text: String = ""
public var graph_url: String?
public var healthKitMetric: String?
public var id: String = ""
public var lane: NSNumber?
public var losedate: NSNumber = 0
public var pledge: NSNumber = 0
public var rate: NSNumber?
public var runits: String = ""
public var yaxis: String = ""
public var slug: String = ""
public var thumb_url: String?
public var title: String = ""
public var won: NSNumber = 0
public var yaw: NSNumber = 0
public var dir: NSNumber = 0
public var safebump: NSNumber?
public var safebuf: NSNumber?
public var curval: NSNumber?
public var limsum: String?
public var safesum: String?
public var initday: NSNumber?
public var deadline: NSNumber = 0
public var leadtime: NSNumber?
public var alertstart: NSNumber?
public var lasttouch: NSNumber?
public var use_defaults: NSNumber?
public var queued: Bool?
public var todayta: Bool = false
public var hhmmformat: Bool = false
public var recent_data: [ExistingDataPoint]?

// These are obtained from mathishard
var derived_goaldate: NSNumber = 0
var derived_goalval: NSNumber = 0
var derived_rate: NSNumber = 0
public var derived_goaldate: NSNumber = 0
public var derived_goalval: NSNumber = 0
public var derived_rate: NSNumber = 0

init(json: JSON) {
public init(json: JSON) {
self.id = json["id"].string!
self.updateToMatch(json: json)
}
Expand Down Expand Up @@ -182,7 +182,7 @@ class Goal {
}
}

var countdownColor :UIColor {
public var countdownColor :UIColor {
guard let buf = self.safebuf?.intValue else { return UIColor.beeminder.gray }
if buf < 1 {
return UIColor.beeminder.red
Expand All @@ -196,11 +196,11 @@ class Goal {
return UIColor.beeminder.green
}

var relativeLane : NSNumber {
public var relativeLane : NSNumber {
return self.lane != nil ? NSNumber(value: self.lane!.int32Value * self.yaw.int32Value as Int32) : 0
}

var countdownHelperText :String {
public var countdownHelperText :String {
if self.delta_text.components(separatedBy: "✔").count == 4 {
if self.safebump != nil && self.curval != nil {
if (self.safebump!.doubleValue - self.curval!.doubleValue <= 0) {
Expand All @@ -214,7 +214,7 @@ class Goal {
return "due in"
}

var humanizedRunits :String {
public var humanizedRunits :String {
if self.runits == "d" {
return "day"
}
Expand All @@ -231,12 +231,12 @@ class Goal {
return "week"
}

func capitalSafesum() -> String {
public func capitalSafesum() -> String {
guard let safe = self.safesum else { return "" }
return safe.prefix(1).uppercased() + safe.dropFirst(1)
}

var humanizedAutodata: String? {
public var humanizedAutodata: String? {
if self.autodata == "ifttt" { return "IFTTT" }
if self.autodata == "api" { return "API" }
if self.autodata == "apple" {
Expand All @@ -249,7 +249,7 @@ class Goal {
return nil
}

var attributedDeltaText :NSAttributedString {
public var attributedDeltaText :NSAttributedString {
if self.delta_text.count == 0 { return NSAttributedString.init(string: "") }
let modelName = UIDevice.current.modelName
if modelName.contains("iPhone 5") || modelName.contains("iPad Mini") || modelName.contains("iPad 4") {
Expand Down Expand Up @@ -291,29 +291,29 @@ class Goal {
return attString
}

var deltaColors: [UIColor] {
public var deltaColors: [UIColor] {
// yaw (number): Good side of the road (+1/-1 = above/below)

return self.yaw == 1 ? deltaColorsWhenAboveIsGoodSide : deltaColorsWhenBelowIsGoodSide
}

var deltaColorsWhenBelowIsGoodSide: [UIColor] {
public var deltaColorsWhenBelowIsGoodSide: [UIColor] {
return [UIColor.beeminder.green, UIColor.beeminder.blue, UIColor.beeminder.orange]
}

var deltaColorsWhenAboveIsGoodSide: [UIColor] {
public var deltaColorsWhenAboveIsGoodSide: [UIColor] {
return deltaColorsWhenBelowIsGoodSide.reversed()
}

func hideDataEntry() -> Bool {
public func hideDataEntry() -> Bool {
return self.isDataProvidedAutomatically || self.won.boolValue
}

var isDataProvidedAutomatically: Bool {
public var isDataProvidedAutomatically: Bool {
return !self.autodata.isEmpty
}

var isLinkedToHealthKit: Bool {
public var isLinkedToHealthKit: Bool {
return self.autodata == "apple"
}

Expand Down Expand Up @@ -512,7 +512,7 @@ class Goal {
}
}

extension Goal {
public extension Goal {
var cacheBustingThumbUrl: String {
let thumbUrlStr = self.thumb_url!
return cacheBuster(thumbUrlStr)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import Foundation
import HealthKit


class HealthKitConfig : NSObject {
static let shared = HealthKitConfig()
let metrics : [HealthKitMetric] = {
public class HealthKitConfig : NSObject {
public static let shared = HealthKitConfig()

public let metrics : [HealthKitMetric] = {
var allMetrics : [HealthKitMetric] = [
// Activity
QuantityHealthKitMetric.init(humanText: "Active energy", databaseString: "activeEnergy", category: .Activity, hkQuantityTypeIdentifier: .activeEnergyBurned),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import Foundation
import HealthKit

enum HealthKitCategory : String, CaseIterable {
public enum HealthKitCategory : String, CaseIterable {
case Activity = "Activity"
case BodyMeasurements = "Body Measurements"
case Heart = "Heart"
Expand All @@ -16,7 +16,7 @@ enum HealthKitCategory : String, CaseIterable {
case Other = "Other Data"
}

protocol HealthKitMetric {
public protocol HealthKitMetric {
var humanText : String { get }
var databaseString : String { get }
var category : HealthKitCategory { get }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import Foundation
import KeychainSwift
import SwiftyJSON

class CurrentUserManager {
static let signedInNotificationName = "com.beeminder.signedInNotification"
static let willSignOutNotificationName = "com.beeminder.willSignOutNotification"
static let failedSignInNotificationName = "com.beeminder.failedSignInNotification"
static let signedOutNotificationName = "com.beeminder.signedOutNotification"
static let resetNotificationName = "com.beeminder.resetNotification"
static let willResetNotificationName = "com.beeminder.willResetNotification"
static let healthKitMetricRemovedNotificationName = "com.beeminder.healthKitMetricRemovedNotification"
public class CurrentUserManager {
public static let signedInNotificationName = "com.beeminder.signedInNotification"
public static let willSignOutNotificationName = "com.beeminder.willSignOutNotification"
public static let failedSignInNotificationName = "com.beeminder.failedSignInNotification"
public static let signedOutNotificationName = "com.beeminder.signedOutNotification"
public static let resetNotificationName = "com.beeminder.resetNotification"
public static let willResetNotificationName = "com.beeminder.willResetNotification"
public static let healthKitMetricRemovedNotificationName = "com.beeminder.healthKitMetricRemovedNotification"

fileprivate let beemiosSecret = "C0QBFPWqDykIgE6RyQ2OJJDxGxGXuVA2CNqcJM185oOOl4EQTjmpiKgcwjki"

internal static let accessTokenKey = "access_token"
Expand Down Expand Up @@ -90,52 +90,52 @@ class CurrentUserManager {
}


var accessToken :String? {
public var accessToken :String? {
return keychain.get(CurrentUserManager.accessTokenKey)
}

var username :String? {
public var username :String? {
return userDefaults.object(forKey: CurrentUserManager.usernameKey) as! String?
}

var signingUp : Bool = false
public var signingUp : Bool = false

func defaultLeadTime() -> NSNumber {
public func defaultLeadTime() -> NSNumber {
return (userDefaults.object(forKey: CurrentUserManager.defaultLeadtimeKey) ?? 0) as! NSNumber
}

func setDefaultLeadTime(_ leadtime : NSNumber) {
public func setDefaultLeadTime(_ leadtime : NSNumber) {
self.set(leadtime, forKey: CurrentUserManager.defaultLeadtimeKey) }

func defaultAlertstart() -> NSNumber {
public func defaultAlertstart() -> NSNumber {
return (userDefaults.object(forKey: CurrentUserManager.defaultAlertstartKey) ?? 0) as! NSNumber
}

func setDefaultAlertstart(_ alertstart : NSNumber) {
public func setDefaultAlertstart(_ alertstart : NSNumber) {
self.set(alertstart, forKey: CurrentUserManager.defaultAlertstartKey)
}

func defaultDeadline() -> NSNumber {
public func defaultDeadline() -> NSNumber {
return (userDefaults.object(forKey: CurrentUserManager.defaultDeadlineKey) ?? 0) as! NSNumber
}

func setDefaultDeadline(_ deadline : NSNumber) {
public func setDefaultDeadline(_ deadline : NSNumber) {
self.set(deadline, forKey: CurrentUserManager.defaultDeadlineKey)
}

func signedIn() -> Bool {
public func signedIn() -> Bool {
return self.accessToken != nil && self.username != nil
}

func isDeadbeat() -> Bool {
public func isDeadbeat() -> Bool {
return userDefaults.object(forKey: CurrentUserManager.deadbeatKey) != nil
}

func timezone() -> String {
public func timezone() -> String {
return userDefaults.object(forKey: CurrentUserManager.beemTZKey) as? String ?? "Unknown"
}

func setDeadbeat(_ deadbeat: Bool) {
public func setDeadbeat(_ deadbeat: Bool) {
if deadbeat {
self.set(true, forKey: CurrentUserManager.deadbeatKey)
} else {
Expand All @@ -147,7 +147,7 @@ class CurrentUserManager {
keychain.set(accessToken, forKey: CurrentUserManager.accessTokenKey, withAccess: .accessibleAfterFirstUnlock)
}

func signInWithEmail(_ email: String, password: String) async {
public func signInWithEmail(_ email: String, password: String) async {
do {
let response = try await requestManager.post(url: "api/private/sign_in", parameters: ["user": ["login": email, "password": password], "beemios_secret": self.beemiosSecret] as Dictionary<String, Any>)
await self.handleSuccessfulSignin(JSON(response!))
Expand All @@ -171,7 +171,7 @@ class CurrentUserManager {
}.value
}

func syncNotificationDefaults() async throws {
public func syncNotificationDefaults() async throws {
let response = try await requestManager.get(url: "api/v1/users/\(username!).json", parameters: [:])
let responseJSON = JSON(response!)
self.set(responseJSON["default_alertstart"].number!, forKey: "default_alertstart")
Expand All @@ -187,7 +187,7 @@ class CurrentUserManager {
await self.signOut()
}

func signOut() async {
public func signOut() async {

await Task { @MainActor in
NotificationCenter.default.post(name: Notification.Name(rawValue: CurrentUserManager.willSignOutNotificationName), object: self)
Expand Down
Loading