diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/100.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/100.png new file mode 100644 index 000000000..4a1c8bd1d Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/100.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/1024.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/1024.png new file mode 100644 index 000000000..aba97be8a Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/1024.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/114.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/114.png new file mode 100644 index 000000000..2ca02364c Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/114.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/120.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/120.png new file mode 100644 index 000000000..d6a04b2d5 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/120.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/144.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/144.png new file mode 100644 index 000000000..09a7cf71f Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/144.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/152.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/152.png new file mode 100644 index 000000000..9d292c957 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/152.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/167.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/167.png new file mode 100644 index 000000000..eda3f4469 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/167.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/180.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/180.png new file mode 100644 index 000000000..100cdd966 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/180.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/20.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/20.png new file mode 100644 index 000000000..7cc480cd2 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/20.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/29.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/29.png new file mode 100644 index 000000000..e51836d05 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/29.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/40.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/40.png new file mode 100644 index 000000000..7a774fcd9 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/40.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/50.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/50.png new file mode 100644 index 000000000..b90cd03cd Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/50.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/57.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/57.png new file mode 100644 index 000000000..d1c3f84f5 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/57.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/58.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/58.png new file mode 100644 index 000000000..20f9b1dc6 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/58.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/60.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/60.png new file mode 100644 index 000000000..4fde7eb51 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/60.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/72.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/72.png new file mode 100644 index 000000000..b64e95f9d Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/72.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/76.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/76.png new file mode 100644 index 000000000..4f52668db Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/76.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/80.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/80.png new file mode 100644 index 000000000..5fbc250e0 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/80.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/87.png b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/87.png new file mode 100644 index 000000000..b0d35901c Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/87.png differ diff --git a/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/Contents.json b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/Contents.json new file mode 100644 index 000000000..4fdf88263 --- /dev/null +++ b/apps/ios/Shared/Assets.xcassets/DarkAppIcon.appiconset/Contents.json @@ -0,0 +1,158 @@ +{ + "images" : [ + { + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "80.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "50.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "50x50" + }, + { + "filename" : "100.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "50x50" + }, + { + "filename" : "72.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "72x72" + }, + { + "filename" : "144.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "72x72" + }, + { + "filename" : "76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "152.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "167.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/120.png b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/120.png new file mode 100644 index 000000000..fd9cfdfae Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/120.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/180.png b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/180.png new file mode 100644 index 000000000..45fc44af4 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/180.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/60.png b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/60.png new file mode 100644 index 000000000..c489e1272 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/60.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/Contents.json b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/Contents.json new file mode 100644 index 000000000..becba3f65 --- /dev/null +++ b/apps/ios/Shared/Assets.xcassets/icon-dark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "60.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Assets.xcassets/icon-light.imageset/120.png b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/120.png new file mode 100644 index 000000000..89ab6d2b5 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/120.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-light.imageset/180.png b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/180.png new file mode 100644 index 000000000..631dd3a14 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/180.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-light.imageset/60.png b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/60.png new file mode 100644 index 000000000..278af34d4 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/60.png differ diff --git a/apps/ios/Shared/Assets.xcassets/icon-light.imageset/Contents.json b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/Contents.json new file mode 100644 index 000000000..becba3f65 --- /dev/null +++ b/apps/ios/Shared/Assets.xcassets/icon-light.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "60.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift new file mode 100644 index 000000000..1c0558b86 --- /dev/null +++ b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift @@ -0,0 +1,51 @@ +// +// AppearanceSettings.swift +// SimpleX (iOS) +// +// Created by Evgeny on 03/08/2022. +// Copyright © 2022 SimpleX Chat. All rights reserved. +// + +import SwiftUI + +struct AppearanceSettings: View { + @State private var iconLightTapped = false + @State private var iconDarkTapped = false + + var body: some View { + VStack{ + List { + Section("App icon") { + HStack { + updateAppIcon(image: "icon-light", icon: nil, tapped: $iconLightTapped) + Spacer().frame(width: 16) + updateAppIcon(image: "icon-dark", icon: "DarkAppIcon", tapped: $iconDarkTapped) + } + } + } + } + } + + private func updateAppIcon(image: String, icon: String?, tapped: Binding) -> some View { + Image(image) + .resizable() + .scaledToFit() + .frame(width: 60, height: 60) + .onTapGesture { + UIApplication.shared.setAlternateIconName(icon) { err in + if let err = err { + logger.error("\(err.localizedDescription)") + } + } + } + ._onButtonGesture { tapped.wrappedValue = $0 } perform: {} + .overlay(tapped.wrappedValue ? Color.secondary : Color.clear) + .cornerRadius(20) + } +} + +struct AppearanceSettings_Previews: PreviewProvider { + static var previews: some View { + AppearanceSettings() + } +} diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index fcb805c77..4a679c13a 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -117,6 +117,14 @@ struct SettingsView: View { } label: { settingsRow("lock") { Text("Privacy & security") } } + if UIApplication.shared.supportsAlternateIcons { + NavigationLink { + AppearanceSettings() + .navigationTitle("Appearance") + } label: { + settingsRow("sun.max") { Text("Appearance") } + } + } settingsRow("link") { Toggle("Show pending connections", isOn: $pendingConnections) } diff --git a/apps/ios/SimpleX--iOS--Info.plist b/apps/ios/SimpleX--iOS--Info.plist index 01f16a5a1..6c7b1ae56 100644 --- a/apps/ios/SimpleX--iOS--Info.plist +++ b/apps/ios/SimpleX--iOS--Info.plist @@ -28,5 +28,29 @@ remote-notification voip + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + AppIcon + + UIPrerenderedIcon + + + CFBundleAlternateIcons + + DarkAppIcon + + CFBundleIconFiles + + DarkAppIcon + + UIPrerenderedIcon + + + + diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index b39726768..8b515d83f 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A922283CEDE600C4E99E /* SoundPlayer.swift */; }; 5C55A92E283D0FDE00C4E99E /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 5C55A92D283D0FDE00C4E99E /* sounds */; }; 5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */; }; + 5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5DB70D289ABDD200730FFF /* AppearanceSettings.swift */; }; 5C5E5D3B2824468B00B0488A /* ActiveCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5E5D3A2824468B00B0488A /* ActiveCallView.swift */; }; 5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */; }; 5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; }; @@ -220,6 +221,7 @@ 5C55A922283CEDE600C4E99E /* SoundPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoundPlayer.swift; sourceTree = ""; }; 5C55A92D283D0FDE00C4E99E /* sounds */ = {isa = PBXFileReference; lastKnownFileType = folder; path = sounds; sourceTree = ""; }; 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkdownHelp.swift; sourceTree = ""; }; + 5C5DB70D289ABDD200730FFF /* AppearanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettings.swift; sourceTree = ""; }; 5C5E5D3A2824468B00B0488A /* ActiveCallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallView.swift; sourceTree = ""; }; 5C5E5D3C282447AB00B0488A /* CallTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallTypes.swift; sourceTree = ""; }; 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; @@ -537,6 +539,7 @@ 5CB346E62868D76D001FD2EF /* NotificationsView.swift */, 5C9C2DA6289957AE00CC63B1 /* AdvancedNetworkSettings.swift */, 5C9C2DA82899DA6F00CC63B1 /* NetworkAndServers.swift */, + 5C5DB70D289ABDD200730FFF /* AppearanceSettings.swift */, 5C05DF522840AA1D00C683F9 /* CallSettings.swift */, 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */, 5CB924E327A8683A00ACCCDD /* UserAddress.swift */, @@ -891,6 +894,7 @@ 5C971E2127AEBF8300C8A3CE /* ChatInfoImage.swift in Sources */, 5C55A921283CCCB700C4E99E /* IncomingCallView.swift in Sources */, 6454036F2822A9750090DDFF /* ComposeFileView.swift in Sources */, + 5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */, 5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */, 5C9C2DA92899DA6F00CC63B1 /* NetworkAndServers.swift in Sources */, 5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */, @@ -1140,8 +1144,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = DarkAppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; @@ -1180,8 +1186,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = DarkAppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic;