diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index ee30f2c..a81ec37 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: false).whereType()) { + if (file.path.toLowerCase().endsWith('.apk')) { + somethingInstalled = somethingInstalled || + await installApk(DownloadedApk(dir.appId, file), silent: silent); + } + else if (file.path.toLowerCase().endsWith('.obb')) { + await moveObbFile(file, dir.appId); + } } if (somethingInstalled) { dir.file.delete(recursive: true); @@ -388,6 +390,21 @@ class AppsProvider with ChangeNotifier { return installed; } + Future moveObbFile(File file, String appId) async { + if(!file.path.toLowerCase().endsWith('.obb')) return; + + // 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); + + String obbFileName = file.path.split("/").last; + await file.copy("$obbDirPath/$obbFileName"); + } + void uninstallApp(String appId) async { var intent = AndroidIntent( action: 'android.intent.action.DELETE',