From 69656e65c32251ed4e1260d5ddd47fc4f3210379 Mon Sep 17 00:00:00 2001 From: 1xFF <100185670+1xFF@users.noreply.github.com> Date: Sat, 24 Jun 2023 21:48:57 -0700 Subject: [PATCH 1/4] Basic OBB support --- lib/providers/apps_provider.dart | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index ee30f2c..10a8f8c 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -344,12 +344,14 @@ class AppsProvider with ChangeNotifier { {bool silent = false}) async { try { var somethingInstalled = false; - for (var apk in dir.extracted - .listSync() - .where((f) => f is File && f.path.toLowerCase().endsWith('.apk'))) { - somethingInstalled = somethingInstalled || - await installApk(DownloadedApk(dir.appId, apk as File), - silent: silent); + for (var file in dir.extracted.listSync(recursive: true, followLinks: true).whereType()) { + if (file.path.toLowerCase().endsWith('.apk')) { + somethingInstalled = somethingInstalled || + await installApk(DownloadedApk(dir.appId, file), silent: silent); + } + else if (file.path.toLowerCase().endsWith('.obb')) { + moveObbFile(file, dir.appId); + } } if (somethingInstalled) { dir.file.delete(recursive: true); @@ -388,6 +390,18 @@ class AppsProvider with ChangeNotifier { return installed; } + void moveObbFile(File file, String appId) async { + if(!file.path.toLowerCase().endsWith('.obb')) return; + + // REQUEST_INSTALL_PACKAGES is required to access Android/obb + // But it seems impossible to check if obb access has been explicitly granted + String obbDirPath = "/storage/emulated/0/Android/obb/$appId"; + Directory(obbDirPath).createSync(); + + String obbFileName = file.path.split("/").last; + await file.copy("$obbDirPath/$obbFileName"); + } + void uninstallApp(String appId) async { var intent = AndroidIntent( action: 'android.intent.action.DELETE', From e75ca05aa46cec1b5c363a40e385090759b044f8 Mon Sep 17 00:00:00 2001 From: 1xFF <100185670+1xFF@users.noreply.github.com> Date: Wed, 28 Jun 2023 02:50:18 -0700 Subject: [PATCH 2/4] Change recursion --- lib/providers/apps_provider.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 10a8f8c..60e0359 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -344,7 +344,7 @@ class AppsProvider with ChangeNotifier { {bool silent = false}) async { try { var somethingInstalled = false; - for (var file in dir.extracted.listSync(recursive: true, followLinks: true).whereType()) { + for (var file in dir.extracted.listSync(recursive: true, followLinks: false).whereType()) { if (file.path.toLowerCase().endsWith('.apk')) { somethingInstalled = somethingInstalled || await installApk(DownloadedApk(dir.appId, file), silent: silent); @@ -396,7 +396,7 @@ class AppsProvider with ChangeNotifier { // REQUEST_INSTALL_PACKAGES is required to access Android/obb // But it seems impossible to check if obb access has been explicitly granted String obbDirPath = "/storage/emulated/0/Android/obb/$appId"; - Directory(obbDirPath).createSync(); + Directory(obbDirPath).createSync(recursive: true); String obbFileName = file.path.split("/").last; await file.copy("$obbDirPath/$obbFileName"); From af5ea3db0fb913bb36a9e04bd22def6df9e5662b Mon Sep 17 00:00:00 2001 From: 1xFF <100185670+1xFF@users.noreply.github.com> Date: Wed, 28 Jun 2023 03:47:18 -0700 Subject: [PATCH 3/4] add Permissions for android 10 and below --- lib/providers/apps_provider.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 60e0359..fc00b8a 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -393,8 +393,11 @@ class AppsProvider with ChangeNotifier { void moveObbFile(File file, String appId) async { if(!file.path.toLowerCase().endsWith('.obb')) return; - // REQUEST_INSTALL_PACKAGES is required to access Android/obb - // But it seems impossible to check if obb access has been explicitly granted + // TODO: Does not support Android 11+ + if ((await DeviceInfoPlugin().androidInfo).version.sdkInt <= 29) { + await Permission.storage.request(); + } + String obbDirPath = "/storage/emulated/0/Android/obb/$appId"; Directory(obbDirPath).createSync(recursive: true); From 0fa0a4b19a0a53ac111dac67d714b90ded07d423 Mon Sep 17 00:00:00 2001 From: 1xFF <100185670+1xFF@users.noreply.github.com> Date: Wed, 28 Jun 2023 13:31:10 -0700 Subject: [PATCH 4/4] fix race condition --- lib/providers/apps_provider.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index fc00b8a..a81ec37 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -350,7 +350,7 @@ class AppsProvider with ChangeNotifier { await installApk(DownloadedApk(dir.appId, file), silent: silent); } else if (file.path.toLowerCase().endsWith('.obb')) { - moveObbFile(file, dir.appId); + await moveObbFile(file, dir.appId); } } if (somethingInstalled) { @@ -390,7 +390,7 @@ class AppsProvider with ChangeNotifier { return installed; } - void moveObbFile(File file, String appId) async { + Future moveObbFile(File file, String appId) async { if(!file.path.toLowerCase().endsWith('.obb')) return; // TODO: Does not support Android 11+