diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 06e92c7..2735665 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -26,11 +26,31 @@
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
+
+
-
+
+
+
+
+
+
+
+ when (call.method) {
+ "setAppIcon" -> {
+ val name = call.argument("name")
+ if (name == null || !iconAliases.contains(name)) {
+ result.error("INVALID_ICON", "Unknown icon: $name", null)
+ return@setMethodCallHandler
+ }
+ try {
+ applyIcon(name)
+ result.success(null)
+ } catch (e: Exception) {
+ result.error("APPLY_FAILED", e.message, null)
+ }
+ }
+ else -> result.notImplemented()
+ }
+ }
+
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"ru.komet.app/upload_service",
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a8e89eb
Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_minimal_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_minimal_foreground.png
new file mode 100644
index 0000000..5349f07
Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_minimal_foreground.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..16320fb
Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_minimal_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_minimal_foreground.png
new file mode 100644
index 0000000..15423c3
Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_minimal_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..3e889bd
Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_minimal_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_minimal_foreground.png
new file mode 100644
index 0000000..9a2e964
Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_minimal_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..7d1ba01
Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_minimal_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_minimal_foreground.png
new file mode 100644
index 0000000..74e210b
Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_minimal_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a957641
Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_minimal_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_minimal_foreground.png
new file mode 100644
index 0000000..9d6008b
Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_minimal_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..c79c58a
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_minimal.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_minimal.xml
new file mode 100644
index 0000000..7389348
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_minimal.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index db77bb4..c2a7c52 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_minimal.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_minimal.png
new file mode 100644
index 0000000..2c0aee9
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_minimal.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 17987b7..4903294 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_minimal.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_minimal.png
new file mode 100644
index 0000000..d2e0d20
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_minimal.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 09d4391..49b271a 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_minimal.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_minimal.png
new file mode 100644
index 0000000..52f60f4
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_minimal.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index d5f1c8d..6546cc7 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_minimal.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_minimal.png
new file mode 100644
index 0000000..1074637
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_minimal.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 4d6372e..3fef75f 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_minimal.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_minimal.png
new file mode 100644
index 0000000..54b9cde
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_minimal.png differ
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..7d5be24
--- /dev/null
+++ b/android/app/src/main/res/values/colors.xml
@@ -0,0 +1,5 @@
+
+
+ #000000
+ #000000
+
\ No newline at end of file
diff --git a/assets/komet_icon.png b/assets/komet_icon.png
new file mode 100644
index 0000000..a8c3408
Binary files /dev/null and b/assets/komet_icon.png differ
diff --git a/assets/meteor.png b/assets/meteor.png
new file mode 100644
index 0000000..4b8b93f
Binary files /dev/null and b/assets/meteor.png differ
diff --git a/assets/meteor_icon.png b/assets/meteor_icon.png
new file mode 100644
index 0000000..f356a2c
Binary files /dev/null and b/assets/meteor_icon.png differ
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 5b0a064..b6d29d3 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -15,6 +15,8 @@
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ B1B2C3D41234567890ABCDEF /* MinimalIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A1B2C3D41234567890ABCDEF /* MinimalIcon@2x.png */; };
+ B1B2C3D41234567890ABCDF0 /* MinimalIcon@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = A1B2C3D41234567890ABCDF0 /* MinimalIcon@3x.png */; };
E835CC948F2F948DC3BBF405 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AE8CB2654009FE276CACA4B /* Pods_RunnerTests.framework */; };
/* End PBXBuildFile section */
@@ -62,6 +64,8 @@
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ A1B2C3D41234567890ABCDEF /* MinimalIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MinimalIcon@2x.png"; sourceTree = ""; };
+ A1B2C3D41234567890ABCDF0 /* MinimalIcon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MinimalIcon@3x.png"; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
9D7B0FFE63E0BD5D67D7758D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
@@ -143,6 +147,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
+ A1B2C3D41234567890ABCDEF /* MinimalIcon@2x.png */,
+ A1B2C3D41234567890ABCDF0 /* MinimalIcon@3x.png */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
@@ -264,6 +270,8 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ B1B2C3D41234567890ABCDEF /* MinimalIcon@2x.png in Resources */,
+ B1B2C3D41234567890ABCDF0 /* MinimalIcon@3x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -539,7 +547,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -596,7 +604,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 6266644..948ca04 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -8,6 +8,43 @@ import UIKit
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
+
+ let controller = window?.rootViewController as? FlutterViewController
+ if let messenger = controller?.binaryMessenger {
+ let channel = FlutterMethodChannel(
+ name: "ru.komet.app/app_icon",
+ binaryMessenger: messenger
+ )
+ channel.setMethodCallHandler { (call, result) in
+ guard call.method == "setAppIcon" else {
+ result(FlutterMethodNotImplemented)
+ return
+ }
+ let args = call.arguments as? [String: Any]
+ let name = args?["name"] as? String
+ let iconName: String? = (name == "DefaultIcon") ? nil : name
+ if !UIApplication.shared.supportsAlternateIcons {
+ result(FlutterError(
+ code: "UNSUPPORTED",
+ message: "Alternate icons are not supported",
+ details: nil
+ ))
+ return
+ }
+ UIApplication.shared.setAlternateIconName(iconName) { error in
+ if let error = error {
+ result(FlutterError(
+ code: "APPLY_FAILED",
+ message: error.localizedDescription,
+ details: nil
+ ))
+ } else {
+ result(nil)
+ }
+ }
+ }
+ }
+
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index d36b1fa..d0d98aa 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,122 +1 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
+{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
index dc9ada4..13ff2cc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
index 7353c41..d734062 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
index 797d452..0aa67de 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
index 6ed2d93..1878150 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
index 4cd7b00..b4a7e1a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
index fe73094..7620bbb 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
index 321773c..1d4531f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
index 797d452..0aa67de 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
index 502f463..2f9be0b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
index 0ec3034..51609ed 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
new file mode 100644
index 0000000..6a9198f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
new file mode 100644
index 0000000..1f91c58
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
new file mode 100644
index 0000000..1f795ff
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
new file mode 100644
index 0000000..5237cca
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
index 0ec3034..51609ed 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
index e9f5fea..fccd50b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
new file mode 100644
index 0000000..8525584
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
new file mode 100644
index 0000000..a5a7044
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
index 84ac32a..3aa0138 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
index 8953cba..2427cfc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
index 0467bf1..a701353 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 4d48295..bac0a92 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -14,6 +14,21 @@
6.0
CFBundleName
Komet
+ CFBundleIcons
+
+ CFBundleAlternateIcons
+
+ MinimalIcon
+
+ CFBundleIconFiles
+
+ MinimalIcon
+
+ UIPrerenderedIcon
+
+
+
+
CFBundlePackageType
APPL
CFBundleShortVersionString
diff --git a/ios/Runner/MinimalIcon@2x.png b/ios/Runner/MinimalIcon@2x.png
new file mode 100644
index 0000000..9f0435a
Binary files /dev/null and b/ios/Runner/MinimalIcon@2x.png differ
diff --git a/ios/Runner/MinimalIcon@3x.png b/ios/Runner/MinimalIcon@3x.png
new file mode 100644
index 0000000..51fa290
Binary files /dev/null and b/ios/Runner/MinimalIcon@3x.png differ
diff --git a/lib/core/config/app_icon.dart b/lib/core/config/app_icon.dart
new file mode 100644
index 0000000..96c662d
--- /dev/null
+++ b/lib/core/config/app_icon.dart
@@ -0,0 +1,53 @@
+import 'dart:io';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+enum AppIcon {
+ defaultIcon('default', 'Default', 'assets/komet_icon.png', 'DefaultIcon'),
+ minimal('minimal', 'Minimal', 'assets/meteor_icon.png', 'MinimalIcon');
+
+ final String id;
+ final String title;
+ final String previewAsset;
+ final String platformName;
+
+ const AppIcon(this.id, this.title, this.previewAsset, this.platformName);
+}
+
+class AppIconConfig {
+ static const prefKey = 'app_icon';
+ static const _channel = MethodChannel('ru.komet.app/app_icon');
+
+ static final ValueNotifier current = ValueNotifier(
+ AppIcon.defaultIcon,
+ );
+
+ static bool get isSupported => Platform.isAndroid || Platform.isIOS;
+
+ static Future load() async {
+ if (!isSupported) return;
+ final prefs = await SharedPreferences.getInstance();
+ final id = prefs.getString(prefKey);
+ current.value = _parse(id);
+ }
+
+ static Future apply(AppIcon icon) async {
+ if (!isSupported) return;
+ if (current.value == icon) return;
+ final prefs = await SharedPreferences.getInstance();
+ await prefs.setString(prefKey, icon.id);
+ current.value = icon;
+ await _channel.invokeMethod('setAppIcon', {
+ 'name': icon.platformName,
+ });
+ }
+
+ static AppIcon _parse(String? val) {
+ for (final icon in AppIcon.values) {
+ if (icon.id == val) return icon;
+ }
+ return AppIcon.defaultIcon;
+ }
+}
diff --git a/lib/frontend/screens/profile/app_icon_screen.dart b/lib/frontend/screens/profile/app_icon_screen.dart
new file mode 100644
index 0000000..4534725
--- /dev/null
+++ b/lib/frontend/screens/profile/app_icon_screen.dart
@@ -0,0 +1,169 @@
+import 'package:flutter/material.dart';
+import 'package:m3e_collection/m3e_collection.dart';
+import 'package:material_symbols_icons/symbols.dart';
+
+import '../../../core/config/app_icon.dart';
+import '../../../core/utils/haptics.dart';
+import '../../widgets/custom_notification.dart';
+
+class AppIconScreen extends StatefulWidget {
+ const AppIconScreen({super.key});
+
+ @override
+ State createState() => _AppIconScreenState();
+}
+
+class _AppIconScreenState extends State {
+ @override
+ void initState() {
+ super.initState();
+ AppIconConfig.load();
+ }
+
+ Future _select(AppIcon icon) async {
+ if (!AppIconConfig.isSupported) {
+ showCustomNotification(
+ context,
+ 'Смена иконки доступна только на Android и iOS',
+ );
+ return;
+ }
+ if (AppIconConfig.current.value == icon) return;
+ Haptics.selection();
+ try {
+ await AppIconConfig.apply(icon);
+ if (!mounted) return;
+ showCustomNotification(context, 'Иконка изменена на «${icon.title}»');
+ } catch (e) {
+ if (!mounted) return;
+ showCustomNotification(context, 'Не удалось сменить иконку: $e');
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final cs = Theme.of(context).colorScheme;
+ return Scaffold(
+ backgroundColor: cs.surface,
+ appBar: AppBarM3E(
+ titleText: 'Иконка приложения',
+ backgroundColor: cs.surface,
+ ),
+ body: SafeArea(
+ top: false,
+ child: ListView(
+ physics: const BouncingScrollPhysics(),
+ padding: const EdgeInsets.fromLTRB(16, 12, 16, 120),
+ children: [
+ Material(
+ color: cs.surfaceContainerHigh,
+ borderRadius: BorderRadius.circular(28),
+ child: Padding(
+ padding: const EdgeInsets.fromLTRB(20, 18, 20, 12),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Внешний вид иконки',
+ style: TextStyle(
+ color: cs.onSurface,
+ fontSize: 16,
+ fontWeight: FontWeight.w700,
+ ),
+ ),
+ const SizedBox(height: 4),
+ Text(
+ AppIconConfig.isSupported
+ ? 'На Android приложение закроется — лаунчер подхватит новую иконку. На iOS — мгновенно с системным диалогом.'
+ : 'Доступно только на Android и iOS',
+ style: TextStyle(
+ color: cs.onSurfaceVariant,
+ fontSize: 13,
+ height: 1.35,
+ ),
+ ),
+ const SizedBox(height: 12),
+ ValueListenableBuilder(
+ valueListenable: AppIconConfig.current,
+ builder: (context, current, _) {
+ return Column(
+ children: [
+ for (final icon in AppIcon.values)
+ _IconTile(
+ icon: icon,
+ selected: current == icon,
+ onTap: () => _select(icon),
+ ),
+ ],
+ );
+ },
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
+
+class _IconTile extends StatelessWidget {
+ final AppIcon icon;
+ final bool selected;
+ final VoidCallback onTap;
+
+ const _IconTile({
+ required this.icon,
+ required this.selected,
+ required this.onTap,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ final cs = Theme.of(context).colorScheme;
+ return Material(
+ color: Colors.transparent,
+ child: InkWell(
+ onTap: onTap,
+ borderRadius: BorderRadius.circular(16),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
+ child: Row(
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(14),
+ child: Image.asset(
+ icon.previewAsset,
+ width: 56,
+ height: 56,
+ fit: BoxFit.cover,
+ ),
+ ),
+ const SizedBox(width: 16),
+ Expanded(
+ child: Text(
+ icon.title,
+ style: TextStyle(
+ color: cs.onSurface,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ),
+ Icon(
+ selected
+ ? Symbols.radio_button_checked
+ : Symbols.radio_button_unchecked,
+ color: selected ? cs.primary : cs.outline,
+ size: 22,
+ fill: selected ? 1 : 0,
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/frontend/screens/profile/customization_screen.dart b/lib/frontend/screens/profile/customization_screen.dart
index aca2378..f2d2122 100644
--- a/lib/frontend/screens/profile/customization_screen.dart
+++ b/lib/frontend/screens/profile/customization_screen.dart
@@ -3,6 +3,7 @@ import 'package:m3e_collection/m3e_collection.dart';
import 'package:material_symbols_icons/symbols.dart';
import '../../../core/utils/haptics.dart';
+import 'app_icon_screen.dart';
import 'appearance_screen.dart';
import 'font_settings_screen.dart';
import 'message_actions_screen.dart';
@@ -50,6 +51,12 @@ class CustomizationScreen extends StatelessWidget {
subtitle: 'Радиальное или список — для долгого нажатия на сообщение',
builder: _buildMessageActions,
),
+ _CustomizationCategory(
+ icon: Symbols.apps,
+ title: 'Иконка приложения',
+ subtitle: 'Default или Minimal — иконка на главном экране',
+ builder: _buildAppIcon,
+ ),
];
static Widget _buildAppearance(BuildContext context) =>
@@ -64,6 +71,8 @@ class CustomizationScreen extends StatelessWidget {
static Widget _buildMessageActions(BuildContext context) =>
const MessageActionsScreen();
+ static Widget _buildAppIcon(BuildContext context) => const AppIconScreen();
+
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index a2ec33f..96d3fee 100644
--- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,68 +1,68 @@
{
- "images" : [
- {
- "size" : "16x16",
- "idiom" : "mac",
- "filename" : "app_icon_16.png",
- "scale" : "1x"
+ "info": {
+ "version": 1,
+ "author": "xcode"
},
- {
- "size" : "16x16",
- "idiom" : "mac",
- "filename" : "app_icon_32.png",
- "scale" : "2x"
- },
- {
- "size" : "32x32",
- "idiom" : "mac",
- "filename" : "app_icon_32.png",
- "scale" : "1x"
- },
- {
- "size" : "32x32",
- "idiom" : "mac",
- "filename" : "app_icon_64.png",
- "scale" : "2x"
- },
- {
- "size" : "128x128",
- "idiom" : "mac",
- "filename" : "app_icon_128.png",
- "scale" : "1x"
- },
- {
- "size" : "128x128",
- "idiom" : "mac",
- "filename" : "app_icon_256.png",
- "scale" : "2x"
- },
- {
- "size" : "256x256",
- "idiom" : "mac",
- "filename" : "app_icon_256.png",
- "scale" : "1x"
- },
- {
- "size" : "256x256",
- "idiom" : "mac",
- "filename" : "app_icon_512.png",
- "scale" : "2x"
- },
- {
- "size" : "512x512",
- "idiom" : "mac",
- "filename" : "app_icon_512.png",
- "scale" : "1x"
- },
- {
- "size" : "512x512",
- "idiom" : "mac",
- "filename" : "app_icon_1024.png",
- "scale" : "2x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
+ "images": [
+ {
+ "size": "16x16",
+ "idiom": "mac",
+ "filename": "app_icon_16.png",
+ "scale": "1x"
+ },
+ {
+ "size": "16x16",
+ "idiom": "mac",
+ "filename": "app_icon_32.png",
+ "scale": "2x"
+ },
+ {
+ "size": "32x32",
+ "idiom": "mac",
+ "filename": "app_icon_32.png",
+ "scale": "1x"
+ },
+ {
+ "size": "32x32",
+ "idiom": "mac",
+ "filename": "app_icon_64.png",
+ "scale": "2x"
+ },
+ {
+ "size": "128x128",
+ "idiom": "mac",
+ "filename": "app_icon_128.png",
+ "scale": "1x"
+ },
+ {
+ "size": "128x128",
+ "idiom": "mac",
+ "filename": "app_icon_256.png",
+ "scale": "2x"
+ },
+ {
+ "size": "256x256",
+ "idiom": "mac",
+ "filename": "app_icon_256.png",
+ "scale": "1x"
+ },
+ {
+ "size": "256x256",
+ "idiom": "mac",
+ "filename": "app_icon_512.png",
+ "scale": "2x"
+ },
+ {
+ "size": "512x512",
+ "idiom": "mac",
+ "filename": "app_icon_512.png",
+ "scale": "1x"
+ },
+ {
+ "size": "512x512",
+ "idiom": "mac",
+ "filename": "app_icon_1024.png",
+ "scale": "2x"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
index 82b6f9d..a8c3408 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
index 13b35eb..2af46a1 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
index 0a3f5fa..9f4a440 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
index bdb5722..7f51376 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
index f083318..6fe15ca 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
index 326c0e7..ac881d5 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
index 2f1632c..0447837 100644
Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/pubspec.lock b/pubspec.lock
index 79013ca..9d4e8db 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -97,6 +97,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.1"
+ checked_yaml:
+ dependency: transitive
+ description:
+ name: checked_yaml
+ sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.4"
+ cli_util:
+ dependency: transitive
+ description:
+ name: cli_util
+ sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.4.2"
clock:
dependency: transitive
description:
@@ -310,6 +326,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.4.1"
+ flutter_launcher_icons:
+ dependency: "direct dev"
+ description:
+ name: flutter_launcher_icons
+ sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.14.4"
flutter_lints:
dependency: "direct dev"
description:
@@ -453,6 +477,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.20.2"
+ json_annotation:
+ dependency: transitive
+ description:
+ name: json_annotation
+ sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.12.0"
leak_tracker:
dependency: transitive
description:
@@ -569,10 +601,10 @@ packages:
dependency: transitive
description:
name: meta
- sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
- version: "1.18.0"
+ version: "1.17.0"
mobile_scanner:
dependency: "direct main"
description:
@@ -950,10 +982,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
+ sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
- version: "0.7.11"
+ version: "0.7.10"
timezone:
dependency: "direct main"
description:
@@ -1006,10 +1038,10 @@ packages:
dependency: transitive
description:
name: video_player_android
- sha256: "5d18d04084cc0cfc7afde39d0a308d4041e8ae6e9d5255bc086c263998dd1201"
+ sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0"
url: "https://pub.dev"
source: hosted
- version: "2.9.6"
+ version: "2.9.5"
video_player_avfoundation:
dependency: transitive
description:
@@ -1091,5 +1123,5 @@ packages:
source: hosted
version: "3.1.3"
sdks:
- dart: ">=3.12.0 <4.0.0"
- flutter: ">=3.44.0"
+ dart: ">=3.10.4 <4.0.0"
+ flutter: ">=3.38.4"
diff --git a/pubspec.yaml b/pubspec.yaml
index 71436b0..ecc0898 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -74,6 +74,23 @@ dev_dependencies:
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^6.0.0
+ flutter_launcher_icons: ^0.14.4
+
+flutter_launcher_icons:
+ image_path: "assets/komet_icon.png"
+ android: "ic_launcher"
+ ios: true
+ remove_alpha_ios: true
+ background_color_ios: "#000000"
+ adaptive_icon_background: "#000000"
+ adaptive_icon_foreground: "assets/komet.png"
+ windows:
+ generate: true
+ image_path: "assets/komet_icon.png"
+ icon_size: 256
+ macos:
+ generate: true
+ image_path: "assets/komet_icon.png"
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
@@ -88,6 +105,8 @@ flutter:
uses-material-design: true
assets:
- assets/komet.png
+ - assets/komet_icon.png
+ - assets/meteor_icon.png
# To add assets to your application, add an assets section, like this:
# assets:
diff --git a/tool/make_icon_bg.dart b/tool/make_icon_bg.dart
new file mode 100644
index 0000000..9798f41
--- /dev/null
+++ b/tool/make_icon_bg.dart
@@ -0,0 +1,20 @@
+import 'dart:io';
+import 'package:image/image.dart' as img;
+
+const _pairs = {
+ 'assets/komet.png': 'assets/komet_icon.png',
+ 'assets/meteor.png': 'assets/meteor_icon.png',
+};
+
+void main() {
+ for (final entry in _pairs.entries) {
+ final src = img.decodePng(File(entry.key).readAsBytesSync())!;
+ final size = src.width > src.height ? src.width : src.height;
+ final canvas = img.Image(width: size, height: size, numChannels: 4);
+ img.fill(canvas, color: img.ColorRgb8(0, 0, 0));
+ img.compositeImage(canvas, src,
+ dstX: (size - src.width) ~/ 2, dstY: (size - src.height) ~/ 2);
+ File(entry.value).writeAsBytesSync(img.encodePng(canvas));
+ stdout.writeln('wrote ${entry.value} (${size}x$size)');
+ }
+}
diff --git a/tool/make_minimal_adaptive.dart b/tool/make_minimal_adaptive.dart
new file mode 100644
index 0000000..040739f
--- /dev/null
+++ b/tool/make_minimal_adaptive.dart
@@ -0,0 +1,27 @@
+import 'dart:io';
+import 'package:image/image.dart' as img;
+
+const _densities = {
+ 'mdpi': 108,
+ 'hdpi': 162,
+ 'xhdpi': 216,
+ 'xxhdpi': 324,
+ 'xxxhdpi': 432,
+};
+
+void main() {
+ final src = img.decodePng(File('assets/meteor.png').readAsBytesSync())!;
+ for (final entry in _densities.entries) {
+ final canvas =
+ img.Image(width: entry.value, height: entry.value, numChannels: 4);
+ final scaled = img.copyResize(src,
+ width: entry.value,
+ height: entry.value,
+ interpolation: img.Interpolation.cubic);
+ img.compositeImage(canvas, scaled);
+ final file = File(
+ 'android/app/src/main/res/drawable-${entry.key}/ic_launcher_minimal_foreground.png');
+ file.writeAsBytesSync(img.encodePng(canvas));
+ stdout.writeln('wrote ${file.path} (${entry.value}x${entry.value})');
+ }
+}
diff --git a/tool/make_minimal_android.dart b/tool/make_minimal_android.dart
new file mode 100644
index 0000000..eed4085
--- /dev/null
+++ b/tool/make_minimal_android.dart
@@ -0,0 +1,25 @@
+import 'dart:io';
+import 'package:image/image.dart' as img;
+
+const _densities = {
+ 'mdpi': 48,
+ 'hdpi': 72,
+ 'xhdpi': 96,
+ 'xxhdpi': 144,
+ 'xxxhdpi': 192,
+};
+
+void main() {
+ final src = img.decodePng(File('assets/meteor_icon.png').readAsBytesSync())!;
+ for (final entry in _densities.entries) {
+ final resized = img.copyResize(src,
+ width: entry.value,
+ height: entry.value,
+ interpolation: img.Interpolation.average);
+ final dir =
+ Directory('android/app/src/main/res/mipmap-${entry.key}');
+ final file = File('${dir.path}/ic_launcher_minimal.png');
+ file.writeAsBytesSync(img.encodePng(resized));
+ stdout.writeln('wrote ${file.path} (${entry.value}x${entry.value})');
+ }
+}
diff --git a/tool/make_minimal_ios.dart b/tool/make_minimal_ios.dart
new file mode 100644
index 0000000..cfd7db2
--- /dev/null
+++ b/tool/make_minimal_ios.dart
@@ -0,0 +1,19 @@
+import 'dart:io';
+import 'package:image/image.dart' as img;
+
+const _sizes = {
+ 'ios/Runner/MinimalIcon@2x.png': 120,
+ 'ios/Runner/MinimalIcon@3x.png': 180,
+};
+
+void main() {
+ final src = img.decodePng(File('assets/meteor_icon.png').readAsBytesSync())!;
+ for (final entry in _sizes.entries) {
+ final resized = img.copyResize(src,
+ width: entry.value,
+ height: entry.value,
+ interpolation: img.Interpolation.cubic);
+ File(entry.key).writeAsBytesSync(img.encodePng(resized));
+ stdout.writeln('wrote ${entry.key} (${entry.value}x${entry.value})');
+ }
+}
diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico
index c04e20c..630f63f 100644
Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