feat: usar a cor escolhida tal e qual e opcao de suavizar

- TatuPalette.scheme aceita softenPrimary e passa a usar a seed como primary, onPrimary por contraste e surfaceTint, em vez da paleta tonal do Material 3
- nova opcao AppSettings.softenThemeColor (default false, ou seja cor exacta)
- interruptor 'Suavizar cor do tema' em Configuracoes > Aparencia, com l10n en/pt
- a opcao e sincronizada via account data (soften_theme_color) e mantida localmente como fallback, tal como a cor do tema
- setApplicationAccountColor e updateApplicationAccountConfig preservam o novo campo
- um unico sync de account data actualiza cor e opcao
- testes de serializacao e round-trip para o novo campo
This commit is contained in:
2026-09-25 13:46:00 -03:00
parent 6f32eb8972
commit 9382a1f946
11 changed files with 171 additions and 13 deletions

View File

@@ -47,12 +47,14 @@ void main() {
wallpaperOpacity: 0.3,
wallpaperBlur: 4,
primaryColor: 0xFF6750A4,
softenThemeColor: true,
);
final parsed = ApplicationAccountConfig.fromJson(config.toJson());
expect(parsed.wallpaperUrl, config.wallpaperUrl);
expect(parsed.wallpaperOpacity, config.wallpaperOpacity);
expect(parsed.wallpaperBlur, config.wallpaperBlur);
expect(parsed.primaryColor, config.primaryColor);
expect(parsed.softenThemeColor, config.softenThemeColor);
});
test('Keeps existing wallpaper defaults when parsing color only', () {
@@ -63,5 +65,50 @@ void main() {
expect(config.wallpaperOpacity, 1);
expect(config.wallpaperBlur, isNull);
});
test('Parses soften theme color from account data', () {
expect(
ApplicationAccountConfig.fromJson({
'soften_theme_color': true,
}).softenThemeColor,
isTrue,
);
expect(
ApplicationAccountConfig.fromJson({
'soften_theme_color': false,
}).softenThemeColor,
isFalse,
);
});
test('Ignores soften theme color of unexpected type', () {
expect(
ApplicationAccountConfig.fromJson({
'soften_theme_color': 'yes',
}).softenThemeColor,
isNull,
);
});
test('Defaults soften theme color to null when absent', () {
expect(ApplicationAccountConfig.fromJson({}).softenThemeColor, isNull);
});
test('Serializes soften theme color', () {
const config = ApplicationAccountConfig(softenThemeColor: true);
expect(config.toJson()['soften_theme_color'], true);
});
test('Serializes missing soften theme color as null', () {
const config = ApplicationAccountConfig(primaryColor: 0xFF00D084);
expect(config.toJson()['soften_theme_color'], isNull);
});
test('Round trips soften theme color through json', () {
final parsed = ApplicationAccountConfig.fromJson(
const ApplicationAccountConfig(softenThemeColor: true).toJson(),
);
expect(parsed.softenThemeColor, isTrue);
});
});
}