mirror of
https://github.com/revanced/revanced-manager
synced 2024-05-14 13:56:57 +02:00
chore: merge dev
to main
(#1545)
This commit is contained in:
commit
ca9ef544ce
2
.github/workflows/pr-build.yml
vendored
2
.github/workflows/pr-build.yml
vendored
@ -59,7 +59,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup JDK
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'zulu'
|
||||
|
4
.github/workflows/release-build.yml
vendored
4
.github/workflows/release-build.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
- name: Set env
|
||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "zulu"
|
||||
@ -47,4 +47,4 @@ jobs:
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
prerelease: false
|
||||
files: revanced-manager-${{ env.RELEASE_VERSION }}.apk
|
||||
files: revanced-manager-${{ env.RELEASE_VERSION }}.apk
|
||||
|
@ -12,7 +12,10 @@
|
||||
</picture>
|
||||
<br>
|
||||
<a href="https://revanced.app/">
|
||||
<img height="24px" src="assets/revanced-logo/revanced-logo-round.svg" />
|
||||
<picture>
|
||||
<source height="24px" media="(prefers-color-scheme: dark)" srcset="assets/revanced-logo/revanced-logo-round.svg" />
|
||||
<img height="24px" src="assets/revanced-logo/revanced-logo-round.svg" />
|
||||
</picture>
|
||||
</a>
|
||||
<a href="https://github.com/ReVanced">
|
||||
<picture>
|
||||
@ -21,13 +24,22 @@
|
||||
</picture>
|
||||
</a>
|
||||
<a href="http://revanced.app/discord">
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
|
||||
<picture>
|
||||
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" />
|
||||
</picture>
|
||||
</a>
|
||||
<a href="https://reddit.com/r/revancedapp">
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
|
||||
<picture>
|
||||
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" />
|
||||
</picture>
|
||||
</a>
|
||||
<a href="https://t.me/app_revanced">
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
|
||||
<picture>
|
||||
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" />
|
||||
</picture>
|
||||
</a>
|
||||
<a href="https://x.com/revancedapp">
|
||||
<picture>
|
||||
@ -36,7 +48,10 @@
|
||||
</picture>
|
||||
</a>
|
||||
<a href="https://www.youtube.com/@ReVanced">
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
|
||||
<picture>
|
||||
<source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
|
||||
<img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" />
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
<br>
|
||||
@ -69,7 +84,7 @@ If you encounter a bug while using the ReVanced Manager app, open an issue using
|
||||
|
||||
## 📝 How to contribute
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> We recommend that you discuss your changes with
|
||||
> the maintainers of ReVanced Manager before contributing.
|
||||
> This will help you determine whether your change is acceptable.
|
||||
|
@ -2,29 +2,31 @@
|
||||
|
||||
This page will guide you through building ReVanced Manager from source.
|
||||
|
||||
1. Setup the Flutter environment for your [platform](https://docs.flutter.dev/get-started/install)
|
||||
1\. Setup the Flutter environment for your [platform](https://docs.flutter.dev/get-started/install)
|
||||
|
||||
2. Clone the repository
|
||||
2\. Clone the repository
|
||||
|
||||
```sh
|
||||
git clone https://github.com/revanced/revanced-manager.git && cd revanced-manager
|
||||
```
|
||||
3. Get dependencies
|
||||
3\. Get dependencies
|
||||
|
||||
```sh
|
||||
flutter pub get
|
||||
```
|
||||
|
||||
4. Delete conflicting outputs
|
||||
4\. Delete conflicting outputs
|
||||
|
||||
> [!TIP]
|
||||
> Must be run every time you sync your local repository with the remote repository.
|
||||
|
||||
```sh
|
||||
dart run build_runner build --delete-conflicting-outputs
|
||||
```
|
||||
|
||||
> [!Note]
|
||||
> Must be run every time you sync your local repository with the remote repository.
|
||||
|
||||
5. Build the APK
|
||||
|
||||
5\. Build the APK
|
||||
|
||||
```sh
|
||||
flutter build apk
|
||||
|
@ -582,8 +582,8 @@ class ManagerAPI {
|
||||
return showDialog(
|
||||
barrierDismissible: false,
|
||||
context: context,
|
||||
builder: (context) => PopScope(
|
||||
canPop: false,
|
||||
builder: (context) => WillPopScope(
|
||||
onWillPop: () async => false,
|
||||
child: AlertDialog(
|
||||
backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
|
||||
title: I18nText('warning'),
|
||||
|
@ -237,7 +237,7 @@ void exportPatchedFile(String appName, String version) {
|
||||
if (outFile != null) {
|
||||
final String newName = _getFileName(appName, version);
|
||||
FlutterFileDialog.saveFile(
|
||||
params: SaveFileDialogParams(
|
||||
params: SaveFileDialogParams(
|
||||
sourceFilePath: outFile!.path,
|
||||
fileName: newName,
|
||||
mimeTypesFilter: ['application/vnd.android.package-archive'],
|
||||
@ -269,8 +269,9 @@ void sharePatchedFile(String appName, String version) {
|
||||
}
|
||||
|
||||
String _getFileName(String appName, String version) {
|
||||
final String patchVersion = _managerAPI.patchesVersion!;
|
||||
final String prefix = appName.toLowerCase().replaceAll(' ', '-');
|
||||
final String newName = '$prefix-revanced_v$version.apk';
|
||||
final String newName = '$prefix-revanced_v$version-patches_$patchVersion.apk';
|
||||
return newName;
|
||||
}
|
||||
|
||||
|
@ -15,8 +15,7 @@ class InstallerView extends StatelessWidget {
|
||||
return ViewModelBuilder<InstallerViewModel>.reactive(
|
||||
onViewModelReady: (model) => model.initialize(context),
|
||||
viewModelBuilder: () => InstallerViewModel(),
|
||||
builder: (context, model, child) => PopScope(
|
||||
onPopInvoked: (bool didPop) => model.onPopInvoked(context, didPop),
|
||||
builder: (context, model, child) => WillPopScope(
|
||||
child: SafeArea(
|
||||
top: false,
|
||||
bottom: model.isPatching,
|
||||
@ -84,7 +83,7 @@ class InstallerView extends StatelessWidget {
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
onBackButtonPressed: () => model.onBackButtonInvoked(context),
|
||||
onBackButtonPressed: () => model.onWillPop(context),
|
||||
bottom: PreferredSize(
|
||||
preferredSize: const Size(double.infinity, 1.0),
|
||||
child: GradientProgressIndicator(progress: model.progress),
|
||||
@ -112,6 +111,7 @@ class InstallerView extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
onWillPop: () => model.onWillPop(context),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -183,13 +183,15 @@ class InstallerViewModel extends BaseViewModel {
|
||||
final lineCount = logLines.where((line) => line.endsWith(keyword)).length;
|
||||
final index = logLines.indexWhere((line) => line.endsWith(keyword));
|
||||
if (newString != null && lineCount > 0) {
|
||||
logLines.insert(index, newString.replaceAll('{lineCount}', lineCount.toString()));
|
||||
logLines.insert(
|
||||
index, newString.replaceAll('{lineCount}', lineCount.toString()));
|
||||
}
|
||||
logLines.removeWhere((lines) => lines.endsWith(keyword));
|
||||
}
|
||||
|
||||
dynamic _getPatchOptionValue(String patchName, Option option) {
|
||||
final Option? savedOption = _managerAPI.getPatchOption(_app.packageName, patchName, option.key);
|
||||
final Option? savedOption =
|
||||
_managerAPI.getPatchOption(_app.packageName, patchName, option.key);
|
||||
if (savedOption != null) {
|
||||
return savedOption.value;
|
||||
} else {
|
||||
@ -201,7 +203,24 @@ class InstallerViewModel extends BaseViewModel {
|
||||
if (patches.isEmpty) {
|
||||
return 'None';
|
||||
}
|
||||
return patches.map((p) => p.name + (p.options.isEmpty ? '' : ' [${p.options.map((o) => '${o.title}: ${_getPatchOptionValue(p.name, o)}').join(", ")}]')).toList().join(', ');
|
||||
return patches
|
||||
.map((p) =>
|
||||
p.name +
|
||||
(p.options.isEmpty
|
||||
? ''
|
||||
: ' [${p.options.map((o) => '${o.title}: ${_getPatchOptionValue(p.name, o)}').join(", ")}]'))
|
||||
.toList()
|
||||
.join(', ');
|
||||
}
|
||||
|
||||
String _getSuggestedVersion(String packageName) {
|
||||
String suggestedVersion = _patcherAPI.getSuggestedVersion(_app.packageName);
|
||||
if (suggestedVersion.isEmpty) {
|
||||
suggestedVersion = 'Any';
|
||||
} else {
|
||||
suggestedVersion = 'v$suggestedVersion';
|
||||
}
|
||||
return suggestedVersion;
|
||||
}
|
||||
|
||||
Future<void> copyLogs() async {
|
||||
@ -213,12 +232,21 @@ class InstallerViewModel extends BaseViewModel {
|
||||
_trimLogs(logsTrimmed, '.dex', 'Compiled {lineCount} dex files');
|
||||
|
||||
// Get patches added / removed
|
||||
final defaultPatches = _patcherAPI.getFilteredPatches(_app.packageName).where((p) => !p.excluded).toList();
|
||||
final patchesAdded = _patches.where((p) => !defaultPatches.contains(p)).toList();
|
||||
final patchesRemoved = defaultPatches.where((p) => !_patches.contains(p)).toList();
|
||||
final defaultPatches = _patcherAPI
|
||||
.getFilteredPatches(_app.packageName)
|
||||
.where((p) => !p.excluded)
|
||||
.toList();
|
||||
final patchesAdded =
|
||||
_patches.where((p) => !defaultPatches.contains(p)).toList();
|
||||
final patchesRemoved =
|
||||
defaultPatches.where((p) => !_patches.contains(p)).toList();
|
||||
|
||||
// Options changed
|
||||
final patchesChanged = defaultPatches.where((p) => _patches.contains(p) && p.options.any((o) => _getPatchOptionValue(p.name, o) != o.value)).toList();
|
||||
final patchesChanged = defaultPatches
|
||||
.where((p) =>
|
||||
_patches.contains(p) &&
|
||||
p.options.any((o) => _getPatchOptionValue(p.name, o) != o.value))
|
||||
.toList();
|
||||
|
||||
// Add Info
|
||||
final formattedLogs = [
|
||||
@ -228,22 +256,22 @@ class InstallerViewModel extends BaseViewModel {
|
||||
'Model: ${info['model']}',
|
||||
'Android version: ${info['androidVersion']}',
|
||||
'Supported architectures: ${info['supportedArch'].join(", ")}',
|
||||
'Root permissions: ${isRooted ? 'Yes' : 'No'}',
|
||||
|
||||
'Root permissions: ${isRooted ? 'Yes' : 'No'}', //
|
||||
|
||||
'\n- Patch Info',
|
||||
'App: ${_app.packageName} v${_app.version}',
|
||||
'App: ${_app.packageName} v${_app.version} (Suggested: ${_getSuggestedVersion(_app.packageName)})',
|
||||
'Patches version: ${_managerAPI.patchesVersion}',
|
||||
'Patches added: ${_formatPatches(patchesAdded)}',
|
||||
'Patches removed: ${_formatPatches(patchesRemoved)}',
|
||||
'Options changed: ${_formatPatches(patchesChanged)}',
|
||||
'Options changed: ${_formatPatches(patchesChanged)}', //
|
||||
|
||||
'\n- Settings',
|
||||
'Allow changing patch selection: ${_managerAPI.isPatchesChangeEnabled()}',
|
||||
'Version compatibility check: ${_managerAPI.isVersionCompatibilityCheckEnabled()}',
|
||||
'Show universal patches: ${_managerAPI.areUniversalPatchesEnabled()}',
|
||||
'Patches source: ${_managerAPI.getPatchesRepo()}',
|
||||
'Integration source: ${_managerAPI.getIntegrationsRepo()}',
|
||||
|
||||
'Integration source: ${_managerAPI.getIntegrationsRepo()}', //
|
||||
|
||||
'\n- Logs',
|
||||
logsTrimmed.join('\n'),
|
||||
];
|
||||
@ -461,38 +489,25 @@ class InstallerViewModel extends BaseViewModel {
|
||||
}
|
||||
}
|
||||
|
||||
bool canPop() {
|
||||
return !isPatching;
|
||||
}
|
||||
|
||||
void onBackButtonInvoked(BuildContext context) {
|
||||
if (canPop()) {
|
||||
onPopInvoked(context, true);
|
||||
} else {
|
||||
onPopInvoked(context, false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> onPopInvoked(BuildContext context, bool didPop) async {
|
||||
if (didPop) {
|
||||
Future<bool> onWillPop(BuildContext context) async {
|
||||
if (isPatching) {
|
||||
if (!cancel) {
|
||||
cleanPatcher();
|
||||
cancel = true;
|
||||
_toast.showBottom('installerView.pressBackAgain');
|
||||
} else if (!isCanceled) {
|
||||
await stopPatcher();
|
||||
} else {
|
||||
_patcherAPI.cleanPatcher();
|
||||
}
|
||||
screenshotCallback.dispose();
|
||||
Navigator.of(context).pop();
|
||||
} else {
|
||||
if (isPatching) {
|
||||
if (!cancel) {
|
||||
cancel = true;
|
||||
_toast.showBottom('installerView.pressBackAgain');
|
||||
} else if (!isCanceled) {
|
||||
await stopPatcher();
|
||||
} else {
|
||||
_toast.showBottom('installerView.noExit');
|
||||
}
|
||||
_toast.showBottom('installerView.noExit');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (!cancel) {
|
||||
cleanPatcher();
|
||||
} else {
|
||||
_patcherAPI.cleanPatcher();
|
||||
}
|
||||
screenshotCallback.dispose();
|
||||
Navigator.of(context).pop();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -13,11 +13,13 @@ class NavigationView extends StatelessWidget {
|
||||
return ViewModelBuilder<NavigationViewModel>.reactive(
|
||||
onViewModelReady: (model) => model.initialize(context),
|
||||
viewModelBuilder: () => locator<NavigationViewModel>(),
|
||||
builder: (context, model, child) => PopScope(
|
||||
canPop: model.currentIndex == 0,
|
||||
onPopInvoked: (bool didPop) {
|
||||
if (!didPop) {
|
||||
builder: (context, model, child) => WillPopScope(
|
||||
onWillPop: () async {
|
||||
if (model.currentIndex == 0) {
|
||||
return true;
|
||||
} else {
|
||||
model.setIndex(0);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
child: Scaffold(
|
||||
|
@ -25,6 +25,9 @@ class PatchesSelectorViewModel extends BaseViewModel {
|
||||
locator<PatcherViewModel>().selectedPatches;
|
||||
PatchedApplication? selectedApp = locator<PatcherViewModel>().selectedApp;
|
||||
String? patchesVersion = '';
|
||||
|
||||
Set<String> savedPatchNames = {};
|
||||
|
||||
bool isDefaultPatchesRepo() {
|
||||
return _managerAPI.getPatchesRepo() == 'revanced/revanced-patches';
|
||||
}
|
||||
@ -48,13 +51,17 @@ class PatchesSelectorViewModel extends BaseViewModel {
|
||||
});
|
||||
currentSelection.clear();
|
||||
currentSelection.addAll(selectedPatches);
|
||||
|
||||
savedPatchNames = _managerAPI.getSavedPatches(selectedApp!.packageName).map((p) => p.name).toSet();
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
bool isSelected(Patch patch) {
|
||||
return selectedPatches.any(
|
||||
(element) => element.name == patch.name,
|
||||
);
|
||||
(element) => element.name == patch.name,
|
||||
) ||
|
||||
(isPatchNew(patch) && !patch.excluded);
|
||||
}
|
||||
|
||||
void navigateToPatchOptions(List<Option> setOptions, Patch patch) {
|
||||
@ -281,13 +288,10 @@ class PatchesSelectorViewModel extends BaseViewModel {
|
||||
}
|
||||
|
||||
bool isPatchNew(Patch patch) {
|
||||
final List<Patch> savedPatches =
|
||||
_managerAPI.getSavedPatches(selectedApp!.packageName);
|
||||
if (savedPatches.isEmpty) {
|
||||
if (savedPatchNames.isEmpty) {
|
||||
return false;
|
||||
} else {
|
||||
return !savedPatches
|
||||
.any((p) => p.getSimpleName() == patch.getSimpleName());
|
||||
return !savedPatchNames.contains(patch.name);
|
||||
}
|
||||
}
|
||||
|
||||
|
19
pubspec.yaml
19
pubspec.yaml
@ -1,6 +1,6 @@
|
||||
name: revanced_manager
|
||||
description: Patch your favorite apps, right on your device.
|
||||
homepage: https://github.com/revanced/revanced-manager
|
||||
homepage: https://github.com/ReVanced/revanced-manager
|
||||
|
||||
publish_to: 'none'
|
||||
|
||||
@ -15,7 +15,7 @@ dependencies:
|
||||
device_apps:
|
||||
git: # switch back to ponces fork once https://github.com/ponces/flutter_plugin_device_apps/pull/1 is merged
|
||||
url: https://github.com/BenjaminHalko/flutter_plugin_device_apps
|
||||
ref: revanced-manager
|
||||
ref: 0efbeba41657158a66bbc92c55d1226df56d0f1b # Branch: revanced-manager
|
||||
device_info_plus: ^9.1.0
|
||||
dynamic_color: ^1.6.3
|
||||
dio: ^5.0.0
|
||||
@ -27,17 +27,14 @@ dependencies:
|
||||
flutter_background:
|
||||
git: # remove once https://github.com/JulianAssmann/flutter_background/pull/79 is merged
|
||||
url: https://github.com/BenjaminHalko/flutter_background
|
||||
ref: specify-namespace
|
||||
ref: 560d21c4148b53933313573e7eafca0b0eb9aadf # Branch: specify-namespace
|
||||
flutter_cache_manager: ^3.3.0
|
||||
flutter_i18n: ^0.34.0
|
||||
flutter_local_notifications: ^16.1.0
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
flutter_svg: ^2.0.4
|
||||
fluttertoast:
|
||||
git: # remove once the next fluttertoast version is release (> 8.2.2)
|
||||
url: https://github.com/ponnamkarthik/FlutterToast
|
||||
ref: f4e7b4e1afc8c760eb5bac80f6a2e299906d83ca
|
||||
fluttertoast: ^8.2.4
|
||||
font_awesome_flutter: ^10.4.0
|
||||
get_it: ^7.6.4
|
||||
google_fonts: ^6.1.0
|
||||
@ -48,7 +45,7 @@ dependencies:
|
||||
logcat:
|
||||
git:
|
||||
url: https://github.com/BenjaminHalko/logcat
|
||||
ref: master
|
||||
ref: 4a6d5e0e22292c8eb160cfb9365b9ea29735fd43 # Branch: master
|
||||
package_info_plus: ^4.2.0
|
||||
path_provider: ^2.0.14
|
||||
permission_handler: ^11.0.1
|
||||
@ -56,7 +53,7 @@ dependencies:
|
||||
root:
|
||||
git:
|
||||
url: https://github.com/validcube/root
|
||||
ref: 68e5678a535a2a3344828a14a39017fa74b9098c
|
||||
ref: 68e5678a535a2a3344828a14a39017fa74b9098c # Branch: libsu-521
|
||||
shared_preferences: ^2.1.0
|
||||
skeletons: ^0.0.3
|
||||
stacked: ^3.2.0
|
||||
@ -71,11 +68,11 @@ dependencies:
|
||||
install_plugin:
|
||||
git: # remove once https://github.com/hui-z/flutter_install_plugin/pull/67 is merged
|
||||
url: https://github.com/BenjaminHalko/flutter_install_plugin
|
||||
ref: master
|
||||
ref: 5f9b1a8c956fc3355ae655eefcbcadb457bd10f7 # Branch: master
|
||||
screenshot_callback:
|
||||
git: # remove once https://github.com/flutter-moum/flutter_screenshot_callback/pull/81 is merged
|
||||
url: https://github.com/BenjaminHalko/flutter_screenshot_callback
|
||||
ref: master
|
||||
ref: 1a1616ac91e16cd1f3dd170a81febf27ffce3587 # Branch: master
|
||||
synchronized: ^3.1.0
|
||||
connectivity_plus: ^5.0.1
|
||||
flutter_file_dialog: ^3.0.2
|
||||
|
Loading…
Reference in New Issue
Block a user