فهرست منبع

In App Icon Chooser (#14)

New Icon Config. In settings you can now change the iAPS app icon. 

Many new awesome commits from Tom Barrows. Many to pick from in new IAPS icon settings
Jon B Mårtensson 3 سال پیش
والد
کامیت
b0f141abc9
38فایلهای تغییر یافته به همراه380 افزوده شده و 12 حذف شده
  1. 3 3
      Config.xcconfig
  2. 56 4
      FreeAPS.xcodeproj/project.pbxproj
  3. 1 1
      FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved
  4. BIN
      FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2 1.png
  5. BIN
      FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2.png
  6. 20 0
      FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Contents.json
  7. 20 0
      FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/Contents.json
  8. BIN
      FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024 1.png
  9. BIN
      FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024.png
  10. 20 0
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/Contents.json
  11. BIN
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite 1.png
  12. BIN
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite.png
  13. 20 0
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/Contents.json
  14. BIN
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite 1.png
  15. BIN
      FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite.png
  16. 20 0
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Contents.json
  17. BIN
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2 1.png
  18. BIN
      FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2.png
  19. 20 0
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/Contents.json
  20. BIN
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4 1.png
  21. BIN
      FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4.png
  22. 20 0
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Contents.json
  23. BIN
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3 1.png
  24. BIN
      FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3.png
  25. 20 0
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Contents.json
  26. BIN
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Pod1.png
  27. BIN
      FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/pod_colorful1024x1024.png
  28. 1 0
      FreeAPS/Sources/Application/FreeAPSApp.swift
  29. 59 0
      FreeAPS/Sources/Models/Icons.swift
  30. 5 0
      FreeAPS/Sources/Modules/IconConfig/IconConfigDataFlow.swift
  31. 3 0
      FreeAPS/Sources/Modules/IconConfig/IconConfigProvider.swift
  32. 5 0
      FreeAPS/Sources/Modules/IconConfig/IconConfigStateModel.swift
  33. 14 0
      FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift
  34. 28 0
      FreeAPS/Sources/Modules/IconConfig/View/IconImage.swift
  35. 40 0
      FreeAPS/Sources/Modules/IconConfig/View/IconSelection.swift
  36. 1 0
      FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift
  37. 3 0
      FreeAPS/Sources/Router/Screen.swift
  38. 1 4
      FreeAPSWatch/Info.plist

+ 3 - 3
Config.xcconfig

@@ -1,11 +1,11 @@
 APP_DISPLAY_NAME = iAPS
-APP_VERSION = 1.1.4
+APP_VERSION = 1.2.0
 APP_BUILD_NUMBER = 1
 COPYRIGHT_NOTICE =
 DEVELOPER_TEAM = ##TEAM_ID##
 BUNDLE_IDENTIFIER = ru.artpancreas.$(DEVELOPMENT_TEAM).FreeAPS
 APP_GROUP_ID = group.com.$(DEVELOPMENT_TEAM).loopkit.LoopGroup
-APP_ICON = iAPS_Loop_Text
+APP_ICON = pod_colorful
 
 #include? "ConfigOverride.xcconfig"
-#include? "../../ConfigOverride.xcconfig"
+//#include? "../../ConfigOverride.xcconfig"

+ 56 - 4
FreeAPS.xcodeproj/project.pbxproj

@@ -16,6 +16,9 @@
 		19012CDC291D2CB900FB8210 /* LoopStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19012CDB291D2CB900FB8210 /* LoopStats.swift */; };
 		1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; };
 		1935364028496F7D001E0B16 /* Oref2_variables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* Oref2_variables.swift */; };
+		1967DFBE29D052C200759F30 /* Icons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBD29D052C200759F30 /* Icons.swift */; };
+		1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFBF29D053AC00759F30 /* IconSelection.swift */; };
+		1967DFC229D053D300759F30 /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967DFC129D053D300759F30 /* IconImage.swift */; };
 		19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		19854F492961C3E500941627 /* DurationButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19854F482961C3E500941627 /* DurationButton.swift */; };
