style(dart): apply repository formatting

This commit is contained in:
zarzet
2026-07-29 14:14:42 +07:00
parent 5b45ef80bf
commit 1e973d5ecb
17 changed files with 231 additions and 183 deletions
+9 -6
View File
@@ -38,11 +38,11 @@ class ThemeSettings {
}
Map<String, dynamic> toJson() => {
kThemeModeKey: themeMode.name,
kUseDynamicColorKey: useDynamicColor,
kSeedColorKey: seedColorValue,
kUseAmoledKey: useAmoled,
};
kThemeModeKey: themeMode.name,
kUseDynamicColorKey: useDynamicColor,
kSeedColorKey: seedColorValue,
kUseAmoledKey: useAmoled,
};
factory ThemeSettings.fromJson(Map<String, dynamic> json) {
return ThemeSettings(
@@ -65,7 +65,10 @@ class ThemeSettings {
@override
int get hashCode =>
themeMode.hashCode ^ useDynamicColor.hashCode ^ seedColorValue.hashCode ^ useAmoled.hashCode;
themeMode.hashCode ^
useDynamicColor.hashCode ^
seedColorValue.hashCode ^
useAmoled.hashCode;
}
ThemeMode themeModeFromString(String? value) {
@@ -843,9 +843,7 @@ extension _DownloadQueueEmbedding on DownloadQueueNotifier {
);
embeddedNatively = response['method'] != 'ffmpeg';
} catch (e) {
_log.w(
'Native $format tag embed failed, falling back to FFmpeg: $e',
);
_log.w('Native $format tag embed failed, falling back to FFmpeg: $e');
}
}
@@ -1045,4 +1045,3 @@ final localLibraryFirstCoverProvider = FutureProvider.autoDispose
}
return null;
});
@@ -633,11 +633,7 @@ class _LibraryTracksFolderScreenState
color: Colors.black.withValues(alpha: 0.4),
shape: BoxShape.circle,
),
child: const Icon(
Icons.ios_share,
color: Colors.white,
size: 20,
),
child: const Icon(Icons.ios_share, color: Colors.white, size: 20),
),
onPressed: () => _exportAsM3u8(context, title, entries),
),
+9 -27
View File
@@ -39,9 +39,7 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
try {
final settings = ref.read(settingsProvider).toJson();
final history = await HistoryDatabase.instance.getAll();
final collectionsNotifier = ref.read(
libraryCollectionsProvider.notifier,
);
final collectionsNotifier = ref.read(libraryCollectionsProvider.notifier);
final collections = await collectionsNotifier.exportCollections();
final covers = await collectionsNotifier.exportPlaylistCovers();
final extensions = await ref
@@ -65,9 +63,7 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
);
} catch (e, stack) {
_log.e('Failed to create backup: $e', e, stack);
messenger.showSnackBar(
SnackBar(content: Text(l10n.backupCreateFailed)),
);
messenger.showSnackBar(SnackBar(content: Text(l10n.backupCreateFailed)));
} finally {
if (mounted) setState(() => _isExporting = false);
}
@@ -89,17 +85,13 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
content = await File(path).readAsString();
} catch (e) {
_log.e('Failed to read backup file: $e');
messenger.showSnackBar(
SnackBar(content: Text(l10n.backupInvalidFile)),
);
messenger.showSnackBar(SnackBar(content: Text(l10n.backupInvalidFile)));
return;
}
final bundle = BackupService.parse(content);
if (bundle == null) {
messenger.showSnackBar(
SnackBar(content: Text(l10n.backupInvalidFile)),
);
messenger.showSnackBar(SnackBar(content: Text(l10n.backupInvalidFile)));
return;
}
@@ -148,9 +140,7 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
);
} catch (e, stack) {
_log.e('Failed to restore backup: $e', e, stack);
messenger.showSnackBar(
SnackBar(content: Text(l10n.backupRestoreFailed)),
);
messenger.showSnackBar(SnackBar(content: Text(l10n.backupRestoreFailed)));
} finally {
if (mounted) setState(() => _isImporting = false);
}
@@ -201,16 +191,12 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
if (bundle.favoriteArtistCount > 0)
_ContentRow(
icon: Icons.person_outline,
label: l10n.backupContentsArtists(
bundle.favoriteArtistCount,
),
label: l10n.backupContentsArtists(bundle.favoriteArtistCount),
),
if (bundle.extensionCount > 0)
_ContentRow(
icon: Icons.extension_outlined,
label: l10n.backupContentsExtensions(
bundle.extensionCount,
),
label: l10n.backupContentsExtensions(bundle.extensionCount),
),
],
),
@@ -238,9 +224,7 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
slivers: [
SettingsSliverAppBar(title: l10n.backupTitle),
SliverToBoxAdapter(
child: SettingsSectionHeader(
title: l10n.backupExportSectionTitle,
),
child: SettingsSectionHeader(title: l10n.backupExportSectionTitle),
),
SliverToBoxAdapter(
child: SettingsGroup(
@@ -272,9 +256,7 @@ class _BackupRestorePageState extends ConsumerState<BackupRestorePage> {
),
),
SliverToBoxAdapter(
child: SettingsSectionHeader(
title: l10n.backupImportSectionTitle,
),
child: SettingsSectionHeader(title: l10n.backupImportSectionTitle),
),
SliverToBoxAdapter(
child: SettingsGroup(
@@ -1061,7 +1061,6 @@ class _ServiceChip extends StatelessWidget {
class _MetadataSourceSelector extends ConsumerWidget {
const _MetadataSourceSelector();
@override
Widget build(BuildContext context, WidgetRef ref) {
final colorScheme = Theme.of(context).colorScheme;
+2 -2
View File
@@ -224,7 +224,8 @@ extension _TrackMetadataCards on _TrackMetadataScreenState {
if (_displayAudioQuality != null &&
_displayAudioQuality!.isNotEmpty)
HeaderMetaItem(_displayAudioQuality!),
if (duration != null) HeaderMetaItem(formatClock(duration!)),
if (duration != null)
HeaderMetaItem(formatClock(duration!)),
if (_service != 'local')
HeaderMetaItem(
_service[0].toUpperCase() + _service.substring(1),
@@ -798,5 +799,4 @@ extension _TrackMetadataCards on _TrackMetadataScreenState {
),
);
}
}
+3 -3
View File
@@ -22,7 +22,7 @@ class ApkDownloader {
final client = http.Client();
IOSink? sink;
try {
final request = http.Request('GET', uri);
final response = await client.send(request);
@@ -33,7 +33,7 @@ class ApkDownloader {
}
final contentLength = response.contentLength ?? 0;
final dir = await getExternalStorageDirectory();
if (dir == null) {
_log.e('Could not get storage directory');
@@ -42,7 +42,7 @@ class ApkDownloader {
final filePath = '${dir.path}/SpotiFLAC-$version.apk';
final file = File(filePath);
if (await file.exists()) {
await file.delete();
}
+5 -4
View File
@@ -83,9 +83,7 @@ class M3uPlaylistService {
final track = entry.track;
final duration = track.duration > 0 ? track.duration : -1;
final artist = track.artistName.trim();
final display = artist.isEmpty
? track.name
: '$artist - ${track.name}';
final display = artist.isEmpty ? track.name : '$artist - ${track.name}';
buffer
..write('#EXTINF:')
..write(duration)
@@ -135,7 +133,10 @@ class M3uPlaylistService {
}
/// Writes the playlist to a shareable temp file named after the playlist.
static Future<File> writeExportFile(String playlistName, String content) async {
static Future<File> writeExportFile(
String playlistName,
String content,
) async {
final dir = await getTemporaryDirectory();
final safeName = playlistName
.replaceAll(RegExp(r'[\\/:*?"<>|]'), '_')
+2 -5
View File
@@ -477,9 +477,7 @@ class MusicPlayerHandler extends BaseAudioHandler
if (_restoringSession) return;
if (_media.isEmpty || _index < 0 || _index >= _media.length) {
unawaited(
AppStateDatabase.instance.clearPlaybackSession().catchError((
Object e,
) {
AppStateDatabase.instance.clearPlaybackSession().catchError((Object e) {
_log.w('Failed to clear playback session: $e');
}),
);
@@ -798,8 +796,7 @@ class MusicPlayerHandler extends BaseAudioHandler
}
if (_index >= 0 && _index < _media.length - 1) {
await _playIndex(_index + 1);
} else if (_repeatMode == AudioServiceRepeatMode.all &&
_media.isNotEmpty) {
} else if (_repeatMode == AudioServiceRepeatMode.all && _media.isNotEmpty) {
await _playIndex(0);
} else {
_broadcastState(playerState: PlayerState.completed);
+1 -4
View File
@@ -83,10 +83,7 @@ class UpdateChecker {
.timeout(const Duration(seconds: 10));
if (response.statusCode == 304 && cachedBody != null) {
await prefs.setInt(
_cachedAtKey,
DateTime.now().millisecondsSinceEpoch,
);
await prefs.setInt(_cachedAtKey, DateTime.now().millisecondsSinceEpoch);
return cachedBody;
}
if (response.statusCode != 200) {
+10 -7
View File
@@ -5,12 +5,10 @@ import 'package:spotiflac_android/providers/theme_provider.dart';
import 'package:spotiflac_android/theme/app_theme.dart';
class DynamicColorWrapper extends ConsumerWidget {
final Widget Function(ThemeData light, ThemeData dark, ThemeMode mode) builder;
final Widget Function(ThemeData light, ThemeData dark, ThemeMode mode)
builder;
const DynamicColorWrapper({
super.key,
required this.builder,
});
const DynamicColorWrapper({super.key, required this.builder});
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -21,7 +19,9 @@ class DynamicColorWrapper extends ConsumerWidget {
ColorScheme lightScheme;
ColorScheme darkScheme;
if (themeSettings.useDynamicColor && lightDynamic != null && darkDynamic != null) {
if (themeSettings.useDynamicColor &&
lightDynamic != null &&
darkDynamic != null) {
lightScheme = lightDynamic;
darkScheme = darkDynamic;
} else {
@@ -41,7 +41,10 @@ class DynamicColorWrapper extends ConsumerWidget {
}
final lightTheme = AppTheme.light(dynamicScheme: lightScheme);
final darkTheme = AppTheme.dark(dynamicScheme: darkScheme, isAmoled: themeSettings.useAmoled);
final darkTheme = AppTheme.dark(
dynamicScheme: darkScheme,
isAmoled: themeSettings.useAmoled,
);
return builder(lightTheme, darkTheme, themeSettings.themeMode);
},
+14 -22
View File
@@ -115,7 +115,10 @@ class LyricsParser {
if (idMatch != null) {
final key = idMatch.group(1)!.toLowerCase();
if (key == 'offset') {
final value = line.substring(line.indexOf(':') + 1).replaceAll(']', '').trim();
final value = line
.substring(line.indexOf(':') + 1)
.replaceAll(']', '')
.trim();
offsetMs = int.tryParse(value) ?? 0;
}
continue;
@@ -144,13 +147,7 @@ class LyricsParser {
for (final tm in timeMatches) {
final d = _toDuration(tm.group(1), tm.group(2), tm.group(3));
if (d == null) continue;
parsed.add(
LyricLine(
time: d,
text: cleanContent,
words: words,
),
);
parsed.add(LyricLine(time: d, text: cleanContent, words: words));
}
}
@@ -179,8 +176,10 @@ class LyricsParser {
text: l.text,
words: l.words
.map(
(w) =>
LyricWord(time: _shift(w.time, offsetMs), text: w.text),
(w) => LyricWord(
time: _shift(w.time, offsetMs),
text: w.text,
),
)
.toList(),
),
@@ -211,7 +210,9 @@ class LyricsParser {
final d = _toDuration(m.group(1), m.group(2), m.group(3));
if (d == null) continue;
final start = m.end;
final end = i + 1 < matches.length ? matches[i + 1].start : content.length;
final end = i + 1 < matches.length
? matches[i + 1].start
: content.length;
final word = content.substring(start, end);
if (word.trim().isEmpty) continue;
words.add(LyricWord(time: d, text: word));
@@ -253,12 +254,7 @@ class LyricsParser {
if (begin != null) {
lines.add(
LyricLine(
time: begin,
end: end,
text: lineText,
words: words,
),
LyricLine(time: begin, end: end, text: lineText, words: words),
);
}
}
@@ -301,11 +297,7 @@ class LyricsParser {
final h = int.parse(parts[0]);
final m = int.parse(parts[1]);
final s = double.parse(parts[2]);
return Duration(
hours: h,
minutes: m,
milliseconds: (s * 1000).round(),
);
return Duration(hours: h, minutes: m, milliseconds: (s * 1000).round());
} else if (parts.length == 2) {
final m = int.parse(parts[0]);
final s = double.parse(parts[1]);
+1 -5
View File
@@ -346,11 +346,7 @@ class _CollectionHeaderSkeleton extends StatelessWidget {
padding: const EdgeInsets.fromLTRB(24, 24, 24, 24),
child: Column(
children: [
SkeletonBox(
width: coverSize,
height: coverSize,
borderRadius: 16,
),
SkeletonBox(width: coverSize, height: coverSize, borderRadius: 16),
const SizedBox(height: 20),
SkeletonBox(width: screenWidth * 0.6, height: 22, borderRadius: 6),
const SizedBox(height: 10),
+168 -85
View File
@@ -8,10 +8,7 @@ class KofiIcon extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomPaint(
size: Size(size, size),
painter: _KofiPainter(color),
);
return CustomPaint(size: Size(size, size), painter: _KofiPainter(color));
}
}
@@ -54,8 +51,22 @@ class _KofiPainter extends CustomPainter {
final heart = Path()
..moveTo(hx, hy + hs * 0.3)
..cubicTo(hx - hs, hy - hs * 0.3, hx - hs * 0.5, hy - hs, hx, hy - hs * 0.4)
..cubicTo(hx + hs * 0.5, hy - hs, hx + hs, hy - hs * 0.3, hx, hy + hs * 0.3)
..cubicTo(
hx - hs,
hy - hs * 0.3,
hx - hs * 0.5,
hy - hs,
hx,
hy - hs * 0.4,
)
..cubicTo(
hx + hs * 0.5,
hy - hs,
hx + hs,
hy - hs * 0.3,
hx,
hy + hs * 0.3,
)
..close();
canvas.drawPath(heart, heartPaint);
@@ -86,10 +97,7 @@ class GitHubIcon extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomPaint(
size: Size(size, size),
painter: _GitHubPainter(color),
);
return CustomPaint(size: Size(size, size), painter: _GitHubPainter(color));
}
}
@@ -109,129 +117,204 @@ class _GitHubPainter extends CustomPainter {
final path = Path();
path.moveTo(12 * scale, 0.5 * scale);
path.cubicTo(
5.37 * scale, 0.5 * scale,
0 * scale, 5.87 * scale,
0 * scale, 12.5 * scale,
5.37 * scale,
0.5 * scale,
0 * scale,
5.87 * scale,
0 * scale,
12.5 * scale,
);
path.cubicTo(
0 * scale, 17.78 * scale,
3.44 * scale, 22.27 * scale,
8.21 * scale, 23.85 * scale,
0 * scale,
17.78 * scale,
3.44 * scale,
22.27 * scale,
8.21 * scale,
23.85 * scale,
);
path.cubicTo(
8.81 * scale, 23.96 * scale,
9.02 * scale, 23.59 * scale,
9.02 * scale, 23.27 * scale,
8.81 * scale,
23.96 * scale,
9.02 * scale,
23.59 * scale,
9.02 * scale,
23.27 * scale,
);
path.cubicTo(
9.02 * scale, 22.98 * scale,
9.01 * scale, 22.01 * scale,
9.01 * scale, 21.01 * scale,
9.02 * scale,
22.98 * scale,
9.01 * scale,
22.01 * scale,
9.01 * scale,
21.01 * scale,
);
path.cubicTo(
5.67 * scale, 21.71 * scale,
4.97 * scale, 19.56 * scale,
4.97 * scale, 19.56 * scale,
5.67 * scale,
21.71 * scale,
4.97 * scale,
19.56 * scale,
4.97 * scale,
19.56 * scale,
);
path.cubicTo(
4.42 * scale, 18.22 * scale,
3.63 * scale, 17.85 * scale,
3.63 * scale, 17.85 * scale,
4.42 * scale,
18.22 * scale,
3.63 * scale,
17.85 * scale,
3.63 * scale,
17.85 * scale,
);
path.cubicTo(
2.55 * scale, 17.12 * scale,
3.71 * scale, 17.13 * scale,
3.71 * scale, 17.13 * scale,
2.55 * scale,
17.12 * scale,
3.71 * scale,
17.13 * scale,
3.71 * scale,
17.13 * scale,
);
path.cubicTo(
4.90 * scale, 17.22 * scale,
5.53 * scale, 18.36 * scale,
5.53 * scale, 18.36 * scale,
4.90 * scale,
17.22 * scale,
5.53 * scale,
18.36 * scale,
5.53 * scale,
18.36 * scale,
);
path.cubicTo(
6.58 * scale, 20.05 * scale,
8.36 * scale, 19.53 * scale,
9.05 * scale, 19.22 * scale,
6.58 * scale,
20.05 * scale,
8.36 * scale,
19.53 * scale,
9.05 * scale,
19.22 * scale,
);
path.cubicTo(
9.16 * scale, 18.45 * scale,
9.47 * scale, 17.93 * scale,
9.81 * scale, 17.63 * scale,
9.16 * scale,
18.45 * scale,
9.47 * scale,
17.93 * scale,
9.81 * scale,
17.63 * scale,
);
path.cubicTo(
7.15 * scale, 17.33 * scale,
4.34 * scale, 16.33 * scale,
4.34 * scale, 11.93 * scale,
7.15 * scale,
17.33 * scale,
4.34 * scale,
16.33 * scale,
4.34 * scale,
11.93 * scale,
);
path.cubicTo(
4.34 * scale, 10.68 * scale,
4.81 * scale, 9.66 * scale,
5.55 * scale, 8.86 * scale,
4.34 * scale,
10.68 * scale,
4.81 * scale,
9.66 * scale,
5.55 * scale,
8.86 * scale,
);
path.cubicTo(
5.43 * scale, 8.56 * scale,
5.02 * scale, 7.40 * scale,
5.67 * scale, 5.82 * scale,
5.43 * scale,
8.56 * scale,
5.02 * scale,
7.40 * scale,
5.67 * scale,
5.82 * scale,
);
path.cubicTo(
5.67 * scale, 5.82 * scale,
6.66 * scale, 5.50 * scale,
8.98 * scale, 6.99 * scale,
5.67 * scale,
5.82 * scale,
6.66 * scale,
5.50 * scale,
8.98 * scale,
6.99 * scale,
);
path.cubicTo(
9.94 * scale, 6.72 * scale,
10.98 * scale, 6.59 * scale,
12.0 * scale, 6.58 * scale,
9.94 * scale,
6.72 * scale,
10.98 * scale,
6.59 * scale,
12.0 * scale,
6.58 * scale,
);
path.cubicTo(
13.02 * scale, 6.59 * scale,
14.06 * scale, 6.72 * scale,
15.02 * scale, 6.99 * scale,
13.02 * scale,
6.59 * scale,
14.06 * scale,
6.72 * scale,
15.02 * scale,
6.99 * scale,
);
path.cubicTo(
17.34 * scale, 5.50 * scale,
18.33 * scale, 5.82 * scale,
18.33 * scale, 5.82 * scale,
17.34 * scale,
5.50 * scale,
18.33 * scale,
5.82 * scale,
18.33 * scale,
5.82 * scale,
);
path.cubicTo(
18.98 * scale, 7.40 * scale,
18.57 * scale, 8.56 * scale,
18.45 * scale, 8.86 * scale,
18.98 * scale,
7.40 * scale,
18.57 * scale,
8.56 * scale,
18.45 * scale,
8.86 * scale,
);
path.cubicTo(
19.19 * scale, 9.66 * scale,
19.66 * scale, 10.68 * scale,
19.66 * scale, 11.93 * scale,
19.19 * scale,
9.66 * scale,
19.66 * scale,
10.68 * scale,
19.66 * scale,
11.93 * scale,
);
path.cubicTo(
19.66 * scale, 16.34 * scale,
16.84 * scale, 17.32 * scale,
14.17 * scale, 17.62 * scale,
19.66 * scale,
16.34 * scale,
16.84 * scale,
17.32 * scale,
14.17 * scale,
17.62 * scale,
);
path.cubicTo(
14.59 * scale, 17.99 * scale,
14.97 * scale, 18.70 * scale,
14.97 * scale, 19.80 * scale,
14.59 * scale,
17.99 * scale,
14.97 * scale,
18.70 * scale,
14.97 * scale,
19.80 * scale,
);
path.cubicTo(
14.97 * scale, 21.40 * scale,
14.95 * scale, 22.67 * scale,
14.95 * scale, 23.27 * scale,
14.97 * scale,
21.40 * scale,
14.95 * scale,
22.67 * scale,
14.95 * scale,
23.27 * scale,
);
path.cubicTo(
14.95 * scale, 23.60 * scale,
15.16 * scale, 23.97 * scale,
15.77 * scale, 23.85 * scale,
14.95 * scale,
23.60 * scale,
15.16 * scale,
23.97 * scale,
15.77 * scale,
23.85 * scale,
);
path.cubicTo(
20.55 * scale, 22.26 * scale,
24.0 * scale, 17.78 * scale,
24.0 * scale, 12.5 * scale,
20.55 * scale,
22.26 * scale,
24.0 * scale,
17.78 * scale,
24.0 * scale,
12.5 * scale,
);
path.cubicTo(
24.0 * scale, 5.87 * scale,
18.63 * scale, 0.5 * scale,
12.0 * scale, 0.5 * scale,
24.0 * scale,
5.87 * scale,
18.63 * scale,
0.5 * scale,
12.0 * scale,
0.5 * scale,
);
path.close();
+3 -2
View File
@@ -132,8 +132,9 @@ class OpenOnPlatformSheet extends StatelessWidget {
padding: const EdgeInsets.fromLTRB(24, 8, 24, 32),
child: Text(
context.l10n.trackOpenOnNoLinks,
style: Theme.of(context).textTheme.bodyMedium
?.copyWith(color: colorScheme.onSurfaceVariant),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: colorScheme.onSurfaceVariant,
),
),
);
}
+2 -1
View File
@@ -29,7 +29,8 @@ class SettingsSliverAppBar extends StatelessWidget {
pinned: true,
backgroundColor: colorScheme.surface,
surfaceTintColor: Colors.transparent,
leading: leading ??
leading:
leading ??
IconButton(
tooltip: MaterialLocalizations.of(context).backButtonTooltip,
icon: const Icon(Icons.arrow_back),