mirror of
https://github.com/revanced/revanced-manager
synced 2024-05-14 13:56:57 +02:00
feat: patch apps without internet (#1114)
This commit is contained in:
parent
97e37f304b
commit
f90f6e81ee
@ -6,12 +6,14 @@ import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||||
import 'package:injectable/injectable.dart';
|
import 'package:injectable/injectable.dart';
|
||||||
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
import 'package:revanced_manager/models/patch.dart';
|
import 'package:revanced_manager/models/patch.dart';
|
||||||
import 'package:revanced_manager/services/manager_api.dart';
|
import 'package:revanced_manager/services/manager_api.dart';
|
||||||
|
|
||||||
@lazySingleton
|
@lazySingleton
|
||||||
class GithubAPI {
|
class GithubAPI {
|
||||||
late Dio _dio = Dio();
|
late Dio _dio = Dio();
|
||||||
|
late final ManagerAPI _managerAPI = locator<ManagerAPI>();
|
||||||
|
|
||||||
final _cacheOptions = CacheOptions(
|
final _cacheOptions = CacheOptions(
|
||||||
store: MemCacheStore(),
|
store: MemCacheStore(),
|
||||||
@ -201,8 +203,14 @@ class GithubAPI {
|
|||||||
String extension,
|
String extension,
|
||||||
String repoName,
|
String repoName,
|
||||||
String version,
|
String version,
|
||||||
|
String url,
|
||||||
) async {
|
) async {
|
||||||
try {
|
try {
|
||||||
|
if (url.isNotEmpty) {
|
||||||
|
return await DefaultCacheManager().getSingleFile(
|
||||||
|
url,
|
||||||
|
);
|
||||||
|
}
|
||||||
final Map<String, dynamic>? release =
|
final Map<String, dynamic>? release =
|
||||||
await getPatchesRelease(repoName, version);
|
await getPatchesRelease(repoName, version);
|
||||||
if (release != null) {
|
if (release != null) {
|
||||||
@ -211,8 +219,16 @@ class GithubAPI {
|
|||||||
(asset) => (asset['name'] as String).endsWith(extension),
|
(asset) => (asset['name'] as String).endsWith(extension),
|
||||||
);
|
);
|
||||||
if (asset != null) {
|
if (asset != null) {
|
||||||
|
final String downloadUrl = asset['browser_download_url'];
|
||||||
|
if (extension == '.apk') {
|
||||||
|
_managerAPI.setIntegrationsDownloadURL(downloadUrl);
|
||||||
|
} else if (extension == '.json') {
|
||||||
|
_managerAPI.setPatchesDownloadURL(downloadUrl, false);
|
||||||
|
} else {
|
||||||
|
_managerAPI.setPatchesDownloadURL(downloadUrl, true);
|
||||||
|
}
|
||||||
return await DefaultCacheManager().getSingleFile(
|
return await DefaultCacheManager().getSingleFile(
|
||||||
asset['browser_download_url'],
|
downloadUrl,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -224,10 +240,19 @@ class GithubAPI {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<Patch>> getPatches(String repoName, String version) async {
|
Future<List<Patch>> getPatches(
|
||||||
|
String repoName,
|
||||||
|
String version,
|
||||||
|
String url,
|
||||||
|
) async {
|
||||||
List<Patch> patches = [];
|
List<Patch> patches = [];
|
||||||
try {
|
try {
|
||||||
final File? f = await getPatchesReleaseFile('.json', repoName, version);
|
final File? f = await getPatchesReleaseFile(
|
||||||
|
'.json',
|
||||||
|
repoName,
|
||||||
|
version,
|
||||||
|
url,
|
||||||
|
);
|
||||||
if (f != null) {
|
if (f != null) {
|
||||||
final List<dynamic> list = jsonDecode(f.readAsStringSync());
|
final List<dynamic> list = jsonDecode(f.readAsStringSync());
|
||||||
patches = list.map((patch) => Patch.fromJson(patch)).toList();
|
patches = list.map((patch) => Patch.fromJson(patch)).toList();
|
||||||
|
@ -76,6 +76,14 @@ class ManagerAPI {
|
|||||||
await _prefs.setString('repoUrl', url);
|
await _prefs.setString('repoUrl', url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getPatchesDownloadURL(bool bundle) {
|
||||||
|
return _prefs.getString('patchesDownloadURL-$bundle') ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setPatchesDownloadURL(String value, bool bundle) async {
|
||||||
|
await _prefs.setString('patchesDownloadURL-$bundle', value);
|
||||||
|
}
|
||||||
|
|
||||||
String getPatchesRepo() {
|
String getPatchesRepo() {
|
||||||
return _prefs.getString('patchesRepo') ?? defaultPatchesRepo;
|
return _prefs.getString('patchesRepo') ?? defaultPatchesRepo;
|
||||||
}
|
}
|
||||||
@ -119,6 +127,14 @@ class ManagerAPI {
|
|||||||
await _prefs.setStringList('savedPatches-$packageName', patchesJson);
|
await _prefs.setStringList('savedPatches-$packageName', patchesJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getIntegrationsDownloadURL() {
|
||||||
|
return _prefs.getString('integrationsDownloadURL') ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setIntegrationsDownloadURL(String value) async {
|
||||||
|
await _prefs.setString('integrationsDownloadURL', value);
|
||||||
|
}
|
||||||
|
|
||||||
List<Patch> getUsedPatches(String packageName) {
|
List<Patch> getUsedPatches(String packageName) {
|
||||||
final List<String> patchesJson =
|
final List<String> patchesJson =
|
||||||
_prefs.getStringList('usedPatches-$packageName') ?? [];
|
_prefs.getStringList('usedPatches-$packageName') ?? [];
|
||||||
@ -260,7 +276,12 @@ class ManagerAPI {
|
|||||||
try {
|
try {
|
||||||
final String repoName = getPatchesRepo();
|
final String repoName = getPatchesRepo();
|
||||||
final String currentVersion = await getCurrentPatchesVersion();
|
final String currentVersion = await getCurrentPatchesVersion();
|
||||||
return await _githubAPI.getPatches(repoName, currentVersion);
|
final String url = getPatchesDownloadURL(false);
|
||||||
|
return await _githubAPI.getPatches(
|
||||||
|
repoName,
|
||||||
|
currentVersion,
|
||||||
|
url,
|
||||||
|
);
|
||||||
} on Exception catch (e) {
|
} on Exception catch (e) {
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
print(e);
|
print(e);
|
||||||
@ -273,10 +294,12 @@ class ManagerAPI {
|
|||||||
try {
|
try {
|
||||||
final String repoName = getPatchesRepo();
|
final String repoName = getPatchesRepo();
|
||||||
final String currentVersion = await getCurrentPatchesVersion();
|
final String currentVersion = await getCurrentPatchesVersion();
|
||||||
|
final String url = getPatchesDownloadURL(true);
|
||||||
return await _githubAPI.getPatchesReleaseFile(
|
return await _githubAPI.getPatchesReleaseFile(
|
||||||
'.jar',
|
'.jar',
|
||||||
repoName,
|
repoName,
|
||||||
currentVersion,
|
currentVersion,
|
||||||
|
url,
|
||||||
);
|
);
|
||||||
} on Exception catch (e) {
|
} on Exception catch (e) {
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
@ -290,10 +313,12 @@ class ManagerAPI {
|
|||||||
try {
|
try {
|
||||||
final String repoName = getIntegrationsRepo();
|
final String repoName = getIntegrationsRepo();
|
||||||
final String currentVersion = await getCurrentIntegrationsVersion();
|
final String currentVersion = await getCurrentIntegrationsVersion();
|
||||||
|
final String url = getIntegrationsDownloadURL();
|
||||||
return await _githubAPI.getPatchesReleaseFile(
|
return await _githubAPI.getPatchesReleaseFile(
|
||||||
'.apk',
|
'.apk',
|
||||||
repoName,
|
repoName,
|
||||||
currentVersion,
|
currentVersion,
|
||||||
|
url,
|
||||||
);
|
);
|
||||||
} on Exception catch (e) {
|
} on Exception catch (e) {
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
@ -384,27 +409,39 @@ class ManagerAPI {
|
|||||||
Future<String> getCurrentPatchesVersion() async {
|
Future<String> getCurrentPatchesVersion() async {
|
||||||
patchesVersion = _prefs.getString('patchesVersion') ?? '0.0.0';
|
patchesVersion = _prefs.getString('patchesVersion') ?? '0.0.0';
|
||||||
if (patchesVersion == '0.0.0' || isPatchesAutoUpdate()) {
|
if (patchesVersion == '0.0.0' || isPatchesAutoUpdate()) {
|
||||||
patchesVersion = await getLatestPatchesVersion() ?? '0.0.0';
|
final String newPatchesVersion =
|
||||||
await setCurrentPatchesVersion(patchesVersion!);
|
await getLatestPatchesVersion() ?? '0.0.0';
|
||||||
|
if (patchesVersion != newPatchesVersion && newPatchesVersion != '0.0.0') {
|
||||||
|
await setCurrentPatchesVersion(newPatchesVersion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return patchesVersion!;
|
return patchesVersion!;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setCurrentPatchesVersion(String version) async {
|
Future<void> setCurrentPatchesVersion(String version) async {
|
||||||
await _prefs.setString('patchesVersion', version);
|
await _prefs.setString('patchesVersion', version);
|
||||||
|
await setPatchesDownloadURL('', false);
|
||||||
|
await setPatchesDownloadURL('', true);
|
||||||
|
await downloadPatches();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getCurrentIntegrationsVersion() async {
|
Future<String> getCurrentIntegrationsVersion() async {
|
||||||
integrationsVersion = _prefs.getString('integrationsVersion') ?? '0.0.0';
|
integrationsVersion = _prefs.getString('integrationsVersion') ?? '0.0.0';
|
||||||
if (integrationsVersion == '0.0.0' || isPatchesAutoUpdate()) {
|
if (integrationsVersion == '0.0.0' || isPatchesAutoUpdate()) {
|
||||||
integrationsVersion = await getLatestIntegrationsVersion() ?? '0.0.0';
|
final String newIntegrationsVersion =
|
||||||
await setCurrentIntegrationsVersion(integrationsVersion!);
|
await getLatestIntegrationsVersion() ?? '0.0.0';
|
||||||
|
if (integrationsVersion != newIntegrationsVersion &&
|
||||||
|
newIntegrationsVersion != '0.0.0') {
|
||||||
|
await setCurrentIntegrationsVersion(newIntegrationsVersion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return integrationsVersion!;
|
return integrationsVersion!;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setCurrentIntegrationsVersion(String version) async {
|
Future<void> setCurrentIntegrationsVersion(String version) async {
|
||||||
await _prefs.setString('integrationsVersion', version);
|
await _prefs.setString('integrationsVersion', version);
|
||||||
|
await setIntegrationsDownloadURL('');
|
||||||
|
await downloadIntegrations();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<PatchedApplication>> getAppsToRemove(
|
Future<List<PatchedApplication>> getAppsToRemove(
|
||||||
|
@ -30,6 +30,8 @@ class PatcherAPI {
|
|||||||
|
|
||||||
Future<void> initialize() async {
|
Future<void> initialize() async {
|
||||||
await _loadPatches();
|
await _loadPatches();
|
||||||
|
await _managerAPI.downloadPatches();
|
||||||
|
await _managerAPI.downloadIntegrations();
|
||||||
final Directory appCache = await getTemporaryDirectory();
|
final Directory appCache = await getTemporaryDirectory();
|
||||||
_dataDir = await getExternalStorageDirectory() ?? appCache;
|
_dataDir = await getExternalStorageDirectory() ?? appCache;
|
||||||
_tmpDir = Directory('${appCache.path}/patcher');
|
_tmpDir = Directory('${appCache.path}/patcher');
|
||||||
|
@ -256,9 +256,9 @@ class HomeViewModel extends BaseViewModel {
|
|||||||
final String integrationsVersion =
|
final String integrationsVersion =
|
||||||
await _managerAPI.getLatestIntegrationsVersion() ?? '0.0.0';
|
await _managerAPI.getLatestIntegrationsVersion() ?? '0.0.0';
|
||||||
if (patchesVersion != '0.0.0' && integrationsVersion != '0.0.0') {
|
if (patchesVersion != '0.0.0' && integrationsVersion != '0.0.0') {
|
||||||
_toast.showBottom('homeView.downloadedMessage');
|
|
||||||
await _managerAPI.setCurrentPatchesVersion(patchesVersion);
|
await _managerAPI.setCurrentPatchesVersion(patchesVersion);
|
||||||
await _managerAPI.setCurrentIntegrationsVersion(integrationsVersion);
|
await _managerAPI.setCurrentIntegrationsVersion(integrationsVersion);
|
||||||
|
_toast.showBottom('homeView.downloadedMessage');
|
||||||
forceRefresh(context);
|
forceRefresh(context);
|
||||||
} else {
|
} else {
|
||||||
_toast.showBottom('homeView.errorDownloadMessage');
|
_toast.showBottom('homeView.errorDownloadMessage');
|
||||||
|
@ -129,6 +129,7 @@ class SManageSources extends BaseViewModel {
|
|||||||
'${_orgIntSourceController.text.trim()}/${_intSourceController.text.trim()}',
|
'${_orgIntSourceController.text.trim()}/${_intSourceController.text.trim()}',
|
||||||
);
|
);
|
||||||
_managerAPI.setCurrentPatchesVersion('0.0.0');
|
_managerAPI.setCurrentPatchesVersion('0.0.0');
|
||||||
|
_managerAPI.setCurrentIntegrationsVersion('0.0.0');
|
||||||
_toast.showBottom('settingsView.restartAppForChanges');
|
_toast.showBottom('settingsView.restartAppForChanges');
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
@ -158,6 +159,7 @@ class SManageSources extends BaseViewModel {
|
|||||||
_managerAPI.setPatchesRepo('');
|
_managerAPI.setPatchesRepo('');
|
||||||
_managerAPI.setIntegrationsRepo('');
|
_managerAPI.setIntegrationsRepo('');
|
||||||
_managerAPI.setCurrentPatchesVersion('0.0.0');
|
_managerAPI.setCurrentPatchesVersion('0.0.0');
|
||||||
|
_managerAPI.setCurrentIntegrationsVersion('0.0.0');
|
||||||
_toast.showBottom('settingsView.restartAppForChanges');
|
_toast.showBottom('settingsView.restartAppForChanges');
|
||||||
Navigator.of(context)
|
Navigator.of(context)
|
||||||
..pop()
|
..pop()
|
||||||
|
Loading…
Reference in New Issue
Block a user