feat(android13): make All Files Access optional

- Android 13+ now only requires READ_MEDIA_AUDIO by default
- MANAGE_EXTERNAL_STORAGE is optional and can be enabled in Settings
- Added 'All Files Access' toggle in Download Settings (Android 13+ only)
- Users who encounter write errors can enable full storage access
- Respects privacy-conscious users who prefer limited permissions
This commit is contained in:
zarzet
2026-01-31 14:08:59 +07:00
parent 020ac32ee6
commit 9bbd774175
20 changed files with 526 additions and 42 deletions
+4
View File
@@ -35,6 +35,7 @@ class AppSettings {
final String lossyFormat;
final String lossyBitrate; // e.g., 'mp3_320', 'mp3_256', 'mp3_192', 'mp3_128', 'opus_128', 'opus_96', 'opus_64'
final String lyricsMode;
final bool useAllFilesAccess; // Android 13+ only: enable MANAGE_EXTERNAL_STORAGE
const AppSettings({
this.defaultService = 'tidal',
@@ -68,6 +69,7 @@ class AppSettings {
this.lossyFormat = 'mp3',
this.lossyBitrate = 'mp3_320',
this.lyricsMode = 'embed',
this.useAllFilesAccess = false,
});
AppSettings copyWith({
@@ -103,6 +105,7 @@ class AppSettings {
String? lossyFormat,
String? lossyBitrate,
String? lyricsMode,
bool? useAllFilesAccess,
}) {
return AppSettings(
defaultService: defaultService ?? this.defaultService,
@@ -136,6 +139,7 @@ class AppSettings {
lossyFormat: lossyFormat ?? this.lossyFormat,
lossyBitrate: lossyBitrate ?? this.lossyBitrate,
lyricsMode: lyricsMode ?? this.lyricsMode,
useAllFilesAccess: useAllFilesAccess ?? this.useAllFilesAccess,
);
}
+2
View File
@@ -40,6 +40,7 @@ AppSettings _$AppSettingsFromJson(Map<String, dynamic> json) => AppSettings(
lossyFormat: json['lossyFormat'] as String? ?? 'mp3',
lossyBitrate: json['lossyBitrate'] as String? ?? 'mp3_320',
lyricsMode: json['lyricsMode'] as String? ?? 'embed',
useAllFilesAccess: json['useAllFilesAccess'] as bool? ?? false,
);
Map<String, dynamic> _$AppSettingsToJson(AppSettings instance) =>
@@ -75,4 +76,5 @@ Map<String, dynamic> _$AppSettingsToJson(AppSettings instance) =>
'lossyFormat': instance.lossyFormat,
'lossyBitrate': instance.lossyBitrate,
'lyricsMode': instance.lyricsMode,
'useAllFilesAccess': instance.useAllFilesAccess,
};