Jelajahi Sumber

Merge branch 'dnzxy:core-data-sync-trio' into APNsPumpNotifications

kskandis 1 tahun lalu
induk
melakukan
9bddf9047c
77 mengubah file dengan 354 tambahan dan 152 penghapusan
  1. 6 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/Contents.json
  2. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/Contents.json
  3. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 1.png
  4. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 2.png
  5. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 3.png
  6. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/Contents.json
  7. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 1.png
  8. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 2.png
  9. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 3.png
  10. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/Contents.json
  11. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 1.png
  12. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 2.png
  13. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 3.png
  14. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/Contents.json
  15. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 1.png
  16. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 2.png
  17. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 3.png
  18. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/Contents.json
  19. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 1.png
  20. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 2.png
  21. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 3.png
  22. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/Contents.json
  23. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 1.png
  24. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 2.png
  25. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 3.png
  26. 9 6
      FreeAPS/Resources/Assets.xcassets/trioLoop.appiconset/Contents.json
  27. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 1.png
  28. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 2.png
  29. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 3.png
  30. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/Contents.json
  31. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 1.png
  32. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 2.png
  33. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 3.png
  34. 23 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/Contents.json
  35. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 1.png
  36. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 2.png
  37. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 3.png
  38. 6 0
      FreeAPS/Resources/Assets.xcassets/app_icons/Contents.json
  39. 20 0
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/Contents.json
  40. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/catWithPod watch.png
  41. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/catWithPod.png
  42. 20 0
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/Contents.json
  43. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/catWithPodWhiteBG watch.png
  44. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/catWithPodWhiteBG.png
  45. 2 2
      FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Contents.json
  46. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/diabeetus.appiconset/diabeetus watch.png
  47. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/diabeetus.appiconset/diabeetus.png
  48. 1 1
      FreeAPS/Resources/Assets.xcassets/trio3D.appiconset/Contents.json
  49. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trio3D.appiconset/trio3d watch.png
  50. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trio3D.appiconset/trio3d.png
  51. 2 2
      FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/Contents.json
  52. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioBlack.appiconset/trioBlack watch.png
  53. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trioBlack.appiconset/trioBlack.png
  54. 20 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/Contents.json
  55. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/trioColorBG watch.png
  56. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/trioColorBG.png
  57. 2 2
      FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/Contents.json
  58. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioLoop.appiconset/trioLoop watch.png
  59. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trioLoop.appiconset/trioLoop.png
  60. 20 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/Contents.json
  61. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/trioWhite watch.png
  62. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/trioWhite.png
  63. 20 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/Contents.json
  64. 0 0
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/trioWhiteShadow watch.png
  65. TEMPAT SAMPAH
      FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/trioWhiteShadow.png
  66. 0 20
      FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/Contents.json
  67. 0 20
      FreeAPS/Resources/Assets.xcassets/trioBlack.appiconset/Contents.json
  68. 0 20
      FreeAPS/Resources/Assets.xcassets/trioColorBG.appiconset/Contents.json
  69. 0 20
      FreeAPS/Resources/Assets.xcassets/trioWhite.appiconset/Contents.json
  70. 0 20
      FreeAPS/Resources/Assets.xcassets/trioWhiteShadow.appiconset/Contents.json
  71. 28 24
      FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift
  72. 7 7
      FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift
  73. 1 1
      FreeAPS/Sources/Modules/IconConfig/View/IconImage.swift
  74. 1 1
      FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift
  75. 2 3
      FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift
  76. 1 1
      FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift
  77. 2 2
      Model/TrioCoreDataPersistentContainer.xcdatamodeld/TrioCoreDataPersistentContainer.xcdatamodel/contents

+ 6 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "catWithPod 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "catWithPod 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "catWithPod 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2 1.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 1.png


FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPod.imageset/catWithPod 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "catWithPodWhiteBG 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "catWithPodWhiteBG 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "catWithPodWhiteBG 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024 1.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 1.png


FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/catWithPodWhiteBG.imageset/catWithPodWhiteBG 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "diabeetus 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "diabeetus 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "diabeetus 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/17 1.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/diabeetus.imageset/diabeetus 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "trio3d 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "trio3d 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "trio3d 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trio3D.appiconset/trio3d.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trio3D.imageset/trio3d 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "trioBlack 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "trioBlack 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "trioBlack 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioBlack.appiconset/A.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioBlack.imageset/trioBlack 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "trioColorBG 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "trioColorBG 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "trioColorBG 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioColorBG.appiconset/C.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioColorBG.imageset/trioColorBG 3.png


+ 9 - 6
FreeAPS/Resources/Assets.xcassets/trioLoop.appiconset/Contents.json

