feat: sincronizar cor do tema via account data da conta Matrix

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
This commit is contained in:
2026-09-25 12:53:21 -03:00
parent 7534ecf7d1
commit 058926cf6f
6 changed files with 262 additions and 49 deletions

View File

@@ -10,6 +10,7 @@ import 'package:tatchat/utils/file_selector.dart';
import 'package:tatchat/widgets/future_loading_dialog.dart';
import 'package:tatchat/widgets/theme_builder.dart';
import 'package:material_ui/material_ui.dart';
import 'package:matrix/matrix.dart';
import '../../widgets/matrix.dart';
import 'settings_style_view.dart';
@@ -22,11 +23,18 @@ class SettingsStyle extends StatefulWidget {
}
class SettingsStyleController extends State<SettingsStyle> {
void setChatColor(Color? color) {
Future<void> setChatColor(Color? color) async {
final client = Matrix.of(context).client;
final themeController = ThemeController.of(context);
AppSettings.colorSchemeSeedInt.setItem(
color?.toARGB32() ?? AppSettings.colorSchemeSeedInt.defaultValue,
);
ThemeController.of(context).setPrimaryColor(color);
await themeController.setPrimaryColor(color);
try {
await client.setApplicationAccountColor(color?.toARGB32());
} catch (e, s) {
Logs().e('Unable to save chat color', e, s);
}
}
Future<void> setWallpaper() async {
@@ -105,12 +113,19 @@ class SettingsStyleController extends State<SettingsStyle> {
});
}
void deleteChatWallpaper() => showFutureLoadingDialog(
context: context,
future: () => Matrix.of(context).client.setApplicationAccountConfig(
const ApplicationAccountConfig(wallpaperUrl: null, wallpaperBlur: null),
),
);
void deleteChatWallpaper() {
final client = Matrix.of(context).client;
showFutureLoadingDialog(
context: context,
future: () => client.setApplicationAccountConfig(
ApplicationAccountConfig(
wallpaperUrl: null,
wallpaperBlur: null,
primaryColor: client.applicationAccountConfig.primaryColor,
),
),
);
}
ThemeMode get currentTheme => ThemeController.of(context).themeMode;
Color? get currentColor => ThemeController.of(context).primaryColor;