更改安卓端的文件访问方式,优化导入逻辑 (#64)

* Refactor import function & Allow import local comics without copying them to local path.

* android: use file_picker instead, support directory access for android 10

* Improve import logic

* Fix sql query.

* Add ability to remove invalid favorite items.

* Perform sort before choosing cover

* Revert changes of "use file_picker instead".

* Try catch on "check update"

* Added module 'flutter_saf'

* gitignore

* remove unsupported arch in build.gradle

* Use flutter_saf to handle android's directory and files, improve import logic.

* revert changes of 'requestLegacyExternalStorage'

* fix cbz import

* openDirectoryPlatform

* Remove double check on source folder

* use openFilePlatform

* remove unused import

* improve local comic's path handling

* bump version

* fix pubspec format

* return null when comic folder is empty
This commit is contained in:
pkuislm
2024-11-23 11:05:00 +08:00
committed by GitHub
parent c3474b1dff
commit a1474ca9c3
16 changed files with 369 additions and 253 deletions

View File

@@ -71,12 +71,13 @@ class LocalComic with HistoryMixin implements Comic {
downloadedChapters = List.from(jsonDecode(row[8] as String)),
createdAt = DateTime.fromMillisecondsSinceEpoch(row[9] as int);
File get coverFile => File(FilePath.join(
LocalManager().path,
directory,
File get coverFile => openFilePlatform(FilePath.join(
baseDir,
cover,
));
String get baseDir => directory.contains("/") ? directory : FilePath.join(LocalManager().path, directory);
@override
String get description => "";
@@ -341,12 +342,12 @@ class LocalManager with ChangeNotifier {
throw "Invalid ep";
}
var comic = find(id, type) ?? (throw "Comic Not Found");
var directory = Directory(FilePath.join(path, comic.directory));
var directory = openDirectoryPlatform(comic.baseDir);
if (comic.chapters != null) {
var cid = ep is int
? comic.chapters!.keys.elementAt(ep - 1)
: (ep as String);
directory = Directory(FilePath.join(directory.path, cid));
directory = openDirectoryPlatform(FilePath.join(directory.path, cid));
}
var files = <File>[];
await for (var entity in directory.list()) {
@@ -392,10 +393,10 @@ class LocalManager with ChangeNotifier {
String id, ComicType type, String name) async {
var comic = find(id, type);
if (comic != null) {
return Directory(FilePath.join(path, comic.directory));
return openDirectoryPlatform(FilePath.join(path, comic.directory));
}
var dir = findValidDirectoryName(path, name);
return Directory(FilePath.join(path, dir)).create().then((value) => value);
return openDirectoryPlatform(FilePath.join(path, dir)).create().then((value) => value);
}
void completeTask(DownloadTask task) {
@@ -454,7 +455,7 @@ class LocalManager with ChangeNotifier {
void deleteComic(LocalComic c, [bool removeFileOnDisk = true]) {
if(removeFileOnDisk) {
var dir = Directory(FilePath.join(path, c.directory));
var dir = openDirectoryPlatform(FilePath.join(path, c.directory));
dir.deleteIgnoreError(recursive: true);
}
//Deleting a local comic means that it's nolonger available, thus both favorite and history should be deleted.