A cor escolhida no Appearance passa a ser guardada em im.fluffychat.account_config (primary_color), em vez de apenas nas preferencias locais do dispositivo. - ApplicationAccountConfig ganha primaryColor, preservado em updateApplicationAccountConfig e no novo setApplicationAccountColor - ThemeController restaura a cor da conta activa, aguarda accountDataLoading e reage a alteracoes remotas via onSync - A cor final e derivada de _accountPrimaryColor ?? _localPrimaryColor, evitando corrida entre as preferencias locais e o sync - Matrix notifica a troca de conta activa em initMatrix, setActiveClient e logout, corrigindo o indice do cliente activo - Apagar o wallpaper preserva a cor; testes de serializacao do modelo
86 lines
2.8 KiB
Dart
86 lines
2.8 KiB
Dart
// SPDX-FileCopyrightText: 2019-Present Christian Kußowski
|
|
// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
extension ApplicationAccountConfigExtension on Client {
|
|
static const String accountDataKey = 'im.fluffychat.account_config';
|
|
|
|
ApplicationAccountConfig get applicationAccountConfig =>
|
|
ApplicationAccountConfig.fromJson(
|
|
accountData[accountDataKey]?.content ?? {},
|
|
);
|
|
|
|
Future<void> setApplicationAccountConfig(ApplicationAccountConfig config) =>
|
|
setAccountData(userID!, accountDataKey, config.toJson());
|
|
|
|
/// Only updates the specified values in ApplicationAccountConfig
|
|
Future<void> updateApplicationAccountConfig(ApplicationAccountConfig config) {
|
|
final currentConfig = applicationAccountConfig;
|
|
return setAccountData(
|
|
userID!,
|
|
accountDataKey,
|
|
ApplicationAccountConfig(
|
|
wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl,
|
|
wallpaperOpacity:
|
|
config.wallpaperOpacity ?? currentConfig.wallpaperOpacity,
|
|
wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur,
|
|
primaryColor: config.primaryColor ?? currentConfig.primaryColor,
|
|
).toJson(),
|
|
);
|
|
}
|
|
|
|
Future<void> setApplicationAccountColor(int? primaryColor) {
|
|
final currentConfig = applicationAccountConfig;
|
|
return setApplicationAccountConfig(
|
|
ApplicationAccountConfig(
|
|
wallpaperUrl: currentConfig.wallpaperUrl,
|
|
wallpaperOpacity: currentConfig.wallpaperOpacity,
|
|
wallpaperBlur: currentConfig.wallpaperBlur,
|
|
primaryColor: primaryColor,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class ApplicationAccountConfig {
|
|
final Uri? wallpaperUrl;
|
|
final double? wallpaperOpacity;
|
|
final double? wallpaperBlur;
|
|
final int? primaryColor;
|
|
|
|
const ApplicationAccountConfig({
|
|
this.wallpaperUrl,
|
|
this.wallpaperOpacity,
|
|
this.wallpaperBlur,
|
|
this.primaryColor,
|
|
});
|
|
|
|
static double _sanitizedOpacity(double? opacity) {
|
|
if (opacity == null) return 1;
|
|
if (opacity > 1 || opacity < 0) return 1;
|
|
return opacity;
|
|
}
|
|
|
|
factory ApplicationAccountConfig.fromJson(Map<String, dynamic> json) =>
|
|
ApplicationAccountConfig(
|
|
wallpaperUrl: json['wallpaper_url'] is String
|
|
? Uri.tryParse(json['wallpaper_url'])
|
|
: null,
|
|
wallpaperOpacity: _sanitizedOpacity(
|
|
json.tryGet<double>('wallpaper_opacity'),
|
|
),
|
|
wallpaperBlur: json.tryGet<double>('wallpaper_blur'),
|
|
primaryColor: json.tryGet<int>('primary_color'),
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'wallpaper_url': wallpaperUrl?.toString(),
|
|
'wallpaper_opacity': wallpaperOpacity,
|
|
'wallpaper_blur': wallpaperBlur,
|
|
'primary_color': primaryColor,
|
|
};
|
|
}
|