Skip to content

Commit

Permalink
feat: add support for shared patches (#577)
Browse files Browse the repository at this point in the history
* fix: avoid npe if a patch has empty compatible package.

* feat: support for shared patches

* fix: incorrect bool check and cleanup

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
  • Loading branch information
aliernfrog and Aunali321 authored Dec 11, 2022
1 parent 4f8aec6 commit ff90dae
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ class MainActivity : FlutterActivity() {
javaClass.classLoader
)
).loadPatches().filter { patch ->
patch.compatiblePackages!!.any { it.name == patcher.context.packageMetadata.packageName } &&
(patch.compatiblePackages?.any { it.name == patcher.context.packageMetadata.packageName } == true || patch.compatiblePackages.isNullOrEmpty()) &&

This comment has been minimized.

Copy link
@Nilyanko

Nilyanko Dec 12, 2022

In this line the code
val : patches=if (build.version.sdk.int)

selectedPatches.any { it == patch.patchName }
}
} else {
Expand Down
52 changes: 38 additions & 14 deletions lib/services/patcher_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,25 @@ class PatcherAPI {

Future<List<ApplicationWithIcon>> getFilteredInstalledApps() async {
List<ApplicationWithIcon> filteredApps = [];
bool? allAppsIncluded =
_patches.any((patch) => patch.compatiblePackages.isEmpty);
if (allAppsIncluded) {
var allPackages = await DeviceApps.getInstalledApplications(
includeAppIcons: true,
onlyAppsWithLaunchIntent: true,
);
allPackages.forEach((pkg) async {
if (!filteredApps.any((app) => app.packageName == pkg.packageName)) {
var appInfo = await DeviceApps.getApp(
pkg.packageName,
true,
) as ApplicationWithIcon?;
if (appInfo != null) {
filteredApps.add(appInfo);
}
}
});
}
for (Patch patch in _patches) {
for (Package package in patch.compatiblePackages) {
try {
Expand All @@ -76,11 +95,19 @@ class PatcherAPI {
}

Future<List<Patch>> getFilteredPatches(String packageName) async {
return _patches
.where((patch) =>
!patch.name.contains('settings') &&
patch.compatiblePackages.any((pack) => pack.name == packageName))
.toList();
List<Patch> filteredPatches = [];
_patches.forEach((patch) {
if (patch.compatiblePackages.isEmpty) {
filteredPatches.add(patch);
} else {
if (!patch.name.contains('settings') &&
patch.compatiblePackages.any((pack) => pack.name == packageName)
) {
filteredPatches.add(patch);
}
}
});
return filteredPatches;
}

Future<List<Patch>> getAppliedPatches(List<String> appliedPatches) async {
Expand Down Expand Up @@ -229,7 +256,6 @@ class PatcherAPI {
return false;
}


void exportPatchedFile(String appName, String version) {
try {
if (_outFile != null) {
Expand All @@ -238,13 +264,12 @@ class PatcherAPI {
// 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;
String newSourcePath =
_outFile!.path.substring(0, lastSeparator + 1) + newName;
_outFile!.copySync(newSourcePath);

CRFileSaver.saveFileWithDialog(SaveFileDialogParams(
sourceFilePath: newSourcePath,
destinationFileName: newName
));
sourceFilePath: newSourcePath, destinationFileName: newName));
}
} on Exception catch (e, s) {
Sentry.captureException(e, stackTrace: s);
Expand All @@ -267,10 +292,9 @@ class PatcherAPI {
}

String _getFileName(String appName, String version) {
String prefix = appName.toLowerCase().replaceAll(' ', '-');
String newName = '$prefix-revanced_v$version.apk';
return newName;

String prefix = appName.toLowerCase().replaceAll(' ', '-');
String newName = '$prefix-revanced_v$version.apk';
return newName;
}

Future<void> sharePatcherLog(String logs) async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class PatchesSelectorViewModel extends BaseViewModel {

bool isPatchSupported(Patch patch) {
PatchedApplication app = locator<PatcherViewModel>().selectedApp!;
return patch.compatiblePackages.any((pack) =>
return patch.compatiblePackages.isEmpty || patch.compatiblePackages.any((pack) =>
pack.name == app.packageName &&
(pack.versions.isEmpty || pack.versions.contains(app.version)));
}
Expand Down

0 comments on commit ff90dae

Please sign in to comment.