fix: code refactoring (#5)

This commit is contained in:
Alberto Ponces
2022-08-18 15:33:33 +01:00
committed by GitHub
parent 6153e1f9e8
commit 389eae1447
31 changed files with 318 additions and 361 deletions

View File

@ -1,32 +1,36 @@
import 'dart:io';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:github/github.dart';
import 'package:injectable/injectable.dart';
import 'package:revanced_manager/models/patched_application.dart';
import 'package:timeago/timeago.dart';
@lazySingleton
class GithubAPI {
var github = GitHub();
final GitHub _github = GitHub();
Future<String?> latestRelease(String org, repoName) async {
Future<File?> latestRelease(String org, repoName) async {
try {
var latestRelease = await github.repositories.getLatestRelease(
var latestRelease = await _github.repositories.getLatestRelease(
RepositorySlug(org, repoName),
);
return latestRelease.assets
String? url = latestRelease.assets
?.firstWhere((asset) =>
asset.name != null &&
(asset.name!.endsWith('.dex') || asset.name!.endsWith('.apk')) &&
!asset.name!.contains('-sources') &&
!asset.name!.contains('-javadoc'))
.browserDownloadUrl;
if (url != null) {
return await DefaultCacheManager().getSingleFile(url);
}
} on Exception {
return '';
return null;
}
return null;
}
Future<String> latestCommitTime(String org, repoName) async {
try {
var repo = await github.repositories.getRepository(
var repo = await _github.repositories.getRepository(
RepositorySlug(org, repoName),
);
return repo.pushedAt != null
@ -39,7 +43,7 @@ class GithubAPI {
Future<List<Contributor>> getContributors(String org, repoName) async {
try {
var contributors = github.repositories.listContributors(
var contributors = _github.repositories.listContributors(
RepositorySlug(org, repoName),
);
return contributors.toList();

View File

@ -1,52 +1,19 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
import 'package:path_provider/path_provider.dart' as p;
import 'package:revanced_manager/constants.dart';
import 'package:revanced_manager/services/github_api.dart';
@lazySingleton
class ManagerAPI {
final Dio dio = Dio();
final GithubAPI githubAPI = GithubAPI();
final GithubAPI _githubAPI = GithubAPI();
Future<String?> getPath() async {
final path = await p.getApplicationSupportDirectory();
Directory('${path.path}/revanced').createSync();
final workDirPath = '${path.path}/revanced';
return workDirPath;
Future<File?> downloadPatches() async {
return await _githubAPI.latestRelease(ghOrg, patchesRepo);
}
Future<File?> downloadAssets(String repo) async {
try {
final workDir = await getPath();
final dlUrl = await githubAPI.latestRelease(ghOrg, repo);
final name = dlUrl
?.split('/')
.lastWhere((element) => element.contains('revanced'));
final assetFile = File('$workDir/$name');
final response = await dio.get(
dlUrl!,
options: Options(
responseType: ResponseType.bytes,
followRedirects: true,
receiveTimeout: 0,
),
);
final raf = assetFile.openSync(mode: FileMode.write);
raf.writeFromSync(response.data);
raf.closeSync();
return assetFile;
} catch (e) {
return null;
}
Future<File?> downloadIntegrations() async {
return await _githubAPI.latestRelease(ghOrg, integrationsRepo);
}
Future<void> downloadPatches() async {
await downloadAssets(patchesRepo);
}
Future<void> downloadIntegrations() async {
await downloadAssets(integrationsRepo);
Future<File?> downloadManager() async {
return await _githubAPI.latestRelease(ghOrg, managerRepo);
}
}

View File

@ -2,15 +2,12 @@ import 'dart:io';
import 'package:app_installer/app_installer.dart';
import 'package:device_apps/device_apps.dart';
import 'package:flutter/services.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:injectable/injectable.dart';
import 'package:path_provider/path_provider.dart';
import 'package:revanced_manager/app/app.locator.dart';
import 'package:revanced_manager/models/patch.dart';
import 'package:revanced_manager/models/patched_application.dart';
import 'package:revanced_manager/services/github_api.dart';
import 'package:revanced_manager/services/manager_api.dart';
import 'package:revanced_manager/services/root_api.dart';
import 'package:revanced_manager/ui/views/installer/installer_viewmodel.dart';
import 'package:revanced_manager/utils/string.dart';
import 'package:share_extend/share_extend.dart';
@ -19,11 +16,8 @@ class PatcherAPI {
static const patcherChannel = MethodChannel(
'app.revanced.manager/patcher',
);
static const installerChannel = MethodChannel(
'app.revanced.manager/installer',
);
final GithubAPI githubAPI = GithubAPI();
final RootAPI rootAPI = RootAPI();
final ManagerAPI _managerAPI = ManagerAPI();
final RootAPI _rootAPI = RootAPI();
Directory? _tmpDir;
Directory? _workDir;
Directory? _cacheDir;
@ -33,45 +27,18 @@ class PatcherAPI {
File? _patchedFile;
File? _outFile;
Future<dynamic> handlePlatformChannelMethods() async {
installerChannel.setMethodCallHandler((call) async {
switch (call.method) {
case 'updateProgress':
if (call.arguments != null) {
locator<InstallerViewModel>().updateProgress(call.arguments);
}
break;
case 'updateLog':
if (call.arguments != null) {
locator<InstallerViewModel>().updateLog(call.arguments);
}
break;
}
});
}
Future<bool?> loadPatches() async {
Future<void> loadPatches() async {
if (_patchBundleFile == null) {
String? dexFileUrl =
await githubAPI.latestRelease('revanced', 'revanced-patches');
if (dexFileUrl != null && dexFileUrl.isNotEmpty) {
try {
_patchBundleFile =
await DefaultCacheManager().getSingleFile(dexFileUrl);
return await patcherChannel.invokeMethod<bool>(
'loadPatches',
{
'pathBundlesPaths': <String>[_patchBundleFile!.absolute.path],
},
);
} on Exception {
_patchBundleFile = null;
return false;
}
_patchBundleFile = await _managerAPI.downloadPatches();
if (_patchBundleFile != null) {
await patcherChannel.invokeMethod<bool>(
'loadPatches',
{
'pathBundlesPaths': <String>[_patchBundleFile!.absolute.path],
},
);
}
return false;
}
return true;
}
Future<List<ApplicationWithIcon>> getFilteredInstalledApps() async {
@ -181,20 +148,9 @@ class PatcherAPI {
return appliedPatches;
}
Future<File?> downloadIntegrations() async {
String? apkFileUrl =
await githubAPI.latestRelease('revanced', 'revanced-integrations');
if (apkFileUrl != null && apkFileUrl.isNotEmpty) {
return await DefaultCacheManager().getSingleFile(apkFileUrl);
}
return null;
}
Future<void> initPatcher(bool mergeIntegrations) async {
if (mergeIntegrations) {
_integrations = await downloadIntegrations();
} else {
_integrations = File('');
_integrations = await _managerAPI.downloadIntegrations();
}
_tmpDir = await getTemporaryDirectory();
_workDir = _tmpDir!.createTempSync('tmp-');
@ -218,7 +174,7 @@ class PatcherAPI {
'inputFilePath': _inputFile!.path,
'patchedFilePath': _patchedFile!.path,
'outFilePath': _outFile!.path,
'integrationsPath': _integrations!.path,
'integrationsPath': _integrations != null ? _integrations!.path : '',
'selectedPatches': selectedPatches.map((p) => p.name).toList(),
'cacheDirPath': _cacheDir!.path,
'mergeIntegrations': mergeIntegrations,
@ -231,7 +187,7 @@ class PatcherAPI {
if (_outFile != null) {
try {
if (patchedApp.isRooted && !patchedApp.isFromStorage) {
return rootAPI.installApp(
return _rootAPI.installApp(
patchedApp.packageName,
patchedApp.apkFilePath,
_outFile!.path,
@ -268,14 +224,14 @@ class PatcherAPI {
Future<bool> checkOldPatch(PatchedApplication patchedApp) async {
if (patchedApp.isRooted) {
return await rootAPI.checkApp(patchedApp.packageName);
return await _rootAPI.checkApp(patchedApp.packageName);
}
return false;
}
Future<void> deleteOldPatch(PatchedApplication patchedApp) async {
if (patchedApp.isRooted) {
await rootAPI.deleteApp(patchedApp.packageName, patchedApp.apkFilePath);
await _rootAPI.deleteApp(patchedApp.packageName, patchedApp.apkFilePath);
}
}
}

View File

@ -1,16 +1,14 @@
import 'package:injectable/injectable.dart';
import 'package:root/root.dart';
@lazySingleton
class RootAPI {
final String managerDirPath = "/data/adb/revanced_manager";
final String postFsDataDirPath = "/data/adb/post-fs-data.d";
final String serviceDDirPath = "/data/adb/service.d";
final String _managerDirPath = "/data/adb/revanced_manager";
final String _postFsDataDirPath = "/data/adb/post-fs-data.d";
final String _serviceDDirPath = "/data/adb/service.d";
Future<bool> checkApp(String packageName) async {
try {
String? res = await Root.exec(
cmd: 'ls -la "$managerDirPath/$packageName"',
cmd: 'ls -la "$_managerDirPath/$packageName"',
);
return res != null && res.isNotEmpty;
} on Exception {
@ -26,13 +24,13 @@ class RootAPI {
cmd: 'su -mm -c "umount -l $originalFilePath"',
);
await Root.exec(
cmd: 'rm -rf "$managerDirPath/$packageName"',
cmd: 'rm -rf "$_managerDirPath/$packageName"',
);
await Root.exec(
cmd: 'rm -rf "$serviceDDirPath/$packageName.sh"',
cmd: 'rm -rf "$_serviceDDirPath/$packageName.sh"',
);
await Root.exec(
cmd: 'rm -rf "$postFsDataDirPath/$packageName.sh"',
cmd: 'rm -rf "$_postFsDataDirPath/$packageName.sh"',
);
}
@ -43,7 +41,7 @@ class RootAPI {
) async {
try {
await Root.exec(
cmd: 'mkdir -p "$managerDirPath/$packageName"',
cmd: 'mkdir -p "$_managerDirPath/$packageName"',
);
installServiceDScript(packageName);
installPostFsDataScript(packageName);
@ -58,10 +56,10 @@ class RootAPI {
Future<void> installServiceDScript(String packageName) async {
String content = '#!/system/bin/sh\n'
'while [ "\$(getprop sys.boot_completed | tr -d \'"\'"\'\\\\r\'"\'"\')" != "1" ]; do sleep 1; done\n'
'base_path=$managerDirPath/$packageName/base.apk\n'
'base_path=$_managerDirPath/$packageName/base.apk\n'
'stock_path=\$(pm path $packageName | grep base | sed \'"\'"\'s/package://g\'"\'"\')\n'
'[ ! -z \$stock_path ] && mount -o bind \$base_path \$stock_path';
String scriptFilePath = '$serviceDDirPath/$packageName.sh';
String scriptFilePath = '$_serviceDDirPath/$packageName.sh';
await Root.exec(
cmd: 'echo \'$content\' > "$scriptFilePath"',
);
@ -74,7 +72,7 @@ class RootAPI {
String content = '#!/system/bin/sh\n'
'stock_path=\$(pm path $packageName | grep base | sed \'"\'"\'s/package://g\'"\'"\')\n'
'[ ! -z \$stock_path ] && umount -l \$stock_path';
String scriptFilePath = '$postFsDataDirPath/$packageName.sh';
String scriptFilePath = '$_postFsDataDirPath/$packageName.sh';
await Root.exec(
cmd: 'echo \'$content\' > "$scriptFilePath"',
);
@ -84,7 +82,7 @@ class RootAPI {
}
Future<void> installApk(String packageName, String patchedFilePath) async {
String newPatchedFilePath = '$managerDirPath/$packageName/base.apk';
String newPatchedFilePath = '$_managerDirPath/$packageName/base.apk';
await Root.exec(
cmd: 'cp "$patchedFilePath" "$newPatchedFilePath"',
);
@ -104,7 +102,7 @@ class RootAPI {
String originalFilePath,
String patchedFilePath,
) async {
String newPatchedFilePath = '$managerDirPath/$packageName/base.apk';
String newPatchedFilePath = '$_managerDirPath/$packageName/base.apk';
await Root.exec(
cmd: 'am force-stop "$packageName"',
);