diff --git a/.github/ISSUE_TEMPLATE/bug-issue.yml b/.github/ISSUE_TEMPLATE/bug-issue.yml
index 87c8e4fb..b90072cc 100644
--- a/.github/ISSUE_TEMPLATE/bug-issue.yml
+++ b/.github/ISSUE_TEMPLATE/bug-issue.yml
@@ -1,5 +1,5 @@
name: 🐞 Bug report
-description: Report a very clearly broken issue.
+description: Create a new bug report.
title: 'bug:
'
labels: [bug]
body:
@@ -8,53 +8,20 @@ body:
value: |
# ReVanced Manager bug report
- Important to note that your issue may have already been reported before. Please check for existing issues [here](https://github.com/revanced/revanced-manager/labels/bug).
-
- - type: dropdown
- attributes:
- label: Type
- options:
- - Error while running the manager
- - Error at runtime
- - Cosmetic
- - Other
- validations:
- required: true
+ Please check for existing issues [here](https://github.com/revanced/revanced-manager/labels/bug) before creating a new one.
- type: textarea
attributes:
label: Bug description
- description: How did you find the bug? Any additional details that might help?
+ description:
+ - Describe your bug in detail
+ - Add steps to reproduce the bug if possible (Step 1. Download some files. Step 2. ...)
+ - Add images and videos if possible
+ - List selected patches if applicable
validations:
required: true
- type: textarea
attributes:
- label: Steps to reproduce
- description: Add the steps to reproduce this bug, including your environment.
- placeholder: Step 1. Download some files. Step 2. ...
- validations:
- required: true
- - type: textarea
- attributes:
- label: Android version
- description: Android version used.
- validations:
- required: true
- - type: textarea
- attributes:
- label: Manager version
- description: Manager version used.
- validations:
- required: true
- - type: textarea
- attributes:
- label: Target package name
- description: App you tried to patch.
- validations:
- required: true
- - type: textarea
- attributes:
- label: Target package version.
- description: Version of the app you tried to patch.
+ label: Version of ReVanced Manager and version & name of application you tried to patch
validations:
required: true
- type: dropdown
@@ -64,57 +31,31 @@ body:
- Non-root
- Root
validations:
- required: true
+ required: false
- type: textarea
attributes:
- label: Patches selected.
- description: Patches you selected for the app.
- validations:
- required: true
- - type: textarea
- attributes:
- label: Device logs (exported using Manager settings).
- description: Please copy and paste any relevant log output. This will be automatically formatted into code, so there is no need for backticks.
+ label: Device logs
+ description: Export logs in ReVanced Manager settings.
render: shell
validations:
required: true
- type: textarea
attributes:
- label: Installer logs (exported using Installer menu option) [unneeded if the issue is not during patching].
- description: Please copy and paste any relevant log output. This will be automatically formatted into code, so there is no need for backticks.
+ label: Patcher logs
+ description: Export logs in "Patcher" screen.
render: shell
validations:
required: false
- - type: textarea
- attributes:
- label: Screenshots or video
- description: Add screenshots or videos that show the bug here.
- placeholder: Drag and drop the screenshots/videos into this box.
- validations:
- required: false
- - type: textarea
- attributes:
- label: Solution
- description: If applicable, add a possible solution.
- validations:
- required: false
- - type: textarea
- attributes:
- label: Additional context
- description: Add additional context here.
- validations:
- required: false
- type: checkboxes
- id: acknowledgments
attributes:
- label: Acknowledgments
- description: Your issue will be closed if you haven't done these steps.
+ label: Acknowledgements
+ description: Your issue will be closed if you don't follow the checklist below!
options:
- - label: I have searched the existing issues; this is new and no duplicate or related to another open issue.
+ - label: This request is not a duplicate of an existing issue.
required: true
- - label: I have written a short but informative title.
+ - label: I have chosen an appropriate title.
required: true
- - label: I properly filled out all of the requested information in this issue.
+ - label: All requested information has been provided properly.
required: true
- - label: The issue is solely related to ReVanced Manager and not caused by patches.
+ - label: The issue is solely related to the ReVanced Manager
required: true
diff --git a/.github/ISSUE_TEMPLATE/feature-issue.yml b/.github/ISSUE_TEMPLATE/feature-issue.yml
index 8df4eab2..fda70e87 100644
--- a/.github/ISSUE_TEMPLATE/feature-issue.yml
+++ b/.github/ISSUE_TEMPLATE/feature-issue.yml
@@ -1,52 +1,42 @@
name: ⭐ Feature request
-description: Create a detailed feature request.
+description: Create a new feature request.
title: 'feat: '
labels: [feature-request]
body:
- - type: dropdown
+ - type: markdown
attributes:
- label: Type
- options:
- - Functionality
- - Cosmetic
- - Other
- validations:
- required: true
+ value: |
+ # ReVanced Manager feature request
+
+ Please check for existing feature requests [here](https://github.com/revanced/revanced-manager/labels/bug) before creating a new one.
- type: textarea
attributes:
- label: Issue
- description: What is the current problem. Why does it require a feature request?
- validations:
- required: true
- - type: textarea
- attributes:
- label: Feature
- description: Describe your feature in detail. How does it solve the issue?
+ label: Feature description
+ description: Describe your feature in detail.
validations:
required: true
- type: textarea
attributes:
label: Motivation
- description: Why should your feature should be considered?
+ description: Explain why the lack of it is a problem.
validations:
required: true
- type: textarea
attributes:
label: Additional context
- description: Add additional context here.
+ description: In case there is something else you want to add.
validations:
required: false
- type: checkboxes
- id: acknowledgements
attributes:
label: Acknowledgements
- description: Your issue will be closed if you haven't done these steps.
+ description: Your issue will be closed if you don't follow the checklist below!
options:
- - label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
+ - label: This request is not a duplicate of an existing issue.
required: true
- - label: I have written a short but informative title.
+ - label: I have chosen an appropriate title.
required: true
- - label: I filled out all of the requested information in this issue properly.
+ - label: All requested information has been provided properly.
required: true
- - label: The issue is related solely to the ReVanced Manager
+ - label: The issue is solely related to the ReVanced Manager
required: true
diff --git a/.gitignore b/.gitignore
index 2f302002..aa4fd514 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,7 @@ unlinked.ds
unlinked_spec.ds
# Android related
+.gradle/
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 13b99831..9f8312e7 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -85,7 +85,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// ReVanced
- implementation "app.revanced:revanced-patcher:14.2.1"
+ implementation "app.revanced:revanced-patcher:14.2.2"
// Signing & aligning
implementation("org.bouncycastle:bcpkix-jdk15on:1.70")
diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt
index 2c11653d..4bdb6cf0 100644
--- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt
+++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt
@@ -24,7 +24,6 @@ import java.io.StringWriter
import java.util.logging.LogRecord
import java.util.logging.Logger
-
class MainActivity : FlutterActivity() {
private val handler = Handler(Looper.getMainLooper())
private lateinit var installerChannel: MethodChannel
@@ -182,7 +181,8 @@ class MainActivity : FlutterActivity() {
updateProgress(0.1, "Loading patches...", "Loading patches")
val patches = PatchBundleLoader.Dex(
- File(patchBundleFilePath)
+ File(patchBundleFilePath),
+ optimizedDexDirectory = cacheDir
).filter { patch ->
val isCompatible = patch.compatiblePackages?.any {
it.name == patcher.context.packageMetadata.packageName
diff --git a/lib/ui/views/app_selector/app_selector_viewmodel.dart b/lib/ui/views/app_selector/app_selector_viewmodel.dart
index 9075b2a3..e3691bba 100644
--- a/lib/ui/views/app_selector/app_selector_viewmodel.dart
+++ b/lib/ui/views/app_selector/app_selector_viewmodel.dart
@@ -90,10 +90,14 @@ class AppSelectorViewModel extends BaseViewModel {
await DeviceApps.getApp(packageName, true) as ApplicationWithIcon?;
if (app != null) {
if (await checkSplitApk(packageName) && !isRooted) {
- return showSelectFromStorageDialog(context);
+ if (context.mounted) {
+ return showSelectFromStorageDialog(context);
+ }
} else if (!await checkSplitApk(packageName) || isRooted) {
selectApp(app);
- Navigator.pop(context);
+ if (context.mounted) {
+ Navigator.pop(context);
+ }
}
}
}
diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart
index 508c449d..7988d6fb 100644
--- a/lib/ui/views/installer/installer_view.dart
+++ b/lib/ui/views/installer/installer_view.dart
@@ -21,11 +21,23 @@ class InstallerView extends StatelessWidget {
bottom: false,
child: Scaffold(
floatingActionButton: Visibility(
- visible: !model.isPatching,
+ visible: !model.isPatching && !model.hasErrors,
child: FloatingActionButton.extended(
- label: I18nText('installerView.installButton'),
- icon: const Icon(Icons.file_download_outlined),
- onPressed: () => model.installTypeDialog(context),
+ label: I18nText(
+ model.isInstalled
+ ? 'installerView.openButton'
+ : 'installerView.installButton',
+ ),
+ icon: model.isInstalled
+ ? const Icon(Icons.open_in_new)
+ : const Icon(Icons.file_download_outlined),
+ onPressed: model.isInstalled
+ ? () => {
+ model.openApp(),
+ model.cleanPatcher(),
+ Navigator.of(context).pop(),
+ }
+ : () => model.installTypeDialog(context),
elevation: 0,
),
),
diff --git a/lib/ui/views/navigation/navigation_viewmodel.dart b/lib/ui/views/navigation/navigation_viewmodel.dart
index 99110cc1..0967501d 100644
--- a/lib/ui/views/navigation/navigation_viewmodel.dart
+++ b/lib/ui/views/navigation/navigation_viewmodel.dart
@@ -18,13 +18,12 @@ class NavigationViewModel extends IndexTrackingViewModel {
Future initialize(BuildContext context) async {
locator().initialize(context);
final SharedPreferences prefs = await SharedPreferences.getInstance();
- requestManageExternalStorage();
+ await requestManageExternalStorage();
if (prefs.getBool('permissionsRequested') == null) {
await Permission.storage.request();
- await Permission.manageExternalStorage.request();
await prefs.setBool('permissionsRequested', true);
- RootAPI().hasRootPermissions().then(
+ await RootAPI().hasRootPermissions().then(
(value) => Permission.requestInstallPackages.request().then(
(value) => Permission.ignoreBatteryOptimizations.request(),
),
diff --git a/lib/ui/views/patches_selector/patches_selector_view.dart b/lib/ui/views/patches_selector/patches_selector_view.dart
index 9039c2ce..2ad050d0 100644
--- a/lib/ui/views/patches_selector/patches_selector_view.dart
+++ b/lib/ui/views/patches_selector/patches_selector_view.dart
@@ -199,7 +199,8 @@ class _PatchesSelectorViewState extends State {
supportedPackageVersions:
model.getSupportedVersions(patch),
isUnsupported: !isPatchSupported(patch),
- isChangeEnabled: _managerAPI.isPatchesChangeEnabled(),
+ isChangeEnabled:
+ _managerAPI.isPatchesChangeEnabled(),
isNew: model.isPatchNew(
patch,
model.getAppInfo().packageName,
@@ -221,8 +222,23 @@ class _PatchesSelectorViewState extends State {
padding: const EdgeInsets.symmetric(
vertical: 10.0,
),
- child: I18nText(
- 'patchesSelectorView.universalPatches',
+ child: Container(
+ padding: const EdgeInsets.only(
+ top: 10.0,
+ bottom: 10.0,
+ left: 5.0,
+ ),
+ child: I18nText(
+ 'patchesSelectorView.universalPatches',
+ child: Text(
+ '',
+ style: TextStyle(
+ color: Theme.of(context)
+ .colorScheme
+ .primary,
+ ),
+ ),
+ ),
),
),
...model.getQueriedPatches(_query).map((patch) {
@@ -236,7 +252,8 @@ class _PatchesSelectorViewState extends State {
supportedPackageVersions:
model.getSupportedVersions(patch),
isUnsupported: !isPatchSupported(patch),
- isChangeEnabled: _managerAPI.isPatchesChangeEnabled(),
+ isChangeEnabled:
+ _managerAPI.isPatchesChangeEnabled(),
isNew: false,
isSelected: model.isSelected(patch),
onChanged: (value) => model.selectPatch(