@@ -1,16 +1,19 @@
 {
   "images" : [
     {
-      "filename" : "imageLoop.png",
+      "filename" : "imageLoop 1.png",
       "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
+      "scale" : "1x"
     },
     {
-      "filename" : "imageLoop 1.png",
+      "filename" : "imageLoop 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "imageLoop 3.png",
       "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
+      "scale" : "3x"
     }
   ],
   "info" : {

FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop 1.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 1.png


FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/imageLoop.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 2.png


FreeAPS/Resources/Assets.xcassets/trioLoop.appiconset/imageLoop 1.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioLoop.imageset/imageLoop 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "trioWhite 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "trioWhite 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "trioWhite 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioWhite.appiconset/9.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhite.imageset/trioWhite 3.png


+ 23 - 0
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "trioWhiteShadow 1.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "trioWhiteShadow 2.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "trioWhiteShadow 3.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioWhiteShadow.appiconset/D.png → FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 1.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 2.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icon_images/trioWhiteShadow.imageset/trioWhiteShadow 3.png


+ 6 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 20 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "catWithPod.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "catWithPod watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/catWithPod watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPod.appiconset/catWithPod.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "catWithPodWhiteBG.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "catWithPodWhiteBG watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/catWithPodWhiteBG watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/catWithPodWhiteBG.appiconset/catWithPodWhiteBG.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "Cat2.png",
+      "filename" : "diabeetus.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "Cat2 1.png",
+      "filename" : "diabeetus watch.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/18.png → FreeAPS/Resources/Assets.xcassets/app_icons/diabeetus.appiconset/diabeetus watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/diabeetus.appiconset/diabeetus.png


+ 1 - 1
FreeAPS/Resources/Assets.xcassets/trio3D.appiconset/Contents.json

@@ -7,7 +7,7 @@
       "size" : "1024x1024"
     },
     {
-      "filename" : "trio3dWatch.png",
+      "filename" : "trio3d watch.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

FreeAPS/Resources/Assets.xcassets/trio3D.appiconset/trio3dWatch.png → FreeAPS/Resources/Assets.xcassets/app_icons/trio3D.appiconset/trio3d watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trio3D.appiconset/trio3d.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/diabeetus.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "17 1.png",
+      "filename" : "trioBlack.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "18.png",
+      "filename" : "trioBlack watch.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

FreeAPS/Resources/Assets.xcassets/trioBlack.appiconset/A 1.png → FreeAPS/Resources/Assets.xcassets/app_icons/trioBlack.appiconset/trioBlack watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trioBlack.appiconset/trioBlack.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "trioColorBG.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "trioColorBG watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/trioColorBG watch.png


FreeAPS/Resources/Assets.xcassets/trioColorBG.appiconset/C 1.png → FreeAPS/Resources/Assets.xcassets/app_icons/trioColorBG.appiconset/trioColorBG.png


+ 2 - 2
FreeAPS/Resources/Assets.xcassets/OiAPS_Loop.appiconset/Contents.json

@@ -1,13 +1,13 @@
 {
   "images" : [
     {
-      "filename" : "imageLoop.png",
+      "filename" : "trioLoop.png",
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "filename" : "imageLoop 1.png",
+      "filename" : "trioLoop watch.png",
       "idiom" : "universal",
       "platform" : "watchos",
       "size" : "1024x1024"

FreeAPS/Resources/Assets.xcassets/trioLoop.appiconset/imageLoop.png → FreeAPS/Resources/Assets.xcassets/app_icons/trioLoop.appiconset/trioLoop watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trioLoop.appiconset/trioLoop.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "trioWhite.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "trioWhite watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioWhite.appiconset/8.png → FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/trioWhite watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trioWhite.appiconset/trioWhite.png


+ 20 - 0
FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/Contents.json

@@ -0,0 +1,20 @@
+{
+  "images" : [
+    {
+      "filename" : "trioWhiteShadow.png",
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "trioWhiteShadow watch.png",
+      "idiom" : "universal",
+      "platform" : "watchos",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

FreeAPS/Resources/Assets.xcassets/trioWhiteShadow.appiconset/D 1.png → FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/trioWhiteShadow watch.png


TEMPAT SAMPAH
FreeAPS/Resources/Assets.xcassets/app_icons/trioWhiteShadow.appiconset/trioWhiteShadow.png


+ 0 - 20
FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "catWithPodWhiteBG1024x1024.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "catWithPodWhiteBG1024x1024 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/trioBlack.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "A.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "A 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/trioColorBG.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "C 1.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "C.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/trioWhite.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "9.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "8.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 20
FreeAPS/Resources/Assets.xcassets/trioWhiteShadow.appiconset/Contents.json

@@ -1,20 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "D.png",
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "filename" : "D 1.png",
-      "idiom" : "universal",
-      "platform" : "watchos",
-      "size" : "1024x1024"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 28 - 24
FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift

@@ -28,9 +28,6 @@ final class JavaScriptWorker {
     private let virtualMachine: JSVirtualMachine
     private var contextPool: [JSContext] = []
     private let contextPoolLock = NSLock()
-    @SyncAccess(lock: contextLock) private var commonContext: JSContext? = nil
-    private var consoleLogs: [String] = []
-    private var logContext: String = ""
 
     init(poolSize: Int = 5) {
         virtualMachine = JSVirtualMachine()!
@@ -47,10 +44,15 @@ final class JavaScriptWorker {
                 warning(.openAPS, "JavaScript Error: \(error)")
             }
         }
-        let consoleLog: @convention(block) (String) -> Void = { message in
+        let consoleLog: @convention(block) (String) -> Void = { [weak context] message in
+            guard let context = context else { return }
             let trimmedMessage = message.trimmingCharacters(in: .whitespacesAndNewlines)
             if !trimmedMessage.isEmpty {
-                self.consoleLogs.append("\(trimmedMessage)")
+                let fileName = context.objectForKeyedSubscript("scriptName").toString() ?? "Unknown"
+                let threadSafeLog = "\(trimmedMessage)"
+                self.processQueue.async(flags: .barrier) {
+                    self.outputLogs(for: fileName, message: threadSafeLog)
+                }
             }
         }
         context.setObject(consoleLog, forKeyedSubscript: "_consoleLog" as NSString)
@@ -70,36 +72,40 @@ final class JavaScriptWorker {
         contextPoolLock.unlock()
     }
 
-    // New method to flush aggregated logs
-    private func outputLogs() {
-        var outputLogs = consoleLogs.joined(separator: "\n").trimmingCharacters(in: .whitespacesAndNewlines)
-        consoleLogs.removeAll()
+    private func outputLogs(for fileName: String, message: String) {
+        let logs = message.trimmingCharacters(in: .whitespacesAndNewlines)
 
-        if outputLogs.isEmpty { return }
+        if logs.isEmpty { return }
 
-        if logContext == "autosens.js" {
-            outputLogs = outputLogs.split(separator: "\n").map { logLine in
+        if fileName == "autosens.js" {
+            let sanitizedLogs = logs.split(separator: "\n").map { logLine in
                 logLine.replacingOccurrences(
                     of: "^[-+=x!]|u\\(|\\)|\\d{1,2}h$",
                     with: "",
                     options: .regularExpression
                 )
             }.joined(separator: "\n")
-        }
 
-        if !outputLogs.isEmpty {
-            outputLogs.split(separator: "\n").forEach { logLine in
-                if !"\(logLine)".trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
-                    debug(.openAPS, "\(logContext): \(logLine)")
+            sanitizedLogs.split(separator: "\n").forEach { logLine in
+                if !logLine.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
+                    debug(.openAPS, "\(fileName): \(logLine)")
+                }
+            }
+        } else {
+            logs.split(separator: "\n").forEach { logLine in
+                if !logLine.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
+                    debug(.openAPS, "\(fileName): \(logLine)")
                 }
             }
         }
     }
 
     @discardableResult func evaluate(script: Script) -> JSValue! {
-        logContext = URL(fileURLWithPath: script.name).lastPathComponent
-        let result = evaluate(string: script.body)
-        outputLogs()
+        let context = getContext()
+        defer { returnContext(context) }
+        let fileName = URL(fileURLWithPath: script.name).lastPathComponent
+        context.setObject(fileName, forKeyedSubscript: "scriptName" as NSString)
+        let result = context.evaluateScript(script.body)
         return result
     }
 
@@ -122,7 +128,6 @@ final class JavaScriptWorker {
         let context = getContext()
         defer {
             returnContext(context)
-            outputLogs()
         }
         return execute(self)
     }
@@ -130,13 +135,12 @@ final class JavaScriptWorker {
     func evaluateBatch(scripts: [Script]) {
         let context = getContext()
         defer {
-            // Ensure the context is returned to the pool
             returnContext(context)
         }
         scripts.forEach { script in
-            logContext = URL(fileURLWithPath: script.name).lastPathComponent
+            let fileName = URL(fileURLWithPath: script.name).lastPathComponent
+            context.setObject(fileName, forKeyedSubscript: "scriptName" as NSString)
             context.evaluateScript(script.body)
-            outputLogs()
         }
     }
 }

+ 7 - 7
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -104,11 +104,11 @@ extension Bolus {
         var preprocessedData: [(id: UUID, forecast: Forecast, forecastValue: ForecastValue)] = []
         var predictionsForChart: Predictions?
         var simulatedDetermination: Determination?
-        var determinationObjectIDs: [NSManagedObjectID] = []
+        @MainActor var determinationObjectIDs: [NSManagedObjectID] = []
 
         var minForecast: [Int] = []
         var maxForecast: [Int] = []
-        var minCount: Int = 12 // count of Forecasts drawn in 5 min distances, i.e. 12 means a min of 1 hour
+        @MainActor var minCount: Int = 12 // count of Forecasts drawn in 5 min distances, i.e. 12 means a min of 1 hour
         var forecastDisplayType: ForecastDisplayType = .cone
         var isSmoothingEnabled: Bool = false
         var stops: [Gradient.Stop] = []
@@ -736,7 +736,7 @@ extension Bolus.StateModel {
         if let forecastData = forecastData {
             simulatedDetermination = forecastData
         } else {
-            simulatedDetermination = await Task.detached { [self] in
+            simulatedDetermination = await Task { [self] in
                 await apsManager.simulateDetermineBasal(carbs: carbs, iob: amount)
             }.value
         }
@@ -761,14 +761,14 @@ extension Bolus.StateModel {
         minCount = max(12, nonEmptyArrays.map(\.count).min() ?? 0)
         guard minCount > 0 else { return }
 
-        async let minForecastResult = Task.detached {
-            (0 ..< self.minCount).map { index in
+        async let minForecastResult = Task {
+            await (0 ..< self.minCount).map { index in
                 nonEmptyArrays.compactMap { $0.indices.contains(index) ? $0[index] : nil }.min() ?? 0
             }
         }.value
 
-        async let maxForecastResult = Task.detached {
-            (0 ..< self.minCount).map { index in
+        async let maxForecastResult = Task {
+            await (0 ..< self.minCount).map { index in
                 nonEmptyArrays.compactMap { $0.indices.contains(index) ? $0[index] : nil }.max() ?? 0
             }
         }.value

+ 1 - 1
FreeAPS/Sources/Modules/IconConfig/View/IconImage.swift

@@ -8,7 +8,7 @@ struct IconImage: View {
         Label {
             Text(icon.rawValue)
         } icon: {
-            Image(uiImage: UIImage(named: icon.rawValue) ?? UIImage())
+            Image(icon.rawValue)
                 .resizable()
                 .aspectRatio(contentMode: .fit)
                 .frame(minHeight: 57, maxHeight: 1024)

+ 1 - 1
FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift

@@ -3,7 +3,7 @@ import SwiftUI
 
 struct AddOverrideForm: View {
     @Environment(\.presentationMode) var presentationMode
-    @StateObject var state: OverrideConfig.StateModel
+    @Bindable var state: OverrideConfig.StateModel
     @State private var isEditing = false
     @State private var overrideTarget = false
     @Environment(\.colorScheme) var colorScheme

+ 2 - 3
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -2,8 +2,7 @@ import Foundation
 import SwiftUI
 
 struct EditOverrideForm: View {
-    @ObservationIgnored @Injected() var nightscoutManager: NightscoutManager!
-    @ObservedObject var override: OverrideStored
+    var override: OverrideStored
     @Environment(\.presentationMode) var presentationMode
     @Environment(\.colorScheme) var colorScheme
     @Bindable var state: OverrideConfig.StateModel
@@ -296,7 +295,7 @@ struct EditOverrideForm: View {
                         guard moc.hasChanges else { return }
                         try moc.save()
                         Task {
-                            await nightscoutManager.uploadProfiles()
+                            await state.nightscoutManager.uploadProfiles()
                         }
                         if let currentActiveOverride = state.currentActiveOverride {
                             Task {

+ 1 - 1
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -56,7 +56,7 @@ extension Settings {
 
                             Group {
                                 HStack {
-                                    Image(uiImage: UIImage(named: appIcons.appIcon.rawValue) ?? UIImage())
+                                    Image(appIcons.appIcon.rawValue)
                                         .resizable()
                                         .aspectRatio(contentMode: .fit)
                                         .frame(width: 50, height: 50)

+ 2 - 2
Model/TrioCoreDataPersistentContainer.xcdatamodeld/TrioCoreDataPersistentContainer.xcdatamodel/contents

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22757" systemVersion="23G93" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23231" systemVersion="24A348" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
     <entity name="BolusStored" representedClassName="BolusStored" syncable="YES">
         <attribute name="amount" optional="YES" attributeType="Decimal" defaultValueString="0"/>
         <attribute name="isExternal" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
@@ -19,7 +19,7 @@
         <attribute name="note" optional="YES" attributeType="String"/>
         <attribute name="protein" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
         <fetchIndex name="byDate">
-            <fetchIndexElement property="date" type="Binary" order="ascending"/>
+            <fetchIndexElement property="date" type="Binary" order="descending"/>
         </fetchIndex>
         <fetchIndex name="byIsFPU">
             <fetchIndexElement property="isFPU" type="Binary" order="ascending"/>