@@ -32,6 +35,10 @@
 		19DC678129CA676A00FD9EC4 /* OverrideProfilesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DC678029CA676A00FD9EC4 /* OverrideProfilesProvider.swift */; };
 		19DC678329CA677D00FD9EC4 /* OverrideProfilesStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DC678229CA677D00FD9EC4 /* OverrideProfilesStateModel.swift */; };
 		19DC678529CA67A400FD9EC4 /* OverrideProfilesRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DC678429CA67A400FD9EC4 /* OverrideProfilesRootView.swift */; };
+		19E1F7E829D082D0005C8D20 /* IconConfigDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E1F7E729D082D0005C8D20 /* IconConfigDataFlow.swift */; };
+		19E1F7EA29D082ED005C8D20 /* IconConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E1F7E929D082ED005C8D20 /* IconConfigProvider.swift */; };
+		19E1F7EC29D082FE005C8D20 /* IconConfigStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E1F7EB29D082FE005C8D20 /* IconConfigStateModel.swift */; };
+		19E1F7EF29D08EBA005C8D20 /* IconConfigRootWiew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E1F7EE29D08EBA005C8D20 /* IconConfigRootWiew.swift */; };
 		1BBB001DAD60F3B8CEA4B1C7 /* ISFEditorStateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505E09DC17A0C3D0AF4B66FE /* ISFEditorStateModel.swift */; };
 		1D845DF2E3324130E1D95E67 /* DataTableProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60744C3E9BB3652895C908CC /* DataTableProvider.swift */; };
 		23888883D4EA091C88480FF2 /* BolusProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19984D62EFC0035A9E9644D /* BolusProvider.swift */; };
@@ -199,7 +206,6 @@
 		38E87401274F77E400975559 /* CoreNFC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38E873FD274F761800975559 /* CoreNFC.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
 		38E87403274F78C000975559 /* libswiftCoreNFC.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 38E87402274F78C000975559 /* libswiftCoreNFC.tbd */; settings = {ATTRIBUTES = (Weak, ); }; };
 		38E87408274F9AD000975559 /* UserNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E87407274F9AD000975559 /* UserNotificationsManager.swift */; };
-		38E8751F27554D5700975559 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 38E8751E27554D5700975559 /* Assets.xcassets */; };
 		38E8752527554D5700975559 /* FreeAPSWatch WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 38E8752427554D5700975559 /* FreeAPSWatch WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		38E8752A27554D5700975559 /* FreeAPSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E8752927554D5700975559 /* FreeAPSApp.swift */; };
 		38E8752C27554D5700975559 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E8752B27554D5700975559 /* MainView.swift */; };
