Compare commits

..

56 Commits

Author SHA1 Message Date
08f6724060 chore: merge dev branch to main branch (#1060) 2023-08-03 02:20:24 +03:00
29daf51e64 build: bump version to 2023-08-03 02:19:14 +03:00
b3b2b01c0f ci(build): use pr event trigger for now
I just heard of cache eviction policy :)
2023-08-01 20:20:27 +07:00
c3212d0308 ci(build): update event trigger
Run on every PR

Run on every Push, ignore main branch, and ignore tag
2023-08-01 19:32:52 +07:00
aaa114ba13 ci(pr-build): reinstate functionality
PR Build was never use because it have to be manually trigger
2023-08-01 19:26:26 +07:00
8ca6418630 refactor(settings): improve clarity of the warning dialogs (#1058) 2023-07-31 21:53:23 +07:00
95632b7f55 chore(deps): update revanced-patcher to v12.0.0 2023-07-30 11:49:01 +07:00
64744b2abf fix: original.apk not found despite existing (#1052) 2023-07-30 10:35:34 +07:00
096b315701 fix(patch-item): remove redundant patch version completely (#1059)
https://github.com/ReVanced/revanced-patches/pull/2709
2023-07-29 16:21:30 +07:00
c27ca08d3a docs: leftovers from 6495687841524cd82ab65990c9c44d53d377db6e 2023-07-29 16:08:54 +07:00
0011222371 chore:fix incorrect version 2023-07-23 14:25:11 +05:30
29db947e25 fix: using non const value in a const variable 2023-07-23 14:04:35 +05:30
fd43ac7581 chore: merge dev branch to main branch (#1032) 2023-07-23 13:53:25 +05:30
e49c19b3cd feat: support older version of android for reddit client patches 2023-07-23 13:51:36 +05:30
Pun
06f0e59967 chore(deps): update libsu to v5.2.0 2023-07-22 13:21:13 +07:00
Pun
c5fc5ee93b build: speed up compilation time
faster build faster build faster build faster build faster build
2023-07-19 18:30:50 +07:00
159c85bd1f fix: close previous dialog when user reset the API URL (#1025) 2023-07-16 21:04:35 +07:00
Pun
2460acf0f4 ci(analyze): don't run when PR is in draft 2023-07-16 17:10:29 +07:00
Pun
6495687841 docs: correct misspelling (EN_US)
This correct spelling to English American, because by default, we use English US.
2023-07-16 16:31:08 +07:00
Pun
d229ccb36c ci(analyze): clarify job name that the job do static analysis & format checking 2023-07-16 16:21:16 +07:00
Pun
4d6a57ddcf ci(analyze): restore run when commit push to dev branch 2023-07-16 16:17:15 +07:00
d161d55aaf fix: patched applications not showing at launch (#1031) 2023-07-16 12:46:01 +07:00
Pun
768ad0c9bc chore: merge dev branch to main branch (#1011)
ReVanced Manager v1.4.1
2023-07-15 20:33:30 +07:00
29323d4e20 build: update app version to v1.4.1 2023-07-15 12:55:59 +07:00
630b22e193 refactor: applies changes from formatter & linter 2023-07-15 12:41:03 +07:00
79116f9e67 fix(patched-applications): non-patched app showing on Installed section (#1022) 2023-07-15 08:11:51 +07:00
eb58475259 fix: showing Installed when it's actually not (#1021) 2023-07-15 08:10:36 +07:00
a879ac30fb fix: prevent unsupported operation exception (#1018) 2023-07-14 17:55:04 +07:00
c5b0621323 fix(navigation-view): back button closing the app from any page (#1019) 2023-07-13 19:25:48 +05:45
0462815014 fix(app-selector): fix text overflow on small screen (#1017) 2023-07-13 00:16:53 +05:45
e64318c947 fix(app-selector): fix text overflow on small screen 2023-07-13 00:14:47 +05:45
b784482788 chore: update libsu to 5.1.0
This should fixes some issues with root
2023-07-11 19:28:59 +07:00
2834e8b348 fix: patchable apps not showing if none of them is installed (#1009) 2023-07-11 17:11:45 +07:00
b23dfd4289 chore: merge dev branch to main branch (#1010) 2023-07-11 01:24:54 +05:30
217d525cb2 build: update app version to v1.4.0 2023-07-11 01:22:57 +05:30
85b166cbda fix: update hardcoded patch name 2023-07-11 01:21:45 +05:30
9a57f8b858 ci(build): use correct JDK version
There's no reasons to go higher than JDK 11 since we compile the application using JDK 11
2023-07-10 21:42:24 +07:00
Pun
3bfdc932c2 chore: update app description
👍👍 Patch your favourite apps, right on your device.
2023-07-10 21:27:20 +07:00
48c878af21 chore: merge dev branch to main branch (#996) 2023-07-10 16:56:50 +03:00
490a7a58fc build: update app version to v1.3.9
ReVanced Manager, 1.3.9 (10030009)

See PR #996
2023-07-10 20:40:40 +07:00
567b1a3ace refactor: improve code readability according to linter 2023-07-10 19:45:50 +07:00
6a45db8a38 refactor: improve code readability according to formatter 2023-07-10 19:36:50 +07:00
Pun
b272988929 build: always compile with the latest SDK supported by Flutter
`targetSdkVersion` is still the same, we want to test the application first before bumping up to latest.
2023-07-10 18:43:07 +07:00
9828857570 fix: fixed typo 2023-07-10 12:16:51 +05:45
ecb54d8e44 docs: improve clarity of speech in issue template (#1005)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-07-09 23:15:20 +02:00
344717b021 fix: app crash after custom source (#1003) 2023-07-08 23:07:19 +05:45
da6cf585c0 fix: app crash after custom source 2023-07-08 22:26:31 +05:45
9e93177afd feat: show warning dialog when resetting stored patches
This prevent user from accidentally resetting stored patches by showing
them warning dialog.
2023-07-08 11:01:10 +07:00
16318efb01 refactor: seperate translation string by context 2023-07-08 10:45:13 +07:00
e83e13b6d4 refactor: fix more problem with analyser
Missing trailing comma in app_selector_view
2023-07-07 22:21:22 +07:00
7c2c695d88 refactor: apply changes from analyser 2023-07-07 22:15:12 +07:00
c7b227529d chore: disable unnecessary tooltip
Remove tooltip in Navigation View, there's no impact to accessibility.

Tested using: Android TalkBack
2023-07-07 22:11:13 +07:00
14f49e9d30 docs: fix description for next page 2023-07-05 15:43:40 +02:00
1875c4ee73 fix: update button being clickable when offline (#987) 2023-07-05 19:59:53 +07:00
76c68baa1f build: update gradle to v7.6.2 2023-07-01 18:21:49 +07:00
68876a4414 build: bump version to v1.3.8 and patcher dep 2023-07-01 14:33:25 +05:30
71 changed files with 519 additions and 376 deletions

View File

@ -29,7 +29,7 @@ body:
- type: textarea
attributes:
label: Steps to reproduce
description: Add the steps to reproduce this bug including your environment.
description: Add the steps to reproduce this bug, including your environment.
placeholder: Step 1. Download some files. Step 2. ...
validations:
required: true
@ -74,20 +74,20 @@ body:
- 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 no need for backticks.
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so there is no need for backticks.
render: shell
validations:
required: true
- type: textarea
attributes:
label: Installer logs (exported using Installer menu option) [unneeded if issue is not during patching].
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
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.
render: shell
validations:
required: false
- type: textarea
attributes:
label: Screenshots or videos
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:
@ -105,16 +105,16 @@ body:
validations:
required: false
- type: checkboxes
id: acknowledgements
id: acknowledgments
attributes:
label: Acknowledgements
label: Acknowledgments
description: Your issue will be closed if you haven't done these steps.
options:
- label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
- label: I have searched the existing issues; this is new and no duplicate or related to another open issue.
required: true
- label: I have written a short but informative title.
required: true
- label: I filled out all of the requested information in this issue properly.
- label: I properly filled out all of the requested information in this issue.
required: true
- label: The issue is related solely to the ReVanced Manager and not related to patching errors or patches
- label: The issue is solely related to ReVanced Manager and not caused by patches.
required: true

View File

@ -1,14 +1,25 @@
name: Analyze Code
on:
push:
branches: [ "dev" ]
paths:
- "**.dart"
- ".github/workflows/analyze.yml"
pull_request:
branches: [ "main", "dev" ]
types:
- opened
- reopened
- synchronize
- ready_for_review
paths:
- "**.dart"
- ".github/workflows/analyze.yml"
jobs:
build:
name: "Static analysis & format check"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

View File

@ -1,7 +1,7 @@
name: PR Build
on:
workflow_dispatch:
pull_request:
jobs:
build:
@ -18,7 +18,7 @@ jobs:
- name: Setup JDK
uses: actions/setup-java@v3
with:
java-version: '17'
java-version: '11'
distribution: 'zulu'
cache: 'gradle'
- name: Setup Flutter

View File

@ -12,10 +12,10 @@ jobs:
- uses: actions/checkout@v3
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 12
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: "12"
java-version: "11"
distribution: "zulu"
- uses: subosito/flutter-action@v2
with:

View File

@ -21,7 +21,7 @@ jobs:
- name: Setup JDK
uses: actions/setup-java@v3
with:
java-version: '17'
java-version: '11'
distribution: 'zulu'
cache: 'gradle'
- name: Setup Node.js

View File

@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 33
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
@ -71,7 +71,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// ReVanced
implementation "app.revanced:revanced-patcher:11.0.3"
implementation "app.revanced:revanced-patcher:12.0.0"
// Signing & aligning
implementation("org.bouncycastle:bcpkix-jdk15on:1.70")

View File

@ -2,23 +2,29 @@
package="app.revanced.manager.flutter">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<application
android:label="ReVanced Manager"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:extractNativeLibs="true"
android:enableOnBackInvokedCallback="true">
<activity

View File

@ -1,3 +1,6 @@
org.gradle.jvmargs=-Xmx1536M
org.gradle.jvmargs=-Xmx1536M -XX:+UseParallelGC
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.caching=true
android.useAndroidX=true
android.enableJetifier=true

View File

@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
distributionSha256Sum=6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87
distributionSha256Sum=a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -147,9 +147,9 @@
"sentryLabel": "تسجيل الحراسة",
"sentryHint": "إرسال سجلات مجهولة لمساعدتنا في تحسين ReVanced Manager",
"restartAppForChanges": "إعادة تشغيل التطبيق لتطبيق التغييرات",
"deleteKeystoreLabel": "حذف ملف تخزين المفاتيح",
"deleteKeystoreHint": "حذف ملف تخزين المفاتيح المستخدم للتوقيع على التطبيق",
"deletedKeystore": "تم حذف مِلَفّ تخزين المفاتيح",
"regenerateKeystoreLabel": "حذف ملف تخزين المفاتيح",
"regenerateKeystoreHint": "حذف ملف تخزين المفاتيح المستخدم للتوقيع على التطبيق",
"regeneratedKeystore": "تم حذف مِلَفّ تخزين المفاتيح",
"deleteTempDirLabel": "حذف الملفات المؤقتة",
"deleteTempDirHint": "حذف الملفات المؤقتة غير المستخدمة",
"deletedTempDir": "تم حذف الملفات المؤقتة",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Keşikçi jurnalı",
"sentryHint": "ReVanced Manager-i inkişaf etdirməyimizə kömək etməsi üçün anonim jurnallar göndərin",
"restartAppForChanges": "Dəyişiklikləri tətbiq etmək üçün tətbiqi yenidən başlat",
"deleteKeystoreLabel": "Keystore-u sil",
"deleteKeystoreHint": "Tətbiqi imzalamaq üçün istifadə edilən keystoru-u sil",
"deletedKeystore": "Keystore silindi",
"regenerateKeystoreLabel": "Keystore-u sil",
"regenerateKeystoreHint": "Tətbiqi imzalamaq üçün istifadə edilən keystoru-u sil",
"regeneratedKeystore": "Keystore silindi",
"deleteTempDirLabel": "Müvəqqəti faylları sil",
"deleteTempDirHint": "İstifadə edilməyən müvəqqəti faylları sil",
"deletedTempDir": "Müvəqqəti fayllar silindi",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Sentry логване",
"sentryHint": "Пращайте анонимни логове за да ни помогнете да подобрим ReVanced Manager",
"restartAppForChanges": "Рестартирайте приложението, за да се приложат промените",
"deleteKeystoreLabel": "Изтриване на keystore",
"deleteKeystoreHint": "Изтриване на keystore използван за подписване на приложението",
"deletedKeystore": "Keystore изтрит",
"regenerateKeystoreLabel": "Изтриване на keystore",
"regenerateKeystoreHint": "Изтриване на keystore използван за подписване на приложението",
"regeneratedKeystore": "Keystore изтрит",
"deleteTempDirLabel": "Изтриване на временни файлове",
"deleteTempDirHint": "Изтриване на неизползвани временни файлове",
"deletedTempDir": "Временните файлове са изтрити",

View File

@ -143,9 +143,9 @@
"sentryLabel": "সেন্ট্রি লগিং",
"sentryHint": "ReVanced Manager উন্নত করতে আমাদের সাহায্য করতে বেনামী লগ পাঠান",
"restartAppForChanges": "পরিবর্তনগুলি প্রয়োগ করতে অ্যাপটি পুনরায় চালু করুন",
"deleteKeystoreLabel": "কীস্টোর মুছুন",
"deleteKeystoreHint": "প্যাচড অ্যাপ সাইন করতে ব্যবহৃত কীস্টোরটি মুছুন",
"deletedKeystore": "কীস্টোর মুছে ফেলা হয়েছে",
"regenerateKeystoreLabel": "কীস্টোর মুছুন",
"regenerateKeystoreHint": "প্যাচড অ্যাপ সাইন করতে ব্যবহৃত কীস্টোরটি মুছুন",
"regeneratedKeystore": "কীস্টোর মুছে ফেলা হয়েছে",
"deleteTempDirLabel": "অস্থায়ী ফাইল মুছুন",
"deleteTempDirHint": "অব্যবহৃত অস্থায়ী ফাইল মুছুন",
"deletedTempDir": "অস্থায়ী ফাইল মুছে ফেলা হয়েছে",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Log Sentry",
"sentryHint": "Odeslat anonymní protokoly, které nám pomohou zlepšit ReVanced Manager",
"restartAppForChanges": "Pro aplikování změn restartuj aplikaci",
"deleteKeystoreLabel": "Vymazat úložiště klíčů",
"deleteKeystoreHint": "Smazat úložiště klíčů používané k podpisu aplikace",
"deletedKeystore": "Úložiště klíčů bylo smazáno",
"regenerateKeystoreLabel": "Vymazat úložiště klíčů",
"regenerateKeystoreHint": "Smazat úložiště klíčů používané k podpisu aplikace",
"regeneratedKeystore": "Úložiště klíčů bylo smazáno",
"deleteTempDirLabel": "Odstranit dočasné soubory",
"deleteTempDirHint": "Odstranit nepoužité dočasné soubory",
"deletedTempDir": "Dočasné soubory byly smazány",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Sentry logning",
"sentryHint": "Send anonyme logfiler for at hjælpe os med at forbedre ReVanced Manager",
"restartAppForChanges": "Genstart appen for at anvende ændringer",
"deleteKeystoreLabel": "Slet keystore",
"deleteKeystoreHint": "Slet keystore der bruges til at signere appen",
"deletedKeystore": "Keystore slettet",
"regenerateKeystoreLabel": "Slet keystore",
"regenerateKeystoreHint": "Slet keystore der bruges til at signere appen",
"regeneratedKeystore": "Keystore slettet",
"deleteTempDirLabel": "Slet midlertidige filer",
"deleteTempDirHint": "Slet ubrugte midlertidige filer",
"deletedTempDir": "Midlertidige filer slettet",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Sentry-Protokollierung",
"sentryHint": "Sende anonyme Protokolle, um den ReVanced Manager zu verbessern",
"restartAppForChanges": "Starte die App neu um die Änderungen zu übernehmen",
"deleteKeystoreLabel": "Den Schlüsselspeicher löschen",
"deleteKeystoreHint": "Löschen des Schlüsselspeichers, der zum Signieren der Anwendung verwendet wurde",
"deletedKeystore": "Schlüsselspeicher gelöscht",
"regenerateKeystoreLabel": "Den Schlüsselspeicher löschen",
"regenerateKeystoreHint": "Löschen des Schlüsselspeichers, der zum Signieren der Anwendung verwendet wurde",
"regeneratedKeystore": "Schlüsselspeicher gelöscht",
"deleteTempDirLabel": "Lösche temporäre Dateien",
"deleteTempDirHint": "Unbenutzte temporäre Dateien löschen",
"deletedTempDir": "Temporäre Dateien gelöscht",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Αρχεία καταγραφής «Sentry»",
"sentryHint": "Στείλτε ανώνυμα αρχεία καταγραφής για να μας βοηθήσετε να βελτιώσουμε το ReVanced Manager",
"restartAppForChanges": "Επανεκκινήστε την εφαρμογή για να εφαρμόσετε αλλαγές",
"deleteKeystoreLabel": "Διαγραφή κλειδιών",
"deleteKeystoreHint": "Διαγράψτε το κλειδί που χρησιμοποιείται για την υπογραφή της εφαρμογής",
"deletedKeystore": "Το κλειδί διαγράφηκε",
"regenerateKeystoreLabel": "Διαγραφή κλειδιών",
"regenerateKeystoreHint": "Διαγράψτε το κλειδί που χρησιμοποιείται για την υπογραφή της εφαρμογής",
"regeneratedKeystore": "Το κλειδί διαγράφηκε",
"deleteTempDirLabel": "Διαγραφή προσωρινών αρχείων",
"deleteTempDirHint": "Διαγραφή των αχρησιμοποίητων προσωρινών αρχείων",
"deletedTempDir": "Τα προσωρινά αρχεία διαγράφηκαν",

View File

@ -17,23 +17,33 @@
"homeView": {
"refreshSuccess": "Refreshed successfully",
"widgetTitle": "Dashboard",
"updatesSubtitle": "Updates",
"patchedSubtitle": "Patched applications",
"updatesAvailable": "Updates available",
"noUpdates": "No updates available",
"WIP": "Work in progress...",
"noInstallations": "No patched applications installed",
"installed": "Installed",
"installUpdate": "Continue to install the update?",
"updateDialogTitle": "Update Manager",
"updateChangelogTitle": "Changelog",
"notificationTitle": "Update downloaded",
"notificationText": "Tap to install the update",
"downloadingMessage": "Downloading update...",
"downloadedMessage": "Update downloaded!",
"installingMessage": "Installing update...",
"errorDownloadMessage": "Unable to download update",
"errorInstallMessage": "Unable to install update",
"noConnection": "No internet connection",
"updatesDisabled": "Updating a patched app is currently disabled. Repatch the app again."
},
@ -52,6 +62,7 @@
"patcherView": {
"widgetTitle": "Patcher",
"patchButton": "Patch",
"patchDialogText": "You have selected a resource patch and a split APK installation has been detected, so patching errors may occur.\nAre you sure you want to proceed?",
"armv7WarningDialogText": "Patching on ARMv7 devices is not yet supported and might fail. Proceed anyways?",
"splitApkWarningDialogText": "Patching a split APK is not yet supported and might fail. Proceed anyways?"
@ -60,8 +71,10 @@
"widgetTitle": "Select an application",
"widgetTitleSelected": "Selected application",
"widgetSubtitle": "No application selected",
"noAppsLabel": "No applications found",
"notInstalled":"App not installed",
"currentVersion": "Current",
"suggestedVersion": "Suggested",
"allVersions": "All versions"
@ -69,6 +82,7 @@
"patchSelectorCard": {
"widgetTitle": "Select patches",
"widgetTitleSelected": "Selected patches",
"widgetSubtitle": "Select an application first",
"widgetEmptySubtitle": "No patches selected"
},
@ -79,24 +93,33 @@
"appSelectorView": {
"viewTitle": "Select an application",
"searchBarHint": "Search applications",
"selectFromStorageButton": "Select from storage",
"storageButton": "Storage",
"selectFromStorageButton": "Select from storage",
"errorMessage": "Unable to use selected application",
"downloadToast": "Download function is not available yet",
"featureNotAvailable": "Feature not implemented",
"featureNotAvailableText": "This application is a split APK and cannot be selected. Unfortunately, this feature is only available for rooted users at the moment. However, you can still install the application by selecting its APK files from your device's storage instead"
},
"patchesSelectorView": {
"viewTitle": "Select patches",
"searchBarHint": "Search patches",
"doneButton": "Done",
"default": "Default",
"defaultTooltip": "Select all default patches",
"none": "None",
"noneTooltip": "Deselect all patches",
"loadPatchesSelection": "Load patches selection",
"noSavedPatches": "No saved patches for the selected app.\nPress Done to save current selection.",
"noPatchesFound": "No patches found for the selected app",
"selectAllPatchesWarningContent": "You are about to select all patches, that includes non-suggested patches and can cause unwanted behavior."
},
"patchItem": {
@ -109,11 +132,14 @@
"installRootButton": "Install as Root",
"openButton": "Open",
"shareButton": "Share file",
"notificationTitle": "ReVanced Manager is patching",
"notificationText": "Tap to return to the installer",
"shareApkMenuOption": "Share APK",
"exportApkMenuOption": "Export APK",
"shareLogMenuOption": "Share log",
"installErrorDialogTitle": "Error",
"installErrorDialogText1": "Root install is not possible with the current patches selection.\nRepatch your app or choose non-root install.",
"installErrorDialogText2": "Non-root install is not possible with the current patches selection.\nRepatch your app or choose root install if you have your device rooted.",
@ -122,74 +148,99 @@
},
"settingsView": {
"widgetTitle": "Settings",
"appearanceSectionTitle": "Appearance",
"teamSectionTitle": "Team",
"infoSectionTitle": "Info",
"advancedSectionTitle": "Advanced",
"exportSectionTitle": "Import & export",
"logsSectionTitle": "Logs",
"darkThemeLabel": "Dark mode",
"darkThemeHint": "Welcome to the dark side",
"dynamicThemeLabel": "Material You",
"dynamicThemeHint": "Enjoy an experience closer to your device",
"languageLabel": "Language",
"englishOption": "English",
"sourcesLabel": "Sources",
"sourcesLabelHint": "Configure your custom sources",
"hostRepositoryLabel": "Repository API",
"orgPatchesLabel": "Patches organization",
"sourcesPatchesLabel": "Patches source",
"orgIntegrationsLabel": "Integrations organization",
"sourcesIntegrationsLabel": "Integrations source",
"sourcesResetDialogTitle": "Reset",
"sourcesResetDialogText": "Are you sure you want to reset custom sources to their default values?",
"apiURLResetDialogText": "Are you sure you want to reset API URL to its default value?",
"contributorsLabel": "Contributors",
"contributorsHint": "A list of contributors of ReVanced",
"logsLabel": "Logs",
"logsHint": "Share Manager's logs",
"apiURLLabel": "API URL",
"apiURLHint": "Configure your custom API URL",
"selectApiURL": "API URL",
"hostRepositoryLabel": "Repository API",
"orgPatchesLabel": "Patches organization",
"sourcesPatchesLabel": "Patches source",
"orgIntegrationsLabel": "Integrations organization",
"contributorsLabel": "Contributors",
"contributorsHint": "A list of contributors of ReVanced",
"logsLabel": "Logs",
"logsHint": "Share Manager's logs",
"experimentalUniversalPatchesLabel": "Experimental universal patches support",
"experimentalUniversalPatchesHint": "Display all applications to use with universal patches, loading list of apps may be slower",
"experimentalPatchesLabel": "Experimental patches support",
"experimentalPatchesHint": "Enable usage of unsupported patches in any app version",
"enabledExperimentalPatches": "Experimental patches support enabled",
"exportSectionTitle": "Import & export",
"aboutLabel": "About",
"snackbarMessage": "Copied to clipboard",
"restartAppForChanges": "Restart the app to apply changes",
"deleteKeystoreLabel": "Delete keystore",
"deleteKeystoreHint": "Delete the keystore used to sign the app",
"deleteKeystoreDialogText": "Are you sure you want to delete the keystore used to sign patched applications?",
"deletedKeystore": "Keystore deleted",
"deleteTempDirLabel": "Delete temporary files",
"deleteTempDirHint": "Delete unused temporary files",
"deletedTempDir": "Temporary files deleted",
"exportPatchesLabel": "Export patches selection",
"exportPatchesHint": "Export patches selection to a JSON file",
"exportedPatches": "Patches selection exported",
"noExportFileFound": "No patches selection to export",
"importPatchesLabel": "Import patches selection",
"importPatchesHint": "Import patches selection from a JSON file",
"importedPatches": "Patches selection imported",
"resetStoredPatchesLabel": "Reset patches",
"resetStoredPatchesHint": "Reset the stored patches selection",
"resetStoredPatchesDialogTitle": "Reset patches selection?",
"resetStoredPatchesDialogText": "Resetting patches selection will remove all selected patches.",
"resetStoredPatches": "Patches selection has been reset",
"jsonSelectorErrorMessage": "Unable to use selected JSON file",
"deleteLogsLabel": "Delete logs",
"deleteLogsHint": "Delete collected manager logs",
"deletedLogs": "Logs deleted",
"regenerateKeystoreLabel": "Regenerate keystore",
"regenerateKeystoreHint": "Regenerate the keystore used to sign the app",
"regenerateKeystoreDialogTitle": "Regenerate keystore?",
"regenerateKeystoreDialogText": "Patched apps signed with the old keystore will no longer be able to update.",
"regeneratedKeystore": "Keystore regenerated",
"exportKeystoreLabel": "Export keystore",
"exportKeystoreHint": "Export keystore used to sign apps",
"exportedKeystore": "Keystore exported",
"noKeystoreExportFileFound": "No keystore to export",
"importKeystoreLabel": "Import keystore",
"importKeystoreHint": "Import keystore used to sign apps",
"importedKeystore": "Keystore imported",
"keystoreSelectorErrorMessage": "Unable to use selected KEYSTORE file",
"selectKeystorePassword": "Keystore Password",
"selectKeystorePasswordHint": "Select keystore password used to sign the apk"
"selectKeystorePasswordHint": "Select keystore password used to sign the apk",
"jsonSelectorErrorMessage": "Unable to use selected JSON file",
"keystoreSelectorErrorMessage": "Unable to use selected KEYSTORE file"
},
"appInfoView": {
"widgetTitle": "App info",
@ -197,18 +248,22 @@
"uninstallButton": "Uninstall",
"patchButton": "Patch",
"unpatchButton": "Unpatch",
"unpatchDialogText": "Are you sure you want to unpatch this app?",
"rootDialogTitle": "Error",
"unpatchDialogText": "Are you sure you want to unpatch this app?",
"rootDialogText": "App was installed with superuser permissions, but currently ReVanced Manager has no permissions.\nPlease grant superuser permissions first.",
"packageNameLabel": "Package name",
"originalPackageNameLabel": "Original package name",
"installTypeLabel": "Installation type",
"rootTypeLabel": "Root",
"nonRootTypeLabel": "Non-root",
"patchedDateLabel": "Patched date",
"patchedDateHint": "{date} at {time}",
"appliedPatchesLabel": "Applied patches",
"patchedDateHint": "{date} at {time}",
"appliedPatchesHint": "{quantity} applied patches",
"updateNotImplemented": "This feature has not been implemented yet"
},
"contributorsView": {

View File

@ -147,9 +147,9 @@
"sentryLabel": "Registro Sentry",
"sentryHint": "Enviar registros anónimos para ayudarnos a mejorar ReVanced Manager",
"restartAppForChanges": "Reinicie la app para aplicar los cambios",
"deleteKeystoreLabel": "Eliminar keystore",
"deleteKeystoreHint": "Eliminar el keystore usado para firmar la app",
"deletedKeystore": "Keystore eliminado",
"regenerateKeystoreLabel": "Eliminar keystore",
"regenerateKeystoreHint": "Eliminar el keystore usado para firmar la app",
"regeneratedKeystore": "Keystore eliminado",
"deleteTempDirLabel": "Borrar archivos temporales",
"deleteTempDirHint": "Eliminar archivos temporales no utilizados",
"deletedTempDir": "Archivos temporales eliminados",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Registro centinela",
"sentryHint": "Enviar registros anónimos para ayudarnos a mejorar ReVanced Manager",
"restartAppForChanges": "Reinicie la aplicación para aplicar los cambios",
"deleteKeystoreLabel": "Eliminar keystore",
"deleteKeystoreHint": "Eliminar el keystore usado para firmar la app",
"deletedKeystore": "Keystore eliminado",
"regenerateKeystoreLabel": "Eliminar keystore",
"regenerateKeystoreHint": "Eliminar el keystore usado para firmar la app",
"regeneratedKeystore": "Keystore eliminado",
"deleteTempDirLabel": "Borrar archivos temporales",
"deleteTempDirHint": "Eliminar archivos temporales sin utilizar",
"deletedTempDir": "Archivos temporales eliminados",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry-lokikirjaus",
"sentryHint": "Lähetä nimettömiä tietoja auttaaksesi ReVanced Managerin kehityksessä",
"restartAppForChanges": "Käynnistä sovellus uudestaan muutosten käyttöönottamiseksi",
"deleteKeystoreLabel": "Poista avainsäilö",
"deleteKeystoreHint": "Poista sovelluksen allekirjoitukseen käytetty avainsäilö",
"deletedKeystore": "Avainsäilö poistettiin",
"regenerateKeystoreLabel": "Poista avainsäilö",
"regenerateKeystoreHint": "Poista sovelluksen allekirjoitukseen käytetty avainsäilö",
"regeneratedKeystore": "Avainsäilö poistettiin",
"deleteTempDirLabel": "Poista väliaikaistiedostot",
"deleteTempDirHint": "Poista käyttämättömät väliaikaistiedostot",
"deletedTempDir": "Väliaikaistiedostot poistettiin",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Journal sentinel",
"sentryHint": "Envoyer des journaux anonymes pour nous aider à améliorer ReVanced Manager",
"restartAppForChanges": "Redémarrez l'application pour appliquer les changements",
"deleteKeystoreLabel": "Supprimer le magasin de clés",
"deleteKeystoreHint": "Supprimer le magasin de clés utilisé pour signer l'application",
"deletedKeystore": "Magasin de clés supprimé",
"regenerateKeystoreLabel": "Supprimer le magasin de clés",
"regenerateKeystoreHint": "Supprimer le magasin de clés utilisé pour signer l'application",
"regeneratedKeystore": "Magasin de clés supprimé",
"deleteTempDirLabel": "Supprimer les fichiers temporaires",
"deleteTempDirHint": "Supprimer les fichiers temporaires inutilisés",
"deletedTempDir": "Fichiers temporaires supprimés",

View File

@ -143,9 +143,9 @@
"sentryLabel": "संतरी लॉगिंग",
"sentryHint": "उन्नत प्रबंधक को बेहतर बनाने में हमारी सहायता करने के लिए अनाम लॉग भेजें",
"restartAppForChanges": "Restart the app to apply changes",
"deleteKeystoreLabel": "कीस्टोर मिटाएं",
"deleteKeystoreHint": "ऐप पर हस्ताक्षर करने के लिए उपयोग की जाने वाली कीस्टोर हटाएं",
"deletedKeystore": "कीस्टोर हटा दिया गया",
"regenerateKeystoreLabel": "कीस्टोर मिटाएं",
"regenerateKeystoreHint": "ऐप पर हस्ताक्षर करने के लिए उपयोग की जाने वाली कीस्टोर हटाएं",
"regeneratedKeystore": "कीस्टोर हटा दिया गया",
"deleteTempDirLabel": "अस्थाई फ़ाइलें मिटायें",
"deleteTempDirHint": "अप्रयुक्त अस्थाई फ़ाइलें मिटायें",
"deletedTempDir": "क्षणिक फ़ाईल मिटाए गए।",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry naplózás",
"sentryHint": "Névtelen használati adatok küldésével hozzájárulhatsz, hogy a ReVanced Manager még jobb legyen",
"restartAppForChanges": "Indítsd újra az alkalmazást a változások alkalmazásához",
"deleteKeystoreLabel": "Kulcstartó törlése",
"deleteKeystoreHint": "Törli az alkalmazás aláírásához használt kulcstartót",
"deletedKeystore": "Kulcstartó törölve",
"regenerateKeystoreLabel": "Kulcstartó törlése",
"regenerateKeystoreHint": "Törli az alkalmazás aláírásához használt kulcstartót",
"regeneratedKeystore": "Kulcstartó törölve",
"deleteTempDirLabel": "Ideiglenes fájlok törlése",
"deleteTempDirHint": "Felesleges átmeneti fájlok törlése",
"deletedTempDir": "Ideiglenes fájlok törölve",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Log sentry",
"sentryHint": "Kirim log anonim untuk membantu kami meningkatkan ReVanced Manager",
"restartAppForChanges": "Mulai ulang aplikasi untuk menerapkan perubahan",
"deleteKeystoreLabel": "Hapus penyimpanan kunci",
"deleteKeystoreHint": "Hapus penyimpanan kunci yang digunakan untuk menandatangani aplikasi",
"deletedKeystore": "Penyimpanan kunci dihapus",
"regenerateKeystoreLabel": "Hapus penyimpanan kunci",
"regenerateKeystoreHint": "Hapus penyimpanan kunci yang digunakan untuk menandatangani aplikasi",
"regeneratedKeystore": "Penyimpanan kunci dihapus",
"deleteTempDirLabel": "Hapus berkas sementara",
"deleteTempDirHint": "Hapus berkas sementara yang tidak dipakai",
"deletedTempDir": "Berkas sementara dihapus",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Log di Sentry",
"sentryHint": "Invia log anonimi per aiutarci a migliorare ReVanced Manager",
"restartAppForChanges": "Riavvia l'app per applicare le modifiche",
"deleteKeystoreLabel": "Elimina keystore",
"deleteKeystoreHint": "Elimina il keystore usato per firmare l'applicazione",
"deletedKeystore": "Keystore eliminato",
"regenerateKeystoreLabel": "Elimina keystore",
"regenerateKeystoreHint": "Elimina il keystore usato per firmare l'applicazione",
"regeneratedKeystore": "Keystore eliminato",
"deleteTempDirLabel": "Elimina file temporanei",
"deleteTempDirHint": "Elimina i file temporanei non utilizzati",
"deletedTempDir": "File temporanei eliminati",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry 로깅",
"sentryHint": "익명의 로그를 보내 ReVanced Manager를 개선할 수 있도록 도와주세요",
"restartAppForChanges": "변경 사항을 적용하려면 앱을 다시 시작하세요",
"deleteKeystoreLabel": "키스토어 제거",
"deleteKeystoreHint": "앱을 서명하기 위해 사용되는 키스토어를 제거합니다.",
"deletedKeystore": "키스토어 제거됨",
"regenerateKeystoreLabel": "키스토어 제거",
"regenerateKeystoreHint": "앱을 서명하기 위해 사용되는 키스토어를 제거합니다.",
"regeneratedKeystore": "키스토어 제거됨",
"deleteTempDirLabel": "임시 파일 삭제",
"deleteTempDirHint": "사용되지 않은 임시 파일 삭제",
"deletedTempDir": "임시 파일 삭제됨",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Klaidų rinkimo įrankio įrašai",
"sentryHint": "Siųsti anoniminius įrašus, kad padėtumėte mums tobulinti ReVanced Manager",
"restartAppForChanges": "Iš naujo paleiskite programą, kad modifikacijos įsigaliotų",
"deleteKeystoreLabel": "Ištrinti keystore",
"deleteKeystoreHint": "Ištrinti keystore kuris naudojamas pasirašyti programą",
"deletedKeystore": "Keystore ištrintas",
"regenerateKeystoreLabel": "Ištrinti keystore",
"regenerateKeystoreHint": "Ištrinti keystore kuris naudojamas pasirašyti programą",
"regeneratedKeystore": "Keystore ištrintas",
"deleteTempDirLabel": "Ištrinti laikinus failus",
"deleteTempDirHint": "Ištrinti nenaudojamus laikinus failus",
"deletedTempDir": "Laikini failai ištrinti",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Rekod Sentry",
"sentryHint": "Hantarkan log anonymous untuk bantu kami menambah baik Revanced Manager",
"restartAppForChanges": "Mulakan semula apl untuk menggunakan tetapan",
"deleteKeystoreLabel": "Buang keystore",
"deleteKeystoreHint": "Buang keystore yang digunakan untuk mengesahkan apl",
"deletedKeystore": "Keystore dibuang",
"regenerateKeystoreLabel": "Buang keystore",
"regenerateKeystoreHint": "Buang keystore yang digunakan untuk mengesahkan apl",
"regeneratedKeystore": "Keystore dibuang",
"deleteTempDirLabel": "Buang fail sementara",
"deleteTempDirHint": "Buang fail sementara yang tidak digunakan",
"deletedTempDir": "Fail sementara dibuang",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Zapisywanie logów",
"sentryHint": "Wysyłaj anonimowe logi, aby pomóc nam ulepszyć ReVanced Manager",
"restartAppForChanges": "Zrestartuj aplikację, aby zastosować zmiany",
"deleteKeystoreLabel": "Usuń klucz",
"deleteKeystoreHint": "Usuń klucz używany do podpisywania aplikacji",
"deletedKeystore": "Klucz usunięty",
"regenerateKeystoreLabel": "Usuń klucz",
"regenerateKeystoreHint": "Usuń klucz używany do podpisywania aplikacji",
"regeneratedKeystore": "Klucz usunięty",
"deleteTempDirLabel": "Usuń pliki tymczasowe",
"deleteTempDirHint": "Usuń nieużywane pliki tymczasowe",
"deletedTempDir": "Pliki tymczasowe zostały usunięte",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Registro do sentinela de erros",
"sentryHint": "Envie registros anônimos para nos ajudar a melhorar o ReVanced Manager",
"restartAppForChanges": "Reinicie o app para aplicar as mudanças",
"deleteKeystoreLabel": "Apagar registro de chaves",
"deleteKeystoreHint": "Apagar o registro de chaves usado para assinar o app",
"deletedKeystore": "Registro de chaves apagado",
"regenerateKeystoreLabel": "Apagar registro de chaves",
"regenerateKeystoreHint": "Apagar o registro de chaves usado para assinar o app",
"regeneratedKeystore": "Registro de chaves apagado",
"deleteTempDirLabel": "Apagar arquivos temporários",
"deleteTempDirHint": "Apagar os arquivos temporários inutilizados",
"deletedTempDir": "Arquivos temporários apagados",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Registo do coletor de erros",
"sentryHint": "Enviar registos anónimos para nos ajudar a melhorar o ReVanced Manager",
"restartAppForChanges": "Reinicia a aplicação para aplicar as alterações",
"deleteKeystoreLabel": "Excluir keystore",
"deleteKeystoreHint": "Excluir a keystore usada para assinar a aplicação",
"deletedKeystore": "Keystore excluída",
"regenerateKeystoreLabel": "Excluir keystore",
"regenerateKeystoreHint": "Excluir a keystore usada para assinar a aplicação",
"regeneratedKeystore": "Keystore excluída",
"deleteTempDirLabel": "Apagar arquivos temporários",
"deleteTempDirHint": "Apagar arquivos temporários não utilizados",
"deletedTempDir": "Arquivos temporários apagados",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Logging de Santinelă",
"sentryHint": "Trimite log-uri anonime pentru a ne ajuta să îmbunătățim ReVanced Manager",
"restartAppForChanges": "Reporniți aplicația pentru a aplica modificările",
"deleteKeystoreLabel": "Ștergeți keystore-ul",
"deleteKeystoreHint": "Ștergeți keystore-ul utilizat pentru a însemna aplicația",
"deletedKeystore": "Keystore șters",
"regenerateKeystoreLabel": "Ștergeți keystore-ul",
"regenerateKeystoreHint": "Ștergeți keystore-ul utilizat pentru a însemna aplicația",
"regeneratedKeystore": "Keystore șters",
"deleteTempDirLabel": "Ștergeți fișierele temporare",
"deleteTempDirHint": "Șterge fișierele temporare neutilizate",
"deletedTempDir": "Fișierele temporare au fost șterse",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Логирование Sentry",
"sentryHint": "Отправлять анонимные логи для улучшения ReVanced Manager-а",
"restartAppForChanges": "Перезапустите приложение для применения изменений",
"deleteKeystoreLabel": "Удалить хранилище ключей",
"deleteKeystoreHint": "Удалить хранилище ключей, использованных для подписи приложения",
"deletedKeystore": "Хранилище ключей удалено",
"regenerateKeystoreLabel": "Удалить хранилище ключей",
"regenerateKeystoreHint": "Удалить хранилище ключей, использованных для подписи приложения",
"regeneratedKeystore": "Хранилище ключей удалено",
"deleteTempDirLabel": "Удалить временные файлы",
"deleteTempDirHint": "Удалить неиспользуемые временные файлы",
"deletedTempDir": "Временные файлы удалены",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Log Sentry",
"sentryHint": "Odoslať anonymné protokoly, ktoré nám pomôžu zlepšiť ReVanced Manager",
"restartAppForChanges": "Ak chcete použiť zmeny, reštartujte aplikáciu",
"deleteKeystoreLabel": "Odstrániť úložisko kľúčov",
"deleteKeystoreHint": "Odstrániť úložisko kľúčov použité na podpísanie aplikácie",
"deletedKeystore": "Úložisko kľúčov odstránené",
"regenerateKeystoreLabel": "Odstrániť úložisko kľúčov",
"regenerateKeystoreHint": "Odstrániť úložisko kľúčov použité na podpísanie aplikácie",
"regeneratedKeystore": "Úložisko kľúčov odstránené",
"deleteTempDirLabel": "Odstrániť dočasné súbory",
"deleteTempDirHint": "Odstrániť nepoužívané dočasné súbory",
"deletedTempDir": "Dočasné súbory odstránené",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry prikupljanje grešaka",
"sentryHint": "Pošaljite anonimnu evidenciju da biste nam pomogli da poboljšamo ReVanced Manager",
"restartAppForChanges": "Ponovo pokrenite aplikaciju da biste primenili promene",
"deleteKeystoreLabel": "Izbrišite skladište ključeva",
"deleteKeystoreHint": "Izbrišite skladište ključeva korišćeno za potpisivanje aplikacije",
"deletedKeystore": "Skladište ključeva je izbrisano",
"regenerateKeystoreLabel": "Izbrišite skladište ključeva",
"regenerateKeystoreHint": "Izbrišite skladište ključeva korišćeno za potpisivanje aplikacije",
"regeneratedKeystore": "Skladište ključeva je izbrisano",
"deleteTempDirLabel": "Izbrišite privremene datoteke",
"deleteTempDirHint": "Izbrišite nekorišćene privremene datoteke",
"deletedTempDir": "Privremene datoteke su izbrisane",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry прикупљање грешака",
"sentryHint": "Пошаљите анонимну евиденцију да бисте нам помогли да побољшамо ReVanced Manager",
"restartAppForChanges": "Поново покрените апликацију да бисте применили промене",
"deleteKeystoreLabel": "Избришите складиште кључева",
"deleteKeystoreHint": "Избришите складиште кључева коришћено за потписивање апликације",
"deletedKeystore": "Складиште кључева је избрисано",
"regenerateKeystoreLabel": "Избришите складиште кључева",
"regenerateKeystoreHint": "Избришите складиште кључева коришћено за потписивање апликације",
"regeneratedKeystore": "Складиште кључева је избрисано",
"deleteTempDirLabel": "Избришите привремене датотеке",
"deleteTempDirHint": "Избришите некоришћене привремене датотеке",
"deletedTempDir": "Привремене датотеке су избрисане",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry loggning",
"sentryHint": "Hjälp oss förbättra ReVanced Manager genom att skicka anonyma loggar",
"restartAppForChanges": "Starta om appen för att tillämpa ändringar",
"deleteKeystoreLabel": "Radera keystore",
"deleteKeystoreHint": "Radera keystore filen som används för att signera appen",
"deletedKeystore": "Raderade keystore",
"regenerateKeystoreLabel": "Radera keystore",
"regenerateKeystoreHint": "Radera keystore filen som används för att signera appen",
"regeneratedKeystore": "Raderade keystore",
"deleteTempDirLabel": "Ta bort temporära filer",
"deleteTempDirHint": "Radera oanvända temporära filer",
"deletedTempDir": "Raderade temporära filer",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Sentry logging",
"sentryHint": "Tuma kumbukumbu bila majina ili utusaidie kuboresha Revanced Manager",
"restartAppForChanges": "Anzisha tena programu ili kutekeleza mabadiliko",
"deleteKeystoreLabel": "Futa Duka la Ufunguo",
"deleteKeystoreHint": "Futa Duka la Ufunguo iliyotumika kusaini programu",
"deletedKeystore": "Duka la ufunguo imefutwa",
"regenerateKeystoreLabel": "Futa Duka la Ufunguo",
"regenerateKeystoreHint": "Futa Duka la Ufunguo iliyotumika kusaini programu",
"regeneratedKeystore": "Duka la ufunguo imefutwa",
"deleteTempDirLabel": "Futa faili za muda",
"deleteTempDirHint": "Futa faili za muda ambazo hazijatumiwa",
"deletedTempDir": "Faili za muda zimefutwa",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Sentry günlükleri",
"sentryHint": "ReVanced Manager'ı geliştirmemize yardımcı olmak için anonim günlükler gönderin",
"restartAppForChanges": "Değişiklikleri uygulamak için uygulamayı yeniden başlatın",
"deleteKeystoreLabel": "Keystore'u sil",
"deleteKeystoreHint": "Uygulamayı imzalamak için kullanılan keystore'u silin",
"deletedKeystore": "Keystore silindi",
"regenerateKeystoreLabel": "Keystore'u sil",
"regenerateKeystoreHint": "Uygulamayı imzalamak için kullanılan keystore'u silin",
"regeneratedKeystore": "Keystore silindi",
"deleteTempDirLabel": "Geçici dosyaları sil",
"deleteTempDirHint": "Kullanılmayan geçici dosyaları sil",
"deletedTempDir": "Geçici dosyalar silindi",

View File

@ -143,9 +143,9 @@
"sentryLabel": "سنتری لاگنگ",
"sentryHint": "ریوینسڈ مینیجر کی بہتری میں مدد کے لیے گمنام لاگ بھیجیں",
"restartAppForChanges": "تبدیلیاں دیکھنے کیلیئے اپلی کیشن کو دوبارہ چلائیں",
"deleteKeystoreLabel": "ڈیلیٹ کی سٹور",
"deleteKeystoreHint": "ایپ پر دستخط کرنے کے لیے استعمال ہونے والے کی اسٹور کو ڈیلیٹ کریں",
"deletedKeystore": "کی اسٹور حذف ہو گیا ہے",
"regenerateKeystoreLabel": "ڈیلیٹ کی سٹور",
"regenerateKeystoreHint": "ایپ پر دستخط کرنے کے لیے استعمال ہونے والے کی اسٹور کو ڈیلیٹ کریں",
"regeneratedKeystore": "کی اسٹور حذف ہو گیا ہے",
"deleteTempDirLabel": "عارضی فائلوں کو حذف کریں",
"deleteTempDirHint": "غیر استعمال شدہ عارضی فائلوں کو حذف کریں",
"deletedTempDir": "عارضی فائلیں حذف کردی گئی",

View File

@ -147,9 +147,9 @@
"sentryLabel": "Nhật ký theo dõi",
"sentryHint": "Gửi nhật ký ẩn danh để giúp chúng tôi cải thiện ReVanced Manager",
"restartAppForChanges": "Khởi động lại ứng dụng để áp dụng thay đổi",
"deleteKeystoreLabel": "Xóa kho khóa",
"deleteKeystoreHint": "Xóa kho khóa dùng để ký ứng dụng",
"deletedKeystore": "Kho khóa đã xóa",
"regenerateKeystoreLabel": "Xóa kho khóa",
"regenerateKeystoreHint": "Xóa kho khóa dùng để ký ứng dụng",
"regeneratedKeystore": "Kho khóa đã xóa",
"deleteTempDirLabel": "Xóa tệp tạm thời",
"deleteTempDirHint": "Xóa các tệp tạm thời không sử dụng",
"deletedTempDir": "Đã xóa các tệp tạm thời",

View File

@ -143,9 +143,9 @@
"sentryLabel": "哨兵日志",
"sentryHint": "发送匿名日志以帮助我们改进ReVanced Manager",
"restartAppForChanges": "重启应用以生效",
"deleteKeystoreLabel": "删除密钥存储",
"deleteKeystoreHint": "删除用于签名应用的密钥存储",
"deletedKeystore": "密钥存储已删除",
"regenerateKeystoreLabel": "删除密钥存储",
"regenerateKeystoreHint": "删除用于签名应用的密钥存储",
"regeneratedKeystore": "密钥存储已删除",
"deleteTempDirLabel": "删除临时文件",
"deleteTempDirHint": "删除未使用的临时文件",
"deletedTempDir": "临时文件已删除",

View File

@ -143,9 +143,9 @@
"sentryLabel": "Sentry 日志記錄",
"sentryHint": "發送匿名的日志記錄以幫助我們改善 ReVanced Manager",
"restartAppForChanges": "重啓應用以套用變更",
"deleteKeystoreLabel": "刪除 keystore",
"deleteKeystoreHint": "刪除登入程序已用的 keystore",
"deletedKeystore": "已刪除 keystore",
"regenerateKeystoreLabel": "刪除 keystore",
"regenerateKeystoreHint": "刪除登入程序已用的 keystore",
"regeneratedKeystore": "已刪除 keystore",
"deleteTempDirLabel": "刪除暫時文件",
"deleteTempDirHint": "刪除無用暫時文件",
"deletedTempDir": "暫時文件已刪除",

View File

@ -147,9 +147,9 @@
"sentryLabel": "輸入記錄",
"sentryHint": "傳送匿名記錄以協助我們改進 ReVanced Manager",
"restartAppForChanges": "重新啟動應用程式以套用變更",
"deleteKeystoreLabel": "刪除金鑰儲存區",
"deleteKeystoreHint": "刪除用於登入應用程式的金鑰儲存區",
"deletedKeystore": "已刪除金鑰儲存區",
"regenerateKeystoreLabel": "刪除金鑰儲存區",
"regenerateKeystoreHint": "刪除用於登入應用程式的金鑰儲存區",
"regeneratedKeystore": "已刪除金鑰儲存區",
"deleteTempDirLabel": "刪除暫存檔案",
"deleteTempDirHint": "刪除未使用的暫存檔案",
"deletedTempDir": "暫存檔案目錄",

View File

@ -9,6 +9,6 @@ In order to use ReVanced on your Android device, ReVanced Manager must be instal
## ⏭️ What's next
The next page will guide you through patching an app.
The next page will guide you through using ReVanced Manager.
Continue: [🪛 Usage](2_usage.md)

View File

@ -1 +1 @@
Patch your favourite apps, right on your device.
Patch your favorite apps, right on your device.

View File

@ -8,7 +8,6 @@ class Patch {
Patch({
required this.name,
required this.description,
required this.version,
required this.excluded,
required this.dependencies,
required this.compatiblePackages,
@ -17,7 +16,6 @@ class Patch {
factory Patch.fromJson(Map<String, dynamic> json) => _$PatchFromJson(json);
final String name;
final String description;
final String version;
final bool excluded;
final List<String> dependencies;
final List<Package> compatiblePackages;

View File

@ -1,6 +1,5 @@
import 'dart:convert';
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:dio/dio.dart';
import 'package:dio_cache_interceptor/dio_cache_interceptor.dart';
@ -10,7 +9,6 @@ import 'package:injectable/injectable.dart';
import 'package:revanced_manager/models/patch.dart';
import 'package:revanced_manager/services/manager_api.dart';
@lazySingleton
class GithubAPI {
late Dio _dio = Dio();
@ -60,6 +58,22 @@ class GithubAPI {
Future<Map<String, dynamic>?> getLatestRelease(
String repoName,
) async {
try {
final response = await _dio.get(
'/repos/$repoName/releases',
);
return response.data[0];
} on Exception catch (e) {
if (kDebugMode) {
print(e);
}
return null;
}
}
Future<Map<String, dynamic>?> getLatestManagerRelease(
String repoName,
) async {
try {
final response = await _dio.get(
@ -67,12 +81,22 @@ class GithubAPI {
);
final Map<String, dynamic> releases = response.data[0];
int updates = 0;
final String currentVersion = await ManagerAPI().getCurrentManagerVersion();
final String currentVersion =
await ManagerAPI().getCurrentManagerVersion();
while (response.data[updates]['tag_name'] != 'v$currentVersion') {
updates++;
}
for(int i = 1; i < updates; i++){
releases.update('body', (value) => value + '\n' + '# '+ response.data[i]['tag_name']+'\n' + response.data[i]['body']);
for (int i = 1; i < updates; i++) {
releases.update(
'body',
(value) =>
value +
'\n' +
'# ' +
response.data[i]['tag_name'] +
'\n' +
response.data[i]['body'],
);
}
return releases;
} on Exception catch (e) {

View File

@ -1,12 +1,12 @@
import 'dart:io';
import 'package:app_installer/app_installer.dart';
import 'package:collection/collection.dart';
import 'package:cr_file_saver/file_saver.dart';
import 'package:device_apps/device_apps.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:injectable/injectable.dart';
import 'package:install_plugin/install_plugin.dart';
import 'package:path_provider/path_provider.dart';
import 'package:revanced_manager/app/app.locator.dart';
import 'package:revanced_manager/models/patch.dart';
@ -144,20 +144,6 @@ class PatcherAPI {
);
}
Future<String> getOriginalFilePath(String packageName) async {
try {
final bool hasRootPermissions = await _rootAPI.hasRootPermissions();
if (hasRootPermissions) {
return await _rootAPI.getOriginalFilePath(packageName);
}
} on Exception catch (e) {
if (kDebugMode) {
print(e);
}
}
return '';
}
Future<void> runPatcher(
String packageName,
String apkFilePath,
@ -191,10 +177,7 @@ class PatcherAPI {
_outFile = File('${workDir.path}/out.apk');
final Directory cacheDir = Directory('${workDir.path}/cache');
cacheDir.createSync();
String originalFilePath = await getOriginalFilePath(packageName);
if (originalFilePath.isEmpty) {
originalFilePath = apkFilePath;
}
final String originalFilePath = apkFilePath;
try {
await patcherChannel.invokeMethod(
'runPatcher',
@ -232,10 +215,8 @@ class PatcherAPI {
);
}
} else {
await AppInstaller.installApk(_outFile!.path);
return await DeviceApps.isAppInstalled(
patchedApp.packageName,
);
final install = await InstallPlugin.installApk(_outFile!.path);
return install['isSuccess'];
}
} on Exception catch (e) {
if (kDebugMode) {

View File

@ -140,7 +140,8 @@ class RevancedAPI {
return null;
}
StreamController<double> managerUpdateProgress = StreamController<double>.broadcast();
StreamController<double> managerUpdateProgress =
StreamController<double>.broadcast();
void updateManagerDownloadProgress(int progress) {
managerUpdateProgress.add(progress.toDouble());

View File

@ -73,7 +73,7 @@ class RootAPI {
}
Future<List<String>> getInstalledApps() async {
final List<String> apps = List.empty();
final List<String> apps = List.empty(growable: true);
try {
String? res = await Root.exec(
cmd: 'ls "$_revancedDirPath"',
@ -209,20 +209,6 @@ class RootAPI {
return res != null && res.isNotEmpty;
}
Future<String> getOriginalFilePath(String packageName) async {
final String originalPath = '$_revancedDirPath/$packageName/original.apk';
final String oldOrigPath = '$_revancedOldDirPath/$packageName/original.apk';
final bool isInstalled = await isAppInstalled(packageName);
if (isInstalled && await isMounted(packageName)) {
if (await fileExists(originalPath)) {
return originalPath;
} else if (await fileExists(oldOrigPath)) {
return oldOrigPath;
}
}
return '';
}
Future<void> saveOriginalFilePath(
String packageName,
String originalFilePath,

View File

@ -88,7 +88,7 @@ class _AppSelectorViewState extends State<AppSelectorView> {
),
),
)
: model.apps.isEmpty
: model.allApps.isEmpty
? const AppSkeletonLoader()
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0)
@ -113,7 +113,9 @@ class _AppSelectorViewState extends State<AppSelectorView> {
),
installedVersion: app.versionName!,
onTap: () => model.canSelectInstalled(
context, app.packageName),
context,
app.packageName,
),
),
)
.toList(),

View File

@ -45,9 +45,7 @@ class AppSelectorViewModel extends BaseViewModel {
.length
.compareTo(_patcherAPI.getFilteredPatches(a.packageName).length),
);
noApps = apps.isEmpty;
getAllApps();
notifyListeners();
}
@ -57,7 +55,7 @@ class AppSelectorViewModel extends BaseViewModel {
.toSet()
.where((name) => !apps.any((app) => app.packageName == name))
.toList();
noApps = allApps.isEmpty;
return allApps;
}

View File

@ -1,13 +1,13 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:async';
import 'dart:io';
import 'package:app_installer/app_installer.dart';
import 'package:cross_connectivity/cross_connectivity.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_i18n/flutter_i18n.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:injectable/injectable.dart';
import 'package:install_plugin/install_plugin.dart';
import 'package:path_provider/path_provider.dart';
import 'package:revanced_manager/app/app.locator.dart';
import 'package:revanced_manager/app/app.router.dart';
@ -51,7 +51,7 @@ class HomeViewModel extends BaseViewModel {
_toast.showBottom('homeView.installingMessage');
final File? managerApk = await _managerAPI.downloadManager();
if (managerApk != null) {
await AppInstaller.installApk(managerApk.path);
await InstallPlugin.installApk(managerApk.path);
} else {
_toast.showBottom('homeView.errorDownloadMessage');
}
@ -72,7 +72,7 @@ class HomeViewModel extends BaseViewModel {
_toast.showBottom('homeView.installingMessage');
final File? managerApk = await _managerAPI.downloadManager();
if (managerApk != null) {
await AppInstaller.installApk(managerApk.path);
await InstallPlugin.installApk(managerApk.path);
} else {
_toast.showBottom('homeView.errorDownloadMessage');
}
@ -112,13 +112,15 @@ class HomeViewModel extends BaseViewModel {
Future<bool> hasManagerUpdates() async {
String currentVersion = await _managerAPI.getCurrentManagerVersion();
_latestManagerVersion = await _managerAPI.getLatestManagerVersion();
// add v to current version
if (!currentVersion.startsWith('v')) {
currentVersion = 'v$currentVersion';
}
_latestManagerVersion =
await _managerAPI.getLatestManagerVersion() ?? currentVersion;
if (_latestManagerVersion != currentVersion) {
return true;
}
@ -270,8 +272,9 @@ class HomeViewModel extends BaseViewModel {
child: CustomMaterialButton(
label: I18nText('updateButton'),
onPressed: () async {
await AppInstaller.installApk(
downloadedApk!.path,);
await InstallPlugin.installApk(
downloadedApk!.path,
);
},
),
),
@ -315,7 +318,7 @@ class HomeViewModel extends BaseViewModel {
// UILocalNotificationDateInterpretation.absoluteTime,
// );
_toast.showBottom('homeView.installingMessage');
await AppInstaller.installApk(managerApk.path);
await InstallPlugin.installApk(managerApk.path);
} else {
_toast.showBottom('homeView.errorDownloadMessage');
}
@ -345,7 +348,7 @@ class HomeViewModel extends BaseViewModel {
}
Future<Map<String, dynamic>?> getLatestManagerRelease() {
return _githubAPI.getLatestRelease(_managerAPI.defaultManagerRepo);
return _githubAPI.getLatestManagerRelease(_managerAPI.defaultManagerRepo);
}
Future<String?> getLatestPatcherReleaseTime() {

View File

@ -166,7 +166,7 @@ class InstallerViewModel extends BaseViewModel {
try {
_app.isRooted = installAsRoot;
final bool hasMicroG =
_patches.any((p) => p.name.endsWith('microg-support'));
_patches.any((p) => p.name.endsWith('MicroG support'));
final bool rootMicroG = installAsRoot && hasMicroG;
final bool rootFromStorage = installAsRoot && _app.isFromStorage;
final bool ytWithoutRootMicroG =

View File

@ -13,55 +13,68 @@ class NavigationView extends StatelessWidget {
return ViewModelBuilder<NavigationViewModel>.reactive(
onViewModelReady: (model) => model.initialize(context),
viewModelBuilder: () => locator<NavigationViewModel>(),
builder: (context, model, child) => Scaffold(
body: PageTransitionSwitcher(
duration: const Duration(milliseconds: 400),
transitionBuilder: (
Widget child,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
return FadeThroughTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
fillColor: Theme.of(context).colorScheme.surface,
child: child,
);
},
child: model.getViewForIndex(model.currentIndex),
),
bottomNavigationBar: NavigationBar(
onDestinationSelected: model.setIndex,
selectedIndex: model.currentIndex,
destinations: <Widget>[
NavigationDestination(
icon: model.isIndexSelected(0)
? const Icon(Icons.dashboard)
: const Icon(Icons.dashboard_outlined),
label: FlutterI18n.translate(
context,
'navigationView.dashboardTab',
builder: (context, model, child) => WillPopScope(
onWillPop: () async {
if (model.currentIndex == 0) {
return true;
} else {
model.setIndex(0);
return false;
}
},
child: Scaffold(
body: PageTransitionSwitcher(
duration: const Duration(milliseconds: 400),
transitionBuilder: (
Widget child,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
return FadeThroughTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
fillColor: Theme.of(context).colorScheme.surface,
child: child,
);
},
child: model.getViewForIndex(model.currentIndex),
),
bottomNavigationBar: NavigationBar(
onDestinationSelected: model.setIndex,
selectedIndex: model.currentIndex,
destinations: <Widget>[
NavigationDestination(
icon: model.isIndexSelected(0)
? const Icon(Icons.dashboard)
: const Icon(Icons.dashboard_outlined),
label: FlutterI18n.translate(
context,
'navigationView.dashboardTab',
),
tooltip: '',
),
),
NavigationDestination(
icon: model.isIndexSelected(1)
? const Icon(Icons.build)
: const Icon(Icons.build_outlined),
label: FlutterI18n.translate(
context,
'navigationView.patcherTab',
NavigationDestination(
icon: model.isIndexSelected(1)
? const Icon(Icons.build)
: const Icon(Icons.build_outlined),
label: FlutterI18n.translate(
context,
'navigationView.patcherTab',
),
tooltip: '',
),
),
NavigationDestination(
icon: model.isIndexSelected(2)
? const Icon(Icons.settings)
: const Icon(Icons.settings_outlined),
label: FlutterI18n.translate(
context,
'navigationView.settingsTab',
NavigationDestination(
icon: model.isIndexSelected(2)
? const Icon(Icons.settings)
: const Icon(Icons.settings_outlined),
label: FlutterI18n.translate(
context,
'navigationView.settingsTab',
),
tooltip: '',
),
),
],
],
),
),
),
);

View File

@ -166,7 +166,6 @@ class _PatchesSelectorViewState extends State<PatchesSelectorView> {
(patch) => PatchItem(
name: patch.name,
simpleName: patch.getSimpleName(),
version: patch.version,
description: patch.description,
packageVersion: model.getAppVersion(),
supportedPackageVersions:

View File

@ -93,7 +93,9 @@ class SManageApiUrl extends BaseViewModel {
onPressed: () {
_managerAPI.setApiUrl('');
_toast.showBottom('settingsView.restartAppForChanges');
Navigator.of(context).pop();
Navigator.of(context)
..pop()
..pop();
},
)
],

View File

@ -17,8 +17,7 @@ import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
class SettingsViewModel extends BaseViewModel {
final NavigationService _navigationService =
locator<NavigationService>();
final NavigationService _navigationService = locator<NavigationService>();
final ManagerAPI _managerAPI = locator<ManagerAPI>();
final Toast _toast = locator<Toast>();
@ -49,7 +48,7 @@ class SettingsViewModel extends BaseViewModel {
void deleteKeystore() {
_managerAPI.deleteKeystore();
_toast.showBottom('settingsView.deletedKeystore');
_toast.showBottom('settingsView.regeneratedKeystore');
notifyListeners();
}
@ -63,11 +62,8 @@ class SettingsViewModel extends BaseViewModel {
try {
final File outFile = File(_managerAPI.storedPatchesFile);
if (outFile.existsSync()) {
final String dateTime = DateTime.now()
.toString()
.replaceAll(' ', '_')
.split('.')
.first;
final String dateTime =
DateTime.now().toString().replaceAll(' ', '_').split('.').first;
await CRFileSaver.saveFileWithDialog(
SaveFileDialogParams(
sourceFilePath: outFile.path,
@ -87,8 +83,7 @@ class SettingsViewModel extends BaseViewModel {
Future<void> importPatches() async {
try {
final FilePickerResult? result =
await FilePicker.platform.pickFiles(
final FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['json'],
);
@ -109,7 +104,7 @@ class SettingsViewModel extends BaseViewModel {
}
}
Future<void> exportKeystore() async {
Future<void> exportKeystore() async {
try {
final File outFile = File(_managerAPI.keystoreFile);
if (outFile.existsSync()) {
@ -138,7 +133,7 @@ class SettingsViewModel extends BaseViewModel {
if (result != null && result.files.single.path != null) {
final File inFile = File(result.files.single.path!);
inFile.copySync(_managerAPI.keystoreFile);
_toast.showBottom('settingsView.importedKeystore');
}
} on Exception catch (e) {

View File

@ -34,7 +34,8 @@ class AppSkeletonLoader extends StatelessWidget {
style: SkeletonLineStyle(
height: 20,
width: screenWidth * 0.4,
borderRadius: const BorderRadius.all(Radius.circular(10)),
borderRadius:
const BorderRadius.all(Radius.circular(10)),
),
),
),
@ -45,7 +46,8 @@ class AppSkeletonLoader extends StatelessWidget {
style: SkeletonLineStyle(
height: 15,
width: screenWidth * 0.6,
borderRadius: const BorderRadius.all(Radius.circular(10)),
borderRadius:
const BorderRadius.all(Radius.circular(10)),
),
),
),
@ -56,7 +58,8 @@ class AppSkeletonLoader extends StatelessWidget {
style: SkeletonLineStyle(
height: 15,
width: screenWidth * 0.5,
borderRadius: const BorderRadius.all(Radius.circular(10)),
borderRadius:
const BorderRadius.all(Radius.circular(10)),
),
),
),

View File

@ -66,7 +66,7 @@ class _InstalledAppItemState extends State<InstalledAppItem> {
context,
'installed',
translationParams: {
'version':'v${widget.installedVersion}'
'version': 'v${widget.installedVersion}'
},
),
),
@ -75,18 +75,25 @@ class _InstalledAppItemState extends State<InstalledAppItem> {
I18nText(
'suggested',
translationParams: {
'version' : widget.suggestedVersion.isEmpty
? FlutterI18n.translate(context, 'appSelectorCard.allVersions')
'version': widget.suggestedVersion.isEmpty
? FlutterI18n.translate(
context,
'appSelectorCard.allVersions',
)
: 'v${widget.suggestedVersion}',
},
),
const SizedBox(width: 4),
Text(
widget.patchesCount == 1
? '${widget.patchesCount} patch'
: '${widget.patchesCount} patches',
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
Flexible(
child: Text(
widget.patchesCount == 1
? '${widget.patchesCount} patch'
: '${widget.patchesCount} patches',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
),
),
),
],

View File

@ -60,8 +60,7 @@ class _NotInstalledAppItem extends State<NotInstalledAppItem> {
child: Text(
'',
style: TextStyle(
color:
Theme.of(context).textTheme.titleLarge!.color,
color: Theme.of(context).textTheme.titleLarge!.color,
),
),
),
@ -70,18 +69,25 @@ class _NotInstalledAppItem extends State<NotInstalledAppItem> {
I18nText(
'suggested',
translationParams: {
'version' : widget.suggestedVersion.isEmpty
? FlutterI18n.translate(context, 'appSelectorCard.allVersions')
'version': widget.suggestedVersion.isEmpty
? FlutterI18n.translate(
context,
'appSelectorCard.allVersions',
)
: 'v${widget.suggestedVersion}',
},
),
const SizedBox(width: 4),
Text(
widget.patchesCount == 1
? '${widget.patchesCount} patch'
: '${widget.patchesCount} patches',
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
Flexible(
child: Text(
widget.patchesCount == 1
? '${widget.patchesCount} patch'
: '${widget.patchesCount} patches',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
),
),
),
],

View File

@ -1,61 +1,96 @@
import 'package:device_apps/device_apps.dart';
import 'package:flutter/material.dart';
import 'package:flutter_i18n/flutter_i18n.dart';
import 'package:revanced_manager/app/app.locator.dart';
import 'package:revanced_manager/models/patched_application.dart';
import 'package:revanced_manager/services/manager_api.dart';
import 'package:revanced_manager/ui/views/home/home_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/shared/application_item.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_card.dart';
//ignore: must_be_immutable
class InstalledAppsCard extends StatelessWidget {
InstalledAppsCard({Key? key}) : super(key: key);
final List<PatchedApplication> apps =
locator<HomeViewModel>().patchedInstalledApps;
List<PatchedApplication> apps = locator<HomeViewModel>().patchedInstalledApps;
final ManagerAPI _managerAPI = locator<ManagerAPI>();
List<PatchedApplication> patchedApps = [];
Future _getApps() async {
if (apps.isNotEmpty) {
patchedApps = [...apps];
for (final element in apps) {
await DeviceApps.getApp(element.packageName).then((value) {
if (element.version != value?.versionName) {
patchedApps.remove(element);
}
});
}
if (apps.length != patchedApps.length) {
await _managerAPI.setPatchedApps(patchedApps);
apps.clear();
apps = [...patchedApps];
}
}
}
@override
Widget build(BuildContext context) {
return apps.isEmpty
? CustomCard(
child: Center(
child: Column(
children: <Widget>[
Icon(
size: 40,
Icons.file_download_off,
color: Theme.of(context).colorScheme.secondary,
),
const SizedBox(height: 16),
I18nText(
'homeView.noInstallations',
child: Text(
'',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium!.copyWith(
color: Theme.of(context).colorScheme.secondary,
return FutureBuilder(
future: _getApps(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return apps.isEmpty
? CustomCard(
child: Center(
child: Column(
children: <Widget>[
Icon(
size: 40,
Icons.file_download_off,
color: Theme.of(context).colorScheme.secondary,
),
const SizedBox(height: 16),
I18nText(
'homeView.noInstallations',
child: Text(
'',
textAlign: TextAlign.center,
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(
color:
Theme.of(context).colorScheme.secondary,
),
),
)
],
),
)
],
),
),
)
: ListView(
shrinkWrap: true,
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(),
children: apps
.map(
(app) => ApplicationItem(
icon: app.icon,
name: app.name,
patchDate: app.patchDate,
changelog: app.changelog,
isUpdatableApp: false,
onPressed: () =>
locator<HomeViewModel>().navigateToAppInfo(app),
),
)
.toList(),
);
: ListView(
shrinkWrap: true,
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(),
children: apps
.map(
(app) => ApplicationItem(
icon: app.icon,
name: app.name,
patchDate: app.patchDate,
changelog: app.changelog,
isUpdatableApp: false,
onPressed: () =>
locator<HomeViewModel>().navigateToAppInfo(app),
),
)
.toList(),
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
);
}
}

View File

@ -45,8 +45,7 @@ class UpdateConfirmationDialog extends StatelessWidget {
children: [
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
I18nText(
'homeView.updateDialogTitle',
@ -63,14 +62,12 @@ class UpdateConfirmationDialog extends StatelessWidget {
children: [
Icon(
Icons.new_releases_outlined,
color: Theme.of(context)
.colorScheme
.secondary,
color:
Theme.of(context).colorScheme.secondary,
),
const SizedBox(width: 8.0),
Text(
snapshot.data!['tag_name'] ??
'Unknown',
snapshot.data!['tag_name'] ?? 'Unknown',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w500,
@ -96,8 +93,7 @@ class UpdateConfirmationDialog extends StatelessWidget {
),
),
Padding(
padding:
const EdgeInsets.only(left: 24.0, bottom: 12.0),
padding: const EdgeInsets.only(left: 24.0, bottom: 12.0),
child: I18nText(
'homeView.updateChangelogTitle',
child: Text(
@ -113,12 +109,9 @@ class UpdateConfirmationDialog extends StatelessWidget {
),
),
Container(
margin:
const EdgeInsets.symmetric(horizontal: 24.0),
margin: const EdgeInsets.symmetric(horizontal: 24.0),
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.secondaryContainer,
color: Theme.of(context).colorScheme.secondaryContainer,
borderRadius: BorderRadius.circular(12.0),
),
child: Markdown(

View File

@ -59,7 +59,7 @@ class PatchSelectorCard extends StatelessWidget {
String _getPatchesSelection() {
String text = '';
for (final Patch p in locator<PatcherViewModel>().selectedPatches) {
text += '\u2022 ${p.getSimpleName()} (v${p.version})\n';
text += '\u2022 ${p.getSimpleName()}\n';
}
return text.substring(0, text.length - 1);
}

View File

@ -14,7 +14,6 @@ class PatchItem extends StatefulWidget {
required this.name,
required this.simpleName,
required this.description,
required this.version,
required this.packageVersion,
required this.supportedPackageVersions,
required this.isUnsupported,
@ -25,7 +24,6 @@ class PatchItem extends StatefulWidget {
final String name;
final String simpleName;
final String description;
final String version;
final String packageVersion;
final List<String> supportedPackageVersions;
final bool isUnsupported;
@ -42,7 +40,9 @@ class PatchItem extends StatefulWidget {
class _PatchItemState extends State<PatchItem> {
@override
Widget build(BuildContext context) {
widget.isSelected = widget.isSelected && (!widget.isUnsupported || widget._managerAPI.areExperimentalPatchesEnabled());
widget.isSelected = widget.isSelected &&
(!widget.isUnsupported ||
widget._managerAPI.areExperimentalPatchesEnabled());
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Opacity(
@ -88,14 +88,6 @@ class _PatchItemState extends State<PatchItem> {
),
],
),
const SizedBox(height: 1),
Text(
widget.version,
style: TextStyle(
fontSize: 14,
color: Theme.of(context).colorScheme.secondary,
),
),
const SizedBox(height: 4),
Text(
widget.description,
@ -117,7 +109,7 @@ class _PatchItemState extends State<PatchItem> {
value: widget.isSelected,
activeColor: Theme.of(context).colorScheme.primary,
checkColor:
Theme.of(context).colorScheme.secondaryContainer,
Theme.of(context).colorScheme.secondaryContainer,
side: BorderSide(
width: 2.0,
color: Theme.of(context).colorScheme.primary,
@ -128,14 +120,16 @@ class _PatchItemState extends State<PatchItem> {
!widget._managerAPI
.areExperimentalPatchesEnabled()) {
widget.isSelected = false;
widget.toast
.showBottom('patchItem.unsupportedPatchVersion');
widget.toast.showBottom(
'patchItem.unsupportedPatchVersion',
);
} else {
widget.isSelected = newValue!;
}
if (widget.isUnsupported &&
widget.isSelected &&
!selectedUnsupportedPatches.contains(widget.name)) {
!selectedUnsupportedPatches
.contains(widget.name)) {
selectedUnsupportedPatches.add(widget.name);
}
});

View File

@ -28,7 +28,7 @@ class SAdvancedSection extends StatelessWidget {
ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 20.0),
title: I18nText(
'settingsView.deleteKeystoreLabel',
'settingsView.regenerateKeystoreLabel',
child: const Text(
'',
style: TextStyle(
@ -37,7 +37,7 @@ class SAdvancedSection extends StatelessWidget {
),
),
),
subtitle: I18nText('settingsView.deleteKeystoreHint'),
subtitle: I18nText('settingsView.regenerateKeystoreHint'),
onTap: () => _showDeleteKeystoreDialog(context),
),
ListTile(
@ -78,11 +78,9 @@ class SAdvancedSection extends StatelessWidget {
return showDialog(
context: context,
builder: (context) => AlertDialog(
title: I18nText('warning'),
title: I18nText('settingsView.regenerateKeystoreDialogTitle'),
backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
content: I18nText(
'settingsView.deleteKeystoreDialogText',
),
content: I18nText('settingsView.regenerateKeystoreDialogText'),
actions: <Widget>[
CustomMaterialButton(
isFilled: false,

View File

@ -34,9 +34,11 @@ class _SExperimentalPatchesState extends State<SExperimentalPatches> {
setState(() {
_settingsViewModel.useExperimentalPatches(value);
});
if(!value) {
if (!value) {
for (final patch in selectedUnsupportedPatches) {
PatchesSelectorViewModel().selectedPatches.removeWhere((element) => patch == element.name);
PatchesSelectorViewModel()
.selectedPatches
.removeWhere((element) => patch == element.name);
}
selectedUnsupportedPatches.clear();
}

View File

@ -3,6 +3,7 @@ import 'package:flutter_i18n/widgets/I18nText.dart';
import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart';
import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart';
import 'package:revanced_manager/ui/widgets/shared/custom_material_button.dart';
final _settingsViewModel = SettingsViewModel();
@ -91,9 +92,36 @@ class SExportSection extends StatelessWidget {
),
),
subtitle: I18nText('settingsView.resetStoredPatchesHint'),
onTap: () => _settingsViewModel.resetSelectedPatches(),
onTap: () => _showResetStoredPatchesDialog(context),
),
],
);
}
Future<void> _showResetStoredPatchesDialog(context) {
return showDialog(
context: context,
builder: (context) => AlertDialog(
title: I18nText('settingsView.resetStoredPatchesDialogTitle'),
backgroundColor: Theme.of(context).colorScheme.secondaryContainer,
content: I18nText(
'settingsView.resetStoredPatchesDialogText',
),
actions: <Widget>[
CustomMaterialButton(
isFilled: false,
label: I18nText('noButton'),
onPressed: () => Navigator.of(context).pop(),
),
CustomMaterialButton(
label: I18nText('yesButton'),
onPressed: () => {
Navigator.of(context).pop(),
_settingsViewModel.resetSelectedPatches()
},
)
],
),
);
}
}

View File

@ -1,17 +1,16 @@
name: revanced_manager
description: The official ReVanced Manager.
description: Patch your favorite apps, right on your device.
homepage: https://github.com/revanced/revanced-manager
publish_to: 'none'
version: 1.3.7+100300007
version: 1.5.0+100400004
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
animations: ^2.0.7
app_installer: ^1.1.0
collection: ^1.17.0
cross_connectivity: ^3.0.5
cr_file_saver:
@ -59,8 +58,8 @@ dependencies:
pull_to_refresh: ^2.0.0
root:
git:
url: https://github.com/gokul1630/root
ref: main
url: https://github.com/EvadeMaster/root
ref: 82803aa40f63cddff81c3e4d27ce8ce3e7c83f60
share_extend: ^2.0.0
shared_preferences: ^2.1.0
skeletons: ^0.0.3
@ -75,6 +74,7 @@ dependencies:
flutter_dotenv: ^5.0.2
flutter_markdown: ^0.6.14
dio_cache_interceptor: ^3.4.0
install_plugin: ^2.1.0
dev_dependencies:
json_serializable: ^6.6.1