mirror of
https://github.com/revanced/revanced-manager
synced 2024-05-14 13:56:57 +02:00
feat: Adding support for Exporting APK (#439)
* feat: Adding Export APK support * Using cr_file_saver to simplify export
This commit is contained in:
parent
6b999b0a0c
commit
dc47da75f2
@ -96,6 +96,7 @@
|
|||||||
"notificationTitle": "ReVanced Manager is patching",
|
"notificationTitle": "ReVanced Manager is patching",
|
||||||
"notificationText": "Tap to return to the installer",
|
"notificationText": "Tap to return to the installer",
|
||||||
"shareApkMenuOption": "Share APK",
|
"shareApkMenuOption": "Share APK",
|
||||||
|
"exportApkMenuOption": "Export APK",
|
||||||
"shareLogMenuOption": "Share log",
|
"shareLogMenuOption": "Share log",
|
||||||
"installErrorDialogTitle": "Error",
|
"installErrorDialogTitle": "Error",
|
||||||
"installErrorDialogText1": "Root install is not possible with the current patches selection.\nRepatch your app or choose non-root install.",
|
"installErrorDialogText1": "Root install is not possible with the current patches selection.\nRepatch your app or choose non-root install.",
|
||||||
|
@ -12,6 +12,7 @@ import 'package:revanced_manager/services/manager_api.dart';
|
|||||||
import 'package:revanced_manager/services/root_api.dart';
|
import 'package:revanced_manager/services/root_api.dart';
|
||||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||||
import 'package:share_extend/share_extend.dart';
|
import 'package:share_extend/share_extend.dart';
|
||||||
|
import 'package:cr_file_saver/file_saver.dart';
|
||||||
|
|
||||||
@lazySingleton
|
@lazySingleton
|
||||||
class PatcherAPI {
|
class PatcherAPI {
|
||||||
@ -228,11 +229,32 @@ class PatcherAPI {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void exportPatchedFile(String appName, String version) {
|
||||||
|
try {
|
||||||
|
if (_outFile != null) {
|
||||||
|
String newName = _getFileName(appName, version);
|
||||||
|
|
||||||
|
// This is temporary workaround to populate initial file name
|
||||||
|
// ref: https://github.com/Cleveroad/cr_file_saver/issues/7
|
||||||
|
int lastSeparator = _outFile!.path.lastIndexOf('/');
|
||||||
|
String newSourcePath = _outFile!.path.substring(0, lastSeparator + 1) + newName;
|
||||||
|
_outFile!.copySync(newSourcePath);
|
||||||
|
|
||||||
|
CRFileSaver.saveFileWithDialog(SaveFileDialogParams(
|
||||||
|
sourceFilePath: newSourcePath,
|
||||||
|
destinationFileName: newName
|
||||||
|
));
|
||||||
|
}
|
||||||
|
} on Exception catch (e, s) {
|
||||||
|
Sentry.captureException(e, stackTrace: s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sharePatchedFile(String appName, String version) {
|
void sharePatchedFile(String appName, String version) {
|
||||||
try {
|
try {
|
||||||
if (_outFile != null) {
|
if (_outFile != null) {
|
||||||
String prefix = appName.toLowerCase().replaceAll(' ', '-');
|
String newName = _getFileName(appName, version);
|
||||||
String newName = '$prefix-revanced_v$version.apk';
|
|
||||||
int lastSeparator = _outFile!.path.lastIndexOf('/');
|
int lastSeparator = _outFile!.path.lastIndexOf('/');
|
||||||
String newPath =
|
String newPath =
|
||||||
_outFile!.path.substring(0, lastSeparator + 1) + newName;
|
_outFile!.path.substring(0, lastSeparator + 1) + newName;
|
||||||
@ -244,6 +266,13 @@ class PatcherAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _getFileName(String appName, String version) {
|
||||||
|
String prefix = appName.toLowerCase().replaceAll(' ', '-');
|
||||||
|
String newName = '$prefix-revanced_v$version.apk';
|
||||||
|
return newName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> sharePatcherLog(String logs) async {
|
Future<void> sharePatcherLog(String logs) async {
|
||||||
Directory appCache = await getTemporaryDirectory();
|
Directory appCache = await getTemporaryDirectory();
|
||||||
Directory logDir = Directory('${appCache.path}/logs');
|
Directory logDir = Directory('${appCache.path}/logs');
|
||||||
|
@ -49,6 +49,15 @@ class InstallerView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
1: I18nText(
|
1: I18nText(
|
||||||
|
'installerView.exportApkMenuOption',
|
||||||
|
child: const Text(
|
||||||
|
'',
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
2: I18nText(
|
||||||
'installerView.shareLogMenuOption',
|
'installerView.shareLogMenuOption',
|
||||||
child: const Text(
|
child: const Text(
|
||||||
'',
|
'',
|
||||||
|
@ -217,6 +217,14 @@ class InstallerViewModel extends BaseViewModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exportResult() {
|
||||||
|
try {
|
||||||
|
_patcherAPI.exportPatchedFile(_app.name, _app.version);
|
||||||
|
} on Exception catch (e, s) {
|
||||||
|
Sentry.captureException(e, stackTrace: s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void shareResult() {
|
void shareResult() {
|
||||||
try {
|
try {
|
||||||
_patcherAPI.sharePatchedFile(_app.name, _app.version);
|
_patcherAPI.sharePatchedFile(_app.name, _app.version);
|
||||||
@ -250,6 +258,9 @@ class InstallerViewModel extends BaseViewModel {
|
|||||||
shareResult();
|
shareResult();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
exportResult();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
shareLog();
|
shareLog();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ dependencies:
|
|||||||
app_installer: ^1.1.0
|
app_installer: ^1.1.0
|
||||||
collection: ^1.16.0
|
collection: ^1.16.0
|
||||||
cross_connectivity: ^3.0.5
|
cross_connectivity: ^3.0.5
|
||||||
|
cr_file_saver: ^0.0.1+2
|
||||||
device_apps:
|
device_apps:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/ponces/flutter_plugin_device_apps
|
url: https://github.com/ponces/flutter_plugin_device_apps
|
||||||
|
Loading…
Reference in New Issue
Block a user