@@ -472,6 +478,9 @@
 		1927C8FB2744612600347C69 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		1935363F28496F7D001E0B16 /* Oref2_variables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Oref2_variables.swift; sourceTree = "<group>"; };
+		1967DFBD29D052C200759F30 /* Icons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icons.swift; sourceTree = "<group>"; };
+		1967DFBF29D053AC00759F30 /* IconSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconSelection.swift; sourceTree = "<group>"; };
+		1967DFC129D053D300759F30 /* IconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconImage.swift; sourceTree = "<group>"; };
 		1980131D29CC9839002FF024 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 		198377D3266BFFF6004DE65E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		198377D5266C0A05004DE65E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -506,6 +515,10 @@
 		19DC678029CA676A00FD9EC4 /* OverrideProfilesProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesProvider.swift; sourceTree = "<group>"; };
 		19DC678229CA677D00FD9EC4 /* OverrideProfilesStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesStateModel.swift; sourceTree = "<group>"; };
 		19DC678429CA67A400FD9EC4 /* OverrideProfilesRootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideProfilesRootView.swift; sourceTree = "<group>"; };
+		19E1F7E729D082D0005C8D20 /* IconConfigDataFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconConfigDataFlow.swift; sourceTree = "<group>"; };
+		19E1F7E929D082ED005C8D20 /* IconConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconConfigProvider.swift; sourceTree = "<group>"; };
+		19E1F7EB29D082FE005C8D20 /* IconConfigStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconConfigStateModel.swift; sourceTree = "<group>"; };
+		19E1F7EE29D08EBA005C8D20 /* IconConfigRootWiew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconConfigRootWiew.swift; sourceTree = "<group>"; };
 		1CAE81192B118804DCD23034 /* SnoozeProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SnoozeProvider.swift; sourceTree = "<group>"; };
 		212E8BFE6D66EE65AA26A114 /* CalibrationsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CalibrationsProvider.swift; sourceTree = "<group>"; };
 		223EC0494F55A91E3EA69EF4 /* BolusStateModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BolusStateModel.swift; sourceTree = "<group>"; };
@@ -984,6 +997,27 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		19E1F7E629D0828B005C8D20 /* IconConfig */ = {
+			isa = PBXGroup;
+			children = (
+				19E1F7E729D082D0005C8D20 /* IconConfigDataFlow.swift */,
+				19E1F7E929D082ED005C8D20 /* IconConfigProvider.swift */,
+				19E1F7EB29D082FE005C8D20 /* IconConfigStateModel.swift */,
+				19E1F7ED29D088C0005C8D20 /* View */,
+			);
+			path = IconConfig;
+			sourceTree = "<group>";
+		};
+		19E1F7ED29D088C0005C8D20 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				19E1F7EE29D08EBA005C8D20 /* IconConfigRootWiew.swift */,
+				1967DFC129D053D300759F30 /* IconImage.swift */,
+				1967DFBF29D053AC00759F30 /* IconSelection.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		29B478DF61BF8D270F7D8954 /* Snooze */ = {
 			isa = PBXGroup;
 			children = (
@@ -1006,6 +1040,7 @@
 		3811DE0325C9D31700A708ED /* Modules */ = {
 			isa = PBXGroup;
 			children = (
+				19E1F7E629D0828B005C8D20 /* IconConfig */,
 				19D466A129AA2B0A004D5F33 /* FPUConfig */,
 				F90692CD274B99850037068D /* HealthKit */,
 				6DC5D590658EF8B8DF94F9F5 /* AddCarbs */,
@@ -1451,6 +1486,7 @@
 				19012CDB291D2CB900FB8210 /* LoopStats.swift */,
 				FE41E4D329463C660047FD55 /* NightscoutStatistics.swift */,
 				FE41E4D529463EE20047FD55 /* NightscoutPreferences.swift */,
+				1967DFBD29D052C200759F30 /* Icons.swift */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -2220,7 +2256,6 @@
 			buildActionMask = 2147483647;
 			files = (
 				19DA48E929CD339C00EEA1E7 /* Assets.xcassets in Resources */,
-				38E8751F27554D5700975559 /* Assets.xcassets in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2307,6 +2342,8 @@
 				CEA4F62329BE10F70011ADF7 /* SavitzkyGolayFilter.swift in Sources */,
 				38B4F3C325E2A20B00E76A18 /* PumpSetupView.swift in Sources */,
 				38E4453C274E411700EC9A94 /* Disk+Codable.swift in Sources */,
+				19E1F7EF29D08EBA005C8D20 /* IconConfigRootWiew.swift in Sources */,
+				1967DFC229D053D300759F30 /* IconImage.swift in Sources */,
 				382C134B25F14E3700715CE1 /* BGTargets.swift in Sources */,
 				38AEE75725F0F18E0013F05B /* CarbsStorage.swift in Sources */,
 				38B4F3CA25E502E200E76A18 /* SwiftNotificationCenter.swift in Sources */,
@@ -2492,11 +2529,13 @@
 				E13B7DAB2A435F57066AF02E /* TargetsEditorStateModel.swift in Sources */,
 				19DC678129CA676A00FD9EC4 /* OverrideProfilesProvider.swift in Sources */,
 				9702FF92A09C53942F20D7EA /* TargetsEditorRootView.swift in Sources */,
+				1967DFBE29D052C200759F30 /* Icons.swift in Sources */,
 				38E8754F275556FA00975559 /* WatchManager.swift in Sources */,
 				A228DF96647338139F152B15 /* PreferencesEditorDataFlow.swift in Sources */,
 				389ECE052601144100D86C4F /* ConcurrentMap.swift in Sources */,
 				E4984C5262A90469788754BB /* PreferencesEditorProvider.swift in Sources */,
 				DD399FB31EACB9343C944C4C /* PreferencesEditorStateModel.swift in Sources */,
+				19E1F7EA29D082ED005C8D20 /* IconConfigProvider.swift in Sources */,
 				44190F0BBA464D74B857D1FB /* PreferencesEditorRootView.swift in Sources */,
 				E97285ED9B814CD5253C6658 /* AddCarbsDataFlow.swift in Sources */,
 				CE48C86428CA69D5007C0598 /* OmniBLEPumpManagerExtensions.swift in Sources */,
@@ -2520,9 +2559,11 @@
 				38569353270B5E350002C50D /* CGMRootView.swift in Sources */,
 				69A31254F2451C20361D172F /* BolusStateModel.swift in Sources */,
 				0CEA2EA070AB041AF3E3745B /* BolusRootView.swift in Sources */,
+				1967DFC029D053AC00759F30 /* IconSelection.swift in Sources */,
 				FEFFA7A22929FE49007B8193 /* UIDevice+Extensions.swift in Sources */,
 				F90692D3274B9A130037068D /* AppleHealthKitRootView.swift in Sources */,
 				3862CC1F273FDC9200BF832C /* CalibrationsChart.swift in Sources */,
+				19E1F7EC29D082FE005C8D20 /* IconConfigStateModel.swift in Sources */,
 				711C0CB42CAABE788916BC9D /* ManualTempBasalDataFlow.swift in Sources */,
 				BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */,
 				F90692D6274B9A450037068D /* HealthKitStateModel.swift in Sources */,
@@ -2549,6 +2590,7 @@
 				9050F378F0063C064D7FFC86 /* LibreConfigRootView.swift in Sources */,
 				B7C465E9472624D8A2BE2A6A /* CalibrationsDataFlow.swift in Sources */,
 				320D030F724170A637F06D50 /* CalibrationsProvider.swift in Sources */,
+				19E1F7E829D082D0005C8D20 /* IconConfigDataFlow.swift in Sources */,
 				E25073BC86C11C3D6A42F5AC /* CalibrationsStateModel.swift in Sources */,
 				BA90041DC8991147E5C8C3AA /* CalibrationsRootView.swift in Sources */,
 				E3A08AAE59538BC8A8ABE477 /* NotificationsConfigDataFlow.swift in Sources */,
@@ -2804,6 +2846,7 @@
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
 				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_STYLE = Automatic;
@@ -2838,8 +2881,9 @@
 			buildSettings = {
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				APP_GROUP_ID = "$(APP_GROUP_ID)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = iAPS_Loop_Text;
+				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CODE_SIGN_ENTITLEMENTS = FreeAPS/Resources/FreeAPS.entitlements;
 				CODE_SIGN_STYLE = Automatic;
@@ -2876,6 +2920,10 @@
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
 				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
+				ASSETCATALOG_COMPILER_INCLUDE_STICKER_CONTENT = YES;
+				ASSETCATALOG_COMPILER_STANDALONE_ICON_BEHAVIOR = all;
+				ASSETCATALOG_COMPILER_TARGET_STICKERS_ICON_ROLE = "host-app";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CODE_SIGN_ENTITLEMENTS = FreeAPSWatch/FreeAPSWatch.entitlements;
@@ -2905,8 +2953,12 @@
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				APP_DISPLAY_NAME = "$(APP_DISPLAY_NAME)";
-				ASSETCATALOG_COMPILER_APPICON_NAME = iAPS_Loop_Text;
+				ASSETCATALOG_COMPILER_APPICON_NAME = "$(APP_ICON)";
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
+				ASSETCATALOG_COMPILER_INCLUDE_STICKER_CONTENT = YES;
+				ASSETCATALOG_COMPILER_STANDALONE_ICON_BEHAVIOR = all;
+				ASSETCATALOG_COMPILER_TARGET_STICKERS_ICON_ROLE = "host-app";
 				BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CODE_SIGN_ENTITLEMENTS = FreeAPSWatch/FreeAPSWatch.entitlements;

+ 1 - 1
FreeAPS.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -30,7 +30,7 @@
       },
       {
         "package": "SwiftCharts",
-        "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts.git",
+        "repositoryURL": "https://github.com/ivanschuetz/SwiftCharts",
         "state": {
           "branch": "master",
           "revision": "c354c1945bb35a1f01b665b22474f6db28cba4a2",

BIN
FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2 1.png


BIN
FreeAPS/Resources/Assets.xcassets/catWithPod.appiconset/Cat2.png


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

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

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

@@ -0,0 +1,20 @@
+{
+  "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
+  }
+}

BIN
FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024 1.png


BIN
FreeAPS/Resources/Assets.xcassets/catWithPodWhiteBG.appiconset/catWithPodWhiteBG1024x1024.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite 1.png


BIN
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_Cyan_Text.appiconset/LoopWhite.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite 1.png


BIN
FreeAPS/Resources/Assets.xcassets/iAPS_Loop_White_Text.appiconset/LoopWhite.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2 1.png


BIN
FreeAPS/Resources/Assets.xcassets/podPurple.appiconset/Pod2.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4 1.png


BIN
FreeAPS/Resources/Assets.xcassets/podTemplateBlack.appiconset/pod4.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3 1.png


BIN
FreeAPS/Resources/Assets.xcassets/podTemplateWhite.appiconset/Pod3.png


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

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

BIN
FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/Pod1.png


BIN
FreeAPS/Resources/Assets.xcassets/pod_colorful.appiconset/pod_colorful1024x1024.png


+ 1 - 0
FreeAPS/Sources/Application/FreeAPSApp.swift

@@ -58,6 +58,7 @@ import Swinject
         WindowGroup {
             Main.RootView(resolver: resolver)
                 .environment(\.managedObjectContext, dataController.persistentContainer.viewContext)
+                .environmentObject(Icons())
         }
         .onChange(of: scenePhase) { newScenePhase in
             debug(.default, "APPLICATION PHASE: \(newScenePhase)")

+ 59 - 0
FreeAPS/Sources/Models/Icons.swift

@@ -0,0 +1,59 @@
+
+import Foundation
+import UIKit
+
+enum Icon_: String, CaseIterable, Identifiable {
+    case primary = "pod_colorful"
+    case text = "iAPS"
+    case podBlack = "podTemplateBlack"
+    case popWhite = "podTemplateWhite"
+    case cyan = "iAPS_Loop_Cyan_Text"
+    case podPurple
+    case catWithPod
+    case catWithPodWhite = "catWithPodWhiteBG"
+    case loopWhiteText = "iAPS_Loop_White_Text"
+    case loopText = "iAPS_Loop_Text"
+    case black = "iAPS_Black_Black"
+    case clean = "iAPS_Clean"
+    case purple = "iAPS_Purple"
+    case glow = "iAPS_Glow_BG"
+    case gray = "iAPS_Gray"
+    case whiteAndGray = "iAPS_WhiteAndGray"
+    case grayAndLoopNoButtons = "iAPS_NoButtons_Gray_White_BG"
+    case purpleBG = "iAPS_Purple_BG"
+    case whiteBG = "iAPS_White_BG"
+    case loop = "iAPS_Loop"
+    var id: String { rawValue }
+}
+
+class Icons: ObservableObject, Equatable {
+    @Published var appIcon: Icon_ = .primary
+
+    static func == (lhs: Icons, rhs: Icons) -> Bool {
+        lhs.appIcon == rhs.appIcon
+    }
+
+    func setAlternateAppIcon(icon: Icon_) {
+        let iconName: String? = (icon != .primary) ? icon.rawValue : nil
+
+        guard UIApplication.shared.alternateIconName != iconName else { return }
+
+        UIApplication.shared.setAlternateIconName(iconName) { error in
+            if let error = error {
+                print("Failed request to update the app’s icon: \(error)")
+            }
+        }
+
+        appIcon = icon
+    }
+
+    init() {
+        let iconName = UIApplication.shared.alternateIconName
+
+        if iconName == nil {
+            appIcon = .primary
+        } else {
+            appIcon = Icon_(rawValue: iconName!)!
+        }
+    }
+}

+ 5 - 0
FreeAPS/Sources/Modules/IconConfig/IconConfigDataFlow.swift

@@ -0,0 +1,5 @@
+enum IconConfig {
+    enum Config {}
+}
+
+protocol IconConfigProvider {}

+ 3 - 0
FreeAPS/Sources/Modules/IconConfig/IconConfigProvider.swift

@@ -0,0 +1,3 @@
+extension IconConfig {
+    final class Provider: BaseProvider, IconConfigProvider {}
+}

+ 5 - 0
FreeAPS/Sources/Modules/IconConfig/IconConfigStateModel.swift

@@ -0,0 +1,5 @@
+import SwiftUI
+
+extension IconConfig {
+    final class StateModel: BaseStateModel<Provider> {}
+}

+ 14 - 0
FreeAPS/Sources/Modules/IconConfig/View/IconConfigRootWiew.swift

@@ -0,0 +1,14 @@
+import SwiftUI
+import Swinject
+
+extension IconConfig {
+    struct RootView: BaseView {
+        let resolver: Resolver
+        @StateObject var state = StateModel()
+
+        var body: some View {
+            IconSelection()
+                .onAppear(perform: configureView)
+        }
+    }
+}

+ 28 - 0
FreeAPS/Sources/Modules/IconConfig/View/IconImage.swift

@@ -0,0 +1,28 @@
+
+import SwiftUI
+
+struct IconImage: View {
+    var icon: Icon_
+
+    var body: some View {
+        Label {
+            Text(icon.rawValue)
+        } icon: {
+            Image(uiImage: UIImage(named: icon.rawValue) ?? UIImage())
+                .resizable()
+                .aspectRatio(contentMode: .fit)
+                .frame(minHeight: 57, maxHeight: 1024)
+                .cornerRadius(10)
+                .shadow(radius: 10)
+                .padding()
+        }
+        .labelStyle(.iconOnly)
+    }
+}
+
+struct IconImage_Previews: PreviewProvider {
+    static var previews: some View {
+        IconImage(icon: Icon_.primary)
+            .previewInterfaceOrientation(.portrait)
+    }
+}

+ 40 - 0
FreeAPS/Sources/Modules/IconConfig/View/IconSelection.swift

@@ -0,0 +1,40 @@
+
+import SwiftUI
+
+struct IconSelection: View {
+    @EnvironmentObject var model: Icons
+
+    var body: some View {
+        let columns = Array(repeating: GridItem(.adaptive(minimum: 114, maximum: 1024), spacing: 0), count: 3)
+
+        VStack {
+            HStack {
+                Text("iAPS Icon")
+                    .font(.title)
+                IconImage(icon: model.appIcon)
+                    .frame(maxHeight: 114)
+            }
+
+            Divider()
+
+            ScrollView {
+                LazyVGrid(columns: columns) {
+                    ForEach(Icon_.allCases) { icon in
+                        Button {
+                            model.setAlternateAppIcon(icon: icon)
+                        } label: {
+                            IconImage(icon: icon)
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+struct IconSelectionRootView_Previews: PreviewProvider {
+    static var previews: some View {
+        IconSelection()
+            .environmentObject(Icons())
+    }
+}

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

@@ -31,6 +31,7 @@ extension Settings {
                     Text("Notifications").navigationLink(to: .notificationsConfig, from: self)
                     Text("Fat And Protein Conversion").navigationLink(to: .fpuConfig, from: self)
                     Text("Profile Override").navigationLink(to: .overrideProfilesConfig, from: self)
+                    Text("App Icons").navigationLink(to: .iconConfig, from: self)
                 }
 
                 Section(header: Text("Configuration")) {

+ 3 - 0
FreeAPS/Sources/Router/Screen.swift

@@ -26,6 +26,7 @@ enum Screen: Identifiable, Hashable {
     case calibrations
     case notificationsConfig
     case fpuConfig
+    case iconConfig
     case overrideProfilesConfig
     case snooze
 
@@ -86,6 +87,8 @@ extension Screen {
             NotificationsConfig.RootView(resolver: resolver)
         case .fpuConfig:
             FPUConfig.RootView(resolver: resolver)
+        case .iconConfig:
+            IconConfig.RootView(resolver: resolver)
         case .overrideProfilesConfig:
             OverrideProfilesConfig.RootView(resolver: resolver)
         case .snooze:

+ 1 - 4
FreeAPSWatch/Info.plist

@@ -1,8 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
-<dict>
-	<key>CFBundleIcons</key>
-	<dict/>
-</dict>
+<dict/>
 </plist>