Files
sevenhill f74057ce9b
Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
Rebrand application as Qlyra
2026-08-30 13:16:17 +03:00

89 lines
2.1 KiB
Dart

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/qlyra_icon.png',
'MainActivity',
null,
),
minimal(
'minimal',
'Minimal',
'assets/meteor_icon.png',
'MinimalIcon',
'MinimalIcon',
);
final String id;
final String title;
final String previewAsset;
final String androidAlias;
final String? iosAlternateName;
const AppIcon(
this.id,
this.title,
this.previewAsset,
this.androidAlias,
this.iosAlternateName,
);
}
class AppIconConfig {
static const prefKey = 'app_icon';
static const _channel = MethodChannel('ru.qlyra.app/app_icon');
static final ValueNotifier<AppIcon> current = ValueNotifier(
AppIcon.defaultIcon,
);
static bool get isSupported => Platform.isAndroid || Platform.isIOS;
static Future<void> load() async {
if (!isSupported) return;
final prefs = await SharedPreferences.getInstance();
var icon = _parse(prefs.getString(prefKey));
final applied = await _appliedIcon();
if (applied != null && applied != icon) {
icon = applied;
await prefs.setString(prefKey, icon.id);
}
current.value = icon;
}
static Future<void> apply(AppIcon icon) async {
if (!isSupported) return;
if (current.value == icon) return;
await _channel.invokeMethod<void>('setAppIcon', {
'name': Platform.isIOS ? icon.iosAlternateName : icon.androidAlias,
});
final prefs = await SharedPreferences.getInstance();
await prefs.setString(prefKey, icon.id);
current.value = icon;
}
static Future<AppIcon?> _appliedIcon() async {
if (!Platform.isIOS) return null;
try {
final name = await _channel.invokeMethod<String>('getAppIcon');
for (final icon in AppIcon.values) {
if (icon.iosAlternateName == name) return icon;
}
} catch (_) {}
return null;
}
static AppIcon _parse(String? val) {
for (final icon in AppIcon.values) {
if (icon.id == val) return icon;
}
return AppIcon.defaultIcon;
}
}