LiveActivityAttributes+Helper.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import Foundation
  2. extension LiveActivityAttributes.ContentState {
  3. static func formatGlucose(_ value: Int, mmol: Bool, forceSign: Bool) -> String {
  4. let formatter = NumberFormatter()
  5. formatter.numberStyle = .decimal
  6. formatter.maximumFractionDigits = 0
  7. if mmol {
  8. formatter.minimumFractionDigits = 1
  9. formatter.maximumFractionDigits = 1
  10. }
  11. if forceSign {
  12. formatter.positivePrefix = formatter.plusSign
  13. }
  14. formatter.roundingMode = .halfUp
  15. return formatter
  16. .string(from: mmol ? value.asMmolL as NSNumber : NSNumber(value: value))!
  17. }
  18. static func calculateChange(chart: [GlucoseData]) -> String {
  19. guard chart.count > 2 else { return "" }
  20. let lastGlucose = chart.first?.glucose ?? 0
  21. let secondLastGlucose = chart.dropFirst().first?.glucose ?? 0
  22. let delta = lastGlucose - secondLastGlucose
  23. let deltaAsDecimal = Decimal(delta)
  24. let formatter = NumberFormatter()
  25. formatter.numberStyle = .decimal
  26. formatter.maximumFractionDigits = 1
  27. formatter.positivePrefix = " +"
  28. formatter.negativePrefix = " -"
  29. return formatter.string(from: deltaAsDecimal as NSNumber) ?? "--"
  30. }
  31. init?(
  32. new bg: GlucoseData,
  33. prev _: GlucoseData?,
  34. mmol: Bool,
  35. chart: [GlucoseData],
  36. settings: FreeAPSSettings,
  37. determination: DeterminationData?,
  38. override: OverrideData?
  39. ) {
  40. let glucose = bg.glucose
  41. let formattedBG = Self.formatGlucose(Int(glucose), mmol: mmol, forceSign: false)
  42. var rotationDegrees: Double = 0.0
  43. switch bg.direction {
  44. case .doubleUp,
  45. .singleUp,
  46. .tripleUp:
  47. rotationDegrees = -90
  48. case .fortyFiveUp:
  49. rotationDegrees = -45
  50. case .flat:
  51. rotationDegrees = 0
  52. case .fortyFiveDown:
  53. rotationDegrees = 45
  54. case .doubleDown,
  55. .singleDown,
  56. .tripleDown:
  57. rotationDegrees = 90
  58. case nil,
  59. .notComputable,
  60. .rateOutOfRange:
  61. rotationDegrees = 0
  62. default:
  63. rotationDegrees = 0
  64. }
  65. let trendString = bg.direction?.symbol as? String
  66. let change = Self.calculateChange(chart: chart)
  67. let chartBG = chart.map(\.glucose)
  68. let conversionFactor: Double = settings.units == .mmolL ? 18.0 : 1.0
  69. let convertedChartBG = chartBG.map { Double($0) / conversionFactor }
  70. let chartDate = chart.map(\.date)
  71. /// glucose limits from UI settings, not from notifications settings
  72. let highGlucose = settings.high / Decimal(conversionFactor)
  73. let lowGlucose = settings.low / Decimal(conversionFactor)
  74. let cob = determination?.cob ?? 0
  75. let iob = determination?.iob ?? 0
  76. let lockScreenView = settings.lockScreenView.displayName
  77. let unit = settings.units == .mmolL ? " mmol/L" : " mg/dL"
  78. let isOverrideActive = override?.isActive ?? false
  79. self.init(
  80. bg: formattedBG,
  81. direction: trendString,
  82. change: change,
  83. date: bg.date,
  84. chart: convertedChartBG,
  85. chartDate: chartDate,
  86. rotationDegrees: rotationDegrees,
  87. highGlucose: Double(highGlucose),
  88. lowGlucose: Double(lowGlucose),
  89. cob: Decimal(cob),
  90. iob: iob as Decimal,
  91. lockScreenView: lockScreenView,
  92. unit: unit,
  93. isOverrideActive: isOverrideActive
  94. )
  95. }
  96. }