Repository: TeamVanced/VancedManager Branch: compose Commit: 1c219ea3e0d0 Files: 202 Total size: 883.7 KB Directory structure: gitextract_f45693ij/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-issue-template.md │ │ ├── config.yml │ │ └── feature-request-template.md │ └── workflows/ │ ├── debug.yml │ └── lint.yml ├── .gitignore ├── LICENSE ├── README.md ├── READMEME.md ├── app/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── google-services.json │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── vanced/ │ │ └── manager/ │ │ ├── ManagerApplication.kt │ │ ├── di/ │ │ │ ├── APIModule.kt │ │ │ ├── CustomTabsModule.kt │ │ │ ├── DatasourceModule.kt │ │ │ ├── DownloaderModule.kt │ │ │ ├── InstallerModuke.kt │ │ │ ├── ManagerModule.kt │ │ │ ├── NetworkModule.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── ServiceModule.kt │ │ │ └── ViewModelModule.kt │ │ ├── domain/ │ │ │ └── model/ │ │ │ ├── App.kt │ │ │ └── InstallationOption.kt │ │ ├── downloader/ │ │ │ ├── api/ │ │ │ │ ├── MicrogAPI.kt │ │ │ │ ├── MusicAPI.kt │ │ │ │ └── VancedAPI.kt │ │ │ ├── base/ │ │ │ │ └── AppDownloader.kt │ │ │ ├── impl/ │ │ │ │ ├── MicrogDownloader.kt │ │ │ │ ├── MusicDownloader.kt │ │ │ │ └── VancedDownloader.kt │ │ │ └── util/ │ │ │ └── DownloadPath.kt │ │ ├── installer/ │ │ │ ├── base/ │ │ │ │ └── AppInstaller.kt │ │ │ ├── impl/ │ │ │ │ ├── MicrogInstaller.kt │ │ │ │ ├── MusicInstaller.kt │ │ │ │ └── VancedInstaller.kt │ │ │ ├── service/ │ │ │ │ ├── AppInstallService.kt │ │ │ │ └── AppUninstallService.kt │ │ │ └── util/ │ │ │ ├── PM.kt │ │ │ ├── PMRoot.kt │ │ │ ├── PMRootResult.kt │ │ │ ├── Patcher.kt │ │ │ └── RootPatchHelper.kt │ │ ├── io/ │ │ │ ├── ManagerSuFile.kt │ │ │ └── SUIOException.kt │ │ ├── network/ │ │ │ ├── GithubService.kt │ │ │ ├── dto/ │ │ │ │ └── GithubDto.kt │ │ │ └── util/ │ │ │ └── Constants.kt │ │ ├── preferences/ │ │ │ ├── ManagerPreference.kt │ │ │ └── holder/ │ │ │ ├── PreferenceDefaultValueHolder.kt │ │ │ ├── PreferenceHolder.kt │ │ │ └── PreferenceKeyHolder.kt │ │ ├── repository/ │ │ │ ├── AppRepository.kt │ │ │ ├── PreferenceRepository.kt │ │ │ ├── manager/ │ │ │ │ └── PackageManager.kt │ │ │ └── source/ │ │ │ └── PreferenceDatasource.kt │ │ ├── ui/ │ │ │ ├── MainActivity.kt │ │ │ ├── SplashScreenActivity.kt │ │ │ ├── component/ │ │ │ │ ├── ManagerButton.kt │ │ │ │ ├── ManagerCard.kt │ │ │ │ ├── ManagerDialog.kt │ │ │ │ ├── ManagerDropdownMenu.kt │ │ │ │ ├── ManagerLazyDsl.kt │ │ │ │ ├── ManagerListItem.kt │ │ │ │ ├── ManagerNavigator.kt │ │ │ │ ├── ManagerPreference.kt │ │ │ │ ├── ManagerProgressIndicator.kt │ │ │ │ ├── ManagerScaffold.kt │ │ │ │ ├── ManagerSwipeRefresh.kt │ │ │ │ ├── ManagerText.kt │ │ │ │ └── ManagerTopAppBar.kt │ │ │ ├── resource/ │ │ │ │ └── ManagerString.kt │ │ │ ├── screen/ │ │ │ │ ├── AboutScreen.kt │ │ │ │ ├── ConfigurationScreen.kt │ │ │ │ ├── HomeScreen.kt │ │ │ │ ├── InstallScreen.kt │ │ │ │ └── SettingsScreen.kt │ │ │ ├── theme/ │ │ │ │ ├── Color.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ ├── util/ │ │ │ │ ├── Color.kt │ │ │ │ ├── Const.kt │ │ │ │ └── Screen.kt │ │ │ ├── viewmodel/ │ │ │ │ ├── ConfigurationViewModel.kt │ │ │ │ ├── InstallViewModel.kt │ │ │ │ ├── MainViewModel.kt │ │ │ │ └── SettingsViewModel.kt │ │ │ └── widget/ │ │ │ ├── AppCard.kt │ │ │ └── LinkCard.kt │ │ └── util/ │ │ ├── AppHelper.kt │ │ ├── Arch.kt │ │ ├── Coroutines.kt │ │ ├── IO.kt │ │ ├── Safety.kt │ │ └── SuShell.kt │ └── res/ │ ├── animator/ │ │ ├── fragment_enter.xml │ │ ├── fragment_enter_pop.xml │ │ ├── fragment_exit.xml │ │ └── fragment_exit_pop.xml │ ├── drawable/ │ │ ├── ic_adguard.xml │ │ ├── ic_android_black_24dp.xml │ │ ├── ic_app_icon_placeholder.xml │ │ ├── ic_brave.xml │ │ ├── ic_brave_light.xml │ │ ├── ic_discord.xml │ │ ├── ic_github.xml │ │ ├── ic_instagram.xml │ │ ├── ic_launch_text.xml │ │ ├── ic_magisk.xml │ │ ├── ic_manager.xml │ │ ├── ic_manager_monet_icon.xml │ │ ├── ic_microg.xml │ │ ├── ic_music.xml │ │ ├── ic_reddit.xml │ │ ├── ic_round_assignment_24.xml │ │ ├── ic_round_close_24.xml │ │ ├── ic_round_done_24.xml │ │ ├── ic_splash.xml │ │ ├── ic_telegram.xml │ │ ├── ic_twitter.xml │ │ ├── ic_vanced.xml │ │ ├── ic_website.xml │ │ └── ic_youtube.xml │ ├── drawable-anydpi-v24/ │ │ └── ic_stat_name.xml │ ├── drawable-v24/ │ │ └── ic_launcher_foreground.xml │ ├── mipmap-anydpi-v26/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── arrays.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── resources.xml │ │ ├── strings.xml │ │ └── themes.xml │ ├── values-af-rZA/ │ │ └── strings.xml │ ├── values-ar-rSA/ │ │ └── strings.xml │ ├── values-az-rAZ/ │ │ └── strings.xml │ ├── values-bg-rBG/ │ │ └── strings.xml │ ├── values-bn-rBD/ │ │ └── strings.xml │ ├── values-bn-rIN/ │ │ └── strings.xml │ ├── values-ca-rES/ │ │ └── strings.xml │ ├── values-ckb-rIR/ │ │ └── strings.xml │ ├── values-cs-rCZ/ │ │ └── strings.xml │ ├── values-da-rDK/ │ │ └── strings.xml │ ├── values-de-rDE/ │ │ └── strings.xml │ ├── values-el-rGR/ │ │ └── strings.xml │ ├── values-es-rES/ │ │ └── strings.xml │ ├── values-et-rEE/ │ │ └── strings.xml │ ├── values-fi-rFI/ │ │ └── strings.xml │ ├── values-fil-rPH/ │ │ └── strings.xml │ ├── values-fr-rFR/ │ │ └── strings.xml │ ├── values-hi-rIN/ │ │ └── strings.xml │ ├── values-hr-rHR/ │ │ └── strings.xml │ ├── values-hu-rHU/ │ │ └── strings.xml │ ├── values-in-rID/ │ │ └── strings.xml │ ├── values-it-rIT/ │ │ └── strings.xml │ ├── values-iw-rIL/ │ │ └── strings.xml │ ├── values-ja-rJP/ │ │ └── strings.xml │ ├── values-ka-rGE/ │ │ └── strings.xml │ ├── values-kmr-rTR/ │ │ └── strings.xml │ ├── values-ko-rKR/ │ │ └── strings.xml │ ├── values-ku-rTR/ │ │ └── strings.xml │ ├── values-lt-rLT/ │ │ └── strings.xml │ ├── values-ml-rIN/ │ │ └── strings.xml │ ├── values-mr-rIN/ │ │ └── strings.xml │ ├── values-night/ │ │ └── colors.xml │ ├── values-nl-rNL/ │ │ └── strings.xml │ ├── values-no-rNO/ │ │ └── strings.xml │ ├── values-pa-rIN/ │ │ └── strings.xml │ ├── values-pa-rPK/ │ │ └── strings.xml │ ├── values-pl-rPL/ │ │ └── strings.xml │ ├── values-ps-rAF/ │ │ └── strings.xml │ ├── values-pt-rBR/ │ │ └── strings.xml │ ├── values-pt-rPT/ │ │ └── strings.xml │ ├── values-ro-rRO/ │ │ └── strings.xml │ ├── values-ru-rRU/ │ │ └── strings.xml │ ├── values-si-rLK/ │ │ └── strings.xml │ ├── values-sk-rSK/ │ │ └── strings.xml │ ├── values-so-rSO/ │ │ └── strings.xml │ ├── values-sr-rSP/ │ │ └── strings.xml │ ├── values-sv-rSE/ │ │ └── strings.xml │ ├── values-ta-rIN/ │ │ └── strings.xml │ ├── values-th-rTH/ │ │ └── strings.xml │ ├── values-tr-rTR/ │ │ └── strings.xml │ ├── values-uk-rUA/ │ │ └── strings.xml │ ├── values-vi-rVN/ │ │ └── strings.xml │ ├── values-zh-rCN/ │ │ └── strings.xml │ ├── values-zh-rTW/ │ │ └── strings.xml │ └── xml/ │ └── file_provider.xml ├── build.gradle.kts ├── crowdin.yml ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug-issue-template.md ================================================ --- name: Bug issue template about: Vanced Manager Bug template title: '' labels: '' assignees: '' --- **Please only open the issue if the following is true** - This is an issue in the Vanced Manager and ONLY Vanced Manager (NOT Youtube Vanced/Music/microG) **Phone Specifications:** - Brand: - Operating System: - Android Version: - Vanced Manager Version: **Please describe the problem you are having in as much detail as possible:** **Steps to reproduce:** **Further details:** ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false ================================================ FILE: .github/ISSUE_TEMPLATE/feature-request-template.md ================================================ --- name: Feature Request Template about: Vanced Manager Feature Request Template title: '' labels: 'enhancement' assignees: '' --- **Please only open the issue if the following is true** - This is an issue in the Vanced Manager and ONLY Vanced Manager (NOT Youtube Vanced/Music/microG) **Suggestion:** **Why is this suggestion relevant?** **Further details:** ================================================ FILE: .github/workflows/debug.yml ================================================ name: Debug APK Builder on: push: branches: - dev paths-ignore: - '**.md' pull_request: branches: - dev paths-ignore: - '**.md' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Grant rights run: chmod +x ./gradlew - name: Build project with Gradle run: ./gradlew build - name: Build Debug APK with Gradle run: ./gradlew assembleDebug - name: Upload Debug uses: actions/upload-artifact@v2 with: name: 'Manager' path: app/build/outputs/apk/debug/app-debug.apk ================================================ FILE: .github/workflows/lint.yml ================================================ name: Code Linter on: push: branches: - dev jobs: qodana: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/cache@v2 with: path: ~/work/_temp/_github_home/cache key: ${{ runner.os }}-qodana-${{ github.ref }} restore-keys: | ${{ runner.os }}-qodana-${{ github.ref }} ${{ runner.os }}-qodana- - uses: docker://jetbrains/qodana-jvm-android with: args: --cache-dir=/github/home/cache --results-dir=/github/workspace/qodana --save-report --report-dir=/github/workspace/qodana/report - uses: actions/upload-artifact@v2 with: path: qodana ================================================ FILE: .gitignore ================================================ .gradle/ .idea/ build/ local.properties ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ # Vanced Manager [![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg?style=for-the-badge)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg?style=for-the-badge)](https://github.com/YTVanced/VancedManager/releases/latest) # **Now discontinued https://twitter.com/YTVanced/status/1503052250268286980** Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out. Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born. After 3 months of development, we are finally ready to introduce Vanced Manager to the masses. Vanced manager can easily install and uninstall vanced and microg, has various settings for customisation and better experience. The Manager comes with an easy-to-use interface ##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity. ## Contributions Pull requests should be made to the Dev branch as that is the working branch, master is for release code. For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for Vanced. Any issues with translations should be posted there too. ## Building
[![Build](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml/badge.svg?branch=dev)](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml)
### Using Android Studio Clone the repo, open it in Android Studio and build the app. ### Using command line #### On Windows: ```powershell .\gradlew.bat assembleDebug ``` #### On Linux/macOS: ```bash chmod +x gradlew ./gradlew assembleDebug ``` ================================================ FILE: READMEME.md ================================================ ![Signed APK Builder](https://github.com/X1nto/VancedInstaller/workflows/Signed%20APK%20Builder/badge.svg?branch=master) # Prelude Hi, my name is Steve Cock, I'm the main developer for the upcoming Vanced Manager. When xfileFIN first published Vanced 15.05.54, people were upset because new Vanced used split apk files. The reason for that was pretty simple: 1) YouTube itself does that 2) Split apk files reduce the size of the downloaded file itself No one really thought there would be problems with this format, because installation was pretty simple, at least that's what xfile thought... ## Problems with .apks format Main problems with new format were either with device CPU architecture or MemeUI shit with MiUI optimisations. We wrote instructions for VancedHelper but no one used it for troubleshooting. Then some users complained about new format and refused to upgrade to newest version (We don't give a fuck about that) because "I dOn'T WaNT To HaVe OnE MoRE apP To insTalL VanCeD" so we decided to make an installer for Vanced # Vanced Manager Ladies and gentlemen, I'm very proud to introduce the new **Vancad Banger 2.0.0.0.0.0.0.0.0.0.0.0.0™** (typo intended) Vanced Manager is an universal utility for installing/updating Vanced and MicroG. It will push notifications once the update is ready (Now that's what I call pwetty epic). Vanced Manager comes with a slick UI ~~that was stolen from the new Magisk Manager (I'm very sorry John but I looked at your code for about 100 times). Actually, while UI may look very similar to new Magisk Manager's UI, It's still very different (that's a blatant lie, I know).~~ <- diz shit completely invalid now so suck my balls Main Menu screenshot taken from tablet ![screenshot](https://i.imgur.com/r2jiq7J.png) Isn't this lovely and beautiful? ## Manager (clap) Reviews (clap) - 1337Potato: shit - Response: Yes =================== - Noobbot: The app is not useful because I have YT Premium. Thank you bye - Response: I hope you get sucked by a di- =================== - Vortextriangle: The app is so useful that I uninstalled it after installing Vanced - Response: yo that's finna woke ## How does it suck?™ Vanced Manager sucks 100% of your CPU to mine Bitcoins, this is a new technique called CryptocurrencySucker2077. Basically we load up your shit MediaTek MT 8163 with processes that help us mine cryptocurrency, this is how Vanced Team makes money (excluding BAT and AdGuard referrals) ## Credits ### Vanced Manager developers - X1nto (UI, UX, Downloader, Installer, Signature Checker, PussiSlayer69, Collector of 400 BAT, A great liar) - Koopah (Unix lord, Unmounter of /system, Code criticizer) ### The Vanced Team - xfileFIN ![xfileFIN](https://i.imgur.com/hLdzTVq.png) - KevinX8 ![KevinX8](https://i.imgur.com/cS9C7P8.png) - Zanezam ![Zanezam](https://i.imgur.com/QVcXA6q.png) - Laura Almeida ![Laura Almeida](https://i.imgur.com/ovVD939.png) ================================================ FILE: app/.gitignore ================================================ /build /release ================================================ FILE: app/build.gradle.kts ================================================ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions plugins { id("com.android.application") kotlin("android") id("kotlin-parcelize") kotlin("plugin.serialization") } val composeVersion = "1.1.1" android { compileSdk = 31 defaultConfig { minSdk = 21 targetSdk = 31 applicationId = "com.vanced.manager" versionCode = 3000 versionName = "3.0.0 (Re@Composed)" vectorDrawables.useSupportLibrary = true buildConfigField("String[]", "MANAGER_LANGUAGES", "{$languages}") } lint { disable += "MissingTranslation" disable += "ExtraTranslation" } buildTypes { getByName("release") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } buildFeatures { compose = true } packagingOptions { resources.excludes.add("META-INF/DEPENDENCIES") resources.excludes.add("META-INF/*.kotlin_module") } // To inline the bytecode built with JVM target 1.8 into // bytecode that is being built with JVM target 1.6. (e.g. navArgs) compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } composeOptions { kotlinCompilerExtensionVersion = composeVersion } } tasks.withType().configureEach { kotlinOptions { jvmTarget = "11" optIn("androidx.compose.material3.ExperimentalMaterial3Api") optIn("androidx.compose.animation.ExperimentalAnimationApi") optIn("androidx.compose.foundation.ExperimentalFoundationApi") } } fun KotlinJvmOptions.optIn(library: String) { freeCompilerArgs = freeCompilerArgs + "-opt-in=$library" } val languages: String get() { val langs = arrayListOf("en", "bn_BD", "bn_IN", "pa_IN", "pa_PK", "pt_BR", "pt_PT", "zh_CN", "zh_TW") val exceptions = arrayOf("bn", "pa", "pt", "zh") File("$projectDir/src/main/res").listFiles()?.filter { val name = it.name name.startsWith("values") && !name.contains("v23") && !name.contains("night") }?.forEach { dir -> val dirname = dir.name.substringAfter("-").substringBefore("-") if (!exceptions.contains(dirname)) { langs.add(dirname) } } return langs.joinToString(", ") { "\"$it\"" } } dependencies { implementation(kotlin("reflect")) implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") // AndroidX implementation("androidx.core:core-ktx:1.7.0") implementation("androidx.appcompat:appcompat:1.4.1") implementation("androidx.browser:browser:1.4.0") implementation("androidx.preference:preference-ktx:1.2.0") implementation("androidx.activity:activity-compose:1.4.0") val lifecycleVersion = "2.4.1" implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion") // Compose implementation("androidx.compose.compiler:compiler:$composeVersion") implementation("androidx.compose.foundation:foundation:$composeVersion") implementation("androidx.compose.material:material-icons-core:$composeVersion") implementation("androidx.compose.material:material-icons-extended:$composeVersion") implementation("androidx.compose.material:material:$composeVersion") implementation("androidx.compose.material3:material3:1.0.0-alpha06") implementation("androidx.compose.runtime:runtime-livedata:$composeVersion") implementation("androidx.compose.ui:ui-tooling:$composeVersion") implementation("androidx.compose.ui:ui-util:$composeVersion") implementation("androidx.compose.ui:ui:$composeVersion") // Google implementation("com.google.android.material:material:1.5.0") val accompanistVersion = "0.22.1-rc" implementation("com.google.accompanist:accompanist-navigation-animation:$accompanistVersion") implementation("com.google.accompanist:accompanist-placeholder-material:$accompanistVersion") implementation("com.google.accompanist:accompanist-swiperefresh:$accompanistVersion") implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion") // Other implementation("com.github.zsoltk:compose-router:0.28.0") implementation("io.coil-kt:coil-compose:1.4.0") implementation("com.github.skydoves:orchestra-colorpicker:1.1.0") val libsuVersion = "3.2.1" implementation("com.github.topjohnwu.libsu:core:$libsuVersion") implementation("com.github.topjohnwu.libsu:io:$libsuVersion") implementation("com.github.topjohnwu.libsu:busybox:$libsuVersion") val koinVersion = "3.1.3" implementation("io.insert-koin:koin-android:$koinVersion") implementation("io.insert-koin:koin-androidx-compose:$koinVersion") val retrofitVersion = "2.9.0" implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion") implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.3") androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0") } ================================================ FILE: app/google-services.json ================================================ { "project_info": { "project_number": "840099702732", "firebase_url": "https://vanced-manager-official.firebaseio.com", "project_id": "vanced-manager-official", "storage_bucket": "vanced-manager-official.appspot.com" }, "client": [ { "client_info": { "mobilesdk_app_id": "1:840099702732:android:ca65567b49f622bc359f69", "android_client_info": { "package_name": "com.vanced.manager" } }, "oauth_client": [ { "client_id": "840099702732-4fjjofq6on2bpd7jb6f96bk0mkrjkkf6.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { "current_key": "AIzaSyAPI1RUaoCHmmWz9-TLvTKYPYs0ZVKkS2U" } ], "services": { "appinvite_service": { "other_platform_oauth_client": [ { "client_id": "840099702732-4fjjofq6on2bpd7jb6f96bk0mkrjkkf6.apps.googleusercontent.com", "client_type": 3 } ] } } } ], "configuration_version": "1" } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle.kts.kts.kts.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} -keep class com.vanced.manager.network.dto.GithubReleaseDto { *; } -keep class com.vanced.manager.network.dto.GithubReleaseAssetDto { *; } # Uncomment this to preserve the line number information for # debugging stack traces. -keepattributes SourceFile, LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/vanced/manager/ManagerApplication.kt ================================================ package com.vanced.manager import android.app.Application import com.vanced.manager.di.* import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin class ManagerApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidContext(this@ManagerApplication) modules( apiModule, customTabsModule, datasourceModule, downloaderModule, installerModule, managerModule, networkModule, repositoryModule, serviceModule, viewModelModule, ) } } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/APIModule.kt ================================================ package com.vanced.manager.di import com.vanced.manager.downloader.api.MicrogAPI import com.vanced.manager.downloader.api.MusicAPI import com.vanced.manager.downloader.api.VancedAPI import com.vanced.manager.network.util.BASE import okhttp3.OkHttpClient import org.koin.dsl.module import retrofit2.Retrofit import retrofit2.create //TODO Add mirror support val apiModule = module { fun provideVancedAPI( okHttpClient: OkHttpClient ): VancedAPI { return Retrofit.Builder() .baseUrl(BASE) .client(okHttpClient) .build() .create() } fun provideMusicAPI( okHttpClient: OkHttpClient ): MusicAPI { return Retrofit.Builder() .baseUrl(BASE) .client(okHttpClient) .build() .create() } fun provideMicrogAPI( okHttpClient: OkHttpClient ): MicrogAPI { return Retrofit.Builder() .baseUrl("https://github.com/YTVanced/VancedMicroG/") .client(okHttpClient) .build() .create(MicrogAPI::class.java) } single { provideVancedAPI(get()) } single { provideMusicAPI(get()) } single { provideMicrogAPI(get()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/CustomTabsModule.kt ================================================ package com.vanced.manager.di import androidx.browser.customtabs.CustomTabsIntent import org.koin.dsl.module val customTabsModule = module { fun provideChromeCustomTabs(): CustomTabsIntent { return CustomTabsIntent.Builder() .build() } single { provideChromeCustomTabs() } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/DatasourceModule.kt ================================================ package com.vanced.manager.di import android.content.Context import com.vanced.manager.repository.source.PreferenceDatasource import com.vanced.manager.repository.source.PreferenceDatasourceImpl import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val datasourceModule = module { fun providePreferenceDatasource( context: Context ): PreferenceDatasource { return PreferenceDatasourceImpl( sharedPreferences = context.getSharedPreferences( "manager_settings", Context.MODE_PRIVATE ) ) } single { providePreferenceDatasource(androidContext()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/DownloaderModule.kt ================================================ package com.vanced.manager.di import android.content.Context import com.vanced.manager.downloader.api.MicrogAPI import com.vanced.manager.downloader.api.MusicAPI import com.vanced.manager.downloader.api.VancedAPI import com.vanced.manager.downloader.impl.MicrogDownloader import com.vanced.manager.downloader.impl.MusicDownloader import com.vanced.manager.downloader.impl.VancedDownloader import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val downloaderModule = module { fun provideVancedDownloader( vancedAPI: VancedAPI, context: Context, ): VancedDownloader { return VancedDownloader( vancedAPI = vancedAPI, context = context ) } fun provideMusicDownloader( musicAPI: MusicAPI, context: Context, ): MusicDownloader { return MusicDownloader( musicAPI = musicAPI, context = context ) } fun provideMicrogDownloader( microgAPI: MicrogAPI, context: Context, ): MicrogDownloader { return MicrogDownloader( microgAPI = microgAPI, context = context ) } single { provideVancedDownloader(get(), androidContext()) } single { provideMusicDownloader(get(), androidContext()) } single { provideMicrogDownloader(get(), androidContext()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/InstallerModuke.kt ================================================ package com.vanced.manager.di import android.content.Context import com.vanced.manager.installer.impl.MicrogInstaller import com.vanced.manager.installer.impl.MusicInstaller import com.vanced.manager.installer.impl.VancedInstaller import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.RootPackageManager import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val installerModule = module { fun provideVancedInstaller( context: Context, nonrootPackageManager: NonrootPackageManager, rootPackageManager: RootPackageManager ): VancedInstaller { return VancedInstaller( context = context, nonrootPackageManager = nonrootPackageManager, rootPackageManager = rootPackageManager ) } fun provideMusicInstaller( context: Context, nonrootPackageManager: NonrootPackageManager, rootPackageManager: RootPackageManager ): MusicInstaller { return MusicInstaller( context = context, nonrootPackageManager = nonrootPackageManager, rootPackageManager = rootPackageManager ) } fun provideMicrogInstaller( context: Context, nonrootPackageManager: NonrootPackageManager, ): MicrogInstaller { return MicrogInstaller( context = context, nonrootPackageManager = nonrootPackageManager ) } single { provideVancedInstaller(androidContext(), get(), get()) } single { provideMusicInstaller(androidContext(), get(), get()) } single { provideMicrogInstaller(androidContext(), get()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/ManagerModule.kt ================================================ package com.vanced.manager.di import android.content.Context import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.RootPackageManager import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val managerModule = module { fun provideNonrootPackageManager( context: Context ): NonrootPackageManager { return NonrootPackageManager( context = context ) } fun provideRootPackageManager(): RootPackageManager { return RootPackageManager() } single { provideNonrootPackageManager(androidContext()) } single { provideRootPackageManager() } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/NetworkModule.kt ================================================ package com.vanced.manager.di import okhttp3.OkHttpClient import org.koin.dsl.module val networkModule = module { fun provideOkHttpClient(): OkHttpClient { return OkHttpClient.Builder() .build() } single { provideOkHttpClient() } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/RepositoryModule.kt ================================================ package com.vanced.manager.di import com.vanced.manager.network.GithubService import com.vanced.manager.repository.AppRepository import com.vanced.manager.repository.AppRepositoryImpl import com.vanced.manager.repository.PreferenceRepository import com.vanced.manager.repository.PreferenceRepositoryImpl import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.RootPackageManager import com.vanced.manager.repository.source.PreferenceDatasource import org.koin.dsl.module val repositoryModule = module { fun provideGithubRepository( githubService: GithubService, nonrootPackageManager: NonrootPackageManager, rootPackageManager: RootPackageManager, ): AppRepository { return AppRepositoryImpl( githubService = githubService, nonrootPackageManager = nonrootPackageManager, rootPackageManager = rootPackageManager ) } fun providePreferenceRepository( preferenceDatasource: PreferenceDatasource ): PreferenceRepository { return PreferenceRepositoryImpl( preferenceDatasource = preferenceDatasource ) } single { provideGithubRepository(get(), get(), get()) } single { providePreferenceRepository(get()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/ServiceModule.kt ================================================ package com.vanced.manager.di import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.vanced.manager.network.GithubService import com.vanced.manager.network.util.GITHUB_API_BASE import kotlinx.serialization.json.Json import okhttp3.MediaType import okhttp3.OkHttpClient import org.koin.dsl.module import retrofit2.Retrofit import retrofit2.create private val json = Json { ignoreUnknownKeys = true } val serviceModule = module { fun provideGithubService( okHttpClient: OkHttpClient ): GithubService { return Retrofit.Builder() .baseUrl(GITHUB_API_BASE) .addConverterFactory(json.asConverterFactory(MediaType.get("application/json"))) .client(okHttpClient) .build() .create() } single { provideGithubService(get()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/di/ViewModelModule.kt ================================================ package com.vanced.manager.di import android.app.Application import com.vanced.manager.downloader.impl.MicrogDownloader import com.vanced.manager.downloader.impl.MusicDownloader import com.vanced.manager.downloader.impl.VancedDownloader import com.vanced.manager.installer.impl.MicrogInstaller import com.vanced.manager.installer.impl.MusicInstaller import com.vanced.manager.installer.impl.VancedInstaller import com.vanced.manager.repository.AppRepository import com.vanced.manager.repository.PreferenceRepository import com.vanced.manager.ui.viewmodel.ConfigurationViewModel import com.vanced.manager.ui.viewmodel.InstallViewModel import com.vanced.manager.ui.viewmodel.MainViewModel import com.vanced.manager.ui.viewmodel.SettingsViewModel import org.koin.android.ext.koin.androidApplication import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val viewModelModule = module { fun provideMainViewModel( appRepository: AppRepository, preferenceRepository: PreferenceRepository, app: Application, ): MainViewModel { return MainViewModel( appRepository = appRepository, preferenceRepository = preferenceRepository, app = app ) } fun provideInstallViewModel( vancedDownloader: VancedDownloader, musicDownloader: MusicDownloader, microgDownloader: MicrogDownloader, vancedInstaller: VancedInstaller, musicInstaller: MusicInstaller, microgInstaller: MicrogInstaller, ): InstallViewModel { return InstallViewModel( vancedDownloader = vancedDownloader, musicDownloader = musicDownloader, microgDownloader = microgDownloader, vancedInstaller = vancedInstaller, musicInstaller = musicInstaller, microgInstaller = microgInstaller ) } fun provideConfigurationViewModel(): ConfigurationViewModel { return ConfigurationViewModel() } fun provideSettingsViewModel( preferenceRepository: PreferenceRepository ): SettingsViewModel { return SettingsViewModel( preferenceRepository = preferenceRepository ) } viewModel { provideMainViewModel(get(), get(), androidApplication()) } viewModel { provideInstallViewModel(get(), get(), get(), get(), get(), get()) } viewModel { provideConfigurationViewModel() } viewModel { provideSettingsViewModel(get()) } } ================================================ FILE: app/src/main/java/com/vanced/manager/domain/model/App.kt ================================================ package com.vanced.manager.domain.model import androidx.annotation.DrawableRes import com.vanced.manager.R data class App( val name: String, @DrawableRes val iconResId: Int, val changelog: String, val remoteVersionCode: Int, val remoteVersionName: String, val installedVersionCode: Int?, val installedVersionName: String?, val packageName: String, val launchActivity: String, val state: AppState, val app: AppType ) object AppData { const val NAME_VANCED_YOUTUBE = "YouTube Vanced" const val NAME_VANCED_YOUTUBE_MUSIC = "YouTube Vanced Music" const val NAME_VANCED_MICROG = "Vanced microG" const val NAME_VANCED_MANAGER = "Vanced Manager" const val ICON_VANCED_YOUTUBE = R.drawable.ic_vanced const val ICON_VANCED_YOUTUBE_MUSIC = R.drawable.ic_music const val ICON_VANCED_MICROG = R.drawable.ic_microg const val ICON_VANCED_MANAGER = R.drawable.ic_manager const val PACKAGE_VANCED_YOUTUBE = "com.vanced.android.youtube" const val PACKAGE_VANCED_YOUTUBE_MUSIC = "com.vanced.android.youtube.apps.music" const val PACKAGE_VANCED_MICROG = "com.mgoogle.android.gms" const val PACKAGE_VANCED_MANAGER = "com.vanced.manager" const val PACKAGE_ROOT_VANCED_YOUTUBE = "com.google.android.youtube" const val PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC = "com.google.android.youtube.apps.music" const val LAUNCH_ACTIVITY_VANCED_YOUTUBE = "com.google.android.youtube.HomeActivity" const val LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music.activities.MusicActivity" const val LAUNCH_ACTIVITY_VANCED_MICROG = "org.microg.gms.ui.SettingsActivity" const val LAUNCH_ACTIVITY_VANCED_MANAGER = "" } enum class AppType { VANCED_YOUTUBE, VANCED_YOUTUBE_MUSIC, VANCED_MICROG, VANCED_MANAGER, } enum class AppState { NOT_INSTALLED, INSTALLED, NEEDS_UPDATE } ================================================ FILE: app/src/main/java/com/vanced/manager/domain/model/InstallationOption.kt ================================================ package com.vanced.manager.domain.model import android.os.Parcelable import kotlinx.parcelize.Parcelize sealed interface InstallationOption : Parcelable { val titleId: Int val items: List @Parcelize data class MultiSelect( override val titleId: Int, override val items: List, val getOption: () -> Set, val addOption: (String) -> Unit, val removeOption: (String) -> Unit ) : InstallationOption @Parcelize data class SingleSelect( override val titleId: Int, override val items: List, val getOption: () -> String, val setOption: (String) -> Unit, ) : InstallationOption } @Parcelize data class InstallationOptionItem( val key: String, val displayText: (key: String) -> String, ) : Parcelable ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/api/MicrogAPI.kt ================================================ package com.vanced.manager.downloader.api import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Streaming interface MicrogAPI { @GET("releases/latest/download/microg.apk") @Streaming fun getFile(): Call } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/api/MusicAPI.kt ================================================ package com.vanced.manager.downloader.api import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Streaming interface MusicAPI { @GET("music/v{version}/{variant}.apk") @Streaming fun getFiles( @Path("version") version: String, @Path("variant") variant: String, ): Call } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/api/VancedAPI.kt ================================================ package com.vanced.manager.downloader.api import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Streaming interface VancedAPI { @GET("apks/v{version}/{variant}/{type}/{apkName}") @Streaming fun getFiles( @Path("version") version: String, @Path("variant") variant: String, @Path("type") type: String, @Path("apkName") apkName: String, ): Call } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/base/AppDownloader.kt ================================================ package com.vanced.manager.downloader.base import com.vanced.manager.util.writeFile import okhttp3.ResponseBody import retrofit2.Call import retrofit2.awaitResponse abstract class AppDownloader { data class DownloadFile( val fileName: String, val call: Call, ) sealed class DownloadStatus { object Success : DownloadStatus() data class Error(val error: String, val fileName: String) : DownloadStatus() val isSuccess get() = this is Success val isError get() = this is Error } abstract suspend fun download( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus abstract suspend fun downloadRoot( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus abstract fun getSavedFilePath(): String suspend inline fun downloadFiles( files: Array, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { for (file in files) { try { onFile(file.fileName) val response = file.call.awaitResponse() if (response.isSuccessful) { response.body()?.writeFile(getSavedFilePath() + "/${file.fileName}", onProgress) continue } val error = response.errorBody()?.toString() if (error != null) { return DownloadStatus.Error(error, file.fileName) } } catch (e: Exception) { return DownloadStatus.Error(e.stackTraceToString(), file.fileName) } } return DownloadStatus.Success } } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/impl/MicrogDownloader.kt ================================================ package com.vanced.manager.downloader.impl import android.content.Context import com.vanced.manager.downloader.api.MicrogAPI import com.vanced.manager.downloader.base.AppDownloader import com.vanced.manager.downloader.util.getMicrogPath import java.io.File class MicrogDownloader( private val microgAPI: MicrogAPI, private val context: Context, ) : AppDownloader() { override suspend fun download( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { val downloadStatus = downloadFiles( files = arrayOf( DownloadFile( call = microgAPI.getFile(), fileName = "microg.apk" ) ), onProgress = onProgress, onFile = onFile ) if (downloadStatus.isError) return downloadStatus return DownloadStatus.Success } override suspend fun downloadRoot( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { throw IllegalAccessException("Vanced microG does not have a root downloader") } override fun getSavedFilePath(): String { val directory = File(getMicrogPath(context)) if (!directory.exists()) directory.mkdirs() return directory.path } } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/impl/MusicDownloader.kt ================================================ package com.vanced.manager.downloader.impl import android.content.Context import com.vanced.manager.downloader.api.MusicAPI import com.vanced.manager.downloader.base.AppDownloader import com.vanced.manager.downloader.util.getVancedYoutubeMusicPath import com.vanced.manager.preferences.holder.managerVariantPref import com.vanced.manager.preferences.holder.musicVersionPref import com.vanced.manager.util.getLatestOrProvidedAppVersion import java.io.File class MusicDownloader( private val musicAPI: MusicAPI, private val context: Context, ) : AppDownloader() { private lateinit var absoluteVersion: String override suspend fun download( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { absoluteVersion = getLatestOrProvidedAppVersion(musicVersionPref, appVersions) val downloadStatus = downloadFiles( files = arrayOf( DownloadFile( call = musicAPI.getFiles( version = absoluteVersion, variant = managerVariantPref, ), fileName = "music.apk" ) ), onProgress = onProgress, onFile = onFile ) if (downloadStatus.isError) return downloadStatus return DownloadStatus.Success } override suspend fun downloadRoot( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { return DownloadStatus.Success } override fun getSavedFilePath(): String { val directory = File(getVancedYoutubeMusicPath(absoluteVersion, managerVariantPref, context)) if (!directory.exists()) directory.mkdirs() return directory.path } } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/impl/VancedDownloader.kt ================================================ package com.vanced.manager.downloader.impl import android.content.Context import com.vanced.manager.downloader.api.VancedAPI import com.vanced.manager.downloader.base.AppDownloader import com.vanced.manager.downloader.util.getVancedYoutubePath import com.vanced.manager.preferences.holder.managerVariantPref import com.vanced.manager.preferences.holder.vancedLanguagesPref import com.vanced.manager.preferences.holder.vancedThemePref import com.vanced.manager.preferences.holder.vancedVersionPref import com.vanced.manager.util.arch import com.vanced.manager.util.getLatestOrProvidedAppVersion import java.io.File class VancedDownloader( private val vancedAPI: VancedAPI, private val context: Context, ) : AppDownloader() { private lateinit var absoluteVersion: String override suspend fun download( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) val files = arrayOf( getFile( type = "Theme", apkName = "$vancedThemePref.apk", ), getFile( type = "Arch", apkName = "split_config.$arch.apk", ) ) + vancedLanguagesPref.map { language -> getFile( type = "Language", apkName = "split_config.$language.apk", ) } val downloadStatus = downloadFiles( files = files, onProgress = onProgress, onFile = onFile, ) if (downloadStatus.isError) return downloadStatus return DownloadStatus.Success } override suspend fun downloadRoot( appVersions: List?, onProgress: (Float) -> Unit, onFile: (String) -> Unit ): DownloadStatus { return DownloadStatus.Success } override fun getSavedFilePath(): String { val directory = File(getVancedYoutubePath(absoluteVersion, managerVariantPref, context)) if (!directory.exists()) directory.mkdirs() return directory.path } private fun getFile( type: String, apkName: String, ) = DownloadFile( call = vancedAPI.getFiles( version = absoluteVersion, variant = managerVariantPref, type = type, apkName = apkName ), fileName = apkName ) } ================================================ FILE: app/src/main/java/com/vanced/manager/downloader/util/DownloadPath.kt ================================================ package com.vanced.manager.downloader.util import android.content.Context fun getVancedYoutubePath( version: String, variant: String, context: Context ) = context.getExternalFilesDirPath("vanced_youtube") + "/$version/$variant" fun getVancedYoutubeMusicPath( version: String, variant: String, context: Context ) = context.getExternalFilesDirPath("vanced_music") + "/$version/$variant" fun getMicrogPath( context: Context ) = context.getExternalFilesDirPath("microg") fun getStockYoutubePath( version: String, context: Context ) = context.getExternalFilesDirPath("stock_youtube") + "/$version" fun getStockYoutubeMusicPath( version: String, context: Context ) = context.getExternalFilesDirPath("stock_youtube_music") + "/$version" private fun Context.getExternalFilesDirPath( type: String ): String { val filesDir = getExternalFilesDir(type)!! //fuck null safety, amirite? if (!filesDir.exists()) filesDir.mkdirs() return filesDir.path } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/base/AppInstaller.kt ================================================ package com.vanced.manager.installer.base import com.vanced.manager.repository.manager.PackageManagerResult abstract class AppInstaller { abstract suspend fun install(appVersions: List?) abstract suspend fun installRoot(appVersions: List?): PackageManagerResult } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/impl/MicrogInstaller.kt ================================================ package com.vanced.manager.installer.impl import android.content.Context import com.vanced.manager.downloader.util.getMicrogPath import com.vanced.manager.installer.base.AppInstaller import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.PackageManagerResult import java.io.File class MicrogInstaller( private val context: Context, private val nonrootPackageManager: NonrootPackageManager, ) : AppInstaller() { override suspend fun install(appVersions: List?) { val musicApk = File(getMicrogPath(context), "microg.apk") nonrootPackageManager.installApp(musicApk) } override suspend fun installRoot(appVersions: List?): PackageManagerResult { throw IllegalAccessException("Vanced microG does not have a root installer") } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/impl/MusicInstaller.kt ================================================ package com.vanced.manager.installer.impl import android.content.Context import com.vanced.manager.domain.model.AppData import com.vanced.manager.downloader.util.getStockYoutubeMusicPath import com.vanced.manager.downloader.util.getVancedYoutubeMusicPath import com.vanced.manager.installer.base.AppInstaller import com.vanced.manager.installer.util.RootPatchHelper import com.vanced.manager.preferences.holder.managerVariantPref import com.vanced.manager.preferences.holder.musicVersionPref import com.vanced.manager.preferences.holder.vancedVersionPref import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.PackageManagerResult import com.vanced.manager.repository.manager.RootPackageManager import com.vanced.manager.util.getLatestOrProvidedAppVersion import java.io.File class MusicInstaller( private val context: Context, private val rootPackageManager: RootPackageManager, private val nonrootPackageManager: NonrootPackageManager, ) : AppInstaller() { override suspend fun install(appVersions: List?) { val absoluteVersion = getLatestOrProvidedAppVersion(musicVersionPref, appVersions) val musicApk = File( getVancedYoutubeMusicPath( absoluteVersion, managerVariantPref, context ) + "/music.apk" ) nonrootPackageManager.installApp(musicApk) } override suspend fun installRoot(appVersions: List?): PackageManagerResult { val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) val stock = File(getStockYoutubeMusicPath(absoluteVersion, context), "base.apk") val vanced = File(getVancedYoutubeMusicPath(absoluteVersion, "root", context), "base.apk") val prepareStock = RootPatchHelper.prepareStock( stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC, stockVersion = absoluteVersion ) { rootPackageManager.installApp(stock) } if (prepareStock.isError) return prepareStock val patchStock = RootPatchHelper.patchStock( patchPath = vanced.absolutePath, stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC, app = APP_KEY ) if (patchStock.isError) return patchStock return PackageManagerResult.Success(null) } companion object { const val APP_KEY = "youtube_music_vanced" } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/impl/VancedInstaller.kt ================================================ package com.vanced.manager.installer.impl import android.content.Context import com.vanced.manager.domain.model.AppData import com.vanced.manager.downloader.util.getStockYoutubePath import com.vanced.manager.downloader.util.getVancedYoutubePath import com.vanced.manager.installer.base.AppInstaller import com.vanced.manager.installer.util.RootPatchHelper import com.vanced.manager.preferences.holder.vancedVersionPref import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.PackageManagerResult import com.vanced.manager.repository.manager.RootPackageManager import com.vanced.manager.util.getLatestOrProvidedAppVersion import java.io.File class VancedInstaller( private val context: Context, private val rootPackageManager: RootPackageManager, private val nonrootPackageManager: NonrootPackageManager, ) : AppInstaller() { override suspend fun install(appVersions: List?) { val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) val apks = File(getVancedYoutubePath(absoluteVersion, "nonroot", context)) .listFiles() nonrootPackageManager.installSplitApp(apks!!) } override suspend fun installRoot(appVersions: List?): PackageManagerResult { val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) val stockApks = File(getStockYoutubePath(absoluteVersion, context)) .listFiles() val vancedBaseApk = getVancedYoutubePath(absoluteVersion, "root", context) + "/base.apk" val prepareStock = RootPatchHelper.prepareStock( stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE, stockVersion = absoluteVersion, ) { rootPackageManager.installSplitApp(stockApks!!) } if (prepareStock.isError) return prepareStock val patchStock = RootPatchHelper.patchStock( patchPath = vancedBaseApk, stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE, app = APP_KEY ) if (patchStock.isError) return patchStock return PackageManagerResult.Success(null) } companion object { const val APP_KEY = "youtube_vanced" } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/service/AppInstallService.kt ================================================ package com.vanced.manager.installer.service import android.app.Service import android.content.Intent import android.content.pm.PackageInstaller import android.os.IBinder class AppInstallService : Service() { override fun onStartCommand( intent: Intent, flags: Int, startId: Int ): Int { val extraStatus = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999) val extraStatusMessage = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) when (extraStatus) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { startActivity( intent.getParcelableExtra(Intent.EXTRA_INTENT).apply { this?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } ) } else -> { sendBroadcast(Intent().apply { action = APP_INSTALL_ACTION putExtra(EXTRA_INSTALL_STATUS, extraStatus) putExtra(EXTRA_INSTALL_STATUS_MESSAGE, extraStatusMessage) }) } } stopSelf() return START_NOT_STICKY } override fun onBind(intent: Intent?): IBinder? = null companion object { const val APP_INSTALL_ACTION = "APP_INSTALL_ACTION" const val EXTRA_INSTALL_STATUS = "EXTRA_INSTALL_STATUS" const val EXTRA_INSTALL_STATUS_MESSAGE = "EXTRA_INSTALL_STATUS_MESSAGE" } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/service/AppUninstallService.kt ================================================ package com.vanced.manager.installer.service import android.app.Service import android.content.Intent import android.content.pm.PackageInstaller import android.os.IBinder class AppUninstallService : Service() { override fun onStartCommand( intent: Intent, flags: Int, startId: Int ): Int { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { startActivity( intent.getParcelableExtra(Intent.EXTRA_INTENT).apply { this?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } ) } else -> { sendBroadcast(Intent().apply { action = APP_UNINSTALL_ACTION }) } } stopSelf() return START_NOT_STICKY } override fun onBind(intent: Intent?): IBinder? = null companion object { const val APP_UNINSTALL_ACTION = "APP_UNINSTALL_ACTION" } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/util/PM.kt ================================================ package com.vanced.manager.installer.util import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller import android.content.pm.PackageManager import android.os.Build import com.vanced.manager.installer.service.AppInstallService import com.vanced.manager.installer.service.AppUninstallService import java.io.File private const val byteArraySize = 1024 * 1024 // Because 1,048,576 is not readable object PM { fun installApp(apk: File, context: Context) { val packageInstaller = context.packageManager.packageInstaller val session = packageInstaller.openSession(packageInstaller.createSession(sessionParams)) session.writeApk(apk) session.commit(context.installIntentSender) session.close() } fun installSplitApp(apks: Array, context: Context) { val packageInstaller = context.packageManager.packageInstaller val session = packageInstaller.openSession(packageInstaller.createSession(sessionParams)) for (apk in apks) { session.writeApk(apk) } session.commit(context.installIntentSender) session.close() } fun uninstallPackage(pkg: String, context: Context) { val packageInstaller = context.packageManager.packageInstaller packageInstaller.uninstall(pkg, context.uninstallIntentSender) } } private fun PackageInstaller.Session.writeApk(apk: File) { apk.inputStream().use { inputStream -> openWrite(apk.name, 0, apk.length()).use { outputStream -> inputStream.copyTo(outputStream, byteArraySize) fsync(outputStream) } } } private val intentFlags get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0 private val sessionParams get() = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL ).apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { setInstallReason(PackageManager.INSTALL_REASON_USER) } } private val Context.installIntentSender get() = PendingIntent.getService( this, 0, Intent(this, AppInstallService::class.java), intentFlags ).intentSender private val Context.uninstallIntentSender get() = PendingIntent.getService( this, 0, Intent(this, AppUninstallService::class.java), intentFlags ).intentSender ================================================ FILE: app/src/main/java/com/vanced/manager/installer/util/PMRoot.kt ================================================ package com.vanced.manager.installer.util import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFileOutputStream import com.vanced.manager.repository.manager.PackageManagerResult import com.vanced.manager.repository.manager.PackageManagerError import com.vanced.manager.repository.manager.getEnumForInstallFailed import com.vanced.manager.util.errString import com.vanced.manager.util.outString import java.io.File import java.io.IOException object PMRoot { fun installApp(apkPath: String): PackageManagerResult { val apk = File(apkPath) val tmpApk = copyApkToTemp(apk).getOrElse { exception -> return PackageManagerResult.Error( PackageManagerError.SESSION_FAILED_COPY, exception.stackTraceToString() ) } val install = Shell.su("pm", "install", "-r", tmpApk.absolutePath).exec() tmpApk.delete() if (!install.isSuccess) { val errString = install.errString return PackageManagerResult.Error(getEnumForInstallFailed(errString), errString) } return PackageManagerResult.Success(null) } fun installSplitApp(apkPaths: List): PackageManagerResult { val installCreate = Shell.su("pm", "install-create", "-r").exec() if (!installCreate.isSuccess) return PackageManagerResult.Error(PackageManagerError.SESSION_FAILED_CREATE, installCreate.errString) val sessionId = installCreate.outString if (sessionId.toIntOrNull() == null) return PackageManagerResult.Error(PackageManagerError.SESSION_INVALID_ID, installCreate.errString) for (apkPath in apkPaths) { val apk = File(apkPath) val tmpApk = copyApkToTemp(apk).getOrElse { exception -> return PackageManagerResult.Error( PackageManagerError.SESSION_FAILED_COPY, exception.stackTraceToString() ) } val installWrite = Shell.su("pm", "install-write", sessionId, tmpApk.name, tmpApk.absolutePath) .exec() tmpApk.delete() if (!installWrite.isSuccess) return PackageManagerResult.Error(PackageManagerError.SESSION_FAILED_WRITE, installWrite.errString) } val installCommit = Shell.su("pm", "install-commit", sessionId).exec() if (!installCommit.isSuccess) { val errString = installCommit.errString return PackageManagerResult.Error(getEnumForInstallFailed(errString), errString) } return PackageManagerResult.Success(null) } fun uninstallApp(pkg: String): PackageManagerResult { val uninstall = Shell.su("pm", "uninstall", pkg).exec() if (!uninstall.isSuccess) return PackageManagerResult.Error(PackageManagerError.UNINSTALL_FAILED, uninstall.errString) return PackageManagerResult.Success(null) } fun setInstallerPackage(targetPkg: String, installerPkg: String): PackageManagerResult { val setInstaller = Shell.su("pm", "set-installer", targetPkg, installerPkg) .exec() if (!setInstaller.isSuccess) return PackageManagerResult.Error( PackageManagerError.SET_FAILED_INSTALLER, setInstaller.errString ) return PackageManagerResult.Success(null) } fun forceStopApp(pkg: String): PackageManagerResult { val stopApp = Shell.su("am", "force-stop", pkg).exec() if (!stopApp.isSuccess) return PackageManagerResult.Error(PackageManagerError.APP_FAILED_FORCE_STOP, stopApp.errString) return PackageManagerResult.Success(null) } fun getPackageVersionName(pkg: String): PackageManagerResult { val keyword = "versionName=" val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() if (!dumpsys.isSuccess) return PackageManagerResult.Error( PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, dumpsys.errString ) return PackageManagerResult.Success(dumpsys.outString.removePrefix(keyword)) } fun getPackageVersionCode(pkg: String): PackageManagerResult { val keyword = "versionCode=" val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() if (!dumpsys.isSuccess) return PackageManagerResult.Error( PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, dumpsys.errString ) return PackageManagerResult.Success( dumpsys.outString.removePrefix(keyword).substringAfter("minSdk") .toLong() ) } fun getPackageDir(pkg: String): PackageManagerResult { val keyword = "path: " val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() if (!dumpsys.isSuccess) return PackageManagerResult.Error(PackageManagerError.GET_FAILED_PACKAGE_DIR, dumpsys.errString) return PackageManagerResult.Success(dumpsys.outString.removePrefix(keyword)) } } private fun copyApkToTemp(apk: File): Result { val tmpPath = "/data/local/tmp/${apk.name}" val tmpApk = SuFile(tmpPath).apply { createNewFile() } try { SuFileOutputStream.open(tmpApk).use { it.write(apk.readBytes()) it.flush() } } catch (e: IOException) { return Result.failure(e) } return Result.success(tmpApk) } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/util/PMRootResult.kt ================================================ package com.vanced.manager.installer.util enum class PMRootStatus { ACTION_FAILED_SET_INSTALLER, ACTION_FAILED_GET_PACKAGE_DIR, ACTION_FAILED_GET_PACKAGE_VERSION_NAME, ACTION_FAILED_GET_PACKAGE_VERSION_CODE, ACTION_FAILED_FORCE_STOP_APP, INSTALL_SUCCESSFUL, INSTALL_FAILED_ABORTED, INSTALL_FAILED_ALREADY_EXISTS, INSTALL_FAILED_CPU_ABI_INCOMPATIBLE, INSTALL_FAILED_INSUFFICIENT_STORAGE, INSTALL_FAILED_INVALID_APK, INSTALL_FAILED_VERSION_DOWNGRADE, INSTALL_FAILED_PARSE_NO_CERTIFICATES, INSTALL_FAILED_UNKNOWN, LINK_FAILED_UNMOUNT, LINK_FAILED_MOUNT, PATCH_FAILED_COPY, PATCH_FAILED_CHMOD, PATCH_FAILED_CHOWN, PATCH_FAILED_CHCON, PATCH_FAILED_DESTROY, SESSION_FAILED_CREATE, SESSION_FAILED_WRITE, SESSION_FAILED_COPY, SESSION_INVALID_ID, SCRIPT_FAILED_SETUP_POST_FS, SCRIPT_FAILED_SETUP_SERVICE_D, SCRIPT_FAILED_DESTROY_POST_FS, SCRIPT_FAILED_DESTROY_SERVICE_D, UNINSTALL_SUCCESSFUL, UNINSTALL_FAILED, } sealed class PMRootResult { data class Success(val value: V? = null) : PMRootResult() data class Error(val error: PMRootStatus, val message: String) : PMRootResult() val isError get() = this is Error val isSuccess get() = this is Success } inline fun PMRootResult.getOrElse(onError: (PMRootResult.Error) -> R): R? { return when (this) { is PMRootResult.Error -> onError(this) is PMRootResult.Success -> return this.value } } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/util/Patcher.kt ================================================ package com.vanced.manager.installer.util import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFileOutputStream import com.vanced.manager.io.ManagerSuFile import com.vanced.manager.io.SUIOException import com.vanced.manager.repository.manager.PackageManagerResult import com.vanced.manager.repository.manager.PackageManagerError import com.vanced.manager.util.errString import java.io.File import java.io.IOException object Patcher { fun setupScript( app: String, stockPackage: String, stockPath: String, ): PackageManagerResult { val postFsDataScriptPath = getAppPostFsScriptPath(app) val serviceDScriptPath = getAppServiceDScriptPath(app) val postFsDataScript = getPostFsDataScript(stockPackage) val serviceDScript = getServiceDScript(getAppPatchPath(app), stockPath) val copyServiceDScript = copyScriptToDestination(postFsDataScript, postFsDataScriptPath) if (copyServiceDScript.isFailure) return PackageManagerResult.Error( PackageManagerError.SCRIPT_FAILED_SETUP_POST_FS, copyServiceDScript.exceptionOrNull()!!.stackTraceToString() ) val copyPostFsDataScript = copyScriptToDestination(serviceDScript, serviceDScriptPath) if (copyPostFsDataScript.isFailure) return PackageManagerResult.Error( PackageManagerError.SCRIPT_FAILED_SETUP_SERVICE_D, copyPostFsDataScript.exceptionOrNull()!!.stackTraceToString() ) return PackageManagerResult.Success(null) } fun movePatchToDataAdb(patchPath: String, app: String): PackageManagerResult { val newPatchPath = getAppPatchPath(app) val patchApk = File(patchPath) val newPatchApk = SuFile(newPatchPath).apply { if (exists()) delete() createNewFile() } try { patchApk.copyTo(newPatchApk) } catch (e: IOException) { return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_COPY, e.stackTraceToString()) } val chmod = Shell.su("chmod", "644", newPatchPath).exec() if (!chmod.isSuccess) return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHMOD, chmod.errString) val chown = Shell.su("chown", "system:system", newPatchPath).exec() if (!chmod.isSuccess) return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHOWN, chown.errString) return PackageManagerResult.Success(null) } fun chconPatch(app: String): PackageManagerResult { val chcon = Shell.su("chcon u:object_r:apk_data_file:s0 ${getAppPatchPath(app)}").exec() if (!chcon.isSuccess) return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHCON, chcon.errString) return PackageManagerResult.Success(null) } fun linkPatch(app: String, stockPackage: String, stockPath: String): PackageManagerResult { val umount = Shell.su("""for i in ${'$'}(ls /data/app/ | grep $stockPackage | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """) .exec() if (!umount.isSuccess) return PackageManagerResult.Error(PackageManagerError.LINK_FAILED_UNMOUNT, umount.errString) val mount = Shell.su("su", "-mm", "-c", """"mount -o bind ${getAppPatchPath(app)} $stockPath"""") .exec() if (!mount.isSuccess) return PackageManagerResult.Error(PackageManagerError.LINK_FAILED_MOUNT, mount.errString) return PackageManagerResult.Success(null) } fun destroyPatch(app: String) = cleanPatchFiles( postFsPath = getAppPostFsScriptPath(app), serviceDPath = getAppServiceDScriptPath(app), patchPath = getAppPatchPath(app) ) //TODO fun destroyOldPatch(app: String) = cleanPatchFiles( postFsPath = "", serviceDPath = "", patchPath = "" ) } private fun getAppPatchPath(app: String) = "${getAppPatchFolderPath(app)}/base.apk" private fun getAppPatchFolderPath(app: String) = "/data/adb/vanced_manager/$app" private fun getAppPostFsScriptPath(app: String) = "/data/adb/post-fs-data.d/$app.sh" private fun getAppServiceDScriptPath(app: String) = "/data/adb/service.d/$app.sh" //TODO support dynamic sleep timer private fun getServiceDScript(patchPath: String, stockPath: String) = """ #!/system/bin/sh while [ "${'$'}(getprop sys.boot_completed | tr -d '\r')" != "1" ]; do sleep 1; done sleep 1 chcon u:object_r:apk_data_file:s0 $patchPath mount -o bind $patchPath $stockPath """.trimIndent() private fun getPostFsDataScript(stockPackage: String) = """ #!/system/bin/sh while read line; do echo \${'$'}{line} | grep $stockPackage | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts """.trimIndent() private fun cleanPatchFiles( postFsPath: String, serviceDPath: String, patchPath: String, ): PackageManagerResult { val files = mapOf( postFsPath to PackageManagerError.SCRIPT_FAILED_DESTROY_POST_FS, serviceDPath to PackageManagerError.SCRIPT_FAILED_DESTROY_SERVICE_D, patchPath to PackageManagerError.PATCH_FAILED_DESTROY, ) for ((filePath, errorStatusType) in files) { try { with(ManagerSuFile(filePath)) { if (exists()) delete() } } catch (e: SUIOException) { return PackageManagerResult.Error(errorStatusType, e.stackTraceToString()) } } return PackageManagerResult.Success(null) } private fun copyScriptToDestination( script: String, destination: String, ): Result { val scriptFile = SuFile(destination) .apply { if (!exists()) createNewFile() } try { SuFileOutputStream.open(scriptFile).use { it.write(script.toByteArray()) it.flush() } val chmod = Shell.su("chmod", "744", scriptFile.absolutePath).exec() if (!chmod.isSuccess) { return Result.failure(Exception(chmod.errString)) } } catch (e: IOException) { return Result.failure(e) } return Result.success(null) } ================================================ FILE: app/src/main/java/com/vanced/manager/installer/util/RootPatchHelper.kt ================================================ package com.vanced.manager.installer.util import com.vanced.manager.repository.manager.PackageManagerResult import com.vanced.manager.repository.manager.getOrElse object RootPatchHelper { fun cleanPatches(app: String): PackageManagerResult { val cleanOldPatches = Patcher.destroyOldPatch(app) if (cleanOldPatches.isError) return cleanOldPatches val cleanPatches = Patcher.destroyPatch(app) if (cleanOldPatches.isError) return cleanPatches return PackageManagerResult.Success(null) } inline fun prepareStock( stockPackage: String, stockVersion: String, install: () -> PackageManagerResult ): PackageManagerResult { val stockYoutubeVersion = PMRoot.getPackageVersionName(stockPackage) .getOrElse { null } if (stockYoutubeVersion != stockVersion) { val uninstallStock = PMRoot.uninstallApp(stockPackage) if (uninstallStock.isError) return uninstallStock val installStock = install() if (installStock.isError) return installStock } return PackageManagerResult.Success(null) } fun patchStock( patchPath: String, stockPackage: String, app: String ): PackageManagerResult { val movePatch = Patcher.movePatchToDataAdb(patchPath, app) if (movePatch.isError) return movePatch val chconPatch = Patcher.chconPatch(app) if (chconPatch.isError) return chconPatch val stockPackageDir = PMRoot.getPackageDir(stockPackage) .getOrElse { error -> return error }!! val setupScript = Patcher.setupScript(app, stockPackage, stockPackageDir) if (setupScript is PackageManagerResult.Error) return setupScript val linkPatch = Patcher.linkPatch(app, stockPackage, stockPackageDir) if (linkPatch is PackageManagerResult.Error) return linkPatch return PackageManagerResult.Success(null) } } ================================================ FILE: app/src/main/java/com/vanced/manager/io/ManagerSuFile.kt ================================================ package com.vanced.manager.io import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile import com.vanced.manager.util.errString import com.vanced.manager.util.outString import java.io.File class ManagerSuFile : SuFile { sealed class SuFileResult { data class Success(val output: String) : SuFileResult() data class Error(val error: String) : SuFileResult() } constructor(pathName: String) : super(pathName) constructor(parent: String, child: String) : super(parent, child) constructor(parent: File, child: String) : super(parent, child) private fun cmd(input: String): SuFileResult { val cmd = Shell.su(input.replace("@@", escapedPath)).exec() if (!cmd.isSuccess) return SuFileResult.Error(cmd.errString) return SuFileResult.Success(cmd.outString) } override fun delete(): Boolean { val result = cmd("rm -f @@ || rmdir -f @@") if (result is SuFileResult.Error) throw SUIOException(result.error) return true } } ================================================ FILE: app/src/main/java/com/vanced/manager/io/SUIOException.kt ================================================ package com.vanced.manager.io import java.io.IOException class SUIOException : IOException { constructor(message: String) : super(message) constructor(message: String, cause: Throwable) : super(message, cause) constructor(cause: Throwable) : super(cause) } ================================================ FILE: app/src/main/java/com/vanced/manager/network/GithubService.kt ================================================ package com.vanced.manager.network import com.vanced.manager.network.dto.GithubReleaseDto import retrofit2.http.GET private const val REPOS_VANCED = "repos/YTVanced" interface GithubService { @GET("$REPOS_VANCED/Vanced/releases/latest") suspend fun getVancedYoutubeRelease(): GithubReleaseDto @GET("$REPOS_VANCED/VancedMusic/releases/latest") suspend fun getVancedYoutubeMusicRelease(): GithubReleaseDto @GET("$REPOS_VANCED/VancedMicrog/releases/latest") suspend fun getVancedMicrogRelease(): GithubReleaseDto @GET("$REPOS_VANCED/VancedManager/releases/latest") suspend fun getVancedManagerRelease(): GithubReleaseDto } ================================================ FILE: app/src/main/java/com/vanced/manager/network/dto/GithubDto.kt ================================================ package com.vanced.manager.network.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class GithubReleaseDto( @SerialName("tag_name") val tagName: String, @SerialName("body") val body: String, @SerialName("assets") val assets: List ) @Serializable data class GithubReleaseAssetDto( @SerialName("name") val name: String, @SerialName("browser_download_url") val browserDownloadUrl: String ) ================================================ FILE: app/src/main/java/com/vanced/manager/network/util/Constants.kt ================================================ package com.vanced.manager.network.util const val BASE = "https://api.vancedapp.com/api/v1/" const val GITHUB_API_BASE = "https://api.github.com/" const val VANCED_NAME = "YouTube Vanced" const val MUSIC_NAME = "YouTube Vanced Music" const val MICROG_NAME = "Vanced microG" const val URL_SPONSOR_BRAVE = "https://vancedapp.com/brave" const val URL_SPONSOR_ADGUARD = "https://adguard.com/?aid=31141&source=manager" const val URL_MEDIA_INSTAGRAM = "https://instagram.com/vanced.youtube" const val URL_MEDIA_YOUTUBE = "https://youtube.com/c/YouTubeVanced" const val URL_MEDIA_GITHUB = "https://github.com/YTVanced/VancedManager" const val URL_MEDIA_WEBSITE = "https://vancedapp.com" const val URL_MEDIA_TELEGRAM = "https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w" const val URL_MEDIA_TWITTER = "https://twitter.com/YTVanced" const val URL_MEDIA_DISCORD = "https://discord.gg/WCGNdRruzb" const val URL_MEDIA_REDDIT = "https://www.reddit.com/r/Vanced/" ================================================ FILE: app/src/main/java/com/vanced/manager/preferences/ManagerPreference.kt ================================================ package com.vanced.manager.preferences import android.content.SharedPreferences import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.core.content.edit import org.koin.core.component.KoinComponent import org.koin.core.component.inject import kotlin.reflect.KProperty fun managerStringPreference( key: String, defaultValue: String = "" ) = ManagerPreference( key = key, defaultValue = defaultValue, getter = SharedPreferences::getString, setter = SharedPreferences.Editor::putString ) fun managerStringSetPreference( key: String, defaultValue: Set = setOf() ) = ManagerPreference( key = key, defaultValue = defaultValue, getter = SharedPreferences::getStringSet, setter = SharedPreferences.Editor::putStringSet ) fun managerBooleanPreference( key: String, defaultValue: Boolean = false ) = ManagerPreference( key = key, defaultValue = defaultValue, getter = SharedPreferences::getBoolean, setter = SharedPreferences.Editor::putBoolean ) fun managerIntPreference( key: String, defaultValue: Int = 0 ) = ManagerPreference( key = key, defaultValue = defaultValue, getter = SharedPreferences::getInt, setter = SharedPreferences.Editor::putInt ) fun managerLongPreference( key: String, defaultValue: Long = 0 ) = ManagerPreference( key = key, defaultValue = defaultValue, getter = SharedPreferences::getLong, setter = SharedPreferences.Editor::putLong ) class ManagerPreference( private val key: String, private val defaultValue: T, private val getter: SharedPreferences.(key: String, defaultValue: T) -> T?, private val setter: SharedPreferences.Editor.(key: String, newValue: T) -> Unit ) : KoinComponent { private val sharedPreferences: SharedPreferences by inject() var value by mutableStateOf(sharedPreferences.getter(key, defaultValue) ?: defaultValue) private set operator fun getValue( thisRef: Any?, property: KProperty<*> ) = value operator fun setValue( thisRef: Any?, property: KProperty<*>, newValue: T ) { value = newValue sharedPreferences.edit { setter(key, newValue) } } } ================================================ FILE: app/src/main/java/com/vanced/manager/preferences/holder/PreferenceDefaultValueHolder.kt ================================================ package com.vanced.manager.preferences.holder const val MANAGER_VARIANT_DEFAULT_VALUE = "nonroot" const val MANAGER_THEME_DEFAULT_VALUE = "System Default" const val VANCED_THEME_DEFAULT_VALUE = "dark" val VANCED_LANGUAGE_DEFAULT_VALUE = setOf("en") const val APP_VERSION_DEFAULT_VALUE = "latest" const val APP_ENABLED_DEFAULT_VALUE = true ================================================ FILE: app/src/main/java/com/vanced/manager/preferences/holder/PreferenceHolder.kt ================================================ package com.vanced.manager.preferences.holder import com.vanced.manager.preferences.managerStringPreference import com.vanced.manager.preferences.managerStringSetPreference var managerVariantPref by managerStringPreference( MANAGER_VARIANT_KEY, MANAGER_VARIANT_DEFAULT_VALUE ) var vancedThemePref by managerStringPreference(APP_VANCED_THEME_KEY, VANCED_THEME_DEFAULT_VALUE) var vancedVersionPref by managerStringPreference(APP_VANCED_VERSION_KEY, APP_VERSION_DEFAULT_VALUE) var vancedLanguagesPref by managerStringSetPreference( APP_VANCED_LANGUAGE_KEY, VANCED_LANGUAGE_DEFAULT_VALUE ) var musicVersionPref by managerStringPreference(APP_MUSIC_VERSION_KEY, APP_VERSION_DEFAULT_VALUE) ================================================ FILE: app/src/main/java/com/vanced/manager/preferences/holder/PreferenceKeyHolder.kt ================================================ package com.vanced.manager.preferences.holder const val USE_CUSTOM_TABS_KEY = "use_custom_tabs" const val MANAGER_VARIANT_KEY = "manager_variant" const val MANAGER_THEME_KEY = "manager_theme" const val MANAGER_ACCENT_COLOR_KEY = "manager_accent_color" const val APP_VANCED_THEME_KEY = "app_vanced_theme" const val APP_VANCED_VERSION_KEY = "app_vanced_version" const val APP_VANCED_LANGUAGE_KEY = "app_vanced_language" const val APP_MUSIC_VERSION_KEY = "app_music_version" const val VANCED_ENABLED_KEY = "manager_vanced_enabled" const val MUSIC_ENABLED_KEY = "manager_music_enabled" ================================================ FILE: app/src/main/java/com/vanced/manager/repository/AppRepository.kt ================================================ package com.vanced.manager.repository import com.vanced.manager.domain.model.App import com.vanced.manager.domain.model.AppData import com.vanced.manager.domain.model.AppState import com.vanced.manager.domain.model.AppType import com.vanced.manager.network.GithubService import com.vanced.manager.network.dto.GithubReleaseDto import com.vanced.manager.repository.manager.NonrootPackageManager import com.vanced.manager.repository.manager.PackageManager import com.vanced.manager.repository.manager.RootPackageManager interface AppRepository { suspend fun getVancedYoutubeNonroot(): App suspend fun getVancedYoutubeRoot(): App suspend fun getVancedYoutubeMusicNonroot(): App suspend fun getVancedYoutubeMusicRoot(): App suspend fun getVancedMicrog(): App suspend fun getVancedManager(): App } class AppRepositoryImpl( private val githubService: GithubService, private val nonrootPackageManager: NonrootPackageManager, private val rootPackageManager: RootPackageManager, ) : AppRepository { override suspend fun getVancedYoutubeNonroot(): App { val githubRelease = githubService.getVancedYoutubeRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_YOUTUBE).getValueOrNull() val installedVersionName = nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_YOUTUBE).getValueOrNull() return App( name = AppData.NAME_VANCED_YOUTUBE, iconResId = AppData.ICON_VANCED_YOUTUBE, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_YOUTUBE, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_YOUTUBE, ) } override suspend fun getVancedYoutubeRoot(): App { val githubRelease = githubService.getVancedYoutubeRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = rootPackageManager.getVersionCode(AppData.PACKAGE_ROOT_VANCED_YOUTUBE).getValueOrNull() val installedVersionName = rootPackageManager.getVersionName(AppData.PACKAGE_ROOT_VANCED_YOUTUBE).getValueOrNull() return App( name = AppData.NAME_VANCED_YOUTUBE, iconResId = AppData.ICON_VANCED_YOUTUBE, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_YOUTUBE, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_YOUTUBE, ) } override suspend fun getVancedYoutubeMusicNonroot(): App { val githubRelease = githubService.getVancedYoutubeMusicRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_YOUTUBE_MUSIC).getValueOrNull() val installedVersionName = nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_YOUTUBE_MUSIC).getValueOrNull() return App( name = AppData.NAME_VANCED_YOUTUBE_MUSIC, iconResId = AppData.ICON_VANCED_YOUTUBE_MUSIC, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_YOUTUBE_MUSIC, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_YOUTUBE_MUSIC, ) } override suspend fun getVancedYoutubeMusicRoot(): App { val githubRelease = githubService.getVancedYoutubeMusicRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = rootPackageManager.getVersionCode(AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC).getValueOrNull() val installedVersionName = rootPackageManager.getVersionName(AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC).getValueOrNull() return App( name = AppData.NAME_VANCED_YOUTUBE_MUSIC, iconResId = AppData.ICON_VANCED_YOUTUBE_MUSIC, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_YOUTUBE_MUSIC, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_YOUTUBE_MUSIC, ) } override suspend fun getVancedMicrog(): App { val githubRelease = githubService.getVancedMicrogRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_MICROG).getValueOrNull() val installedVersionName = nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_MICROG).getValueOrNull() return App( name = AppData.NAME_VANCED_MICROG, iconResId = AppData.ICON_VANCED_MICROG, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_MICROG, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_MICROG, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_MICROG, ) } override suspend fun getVancedManager(): App { val githubRelease = githubService.getVancedManagerRelease() val remoteVersionCode = githubRelease.getVersionCode() val remoteVersionName = githubRelease.getVersionName() val installedVersionCode = nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_MANAGER).getValueOrNull() val installedVersionName = nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_MANAGER).getValueOrNull() return App( name = AppData.NAME_VANCED_MANAGER, iconResId = AppData.ICON_VANCED_MANAGER, changelog = githubRelease.body, remoteVersionCode = remoteVersionCode, remoteVersionName = remoteVersionName, installedVersionCode = installedVersionCode, installedVersionName = installedVersionName, packageName = AppData.PACKAGE_VANCED_MANAGER, launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_MANAGER, state = getNoonrotAppState(installedVersionCode, remoteVersionCode), app = AppType.VANCED_MANAGER, ) } private fun getNoonrotAppState( installedVersionCode: Int?, remoteVersionCode: Int ): AppState { return when { installedVersionCode == null -> AppState.NOT_INSTALLED installedVersionCode < remoteVersionCode -> AppState.NEEDS_UPDATE installedVersionCode >= remoteVersionCode -> AppState.INSTALLED else -> AppState.NOT_INSTALLED } } private fun GithubReleaseDto.getVersionCode() = tagName.substringAfter("-").toInt() private fun GithubReleaseDto.getVersionName() = tagName.substringBefore("-") } ================================================ FILE: app/src/main/java/com/vanced/manager/repository/PreferenceRepository.kt ================================================ package com.vanced.manager.repository import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import com.vanced.manager.repository.source.PreferenceData import com.vanced.manager.repository.source.PreferenceDatasource interface PreferenceRepository { var managerUseCustomTabs: Boolean var managerMode: ManagerMode var managerTheme: ManagerTheme } class PreferenceRepositoryImpl( private val preferenceDatasource: PreferenceDatasource ) : PreferenceRepository { override var managerUseCustomTabs: Boolean get() = preferenceDatasource.managerUseCustomTabs set(value) { preferenceDatasource.managerUseCustomTabs = value } override var managerMode: ManagerMode get() = ManagerMode.fromValue(preferenceDatasource.managerMode) set(value) { preferenceDatasource.managerMode = value.value } override var managerTheme: ManagerTheme get() = ManagerTheme.fromValue(preferenceDatasource.managerTheme) set(value) { preferenceDatasource.managerTheme = value.value } } enum class ManagerTheme(val value: String) { LIGHT(PreferenceData.MANAGER_THEME_VALUE_LIGHT), DARK(PreferenceData.MANAGER_THEME_VALUE_DARK), SYSTEM_DEFAULT(PreferenceData.MANAGER_THEME_VALUE_SYSTEM_DEFAULT); @Composable fun isDark() = when (this) { LIGHT -> false DARK -> true SYSTEM_DEFAULT -> isSystemInDarkTheme() } companion object { fun fromValue(value: String?): ManagerTheme { return values().find { it.value == value } ?: SYSTEM_DEFAULT } } } enum class ManagerMode(val value: String) { ROOT(PreferenceData.MANAGER_MODE_VALUE_ROOT), NONROOT(PreferenceData.MANAGER_MODE_VALUE_NONROOT); val isRoot get() = this == ROOT val isNonroot get() = this == NONROOT companion object { fun fromValue(value: String?): ManagerMode { return when (value) { "root" -> ROOT else -> NONROOT } } } } ================================================ FILE: app/src/main/java/com/vanced/manager/repository/manager/PackageManager.kt ================================================ package com.vanced.manager.repository.manager import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller import android.os.Build import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile import com.topjohnwu.superuser.io.SuFileInputStream import com.topjohnwu.superuser.io.SuFileOutputStream import com.vanced.manager.installer.service.AppInstallService import com.vanced.manager.installer.service.AppUninstallService import com.vanced.manager.util.* import java.io.File import java.io.FileNotFoundException import java.io.IOException import kotlin.jvm.Throws interface PackageManager { suspend fun getVersionCode(packageName: String): PackageManagerResult suspend fun getVersionName(packageName: String): PackageManagerResult suspend fun getInstallationDir(packageName: String): PackageManagerResult suspend fun setInstaller(targetPackage: String, installerPackage: String): PackageManagerResult suspend fun forceStop(packageName: String): PackageManagerResult suspend fun installApp(apk: File): PackageManagerResult suspend fun installSplitApp(apks: Array): PackageManagerResult suspend fun uninstallApp(packageName: String): PackageManagerResult } class NonrootPackageManager( private val context: Context ) : PackageManager { @SuppressLint("WrongConstant") @Suppress("DEPRECATION") override suspend fun getVersionCode(packageName: String): PackageManagerResult { return try { val packageInfo = context.packageManager.getPackageInfo(packageName, FLAG_NOTHING) val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { packageInfo.longVersionCode.and(VERSION_IGNORE_MAJOR).toInt() } else { packageInfo.versionCode } PackageManagerResult.Success(versionCode) } catch (e: android.content.pm.PackageManager.NameNotFoundException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, message = e.stackTraceToString() ) } } @SuppressLint("WrongConstant") override suspend fun getVersionName(packageName: String): PackageManagerResult { return try { val versionName = context.packageManager .getPackageInfo(packageName, FLAG_NOTHING) .versionName PackageManagerResult.Success(versionName) } catch (e: android.content.pm.PackageManager.NameNotFoundException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, message = e.stackTraceToString() ) } } @SuppressLint("WrongConstant") override suspend fun getInstallationDir(packageName: String): PackageManagerResult { return try { val installationDir = context.packageManager .getPackageInfo(packageName, FLAG_NOTHING) .applicationInfo .sourceDir PackageManagerResult.Success(installationDir) } catch (e: android.content.pm.PackageManager.NameNotFoundException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_DIR, message = e.stackTraceToString() ) } } override suspend fun setInstaller( targetPackage: String, installerPackage: String ): PackageManagerResult { return PackageManagerResult.Error( error = PackageManagerError.SET_FAILED_INSTALLER, message = "Unsupported" ) } override suspend fun forceStop(packageName: String): PackageManagerResult { return PackageManagerResult.Error( error = PackageManagerError.APP_FAILED_FORCE_STOP, message = "Unsupported" ) } override suspend fun installApp(apk: File): PackageManagerResult { return createInstallationSession { writeApkToSession(apk) } } override suspend fun installSplitApp(apks: Array): PackageManagerResult { return createInstallationSession { for (apk in apks) { writeApkToSession(apk) } } } override suspend fun uninstallApp(packageName: String): PackageManagerResult { val packageInstaller = context.packageManager.packageInstaller val pendingIntent = PendingIntent.getService( context, 0, Intent(context, AppUninstallService::class.java), intentFlags ).intentSender packageInstaller.uninstall(packageName, pendingIntent) return PackageManagerResult.Success(null) } private inline fun createInstallationSession( block: PackageInstaller.Session.() -> Unit ): PackageManagerResult { val packageInstaller = context.packageManager.packageInstaller val sessionParams = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL ).apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { setInstallReason(android.content.pm.PackageManager.INSTALL_REASON_USER) } } val pendingIntent = PendingIntent.getService( context, 0, Intent(context, AppInstallService::class.java), intentFlags ).intentSender val sessionId = tripleUnionTryCatch( onCatch = { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_CREATE, message = it.stackTraceToString() ) } ) { packageInstaller.createSession(sessionParams) } val session = doubleUnionTryCatch( onCatch = { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_CREATE, message = it.stackTraceToString() ) } ) { packageInstaller.openSession(sessionId) } try { session.use { it.block() it.commit(pendingIntent) } } catch (e: IOException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_WRITE, message = e.stackTraceToString() ) } catch (e: SecurityException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_COMMIT, message = e.stackTraceToString() ) } return PackageManagerResult.Success(null) } private fun PackageInstaller.Session.writeApkToSession(apk: File) { apk.inputStream().use { inputStream -> openWrite(apk.name, 0, apk.length()).use { outputStream -> inputStream.copyTo(outputStream, byteArraySize) fsync(outputStream) } } } private val intentFlags: Int get() { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0 } private companion object { const val byteArraySize = 1024 * 1024 const val FLAG_NOTHING = 0 const val VERSION_IGNORE_MAJOR = 0xFFFFFFFF } } class RootPackageManager : PackageManager { override suspend fun getVersionCode(packageName: String): PackageManagerResult { return try { val keyword = "versionCode=" val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() val versionCode = dumpsys.removePrefix(keyword).substringAfter("minSdk").toInt() PackageManagerResult.Success(versionCode) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, message = e.stderrOut ) } catch (e: java.lang.NumberFormatException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, message = e.stackTraceToString() ) } } override suspend fun getVersionName(packageName: String): PackageManagerResult { return try { val keyword = "versionName=" val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() val versionName = dumpsys.removePrefix(keyword) PackageManagerResult.Success(versionName) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, message = e.stderrOut ) } } override suspend fun getInstallationDir(packageName: String): PackageManagerResult { return try { val keyword = "path: " val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() val installationDir = dumpsys.removePrefix(keyword) PackageManagerResult.Success(installationDir) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.GET_FAILED_PACKAGE_DIR, message = e.stderrOut ) } } override suspend fun setInstaller( targetPackage: String, installerPackage: String ): PackageManagerResult { return try { Shell.su("pm", "set-installer", targetPackage, installerPackage).awaitOutputOrThrow() PackageManagerResult.Success(null) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.SET_FAILED_INSTALLER, message = e.stderrOut ) } } override suspend fun forceStop(packageName: String): PackageManagerResult { return try { Shell.su("am", "force-stop", packageName).awaitOutputOrThrow() PackageManagerResult.Success(null) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.APP_FAILED_FORCE_STOP, message = e.stderrOut ) } } override suspend fun installApp(apk: File): PackageManagerResult { var tempApk: File? = null return try { tempApk = copyApkToTemp(apk) Shell.su("pm", "install", "-r", tempApk.absolutePath).awaitOutputOrThrow() PackageManagerResult.Success(null) } catch (e: IOException) { PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_COPY, message = e.stackTraceToString() ) } catch (e: SuException) { PackageManagerResult.Error( error = getEnumForInstallFailed(e.stderrOut), message = e.stderrOut ) } finally { tempApk?.delete() } } override suspend fun installSplitApp(apks: Array): PackageManagerResult { val sessionId = try { val installCreate = Shell.su("pm", "install-create", "-r").awaitOutputOrThrow() installCreate.toInt() } catch (e: SuException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_CREATE, message = e.stderrOut ) } catch (e: NumberFormatException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_INVALID_ID, message = e.stackTraceToString() ) } for (apk in apks) { var tempApk: File? = null try { tempApk = copyApkToTemp(apk) Shell.su("pm", "install-write", sessionId.toString(), tempApk.name, tempApk.absolutePath).awaitOutputOrThrow() } catch (e: SuException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_WRITE, message = e.stderrOut ) } catch (e: IOException) { return PackageManagerResult.Error( error = PackageManagerError.SESSION_FAILED_COPY, message = e.stackTraceToString() ) } finally { tempApk?.delete() } } return try { Shell.su("pm", "install-commit", sessionId.toString()).awaitOutputOrThrow() PackageManagerResult.Success(null) } catch (e: SuException) { PackageManagerResult.Error( error = getEnumForInstallFailed(e.stderrOut), message = e.stderrOut ) } } override suspend fun uninstallApp(packageName: String): PackageManagerResult { return try { Shell.su("pm", "uninstall", packageName).awaitOutputOrThrow() PackageManagerResult.Success(null) } catch (e: SuException) { PackageManagerResult.Error( error = PackageManagerError.UNINSTALL_FAILED, message = e.stderrOut ) } } @Throws( IOException::class, FileNotFoundException::class ) private fun copyApkToTemp(apk: File): SuFile { val tmpPath = "/data/local/tmp/${apk.name}" val tmpApk = SuFile(tmpPath).apply { createNewFile() } SuFileInputStream.open(tmpApk).use { inputStream -> SuFileOutputStream.open(tmpApk).use { outputStream -> inputStream.copyTo(outputStream) outputStream.flush() } } return tmpApk } } enum class PackageManagerError { SET_FAILED_INSTALLER, GET_FAILED_PACKAGE_DIR, GET_FAILED_PACKAGE_VERSION_NAME, GET_FAILED_PACKAGE_VERSION_CODE, APP_FAILED_FORCE_STOP, SESSION_FAILED_CREATE, SESSION_FAILED_COMMIT, SESSION_FAILED_WRITE, SESSION_FAILED_COPY, SESSION_FAILED_OPEN, SESSION_INVALID_ID, INSTALL_FAILED_ABORTED, INSTALL_FAILED_ALREADY_EXISTS, INSTALL_FAILED_CPU_ABI_INCOMPATIBLE, INSTALL_FAILED_INSUFFICIENT_STORAGE, INSTALL_FAILED_INVALID_APK, INSTALL_FAILED_VERSION_DOWNGRADE, INSTALL_FAILED_PARSE_NO_CERTIFICATES, INSTALL_FAILED_UNKNOWN, UNINSTALL_FAILED, LINK_FAILED_UNMOUNT, LINK_FAILED_MOUNT, PATCH_FAILED_COPY, PATCH_FAILED_CHMOD, PATCH_FAILED_CHOWN, PATCH_FAILED_CHCON, PATCH_FAILED_DESTROY, SCRIPT_FAILED_SETUP_POST_FS, SCRIPT_FAILED_SETUP_SERVICE_D, SCRIPT_FAILED_DESTROY_POST_FS, SCRIPT_FAILED_DESTROY_SERVICE_D, } fun getEnumForInstallFailed(outString: String): PackageManagerError { return when { outString.contains("INSTALL_FAILED_ABORTED") -> PackageManagerError.INSTALL_FAILED_ABORTED outString.contains("INSTALL_FAILED_ALREADY_EXISTS") -> PackageManagerError.INSTALL_FAILED_ALREADY_EXISTS outString.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE") -> PackageManagerError.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE outString.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE") -> PackageManagerError.INSTALL_FAILED_INSUFFICIENT_STORAGE outString.contains("INSTALL_FAILED_INVALID_APK") -> PackageManagerError.INSTALL_FAILED_INVALID_APK outString.contains("INSTALL_FAILED_VERSION_DOWNGRADE") -> PackageManagerError.INSTALL_FAILED_VERSION_DOWNGRADE outString.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES") -> PackageManagerError.INSTALL_FAILED_PARSE_NO_CERTIFICATES else -> PackageManagerError.INSTALL_FAILED_UNKNOWN } } sealed class PackageManagerResult { data class Success(val value: V?) : PackageManagerResult() data class Error(val error: PackageManagerError, val message: String) : PackageManagerResult() fun getValueOrNull(): V? = getOrElse { null } val isError get() = this is Error val isSuccess get() = this is Success } inline fun PackageManagerResult.getOrElse( onError: (PackageManagerResult.Error) -> R? ): R? { return when (this) { is PackageManagerResult.Success -> this.value is PackageManagerResult.Error -> onError(this) } } ================================================ FILE: app/src/main/java/com/vanced/manager/repository/source/PreferenceDatasource.kt ================================================ package com.vanced.manager.repository.source import android.content.SharedPreferences interface PreferenceDatasource { var managerUseCustomTabs: Boolean var managerMode: String var managerTheme: String } class PreferenceDatasourceImpl( private val sharedPreferences: SharedPreferences ) : PreferenceDatasource { override var managerUseCustomTabs: Boolean get() = getBoolean( PreferenceData.MANAGER_USE_CUSTOM_TABS_KEY, PreferenceData.MANAGER_USE_CUSTOM_TABS_DEFAULT_VALUE ) set(value) { putBoolean(PreferenceData.MANAGER_USE_CUSTOM_TABS_KEY, value) } override var managerMode: String get() = getString( PreferenceData.MANAGER_MODE_KEY, PreferenceData.MANAGER_MODE_DEFAULT_VALUE ) set(value) { putString(PreferenceData.MANAGER_MODE_KEY, value) } override var managerTheme: String get() = getString( PreferenceData.MANAGER_THEME_KEY, PreferenceData.MANAGER_THEME_DEFAULT_VALUE ) set(value) { putString(PreferenceData.MANAGER_THEME_KEY, value) } private fun getString(key: String, defaultValue: String): String { return sharedPreferences.getString(key, defaultValue) ?: defaultValue } private fun getBoolean(key: String, defaultValue: Boolean): Boolean { return sharedPreferences.getBoolean(key, defaultValue) } private fun putString(key: String, value: String) { sharedPreferences.edit().putString(key, value).apply() } private fun putBoolean(key: String, value: Boolean) { sharedPreferences.edit().putBoolean(key, value).apply() } } object PreferenceData { const val MANAGER_USE_CUSTOM_TABS_KEY = "manager_behaviour_use_custom_tabs" const val MANAGER_USE_CUSTOM_TABS_DEFAULT_VALUE = true const val MANAGER_MODE_KEY = "manager_behaviour_mode" const val MANAGER_MODE_VALUE_ROOT = "root" const val MANAGER_MODE_VALUE_NONROOT = "nonroot" const val MANAGER_MODE_DEFAULT_VALUE = MANAGER_MODE_VALUE_NONROOT const val MANAGER_THEME_KEY = "manager_appearance_theme" const val MANAGER_THEME_VALUE_LIGHT = "light" const val MANAGER_THEME_VALUE_DARK = "dark" const val MANAGER_THEME_VALUE_SYSTEM_DEFAULT = "system_default" const val MANAGER_THEME_DEFAULT_VALUE = MANAGER_THEME_VALUE_SYSTEM_DEFAULT } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/MainActivity.kt ================================================ package com.vanced.manager.ui import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import com.github.zsoltk.compose.backpress.BackPressHandler import com.github.zsoltk.compose.backpress.LocalBackPressHandler import com.github.zsoltk.compose.router.Router import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.vanced.manager.installer.service.AppInstallService import com.vanced.manager.installer.service.AppUninstallService import com.vanced.manager.ui.screen.* import com.vanced.manager.ui.theme.ManagerTheme import com.vanced.manager.ui.util.Screen import com.vanced.manager.ui.util.animated import com.vanced.manager.ui.viewmodel.InstallViewModel import com.vanced.manager.ui.viewmodel.MainViewModel import org.koin.androidx.viewmodel.ext.android.viewModel class MainActivity : ComponentActivity() { private val installViewModel: InstallViewModel by viewModel() private val mainViewModel: MainViewModel by viewModel() private val backPressHandler = BackPressHandler() private val installBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { when (intent?.action) { AppInstallService.APP_INSTALL_ACTION -> { installViewModel.postInstallStatus( pmStatus = intent.getIntExtra(AppInstallService.EXTRA_INSTALL_STATUS, -999), extra = intent.getStringExtra(AppInstallService.EXTRA_INSTALL_STATUS_MESSAGE)!!, ) mainViewModel.fetch() } AppUninstallService.APP_UNINSTALL_ACTION -> { mainViewModel.fetch() } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mainViewModel.fetch() setContent { val isDark = mainViewModel.appTheme.isDark() ManagerTheme(darkMode = isDark) { val surfaceColor = MaterialTheme.colorScheme.surface.animated val systemUiController = rememberSystemUiController() SideEffect { systemUiController.setSystemBarsColor( color = surfaceColor, darkIcons = !isDark ) } CompositionLocalProvider( LocalBackPressHandler provides backPressHandler ) { Router("VancedManager", Screen.Home) { backStack -> when (val screen = backStack.last()) { is Screen.Home -> { HomeScreen( managerState = mainViewModel.appState, onRefresh = { mainViewModel.fetch() }, onToolbarScreenSelected = { backStack.push(it) }, onAppDownloadClick = { app -> /*if (installationOptions != null) { backStack.push( Screen.Configuration( appName, appVersions, installationOptions ) ) } else { backStack.push(Screen.Install(appName, appVersions)) }*/ }, onAppLaunchClick = { app -> mainViewModel.launchApp(app.packageName, app.launchActivity) }, onAppUninstallClick = { app -> mainViewModel.uninstallApp(app.packageName) } ) } is Screen.Settings -> { SettingsScreen( onToolbarBackButtonClick = { backStack.pop() }, onThemeChange = { mainViewModel.appTheme = it } ) } is Screen.About -> { AboutScreen( onToolbarBackButtonClick = { backStack.pop() } ) } is Screen.Logs -> { } is Screen.Configuration -> { ConfigurationScreen( installationOptions = screen.appInstallationOptions, onToolbarBackButtonClick = { backStack.pop() }, onFinishClick = { backStack.push( Screen.Install( screen.appName, screen.appVersions ) ) } ) } is Screen.Install -> { InstallScreen( appName = screen.appName, appVersions = screen.appVersions, viewModel = installViewModel, onFinishClick = { installViewModel.clear() backStack.newRoot(Screen.Home) } ) } } } } } } } override fun onBackPressed() { if (!backPressHandler.handle()) super.onBackPressed() } override fun onStart() { super.onStart() registerReceiver( installBroadcastReceiver, IntentFilter().apply { addAction(AppInstallService.APP_INSTALL_ACTION) addAction(AppUninstallService.APP_UNINSTALL_ACTION) } ) } override fun onStop() { super.onStop() unregisterReceiver(installBroadcastReceiver) } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/SplashScreenActivity.kt ================================================ package com.vanced.manager.ui import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import com.topjohnwu.superuser.BusyBoxInstaller import com.topjohnwu.superuser.Shell import com.vanced.manager.BuildConfig class SplashScreenActivity : ComponentActivity() { init { Shell.enableVerboseLogging = BuildConfig.DEBUG Shell.setDefaultBuilder( Shell.Builder .create() .setInitializers(BusyBoxInstaller::class.java) ) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Shell.getShell { startActivity( Intent(this, MainActivity::class.java) ) finish() } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerButton.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Shape import androidx.compose.ui.unit.dp @Composable fun ManagerButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = ButtonDefaults.buttonElevation(), shape: Shape = RoundedCornerShape(20.0.dp), border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.buttonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit ) { Button( onClick, modifier, enabled, interactionSource, elevation, shape, border, colors, contentPadding, content ) } @Composable fun ManagerElevatedButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = ButtonDefaults.elevatedButtonElevation(), shape: Shape = RoundedCornerShape(20.0.dp), border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.elevatedButtonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit ) { ElevatedButton( onClick, modifier, enabled, interactionSource, elevation, shape, border, colors, contentPadding, content ) } @Composable fun ManagerFilledTonalButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(), shape: Shape = RoundedCornerShape(20.0.dp), border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit ) { FilledTonalButton( onClick, modifier, enabled, interactionSource, elevation, shape, border, colors, contentPadding, content ) } @Composable fun ManagerOutlinedButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = null, shape: Shape = RoundedCornerShape(20.0.dp), border: BorderStroke? = ButtonDefaults.outlinedButtonBorder, colors: ButtonColors = ButtonDefaults.outlinedButtonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit ) { Button( onClick, modifier, enabled, interactionSource, elevation, shape, border, colors, contentPadding, content ) } @Composable fun ManagerTextButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = null, shape: Shape = RoundedCornerShape(20.0.dp), border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.textButtonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit ) { TextButton( onClick, modifier, enabled, interactionSource, elevation, shape, border, colors, contentPadding, content ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerCard.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.ColumnScope import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import com.vanced.manager.ui.theme.MediumShape import com.vanced.manager.ui.util.animated @Composable fun ManagerCard( modifier: Modifier = Modifier, onClick: (() -> Unit)? = null, shape: Shape = MediumShape, containerColor: Color = MaterialTheme.colorScheme.surface, contentColor: Color = contentColorFor(containerColor), elevation: CardElevation = CardDefaults.cardElevation(), content: @Composable ColumnScope.() -> Unit, ) { if (onClick != null) { val interactionSource = remember { MutableInteractionSource() } Card( modifier = modifier .clickable( interactionSource = interactionSource, indication = null, onClick = onClick ), interactionSource = interactionSource, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } else { Card( modifier = modifier, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } } @Composable fun ManagerElevatedCard( modifier: Modifier = Modifier, onClick: (() -> Unit)? = null, shape: Shape = MediumShape, containerColor: Color = MaterialTheme.colorScheme.surface, contentColor: Color = contentColorFor(containerColor), elevation: CardElevation = CardDefaults.elevatedCardElevation(), content: @Composable ColumnScope.() -> Unit, ) { if (onClick != null) { val interactionSource = remember { MutableInteractionSource() } ElevatedCard( modifier = modifier .clickable( interactionSource = interactionSource, indication = null, onClick = onClick ), interactionSource = interactionSource, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } else { ElevatedCard( modifier = modifier, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } } @Composable fun ManagerOutlinedCard( modifier: Modifier = Modifier, onClick: (() -> Unit)? = null, shape: Shape = MediumShape, containerColor: Color = MaterialTheme.colorScheme.surface, contentColor: Color = contentColorFor(containerColor), elevation: CardElevation = CardDefaults.outlinedCardElevation(), content: @Composable ColumnScope.() -> Unit, ) { if (onClick != null) { val interactionSource = remember { MutableInteractionSource() } OutlinedCard( modifier = modifier .clickable( interactionSource = interactionSource, indication = null, onClick = onClick ), interactionSource = interactionSource, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } else { OutlinedCard( modifier = modifier, shape = shape, containerColor = containerColor.animated, contentColor = contentColor.animated, elevation = elevation, content = content ) } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerDialog.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.material3.AlertDialog import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.vanced.manager.ui.theme.LargeShape @Composable fun ManagerDialog( title: String, onDismissRequest: () -> Unit, confirmButton: @Composable () -> Unit, modifier: Modifier = Modifier, dismissButton: @Composable (() -> Unit)? = null, icon: @Composable (() -> Unit)? = null, content: @Composable () -> Unit, ) { AlertDialog( modifier = modifier, title = { ManagerText( text = title, textAlign = TextAlign.Center ) }, text = content, onDismissRequest = onDismissRequest, confirmButton = confirmButton, dismissButton = dismissButton, icon = icon, shape = LargeShape, tonalElevation = 2.dp, ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerDropdownMenu.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.tween import androidx.compose.animation.core.updateTransition import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.width import androidx.compose.material3.CardDefaults import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.OutlinedCard import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.scale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.* import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupPositionProvider import androidx.compose.ui.window.PopupProperties import com.vanced.manager.ui.theme.SmallShape private const val TransitionDuration = 200 @ExperimentalAnimationApi @Composable fun ManagerDropdownMenu( expanded: Boolean, onDismissRequest: () -> Unit, content: @Composable ColumnScope.() -> Unit, ) { val expandedStates = remember { MutableTransitionState(false) } expandedStates.targetState = expanded val transition = updateTransition(expandedStates, "ManagerDropDownMenu") val alphaAndScale by transition.animateFloat( transitionSpec = { tween(durationMillis = TransitionDuration) }, label = "AlphaAndScale" ) { if (it) 1f else 0f } if (expandedStates.currentState || expandedStates.targetState) { val density = LocalDensity.current val popupPositionProvider = ManagerDropdownMenuPopupPositionProvider(density) Popup( popupPositionProvider = popupPositionProvider, onDismissRequest = onDismissRequest, properties = PopupProperties(focusable = true) ) { OutlinedCard( modifier = Modifier .width(IntrinsicSize.Max) .alpha(alphaAndScale) .scale(alphaAndScale), elevation = CardDefaults.elevatedCardElevation() ) { Column(content = content) } } } } @Composable fun ManagerDropdownMenuItem( title: String, onClick: () -> Unit ) { DropdownMenuItem( onClick = onClick, modifier = Modifier.clip(SmallShape), text = { ManagerText(text = title) } ) } //Kanged from Menu.kt private data class ManagerDropdownMenuPopupPositionProvider( val density: Density ) : PopupPositionProvider { override fun calculatePosition( anchorBounds: IntRect, windowSize: IntSize, layoutDirection: LayoutDirection, popupContentSize: IntSize ): IntOffset { val verticalMargin = with(density) { 48.dp.roundToPx() } //Compute horizontal position. val toRight = anchorBounds.left val toLeft = anchorBounds.right - popupContentSize.width val toDisplayRight = windowSize.width - popupContentSize.width val toDisplayLeft = 0 val x = if (layoutDirection == LayoutDirection.Ltr) { sequenceOf(toRight, toLeft, toDisplayRight) } else { sequenceOf(toLeft, toRight, toDisplayLeft) }.firstOrNull { it >= 0 && it + popupContentSize.width <= windowSize.width } ?: toLeft // Compute vertical position. val toBottom = maxOf(anchorBounds.bottom, verticalMargin) val toTop = anchorBounds.top - popupContentSize.height val toCenter = anchorBounds.top - popupContentSize.height / 2 val toDisplayBottom = windowSize.height - popupContentSize.height - verticalMargin val y = sequenceOf(toBottom, toTop, toCenter, toDisplayBottom).firstOrNull { it >= verticalMargin && it + popupContentSize.height <= windowSize.height - verticalMargin } ?: toTop return IntOffset(x, y) } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerLazyDsl.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.gestures.FlingBehavior import androidx.compose.foundation.gestures.ScrollableDefaults import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.* import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.vanced.manager.ui.util.EdgeToEdgeContentPadding @Composable fun ManagerLazyColumn( modifier: Modifier = Modifier, state: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues( start = EdgeToEdgeContentPadding, end = EdgeToEdgeContentPadding, bottom = 8.dp ), reverseLayout: Boolean = false, verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Top else Alignment.Bottom), horizontalAlignment: Alignment.Horizontal = Alignment.Start, flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(), content: LazyListScope.() -> Unit ) { LazyColumn( modifier = modifier, state = state, contentPadding = contentPadding, reverseLayout = reverseLayout, verticalArrangement = verticalArrangement, horizontalAlignment = horizontalAlignment, flingBehavior = flingBehavior, content = content ) } @Composable fun ManagerLazyRow( modifier: Modifier = Modifier, state: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues( start = EdgeToEdgeContentPadding, end = EdgeToEdgeContentPadding, ), reverseLayout: Boolean = false, horizontalArrangement: Arrangement.Horizontal = Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Start else Alignment.End), verticalAlignment: Alignment.Vertical = Alignment.Top, flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(), content: LazyListScope.() -> Unit ) { LazyRow( modifier = modifier, state = state, contentPadding = contentPadding, reverseLayout = reverseLayout, horizontalArrangement = horizontalArrangement, verticalAlignment = verticalAlignment, flingBehavior = flingBehavior, content = content ) } inline fun LazyListScope.managerCategory( crossinline categoryName: @Composable () -> String, content: LazyListScope.() -> Unit ) { item { ManagerText( modifier = Modifier .padding( start = 8.dp, top = 4.dp ), text = categoryName(), textStyle = MaterialTheme.typography.headlineSmall, ) } content() } inline fun LazyListScope.items( items: Map, noinline key: ((key: K, value: V) -> Any)? = null, crossinline itemContent: @Composable LazyItemScope.(key: K, value: V) -> Unit ) = items( count = items.size, key = if (key != null) { index -> key(items.keys.elementAt(index), items.values.elementAt(index)) } else null ) { index -> itemContent(items.keys.elementAt(index), items.values.elementAt(index)) } inline fun LazyListScope.itemsIndexed( items: Map, noinline key: ((index: Int, key: K, value: V) -> Any)? = null, crossinline itemContent: @Composable LazyItemScope.(index: Int, key: K, value: V) -> Unit ) = items( count = items.size, key = if (key != null) { index -> key(index, items.keys.elementAt(index), items.values.elementAt(index)) } else null ) { index -> itemContent(index, items.keys.elementAt(index), items.values.elementAt(index)) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerListItem.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.layout.* import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.DefaultContentPaddingVertical @Composable fun ManagerListItem( modifier: Modifier = Modifier, title: @Composable () -> Unit, description: @Composable (() -> Unit)? = null, icon: @Composable (() -> Unit)? = null, trailing: @Composable (() -> Unit)? = null ) { Row( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(DefaultContentPaddingHorizontal) ) { if (icon != null) { Box( modifier = Modifier.align(Alignment.CenterVertically) ) { icon() } } Column( modifier = Modifier .weight(1f) .padding( vertical = if (description != null) DefaultContentPaddingVertical - 4.dp else DefaultContentPaddingVertical, ) .align(Alignment.CenterVertically) ) { CompositionLocalProvider( LocalTextStyle provides MaterialTheme.typography.titleSmall ) { title() } if (description != null) { CompositionLocalProvider( LocalContentAlpha provides ContentAlpha.medium, LocalTextStyle provides MaterialTheme.typography.bodySmall ) { description() } } } if (trailing != null) { Box( modifier = Modifier.align(Alignment.CenterVertically), contentAlignment = Alignment.Center, ) { trailing() } } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerNavigator.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContentScope import androidx.compose.animation.with import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveableStateHolder import androidx.compose.runtime.snapshots.SnapshotStateList import com.vanced.manager.ui.util.Screen @Composable fun rememberManagerNavigationController( initialScreen: T ) = remember { ManagerNavigationControllerImpl(initialScreen) } interface ManagerNavigationController { val screens: SnapshotStateList fun push(item: T) fun pop(): Boolean } class ManagerNavigationControllerImpl( initialScreen: T ) : ManagerNavigationController { override val screens: SnapshotStateList = mutableStateListOf(initialScreen) override fun push(item: T) { screens.add(item) } override fun pop(): Boolean { if (screens.size > 1) { screens.removeLast() return true } return false } } @Composable fun ManagerNavigator( navigationController: ManagerNavigationController, content: @Composable (targetContent: T) -> Unit ) { val saveableStateHolder = rememberSaveableStateHolder() val screens = remember { navigationController.screens } //TODO Animation is not working for some weird reasons AnimatedContent( transitionSpec = { if (targetState.size > initialState.size) { slideIntoContainer(AnimatedContentScope.SlideDirection.Start) with slideOutOfContainer(AnimatedContentScope.SlideDirection.End) } else { slideIntoContainer(AnimatedContentScope.SlideDirection.End) with slideOutOfContainer(AnimatedContentScope.SlideDirection.Start) } }, targetState = screens ) { targetContents -> val targetContent = targetContents.last() saveableStateHolder.SaveableStateProvider(key = targetContent.route) { content(targetContent) } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerPreference.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Checkbox import androidx.compose.material.Switch import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import com.vanced.manager.R import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.theme.LargeShape import com.vanced.manager.ui.theme.SmallShape import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal @JvmInline value class EntryText(val text: String) @JvmInline value class EntryValue(val value: String) @Composable fun ManagerPreference( preferenceTitle: String, preferenceDescription: String? = null, trailing: @Composable () -> Unit = {}, onClick: () -> Unit ) { ManagerElevatedCard( shape = LargeShape, onClick = onClick ) { ManagerListItem( modifier = Modifier .padding(horizontal = DefaultContentPaddingHorizontal), title = { ManagerText(text = preferenceTitle) }, description = if (preferenceDescription != null) { { ManagerText(text = preferenceDescription) } } else null, trailing = trailing, ) } } @Composable fun ManagerSwitchPreference( preferenceTitle: String, preferenceDescription: String? = null, isChecked: Boolean, onCheckedChange: (isChecked: Boolean) -> Unit ) { ManagerPreference( preferenceTitle = preferenceTitle, preferenceDescription = preferenceDescription, onClick = { onCheckedChange(!isChecked) }, trailing = { Switch( checked = isChecked, onCheckedChange = null ) } ) } @Composable fun ManagerDialogPreference( preferenceTitle: String, preferenceDescription: String? = null, showDialog: Boolean, onClick: () -> Unit, onDismissRequest: () -> Unit, confirmButton: @Composable () -> Unit, dismissButton: @Composable () -> Unit = {}, trailing: @Composable () -> Unit = {}, content: @Composable () -> Unit ) { ManagerPreference( preferenceTitle = preferenceTitle, preferenceDescription = preferenceDescription, trailing = trailing, onClick = onClick ) if (showDialog) { ManagerDialog( title = preferenceTitle, onDismissRequest = onDismissRequest, confirmButton = confirmButton, dismissButton = dismissButton, content = content ) } } @Composable fun ManagerSingleSelectDialogPreference( preferenceTitle: String, preferenceDescription: String, showDialog: Boolean, selected: EntryValue, entries: Map, trailing: @Composable () -> Unit = {}, onClick: () -> Unit, onDismissRequest: () -> Unit, onEntrySelect: (EntryValue) -> Unit, onSave: () -> Unit, ) { ManagerDialogPreference( preferenceTitle = preferenceTitle, preferenceDescription = preferenceDescription, trailing = trailing, confirmButton = { TextButton(onClick = onSave) { ManagerText(managerString(R.string.dialog_button_save)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { ManagerText(managerString(R.string.dialog_button_cancel)) } }, onDismissRequest = onDismissRequest, showDialog = showDialog, onClick = onClick ) { LazyColumn( modifier = Modifier.heightIn(max = 400.dp) ) { items(entries) { entryText, entryValue -> ListDialogRadiobuttonItem( modifier = Modifier.fillMaxWidth(), text = entryText.text, selected = selected == entryValue, onClick = { onEntrySelect(entryValue) } ) } } } } @Composable fun ManagerMultiSelectDialogPreference( preferenceTitle: String, preferenceDescription: String, showDialog: Boolean, selected: List, entries: Map, trailing: @Composable () -> Unit = {}, onClick: () -> Unit, onDismissRequest: () -> Unit, onEntriesSelect: (List) -> Unit, onSave: () -> Unit, ) { ManagerDialogPreference( preferenceTitle = preferenceTitle, preferenceDescription = preferenceDescription, trailing = trailing, confirmButton = { TextButton(onClick = onSave) { ManagerText(managerString(R.string.dialog_button_save)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { ManagerText(managerString(R.string.dialog_button_cancel)) } }, onDismissRequest = onDismissRequest, showDialog = showDialog, onClick = onClick ) { LazyColumn( modifier = Modifier.heightIn(max = 400.dp) ) { items(entries) { entryText, entryValue -> ListDialogCheckboxItem( text = entryText.text, checked = selected.contains(entryValue), onCheckedChange = { isChecked -> val mutableSelected = selected.toMutableList() when (isChecked) { true -> mutableSelected.add(entryValue) false -> mutableSelected.remove(entryValue) } onEntriesSelect(mutableSelected) } ) } } } } @Composable private fun ListDialogRadiobuttonItem( text: String, selected: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier ) { ListDialogItem( modifier = modifier, text = text, onClick = onClick, trailing = { RadioButton( selected = selected, onClick = null ) } ) } @Composable private fun ListDialogCheckboxItem( text: String, checked: Boolean, onCheckedChange: (Boolean) -> Unit, modifier: Modifier = Modifier ) { ListDialogItem( modifier = modifier, text = text, onClick = { onCheckedChange(!checked) }, trailing = { Checkbox( checked = checked, onCheckedChange = null ) } ) } @Composable private fun ListDialogItem( text: String, onClick: () -> Unit, trailing: @Composable () -> Unit, modifier: Modifier = Modifier ) { Row( modifier = modifier .clip(SmallShape) .clickable(onClick = onClick) .padding(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically ) { ManagerText( modifier = Modifier.weight(1f), text = text, textStyle = MaterialTheme.typography.titleSmall ) trailing() } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerProgressIndicator.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.animation.core.animateFloatAsState import androidx.compose.material.ProgressIndicatorDefaults import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import com.vanced.manager.ui.util.animated @Composable fun ManagerProgressIndicator( modifier: Modifier = Modifier, color: Color = MaterialTheme.colorScheme.primary, trackColor: Color = MaterialTheme.colorScheme.surfaceVariant, ) { LinearProgressIndicator( modifier = modifier, color = color.animated, trackColor = trackColor.animated ) } @Composable fun ManagerProgressIndicator( progress: Float, modifier: Modifier = Modifier, color: Color = MaterialTheme.colorScheme.primary, trackColor: Color = MaterialTheme.colorScheme.surfaceVariant, ) { val animatedProgress by animateFloatAsState( targetValue = progress, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec ) LinearProgressIndicator( progress = animatedProgress, modifier = modifier, color = color.animated, trackColor = trackColor.animated ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerScaffold.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.layout.PaddingValues import androidx.compose.material3.FabPosition import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import com.vanced.manager.ui.util.animated @Composable fun ManagerScaffold( modifier: Modifier = Modifier, topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, containerColor: Color = MaterialTheme.colorScheme.background, contentColor: Color = contentColorFor(containerColor), content: @Composable (PaddingValues) -> Unit ) { // //M3 Scaffold doesn't support tonal elevation for Surface // val absoluteTonalElevation = LocalAbsoluteTonalElevation.current + 1.dp // CompositionLocalProvider( // LocalAbsoluteTonalElevation provides absoluteTonalElevation // ) { Scaffold( modifier = modifier, topBar = topBar, bottomBar = bottomBar, snackbarHost = snackbarHost, floatingActionButton = floatingActionButton, floatingActionButtonPosition = floatingActionButtonPosition, containerColor = containerColor.animated, contentColor = contentColor.animated, content = content ) // } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerSwipeRefresh.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.layout.PaddingValues import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.SwipeRefreshIndicator import com.google.accompanist.swiperefresh.SwipeRefreshState @Composable fun ManagerSwipeRefresh( swipeRefreshState: SwipeRefreshState, onRefresh: () -> Unit, modifier: Modifier = Modifier, swipeEnabled: Boolean = true, refreshTriggerDistance: Dp = 80.dp, indicatorAlignment: Alignment = Alignment.TopCenter, indicatorPadding: PaddingValues = PaddingValues(0.dp), clipIndicatorToPadding: Boolean = true, content: @Composable () -> Unit, ) { SwipeRefresh( modifier = modifier, state = swipeRefreshState, onRefresh = onRefresh, indicator = { state, trigger -> SwipeRefreshIndicator( state = state, refreshTriggerDistance = trigger, scale = true, contentColor = MaterialTheme.colorScheme.primary, backgroundColor = MaterialTheme.colorScheme.surface ) }, swipeEnabled = swipeEnabled, refreshTriggerDistance = refreshTriggerDistance, indicatorAlignment = indicatorAlignment, indicatorPadding = indicatorPadding, clipIndicatorToPadding = clipIndicatorToPadding, content = content ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerText.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign @Composable fun ManagerText( text: String, modifier: Modifier = Modifier, color: Color = Color.Unspecified, textStyle: TextStyle = LocalTextStyle.current, textAlign: TextAlign? = null, ) { Text( modifier = modifier, text = text, color = color, style = textStyle, textAlign = textAlign ) } @Composable fun ManagerText( text: AnnotatedString, modifier: Modifier = Modifier, color: Color = Color.Unspecified, textStyle: TextStyle = LocalTextStyle.current, textAlign: TextAlign? = null, ) { Text( modifier = modifier, text = text, color = color, style = textStyle, textAlign = textAlign ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/component/ManagerTopAppBar.kt ================================================ package com.vanced.manager.ui.component import androidx.compose.foundation.layout.RowScope import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @Composable fun ManagerSmallTopAppBar( title: @Composable () -> Unit, modifier: Modifier = Modifier, navigationIcon: @Composable () -> Unit = {}, actions: @Composable RowScope.() -> Unit = {}, colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), scrollBehavior: TopAppBarScrollBehavior? = null ) { SmallTopAppBar( modifier = modifier, title = title, actions = actions, navigationIcon = navigationIcon, colors = colors, scrollBehavior = scrollBehavior ) } @Composable fun ManagerCenterAlignedTopAppBar( title: @Composable () -> Unit, modifier: Modifier = Modifier, navigationIcon: @Composable () -> Unit = {}, actions: @Composable RowScope.() -> Unit = {}, colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), scrollBehavior: TopAppBarScrollBehavior? = null ) { CenterAlignedTopAppBar( modifier = modifier, title = title, actions = actions, navigationIcon = navigationIcon, colors = colors, scrollBehavior = scrollBehavior ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/resource/ManagerString.kt ================================================ package com.vanced.manager.ui.resource import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.vanced.manager.R @Composable fun managerString( @StringRes stringId: Int? ) = stringResource(id = stringId ?: R.string.dummy_placeholder_text) @Composable fun managerString( @StringRes stringId: Int?, vararg formatArgs: Any ) = stringResource(id = stringId ?: R.string.dummy_placeholder_text, *formatArgs) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/screen/AboutScreen.kt ================================================ package com.vanced.manager.ui.screen import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ArrowBackIosNew import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.unit.dp import com.vanced.manager.BuildConfig import com.vanced.manager.R import com.vanced.manager.ui.component.* import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.theme.LargeShape import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.DefaultContentPaddingVertical import com.vanced.manager.ui.util.Screen import com.vanced.manager.ui.widget.LinkCard data class Person( val name: String, val contribution: String ) data class Source( @StringRes val nameId: Int, @DrawableRes val iconId: Int, val link: String ) private val vancedTeam = listOf( Person( name = "xfileFIN", contribution = "Mods, Theming, Support" ), Person( name = "Laura", contribution = "Theming, Support" ), Person( name = "ZaneZam", contribution = "Publishing, Support" ), Person( name = "KevinX8", contribution = "Overlord, Support" ), Person( name = "Xinto", contribution = "Vanced Manager" ) ) private val otherContributors = listOf( Person( name = "bhatVikrant", contribution = "Website" ), Person( name = "bawm", contribution = "Sponsorblock" ), Person( name = "cane", contribution = "Sponsorblock" ), Person( name = "Koopah", contribution = "Vanced Manager root installer" ), Person( name = "Logan", contribution = "Vanced Manager UI" ), Person( name = "HaliksaR", contribution = "Vanced Manager Refactoring, UI" ), ) private val sources = listOf( Source( nameId = R.string.about_sources_source_code, iconId = R.drawable.ic_github, link = "https://github.com/YTVanced/VancedManager" ), Source( nameId = R.string.about_sources_license, iconId = R.drawable.ic_round_assignment_24, link = "https://raw.githubusercontent.com/YTVanced/VancedManager/dev/LICENSE" ) ) @ExperimentalMaterial3Api @Composable fun AboutScreen( onToolbarBackButtonClick: () -> Unit ) { ManagerScaffold( topBar = { ManagerSmallTopAppBar( title = { ManagerText(managerString(Screen.About.displayName)) }, navigationIcon = { IconButton(onClick = onToolbarBackButtonClick) { Icon( imageVector = Icons.Rounded.ArrowBackIosNew, contentDescription = "Back" ) } } ) } ) { paddingValues -> ManagerLazyColumn( modifier = Modifier .fillMaxSize() .padding(paddingValues), ) { item { ManagerElevatedCard( modifier = Modifier.fillMaxWidth(), shape = LargeShape ) { Column( modifier = Modifier .fillMaxWidth() .padding( vertical = DefaultContentPaddingVertical, horizontal = DefaultContentPaddingHorizontal ), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(4.dp) ) { ManagerText( modifier = Modifier, text = managerString(R.string.app_name), textStyle = MaterialTheme.typography.headlineSmall ) ManagerText( modifier = Modifier, text = buildAnnotatedString { append(BuildConfig.VERSION_NAME) val compose = "@Compose" val startIndex = BuildConfig.VERSION_NAME.indexOf(compose) addStyle( style = SpanStyle(Color(0xFFBBB529)), start = startIndex, end = startIndex + compose.length ) }, textStyle = MaterialTheme.typography.titleSmall ) } } } managerCategory(categoryName = { managerString(R.string.about_category_credits_vanced_team) }) { items(vancedTeam) { person -> CreditCard( modifier = Modifier.fillMaxWidth(), personName = person.name, personContribution = person.contribution ) } } managerCategory(categoryName = { managerString(R.string.about_category_credits_other) }) { items(otherContributors) { person -> CreditCard( modifier = Modifier.fillMaxWidth(), personName = person.name, personContribution = person.contribution ) } } managerCategory(categoryName = { managerString(R.string.about_category_sources) }) { item { ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { items(sources) { source -> LinkCard( text = managerString(source.nameId), icon = painterResource(source.iconId), url = source.link ) } } } } } } } @Composable private fun CreditCard( personName: String, personContribution: String, modifier: Modifier = Modifier, ) { ManagerElevatedCard( modifier = modifier, shape = LargeShape ) { ManagerListItem( modifier = Modifier .fillMaxWidth() .padding(horizontal = DefaultContentPaddingHorizontal), title = { ManagerText( text = personName, textStyle = MaterialTheme.typography.titleSmall ) }, description = { ManagerText( text = personContribution, textStyle = MaterialTheme.typography.bodySmall ) } ) } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/screen/ConfigurationScreen.kt ================================================ package com.vanced.manager.ui.screen import androidx.compose.animation.* import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ArrowBackIosNew import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.vanced.manager.R import com.vanced.manager.domain.model.InstallationOption import com.vanced.manager.ui.component.* import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.theme.LargeShape import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.DefaultContentPaddingVertical import com.vanced.manager.ui.viewmodel.ConfigurationViewModel import org.koin.androidx.compose.getViewModel private const val enterDuration = 300 private const val exitDuration = 250 @Composable fun ConfigurationScreen( installationOptions: List, onToolbarBackButtonClick: () -> Unit, onFinishClick: () -> Unit, ) { val viewModel: ConfigurationViewModel = getViewModel() Scaffold( topBar = { ManagerSmallTopAppBar( title = { ManagerText(managerString(R.string.toolbar_installation_preferences)) }, navigationIcon = { IconButton( onClick = { onToolbarBackButtonClick() viewModel.reset() } ) { Icon( imageVector = Icons.Rounded.ArrowBackIosNew, contentDescription = "Back" ) } } ) }, bottomBar = { ConfigurationBottomBar( modifier = Modifier .padding( horizontal = DefaultContentPaddingHorizontal, vertical = DefaultContentPaddingVertical ), lastIndex = installationOptions.lastIndex, currentIndex = viewModel.currentIndex, onBackClick = { viewModel.back() }, onNextClick = { viewModel.next() }, onFinishClick = { onFinishClick() viewModel.reset() } ) } ) { paddingValues -> ConfigurationBody( modifier = Modifier .fillMaxSize() .padding(paddingValues), currentIndex = viewModel.currentIndex, installationOptions = installationOptions ) } } @Composable private fun ConfigurationBody( currentIndex: Int, installationOptions: List, modifier: Modifier = Modifier ) { AnimatedContent( modifier = modifier, targetState = currentIndex, transitionSpec = { slideAnimationSpec( if (targetState > initialState) { AnimatedContentScope.SlideDirection.Start } else { AnimatedContentScope.SlideDirection.End } ) } ) { optionIndex -> val installationOption = installationOptions[optionIndex] ManagerLazyColumn { managerCategory(categoryName = { managerString(installationOption.titleId) }) { when (installationOption) { is InstallationOption.SingleSelect -> { items(installationOption.items) { item -> val preference = installationOption.getOption() ConfigurationItem( modifier = Modifier .fillMaxWidth(), text = item.displayText(item.key), onClick = { installationOption.setOption(item.key) }, trailing = { RadioButton( selected = preference == item.key, onClick = null ) } ) } } is InstallationOption.MultiSelect -> { items(installationOption.items) { item -> val preference = installationOption.getOption() ConfigurationItem( modifier = Modifier .fillMaxWidth(), text = item.displayText(item.key), onClick = { if (preference.contains(item.key)) { installationOption.removeOption(item.key) } else { installationOption.addOption(item.key) } }, trailing = { Checkbox( checked = preference.contains(item.key), onCheckedChange = null ) } ) } } } } } } } @Composable private fun ConfigurationBottomBar( currentIndex: Int, lastIndex: Int, onBackClick: () -> Unit, onNextClick: () -> Unit, onFinishClick: () -> Unit, modifier: Modifier = Modifier, ) { Row(modifier = modifier) { AnimatedVisibility( modifier = Modifier .wrapContentWidth(Alignment.Start) .weight(1f), visible = currentIndex > 0, enter = fadeIn(tween(enterDuration)) + expandHorizontally(tween(enterDuration)) + scaleIn(tween(enterDuration)), exit = fadeOut(tween(exitDuration)) + shrinkHorizontally(tween(exitDuration)) + scaleOut(tween(exitDuration)), ) { TextButton(onClick = onBackClick) { ManagerText(text = "Back") } } AnimatedContent( modifier = Modifier .wrapContentWidth(Alignment.End) .weight(1f), targetState = currentIndex == lastIndex, transitionSpec = { slideAnimationSpec( if (initialState && !targetState) { AnimatedContentScope.SlideDirection.Up } else { AnimatedContentScope.SlideDirection.Down } ) } ) { isLastIndex -> if (isLastIndex) { ElevatedButton(onClick = onFinishClick) { ManagerText(text = "Finish") } } else { OutlinedButton(onClick = onNextClick) { ManagerText(text = "Next") } } } } } @Composable private fun ConfigurationItem( text: String, onClick: () -> Unit, trailing: @Composable () -> Unit, modifier: Modifier = Modifier, ) { ManagerElevatedCard( modifier = modifier, shape = LargeShape, onClick = onClick ) { ManagerListItem( modifier = Modifier.padding( horizontal = DefaultContentPaddingHorizontal ), title = { ManagerText( text = text, textStyle = MaterialTheme.typography.titleSmall ) }, trailing = trailing, ) } } @ExperimentalAnimationApi private fun AnimatedContentScope.slideAnimationSpec( slideDirection: AnimatedContentScope.SlideDirection ) = slideIntoContainer( towards = slideDirection, animationSpec = tween(enterDuration) ) + fadeIn( animationSpec = tween(enterDuration) ) with slideOutOfContainer( towards = slideDirection, animationSpec = tween(exitDuration) ) + fadeOut( animationSpec = tween(exitDuration) ) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/screen/HomeScreen.kt ================================================ package com.vanced.manager.ui.screen import androidx.annotation.DrawableRes import androidx.compose.animation.* import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.MoreVert import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.TextButton import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.vanced.manager.R import com.vanced.manager.domain.model.App import com.vanced.manager.network.util.* import com.vanced.manager.ui.component.* import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.util.Screen import com.vanced.manager.ui.viewmodel.ManagerState import com.vanced.manager.ui.widget.AppCard import com.vanced.manager.ui.widget.AppCardPlaceholder import com.vanced.manager.ui.widget.LinkCard @Composable fun HomeScreen( managerState: ManagerState, onRefresh: () -> Unit, onToolbarScreenSelected: (Screen) -> Unit, onAppDownloadClick: (App) -> Unit, onAppUninstallClick: (App) -> Unit, onAppLaunchClick: (App) -> Unit, ) { val refreshState = rememberSwipeRefreshState(isRefreshing = managerState.isFetching) var menuExpanded by remember { mutableStateOf(false) } val dropdownScreens = remember { listOf(Screen.Settings, Screen.About) } ManagerScaffold( topBar = { HomeScreenTopBar( modifier = Modifier, menuExpanded = menuExpanded, dropdownScreens = dropdownScreens, onActionClick = { menuExpanded = true }, onDropdownItemClick = onToolbarScreenSelected, onDropdownDismissRequest = { menuExpanded = false }) } ) { paddingValues -> ManagerSwipeRefresh( modifier = Modifier .fillMaxSize() .padding(paddingValues), swipeRefreshState = refreshState, onRefresh = onRefresh ) { AnimatedContent( modifier = Modifier.fillMaxSize(), targetState = managerState, transitionSpec = { scaleIn(initialScale = 0.9f) + fadeIn() with scaleOut(targetScale = 0.9f) + fadeOut() } ) { animatedAppState -> when (animatedAppState) { is ManagerState.Fetching -> { HomeScreenLoading( modifier = Modifier.fillMaxSize(), appsCount = animatedAppState.placeholderAppsCount ) } is ManagerState.Success -> { HomeScreenLoaded( modifier = Modifier.fillMaxSize(), apps = animatedAppState.apps, onAppDownloadClick = onAppDownloadClick, onAppUninstallClick = onAppUninstallClick, onAppLaunchClick = onAppLaunchClick ) } is ManagerState.Error -> { //TODO } } } } } } @Composable private fun HomeScreenTopBar( menuExpanded: Boolean, dropdownScreens: List, onActionClick: () -> Unit, onDropdownItemClick: (Screen) -> Unit, onDropdownDismissRequest: () -> Unit, modifier: Modifier = Modifier ) { ManagerCenterAlignedTopAppBar( modifier = modifier, title = { ManagerText(managerString(Screen.Home.displayName)) }, actions = { IconButton(onClick = onActionClick) { Icon( Icons.Rounded.MoreVert, contentDescription = "Navigation" ) } ManagerDropdownMenu( expanded = menuExpanded, onDismissRequest = onDropdownDismissRequest ) { for (dropdownScreen in dropdownScreens) { ManagerDropdownMenuItem( title = managerString(dropdownScreen.displayName), onClick = { onDropdownItemClick(dropdownScreen) } ) } } } ) } @Composable private fun HomeScreenLoaded( modifier: Modifier = Modifier, apps: List, onAppDownloadClick: (App) -> Unit, onAppUninstallClick: (App) -> Unit, onAppLaunchClick: (App) -> Unit, ) { HomeScreenBody(modifier = modifier) { managerCategory(categoryName = { managerString(R.string.home_category_apps) }) { items(apps) { app -> val appIcon = painterResource(id = app.iconResId) var showAppInfoDialog by remember { mutableStateOf(false) } AppCard( modifier = Modifier.fillMaxWidth(), appName = app.name, appIcon = appIcon, appInstalledVersion = app.installedVersionName, appRemoteVersion = app.remoteVersionName, appState = app.state, onAppDownloadClick = { onAppDownloadClick(app) }, onAppUninstallClick = { onAppUninstallClick(app) }, onAppLaunchClick = { onAppLaunchClick(app) }, onAppInfoClick = { showAppInfoDialog = true } ) if (showAppInfoDialog) { ManagerDialog( title = managerString( R.string.app_info_title, app.name ), onDismissRequest = { showAppInfoDialog = false }, confirmButton = { TextButton(onClick = { showAppInfoDialog = false }) { ManagerText(text = managerString(R.string.dialog_button_close)) } }, ) { ManagerText( modifier = Modifier.padding(top = 4.dp), text = app.changelog, ) } } } } } } @Composable private fun HomeScreenLoading( modifier: Modifier = Modifier, appsCount: Int, ) { HomeScreenBody(modifier = modifier) { managerCategory(categoryName = { managerString(R.string.home_category_apps) }) { items(appsCount) { AppCardPlaceholder( modifier = Modifier.fillMaxWidth() ) } } } } @Composable private inline fun HomeScreenBody( modifier: Modifier = Modifier, crossinline appsCategory: LazyListScope.() -> Unit, ) { ManagerLazyColumn(modifier = modifier) { appsCategory() managerCategory(categoryName = { managerString(R.string.home_category_support_us) }) { item { ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { items(sponsors) { sponsor -> LinkCard( text = sponsor.title, icon = painterResource(sponsor.icon), url = sponsor.link ) } } } } managerCategory(categoryName = { managerString(R.string.home_category_social_media) }) { item { ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { items(socialMedia) { socialMedia -> LinkCard( text = socialMedia.title, icon = painterResource(socialMedia.icon), url = socialMedia.link ) } } } } } } data class Link( val title: String, val link: String, @DrawableRes val icon: Int ) val sponsors = listOf( Link( title = "Brave", link = URL_SPONSOR_BRAVE, icon = R.drawable.ic_brave ), Link( title = "Adguard", link = URL_SPONSOR_ADGUARD, icon = R.drawable.ic_adguard ) ) val socialMedia = listOf( Link( title = "Instagram", link = URL_MEDIA_INSTAGRAM, icon = R.drawable.ic_instagram ), Link( title = "YouTube", link = URL_MEDIA_YOUTUBE, icon = R.drawable.ic_youtube ), Link( title = "GitHub", link = URL_MEDIA_GITHUB, icon = R.drawable.ic_github ), Link( title = "Website", link = URL_MEDIA_WEBSITE, icon = R.drawable.ic_website ), Link( title = "Telegram", link = URL_MEDIA_TELEGRAM, icon = R.drawable.ic_telegram ), Link( title = "Twitter", link = URL_MEDIA_TWITTER, icon = R.drawable.ic_twitter ), Link( title = "Discord", link = URL_MEDIA_DISCORD, icon = R.drawable.ic_discord ), Link( title = "Reddit", link = URL_MEDIA_REDDIT, icon = R.drawable.ic_reddit ), ) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/screen/InstallScreen.kt ================================================ package com.vanced.manager.ui.screen import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ArrowDropDown import androidx.compose.material.icons.rounded.Done import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.sp import com.vanced.manager.R import com.vanced.manager.ui.component.* import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.viewmodel.InstallViewModel @Composable fun InstallScreen( appName: String, appVersions: List?, viewModel: InstallViewModel, onFinishClick: () -> Unit ) { var startedProcess by rememberSaveable { mutableStateOf(false) } val logs = viewModel.logs val status = viewModel.status // I don't know why, I don't know how, // but it works as intended LaunchedEffect(startedProcess) { if (!startedProcess) { startedProcess = true viewModel.startAppProcess(appName, appVersions) } } ManagerScaffold( topBar = { Column { ManagerSmallTopAppBar( title = { ManagerText(managerString(R.string.toolbar_install)) }, ) when (status) { is InstallViewModel.Status.Progress -> { ManagerProgressIndicator(status.progress) } is InstallViewModel.Status.Installing -> { ManagerProgressIndicator() } else -> {} } } }, floatingActionButton = { if (status is InstallViewModel.Status.Installed) { ExtendedFloatingActionButton( text = { ManagerText("Finish") }, icon = { Icon(Icons.Rounded.Done, null) }, onClick = onFinishClick, ) } } ) { paddingValues -> ManagerLazyColumn( modifier = Modifier .fillMaxSize() .padding(paddingValues), ) { items(logs) { log -> when (log) { is InstallViewModel.Log.Success -> { ManagerText( modifier = Modifier .fillMaxWidth() .padding(horizontal = DefaultContentPaddingHorizontal), text = log.successText, textStyle = TextStyle( fontWeight = FontWeight.Bold, fontSize = 14.sp, color = MaterialTheme.colorScheme.tertiary ), ) } is InstallViewModel.Log.Info -> { ManagerText( modifier = Modifier .fillMaxWidth() .padding(horizontal = DefaultContentPaddingHorizontal), text = log.infoText, textStyle = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 14.sp, color = MaterialTheme.colorScheme.onSurface ), ) } is InstallViewModel.Log.Error -> { var visible by remember { mutableStateOf(false) } val iconRotation by animateFloatAsState(if (visible) -90f else 0f) Column( modifier = Modifier .fillMaxWidth() .clickable { visible = !visible } .padding(horizontal = DefaultContentPaddingHorizontal), ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { ManagerText( text = buildAnnotatedString { withStyle(SpanStyle(color = MaterialTheme.colorScheme.error)) { append(log.displayText) } }, textStyle = TextStyle( fontWeight = FontWeight.Bold, fontSize = 14.sp, ), ) Icon( modifier = Modifier.rotate(iconRotation), imageVector = Icons.Rounded.ArrowDropDown, contentDescription = "expand", tint = MaterialTheme.colorScheme.error ) } AnimatedVisibility(visible) { ManagerText( text = log.stacktrace, textStyle = TextStyle( fontWeight = FontWeight.Bold, fontSize = 14.sp, color = MaterialTheme.colorScheme.error.copy(alpha = 0.7f) ), ) } } } } } } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/screen/SettingsScreen.kt ================================================ package com.vanced.manager.ui.screen import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ArrowBackIosNew import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.vanced.manager.R import com.vanced.manager.repository.ManagerMode import com.vanced.manager.repository.ManagerTheme import com.vanced.manager.ui.component.* import com.vanced.manager.ui.resource.managerString import com.vanced.manager.ui.util.Screen import com.vanced.manager.ui.viewmodel.SettingsViewModel import com.vanced.manager.util.isMagiskInstalled import org.koin.androidx.compose.viewModel @ExperimentalMaterial3Api @Composable fun SettingsScreen( onToolbarBackButtonClick: () -> Unit, onThemeChange: (ManagerTheme) -> Unit, ) { val viewModel: SettingsViewModel by viewModel() ManagerScaffold( modifier = Modifier.fillMaxSize(), topBar = { ManagerSmallTopAppBar( title = { ManagerText(managerString(Screen.Settings.displayName)) }, navigationIcon = { IconButton(onClick = onToolbarBackButtonClick) { Icon( imageVector = Icons.Rounded.ArrowBackIosNew, contentDescription = "Back" ) } } ) } ) { paddingValues -> ManagerLazyColumn( modifier = Modifier .fillMaxSize() .padding(paddingValues), ) { managerCategory(categoryName = { managerString(R.string.settings_category_behaviour) }) { item { ManagerSwitchPreference( preferenceTitle = stringResource(id = R.string.settings_preference_use_custom_tabs_title), preferenceDescription = stringResource(id = R.string.settings_preference_use_custom_tabs_summary), isChecked = viewModel.managerUseCustomTabs, onCheckedChange = { viewModel.saveManagerUseCustomTabs(it) } ) } item { var showDialog by remember { mutableStateOf(false) } var selectedMode by remember { mutableStateOf(EntryValue(viewModel.managerMode.value)) } ManagerSingleSelectDialogPreference( preferenceTitle = managerString( stringId = R.string.settings_preference_variant_title ), preferenceDescription = selectedMode.value, showDialog = showDialog, selected = selectedMode, entries = mapOf( EntryText("nonroot") to EntryValue("nonroot"), EntryText("root") to EntryValue("root"), ), onClick = { showDialog = true }, onDismissRequest = { showDialog = false selectedMode = EntryValue(viewModel.managerMode.value) }, onEntrySelect = { if (it.value == "root" && !isMagiskInstalled) return@ManagerSingleSelectDialogPreference selectedMode = it }, onSave = { viewModel.saveManagerMode(ManagerMode.fromValue(selectedMode.value)) showDialog = false } ) } } managerCategory(categoryName = { managerString(R.string.settings_category_appearance) }) { item { var showDialog by remember { mutableStateOf(false) } var selectedTheme by remember { mutableStateOf(EntryValue(viewModel.managerTheme.value)) } ManagerSingleSelectDialogPreference( preferenceTitle = managerString(stringId = R.string.settings_preference_theme_title), preferenceDescription = managerString( stringId = viewModel.getThemeStringId( ManagerTheme.fromValue(selectedTheme.value) ) ), showDialog = showDialog, selected = selectedTheme, entries = mapOf( EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.LIGHT))) to EntryValue(ManagerTheme.LIGHT.value), EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.DARK))) to EntryValue(ManagerTheme.DARK.value), EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.SYSTEM_DEFAULT))) to EntryValue(ManagerTheme.SYSTEM_DEFAULT.value), ), onClick = { showDialog = true }, onDismissRequest = { showDialog = false selectedTheme = EntryValue(viewModel.managerTheme.value) }, onEntrySelect = { selectedTheme = it }, onSave = { showDialog = false viewModel.saveManagerTheme(ManagerTheme.fromValue(selectedTheme.value)) onThemeChange(ManagerTheme.fromValue(selectedTheme.value)) } ) } } } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/theme/Color.kt ================================================ package com.vanced.manager.ui.theme import androidx.compose.ui.graphics.Color val primaryColor = Color(defAccentColor) val primaryColorVariant = primaryColor.copy(alpha = 0.25f) val darkSurface = Color.Black val darkOnSurface = Color(0xFFD5D5D5) val lightSurface = Color.White val lightOnSurface = Color.Black val md_theme_light_primary = Color(0xFF0054d9) val md_theme_light_onPrimary = Color(0xFFffffff) val md_theme_light_primaryContainer = Color(0xFFdae2ff) val md_theme_light_onPrimaryContainer = Color(0xFF00174a) val md_theme_light_secondary = Color(0xFFc00020) val md_theme_light_onSecondary = Color(0xFFffffff) val md_theme_light_secondaryContainer = Color(0xFFffdad6) val md_theme_light_onSecondaryContainer = Color(0xFF410005) val md_theme_light_tertiary = Color(0xFF943896) val md_theme_light_onTertiary = Color(0xFFffffff) val md_theme_light_tertiaryContainer = Color(0xFFffd6fa) val md_theme_light_onTertiaryContainer = Color(0xFF37003c) val md_theme_light_error = Color(0xFFba1b1b) val md_theme_light_errorContainer = Color(0xFFffdad4) val md_theme_light_onError = Color(0xFFffffff) val md_theme_light_onErrorContainer = Color(0xFF410001) val md_theme_light_background = Color(0xFFfefbff) val md_theme_light_onBackground = Color(0xFF1b1b1e) val md_theme_light_surface = Color(0xFFfefbff) val md_theme_light_onSurface = Color(0xFF1b1b1e) val md_theme_light_surfaceVariant = Color(0xFFe2e2ec) val md_theme_light_onSurfaceVariant = Color(0xFF44464e) val md_theme_light_outline = Color(0xFF75767f) val md_theme_light_inverseOnSurface = Color(0xFFf2f0f5) val md_theme_light_inverseSurface = Color(0xFF303033) val md_theme_dark_primary = Color(0xFFb1c5ff) val md_theme_dark_onPrimary = Color(0xFF002a77) val md_theme_dark_primaryContainer = Color(0xFF003ea6) val md_theme_dark_onPrimaryContainer = Color(0xFFdae2ff) val md_theme_dark_secondary = Color(0xFFffb3af) val md_theme_dark_onSecondary = Color(0xFF69000c) val md_theme_dark_secondaryContainer = Color(0xFF920016) val md_theme_dark_onSecondaryContainer = Color(0xFFffdad6) val md_theme_dark_tertiary = Color(0xFFffa9fc) val md_theme_dark_onTertiary = Color(0xFF5a0061) val md_theme_dark_tertiaryContainer = Color(0xFF781c7c) val md_theme_dark_onTertiaryContainer = Color(0xFFffd6fa) val md_theme_dark_error = Color(0xFFffb4a9) val md_theme_dark_errorContainer = Color(0xFF930006) val md_theme_dark_onError = Color(0xFF680003) val md_theme_dark_onErrorContainer = Color(0xFFffdad4) val md_theme_dark_background = Color(0xFF1b1b1e) val md_theme_dark_onBackground = Color(0xFFe3e1e6) val md_theme_dark_surface = Color(0xFF1b1b1e) val md_theme_dark_onSurface = Color(0xFFe3e1e6) val md_theme_dark_surfaceVariant = Color(0xFF44464e) val md_theme_dark_onSurfaceVariant = Color(0xFFc6c6d0) val md_theme_dark_outline = Color(0xFF8f909a) val md_theme_dark_inverseOnSurface = Color(0xFF1b1b1e) val md_theme_dark_inverseSurface = Color(0xFFe3e1e6) val seed = Color(0xFF2e73ff) val error = Color(0xFFba1b1b) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/theme/Shape.kt ================================================ package com.vanced.manager.ui.theme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.unit.dp //TODO M3 doesn't support Shapes yet val SmallShape = RoundedCornerShape(8.dp) val MediumShape = RoundedCornerShape(12.dp) val LargeShape = RoundedCornerShape(16.dp) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/theme/Theme.kt ================================================ package com.vanced.manager.ui.theme import android.os.Build import androidx.compose.foundation.gestures.LocalOverScrollConfiguration import androidx.compose.foundation.gestures.OverScrollConfiguration import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.platform.LocalContext const val defAccentColor = 0xFF0477E1 private val LightThemeColors = lightColorScheme( primary = md_theme_light_primary, onPrimary = md_theme_light_onPrimary, primaryContainer = md_theme_light_primaryContainer, onPrimaryContainer = md_theme_light_onPrimaryContainer, secondary = md_theme_light_secondary, onSecondary = md_theme_light_onSecondary, secondaryContainer = md_theme_light_secondaryContainer, onSecondaryContainer = md_theme_light_onSecondaryContainer, tertiary = md_theme_light_tertiary, onTertiary = md_theme_light_onTertiary, tertiaryContainer = md_theme_light_tertiaryContainer, onTertiaryContainer = md_theme_light_onTertiaryContainer, error = md_theme_light_error, errorContainer = md_theme_light_errorContainer, onError = md_theme_light_onError, onErrorContainer = md_theme_light_onErrorContainer, background = md_theme_light_background, onBackground = md_theme_light_onBackground, surface = md_theme_light_surface, onSurface = md_theme_light_onSurface, surfaceVariant = md_theme_light_surfaceVariant, onSurfaceVariant = md_theme_light_onSurfaceVariant, outline = md_theme_light_outline, inverseOnSurface = md_theme_light_inverseOnSurface, inverseSurface = md_theme_light_inverseSurface, ) private val DarkThemeColors = darkColorScheme( primary = md_theme_dark_primary, onPrimary = md_theme_dark_onPrimary, primaryContainer = md_theme_dark_primaryContainer, onPrimaryContainer = md_theme_dark_onPrimaryContainer, secondary = md_theme_dark_secondary, onSecondary = md_theme_dark_onSecondary, secondaryContainer = md_theme_dark_secondaryContainer, onSecondaryContainer = md_theme_dark_onSecondaryContainer, tertiary = md_theme_dark_tertiary, onTertiary = md_theme_dark_onTertiary, tertiaryContainer = md_theme_dark_tertiaryContainer, onTertiaryContainer = md_theme_dark_onTertiaryContainer, error = md_theme_dark_error, errorContainer = md_theme_dark_errorContainer, onError = md_theme_dark_onError, onErrorContainer = md_theme_dark_onErrorContainer, background = md_theme_dark_background, onBackground = md_theme_dark_onBackground, surface = md_theme_dark_surface, onSurface = md_theme_dark_onSurface, surfaceVariant = md_theme_dark_surfaceVariant, onSurfaceVariant = md_theme_dark_onSurfaceVariant, outline = md_theme_dark_outline, inverseOnSurface = md_theme_dark_inverseOnSurface, inverseSurface = md_theme_dark_inverseSurface, ) @Composable inline fun apiDependantColorScheme( dynamic: () -> ColorScheme, static: () -> ColorScheme ): ColorScheme { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { dynamic() } else { static() } } @Composable fun ManagerTheme( darkMode: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { val context = LocalContext.current val colorScheme = if (darkMode) { apiDependantColorScheme( dynamic = { dynamicDarkColorScheme(context) }, static = { DarkThemeColors } ) } else { apiDependantColorScheme( dynamic = { dynamicLightColorScheme(context) }, static = { LightThemeColors } ) } MaterialTheme( colorScheme = colorScheme, typography = ManagerTypography, ) { CompositionLocalProvider( LocalOverScrollConfiguration provides OverScrollConfiguration( forceShowAlways = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ) ) { content() } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/theme/Type.kt ================================================ package com.vanced.manager.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp import com.vanced.manager.R private val light = Font(R.font.inter_light, FontWeight.Light) private val regular = Font(R.font.inter_regular, FontWeight.Normal) private val medium = Font(R.font.inter_medium, FontWeight.Medium) private val semibold = Font(R.font.inter_semibold, FontWeight.SemiBold) private val bold = Font(R.font.inter_bold, FontWeight.Bold) private val InterFontFamily = FontFamily(light, regular, medium, semibold, bold) val ManagerTypography = Typography( displayLarge = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, fontSize = 57.sp, lineHeight = 64.sp, letterSpacing = (-0.25).sp, ), displayMedium = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, fontSize = 45.sp, lineHeight = 52.sp, letterSpacing = 0.sp, ), displaySmall = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, fontSize = 36.sp, lineHeight = 44.sp, letterSpacing = 0.sp, ), headlineLarge = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Bold, fontSize = 32.sp, lineHeight = 40.sp, letterSpacing = 0.sp, ), headlineMedium = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Bold, fontSize = 28.sp, lineHeight = 36.sp, letterSpacing = 0.sp, ), headlineSmall = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 24.sp, lineHeight = 32.sp, letterSpacing = 0.sp, ), titleLarge = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 22.sp, lineHeight = 28.sp, letterSpacing = 0.sp, ), titleMedium = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 18.sp, lineHeight = 24.sp, letterSpacing = 0.1.sp, ), titleSmall = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 16.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp, ), bodyLarge = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, letterSpacing = 0.5.sp, ), bodyMedium = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.25.sp, ), bodySmall = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 14.sp, letterSpacing = 0.sp, ), labelLarge = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp, ), labelMedium = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp, ), labelSmall = TextStyle( fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 11.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp, ), ) ================================================ FILE: app/src/main/java/com/vanced/manager/ui/util/Color.kt ================================================ package com.vanced.manager.ui.util import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.tween import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color val Color.animated @Composable get() = animateColorAsState(this, animationSpec = tween(400)).value ================================================ FILE: app/src/main/java/com/vanced/manager/ui/util/Const.kt ================================================ package com.vanced.manager.ui.util import androidx.compose.ui.unit.dp val DefaultContentPaddingHorizontal = 16.dp val DefaultContentPaddingVertical = 12.dp val EdgeToEdgeContentPadding = 8.dp ================================================ FILE: app/src/main/java/com/vanced/manager/ui/util/Screen.kt ================================================ package com.vanced.manager.ui.util import androidx.annotation.StringRes import com.vanced.manager.R import com.vanced.manager.domain.model.InstallationOption sealed class Screen( val route: String, @StringRes val displayName: Int, ) { object Home : Screen( route = "home", displayName = R.string.app_name ) object Settings : Screen( route = "settings", displayName = R.string.toolbar_settings, ) object About : Screen( route = "about", displayName = R.string.toolbar_about, ) object Logs : Screen( route = "logs", displayName = R.string.toolbar_logs, ) data class Configuration( val appName: String, val appVersions: List?, val appInstallationOptions: List ) : Screen( route = "installpreferences", displayName = R.string.toolbar_installation_preferences ) data class Install( val appName: String, val appVersions: List? ) : Screen( route = "install", displayName = R.string.toolbar_install ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/viewmodel/ConfigurationViewModel.kt ================================================ package com.vanced.manager.ui.viewmodel import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel class ConfigurationViewModel : ViewModel() { var currentIndex by mutableStateOf(0) private set fun next() { currentIndex++ } fun back() { currentIndex-- } fun reset() { currentIndex = 0 } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/viewmodel/InstallViewModel.kt ================================================ package com.vanced.manager.ui.viewmodel import android.content.pm.PackageInstaller import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.vanced.manager.downloader.base.AppDownloader import com.vanced.manager.downloader.impl.MicrogDownloader import com.vanced.manager.downloader.impl.MusicDownloader import com.vanced.manager.downloader.impl.VancedDownloader import com.vanced.manager.installer.impl.MicrogInstaller import com.vanced.manager.installer.impl.MusicInstaller import com.vanced.manager.installer.impl.VancedInstaller import com.vanced.manager.network.util.MICROG_NAME import com.vanced.manager.network.util.MUSIC_NAME import com.vanced.manager.network.util.VANCED_NAME import com.vanced.manager.preferences.holder.managerVariantPref import com.vanced.manager.repository.manager.PackageManagerResult import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class InstallViewModel( private val vancedDownloader: VancedDownloader, private val musicDownloader: MusicDownloader, private val microgDownloader: MicrogDownloader, private val vancedInstaller: VancedInstaller, private val musicInstaller: MusicInstaller, private val microgInstaller: MicrogInstaller, ) : ViewModel() { private val isRoot get() = managerVariantPref == "root" sealed class Log { data class Info(val infoText: String) : Log() data class Success(val successText: String) : Log() data class Error( val displayText: String, val stacktrace: String, ) : Log() } sealed class Status { object Idle : Status() object Installing : Status() object Installed : Status() object Failure : Status() data class Progress(val progress: Float) : Status() } val logs = mutableStateListOf() var status by mutableStateOf(Status.Idle) private set //TODO Move to WorkManager fun startAppProcess( appName: String, appVersions: List? ) { viewModelScope.launch(Dispatchers.IO) { downloadApp(appName, appVersions) } } fun postInstallStatus(pmStatus: Int, extra: String) { if (pmStatus == PackageInstaller.STATUS_SUCCESS) { status = Status.Installed log(Log.Success("Successfully installed")) } else { status = Status.Failure log(Log.Error("Failed to install app", extra)) } } fun clear() { logs.clear() status = Status.Idle } private suspend fun downloadApp( appName: String, appVersions: List?, ) { val downloader = getDownloader(appName) val onProgress: (Float) -> Unit = { progress -> status = Status.Progress(progress / 100) } val onFile: (String) -> Unit = { file -> log(Log.Info("Downloading $file")) } val download = if (isRoot) downloader.downloadRoot(appVersions, onProgress, onFile) else downloader.download(appVersions, onProgress, onFile) when (download) { is AppDownloader.DownloadStatus.Success -> { log(Log.Success("Successfully downloaded $appName")) installApp(appName, appVersions) } is AppDownloader.DownloadStatus.Error -> { log( Log.Error( displayText = "Failed to download ${download.fileName}", stacktrace = download.error ) ) } } } private suspend fun installApp( appName: String, appVersions: List?, ) { val installer = getInstaller(appName) status = Status.Installing if (isRoot) { when (val installStatus = installer.installRoot(appVersions)) { is PackageManagerResult.Success -> { status = Status.Installed log(Log.Success("Successfully installed")) } is PackageManagerResult.Error -> { status = Status.Failure log(Log.Error("Failed to install app", installStatus.message)) } } } else { installer.install(appVersions) } } private fun getDownloader( appName: String ) = when (appName) { VANCED_NAME -> vancedDownloader MUSIC_NAME -> musicDownloader MICROG_NAME -> microgDownloader else -> throw IllegalArgumentException("$appName is not a valid app") } private fun getInstaller( appName: String ) = when (appName) { VANCED_NAME -> vancedInstaller MUSIC_NAME -> musicInstaller MICROG_NAME -> microgInstaller else -> throw IllegalArgumentException("$appName is not a valid app") } private fun log(data: Log) { logs.add(data) } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt ================================================ package com.vanced.manager.ui.viewmodel import android.app.Application import android.content.ComponentName import android.content.Intent import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.vanced.manager.domain.model.App import com.vanced.manager.installer.util.PM import com.vanced.manager.repository.AppRepository import com.vanced.manager.repository.ManagerMode import com.vanced.manager.repository.PreferenceRepository import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope import retrofit2.HttpException class MainViewModel( private val appRepository: AppRepository, private val preferenceRepository: PreferenceRepository, private val app: Application, ) : AndroidViewModel(app) { var appMode by mutableStateOf(preferenceRepository.managerMode) var appTheme by mutableStateOf(preferenceRepository.managerTheme) private val appCount get() = when (appMode) { ManagerMode.ROOT -> 2 ManagerMode.NONROOT -> 3 } var appState by mutableStateOf(ManagerState.Fetching(appCount)) private set fun fetch() { viewModelScope.launch { try { supervisorScope { appState = ManagerState.Fetching(appCount) when (appMode) { ManagerMode.ROOT -> { appState = ManagerState.Success( apps = listOf( async { appRepository.getVancedYoutubeRoot() }, async { appRepository.getVancedYoutubeMusicRoot() } ).awaitAll() ) } ManagerMode.NONROOT -> { appState = ManagerState.Success( apps = listOf( async { appRepository.getVancedYoutubeNonroot() }, async { appRepository.getVancedYoutubeMusicNonroot() }, async { appRepository.getVancedMicrog() } ).awaitAll() ) } } } } catch (e: HttpException) { appState = ManagerState.Error(e.message()) } catch (e: Exception) { appState = ManagerState.Error(e.toString()) } } } fun launchApp( packageName: String, launchActivity: String ) { val component = ComponentName(packageName, launchActivity) val intent = Intent().apply { setComponent(component) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } app.startActivity(intent) } //TODO implement root uninstallation fun uninstallApp( appPackage: String, ) { PM.uninstallPackage(appPackage, app) } } sealed class ManagerState { data class Fetching(val placeholderAppsCount: Int) : ManagerState() data class Success(val apps: List) : ManagerState() data class Error(val error: String) : ManagerState() val isFetching get() = this is Fetching val isSuccess get() = this is Success val isError get() = this is Error } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/viewmodel/SettingsViewModel.kt ================================================ package com.vanced.manager.ui.viewmodel import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import com.vanced.manager.R import com.vanced.manager.repository.ManagerMode import com.vanced.manager.repository.ManagerTheme import com.vanced.manager.repository.PreferenceRepository class SettingsViewModel( private val preferenceRepository: PreferenceRepository ) : ViewModel() { var managerUseCustomTabs by mutableStateOf(preferenceRepository.managerUseCustomTabs) private set var managerMode by mutableStateOf(preferenceRepository.managerMode) private set var managerTheme by mutableStateOf(preferenceRepository.managerTheme) private set fun saveManagerUseCustomTabs(value: Boolean) { managerUseCustomTabs = value preferenceRepository.managerUseCustomTabs = value } fun saveManagerMode(value: ManagerMode) { managerMode = value preferenceRepository.managerMode = value } fun saveManagerTheme(value: ManagerTheme) { managerTheme = value preferenceRepository.managerTheme = value } fun getThemeStringId(value: ManagerTheme): Int { return when (value) { ManagerTheme.DARK -> R.string.settings_preference_theme_dark ManagerTheme.LIGHT -> R.string.settings_preference_theme_light else -> R.string.settings_option_system_default } } } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/widget/AppCard.kt ================================================ package com.vanced.manager.ui.widget import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.rounded.DeleteForever import androidx.compose.material.icons.rounded.GetApp import androidx.compose.material.icons.rounded.Launch import androidx.compose.material.icons.rounded.Update import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.google.accompanist.placeholder.PlaceholderHighlight import com.google.accompanist.placeholder.placeholder import com.google.accompanist.placeholder.shimmer import com.vanced.manager.R import com.vanced.manager.domain.model.AppState import com.vanced.manager.ui.component.ManagerElevatedCard import com.vanced.manager.ui.component.ManagerListItem import com.vanced.manager.ui.component.ManagerText import com.vanced.manager.ui.theme.LargeShape import com.vanced.manager.ui.theme.MediumShape import com.vanced.manager.ui.theme.SmallShape import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.DefaultContentPaddingVertical @Composable fun AppCard( appName: String, appIcon: Painter, appInstalledVersion: String?, appRemoteVersion: String?, appState: AppState, onAppDownloadClick: () -> Unit, onAppUninstallClick: () -> Unit, onAppLaunchClick: () -> Unit, onAppInfoClick: () -> Unit, modifier: Modifier = Modifier, ) { BaseAppCard( modifier = modifier, appTitle = { ManagerText( modifier = Modifier.fillMaxSize(), text = appName, textStyle = MaterialTheme.typography.titleMedium ) }, appIcon = { Image( modifier = Modifier.size(48.dp), painter = appIcon, contentDescription = "App Icon", ) }, appTrailing = { IconButton(onClick = onAppInfoClick) { Icon( imageVector = Icons.Outlined.Info, contentDescription = "App Info" ) } }, appVersionsColumn = { ManagerText( text = stringResource( id = R.string.app_version_latest, appRemoteVersion ?: stringResource( id = R.string.app_content_unavailable ) ) ) ManagerText( text = stringResource( id = R.string.app_version_installed, appInstalledVersion ?: stringResource( id = R.string.app_content_unavailable ) ) ) }, appActionsRow = { if (appInstalledVersion != null) { IconButton(onClick = onAppUninstallClick) { Icon( imageVector = Icons.Rounded.DeleteForever, contentDescription = "Uninstall" ) } IconButton(onClick = onAppLaunchClick) { Icon( imageVector = Icons.Rounded.Launch, contentDescription = "Launch", ) } } IconButton(onClick = onAppDownloadClick) { when (appState) { AppState.NOT_INSTALLED -> { Icon( imageVector = Icons.Rounded.GetApp, contentDescription = "Install", ) } AppState.INSTALLED -> { Icon( imageVector = Icons.Rounded.GetApp, contentDescription = "Install", ) } AppState.NEEDS_UPDATE -> { Icon( imageVector = Icons.Rounded.Update, contentDescription = "Update", ) } } } } ) } @Composable fun AppCardPlaceholder( modifier: Modifier = Modifier ) { BaseAppCard( modifier = modifier, appTitle = { ManagerText( modifier = Modifier .managerPlaceholder( visible = true, shape = MediumShape ), text = " ".repeat(40), textStyle = MaterialTheme.typography.titleMedium ) }, appIcon = { Box( modifier = Modifier .managerPlaceholder( visible = true, shape = RoundedCornerShape(24.dp) ) .size(48.dp) ) }, appTrailing = { Box( modifier = Modifier .managerPlaceholder( visible = true, shape = MediumShape ) .size(24.dp) ) }, appVersionsColumn = { ManagerText( modifier = Modifier .managerPlaceholder( visible = true, shape = SmallShape ), text = " ".repeat(30) ) ManagerText( modifier = Modifier .managerPlaceholder( visible = true, shape = SmallShape ), text = " ".repeat(30) ) }, appActionsRow = { Box( modifier = Modifier .fillMaxWidth(0.8f) .height(36.dp) .managerPlaceholder( visible = true, shape = MediumShape ) ) } ) } @Composable private fun BaseAppCard( appTitle: @Composable () -> Unit, appIcon: @Composable () -> Unit, appTrailing: @Composable () -> Unit, appVersionsColumn: @Composable ColumnScope.() -> Unit, appActionsRow: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier ) { ManagerElevatedCard( modifier = modifier, shape = LargeShape, ) { Column( modifier = Modifier .fillMaxWidth() .padding( horizontal = DefaultContentPaddingHorizontal, vertical = DefaultContentPaddingVertical ), verticalArrangement = Arrangement .spacedBy(DefaultContentPaddingVertical) ) { ManagerListItem( modifier = Modifier.fillMaxWidth(), title = appTitle, icon = appIcon, trailing = appTrailing ) Divider( modifier = Modifier .fillMaxWidth() .clip(LargeShape), thickness = 2.dp, ) Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Column( verticalArrangement = Arrangement.spacedBy(4.dp), horizontalAlignment = Alignment.Start ) { ManagerText( text = stringResource(id = R.string.app_versions), textStyle = MaterialTheme.typography.bodyMedium ) ProvideTextStyle(value = MaterialTheme.typography.bodySmall) { appVersionsColumn() } } Row( modifier = Modifier.wrapContentWidth(), content = appActionsRow, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.End ) } } } } private fun Modifier.managerPlaceholder( visible: Boolean, shape: Shape ) = composed { placeholder( visible = visible, shape = shape, color = MaterialTheme.colorScheme.surfaceVariant, highlight = PlaceholderHighlight.shimmer( highlightColor = MaterialTheme.colorScheme.onSurfaceVariant ) ) } ================================================ FILE: app/src/main/java/com/vanced/manager/ui/widget/LinkCard.kt ================================================ package com.vanced.manager.ui.widget import android.net.Uri import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.layout.* import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.vanced.manager.ui.component.ManagerElevatedCard import com.vanced.manager.ui.component.ManagerText import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal import com.vanced.manager.ui.util.DefaultContentPaddingVertical import org.koin.androidx.compose.inject //TODO this composable should not handle opening links @Composable fun LinkCard( text: String, icon: Painter, url: String, modifier: Modifier = Modifier ) { val context = LocalContext.current val customTabs: CustomTabsIntent by inject() val uri = remember { Uri.parse(url) } ManagerElevatedCard( modifier = modifier .height(100.dp) .widthIn(min = 100.dp), onClick = { customTabs.launchUrl(context, uri) } ) { Box( modifier = Modifier .fillMaxSize() .padding( horizontal = DefaultContentPaddingHorizontal, vertical = DefaultContentPaddingVertical ), ) { Icon( modifier = Modifier .size(32.dp) .align(Alignment.TopStart), painter = icon, contentDescription = null, ) ManagerText( modifier = Modifier.align(Alignment.BottomStart), text = text, textStyle = MaterialTheme.typography.labelLarge ) } } } ================================================ FILE: app/src/main/java/com/vanced/manager/util/AppHelper.kt ================================================ package com.vanced.manager.util fun getLatestOrProvidedAppVersion( version: String, appVersions: List? ): String { if (appVersions == null) return version if (appVersions.contains(version)) return version return appVersions.last() } ================================================ FILE: app/src/main/java/com/vanced/manager/util/Arch.kt ================================================ package com.vanced.manager.util import android.os.Build val arch get() = when { Build.SUPPORTED_ABIS.contains("x86") -> "x86" Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a" else -> "armeabi_v7a" } ================================================ FILE: app/src/main/java/com/vanced/manager/util/Coroutines.kt ================================================ package com.vanced.manager.util import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import java.util.concurrent.Executor import kotlin.coroutines.CoroutineContext fun CoroutineContext.asExecutor(): Executor = object : Executor { private val scope = CoroutineScope(this@asExecutor) override fun execute(command: Runnable) { scope.launch { command.run() } } } ================================================ FILE: app/src/main/java/com/vanced/manager/util/IO.kt ================================================ package com.vanced.manager.util import okhttp3.ResponseBody import java.io.FileOutputStream import java.io.InputStream import java.io.OutputStream inline fun ResponseBody.writeFile( filePath: String, onProgress: (Float) -> Unit ) { byteStream().use { inputStream -> FileOutputStream(filePath).use { outputStream -> val totalBytes = contentLength() inputStream.copyTo(outputStream, 8192) { bytes -> onProgress((bytes * 100 / totalBytes).toFloat()) } } } } inline fun InputStream.copyTo( outputStream: OutputStream, bufferSize: Int, onProgress: (Long) -> Unit ) { val buffer = ByteArray(bufferSize) var bytesCopied: Long = 0 var bytes = read(buffer) while (bytes >= 0) { outputStream.write(buffer, 0, bytes) bytesCopied += bytes bytes = read(buffer) onProgress(bytesCopied) } } ================================================ FILE: app/src/main/java/com/vanced/manager/util/Safety.kt ================================================ package com.vanced.manager.util //Dear reader, welcome to HELL. //We don't kink-shame here. inline fun doubleUnionTryCatch( onCatch: (Exception) -> R, onTry: () -> R ): R { return try { onTry() } catch (e: Exception) { when (e) { is E1, is E2 -> onCatch(e) else -> throw e } } } inline fun tripleUnionTryCatch( onCatch: (Exception) -> R, onTry: () -> R ): R { return try { onTry() } catch (e: Exception) { when (e) { is E1, is E2, is E3 -> onCatch(e) else -> throw e } } } ================================================ FILE: app/src/main/java/com/vanced/manager/util/SuShell.kt ================================================ package com.vanced.manager.util import com.topjohnwu.superuser.Shell import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine val Shell.Result.outString get() = out.joinToString("\n") val Shell.Result.errString get() = err.joinToString("\n") val isMagiskInstalled get() = Shell.rootAccess() && Shell.su("magisk", "-c").exec().isSuccess suspend fun Shell.Job.await(): Shell.Result { return suspendCoroutine { continuation -> submit { continuation.resume(it) } } } class SuException(val stderrOut: String) : Exception(stderrOut) @Throws(SuException::class) suspend fun Shell.Job.awaitOutputOrThrow(): String { return suspendCoroutine { continuation -> submit { if (it.isSuccess) { continuation.resume(it.outString) } else { continuation.resumeWithException(SuException(it.errString)) } } } } ================================================ FILE: app/src/main/res/animator/fragment_enter.xml ================================================ ================================================ FILE: app/src/main/res/animator/fragment_enter_pop.xml ================================================ ================================================ FILE: app/src/main/res/animator/fragment_exit.xml ================================================ ================================================ FILE: app/src/main/res/animator/fragment_exit_pop.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_adguard.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_android_black_24dp.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_app_icon_placeholder.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_brave.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_brave_light.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_discord.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_github.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_instagram.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_launch_text.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_magisk.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_manager.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_manager_monet_icon.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_microg.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_music.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_reddit.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_round_assignment_24.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_round_close_24.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_round_done_24.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_splash.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_telegram.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_twitter.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_vanced.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_website.xml ================================================ ================================================ FILE: app/src/main/res/drawable/ic_youtube.xml ================================================ ================================================ FILE: app/src/main/res/drawable-anydpi-v24/ic_stat_name.xml ================================================ ================================================ FILE: app/src/main/res/drawable-v24/ic_launcher_foreground.xml ================================================ ================================================ FILE: app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml ================================================ ================================================ FILE: app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml ================================================ ================================================ FILE: app/src/main/res/values/arrays.xml ================================================ ================================================ FILE: app/src/main/res/values/attrs.xml ================================================ ================================================ FILE: app/src/main/res/values/colors.xml ================================================ #673AB7 #FB542B #7289DA #1DA1F2 #0088cc #FF4500 #17191A #f7f7f7 ================================================ FILE: app/src/main/res/values/dimens.xml ================================================ 128dp ================================================ FILE: app/src/main/res/values/ic_launcher_background.xml ================================================ #171719 ================================================ FILE: app/src/main/res/values/resources.xml ================================================ Vanced Manager YouTube Vanced YouTube Music Vanced Vanced microG ================================================ FILE: app/src/main/res/values/strings.xml ================================================ DPT A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Is Your Device Rooted? Grant Root Permission Let\'s get started Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! Select Your Apps Select at least one app! Apps Social Media Support us Root access not granted Appearance Behaviour System Default Accent Color Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Receive push notifications when an update for %1$s is released %1$s Push Notifications Failed to save new time value Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues Root Script Sleep Time Dark Theme Light Theme Theme Links will open in Chrome Custom Tabs Use Chrome Custom Tabs Variant Base download URL Manager Devs Other Contributors Vanced Team Sources Source Code License Successfully saved logs Could not save logs Cancel Close Reset Save Stop! About Guide Manager Logs Settings Install Configuration Update Manager Unavailable Install Vanced microG first Install Installed: %1$s Latest: %1$s Versions Language(s) Theme Version Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Welcome Guide To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Changelog About %1$s Install Redownload Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s installation files detected! Download Downloading %1$s Please do NOT exit the app during this process! Uninstall Are you sure you want to uninstall %1$s ? Choose your preferred language(s) for %1$s Black Dark Choose your preferred theme for %1$s Latest Choose your preferred version for %1$s Checking for updates… Manager Update Center No new updates Download Info Launch Reinstall Uninstall Update Details Error Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values/themes.xml ================================================ ================================================ FILE: app/src/main/res/values-af-rZA/strings.xml ================================================ What is your favourite song Maak toe A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Herstel Stoor Select Your Apps Oor Guide Manager Logs Settings Update Manager Is Your Device Rooted? Grant Root Permission Let\'s get started Select at least one app! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s Install Latest: Install Vanced microG first Root access not granted Social Media Support us Unavailable Installed: Accent Color Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default Theme Dark Theme Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s Error Guide Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Welcome Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors Sources Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-ar-rSA/strings.xml ================================================ إلغاء إغلاق نسخة خاصة من خدمات جوجل للجوال معدة خصيصا لتطبيق ڤانسد بناءً على مشروع microG. تطبيق يوتيوب معدل مع العديد من الميزات المفيدة! ڤانسد لموسيقى يوتيوب! يلبي احتياجاتك حتى وان كان يضم ميزات اقل من ڤانسد. إعادة تعيين حفظ اختر تطبيقاتك حول دليل الاستخدام المدير السجلات الإعدادات تحديث المدير هل جهازك مروت؟ امنح صلاحيات الروت فلنبدأ اختر تطبيقاً واحداً على الأقل! لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل! حول %1$s تنزيل المعلومات تشغيل أعد التثبيت إلغاء التثبيت تحديث التطبيقات سجل التغييرات جارٍ تنزيل %1$s تثبيت الأحدث: قم بتثبيت Vanced microG أولاً لم يتم منح صلاحيات الروت وسائل التواصل الإجتماعي ادعمنا غير متاح مثبت: الألوان المظهر السلوك مسح الملفات التي تم تنزيلها تم مسح الملفات بنجاح هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال تحليلات Firebase اللغة سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم استخدم علامات تبويب مخصصة لمتصفح كروم إشعارات %1$s تلقي الإشعارات عند إصدار تحديث لـ %1$s فشل في حفظ القيمة الزمنية الجديدة Script sleep time للروت ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب الوضع الافتراضي السمة السمة الداكنة السمة الفاتحة مركز التحديث لا توجد تحديثات جديدة النوع تعذر حفظ السجل تم حفظ السجل بنجاح التفاصيل تم اكتشاف ملفات تثبيت %1$s! اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟ تفضيلات تثبيت %1$s جارٍ التحقق من وجود تحديثات… اللغة/اللغات: %1$s السمة: %1$s الإصدار: %1$s خطأ الدليل إيقاف! يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP. من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا) تحسينات MIUI مفعلة! الرجاء عدم الخروج من التطبيق أثناء هذه العملية! إعادة التنزيل تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub الإصدار مرحباً بك اختر لغتك(لغاتك) المفضلة لڤانسد الأحدث فاتح + %1$s اختر لغة واحدة على الأقل! أسود داكن مطوري المدير مساهمين آخرين المصادر فريق ڤانسد فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى. خطأ في تنزيل %1$s فشل تطبيق لون النسق الجديد فشل في الغاء تثبيت حزمة %1$s فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى. فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى. فشل التثبيت لأن المستخدم ألغى التثبيت. فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى. فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى. فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم. يرجى أيضاً إرفاق لقطة الشاشة من القائمة المتقدمة فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى. فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى. فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى. فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى. فشل التثبيت، مساحة جهازك الخالية لا تكفي. فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى. فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة. ================================================ FILE: app/src/main/res/values-az-rAZ/strings.xml ================================================ İmtina Bağla microG Layihəsi əsasında Vanced üçün təkmilləşdirilmiş özəl bir GMS tətbiqi. Çoxlu faydalı özəllikləri ilə modifikasiya edilmiş YouTube versiyası! Yenə Vanced, ancaq YouTube Msuic üçün! Nisbətən daha az özəlliyi olsa da, ehtiyaclarınızı qarşılayacaq. Sıfırla Saxla Tətbiqlərinizi Seçin Haqqında Bələdçi Menecer Qeydlər Tənzimləmələr Yeniləmə Meneceri Cihazınızda root varmı? Root İcazəsi Ver Gəlin başlayaq Ən azı bir tətbiq seçin! Root versiyasının nə olduğunu bilmirsiz ya da sadəcə istifadə etmək istəmirsiz? onda aşağıdakı göy oxa toxunun! %1$s Haqqında Download Info Launch Reinstall Uninstall Update Tətbiqlər Dəyişikliklər %1$s endirilir Quraşdır Ən son: Əvvəlcə Vanced microG-ni quraşdırın Root icazəsi verilməyib Sosial Media Bizi dəstəklə Əlçatmazdır Qurulan: Tema rəngi Görünüş Davranış Endirilmiş faylları təmizlə Fayllar uğurla təmizləndi Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir Firebase Analitikləri Dil Bağlantılar Chrome Özəl Vərəqlərində açılacaq Chrome Özəl Vərəqlərini istifadə et %1$s Ani Bildirişlər %1$s üçün yeni buraxılış olanda ani bildirişlər alın Yeni vaxt qiymətini saxlamaq olmadı Root Qoşma Gözləmə Müddəti /data/adb/service.d/app.sh kodundakı yuxu vaxtı qiymətini nizamlayın, bu qoşma xətalarını aradan qaldırmağa kömək edəcək İlkin Sistem Mövzu Tünd mövzu Açıq mövzu Menecer Yeniləmə Mərkəzi Yeniləmə yoxdur Variant Qeydləri saxlamaq olmadı Qeydlər uğurla saxlandı Təfsilatlar %1$s quraşdırma faylı aşkarlandı! Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz? %1$s Qurma Seçimləri Yeniləmələr yoxlanılır… Dil(lər): %1$s Mövzu: %1$s Versiya: %1$s Xəta Bələdçi Dayandır! Buraxılışı dayandırılan və bu tətbiq istifadə edərək yenilənə bilməyən Vanced-in Magisk/TWRP versiyasını istifadə edirsiniz. Zəhmət olmasa magisk modulunu/TWRP Vanced silici istifadə edərək silin. Vanced-i quraşdırmaq üçün tərtibatçı tənzimləmələrindən MIUI Optimallaşdırmasını sıradan çıxartmaq LAZIMDIR. (20.2.20 və ya yuxarı xiaomi.eu əsaslı ROM istifadə edirsinizsə bu xəbərdarlığı nəzərə almaya bilərsiniz) MIUI Optimizasiyaları açıqdır! Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN! Yenidən endir Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun Versiya Xoş gəlmisiniz Vanced üçün istədiyiniz dili seçin Ən son İşıqlı + %1$s Ən azı bir dil seçin! Qara Qaranlıq Menecer Tərtibatçıları Digər Dəstəkçilər Mənbələr Vanced Birliyi Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın. %1$s Yüklənərkən xəta Yeni ikinci rəngi təyin etmək alınmadı %1$s paketini silmək olmur Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın. Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın. İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu. Tətbiq əvvəlcədən quraşdırılmış bir tətbiqlə toqquşduğu üçün quraşdırılma uğursuz oldu. Vanced-in cari versiyasını silib yenidən sınayın. İstifadəçi paketi alt versiyaya keçirməyə çalışdığı üçün quraşdırılma uğursuz oldu. Stok YouTube tətbiqindən yeniləmələri silib yenidən sınayın. Bilinməyən səbəblərdən qurma alınmadı, əlavə yardım üçün Telegram və ya Discordumuza qoşulun. Xahiş olunur Qabaqcıl bölməsindən ekran görüntüsü də əlavə edin Quraşdırma faylı cihazınıza uyğun gəlmədiyi üçün quraşdırılma uğursuz oldu. Tənzimləmələrdən endirilmiş faylları təmizləyib yenidən sınayın. Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın. MIUI Optimallaşdırma fəal olduğu üçün quraşdırılma uğursuz oldu. MIUI Optimallaşdırmanı sıradan çıxarıb yenidən sınayın. Apk imza təsdiqləmə fəal olduğu üçün quraşdırılma uğursuz oldu. Apk imza təsdiqləməsini sıradan çıxarıb yenidən sınayın. Cihazda yaddaş az olduğundan qurma alınmadı. Quraşdırıcıda qara/tünd tema üçün apk faylı tapılmadı. Menecer-in tətbiq verilənlərini təmizləyib yenidən sınayın. Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı. ================================================ FILE: app/src/main/res/values-bg-rBG/strings.xml ================================================ Отказ Затвори Персонализирано внедряване на GMS за Vanced въз основа на проекта microG. Модифициран клиент за YouTube с много полезни функции! Vanced, но за YouTube Music! Относително по-малко богат на функции, но ще отговори на вашите нужди. Изчисти Запази Изберете приложения Относно Ръководство Мениджър Логове Настройки Обнови Vanced Manager Имате ли Root достъп на устройството си? Разрешете Root достъп Да започваме Изберете поне едно приложение! Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу! Относно %1$s Изтегляне Информация Стартиране Reinstall Деинсталиране Актуализиране Приложения Списък с промени Изтегляне на %1$s Инсталиране Най-нова: Инсталирайте първо Vanced microG Root достъп не е разрешен Социални медии Подкрепете ни Недостъпно Инсталиранa: Акцентиращ цвят Външен вид Поведение Изчисти изтеглените файлове Файловете са изчистени успешно Позволява ни да събираме информация за поведението на приложението и доклади за сривове Firebase анализ Език Връзките ще се отварят в персонализирани раздели на Chrome Ползвай персонализирани раздели на Chrome %1$s насочени известия Получаване на насочени известия, когато има нова версия на %1$s Неуспешно запазване на новата стойност за времето Време за заспиване на Root скрипта Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране По подразбиране за системата Тема Тъмна тема Светла тема Център за актуализации Няма актуализации Вариант Не могат да се запазят логовете Успешно запазени логове Подробности %1$s инсталационни файлове са открити! Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате? Предпочитания за инсталация на %1$s Проверка за актуализации… Език(ци): %1$s Тема: %1$s Версия: %1$s Грешка Ръководство Стоп! Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller. За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu) MIUI оптимизациите са включени! Моля, НЕ излизайте от приложението по време на този процес! Изтегли отново Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub Версия Добре дошли Изберете предпочитан(и) език(ци) за Vanced Най-нова Светла + %1$s Изберете поне един език! Черна Тъмна Разработчици Други сътрудници Източници Екип на Vanced Неуспешно`chown` APK към собственика на системата, моля опитайте отново. Грешка при изтегляне на %1$s Неуспешно задаване на акцентиращ цвят Неуспешно деинсталиране на %1$s Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак. Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново. Инсталацията е неуспешна, защото е прекратена от потребителя. Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново. Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново. Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново. Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново. Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново. Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново. Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място. Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново. Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране. ================================================ FILE: app/src/main/res/values-bn-rBD/strings.xml ================================================ বাতিল করুন বন্ধ করুন A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. পুনরায় স্থির করুন সংরক্ষণ করুন আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন সম্বন্ধে Guide ম্যানেজার Logs সেটিংস ম্যানেজার আপডেট করুন আপনার ডিভাইস কি রুটেড? রুটের অনুমতি দিন চলুন শুরু করি অন্তত একটি অ্যাপ নির্বাচন করুন! এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন! সম্পর্কিত তথ্য %1$s Download Info Launch Reinstall Uninstall Update Apps পরিবর্তন তালিকা %1$s ডাউনলোড করা হচ্ছে ইনস্টল করুন সর্বশেষ: Install Vanced microG first রুট অনুমতি দেয়া হয়নি Social Media Support us অনুপলব্ধ ইনস্টল করা আছে: অ্যাকসেন্ট রঙ চেহারা আচরণ ডাউনলোড করা ফাইলগুলি সাফ করুন সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে। ফায়ারবেস বিশ্লেষণ ভাষা লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে ক্রোম কাস্টম ট্যাবস ব্যবহার করুন %1$s পুশ বিজ্ঞপ্তি %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues সিস্টেম দ্বারা নির্ধারিত থিম গাঢ় থিম হালকা থিম ম্যানেজার আপডেট কেন্দ্র কোনো নতুন আপডেট নেই রকমফের Could not save logs Successfully saved logs Details %1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে! ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান? %1$s Installation Preferences আপডেট আছে কিনা দেখা হচ্ছে… ভাষা (গুলি):%1$s থিম: %1$s ভার্সন: %1$s ত্রুটি সহায়িকা থামো! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version স্বাগতম ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন Latest Light + %1$s Select at least one language! Black Dark পরিচালক বিকাশকারী Other Contributors সূত্রসমূহ ভান্সড দল Failed to `chown` APK to system owner, please try again. %1$s ডাউনলোড করার সময় ত্রুটি Failed to apply new accent color প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন. স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।. অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।. ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।. ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ. ================================================ FILE: app/src/main/res/values-bn-rIN/strings.xml ================================================ বাতিল করুন বন্ধ করুন মাইক্রোজি প্রকল্পের ভিত্তিতে ভ্যান্সডের জন্য একটি কাস্টম জিএমএস বাস্তবায়ন।. অনেক দরকারী বৈশিষ্ট্য সহ একটি পরিবর্তিত ইউটিউব ক্লায়েন্ট! ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য! তুলনামূলকভাবে কম বৈশিষ্ট্য সমৃদ্ধ তবে আপনার চাহিদা পূরণ করবে।. পুনরায় স্থির করুন সংরক্ষণ করুন আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন সম্বন্ধে গাইড ম্যানেজার লগস সেটিংস ম্যানেজার আপডেট করুন আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে? রুট অনুমতি মঞ্জুর করুন শুরু করা যাক অন্তত একটি অ্যাপ নির্বাচন করুন! এটি কি তা জানেন না বা রুট ভার্সনটি ব্যবহার করতে চান না? কেবল নীচের নীল তীর চিহ্নটি ক্লিক করুন! %1$s এর সম্বন্ধে ডাউনলোড তথ্য লঞ্চ করুন Reinstall আনইনস্টল আপডেট অ্যাপস পরিবর্তন নথি %1$s ডাউনলোড করা হচ্ছে ইনস্টল করুন সর্বশেষ: প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন রুট অনুমতি দেয়া হয়নি সোশ্যাল মিডিয়া আমাদের সমর্থন করুন অনুপলব্ধ ইনস্টল করা আছে: অ্যাকসেন্ট রঙ রূপ আচরণ ডাউনলোড করা ফাইলগুলি মুছে ফেলুন সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয় ফায়ারবেস তথ্য বিশ্লেষণ ভাষা লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে ক্রোম কাস্টম ট্যাবস ব্যবহার করুন %1$s পুশ বিজ্ঞপ্তিগুলি %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ হয়েছে রুট স্ক্রিপ্ট স্লিপ টাইম মাউন্টিং ইস্যু ফিক্স করার জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত স্লিপ টাইম মানটি অ্যাডজাস্ট করুন সিস্টেম দ্বারা র্নির্ধারিত থিম গাঢ় থিম হালকা থিম ম্যানেজার আপডেট কেন্দ্র কোনো নতুন আপডেট নেই বিকল্প লগগুলি সংরক্ষণ করা যায়নি সফলভাবে লগ সংরক্ষণ করা হয়েছে বিশদ ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে! %1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান? %1$s ইনস্টল করার পছন্দগুলি আপডেটের জন্য চেক করা হচ্ছে… ভাষা(গুলি): %1$s থিম: %1$s সংস্করণ: %1$s ত্রুটি সহায়িকা থামুন! আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন। ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন) MIUI অপটিমাইজেশন সক্ষম করা আছে! এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না! পুনরায় ডাউনলোড করুন নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন সংস্করণ স্বাগত ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন সর্বশেষ হাল্কা + %1$s অন্তত একটি ভাষা নির্বাচন করুন! কালো অন্ধকার ম্যানেজার বিকাশকারীরা অন্যান্য অবদানকারী উৎসগুলি ভ্যান্সড টীম System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। %1$s ডাউনলোড করার সময় ত্রুটি নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ হয়েছে %1$s পেকেজ আন‌ইনস্টল করা যাইনি ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন। স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা নেই। ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন। স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ। ================================================ FILE: app/src/main/res/values-ca-rES/strings.xml ================================================ Cancel·lar Tanca Implementació modificada de GMS per a Cancer basada en el Projecte microG. Una aplicació modificada de YouTube amb moltes característiques útils! Vanced, però per a YouTube Music! Amb relativament menys característiques, però que assoleix les vostres necessitats. Restableix Desa Seleccioneu les aplicacions Quant a Guia Gestor Registre Configuració Gestionador d\'actualitzacions Té el vostre dispositiu accés de Superusuari (\'Root\')? Concedir permís de Superusuari (\'Root\') Comencem-hi Selecciona com a mínim una aplicació! No saps què és o no vols utilitzar la versió de Superusuari (\'Root\')? Simplement clica la fletxa blava de sota! Sobre %1$s Descarrega Informació Llança Reinstall Desinstal·la Actualitza Aplicacions Registre de canvis Descarregant %1$s Instal·lar Darrera: Instal·la primer Vanced microG L\'accés arrel no s\'ha concedit Xarxes socials Dóna\'ns suport No disponible Instal·lat: Color d\'èmfasi Aparença Comportament Esborrar fitxers descarregats Fitxers netejats correctament Permet-te\'ns recollir informació sobre el rendiment de l\'aplicació i els registres d\'error Estadístiques de Firebase Llengua Els enllaços s\'obriran en pestanyes personalitzades del Chrome Utilitza pestanyes personalitzades del Chrome %1$s notificacions automàtiques Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s Error a l\'hora de guardar un nou valor de temps Temps de repòs de la seqüència de comandes de Superusuari (\'Root\') Ajusta el temps de repòs emprat a l\'script /data/adb/service.d/app.sh, útil per solventar problemes de muntatge Per defecte del sistema Tema Tema fosc Tema clar Gestor d\'actualitzacions Cap actualització Variant No s\'han pogut desar els registres Registres desats satisfactòriament Detalls Arxius d\'instal·lació de %1$s detectats! El gestionador ha trobat tots els arxius necessaris per a l\'instal·lació de %1$s. Voleu instalar-ho? Preferències d\'instal·lació de %1$s Cercant actualitzacions… Llengua(es): %1$s Tema: %1$s Versió: %1$s Error Guia Atura\'t! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Benvingut Trieu els vostres idiomes preferits per a Vanced Latest Light + %1$s Select at least one language! Black Dark Gestor de desenvolupadors Other Contributors Fonts Equip avançat Failed to `chown` APK to system owner, please try again. Error en descarregar %1$s Failed to apply new accent color Error en instal·lar el paquet %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar. La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar. La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar. La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-ckb-rIR/strings.xml ================================================ هەڵوەشاندنەوە داخستن A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. ڕێکخستنەوە پاراستن بەرنامەکانت دیاریبکە دەربارە زانیاری بەرێوەبردن تۆماری نوێکاری ڕێکخستنەکان نوێکردنەوەی بەرنامە مۆبایلەکەت ڕۆت کراوە؟ ڕێگەپێدانی ڕۆت Root دەست پێکردن لانیکەم دانەیەک دیاریبکە! ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا! دەربارەی %1$s Download Info Launch Reinstall Uninstall Update بەرنامەکان گۆڕانکارییەکان داگرتنی %1$s دامەزراندن دوایین: Install Vanced microG first ڕێگەپێدانی Root نەدراوە تۆڕە کۆمەڵایەتییەکان پشتگیریکردن بەردەست نیە دامەزرێنراو: ڕەنگی سەرەکی ڕووکار ڕێکخستن سڕینەوەی فایلە داگیراوەکان فایلەکان بەسەرکەتوویی سڕانەوە کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا Firebase شیکردنەوەی زمان بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم %1$s وەرگرتنی ئاگادارکردنەوەکان وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو ماوەی وەستاندنی سکریپتی Root Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues سیستەم ڕووکار تاریک ڕووناک ناوەندی نوێکردنەوە هیچ نوێکردنەوەیەک نیە جۆر نەتوانرا تۆمارەکە بپارێزرێت تۆمارەکە بەسەرکەوتوویی پارێزرا Details %1$s فایل دۆزرایەوە بۆ دابەزاندن! بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟ %1$s ڕێکخستنەکانی دامەزراندن پشکنین بۆ نوێکردنەوە… زمان: %1$s ڕووکار: %1$s وەشان: %1$s هەڵەیەک ڕوویدا زانیاری وەستاندن! تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) باشترکردنی MIUI چالاککراوە! Please do NOT exit the app during this process! داگرتنەوە دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە وەشان بەخێربێیت زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە دوایین ڕووناک + %1$s لانیکەم زمانێک دیاریبکە! ڕەش تاریک کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید) وەرگێڕانی کوردی - گۆران غەریب سەرچاوەکان Vanced تیمی سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە. کێشە ڕوویدا لە داگرتنی %1$s گۆڕینی ڕەنگ سەرکەوتو نەبوو سڕینەوەی %1$s سەرکەوتو نەبوو سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە. سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە. دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە. دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە. Installation failed because the device doesn\'t have enough free space. سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە. سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان. ================================================ FILE: app/src/main/res/values-cs-rCZ/strings.xml ================================================ Zrušit Zavřít Vlastní implementace GMS pro Vanced založená na projektu microG. Upravený klient YouTube se spoustou užitečných funkcí! Vanced, ale YouTube Music! Obsahuje o trochu méně funkcí, ale splní vaše potřeby. Resetovat Uložit Vyberte své aplikace O aplikaci Průvodce Manager Záznamy Nastavení Aktualizovat Manager Má vaše zařízení oprávnění root? Udělit oprávnění root Začínáme Vyberte alespoň jednu aplikaci! Nevíte, co to je, nebo nechcete používat verzi s přístupem root? V tom případě klikněte na modrou šipku níže! O aplikaci %1$s Stáhnout Informace Spustit Přeinstalovat Odinstalovat Aktualizovat Aplikace Seznam změn Stahování %1$s Nainstalovat Nejnovější: Nejprve nainstalujte Vanced microG Root přístup nebyl udělen Sociální média Podpořte nás Není k dispozici Nainstalováno: Doplňková barva Vzhled Chování Vymazat stažené soubory Vymazání souborů proběhlo úspěšně Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání Firebase analytika Jazyk Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome Používat vlastní karty prohlížeče Chrome %1$s vyskakovací oznámení Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení Nepodařilo se uložit novou hodnotu času Doba nečinnosti kořenového skriptu Upravte hodnotu doby nečinnosti použitou ve skriptu /data/adb/service.d/app.sh, která je užitečná pro opravu problémů s připojením Výchozí systémové nastavení Motiv Tmavý motiv Světlý motiv Centrum aktualizací aplikace Manager Žádné nové aktualizace Varianta Záznamy nelze uložit Záznamy byly úspěšně uloženy Podrobnosti Počet zjištěných instalačních souborů: %1$s Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat? Předvolby instalace: %1$s Kontrola aktualizací… Jazyk(y): %1$s Motiv: %1$s Verze: %1$s Chyba Průvodce Zadržte! Používáte verzi Vanced pro Magisk/TWRP, jejíž vývoj byl ukončen a kterou nelze pomocí této aplikace aktualizovat. Odstraňte ji prosím odebráním modulu Magisk použitím Vanced odinstalátoru v TWRP. Chcete‑li nainstalovat Vanced, MUSÍTE vypnout optimalizace MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM ze 20. 2. 2020 nebo novější založenou na xiaomi.eu) Optimalizace MIUI jsou zapnuty! Během tohoto procesu NEUKONČUJTE aplikaci! Stáhnout znovu Ujistěte se, že jste si aplikaci stáhli z našeho webu vancedapp.com, z našeho Vanced Discord serveru nebo z našeho GitHubu Verze Vítejte Vyberte si jeden nebo více preferovaných jazyků pro Vanced Nejnovější Světlý + %1$s Vyberte alespoň jeden jazyk! Černý Tmavý Vývojáři aplikace Manager Další přispěvatelé Zdrojové kódy Tým Vanced Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu. Chyba při stahování %1$s Nepodařilo se nastavit novou doplňkovou barvu Nepodařilo se odinstalovat balíček %1$s Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu. Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu. Instalace se nezdařila, protože uživatel přerušil instalaci. Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu. Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu. Instalace se z neznámých důvodů nezdařila. Pro další podporu se připojte k našemu Telegramu nebo Discordu. Připojte také snímek obrazovky z nabídky Pokročilé Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte v Nastavení stažené soubory a poté to zkuste znovu. Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu. Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu. Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu. Instalace se nezdařila, protože v zařízení není dostatek volného místa. Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu. Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci. ================================================ FILE: app/src/main/res/values-da-rDK/strings.xml ================================================ Annuller Luk En brugerdefineret GMS implementering for Vanced baseret på microG Project. En modificeret YouTube klient med mange nyttige funktioner! Vanced, men for YouTube Music! Relativt mindre funktionsrig men opfylder dine behov. Nulstil Gem Vælg Dine Apps Om Guide Manager Logfiler Indstillinger Opdaterings Manager Er Din Enhed Rooted? Tildel Root Tilladelse Lad os komme igang Vælg mindst én app! Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor! Om %1$s Download Info Launch Reinstall Uninstall Update Apps Ændringslog Downloader %1$s Installer Seneste: Installer først Vanced microG Root adgang ikke tildelt Sociale medier Støt os Utilgængelig Installeret: Sekundær farve Udseende Adfærd Ryd hentede filer Filer ryddet succesfuldt Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs Firebase analyse Sprog Links vil åbne i Chrome Custom Faner Brug Chrome Custom Faner %1$s Push Notifikationer Modtag push meddelelser når der er en ny opdatering til %1$s Kunne ikke gemme ny tidsværdi Root script dvale tid Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer System Standard Tema Mørkt tema Lyst tema Manager opdaterings center Ingen nye opdateringer Variant Kunne ikke gemme logfil Logfiler gemt succesfuldt Detaljer %1$s installationsfiler fundet! Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den? %1$s Installationsindstillinger Søger efter opdateringer… Sprog:%1$s Tema: %1$s Version: %1$s Fejl Vejledning Stop! Det ser ud som om du bruger Magisk/TWRP versionen af Vanced. Den er ikke længere understøttet og kan derfor ikke opdateres igennem denne app. Vær venlig at fjerne magisk modulet/brug TWRP Vanced uninstaller. For at installere Vanced er du NØDT til at slå MIUI optimering fra i udvikler indstillingerne. (Du kan ignorere denne advarsel hvis du bruger en 20.2.20 eller nyere xiaomi.eu baseret ROM) MIUI Optimering er aktiveret! Afslut venligst IKKE appen under denne proces! Hent igen Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden Version Velkommen Vælg dit fortrukne sprog til Vanced Seneste Lys + %1$s Vælg mindst ét sprog! Sort Mørk Manager udviklere Øvrige Bidragsydere Kilder Vanced holdet Kunne ikke vælge Apk til systemejer, Prøv igen. Fejl i download af %1$s Kunne ikke anvende ny accentfarve Fejlede i at fjerne pakke %1$s Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen. Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen. Installationen fejlede fordi brugeren lukkede installationen. Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen. Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen. Installation mislykkedes af ukendte årsager, kom på vores Telegram eller Discord for yderligere hjælp. Vedhæft venligst også et skærmbillede fra menuen Avanceret Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen. Installationen fejlede fordi apk filerne er beskadiget, prøv igen. Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen. Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen. Installationen mislykkedes, fordi enheden ikke har nok ledig plads. Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen. Kunne ikke finde lageret YouTube-installationsstien efter split installation. ================================================ FILE: app/src/main/res/values-de-rDE/strings.xml ================================================ Abbrechen Schließen Eine eigene GMD-Implementation für Vanced, basierend auf dem MicroG-Projekt. Ein modifizierter YouTube-Client mit vielen nützlichen Funktionen! Vanced, aber für YouTube Music! Weniger Funktionen, stillt aber deine Bedürfnisse. Zurücksetzen Speichern Wähle deine Apps Über Anleitung Manager Protokolle Einstellungen Update Manager Ist dein Gerät gerootet? Root-Berechtigung erteilen Los geht\'s Wähle mindestens eine App! Du weißt nicht was das ist, oder willst die Root-Version nicht benutzen? klicke einfach den blauen Pfeil unten an! Über %1$s Download Info Starten Neu installieren Deinstallieren Aktualisieren Anwendungen Änderungen %1$s wird heruntergeladen Installieren Neueste: Installiere zuerst Vanced MicroG Root-Zugriff nicht erteilt Soziale Medien Unterstütze uns Nicht verfügbar Installiert: Akzentfarbe Darstellung Verhalten Heruntergeladene Dateien löschen Daten erfolgreich gelöscht Dadurch können wir Informationen über die Performance der App und Absturzprotokolle sammeln Firebase-Analyse Sprache Links werden in Chrome Custom Tabs geöffnet Verwende Chrome Custom Tabs %1$s Push-Benachrichtigungen Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird Speichern des neuen Zeitwertes fehlgeschlagen Wartezeit des Root-Skriptes Anpassen des Wertes für die Ruhezeit, der im Skript /data/adb/service.d/app.sh verwendet wird, nützlich zur Behebung von Problemen beim Einbinden Systemstandard Theme Dunkles Theme Helles Theme Update Center Keine neuen Updates Variante Protokolle konnten nicht gespeichert werden Protokolle erfolgreich gespeichert Details %1$s Installationsdateien erkannt! Manager hat festgestellt, dass alle notwendigen Dateien für die Installation von %1$s gefunden wurden. Möchtest Du sie installieren? %1$s Installationsoptionen Suche nach Updates… Sprache(n): %1$s Theme: %1$s Version: %1$s Fehler Erklärung Stopp! Du benutzt die Magisk/TWRP-Version von Vanced, die nicht mehr unterstützt wird und mit dieser App nicht aktualisiert werden kann. Bitte entferne siie indem du das Magisk-Modul mit dem TWRP Vanced Uninstaller entfernst. Um Vanced installieren zu können, MÜSSEN Sie MIUI Optimierungen in den Entwickleroptionen deaktivieren. (Bitte ignorieren Sie diese Warnung, wenn Sie xiaomi.eu Roms mit der Version 20.2.20 oder höher verwenden.) MIUI Optimierungen sind aktiviert! Bitte schließen Sie die App NICHT während dieses Prozesses! Erneut herunterladen Stelle sicher, dass du die App von vancedapp.com, dem Vanced Discord Server oder dem Vanced GitHub heruntergeladen hast Version Willkommen Wählen Sie ihre bevorzugte Sprache(n) für Vanced Neueste Hell + %1$s Wähle mindestens eine Sprache aus! Schwarz Dunkel Manager-Entwickler Weitere Mitwirkende Quellen Vanced Team Fehler beim `chown` der APK zum Systembesitzer, bitte versuche es erneut. Download von %1$s fehlgeschlagen Neue Akzentfarbe konnte nicht angewendet werden Entfernen von %1$s fehlgeschlagen Die benötigten Dateien für die Installation konnten nicht gefunden werden. Laden Sie die Installationsdateien erneut herunter und versuchen Sie es erneut. Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden, bitte versuchen Sie es erneut. Installation fehlgeschlagen, da der Benutzer die Installation abgebrochen hat. Die Installation ist fehlgeschlagen, weil die App in Konflikt mit einer bereits installierten App steht. Deinstalliere die aktuell installierte Version der App und versuchen es dann erneut. Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der YouTube App und versuchen Sie es erneut. Die Installation ist aus unbekannten Gründen fehlgeschlagen. Betrete unser Telegram Chat oder Discord Server für weitere Unterstützung und halte bitte einen Screenshot aus dem erweiterten Menü bereit Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut. Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut. Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut. Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut. Installation fehlgeschlagen, da das Gerät nicht genügend freien Speicherplatz hat. Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut. Fehler beim Auffinden des YouTube-Installationspfades nach der geteilten Installation. ================================================ FILE: app/src/main/res/values-el-rGR/strings.xml ================================================ Ακύρωση Κλείσιμο Μια πειραγμένη εκδοχή των GMS (υπηρεσιών κινητής της Google) για το Vanced βασισμένη στο έργο του microG. Μια πειραγμένη εφαρμογή του YouTube με πολλά χρήσιμα χαρακτηριστικά! Vanced, αλλά για το YouTube Music! Λιγότερο πλούσιο σε χαρακτηριστικά αλλά καλύπτει τις ανάγκες σας. Επαναφορά Αποθήκευση Επιλέξτε τις εφαρμογές σας Πληροφορίες Οδηγός για το Vanced Διαχειριστής Vanced Αρχείο καταγραφής σφαλμάτων Ρυθμίσεις Ενημέρωση Διαχειριστή Vanced Έχετε πρόσβαση Root στη συσκευή σας; Χορήγηση Άδειας Root Ας ξεκινήσουμε Επιλέξτε τουλάχιστον μια εφαρμογή! Δεν ξέρετε τι είναι αυτό ή δεν θέλετε να χρησιμοποιήσετε την έκδοση root; Τότε απλώς πατήστε το μπλε βέλος παρακάτω! Σχετικά με το %1$s Λήψη Πληροφορίες Εκκίνηση Επανεγκατάσταση Απεγκατάσταση Ενημέρωση Εφαρμογές Αρχείο καταγραφής αλλαγών Λήψη %1$s Εγκατάσταση Τελευταία έκδοση: Εγκαταστήστε πρώτα το Vanced microG Δεν επιτράπηκε η πρόσβαση Root Μέσα Κοινωνικής Δικτύωσης Υποστηρίξτε μας Μη διαθέσιμο Εγκατεστημένη έκδοση: Χρώμα Διεπαφής Εμφάνιση Συμπεριφορά Εκκαθάριση ληφθέντων αρχείων Επιτυχής εκκαθάριση αρχείων Αυτό μας επιτρέπει να συλλέγουμε πληροφορίες σχετικά με την επίδοση της εφαρμογής και σχετικά με καταγραφές σφαλμάτων λογισμικού Firebase Analytics Γλώσσα Οι σύνδεσμοι θα ανοίγουν σε προσαρμοσμένες καρτέλες chrome Χρήση προσαρμοσμένων καρτέλων Chrome Ειδοποιήσεις Push για το %1$s Λάβεται ειδοποιήσεις push όταν υπάρχουν διαθέσιμες ενημερώσεις για το %1$s Αποτυχία αποθήκευσης νέας τιμής χρόνου Σενάριο Χρόνου Αδράνειας Root Ρυθμίστε στην τιμη του χρόνου αδράνειας που βρίσκετε στο αρχείο σενάριο /data/adb/service.d/app.sh, χρήσιμο για επιδιόρθωση προβλημάτων προσάρτησης Προεπιλογή Συστήματος Θέμα Σκουρόχρωμο Θέμα Ανοιχτόχρωμο Θέμα Κέντρο ενημερώσεων Δεν υπάρχουν νέες ενημερώσεις Παραλλαγή Αδυναμία αποθήκευσης αρχείου καταγραφής σφαλμάτων Επιτυχής αποθήκευση αρχείου καταγραφής σφαλμάτων Πληροφορίες Ανιχνεύτηκαν τα αρχεία εγκατάστασης του %1$s! Ο Διαχειριστής του Vanced ανίχνευσε ότι βρέθηκαν όλα τα απαραίτητα αρχεία για την εγκατάσταση του %1$s. Θέλετε να εγκατασταθεί; Προτιμήσεις Εγκατάστασης του %1$s Έλεγχος για ενημερώσεις… Γλώσσα(/ες): %1$s Θέμα: %1$s Έκδοση: %1$s Σφάλμα Οδηγίες Σταματήστε! Χρησιμοποιείτε την έκδοση Magisk/TWRP του Vanced, η οποία δεν υποστηρίζεται πλέον και δεν μπορεί να ενημερωθεί μέσω αυτής της εφαρμογής. Παρακαλούμε αφαιρέστε αυτή την έκδοση αφαιρώντας το Magisk Module/χρησιμοποιόντας το πρόγραμμα κατάργησης TWRP Vanced. Για να εγκαταστήσετε το Vanced, ΠΡΕΠΕΙ να απενεργοποιήσετε τις Βελτιστοποιήσεις MIUI στις ρυθμίσεις για προγραμματιστές. (Μπορείτε να αγνοήσετε αυτή την προειδοποίηση αν χρησιμοποιείτε την έκδοση ROM 20.2.20 ή μεταγενέστερη, βάσει του xiaomi.eu) Η βελτιστοποίηση MIUI είναι ενεργή! Παρακαλώ ΜΗΝ βγείτε από την εφαρμογή κατά τη διάρκεια αυτής της διαδικασίας! Επανάληψη λήψης Βεβαιωθείτε ότι κάνατε λήψη της εφαρμογής από το vancedapp.com, τον διακομιστή Discord του Vanced ή το GitHub του Vanced Έκδοση Καλώς ορίσατε Επιλέξτε την(/ις) γλώσσα(/ες) που επιθυμείτε για το Vanced Τελευταία Ανοιχτόχρωμο + %1$s Επιλέξτε τουλάχιστον μια γλώσσα! Μαύρο Σκουρόχρωμο Προγραμματιστές Διαχειριστή Vanced Άλλοι Συνεισφέροντες Πηγές Η ομάδα του Vanced Αποτυχία παραχώρησης ιδιοκτησίας του APK στον κάτοχο συστήματος, παρακαλούμε προσπαθείστε ξανά. Σφάλμα λήψης του %1$s Αδυναμία εφαρμογής χρώματος διεπαφής Αποτυχία απεγκατάστασης πακέτου %1$s Αδυναμία εντοπισμού των απαιτούμενων αρχείων για την εγκατάσταση. Κατεβάστε τα αρχεία εγκατάστασης, και προσπαθήστε ξανά. Αδυναμία εντοπισμού του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος στον αποθηκευτικό χώρο, παρακαλώ προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι ο χρήστης ακύρωσε την εγκατάσταση. Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Κάντε απεγκατάσταση την τρέχουσα έκδοση της εφαρμογής, και μετά προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Απεγκαταστήστε τις ενημερώσεις της αρχικής εφαρμογής YouTube, στη συνέχεια προσπαθήστε ξανά. Η εγκατάσταση απέτυχε για άγνωστους λόγους, μπείτε στο Telegram ή στο Discord μας για περαιτέρω υποστήριξη. Παρακαλώ επισυνάψτε ένα στιγμιότυπο οθόνης από τις επιλογές για προχωρημένους Η εγκατάσταση απέτυχε διότι το αρχείο εγκατάστασης είναι μη συμβατό με την συσκευή σας. Κάντε εκκαθάριση των ληφθέντων αρχείων στις ρυθμίσεις, στην συνέχεια προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι τα αρχεία apk έχουν διαφθαρεί, παρακαλώ προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι η βελτιστοποίηση MIUI είναι ενεργή. Απενεργοποιήστε την βελτιστοποίηση MIUI, και προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι η επαλήθευση υπογραφής των apk είναι ενεργή. Απενεργοποιήστε την επαλήθευση υπογραφής apk, στην συνέχεια προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή σας. Αδυναμία εύρεσης του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος από το πρόγραμμα εγκατάστασης. Κάνετε εκκαθάριση των δεδομένων του διαχειριστή Vanced, στην συνέχεια προσπαθήστε ξανά. Αδυναμία εύρεσης της διαδρομής εγκατάστασης της αρχικής εφαρμογής YouTube μετά από εγκατάσταση σε τεμάχια. ================================================ FILE: app/src/main/res/values-es-rES/strings.xml ================================================ Cancelar Cerrar Una implementación de GMS personalizada para Vanced basada en el proyecto microG. ¡Un cliente de YouTube modificado con muchas características útiles! Vanced, pero para YouTube Music! Tiene relativamente menos características, pero satisface tus necesidades. Restablecer Guardar Selecciona tus aplicaciones Información Guía Manager Registros Ajustes Actualizar Manager ¿Su dispositivo está rooteado? Otorgar permiso root Comencemos ¡Seleccione al menos una aplicación! ¿No sabes que es esto o no quieres usar la versión root? ¡Haz clic en la flecha azul de abajo! Acerca de %1$s Descargar Info Iniciar Reinstalar Desinstalar Actualizar Apps Historial de actualizaciones Descargando %1$s Instalar Más reciente: Primero, instala Vanced microG Acceso root no concedido Redes Sociales Apóyanos No Disponible Instalado: Color de Acento Apariencia Comportamiento Limpiar archivos descargados Archivos limpiados exitosamente Esto nos permite recopilar información sobre el rendimiento de la aplicación y los registros de errores Analíticas de Firebase Idioma Links serán abiertos en Chrome Custom Tabs Usar Chrome Custom Tabs Notificaciones push de %1$s Recibir notificaciones push cuando una actualización para %1$s sea lanzada Error al guardar el nuevo valor de tiempo Tiempo de reposo de la secuencia de comandos de la raíz Ajustar el valor de tiempo de reposo en el script /data/adb/service.d/app.sh, útil para arreglar problemas de montaje Predeterminado del sistema Tema Tema Oscuro Tema Claro Centro de Actualizaciones Sin actualizaciónes nuevas Variante No se pudieron guardar los registros Registros guardados con éxito Detalles ¡%1$s archivos de instalación detectados! El Manager detectó que todos los archivos necesarios para la instalación de %1$s se encontraron. ¿Quieres instalarlo? %1$s Preferencias de instalación Buscando actualizaciones… Idioma(s): %1$s Tema: %1$s Versión: %1$s Error Guía ¡Detente! Estás usando la versión Magisk/TWRP de Vanced, la cual está descontinuada y no puede ser actualizada usando esta aplicación. Por favor, remuevala eliminando el módulo Magisk o usando el desinstalador TWRP Vanced. Para instalar Vanced, DEBES desabilitar las optimizaciones MIUI en las opciones de desarrollador. (Puedes ignorar esta advertencia si estás usando un ROM basado en xiaomi.eu 20.2.20 o posterior) ¡Optimizaciones MIUI habilitadas! ¡Por favor, NO salga de la aplicación durante este proceso! Volver a descargar Asegúrate de haber descargado la app desde vancedapp.com, el grupo de Discord de Vanced, o el GitHub de Vanced Versión Bienvenido Elige tu(s) idioma(s) preferido(s) para Vanced Más reciente Claro + %1$s ¡Seleccione al menos un idioma! Negro Oscuro Desarrolladores del Manager Otros colaboradores Fuentes Equipo Vanced Fallo al ejecutar `chown` al propietario del sistema, por favor inténtalo de nuevo. Error al descargar %1$s Falla al aplicar el nuevo color de acento Falla al desinstalar paquete %1$s Falla al localizar los archivos necesarios para la instalación. Vuelva a descargar los archivos de instalación y vuelva a intentarlo. Falla al localizar en el almacenamiento el archivo apk para el tema negro/oscuro, por favor intente otra vez. La instalación ha fallado debido a que el usuario ha abortado la instalación. La instalación ha fallado porque la aplicación entra en conflicto con una aplicación ya instalada. Desinstala la versión actual de la aplicación y vuelve a intentarlo. La instalación falló porque el usuario trató de degradar el paquete. Desinstala las actualizaciones de la aplicación original e intenta de nuevo. La instalación ha fallado por razones desconocidas, únete a nuestro Telegram o Discord para más soporte. Por favor, también adjunta una captura de pantalla desde el menú Avanzado La instalación ha fallado porque el archivo de instalación es incompatible con tu dispositivo. Limpia los archivos descargados en la ajustes y vuelve a intentarlo. La instalación falló porque los archivos apk están corruptos, por favor inténtalo de nuevo. La instalación ha fallado porque la Optimización MIUI está activada. Desactiva la optimización MIUI y vuelva a intentarlo. La instalación ha fallado porque la verificación de firmas de apk está habilitada. Desactiva la verificación de la firmas de apk, y vuelve a intentarlo. La instalación falló porque el dispositivo no tiene suficiente espacio libre. Falla al encontrar en el instalador el archivo apk para el tema negro/oscuro. Limpia los datos del Manager y vuelva a intentarlo. Falla al localizar la ruta de instalación de YouTube después de la instalación split. ================================================ FILE: app/src/main/res/values-et-rEE/strings.xml ================================================ Katkesta Sulge A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Lähtesta Salvesta Valige Oma Rakendused Teave Juhend Haldur Logid Seaded Uuenduste Haldur Kas teie seade on juuritud? Anna juurluba Alustame Vali vähemalt üks rakendus! Kas te ei tea mis see on, või ei soovi kasutada rooditud versiooni? vajutage allpool sinist noolt! Umbes %1$s Download Info Launch Reinstall Uninstall Update Rakendused Muudatuste logi Allalaadimine %1$s Installi Uusim: Installi Vanced MicroG esimesena Administraatoriõigusi ei tagatud Sotsiaalmeedia Toetage meid Pole saadaval Installitud: Rõhuvärv Välimus Käitumine Tühjenda allalaaditud failid Failid on edukalt puhastatud See lubab meil koguda informatsiooni äpi jõudluse ja rikkelogi kohta Firebase Analytics Keel Lingid avatakse Chrome kohandatud vahekaartides Kasuta Chrome kohandatud vahekaarte %1$s Hüpikteated Saa hüpikteateid kui %1$s uuendus on saadaval Aja uue väärtuse salvestamine ebaõnnestus Uneaja skript Reguleerige uneaja väärtust, mis on kasutatav /data/adb/service.d/app.sh skriptis, see on kasulik paigaldusprobleemide parandamiseks Süsteemi vaikimisi Kujundus Tume Kujundus Hele Kujundus Halduri värskenduskeskus Uusi uuendusi ei ole Variant Ei suutnud salvestada logi Edukalt salvestatud logid Üksikasjad %1$s paigaldusfailid on leitud! Haldur tuvastas, et kõik failid paigaldamaks %1$s on leitud. Kas soovite seda paigaldada? %1$s Paigalduseelistused Uuenduste otsimine… Keel(ed): %1$s Kujundus: %1$s Versioon: %1$s Viga Juhend Peata! Te kasutate Vanced Magisk/TWRP versiooni, mis on katkestatud, ning seda ei saa uuendada kasutades seda äppi. Palun eemaldage Magisk moodul kasutades TWRP Vanced eemaldajat. Et paigaldada Vanced, PEAB keelama MIUI optimiseerimise arendaja valikute alt. (Võite seda igroneerida kui kasutate 20.2.20 või uuemat xiaomi.eu põhist ROMi) MIUI optimiseerimine on lubatud! Palun ärge väljuge rakendusest protsessi ajal! Lae uuesti alla Veenduge, et laadisite rakenduse alla vancedapp.com, Vanced Discordi serverist või Vanced GitHubist Versioon Tere tulemast Valige eelistatud keel(ed) Vanced jaoks Uusim Hele + %1$s Vali vähemalt üks keel! Must Tume Halduri arendajad Teised kaastöötajad Allikad Vanced Meeskond APK edastamine süsteemi omanikule ebaõnnestus, proovige uuesti. Viga allalaadimisel %1$s Uue rõhuvärvi rakendamine ebaõnnestus Paketi %1$s eemaldamine ebaõnnestus Paigalduseks vajalike failide leidmine ebaõnnestus. Laadige paigaldusfailid uuesti alla ja proovige uuesti. Apk faili musta/tumeda teema jaoks leidmine ebaõnnestus, proovige palun uuesti. Paigaldamine ebaõnnestus kuna kasutaja katkestas selle. Paigaldamine ebaõnnestus, kuna tekkis konflikt olemasoleva versiooniga. Eemaldage praegune rakenduse versioon, ning proovige uuesti. Paigaldamine ebaõnnestus kuna kasutaja proovis paketti madalamale versioonile üle viia. Eemaldage värskendused originaalrakendusest ja proovige uuesti. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Paigaldamine ebaõnnestus, kuna paigaldusfail ei sobitu teie seadmega. Puhastage allalaaditud failid seadete alt, ning proovige uuesti. Paigaldamine ebaõnnestus kuna apk failid on vigased, palun proovige uuesti. Paigaldamine ebaõnnestus, kuna MIUI optimiseerimine on lubatud. Keelake MIUI optimiseerimine ja proovige uuesti. Paigaldamine ebaõnnestus kuna apk-allkirja kontrollimine on lubatud. Keelake apk allkirja kinnitamine ja proovige uuesti. Installimist ei saadud viia lõpule kuna seadmes pole piisvalt vaba ruumi. Apk faili musta/tumeda teema jaoks leidmine paigaldajast ebaõnnestus. Puhastage halduri rakenduse andmed ja proovige uuesti. Pärast jagatud paigaldamist ei õnnestunud leida originaal YouTube\'i paigaldus asukohta. ================================================ FILE: app/src/main/res/values-fi-rFI/strings.xml ================================================ Peruuta Sulje Mukautettu GMS-Toteutus Vancedille perustuen microG projektiin. Muokattu YouTube-sovellus, jossa on monia hyödyllisiä ominaisuuksia! Vanced, mutta YouTube Musicille! Suhteellisen vähemmän ominaisuuksia, mutta täyttää tarpeesi. Palauta Tallenna Valitse Sovelluksesi Tietoja Opas Manager Lokit Asetukset Päivitä hallintasovellus Onko laitteesi rootattu? Anna root-oikeudet Aloitetaan Valitse ainakin yksi sovellus! Etkö tiedä mikä tämä on tai etkö halua käyttää rootattua versiota? Klikkaa alla olevaa sinistä nuolta! %1$s-tietoja Download Info Launch Reinstall Uninstall Update Sovellukset Muutoshistoria Ladataan %1$s Asenna Uusin: Asenna Vanced microG ensin Pääkäyttäjän oikeuksia ei ole annettu Sosiaalinen media Tue meitä Ei saatavilla Asennettu: Aksenttiväri Ulkoasu Käyttäytyminen Tyhjennä ladatut tiedostot Tiedostot tyhjennettiin onnistuneesti Tämän avulla voimme kerätä tietoa sovelluksen suorituskyvystä ja kaatumislokeista Firebase-analytiikka Kieli Linkit aukeavat Chromen mukautetuissa välilehdissä Käytä Chromen mukautettuja välilehtiä %1$s Push-ilmoitusta Vastaanota push-ilmoituksia, kun %1$s:lle on julkaistu päivitys Uuden ajan tallennus epäonnistui Juuren Skriptin Nukkumisaika Säädä lepoajan arvoa jota käytetään /data/adb/service.d/app.sh skriptissä, joka on hyödyllinen asennusongelmien korjaamisessa Järjestelmän oletus Teema Tumma teema Vaalea teema Managerin päivityskeskus Ei uusia päivityksiä Variaatio Lokeja ei voitu tallentaa Lokit tallennettiin onnistuneesti Lisätiedot %1$s asennustiedostoa havaittu! Hallitsija havaitsi, että kaikki tarvittavat tiedostot %1$s asennusta varten. Haluatko asentaa sen? %1$s asennusasetukset Tarkistetaan päivityksiä… Kieli: %1$s Teema: %1$s Versio: %1$s Virhe Opas Pysähdy! Käytät Magisk / TWRP versio Vanced, joka on lopetettu ja ei voi päivittää käyttämällä tätä sovellusta. Poista se poistamalla Magisk moduuli / käyttämällä TWRP Vanced asennuksen. Asentaaksesi Vancedin, sinun täytyy poistaa MIUI-optimisaatiot käytöstä kehittäjäasetuksista. (Voit ohittaa tämän varoituksen, jos käytät versiota 20.2.20 tai uudempaa xiaomi.eu-pohjaista ROM:ia) MIUI-optimoinnit ovat käytössä! ÄLÄ poistu sovelluksesta tämän prosessin aikana! Uudelleenlataa Varmista, että latasit sovelluksen osoitteesta vancedapp.com, Vanced Discord-palvelin tai Vanced GitHub Versio Tervetuloa Valitse Vancedille haluamasi kieli tai kielet Uusin Vaalea + %1$s Valitse ainakin yksi kieli! Musta Tumma Managerin kehittäjät Muut avustajat Lähdekoodi Vanced kehitystiimi Ei voitu `chown` APK järjestelmän omistajalle, yritä uudelleen. %1$s lataus epäonnistui Uuden aksenttivärin käyttöönotto epäonnistui Paketin %1$s asennus epäonnistui Asennukseen vaadittavien tiedostojen paikannus epäonnistui. Yritä ladata asennustiedostot uudelleen. APK-tiedostoa mustalle/tummalle teemalle ei voitu paikantaa tallennustilasta, yritä uudelleen. Asennus epäonnistui, koska käyttäjä keskeytti asennuksen. Asennus epäonnistui, koska sovellus on ristiriidassa jo asennetun sovelluksen kanssa. Poista sovelluksen nykyinen versio ja yritä uudelleen. Asennus epäonnistui, koska käyttäjä yritti asentaa paketin vanhempaa versiota. Poista YouTube-sovelluksen päivitykset ja yritä sitten uudelleen. Asennus epäonnistui tuntemattomasta syystä, liity Vancedin Telegramiin tai Discordiin saadaksesi tukea. Liitä myös kuvankaappaus Lisäasetukset valikosta Asennus epäonnistui, koska asennustiedosto ei ole yhteensopiva laitteesi kanssa. Tyhjennä ladatut tiedostot asetuksista ja yritä uudelleen. Asennus epäonnistui, koska APK-tiedostot ovat vioittuneet, yritä uudelleen. Asennus epäonnistui, koska MIUI-optimointi on käytössä. Poista MIUI-optimointi käytöstä ja yritä uudelleen. Asennus epäonnistui, koska APK-allekirjoituksen vahvistus on käytössä. Poista APK-allekirjoituksen vahvistus käytöstä, ja yritä uudelleen. Asennus epäonnistui, koska laitteella ei ole tarpeeksi vapaata tilaa. APK-tiedostoa mustalle/tummalle teemalle ei löytynyt asentajalta. Tyhjennä Managerin sovellustiedot ja yritä uudelleen. Youtube-sovelluksen asennuspolkua ei voitu paikantaa jaetun asennuksen jälkeen. ================================================ FILE: app/src/main/res/values-fil-rPH/strings.xml ================================================ Kanselahin Isara Custom na Implementasyon sa GMS para sa Vanced nakabatay sa proyekto ng microG. Binagong client ng Youtube na maraming nakatutulong na features! Vanced, pero para sa Youtube Music! Hindi kasing dami ang mga features, pero natutupad ang iyong pangangailangan. I-reset I-save Piliin ang mga app Tungkol sa app Gabay Manager Mga Log Settings I-update ang Manager Naka-root ba ang device mo? Pahintulutin ang Root Magsimula na tayo Mag-marka ka kahit isa lang na app! Hindi mo alam ito o huwag gamitin ang root bersyon? I-click ang asul na arrow sa baba! Tungkol sa %1$s Download Info Launch Reinstall Uninstall Update Mga Apps Changelog Downloading %1$s I-install Bago: I-install muna ang Vanced microG Walang binigay na root access Social Media Suportahin kami Di-makukuha Naka-install: Kulay ng font Hitsura Kilos Tanggalin ang naka-download na files Natagumpayan na tanggalin ang mga files Ginagamit ito para sa pag-kolekta ng impormasyon tungkol sa pagganap at crash logs ng app Firebase Analitiko Wika Mabubuksan ang mga links sa Chrome Custom Tabs Gamitin ang Chrome Custom Tabs %1$s Push Notifications Tumanggap ng push notifications kapag ang update sa %1$s ay nailabas Nabigo na i-save ang bagong time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues Sistemang Default Tema Itim na tema Puti na tema Manager Update Center Walang bagong update Klase Hindi ma-save ang logs Natagumpay na i-save ang logs Mga Detalye %1$s Nandito ang installation files! Nakita ng Manager na lahat na kailangan para sa %1$s installation ay nahanap. Gusto mo bang i-install? %1$s Kagustuhan sa Pag-install Naghahanap ng mga updates… (Mga) Wika: %1$s Tema: %1$s Bersyon: %1$s May pagkamali Gabay Itigil! Gumagamit ka ng Magisk/TWRP na bersyon ng Vanced, dahil hindi iyon pinatuloy at hindi mai-uupdate gamit nitong app. Tanggalin po ang Magisk module sa pamamagitan ng TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! I-download ulit Siguraduhin mo na nai-download mo ang app galing sa vancedapp.com, o sa Discord server ng Vanced, o sa Github ng Vanced Bersyon Maligayang Pagdating Piliin ang ikinagugustong (mga) wika sa Vanced Pinakabago Puti + %1$s Kumuha ka kahit isang wika! Itim Madilim Manager Devs Other Contributors Pinagkukunan Pangkat Vanced Nabigo sa `pag-chown` ng APK sa system owner, ulitin muli. May pagkamali sa pag-download %1$s Nabigo na gamitin ang bagong kulay aksento Nabigo sa pag-uninstall ng pakete %1$s Nabigo ang paghanap sa kailangan na files para sa installation. I-download ulit ang mga installation files, at ulitin muli. Nabigo ang paghanap ng apk file para sa itim na tema galing sa storage, ulitin muli. Nabigo ang pag-install dahil kinansela ito. Nabigo ang pag-install dahil meron hidwaan sa naka-install na app. I-uninstall ang kasalukuyang bersyon ng Vanced, at ulitin muli. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Nabigo ang pag-install dahil ang installation file ay hindi tugma sa iyong device. Tanggalin ang mga downloaded files sa Settings, at ulitin muli. Nabigo ang pag-install dahil ang mga apk files ay nasira, ulitin muli. Nabigo ang pag-install dahil ang MIUI Optimization ay naka-on. Patayin ang MIUI Optimization, at ulitin muli. Nabigo ang pag-install dahil ang apk signature verification ay naka-on. Patayin ang apk signature verification, at ulitin muli. Installation failed because the device doesn\'t have enough free space. Nabigong hanapin ang apk file para sa itim na tema galing sa installer. Tanggalin ang app data ng Manager, tapos ulitin. Nabigong hanapin ang stock YouTube installation path pagkatapos ng split installation. ================================================ FILE: app/src/main/res/values-fr-rFR/strings.xml ================================================ Annuler Fermer Une implémentation GMS personnalisée pour Vanced basée sur le projet microG. Un client YouTube modifié avec de nombreuses fonctionnalités utiles ! Vanced, mais pour YouTube Music ! Relativement moins riche en fonctionnalités mais répond à vos besoins. Réinitialiser Sauvegarder Sélectionnez vos applications À propos Guide Gestionnaire Journaux Paramètres Gestionnaire de Mise à Jour Votre appareil est-il rooté ? Accorder l’accès root Commençons Sélectionnez au moins une application ! Vous ne savez pas ce que c\'est ou vous ne voulez pas utiliser la version « root » ? Cliquez simplement sur la flèche bleue ci-dessous ! À propos de %1$s Télécharger Informations Lancer Réinstaller Désinstaller Mettre à jour Applications Changelog Téléchargement de %1$s Installer Dernière version: Installez d\'abord Vanced microG Accès root non autorisé Réseaux sociaux Soutenez-nous Indisponible Version installée: Couleur d\'accentuation Apparence Comportement Effacer les fichiers téléchargés Données effacées avec succès Cela nous permet de recueillir des informations sur les performances de l\'application et les journaux de bord Analyses Firebase Langue Les liens s\'ouvriront dans les onglets personnalisés Chrome Utiliser les onglets personnalisés Chrome %1$s Notifications Push Recevoir une notification push quand une nouvelle version pour %1$s est publiée Impossible d\'enregistrer la nouvelle valeur de temps Temps de veille du script root Ajuster la valeur de l\'heure de veille utilisée dans le script /data/adb/service.d/app.sh, utile pour résoudre les problèmes de montage Système par défaut Thème Thème sombre Thème clair Centre de mise à jour du Manager Aucune nouvelle mise à jour Variante Impossible d\'enregistrer les journaux Journaux enregistrés avec succès Détails %1$s fichiers d\'installation détectés ! Le gestionnaire a détecté que tous les fichiers nécessaires à l\'installation de %1$s ont été trouvés. Voulez-vous installer ? %1$s Préférences d\'installation Vérification des mises à jour… Langue(s) : %1$s Thème : %1$s Version : %1$s Erreur Guide Stop! Vous utilisez la version Magisk/TWRP de Vanced, qui n\'est plus entretenu et ne peut pas être mise à jour à l\'aide de cette application. Veuillez la retirer en supprimant le module Magisk/en utilisant le désinstallateur TWRP pour Vanced. Afin d\'installer Vanced, vous DEVEZ désactiver les optimisations MIUI dans les paramètres développeur (vous pouvez ignorer cet avertissement si vous utilisez une ROM basée sur 20.2.20 ou ultérieure de xiaomi.eu) Les optimisations MIUI sont activées ! Veuillez NE PAS quitter l\'application pendant que celle-ci est en cours de modification ! Re-télécharger Assurez-vous d\'avoir téléchargé l\'application depuis vancedapp.com, le serveur Discord Vanced ou sur le Github Vanced Version Bienvenue Choisir votre langage(s) préféré(s) pour Vanced Dernière version Lumière + %1$s Sélectionnez au moins une langue ! Noir Sombre Développeurs du Manager Autres Contributeurs Sources Équipe Vanced Échec de la commande `chown` APK vers le propriétaire du système, veuillez réessayer. Erreur en téléchargeant %1$s Impossible d\'appliquer la nouvelle couleur d\'accentuation N\'a pas pu désinstaller le paquet %1$s Impossible de localiser les fichiers nécessaires à l\'installation. Retéléchargez les fichiers d\'installation, puis réessayez. Impossible de localiser le fichier apk pour le thème noir/foncé, veuillez réessayer. L\'installation a échoué car l\'utilisateur a abandonné l\'installation. L\'installation a échoué parce que l\'application est en conflit avec une application déjà installée. Désinstallez la version actuelle de Vanced, puis réessayez. L\'installation a échoué parce que l\'utilisateur a essayé de downgrader le paquet. Désinstallez les mises à jour de l\'application d\'origine, puis réessayez. L\'installation a échoué pour des raisons inconnues, rejoignez notre Telegram ou Discord pour plus de support. Veuillez également joindre une capture d\'écran dans le menu Avancé L\'installation a échoué parce que le fichier d\'installation est incompatible avec votre appareil. Effacer les fichiers téléchargés dans les paramètres, puis réessayer. L\'installation a échouée car les fichiers apk sont corrompus, veuillez réessayer. L\'installation a échouée car l\'optimisation MIUI est activée. Désactivez l\'optimisation MIUI, puis réessayez. L\'installation a échoué car la vérification de la signature apk est activée. Désactivez la vérification de la signature apk, puis réessayez. L\'installation a échoué car l\'appareil n\'a pas assez d\'espace disponible. Impossible de trouver le fichier apk pour le thème noir/foncé de l\'installateur. Effacez les données de l\'application de Manager, puis réessayez. Impossible de localiser le chemin d\'installation du YouTube original après l\'installation fractionnée. ================================================ FILE: app/src/main/res/values-hi-rIN/strings.xml ================================================ रद्द करें बंद करे MicroG प्रोजेक्ट के आधार पर Vanced के लिए एक कस्टम GMS कार्यान्वयन। कई उपयोगी सुविधाओं के साथ एक संशोधित यूट्यूब क्लाइंट! Vanced, लेकिन यूट्यूब संगीत के लिए! तुलना में कम सुविधा संपन्न लेकिन आपकी आवश्यकताओं को पूरा करता है। रिसेट सहेजें अपने ऐप्स चुनें हमारे बारे में गाइड मैनेजर लॉग सेटिंग्स अपडेट प्रबंधक क्या आपका डिवाइस रुट किया गया है? रूट की अनुमति प्रदान करें चलिए शुरू करते है कम से कम एक ऐप चुनें! नहीं जानते ये क्या है या रूट वर्जन इस्तेमाल नहीं करना चाहते? बस नीचे वाला बटन दबाइए! %1$s के बारे में Download Info Launch Reinstall Uninstall Update ऐप परिवर्तन पत्र डाउनलोड हो रहा है %1$s इंस्टॉल सबसे नया सबसे पहले Vanced microG इंस्टॉल करें रूट एक्सेस प्रदान नहीं किया गया सोशल मीडिया हमें सहयोग दीजिये अनुपलब्ध इंस्टॉल हुआ। ऊपरी रंग दिखावट व्यवहार डाउनलोड की गई फ़ाइलें साफ़ करें फ़ाइलें सफलतापूर्वक साफ़ की गई इससे हम एप्लिकेशन प्रदर्शन और क्रैश लॉग के बारे में जानकारी एकत्र कर सकते हैं फायरबेस वैश्लेषिकी भाषा क्रोम कस्टम टैब में लिंक खुलेंगे क्रोम कस्टम टैब का उपयोग करें %1$s पुश सूचनाएँ जब %1$s का अपडेट जारी किया जाता है, तो पुश सूचनाएँ प्राप्त करें नया समय मान सहेजने में विफल रूट स्क्रिप्ट स्लीप का समय बढ़ते मुद्दों को ठीक करने के लिए उपयोगी /data/adb/service.d/app.sh स्क्रिप्ट में उपयोग की गई नींद के समय को समायोजित करें सिस्टम डिफ़ॉल्ट थीम डार्क थीम लाइट थीम मैनेजर अपडेट केंद्र कोई नया अपडेट नहीं संस्करण लॉग नहीं सहेजे गए सफलतापूर्वक लॉग सहेजे गए विवरण %1$s इंस्टालेशन फ़ाइलों का पता चला! प्रबंधक ने पाया कि %1$s इंस्टॉलेशन के लिए सभी आवश्यक फाइलें मिलीं। क्या आप इंस्टॉल करना चाहते हैं? %1$s इंस्टालेशन प्राथमिकताएँ अपडेट्स के लिए जांच हो रही है… भाषा (एं): %1$s थीम:%1$s संस्करण:%1$s त्रुटि गाइड रुकें! आप Vanced के Magisk / TWRP संस्करण का उपयोग कर रहे हैं, जिसे बंद कर दिया गया है और इस ऐप का उपयोग करके अपडेट नहीं किया जा सकता है। कृपया इस Magisk मॉड्यूल को हटाकर / TWRP Vanced uninstaller का उपयोग करके हटा दें। Vanced इनस्टॉल करने के लिए, आप डेवलपर सेटिंग में MIUI ऑप्टिमाइज़ेशन को निष्क्रिय करें। (यदि आप 20.2.20 या बाद में xiaomi.eu आधारित ROM का उपयोग कर रहे हैं तो आप इस चेतावनी को अनदेखा कर सकते हैं) MIUI Optimizations सक्षम हैं! कृपया इस प्रक्रिया के दौरान ऐप को बंद ना करें! फिर से डाउनलोड करें सुनिश्चित करें कि आपने vancedapp.com, Vanced Discord सर्वर, या Vanced GitHub से ऐप डाउनलोड किया है संस्करण स्वागत है! Vanced के लिए अपनी पसंदीदा भाषा (ए) चुनें नवीनतम लाइट +%1$s कम से कम एक भाषा का चयन करें! काला डार्क प्रबंधक डेवलपर्स अन्य योगदानकर्ता स्रोत वांसड टीम सिस्टम के मालिक को APK को Chown करने में विफल, फिर से प्रयास करें। डाउनलोड करने में त्रुटि %1$s नया ऊपरी रंग लागू करने में विफल पैकेज की स्थापना रद्द करने में विफल %1$s स्थापना के लिए आवश्यक फ़ाइलों का पता लगाने में विफल। स्थापना फ़ाइलों को फिर से डाउनलोड करें, फिर पुनः प्रयास करें। भंडारण से काले / अंधेरे विषय के लिए apk फ़ाइल खोजने में विफल, कृपया पुनः प्रयास करें। स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी। इंस्टॉलेशन विफल रहा क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है। Vanced के वर्तमान संस्करण को अनइंस्टॉल करें, फिर पुनः प्रयास करें। स्थापना विफल रही क्योंकि उपयोगकर्ता ने पैकेज को डाउनग्रेड करने का प्रयास किया। स्टॉक ऐप से अपडेट अनइंस्टॉल करें, फिर प्रयास करें। अज्ञात कारणों से इंस्टॉलेशन विफल हो गया, आगे के समर्थन के लिए हमारे टेलीग्राम या डिस्कॉर्ड में शामिल हों। कृपया उन्नत मेनू से स्क्रीनशॉट भी संलग्न करें । इंस्टॉलेशन विफल हो गया क्योंकि इंस्टॉलेशन फ़ाइल आपके डिवाइस के साथ असंगत है। सेटिंग्स में डाउनलोड की गई फ़ाइलों को साफ़ करें, फिर प्रयास करें। स्थापना विफल रही क्योंकि एपीके फ़ाइलें दूषित हैं, कृपया पुनः प्रयास करें। MIUI ऑप्टिमाइज़ेशन सक्षम होने के कारण स्थापना विफल रही। MIUI ऑप्टिमाइज़ेशन अक्षम करें, फिर प्रयास करें। स्थापना विफल रही क्योंकि एपीके हस्ताक्षर सत्यापन सक्षम है। एपीके हस्ताक्षर सत्यापन अक्षम करें, फिर प्रयास करें। इंस्टॉलेशन विफल हो गया क्योंकि डिवाइस में पर्याप्त खाली जगह नहीं है। इंस्टॉलर से ब्लैक / डार्क थीम के लिए एपीके फ़ाइल खोजने में विफल। प्रबंधक का एप्लिकेशन डेटा साफ़ करें, फिर प्रयास करें। विभाजन स्थापना के बाद स्टॉक YouTube इंस्टॉलेशन पथ का पता लगाने में विफल ================================================ FILE: app/src/main/res/values-hr-rHR/strings.xml ================================================ Odustani Zatvori Prilagođena GMS implementacija za Vanced zasnovana na microG projektu. Modificirani YouTube klijent sa mnogo korisnih značajki! Vanced, ali za YouTube Music! S manje značajki ali ispunjava vaše potrebe. Resetiraj Spremi Odaberite svoje aplikacije O autorima Vodič Upravitelj Zapisi Postavke Ažuriranje upravitelja Je li vaš uređaj rootan? Dopusti root dozvolu Započnite Odaberite najmanje jednu aplikaciju! Ne znate što je ovo ili ne želite koristiti root izdanje? Jednostavno kliknite na plavu strelicu ispod! O %1$s Preuzmi Informacije Pokreni Reinstaliraj Deinstaliraj Ažuriraj Aplikacije Zapis promjena Preuzimam %1$s Instaliraj Dostupno: Prvo instaliraj Vanced MicroG Root pristup nije dopušten Društvene mreže Podržite nas Nedostupno Instalirano: Boja naglašavanja Izgled Ponašanje Ukloni preuzete datoteke Datoteke su uspješno uklonjene Ovo nam omogućuje prikupljanje informacija o performansama aplikacije i zapise rušenja Firebase analitika Jezik Poveznice će se otvarati u prilagođenim karticama Chroma Koristi prilagođene kartice Chroma %1$s skočne obavijesti Primite skočnu obavijest kada je ažuriranje za %1$s dostupno Neuspjelo spremanje nove vrijednosti vremena Vrijeme spavanja root skripte Prilagodite vrijeme spavanja korišteno u /data/adb/service.d/app.sh skripti, korisno za ispravak problema s montiranjem Zadano sustavom Tema Tamna tema Svjetla tema Središte ažuriranja upravitelja Nema novih ažuriranja Izdanje Nije moguće spremiti zapise Uspješno spremljeni zapisi Detalji %1$s instalacijska datoteka je otkrivena! Upravitelj je otkrio da su sve potrebne datoteke za %1$s instalaciju pronađene. Želite li nastaviti instalaciju? %1$s postavke instalacije Provjera ažuriranja… Jezik: %1$s Tema: %1$s Inačica: %1$s Greška Vodič Zaustavi! Koristite Magisk/TWRP inačicu Vanceda, koja više nije podržana i ne može se ažurirati ovom aplikacijom. Uklonite ju uklanjanjem Magisk modula/koristeći TWRP Vanced deinstalator. Kako bi instalirali Vanced, MORATE onemogućiti MIUI optimizaciju u razvojnim mogućnostima. (Ovo upozorenje možete zanemariti ako koristite 20.2.20 ili noviji xiaomi.eu ROM) MIUI optimizacija je omogućena! NE zatvarajte aplikaciju tijekom ovog postupka! Ponovno preuzmi Aplikaciju obavezno preuzmite s vancedapp.com, Vanced Discord poslužitelja ili Vanced GitHuba Inačica Dobrodošli Odaberite željeni jezika za Vanced Najnovije Svjetla + %1$s Odaberite najmanje jedan jezik! Crna Tamna Razvijatelji Vanced upravitelja Ostali suradnici Izvori Vanced tim Neuspjela promjena `chown` APK u vlasnika sustava, pokušajte ponovno. Greška preuzimanja %1$s Neuspjelo primijenjivanje nove boje naglašavanja Neuspjela deinstalacija %1$s paketa Neuspjelo lociranje potrebnih datoteka za instalaciju. Ponovno preuzmite datoteke za instalaciju, zatim ponovno pokušajte. Neuspjelo lociranje apk datoteke za crnu/tamnu temu iz pohrane, pokušajte ponovno. Instalacija je prekinuta zato jer ju je korisnik prekinuo. Instalacija nije uspjela jer je aplikacija u sukobu s već instaliranom aplikacijom. Deinstalirajte trenutnu inačicu aplikacije zatim pokušajte ponovno. Instalacija nije uspjela jer je korisnik pokušao instalirati stariju inačicu paketa. Deinstalirajte ažuriranja izvorne YouTube aplikacije, zatim pokušajte ponovno. Neuspjela instalacija, nepoznati razlog. Priključite se našem Telegramu ili Diskordu za našu pomoć. Molimo Vas da priključite sliku ekrana iz Proširenog Menua Instalacija nije uspjela zato jer datoteka instalacije nije kompatibilna s vašim uređajem. Uklonite preuzete datoteke u postavkama, zatim pokušajte ponovno. Instalacija nije uspjela zato jer je apk datoteka oštećena. Instalacija nije uspjela zato jer je MIUI optimizacija uključena. Isključite MIUI optimizaciju, zatim pokušajte ponovno. Instalacija nije uspjela zato jer je provjera potpisa omogućena. Onemogućite apk provjeru potpisa, zatim pokušajte ponovno. Neuspješna instalacija jer na uređaju nema dovoljno slobodnog prostora. Neuspjeli pronalazak apk datoteke za crnu/tamnu temu u programu instalacije. Uklonite podatke aplikacije upravitelja, zatim pokušajte ponovno. Neuspjelo lociranje putanje izvorne YouTube instalacije nakon razdvojene instalacije. ================================================ FILE: app/src/main/res/values-hu-rHU/strings.xml ================================================ Visszavonás Bezárás Egyedi GMS implementáció a Vanced számára a microG Projekt alapján. Egy módosított YouTube kliens számos hasznos funkcióval! Vanced, a YouTube Music-ra! Kevésbé funkciógazdag, de kielégíti az igényeidet. Visszaállítás Mentés Válaszd ki az Appot Rólunk Útmutató Manager Naplók Beállítások Manager frissitése Rootolt az eszközöd? Root hozzáférés engedélyezése Lássunk neki Legalább egy appot válassz! Nem tudod mi ez vagy csak nem akarod használni a root verziót? Csak kattins a lenti kék nyílra! %1$s- ról Download Info Launch Újratelepítés Uninstall Update Alkalmazások Változáslista %1$s letöltése Telepítés Legújabb: Először telepítse a Vanced microG-t A root hozzáférés nincs megadva Közösségi média Támogasson bennünket Nem elérhető Telepítve: Kiemelés színe Megjelenítés Viselkedés Letöltött fájlok törlése Sikeresen törölte a fájlokat Ezzel megengedi hogy információkat gyűjtsünk az alkalmazás teljesítményéről és az összeomlási naplóról Firebase Analytics Nyelv A linkek egyéni Chrome ablakban nyílnak meg Egyéni Chrome lapok használata %1$s Leküldéses (Push) Értesítések Értesítések fogadása, amikor a %1$s számára frissítés érhető el Nem sikerült az időzítő új értékének mentése Root alvás idő script Alvás idő beállítás a /data/adb/service.d/app.sh scriptben, hasznos a csatlakoztatási problémák javítására Rendszer alapértelmezett Kinézet Sötét téma Világos téma Frissítő központ Új frissítések nem elérhetőek Változat A napló mentése nem sikerült Napló sikeresen mentve Részletek %1$s telepítőfájlok észlelve! A Manager észlelte a %1$s telepítéséhez szükséges fájlokat. Akarod telepíteni? %1$s Telepítés személyreszabása Frissítések ellenőrzése... Nyelv: %1$s Kinézet: %1$s Verzió: %1$s Hiba Útmutató Állj! A Vanced Magisk/TWRP verzióját használja, ami már nem támogatott és nem frissíthető ezzel az alkalmazással. Távolítsa el a Magisk modul eltávolításával vagy TWRP Vanced eltávolítóval. Hogy a Vanced-et telepítsd, ki KELL kapcsolnod a MIUI Optimalizációt a fejlesztői beállításokban. (Ezt figyelmen kívül hagyhatod ha 20.2.20 vagy későbbi xiaomi.eu alapú ROM-ot használsz) MIUI optimalizálások engedélyezve! Kérjük NE lépjen ki a telepítési folyamat alatt! Újra letölt Arra kérünk, győződjön meg róla, hogy ezt az alkalmazást a vancedapp.com oldalról, a Vanced Discord szerveréről vagy a Vanced GitHub-ról töltötte le Verzió Üdvözöljük Vanced nyelvének kiválasztása Legújabb Világos + %1$s Válasszon ki legalább egy nyelvet! Fekete Sötét Fejlesztői Menedzser Egyéb Közreműködők Források Vanced csapat Nem sikerült az APK beállítása a rendszer tulajdonoshoz, kérjük próbálja újra. %1$s letöltése nem sikerült Nem sikerült az új kiemelés szín beállítása A %1$s-t nem sikerült eltávolítani A telepítéshez szükséges file-ok megtalálása meghiúsult. Töltse le újra a telepítőfile-okat és próbálja újra. Nem sikerült az apk file-t megtalálni a fekete/sötét kinézethez, kérjük próbálja újra. A művelet végrehajtása nem sikerült, mert a felhasználó megszakította a telepítést. A telepítés nem sikerült, mert az alkalmazás egy másik, már telepített alkalmazással ütközik. Távolítsd el a jelenlegi verziót és próbáld újra. A telepítés nem sikerült, mert a felhasználó, régebbi verzióra próbált frissíteni. Távolítsa el az eredeti alkalmazás frissítéseit, majd próbálja újra. A telepítés ismeretlen ok miatt meghiúsult, kérjük csatlakozzon a Telegram vagy a Discord csatornánkhoz további támogatásért. Kérjük egy képernyőképet is mellékeljen ami a Haladó menüben készült A telepítés nem sikerült, mert a telepítő fájl nem kompatibilis az eszközöddel. Töröld ki a letöltött fájlokat a beállításokban és próbáld újra. A telepítés nem sikerült, mert az apk fájlok korruptak, próbáld újra. A telepítés nem sikerült, mert a MIUI Optimalizáció engedélyezve van. Kapcsold ki a MIUI Optimalizációt és próbáld újra. A telepítés nem sikerült, mert az apk aláírás ellenőrzés engedélyezve van. Kapcsold ki az apk aláírás ellenőrzését és próbáld újra. A telepítés nem sikerült, mert nincs elég szabad hely. Nem sikerült megtalálni az apk file-t a fekete/sötét kinézethez a telepítőből. Törölje a Manager alkalmazás adatait, majd próbálja újra. Nem sikerült megtalálni az alap YouTube telepítési útvonalat a(z) split telepítés után. ================================================ FILE: app/src/main/res/values-in-rID/strings.xml ================================================ Batal Tutup Penerapan GMS kustom untuk Vanced yang didasarkan pada proyek microG. Klien YouTube termodifikasi dengan berbagai fitur berguna! Vanced, tetapi untuk YouTube Musik! Relatif memiliki fitur yang kurang kaya tetapi memenuhi kebutuhan anda. Atur ulang Simpan Pilih Aplikasi Anda Tentang Petunjuk Manager Logs Pengaturan Perbarui Manager Apakah Perangkat Anda Mempunyai Akses Root? Berikan Izin Root Mari memulai Pilih setidaknya satu aplikasi! Tidak tahu apa ini atau tidak ingin menggunakan versi root? cukup klik panah biru di bawah! Tentang %1$s Unduh Informasi Buka Pasang ulang Copot pemasangan Perbarui Aplikasi Catatan perubahan Mengunduh %1$s Pasang Terbaru: Pasang Vanced microG terlebih dahulu Akses Root tidak diberikan Media Sosial Dukung kami Tidak tersedia Terpasang: Aksen Warna Penampilan Perilaku Hapus file yang diunduh Berhasil menghapus file Analisis firebase mengizinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash Analisis Firebase Bahasa Tautan akan terbuka di Chrome Custom Tabs Gunakan Chrome Custom Tabs Notifikasi Push %1$s Terima notifikasi push saat pembaruan untuk %1$s dirilis Gagal untuk menyimpan value waktu baru Waktu Root Script Sleep Sesuaikan value sleep time yang digunakan dalam skript /data/adb/service.d/app.sh, berguna untuk memperbaiki masalah pemasangan Standar Sistem Tema Tema Gelap Tema Terang Pusat Pembaruan Manager Tidak ada pembaruan Varian Tidak bisa menyimpan log Berhasil menyimpan log Rincian File instalasi %1$s terdeteksi! Manager mendeteksi bahwa semua file yang diperlukan untuk instalasi %1$s ditemukan. Apakah anda ingin memasangnya? Preferensi Instalasi %1$s Memeriksa pembaruan… Bahasa: %1$s Tema: %1$s Versi: %1$s Terjadi kesalahan Petunjuk Berhenti! Anda memakai Vanced versi Magisk/TWRP, yang pengembangannya dihentikan dan tidak bisa diperbarui menggunakan aplikasi ini. Mohon untuk menghapusnya dengan menghapus modul Magisk/gunakan pencopot Vanced TWRP. Untuk memasang Vanced, anda HARUS menonaktifkan Optimisasi MIUI pada pengaturan developer. (Anda dapat mengabaikan peringatan ini apabila anda menggunakan ROM versi 20.2.20 atau lebih yang berbasis xiaomi.eu) Optimisasi MIUI diaktifkan! Mohon untuk TIDAK keluar dari aplikasi saat proses ini! Unduh ulang Pastikan anda mengunduh aplikasi ini dari vancedapp.com, server Discord Vanced, atau Vanced Github Versi Selamat datang Pilih bahasa yang anda inginkan untuk Vanced Terbaru Terang + %1$s Pilih setidaknya satu bahasa! Hitam Gelap Pengembang Manager Kontributor Lain Sumber Tim Vanced Gagal untuk `chown` APK ke pemilik sistem, mohon coba lagi. Gagal Mengunduh %1$s Gagal untuk menerapkan warna aksen baru Gagal untuk mencopot pemasangan paket %1$s Gagal untuk menemukan file yang diperlukan untuk instalasi. Unduh ulang file instalasi, lalu coba lagi. Gagal untuk menemukan file apk untuk tema hitam/gelap dari penyimpanan, mohon coba lagi. Pemasangan gagal dikarenakan pengguna membatalkan pemasangan. Pemasangan gagal dikarenakan aplikasi konflik dengan aplikasi yang sudah terpasang. Copot pemasangan aplikasi versi saat ini, lalu coba lagi. Pemasangan gagal dikarenakan pengguna mencoba menurunkan versi paket. Hapus pembaruan dari aplikasi bawaan, lalu coba lagi. Pemasangan gagal untuk alasan yang tidak diketahui, gabung Telegram atau Discord kami untuk bantuan lebih lanjut. Mohon untuk melampirkan screenshot dari menu Tingkat Lanjut Pemasangan gagal dikarenakan file pemasangan tidak kompatibel dengan perangkat anda. Hapus file yang diunduh di pengaturan, lalu coba lagi. Pemasangan gagal dikarenakan file apk rusak, mohon coba lagi. Pemasangan gagal dikarenakan Optimisasi MIUI diaktifkan. Nonaktifkan Optimisasi MIUI, lalu coba lagi. Pemasangan gagal dikarenakan apk signature verification diaktifkan. Nonaktifkan apk signature verification, lalu coba lagi. Pemasangan gagal dikarenakan perangkat tidak memiliki ruang penyimpanan yang cukup. Gagal untuk menemukan file apk untuk tema hitam/gelap dari penginstal. Hapus data aplikasi Manager, lalu coba lagi. Gagal untuk menemukan path instalasi YouTube setelah pemasangan split. ================================================ FILE: app/src/main/res/values-it-rIT/strings.xml ================================================ Annulla Chiudi Un\'implementazione GMS personalizzata per Vanced basata sul progetto microG. Un client YouTube modificato con molte utili funzionalità! Vanced, ma per YouTube Music! Relativamente meno ricco di funzionalità ma ugualmente adattabile alle tue esigenze. Reimposta Salva Seleziona le Tue App Informazioni Guida Manager Registri Impostazioni Aggiorna Manager Il Tuo Dispositivo Ha i Permessi di Root? Concedi i Permessi di Root Iniziamo Seleziona almeno un\'app! Non sai cos\'è o non vuoi utilizzare la versione root? clicca sulla freccia blu qui in basso! Informazioni su %1$s Scarica Informazioni Avvia Reinstalla Disinstalla Aggiorna App Novità Download in corso di %1$s Installa Disponibile: Installa prima Vanced microG Accesso root non consentito Social Media Sostienici Non disponibile Installata: Colore Evidenziazione Aspetto Comportamento Cancella i file scaricati Cancellazione file riuscita Questo ci consente di raccogliere informazioni sulle prestazioni dell\'app ed i registri sui crash Analisi Firebase Lingua I link verranno aperti nelle Schede Personalizzate di Chrome Utilizza le Schede Personalizzate di Chrome Notifiche Push di %1$s Ricevi notifiche push quando un aggiornamento per %1$s è disponibile Impossibile salvare il nuovo valore temporale Tempo Di Sospensione Script Root Regola il valore del tempo di sospensione utilizzato nello script /data/adb/service.d/app.sh, utile per risolvere i problemi di montaggio Predefinito di Sistema Tema Tema Scuro Tema Chiaro Centro Aggiornamenti Nessun nuovo aggiornamento Variante Impossibile salvare i registri Registri salvati correttamente Dettagli %1$s file di installazione rilevati! Manager ha trovato tutti i file necessari per l\'installazione di %1$s. Vuoi installarli? Preferenze Installazione di %1$s Verifica aggiornamenti… Lingue: %1$s Tema: %1$s Versione: %1$s Errore Guida Aspetta! Stai utilizzando la versione Magisk/TWRP di Vanced, ormai obsoleta e non più aggiornabile tramite questa app. Per favore, rimuovila eliminando il modulo Magisk oppure utilizzando TWRP Vanced uninstaller. Per installare Vanced, DEVI disabilitare le ottimizzazioni MIUI nelle opzioni sviluppatore. (Puoi ignorare questo avviso se stai usando la ROM 20.2.20 o successiva basata su xiaomi.eu) Le ottimizzazioni MIUI sono abilitate! Si prega di NON uscire dall\'app durante questo processo! Scarica nuovamente Assicurati di aver scaricato l\'app da vancedapp.com, dal server Discord di Vanced o dalla pagina GitHub di Vanced Versione Benvenuto Scegli le tue lingue preferite per Vanced Versione più recente Chiaro + %1$s Seleziona almeno una lingua! Nero Scuro Sviluppatori di Manager Altri Collaboratori Codice Sorgente Il Team di Vanced Impossibile modificare il proprietario dell\'apk nel proprietario di sistema, per favore riprova. Errore nel Download di %1$s Impossibile applicare il nuovo colore di accento Impossibile disinstallare il pacchetto %1$s Impossibile individuare i file richiesti per l\'installazione. Scaricali nuovamente e riprova. Impossibile individuare il file apk per il tema nero/scuro dalla memoria, per favore riprova. Installazione non riuscita. L\'utente ha annullato l\'installazione. Installazione fallita perché l\'applicazione è in conflitto con un\'app già installata. Disinstallare la versione corrente dell\'applicazione, quindi riprovare. Installazione fallita. È stato effettuato un tentativo di downgrade del pacchetto. Disinstalla gli aggiornamenti dall\'app stock, quindi riprova. Installazione non riuscita per motivi sconosciuti, unisciti al nostro Telegram o Discord per ulteriore supporto. Allega anche uno screenshot dal menu Avanzate Installazione non riuscita, il file di installazione non è compatibile con il tuo dispositivo. Elimina i file scaricati nelle impostazioni, poi riprova. Installazione non riuscita a causa di file apk corrotti, si prega di riprovare. Installazione non riuscita, le ottimizzazioni di MIUI sono attivate. Disattiva le ottimizzazioni di MIUI, poi riprova. Installazione non riuscita, la verifica della firma apk è attivata. Disattiva la verifica della firma apk, poi riprova. Installazione non riuscita perché il dispositivo non dispone di sufficiente spazio libero. Impossibile trovare il file apk per il tema nero/scuro dall\'installer. Cancella i dati dell\'app Manager, quindi riprova. Impossibile individuare il percorso di installazione di YouTube stock dopo l\'installazione divisa. ================================================ FILE: app/src/main/res/values-iw-rIL/strings.xml ================================================ ביטול סגור שירותים מותאמים אישית של Google במיוחד ל־Vanced, מבוססים על פרויקט microG. YouTube משופר עם תכונות שימושיות רבות! Vacned, אבל של YouTube Music! יחסית פחות עשיר בתכונות, אבל ממלא אחר צרכיך. איפוס שמור בחר את היישומים שלך אודות מדריך מנהל יומני רישום הגדרות מנהל העדכונים האם המכשיר שלך בעל הרשאות Root? הענק הרשאות Root בואו נתחיל בחר לפחות יישום אחד! לא יודעים מה זה או לא רוצים להשתמש בגרסת ה־Root? פשוט לחצו על החץ הכחול למטה! אודות %1$s הורדה מידע הפעל התקן מחדש הסרת ההתקנה עדכן יישומים היסטורית שינויים מוריד את %1$s התקן החדש ביותר: התקן את שירותי Google של Vanced תחילה לא הוענקו הרשאות Root רשתות חברתיות תמכו בנו לא זמין מותקן: צבע הדגשה מראה התנהגות מחק קבצים שהורדו מחיקת הקבצים הסתיימה בהצלחה מאפשר לנו לאסוף מידע על ביצועי היישום וסיבות לקריסתו ניתוח מידע משתמש שפה קישורים יפתחו בכרטיסיות מותאמות אישית של Chrome השתמש בכרטיסייה מותאמת אישית של Chrome %1$s התראות דחיפה קבל התראות דחיפה כשעדכון ל־%1$s משתחרר נכשל בשמירת ערך הזמן החדש Root Script Sleep Time תשנה את זמן השינה הנמצא ב /data/adb/service.d/app.sh, זה עוזר כדי לתקן בעיות אתחול ברירת מחדל ערכת נושא ערכת נושא כהה ערכת נושא בהירה מרכז העדכונים אין עדכונים חדשים סוג לא ניתן היה לשמור יומני רישום יומני הרישום נשמרו בהצלחה פרטים %1$s קבצי התקנה נמצאו! המנהל זיהה שכל הקבצים הנדרשים עבור התקנת %1$s נמצאו. האם ברצונך להתקינם? %1$s העדפות התקנה בודק אחר עדכונים… שפה: %1$s ערכת נושא: %1$s גרסה: %1$s שגיאה מדריך עצור! נדמה שאתה משתמש בגרסת ה־Magisk/TWRP של Vanced, שהתמיכה בה הופסקה והיא לא יכולה להתעדכן להתעדכן בעזרת האפליקציה הזו. אנא מחק אותה על ידי מחיקת ה־Module ב־Magisk או בשימוש במסיר ההתקנה של TWRP Vanced. על מנת להתקין את Vanced, עליך להשבית מיטוב ל־MIUI בהגדרות מפתחים. (אתה יכול להתעלם מאזהרה זו אם אתה משתמש בגרסה 20.2.2 של הרום הבין־לאומי של שיאומי או גרסה מאוחרת יותר) מיטוב למערכת ההפעלה MIUI פועל! נא לא לצאת מהיישום במהלך תהליך זה! הורד מחדש ודא שהורדת את האפליקציה מהאתר vancedapp.com, שרת הדיסקורד של Vanced או מהעמוד של Vanced ב־GitHub גרסא ברוכים הבאים בחר את השפה המועדפת עליך ל־Vanced העדכנית ביותר בהיר + %1$s בחר לפחות שפה אחת! שחור שחרחר מנהל למפתחים תורמים אחרים מקורות צוות Vanced נכשל בהחלפת הבעלים של קובץ ה־APK, אנא נסה בשנית. תקלה בהורדה של %1$s נכשל בהחלת ערכת הנושא החדשה נכשל במחיקת החבילה %1$s איתור הקבצים הנדרשים להתקנה נכשל. הורד מחדש את קבצי ההתקנה ונסה שוב. נכשל האיתור של קובץ APK לערכת נושא שחורה/כהה מהאחסון, אנא נסה שוב. ההתקנה נכשלה כיוון שהמשתמש ביטל אותה. ההתקנה נכשלה כיוון שהאפליקציה מתנגשת עם גרסה מותקנת שלה, מחק את הגרסה הנוכחית של Vanced ולאחר מכן נסה שוב. ההתקנה נכשלה כיוון שהמשתמש ניסה לשנמך את גרסת היישום. מחק עדכונים מאפליקציית YouTube הרגילה, ולאחר מכן נסה שוב. ההתקנה נכשלה מסיבות לא ידועות, הצטרף לטלגרם או לדיסקורד לקבלת תמיכה נוספת. אנא צרף גם צילום מסך מהתפריט המתקדם ההתקנה נכשלה מכיוון שההתקנה או הקובץ לא תואמים עם מכשירך. נקה הורדות שהושלמו מתוך ההגדרות, ואז נסה שוב. ההתקנה נכשלה מכיוון שקבצי הישום הרוסים, בבקשה נסה שוב. ההתקנה נכשלה מכיוון שאופטימיזצית MIUI פעילה. השבת את אופטימיזצית MIUI, ואז נסה שוב. ההתקנה נכשלה מכיוון שאימות החתימה בישום פעילה. השבת את אימות החתימה בישום, ואז נסה שוב. ההתקנה נכשלה כיוון שאין מספיק מקום פנוי במכשיר. נכשל במציאת קובץ APK של ערכת נושא שחורה/כהה. נקה את נתוני האפליקציה Vanced Manager, ולאחר מכן נסה שוב. נכשל איתור נתיב ההתקנה של YouTube הרגיל לאחר התקנה מפוצלת. ================================================ FILE: app/src/main/res/values-ja-rJP/strings.xml ================================================ キャンセル 閉じる microG Project をベースにした、Vanced のためのGMSのカスタム実装 多くの便利な機能を備えた、改造されたYouTubeアプリ! YouTube Music のための Vanced! 比較的機能は少ないですが、あなたの欲望を満たします。 リセット 保存 アプリの選択 このアプリについて ガイド Manager ログ 設定 Manager を更新 端末をルート化していますか? root 権限を付与 さあ、始めましょう アプリを少なくとも一つ選択してください! これが何であるか分からないか、またはRootバージョンを使用したくない場合は、下の青い矢印をタップしてください! %1$s について Download Info Launch Reinstall Uninstall Update アプリ 更新履歴 %1$s をダウンロードしています インストール 最新版: はじめに Vanced microG をインストールしてください Root アクセスは許可されていません ソーシャルメディア サポート 利用不可 インストール済み: アクセントカラー 表示設定 動作 ダウンロード済みファイルを消去 ファイルを消去しました アプリのパフォーマンスとクラッシュログに関する情報を収集できます Firebase アナリティクス 言語 Chrome カスタムタブでリンクを開く Chrome カスタムタブを使用 %1$s プッシュ通知 %1$s のアップデートがリリースされたときにプッシュ通知を受け取る 新しいタイマーの値の保存に失敗しました Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues システム設定 テーマ ダークテーマ ライトテーマ Manager アップデートセンター アップデートはありません 種類 ログの保存に失敗しました ログが正常に保存されました 詳細 %1$s のインストールに必要なファイルが見つかりました %1$s のインストールに必要な全てのファイル準備が整いました。インストールしますか? %1$s のインストール設定 アップデートを確認中... 言語: %1$s テーマ: %1$s バージョン: %1$s エラー ガイド ストップ! Vanced の Magisk/TWRP バージョンを使用しているようです。このバージョンは廃止されており、このアプリでは更新できません。 まず Magisk モジュールを削除するか、TWRP で Vanced uninstaller を使用してください。 Vanced をインストールするには、開発者設定から MIUI 最適化を無効にしなければなりません。 (20.2.20 以降の xiaomi.eu ベースの ROM の場合はこの警告は無視してください) MIUI 最適化が有効です! この処理中はアプリを終了しないでください! 再ダウンロード Vancedapp.com、Vanced の Discord サーバーまたは GitHub からアプリをダウンロードしたことを確認してください バージョン ようこそ Vanced で使用する言語を選択 最新版 ライト + %1$s 少なくとも一つの言語を選択してください! ブラック ダーク Manager 開発 他の貢献者 ソースコード Vanced チーム システム所有者への APK の Chown ができませんでした、もう一度やり直してください. %1$s のダウンロード中にエラー 新しいアクセントカラーの適用に失敗しました パッケージ %1$s のアンインストールに失敗しました インストールに必要なファイルが見つかりませんでした。再ダウンロードし、もう一度お試しください。 ストレージからブラック/ダークテーマの APK ファイルが見つかりませんでした。もう一度お試しください。 ユーザーがインストールを中断したためインストールに失敗しました。 既にインストールされたアプリと競合したため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、もう一度やり直してください。 アプリをダウングレードしようとしたため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、再度お試しください。 不明な理由でインストールに失敗しました。さらなるサポートのためには、Telegram か Discord に参加してください。詳細メニューからスクリーンショットを添付してください。 インストールするファイルがお使いのデバイスと互換性がないためインストールに失敗しました。設定でダウンロードしたファイルを削除してから、もう一度やり直してください。 APK ファイルが破損しているためインストールに失敗しました、もう一度やり直してください。 MIUI の最適化が有効になっているためインストールに失敗しました。MIUI の最適化を無効化してから、もう一度やり直してください。 APK の署名検証が有効化されているためインストールに失敗しました。APK の署名検証を無効化してから、もう一度やり直してください。 デバイスに十分な空き容量がないため、インストールに失敗しました。 インストーラーからブラック/ダークテーマの APK ファイルが見つかりませんでした。Manager のアプリデータを消去してから、もう一度お試しください。 分割インストール後にストックの YouTube アプリのインストールパスが見つかりませんでした。 ================================================ FILE: app/src/main/res/values-ka-rGE/strings.xml ================================================ გაუქმება დახურვა A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. განულება შენახვა აირჩიეთ თქვენი აპები შესახებ ინსტრუქცია მენეჯერი ჟურნალი პარამეტრები მენეჯერის განახლება არის თქვენი მოწყობილობა დარუთული? მიეცით root წვდომა დავიწყოთ ერთი აპი მაინც მონიშნეთ! არ იცით ეს რა არის ან არ გინდათ root ვერსიით სარგებობა? უბრალოდ დააჭირეთ ქვემოთ მოცემულ ლურჯ ისარს! %1$s-ის შესახებ გადმოწერა ონფორმაცია ჩართვა რეინსტალაცია დეინსტალაცია განახლება აპები ცვლილებები მიმდინარეობს %1$s-ის გადმოწერა ინსტალაცია უახლესი: Install Vanced microG first Root წვდომა არ არის მინიჭებული სოციალური მედია დაგვიჭირეთ მხარი ხელმიუწვდომელია დაინსტალირებული: აქცენტის ფერი შესახედაობა ფუნქციები გადმოწერილი ფაილების გაწმენდა ფაილები წარმატებით გაიწმინდა ეს გვაძლევს უფლებას მოვიპოვოთ ინფორმაცია აპის მუშაობის შესახებ Firebase-ის ანალიტიკა ენა ლინკები გაიხსნება Chrome Custom Tabs-ში გამოიყენეთ Chrome Custom Tabs %1$s-ს შეტყობინებები მიიღეთ შეტყობინებები როდესაც %1$s-ის განახლება იქნება ხელმისაწვდომი Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues სისტემის ნაგულისხმევი თემა მუქი თემა ღია თემა განახლებების ცენტრი განახლება არ არის აღმოჩენილი ვარიანტი Could not save logs Successfully saved logs დეტალები აღმოჩენილია %1$s -ის საინსტალაციო ფაილები! მენეჯერმა აღმოაჩინა %1$s -ის ყველა საჭირო საინსტალაციო ფაილი. გინდათ დააინსტალიროთ? %1$s-ის ინსტალაციის პარამეტრები მიმდინარეობს განახლებების შემოწმება… ენა(ები): %1$s თემა: %1$s ვერსია: %1$s შეცდომა ინსტრუქცია შეჩერდი! თქვენ იყენებთ Vanced-ის Magisk/TWRP ვერსიას, მაგრამ მისი მენეჯერიდან განახლება შეუძლებელია. გთხოვთ წაშალოთ იგი Magisk-იდან/TWRP-ს დეინსტალერიდან. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! თავიდან გადმოწერა დარწმუნდით, რომ აპი გადმოწერეთ vancedapp.com-იდან, Vanced Discord სერვერიდან ან GitHub-იდან ვერსია მოგესალმებით აირჩიეთ სასურველი ენა(ები) Vanced-ისთვის უახლესი ღია + %1$s ერთი ენა მაინც მონიშნეთ! შავი მუქი Manager-ის დეველოპერები Other Contributors წყაროები Vanced-ის გუნდი `chown`-ის დროს მოხდა შეცდომა, გთცოვთ სცადოთ თავიდან. შეცდომა %1$s-ის გადმოწერის დროს შეცდომა აქცენტის ფერის მიღების დროს პაკეტი %1$s ვერ დეინსტალირდა Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-kmr-rTR/strings.xml ================================================ Betal bike Bigire Ji bo Projeya microG ji bo Vanced tê tetbîqkirin. Mişterîya YouTube bi gelek taybetmendiyên kêrhatî guherî! Vanced, lê ji bo YouTube Music!. Ji bo hewcedariyên te, hinekî kêm-dewlemend e. Nûsaz bike Tomar bike Sepanên xwe hilbijêre Derbarê de Rêber Rêveber Tomar Sazkarî Rêveberê Nûve bike Gelo cîhaza te Root e? Destûra Root\'ê bide Em dest pê bikin Herî kêm sepanekê hilbijêre! Gelo ev çi ye an naxwazî versiyona root bi kar bîne? tenê tîrê şîn ê jêrîn bitikînin! Derbar %1$s Download Info Launch Reinstall Uninstall Update Sepanan Gurankarî Dakêşe %1$s Saz bike Dawîn: Pêşîn Vanced microG saz bikin Destlênedanên kokê nayê dayîn Medyaya Civakî Piştgiriya me bikin Neberdest Sazkirî: Rengê devkî Xuyang Tevger Pelên dakêşandî paqij bikin Pelên bi serkeftî hatin paqijkirin Ev dibe ku em di derbarê performansa sepan û tomarê têkçûyî de agahdariyan berhev bikin Firebase Analytics Ziman Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin Hilpekên Chrome\'ê yên taybet bi kar bîne %1$s Danezanên Lezgîn Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire Barkirina nirxa dema nû bi ser neket Dema Xewê ya Skrîpta Root Nirxa dema xewê ya ku tê bikaranîn sererast bikin /data/adb/service.d/app.sh skrîpt, ji bo rastkirina pirsgirêkên pêvekirinê kêrhatî ye Jixwebera Sîstemê Rûkar Rûkara tarî Rûkara Ronî Navenda Hildemandina Rêveberê Nûvekirinên nû tune Varyant Torkirina rojnivîsk bi ser neket Rojnivîsk bi serkeftî torandin Kîtekît Pelên sazkirinê %1$s hatin tespîtkirin! Rêveberê diyar kir ku hemû pelên pêwîst ji bo sazkirina %1$s hatine dîtin. Tu dixwazî saz bikî? Vebijarkên Sazkirinê yên %1$s Li nûvekirinan tê vekolîn… Ziman(ên): %1$s Rûkar: %1$s Guherto: %1$s Çewtî Rêber Bisekine! Tu versiyona Magisk/TWRP ya Vanced ê ku hatiye jêbirin û bi bikaranîna vê sepanê nikare were nûjenkirin, bi kar tîne. Ji kerema xwe rake bi rakirina mobîla Magisk/bi karanîna TWRP Vanced rakirin. Ji bo sazkirina Vanced, divê tu optimîzasyonên MIUI di mîhengên pêşdebiran de neçalak bikî. (Heke hûn 20.2.20 an jî paşê bi romê xiaomi.eu vê hişyariyê paşguh bikin) Optimîzasyonên MIUI tên çalak kirin! Ji kerema xwe di vê pêvajoyê de ji sepanê dernakeve! Ji nû ve daxîne Pê bawer bin ku te ev sepan ji vancedapp.com, servera Discord a Vanced an jî JiGitHub ya Vanced dakêşandine Versiyon Bi xêr hatî Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre Herî dawî Ronahî + %1$s Bi kêmanî zimanekî hilbijêre! Reş Tarî Pêşvebirên Rêveberê Beşdarên din Çavkanî Koma Vanced\'ê APK\'yê ji xwediyê pergalê re \'chown\' bi ser neket, ji kerema xwe re careke din biceribînin. Di daxistina %1$s de çewtî Lêpirandina rengê nû yê zaravayê biserneket Sazkirina pakêta %1$s bi ser neket Sazkirina pelên pêwîst bi ser neket. Pelên sazkirinê ji nû ve dakêşin, piştre dîsa biceribînin. Nekarî pelê apk ji bo dirba reş/tarî ji hilanînê bicîh bike, ji kerema xwe re dîsa biceribîne. Sazkirin bi ser neket ji ber ku bikarhêner sazkirin bete betalkirin. Sazkirin bi ser neket ji ber ku pêvek bi pêvek berê sazkirî re naqede. Vê versiyona heyî ya vê appê saz bike, paşê dîsa biceribîne. Sazkirin bi ser neket ji ber ku bikarhêner hewl da pakêtê kêm bike. Nûvekirinên ji parsûyê rabike, paşê dîsa biceribîne. Sazkirin ji ber sedemên nediyar têk çû, ji bo piştgiriya zêdetir tevlî Telegram an Jî Discordê me bibin. Ji kerema xwe dîmenek ekranê jî ji menuya Pêşkeftî ve girêdayî bikin Sazkirin bi ser neket ji ber ku pelê sazkirinê bi cîhaza we re ne hevkar e. Mîhengên daxistinî paqij bike, paşê dîsa biceribîne. Sazkirin bi ser neket ji ber ku pelên apk\'ê nebaş in, ji kerema xwe careke din biceribînin. Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. Sazkirin bi ser neket ji ber ku cîhaz têra xwe cihê belaş tune. Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. ================================================ FILE: app/src/main/res/values-ko-rKR/strings.xml ================================================ 취소 닫기 microG 프로젝트를 기반으로 커스텀한 Vanced용 Google 모바일 서비스입니다. 다수의 유용한 기능을 가지는 YouTube 변경 클라이언트입니다! YouTube Music의 Vanced 버전입니다. 추가된 기능이 그렇게 많지는 않지만 충분히 만족하실 거예요. 초기화 저장 설치할 앱 선택하기 정보 가이드 Manager 로그 설정 매니저 업데이트 기기가 루팅되어 있나요? 루트 권한 부여 시작하기 적어도 하나의 앱을 선택해주세요 이게 무슨 뜻인지 모르시거나 루트 버전을 사용하고 싶지 않으시다고요? 그냥 아래의 파란색 화살표를 클릭하세요! %1$s 정보 다운로드 정보 실행 재설치 제거 업데이트 변경 사항 %1$s 다운로드 중 설치 최신: Vanced microG를 우선 설치하십시오 루트 권한이 부여되지 않았습니다 소셜 미디어 지원하기 사용 불가 설치됨: 강조 색상 모양 동작 다운로드된 파일 모두 지우기 다운로드된 파일을 모두 삭제했습니다 앱 성능과 충돌 기록에 대한 정보를 수집할 수 있게 해줍니다 Firebase 분석 언어 링크가 Chrome 커스텀 탭으로 열립니다 Chrome 커스텀 탭으로 열기 %1$s 푸시 알림 새로운 %1$s 업데이트가 출시되면 알림 받기 새 시간 값을 저장할 수 없습니다. 루트 스크립트 대기 시간 /data/adb/service.d/app.sh 스크립트에 쓰이는 대기 시간을 조정하십시오. 설치 문제 해결에 유용합니다. 시스템 기본값 테마 다크 테마 라이트 테마 업데이트 센터 새로운 업데이트 없음 앱 종류 로그 저장 실패 로그 저장됨 자세히 %1$s 설치에 필요한 파일을 찾았습니다! Manager 앱이 %1$s 설치에 필요한 모든 파일을 찾았습니다. 지금 설치하시겠어요? %1$s 설치 설정 업데이트 확인 중입니다... 언어: %1$s 테마: %1$s 버전: %1$s 오류 가이드 잠깐만요! 현재 설치되어 있는 Vanced의 Magisk/TWRP 버전은 더 이상 지원되지 않으며 이 앱으로 업데이트할 수 없습니다. 먼저 삭제 프로그램을 이용하여 Vanced의 TWRP/Magisk 모듈을 제거하여 주시기 바랍니다. Vanced를 올바르게 설치하려면, 개발자 설정으로 들어가서 MIUI 최적화 기능을 반드시 끄셔야 합니다. (단, 버전이 20.2.20 이상인 xiaomi.eu 기반 ROM을 사용하는 경우 이 경고를 무시하셔도 좋습니다) MIUI 최적화 기능이 켜져 있습니다! 이 작업을 하는 동안 이 앱에서 나가지 마세요! 다시 다운로드 항상 vancedapp.com, 공식 Vanced 디스코드 서버 또는 공식 GitHub 저장소에서 Vanced Manager 앱을 다운로드해주세요. 버전 환영합니다 Vanced에서 선호하는 언어를 선택해주세요 최신 라이트 + %1$s 적어도 하나의 언어를 선택해주세요! 검정 다크 Manager 개발자 기타 기여자 소스 코드 Vanced 팀 APK의 소유권을 시스템 관리자로 변경하던 중에 오류가 발생하였습니다. 다시 시도하십시오. %1$s 다운로드 중 오류 발생 강조 색상을 적용하지 못했습니다 %1$s 패키지 제거에 실패하였습니다 설치에 필요한 파일을 찾지 못했습니다. 설치 파일을 다시 다운로드한 다음 재시도하십시오. 저장소에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. 다시 시도하십시오. 사용자가 설치를 중단했기 때문에 앱을 설치하지 못했습니다. 앱이 이미 설치된 앱과 충돌하여 설치하지 못했습니다. 현재 버전의 앱을 제거한 다음 다시 시도하십시오. 사용자가 패키지를 이전 버전으로 변경하려고 하여 앱을 설치하지 못했습니다. 기본 앱의 업데이트를 제거한 후, 설치를 다시 시도해주세요. 알 수 없는 이유로 인해 설치가 실패했습니다. 저희 텔레그램 또는 디스코드에 알려주시면 도와드리겠습니다. \'고급\' 메뉴의 스크린샷도 첨부하여 주십시오. 설치 파일이 기기와 호환되지 않아 앱을 설치하지 못했습니다. Manager 설정에서 다운로드된 파일을 모두 삭제한 다음, 설치를 다시 진행해주세요. APK 파일이 손상되어 앱을 설치하지 못했습니다. 설치를 다시 진행해주세요. MIUI 최적화 기능이 켜져 있어 앱을 설치하지 못했습니다. MIUI 최적화 기능을 끄고, 설치를 다시 진행해주세요. APK 서명 검증 기능이 활성화되어 있어 앱을 설치하지 못했습니다. 먼저 APK 서명 검증 기능을 비활성화한 다음, 설치를 다시 진행해주세요. 기기에 충분한 여유 공간이 없어 설치하지 못했습니다. 설치 관리자에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. Vanced Manager의 앱 데이터를 삭제 한 다음 다시 시도하십시오. 분할 설치 완료 후 기본 YouTube 앱 설치 경로를 찾을 수 없습니다. ================================================ FILE: app/src/main/res/values-ku-rTR/strings.xml ================================================ Betal bike Bigire A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Nûsaz bike Tomar bike Sepanên xwe hilbijêre Derbar Rêzan Rêvebirin Logs Sazkarî Rêveberê hildemîne Gelo cîhaza te Root e? Destûra Root\'ê bide Dest pê kirin Herî kêm sepanekê hilbijêre! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! Derbar %1$s Download Info Launch Reinstall Uninstall Update Apps Guherîn Tê daxistin %1$s Saz bike Dawîn: Install Vanced microG first Rê li gihana Root nehate dayîn Social Media Piştgiriya me bike Berdest nîne Saz bike: Rengê devokê Xuyang Behavior Dosiyayên daxistî paqij bike Dosiya, biserketî paqij bûn Ev yek dihêle ku em di bara performansa sepanê û tomarên hilweşiyayî de agahiyan berhev bikin Analîza Firebase\'ê Ziman Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin Hilpekên Chrome\'ê yên taybet bi kar bîne %1$s danezanên lezgîn Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues Jixwebera sîstemê Rûkar Rûkara tarî Rûkara ronak Navenda hildemandina rêveberê Hildema nû nîne Guharto Could not save logs Successfully saved logs Details %1$s dosiyên sazkirinê peyda bûn! Rêveberê peydabûna hemû ew dosiyên pêwîst ên ji bo sazkirina %1$s tesbît kir. Gelo tu dixwazî saz bikî? %1$s sazkariyên bijarde yên sazkirinê Hildem tên kontrolkirin... Ziman(ên):%1$s Rûkar: %1$s Guherto: %1$s Çewtî Rêzan Rawestîne! Hûn niha guhertoya Magisk/TWRP ji Vanced\'ê bi kar tînin, ku qut bûye û bi saya vê sepanê naye hildemandin. Jkx magsik module/bi alîkariya TWRP Vanced uninstaller\'ê rakin. Ji bo ku Vanced were sazkirin, DIVÊ hûn Optimîzasyonên MIUI-yê di sazkariyên pêşvebirinê de neçalak bikin. (Hûn dikarin vê hişyariyê paşguh bikin heke hûn ROM\'a li ser esasa xiaomi.eu 20.2.20 an jortir bi kar tînin) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Ji nû ve daxîne Piştrast bin ku we sepan ji vancedapp.com\'ê, ji servera Vanced Discord\'ê an Vanced GitHub\'ê daxistiye Guherto Bi xêr hatî Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre Dawîn Ronak + %1$s Herî kêm zimanekê hilbijêre! Reş Tarî Pêşvebirên rêveberê Other Contributors Çavkanî Koma Vanced\'ê \'Chown\' apk ji xwediyê sîstemê re bi ser neket, jkx dîsa biceribîne. Çewtiya daxistinê %1$s Failed to apply new accent color Rakirina pakêta %1$s bi ser neket Dozîna dosiyên pêwîst ji bo sazkirinê bi ser neket. Dosiyên sazkirinê dîsa daxîne, paşê dubare biceribîne. Dozîna dosiya apk ji bo rûkara reş/tarî ji bîrgehê bi ser neket, jkx dîsa biceribîne. Sazkirin bi ser neket ji ber ku bikarîner dawî li pêvajoya sazkirinê anî. Sazkirin bi ser neket ji ber ku ev bernameya ligel bernameyeke din ya sazkirî li hev nake. Guhertoya heyî ya Vanced\'ê rakin, paşê dîsa biceribînin. Sazkirin bi ser neket ji ber ku bikarîner hewl dida derecebendiya pakêtê kêm bike. Hildeman ji bernameya YouTube\'ê ya heyî rakin, paşê dîsa biceribînin. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Sazkirin bi ser neket ji ber ku dosiya sazkirinê ligel cîhaza te hevaheng nîne. Dosiyên daxistî ji sazkariyan paqij bike, paşê dîsa biceribîne. Sazkirin bi ser neket ji ber ku dosiyên apk\'ayê xirab in, jkx dîsa biceribîne. Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. Installation failed because the device doesn\'t have enough free space. Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. ================================================ FILE: app/src/main/res/values-lt-rLT/strings.xml ================================================ Cancel Close A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Reset Save Select Your Apps About Guide Manager Logs Settings Update Manager Is Your Device Rooted? Grant Root Permission Let\'s get started Select at least one app! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s Install Latest: Install Vanced microG first Root access not granted Social Media Support us Unavailable Installed: Accent Color Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default Theme Dark Theme Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s Error Guide Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Welcome Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors Sources Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-ml-rIN/strings.xml ================================================ റദ്ദാക്കുക അടക്കുക മൈക്രോ ജി പ്രോജക്റ്റിനെ അടിസ്ഥാനമാക്കി വാൻസിനായി ഒരു ഇഷ്‌ടാനുസൃത ജിഎംഎസ് നടപ്പിലാക്കൽ. ഉപയോഗപ്രദമായ നിരവധി സവിശേഷതകളുള്ള ഒരു പരിഷ്‌ക്കരിച്ച YouTube ക്ലയന്റ്! വിജയിച്ചു, പക്ഷേ YouTube സംഗീതത്തിനായി! താരതമ്യേന സവിശേഷത കുറവാണെങ്കിലും നിങ്ങളുടെ ആവശ്യങ്ങൾ നിറവേറ്റുന്നു. പുനഃക്രമീകരിക്കുക സൂക്ഷിക്കുക നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ തിരഞ്ഞെടുക്കുക കുറിച്ച് മാർഗരേഖ മാനേജർ ലോഗുകൾ ക്രമീകരണങ്ങൾ മാനേജർ പുതുക്കുക നിങ്ങളുടെ ഉപകരണം റൂട്ടു ചെയ്തതാണോ? റൂട്ട് അനുമതി നൽകുക നമുക്ക് തുടങ്ങാം ഒരു അപ്ലിക്കേഷനെങ്കിലും തിരഞ്ഞെടുക്കുക! ഇത് എന്താണെന്ന് അറിയില്ല അല്ലെങ്കിൽ റൂട്ട് പതിപ്പ് ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്നില്ലേ? ചുവടെയുള്ള നീല അമ്പടയാളത്തിൽ ക്ലിക്കുചെയ്യുക! ഏകദേശം %1$s Download Info Launch Reinstall Uninstall Update അപ്ലിക്കേഷനുകൾ ചേഞ്ച് ലോഗ് %1$s ഡൗൺലോഡ് ചെയ്യുന്നു ഇൻസ്റ്റാൾ ചെയ്യുക ഏറ്റവും പുതിയത്: ആധ്യം വാൻസ്ഡ് മൈക്രോ-ജി ഇൻസ്റ്റാൾ ചെയ്യുക്ക റൂട്ട് ആക്സസ് അനുവദിച്ചിട്ടില്ല സോഷ്യൽ മീഡിയ ഞങ്ങളെ പിന്തുണയ്ക്കുക ലഭ്യമല്ല ഇൻസ്റ്റാൾ ചെയ്തു: ആക്‌സന്റ് വർണ്ണം രൂപം പെരുമാറ്റം ഡൗൺലോഡുചെയ്‌ത ഫയലുകൾ മായ്‌ക്കുക ഫയലുകൾ വിജയകരമായി മായ്ച്ചു അപ്ലിക്കേഷൻ പ്രകടനത്തെയും ക്രാഷ് ലോഗുകളെയും കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കാൻ ഇത് ഞങ്ങളെ അനുവദിക്കുന്നു ഫയർബേസ് അനലിറ്റിക്സ് ഭാഷ Chrome Custom ടാബുകളിൽ ലിങ്കുകൾ തുറക്കും Chrome Custom ടാബുകൾ ഉപയോഗിക്കുക %1$s പുഷ് അറിയിപ്പുകൾ %1$s ഒരു അപ്‌ഡേറ്റ് പുറത്തിറങ്ങുമ്പോൾ പുഷ് അറിയിപ്പുകൾ സ്വീകരിക്കുക പുതിയ സമയ മൂല്യം സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു റൂട്ട് സ്ക്രിപ്റ്റ് ഉറക്ക സമയം മ d ണ്ടിംഗ് പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നതിന് ഉപയോഗപ്രദമായ /data/adb/service.d/app.sh സ്ക്രിപ്റ്റിൽ ഉപയോഗിച്ചിരിക്കുന്ന ഉറക്ക സമയ മൂല്യം ക്രമീകരിക്കുക സിസ്റ്റം സ്ഥിരസ്ഥിതി തീം ഡാർക്ക് തീം ലൈറ്റ് തീം മാനേജർ അപ്‌ഡേറ്റ് സെന്റർ പുതിയ അപ്‌ഡേറ്റുകളൊന്നുമില്ല വേരിയൻറ് ലോഗുകൾ സംരക്ഷിക്കാനായില്ല ലോഗുകൾ വിജയകരമായി സംരക്ഷിച്ചു വിശദാംശങ്ങൾ %1$s ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ കണ്ടെത്തി! %1$s ഇൻസ്റ്റാളേഷന് ആവശ്യമായ എല്ലാ ഫയലുകൾ മാനേജർ കണ്ടെത്തി. ഇത് ഇൻസ്റ്റാൾ ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? %1$s ഇൻസ്റ്റാളേഷൻ മുൻഗണനകൾ അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു… ഭാഷ(കൾ):%1$s തീം: %1$s പതിപ്പ്:%1$s തെറ്റ് മാർഗരേഖ നിർത്തുക! നിങ്ങൾ വാൻ‌സെഡിന്റെ മാജിസ്ക് / ടി‌ഡബ്ല്യുആർ‌പി പതിപ്പ് ഉപയോഗിക്കുന്നു, അത് നിർത്തലാക്കുകയും ഈ അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല. മാജിസ്ക് മൊഡ്യൂൾ നീക്കംചെയ്ത് / ടി‌ഡബ്ല്യുആർ‌പി വാൻ‌സ്ഡ് അൺ‌ഇൻ‌സ്റ്റാളർ ഉപയോഗിച്ച് ഇത് നീക്കംചെയ്യുക. വാൻ‌സ്ഡ് ഇൻ‌സ്റ്റാൾ‌ ചെയ്യുന്നതിന്, ഡവലപ്പർ‌ ക്രമീകരണങ്ങളിൽ‌ നിങ്ങൾ‌ MIUI ഒപ്റ്റിമൈസേഷനുകൾ‌ അപ്രാപ്‌തമാക്കണം. (നിങ്ങൾ 20.2.20 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള xiaomi.eu അടിസ്ഥാനമാക്കിയുള്ള റോം ഉപയോഗിക്കുകയാണെങ്കിൽ നിങ്ങൾക്ക് ഈ മുന്നറിയിപ്പ് അവഗണിക്കാം) MIUI ഒപ്റ്റിമൈസേഷനുകൾ പ്രാപ്തമാക്കി! പ്രോസസ്സ് സമയത്ത് അപ്ലിക്കേഷനിൽ നിന്ന് പുറത്തുകടക്കരുത്! വീണ്ടും ഡൗൺലോഡുചെയ്യുക നിങ്ങൾ vancedapp.com, Vanced Discord സെർവർ, അല്ലെങ്കിൽ Vanced GitHub എന്നിവയിൽ നിന്ന് അപ്ലിക്കേഷൻ download ൺലോഡ് ചെയ്തുവെന്ന് ഉറപ്പാക്കുക പതിപ്പ് സ്വാഗതം വാൻസിനായി നിങ്ങൾ ഭാഷ (കൾ) തിരഞ്ഞെടുക്കുക ഏറ്റവും പുതിയ പ്രകാശം +%1$s ഒരു ഭാഷയെങ്കിലും തിരഞ്ഞെടുക്കുക! കറുപ്പ് ഇരുണ്ടത് മാനേജർ ഡവലപ്പർമാർ മറ്റ് സംഭാവകർ ഉറവിടങ്ങൾ വാൻ‌സ്ഡ് ടീം സിസ്റ്റം ഉടമയ്‌ക്ക് APK `chown` ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. %1$s ഡൗൺലോഡുചെയ്യുന്നതിൽ പിശക് പുതിയ ആക്‌സന്റ് വർണ്ണം പ്രയോഗിക്കുന്നതിൽ പരാജയപ്പെട്ടു %1$s package അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു ഇൻസ്റ്റാളേഷന് ആവശ്യമായ ഫയലുകൾ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ വീണ്ടും ഡ download ൺലോഡ് ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. സംഭരണത്തിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. ഉപയോക്താവ് ഇൻസ്റ്റാളേഷൻ നിർത്തലാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ഇതിനകം ഇൻസ്റ്റാളുചെയ്‌ത അപ്ലിക്കേഷനുമായി അപ്ലിക്കേഷൻ പൊരുത്തപ്പെടുന്നതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. അപ്ലിക്കേഷന്റെ നിലവിലെ പതിപ്പ് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. ഉപയോക്താവ് പാക്കേജ് തരംതാഴ്ത്താൻ ശ്രമിച്ചതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. സ്റ്റോക്ക് അപ്ലിക്കേഷനിൽ നിന്ന് അപ്‌ഡേറ്റുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. അജ്ഞാതമായ കാരണങ്ങളാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു, കൂടുതൽ പിന്തുണയ്ക്കായി ഞങ്ങളുടെ ടെലിഗ്രാം അല്ലെങ്കിൽ ഡിസ്കോർഡിൽ ചേരുക. വിപുലമായ മെനുവിൽ നിന്ന് ഒരു സ്ക്രീൻഷോട്ട് അറ്റാച്ചുചെയ്യുക ഇൻസ്റ്റാളേഷൻ ഫയൽ നിങ്ങളുടെ ഉപകരണവുമായി പൊരുത്തപ്പെടാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ക്രമീകരണങ്ങളിൽ ഡ download ൺലോഡ് ചെയ്ത ഫയലുകൾ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. Apk ഫയലുകൾ‌ കേടായതിനാൽ‌ ഇൻ‌സ്റ്റാളേഷൻ‌ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. MIUI ഒപ്റ്റിമൈസേഷൻ പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. MIUI ഒപ്റ്റിമൈസേഷൻ അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. Apk സിഗ്നേച്ചർ പരിശോധന പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. Apk സിഗ്നേച്ചർ പരിശോധന അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. ഉപകരണത്തിന് മതിയായ ഇടമില്ലാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ഇൻസ്റ്റാളറിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. മാനേജറിന്റെ അപ്ലിക്കേഷൻ ഡാറ്റ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. വിഭജന ഇൻസ്റ്റാളേഷന് ശേഷം സ്റ്റോക്ക് YouTube ഇൻസ്റ്റാളേഷൻ പാത്ത് കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. ================================================ FILE: app/src/main/res/values-mr-rIN/strings.xml ================================================ रद्द करा बंद करा A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. रीसेट करा सेव करा आपले अप्प्स निवडा अॅप बद्दल माहिती Guide मॅनेजर Logs सेटिंग मॅनेजर ला अपडेट करा आपला मोबाइल रूट आहे का? रूट ची परवानगी द्या Let\'s get started कमीत कमी एक अॅप निवडा! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s Install Latest: Install Vanced microG first Root access not granted Social Media Support us Unavailable Installed: Accent Color Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default Theme Dark Theme Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s Error Guide Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Welcome Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors Sources Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-night/colors.xml ================================================ #131317 ================================================ FILE: app/src/main/res/values-nl-rNL/strings.xml ================================================ Annuleren Sluiten Een aangepaste GMS-implementatie voor Vanced gebaseerd op het microG-project. Een aangepaste versie van YouTube met veel handige functies! Vanced, maar voor YouTube Music!\nMinder functies maar voldoet aan al je wensen. Herstellen Bewaren Apps selecteren Over Gids Manager Logs Instellingen Manager bijwerken Is je apparaat geroot? Root-machtiging toestaan Aan de slag! Selecteer minstens één app! Weet je niet wat dit is of wil je de root-versie niet gebruiken? Klik dan op de blauwe pijl hieronder! Over %1$s Downloaden Info Starten Herinstalleren Verwijderen Bijwerken Apps Wijzigingen %1$s downloaden Installeren Recentste: Installeer eerst Vanced microG Root machtiging niet toegestaan Sociale media Steun ons Niet beschikbaar Geïnstalleerd: Accentkleur Weergave Gedrag Gedownloade bestanden verwijderen Bestanden succesvol verwijderd Hiermee kunnen we informatie over app-prestaties en crashlogs verzamelen Firebase-analytics Taal Links zullen openen in aangepaste Chrome-tabs Aangepaste Chrome-tabs gebruiken Pushmeldingen %1$s Pushmeldingen ontvangen wanneer er een update voor %1$s beschikbaar is Bewaren van nieuwe waarde voor slaaptimer mislukt Slaaptimer root script Aanpassen waarde voor slaaptimer gebruikt in /data/adb/service.d/app.sh script, nuttig bij mount-issues Systeemstandaard Thema Donker thema Licht thema Manager bijwerken Geen nieuwe updates Versie Logs niet opgeslagen Logs succesvol opgeslagen Details Installatiebestanden voor %1$s gedetecteerd! Manager heeft alle nodige bestanden gedetecteerd voor het installeren van %1$s. Wil je ze installeren? Installatievoorkeuren voor %1$s Controleren op updates… Talen: %1$s Thema: %1$s Versie: %1$s Fout Handleiding Stoppen! Je gebruikt de Magisk/TWRP-versie van Vanced, die is stopgezet en niet met deze app kan worden bijgewerkt. Verwijder deze eerst door de Magisk-module te verwijderen of door de TWRP Vanced-uninstaller te gebruiken. Om Vanced te installeren MOET je MIUI-optimalisaties uitschakelen in de ontwikkelaarsinstellingen (je kunt deze waarschuwing negeren als je de op xiaomi.eu gebaseerde ROM 20.2.20 of later gebruikt) MIUI-optimalisaties zijn ingeschakeld! Sluit de app NIET af tijdens dit proces! Opnieuw downloaden Zorg ervoor dat je de app hebt gedownload van vancedapp.com, de Vanced Discord-server of Vanced GitHub Versie Welkom Kies je gewenste taal/talen voor Vanced Nieuwste versie Licht + %1$s Selecteer minstens één taal! Zwart Donker Ontwikkelaars Manager Andere bijdrages Bronnen Vanced Team Wijzigen van APK-eigenaar naar systeemeigenaar mislukt. Probeer het opnieuw. Fout bij downloaden van %1$s Nieuwe accentkleur toepassen mislukt Deïnstalleren van pakket %1$s mislukt Kan de vereiste bestanden voor de installatie niet vinden. Download de installatiebestanden opnieuw en probeer het opnieuw. Kan het apk-bestand voor zwart/donker thema niet vinden in opslag. Probeer het opnieuw. Installatie mislukt omdat de gebruiker de installatie heeft afgebroken. Installatie mislukt omdat de app conflicten heeft met een reeds geïnstalleerde app. Verwijder de huidige versie van die app en probeer het opnieuw. Installatie mislukt omdat de gebruiker het pakket probeerde te downgraden. Verwijder updates van de standaard app en probeer het daarna opnieuw. Installatie is mislukt om onbekende redenen, ga naar Telegram of Discord voor verdere ondersteuning. Voeg een screenshot toe via het menu Geavanceerd. Installatie mislukt omdat het installatiebestand niet compatibel is met jouw apparaat. Wis de gedownloade bestanden in de instellingen en probeer het opnieuw. Installatie mislukt omdat de apk-bestanden beschadigd zijn. Probeer het opnieuw. Installatie mislukt omdat MIUI-optimalisatie is ingeschakeld. Schakel MIUI-optimalisatie uit en probeer het opnieuw. Installatie mislukt omdat apk-handtekeningverificatie is ingeschakeld. Schakel apk-handtekeningverificatie uit en probeer het opnieuw. Installatie mislukt omdat het apparaat niet genoeg vrije ruimte heeft. Kan het apk-bestand voor zwart/donker thema niet vinden in het installatiebestand. Verwijder de appdata van Vanced Manager en probeer het opnieuw. Kan het standaard YouTube-installatiepad niet vinden na de gesplitste installatie. ================================================ FILE: app/src/main/res/values-no-rNO/strings.xml ================================================ Avbryt Lukk En tilpasset GMS-implementering for Vanced basert på microG-prosjektet. En modifisert YouTube klient med mange nyttige funksjoner! Vanced, med for YouTube Musikk! Relativt mindre funkjonsrik men dekker dine behov. Tilbakestill Lagre Velg dine apper Om Guide Leder Logger Innstillinger Oppdater administrator Er enheten tilkoblet? Gi root-tillatelse La oss komme i gang Velg minst en app! Vet du ikke hva detter er eller ikke ønsker å bruke rot-versjonen? Bare klikk på den blå pilen nedenfor! Om %1$s Download Info Launch Reinstall Uninstall Update Apper Endringslogg Laster ned %1$s Installer Siste: Installer Vanced microG først Root-tilgang ikke godkjent Sosiale Medier Støtt oss Utilgjengelig Installert: Aksentfarge Utseende Oppførsel Fjern nedlastede filer Valgte filer er fjernet Dette lar oss samle informasjon om app-ytelse og krasj-logger Firebase analyser Språk Lenker vil åpne i Chrome Custom Tabs Bruk Chrome Custom Tabs %1$s Push varsler Motta push varsler når en oppdatering for %1$s er utgitt Kan ikke lagre ny tidsverdi Hviletid for Root skript Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System standard Tema Mørkt tema Lyst tema Oppdateringssenter Ingen nye oppdateringer Variant Could not save logs Successfully saved logs Details %1$s installasjonsfiler oppdaget! Manager oppdaget at alle nødvendige filer for %1$s installasjonen ble funnet. Vil du installere den? %1$s Installasjonsinnstillinger Sjekker etter oppdateringer… Språk: %1$s Tema: %1$s Versjon: %1$s Feil Guide Stopp! Du bruker Magisk/TWRP-versjonen av Vansert, som seponeres og som ikke kan oppdateres ved hjelp av denne appen. Vennligst fjern den ved å fjerne Magisk modul/bruke TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Last ned på nytt Sørg for at du lastet ned appen fra vancedapp.com, Vanced Discord server, eller Vanced GitHub Versjon Velkommen Velg dine foretrukne språk for Vanced Latest Lys + %1$s Velg minst ett språk! Black Dark Manager Devs Other Contributors Kilder Vanced Team Kan ikke `chown` APK til systemeieren, vennligst prøv igjen. Feil ved nedlasting %1$s Failed to apply new accent color Kunne ikke avinstallere pakken %1$s Kunne ikke finne de nødvendige filene for installasjon. Last ned installasjonsfilene på nytt, og prøv på nytt. Klarte ikke å finne apk-filen for svart/mørkt tema på enheten, vennligst prøv igjen. Installasjonen mislyktes fordi brukeren avbrutt installasjonen. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installasjonen mislyktes på grunn av at installasjonsfilen er inkompatibel med enheten. Fjern nedlastede filer i innstillinger og prøv på nytt. Installasjonen mislyktes fordi apk-filene er ødelagt, vennligst prøv på nytt. Installasjonen mislyktes fordi MIUI-optimalisering er aktivert. Deaktiver MIUI-optimalisering og prøv på nytt. Installasjon feilet fordi apk signaturverifikasjon er aktivert. Deaktiver apk signaturverifikasjon og prøv på nytt. Installation failed because the device doesn\'t have enough free space. Finner ikke apk-filen for svart/mørkt tema fra installatøren. Fjern data fra denne appen og prøv på nytt. Klarte ikke å lokalisere YouTube installasjonsstien etter splittet installasjon. ================================================ FILE: app/src/main/res/values-pa-rIN/strings.xml ================================================ ਰੱਦ ਕਰੋ ਬੰਦ ਕਰੋ A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. ਰੀਸੈੱਟ ਸੁੱਰਖਿਅਤ ਕਰੋ ਹੋਰ ਐਪ ਚੁਣੋ ਸਾਡੇ ਬਾਰੇ ਵਿੱਚ Guide ਮੈਨੇਜਰ Logs ਸੈਟਿੰਗਜ਼ ਅਪਡੇਟ ਮੈਨੇਜਰ ਕੀ ਤੁਹਾਡੀ ਡਵਿਾਈਸ ਰੂਟ ਕੀਤਾ ਹੈ? ਰੂਟ ਹਿਦਾਇਤਾਂ ਜਾਰੀ ਆਓ ਸ਼ੁਰੂ ਕਰੀਏ ਘੱਟੋ ਘੱਟ ਇੱਕ ਐਪ ਦੀ ਚੋਣ ਕਰੋ! ਪਤਾ ਨਹੀਂ ਇਹ ਕੀ ਹੈ ਜਾਂ ਰੂਟ ਵਰਜ਼ਨ ਨਹੀਂ ਵਰਤਣਾ ਚਾਹੁੰਦੇ? ਹੇਠ ਦਿੱਤੇ ਨੀਲੇ ਤੀਰ ਤੇ ਕਲਿਕ ਕਰੋ! ਬਾਰੇ %1$s Download Info Launch Reinstall Uninstall Update Apps ਤਬਦੀਲੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ %1$s ਸਥਾਪਨਾ ਨਵੀਨਤਮ: Install Vanced microG first ਰੂਟ ਐਕਸੈਸ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਸੋਸ਼ਲ ਮੀਡੀਆ ਸਾਡਾ ਸਮਰਥਨ ਕਰੋ ਮੋਜੂਦ ਨਹੀਂ ਹੈ ਸਥਾਪਿਤ: ਐੱਕਸੈਂਟ ਰੰਗ ਦਿੱਖ ਵਿਹਾਰ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਸਾਫ਼ ਕਰੋ ਸਫਲਤਾਪੂਰਵਕ ਫਾਈਲਾਂ ਸਾਫ਼ ਕੀਤੀਆਂ ਇਹ ਸਾਨੂੰ ਐਪ ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਕਰੈਸ਼ ਲੌਗਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰਨ ਦਿੰਦਾ ਹੈ ਫਾਇਰਬੇਸ ਵਿਸ਼ਲੇਸ਼ਣ ਭਾਸ਼ਾ ਲਿੰਕ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਵਿੱਚ ਖੁੱਲ੍ਹਣਗੇ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਦੀ ਵਰਤੋਂ ਕਰੋ %1$s ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਜਦੋਂ %1$s ਦਾ ਅੱਪਡੇਟ ਜਾਰੀ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ ਨਵਾਂ ਸਮਾਂ ਮੁੱਲ ਬਚਾਉਣ ਵਿੱਚ ਅਸਫਲ ਰੂਟ ਸਕ੍ਰਿਪਟ ਨੀਂਦ ਦਾ ਸਮਾਂ ਮਾdਟ ਕਰਨ ਵਾਲੇ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਲਾਭਦਾਇਕ, /data/adb/service.d/app.sh ਸਕ੍ਰਿਪਟ ਵਿੱਚ ਸੁੱਤਾ ਸਮਾਂ ਮੁੱਲ ਵਿਵਸਥਿਤ ਕਰੋ ਸਿਸਟਮ ਡਿਫੌਲਟ ਥੀਮ ਡਾਰਕ ਥੀਮ ਲਾਇਟ ਥੀਮ ਮੈਨੇਜਰ ਅਪਡੇਟ ਕੇਂਦਰ ਕੋਈ ਨਵੇਂ ਅਪਡੇਟਸ ਨਹੀਂ ਕਿਸਮ Could not save logs Successfully saved logs Details %1$s ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਲੱਭੀਆਂ! ਮੈਨੇਜਰ ਨੇ ਖੋਜਿਆ ਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਇਲਾਂ %1$s ਮਿਲੀਆਂ ਹਨ. ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? %1$s ਸਥਾਪਨਾ ਚੁਣੋ ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ… ਭਾਸ਼ਾ (ਇ): %1$s ਥੀਮ: %1$s ਵਰਜਨ %1$s ਗਲਤੀ ਗਾਇਡ ਉਡੀਕੋ! ਤੁਸੀਂ Vanced ਦੇ Magisk / TWRP ਸੰਸਕਰਣ ਦਾ ਉਪਯੋਗ ਕਰ ਰਹੇ ਹੋ, ਜਿਸਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ ਅੱਤੇ ਇਸ ਐਪ ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ| ਕਿਰਪਾ ਇਸ Magisk ਮੋਡੂਅਲ ਨੂੰ / TWRP Vanced uninstaller ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਹੱਟਾ ਦੇਵੋਂ. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! ਮੁੜ ਡਾਉਨਲੋਡ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ vancedapp.com, Vanced Discord ਸਰਵਰ ਜਾਂ Vanced GitHub ਤੋਂ ਐਪ ਡਾਉਨਲੋਡ ਕੀਤਾ ਹੈ ਵਰਜਨ ਜੀ ਆਇਆਂ ਨੂੰ Vanced ਦੇ ਲਈ ਆਪਣੀ ਪਸੰਦੀਦਾ ਭਾਸ਼ਾ (ਏ) ਚੁਣੋ Latest ਲਾਇਟ + %1$s ਘੱਟੋ-ਘੱਟ ਇੱਕ ਭਾਸ਼ਾ ਚੁਣੋ! Black Dark ਪ੍ਬੰਧਕ ਨਿਰਮਾਣਕਰਤਾ Other Contributors ਸਰੋਤ Vanced ਟੋਲੀ ਸਿਸਟਮ ਦੇ ਮਾਲਕ ਨੂੰ APK ਨੂੰ `chown` ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ, ਫਿਰ ਤੋਂ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਡਾਉਨਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ %1$s ਨਵਾਂ ਲਹਿਜ਼ਾ ਰੰਗ ਲਾਗੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਪੈਕਜ ਦੀ ਸਥਾਪਨਾ ਰੱਦ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ %1$s ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਈਲਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਨੂੰ ਮੁੜ ਡਾਉਨਲੋਡ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਸਟੋਰੇਜ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਇੰਸਟਾਲ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਰੱਦ ਕਰ ਦਿੱਤੀ. ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਐਪ ਪਹਿਲਾਂ ਤੋਂ ਸਥਾਪਤ ਐਪ ਨਾਲ ਟਕਰਾਉਂਦੀ ਹੈ. ਐਪ ਦੇ ਮੌਜੂਦਾ ਸੰਸਕਰਣ ਨੂੰ ਅਣਇੰਸਟੌਲ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ. ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਏਪੀਕੇ ਫਾਈਲਾਂ ਖ਼ਰਾਬ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. MIUI ਸਥਾਪਨਾ ਅਸਫਲ, ਕਿਉਂਕਿ Optimization ਯੋਗ ਕੀਤੀ ਗਈ ਸੀ. MIUI Optimization ਅਯੋਗ ਕਰੋ ਫਿਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਯੋਗ ਹੈ. ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਨੂੰ ਅਯੋਗ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. Installation failed because the device doesn\'t have enough free space. ਇੰਸਟੌਲਰ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ. ਮੈਨੇਜਰ ਐਪ ਦਾ ਡਾਟਾ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਸਪਲਿਟ ਇੰਸਟਾਲੇਸ਼ਨ ਦੇ ਬਾਅਦ ਸਟਾਕ YouTube ਇੰਸਟਾਲੇਸ਼ਨ ਮਾਰਗ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. ================================================ FILE: app/src/main/res/values-pa-rPK/strings.xml ================================================ Cancel Close A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Reset Save Select Your Apps About Guide Manager Logs Settings Update Manager Is Your Device Rooted? Grant Root Permission Let\'s get started Select at least one app! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s Install Latest: Install Vanced microG first Root access not granted Social Media Support us Unavailable Installed: Accent Color Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default Theme Dark Theme Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s Error Guide Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Welcome Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors Sources Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-pl-rPL/strings.xml ================================================ Anuluj Zamknij Niestandardowa implementacja GMS dla Vanced w oparciu o projekt microG. Zmodyfikowany klient YouTube z wieloma przydatnymi funkcjami! Vanced, ale dla Muzyki YouTube! Stosunkowo mniej bogaty w funkcje, ale spełnia Twoje potrzeby. Zresetuj Zapisz Wybierz swoje aplikacje O nas Przewodnik Menedżer Dzienniki Ustawienia Zaktualizuj Menedżera Czy Twoje urządzenie jest zakorzenione (root)? Przyznaj uprawnienie root Zaczynajmy Wybierz co najmniej jedną aplikację! Nie wiesz, co to jest lub nie chcesz użyć wersji z rootem? Po prostu kliknij niebieską strzałkę poniżej! O %1$s Pobierz Informacja Uruchom Przeinstaluj Odinstaluj Aktualizuj Aplikacje Lista zmian Pobieranie %1$s Zainstaluj Najnowsza: Najpierw zainstaluj Vanced microG Root nie został przyznany Media Społecznościowe Wesprzyj nas Niedostępne Zainstalowano: Kolor Akcentu Wygląd Zachowanie Wyczyść pobrane pliki Pomyślnie wyczyszczono pliki To pozwala nam zbierać informacje o wydajności aplikacji i dziennikach awarii Analityka Firebase Język Linki zostaną otwarte w niestandardowych kartach Chrome Używaj niestandardowych kart Chrome %1$s Powiadomień Push Otrzymuj powiadomienia push po wydaniu aktualizacji dla %1$s Nie udało się zapisać nowej wartości czasu Czas snu skryptu root Dostosuj wartość czasu uśpienia w skrypcie /data/adb/service.d/app.sh, przydatne do naprawy problemów z montowaniem Domyślny systemowy Motyw Ciemny Motyw Jasny Motyw Centrum aktualizacji Brak nowych aktualizacji Wariant Nie udało się zapisać dzienników Pomyślnie zapisano dzienniki Szczegóły Wykryto %1$s plików instalacyjnych! Menedżer wykrył, że znaleziono wszystkie pliki niezbędne do instalacji %1$s. Czy chcesz zainstalować? Preferencje instalacji %1$s Sprawdzam aktualizacje… Język(i): %1$s Motyw: %1$s Wersja: %1$s Błąd Przewodnik Stop! Używasz wersji Magisk/TWRP Vanced, która została przerwana i nie może zostać zaktualizowana za pomocą tej aplikacji. Proszę go usunąć usuwając moduł Magisk/używając TWRP Vanced deinstalatora. Aby zainstalować Vanced, MUSISZ wyłączyć optymalizację MIUI w ustawieniach dewelopera. (Możesz zignorować to ostrzeżenie, jeśli korzystasz z ROM 20.2.20 lub późniejszego xiaomi.eu) Optymalizacja MIUI jest włączona! NIE wychodź z aplikacji podczas trwania tego procesu! Pobierz ponownie Upewnij się, że pobrałeś aplikację z vancedapp.com, serwera Vanced Discord lub Vanced GitHub Wersja Witaj Wybierz preferowany język(i) dla Vanced Najnowsza Jasny + %1$s Wybierz co najmniej jeden język! Czarny Ciemny Deweloperzy Menedżera Inni współtwórcy Źródła Zespół Vanced Nie udało się `chown` APK dla właściciela systemu, spróbuj ponownie. Błąd pobierania %1$s Nie udało się zastosować nowego koloru akcentu Nie udało się odinstalować pakietu %1$s Nie udało się zlokalizować wymaganych plików do instalacji. Pobierz ponownie pliki instalacyjne, a następnie spróbuj ponownie. Nie udało się zlokalizować pliku apk dla czarnego/ciemnego motywu, spróbuj ponownie. Instalacja nie powiodła się, ponieważ użytkownik przerwał instalację. Instalacja nie powiodła się ponieważ aplikacja konfliktuje z już zainstalowaną aplikacją. Odinstaluj aktualną wersję aplikacji a następnie spróbuj ponownie. Instalacja nie powiodła się, ponieważ użytkownik próbował obniżyć paczkę. Odinstaluj aktualizacje z domyślnej aplikacji YouTube, a następnie spróbuj ponownie. Instalacja nie powiodła się z nieznanych powodów, dołącz do naszego Telegrama lub Discorda, aby uzyskać dalsze wsparcie. Proszę również dołączyć zrzut ekranu z zaawansowanego menu Instalacja nie powiodła się, ponieważ plik instalacyjny jest niezgodny z Twoim urządzeniem. Wyczyść pobrane pliki w Ustawieniach, a następnie spróbuj ponownie. Instalacja nie powiodła się, bo pliki apk są uszkodzone, spróbuj jeszcze raz. Instalacja nie powiodła się, ponieważ optymalizacja MIUI jest włączona. Wyłącz optymalizację MIUI, a następnie spróbuj ponownie. Instalacja nie powiodła się, ponieważ włączona jest weryfikacja podpisu apk. Wyłącz weryfikację podpisu apk, a następnie spróbuj ponownie. Instalacja nie powiodła się, ponieważ urządzenie nie ma wystarczającej ilości wolnego miejsca. Nie udało się znaleźć pliku apk dla czarnego/ciemnego motywu z instalatora. Wyczyść dane aplikacji Menedżera i spróbuj ponownie. Nie udało się zlokalizować ścieżki instalacji YouTube po podzieleniu instalacji. ================================================ FILE: app/src/main/res/values-ps-rAF/strings.xml ================================================ Cancel Close A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Reset Save Select Your Apps About Guide Manager Logs Settings Update Manager Is Your Device Rooted? Grant Root Permission Let\'s get started Select at least one app! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s Install Latest: Install Vanced microG first Root access not granted Social Media Support us Unavailable Installed: Accent Color Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics Language Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default Theme Dark Theme Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s Error Guide Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version Welcome Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors Sources Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-pt-rBR/strings.xml ================================================ Cancelar Fechar Uma implementação personalizada de GMS para Vanced com base no projeto microG. Um cliente modificado do YouTube com muitos recursos úteis! Vanced, mas para o YouTube Music! Relativamente menos funções, mas satisfaz suas necessidades. Resetar Salvar Selecione Seus Aplicativos Sobre Guia Gerenciador Registros Configurações Gerenciador de Atualização Seu Dispositivo Tem Root? Conceder Permissão de Root Vamos começar Selecione pelo menos um aplicativo! Não sabe o que isto é ou não quer usar a versão root? basta clicar na seta azul abaixo! Sobre %1$s Baixar Informações Iniciar Reinstalar Desinstalar Atualizar Aplicativos Registro de mudanças Baixando %1$s Instalar Mais recente: Instale o microG Vanced primeiro Acesso root não concedido Mídias Sociais Apoie-nos Indisponível Instalado: Cor de destaque Aparência Comportamento Limpar arquivos baixados Arquivos limpos com sucesso Isto nos permite coletar informações sobre o desempenho do aplicativo e registros de falhas Análises de Firebase Idioma Os links serão abertos nas abas personalizadas do Chrome Usar abas personalizadas do Chrome %1$s notificações push Receber notificações quando uma atualização para o %1$s for lançado Falha ao salvar o novo valor de tempo Tempo de repouso do script root Ajuste o valor do tempo de suspensão usado no script/data/adb/service.d/app.sh, útil para corrigir problemas de montagem Padrão do sistema Tema Escuro Claro Centro de Atualizações Não há novas atualizações Variante Não foi possível salvar os registros Registros salvos com sucesso Detalhes %1$s arquivos de instalação detectados! O gerenciador detectou que todos os arquivos necessários para a instalação de %1$s foram encontrados. Você quer instalar? %1$s Preferências de Instalação Verificando por atualizações… Idioma(s): %1$s Tema: %1$s Versão: %1$s Erro Guia Pare! Você está usando a versão Magisk/TWRP do Vanced, que foi descontinuada e não pode ser atualizada com este aplicativo. Desinstale-o removendo o módulo em Magisk/usando o desinstalador TWRP Vanced. Para instalar o Vanced, você PRECISA desligar as otimizações da MIUI nas opções de desenvolvedor. (Você pode ignorar esse aviso caso estiver usando uma ROM baseada na xiaomi.eu versão 20.2.20 ou superior) Otimização MIUI está habilitada! Por favor NÃO saia do aplicativo durante este processo! Baixar novamente Certifique-se de fazer o download do aplicativo em vancedapp.com, no servidor Vanced Discord ou no Vanced GitHub Versão Bem-vindo Escolha o seu idioma preferido para o Vanced Mais recente Claro + %1$s Selecione pelo menos um idioma! Preto Escuro Desenvolvedores do Manager Outros contribuidores Fontes Equipe Vanced Falha ao enviar o Apk para o proprietário do sistema, Tente Novamente. Erro ao baixar %1$s Falha ao aplicar nova cor de destaque Falha ao desinstalar o pacote %1$s Falha ao localizar os arquivos necessários para instalação. Baixe novamente os arquivos de instalação e tente novamente. Falha ao localizar o arquivo apk para o tema preto/escuro a partir do armazenamento, por favor tente novamente. A instalação falhou porque o usuário abortou a instalação. A instalação falhou porque o app está em conflito com um app já instalado. Desinstale a versão atual do aplicativo e tente novamente. A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do aplicativo padrão e tente novamente. A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para obter mais suporte. Por favor, anexe também uma captura de tela do menu Avançado A instalação falhou porque o arquivo de instalação é incompatível com o seu dispositivo. Limpe os arquivos baixados nas configurações e tente novamente. A instalação falhou porque os arquivos apk estão corrompidos, tente novamente. A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. A instalação falhou porque a verificação de assinatura do apk está ativado. Desative a verificação de assinatura do apk e tente novamente. A instalação falhou porque o dispositivo não tem espaço livre suficiente. Falha ao encontrar o arquivo apk para o tema preto/escuro a partir do instalador. Limpe os \"dados do app\" do Manager e tente novamente. Falha ao localizar o caminho de instalação padrão do YouTube após a instalação dividida (split). ================================================ FILE: app/src/main/res/values-pt-rPT/strings.xml ================================================ Cancelar Fechar Uma implementação personalizada de GMS para Vanced com base no projeto microG. Um cliente modificado do YouTube com muitos recursos úteis! Vanced, mas para o YouTube Music! Relativamente menos rico em recursos, mas atende às suas necessidades. Resetar Guardar Selecione as suas aplicações Sobre Guia Gestor Registo de Eventos Configurações Gestor de Atualização Seu Dispositivo Tem Root? Conceder Permissão de Root Vamos começar Selecione pelo menos uma aplicação! Não sabes o que é isto ou não queres utilizar a versão root? apenas clique a seta azul abaixo! Acerca de %1$s Download Info Launch Reinstall Uninstall Update Aplicações Lista de alterações Transferindo %1$s Instalar Mais Recente: Instale o microG Vanced primeiro Acesso root negado. Redes Sociais Suporte-nos Indisponível Instalado: Cor de Destaque Aparência Comportamento Limpar ficheiros descarregados Arquivos limpos com sucesso Isto permite-nos recolher informações sobre o desempenho da aplicação e registos de falhas Análise do Firebase Idioma Os links serão abertos em abas personalizadas do Chrome Usar abas personalizadas do Chrome Notificações Push %1$s Receber notificações Push quando uma actualização para %1$s estiver disponível Falhou ao salvar novo valor de tempo Tempo de suspensão do script Root Ajuste o valor de tempo de suspensão usado no script /data/adb/service.d/app.sh, útil para a correção de problemas de montagem Padrão do sistema Tema Tema Escuro Tema Claro Centro de Actualizações Sem atualizações Variante Não foi possível salvar os registos Registos salvos com sucesso Detalhes %1$s arquivos de instalação detetados! O gestor detectou que todos os arquivos necessários para a instalação %1$s foram encontrados. Você quer instalá-lo? Preferências de instalação %1$s A procurar por atualizações… Língua(s): %1$s Tema: %1$s Versão: %1$s Erro Guia Parar! Você está usando a versão Magisk/TWRP do Vanced, que está descontinuada e não pode ser atualizada usando este aplicativo. Por favor, remova-o removendo o módulo Magisk/usando a desinstalação TWRP Vanced Uninstaler. Para instalar o Vanced, você DEVE desativar as Otimizações MIUI nas configurações do desenvolvedor. (Você pode ignorar este aviso se você estiver usando ROM baseada em 20.2.20 ou mais tarde xiaomi.eu) Optimizações MIUI estão habilitadas! Por favor NÃO saia do aplicativo durante este processo! Voltar a descarregar Certifique-se de que você baixou o aplicativo do vancedapp.com, o servidor Vanced Discord ou o Vanced GitHub Versão Bem-Vindo Escolha a(s) sua(s) língua(s) de preferência para o Vanced Mais Recente Claro + %1$s Selecione ao menos um idioma! Preto Escuro Desenvolvedores do Manager Outros Colaboradores Fontes Equipa Vanced Falhou na mudança de dono do Apk para o proprietário do sistema, por favor, tente novamente. Erro Transferindo %1$s Falha ao aplicar nova cor de destaque Erro a desinstalar pacote %1$s Falha ao localizar os arquivos necessários para instalação. Faça o download dos arquivos de instalação e tente novamente. Falha ao localizar o apk para o tema preto/escuro no armazenamento, por favor, tente novamente. A instalação falhou porque o usuário abortou a instalação. A instalação falhou porque o app entra em conflito com um app já instalado. Desinstale a versão atual do app e tente novamente. A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do app do YouTube e, em seguida, tente novamente. A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para mais suporte. Por favor, anexe também uma captura de tela do menu Avançado Falha na instalação porque o pacote de instalação é incompatível com o seu dispositivo. Limpe os pacotes transferidos nas Configurações e tente novamente. A instalação falhou porque os pacotes apk estão corrompidos, por favor tente novamente. A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. A instalação falhou porque a verificação de assinatura apk está ativa. Desative a verificação de assinatura apk e tente novamente. A instalação falhou porque o dispositivo não tem espaço livre suficiente. Falha ao encontrar o arquivo apk para o tema preto/escuro no instalador. Limpe os dados do app do Gerenciador (Vanced Manager) e tente novamente. Falha ao localizar o caminho de instalação padrão do YouTube após instalação dividida. ================================================ FILE: app/src/main/res/values-ro-rRO/strings.xml ================================================ Anulaţi Închide O implementare personalizată a GMS pentru Vanced pe baza proiectului microG. Un client YouTube modificat, cu multe caracteristici utile! Vansat, dar pentru muzica YouTube! Relativ mai puțin bogat în caracteristici, dar îți îndeplinește nevoile. Resetează Salvează Selectați aplicațiile Despre Ghid Manager Jurnale Configurări Actualizați Manager Dispozitivul tău este rootat? Acordați permisiunea Root Să începem Selectaţi cel puţin o aplicație! Nu știți ce este sau nu vreți să folosiți versiunea root? Apăsați săgeata albastră de mai jos! Despre %1$s Download Info Launch Reinstall Uninstall Update Aplicații Schimbări Se descarcă %1$s Instalează Ultima: Instalați Vanced microG mai întâi Accesul root nu este permis Rețele sociale Ajutați-ne Indisponibil Instalat: Nuanță culoare Aspect Comportament Ştergeţi fişierele descărcate Fişiere şterse cu succes Acest lucru ne permite să colectăm informații despre performanța aplicației și jurnale de eroare Statistici Firebase Limbă Link-uri se vor deschide în filele personalizate Chrome Utilizează file personalizate Chrome %1$s Notificari push Primiți notificări push când o actualizare pentru %1$s este lansată Salvarea noii valori de timp a eșuat După cât timp se activează script-ul root Reglați după cât timp este activat script-ul root folosit în /data/adb/service.d/app.sh script, util pentru remedierea problemelor de montare Setarea implicită a sistemului Temă Temă întunecată Temă deschisă Actualizator Nu există actualizări noi Variantă Jurnalele nu pot fi salvate Jurnale salvate cu succes Detalii %1$s fișiere de instalare detectate! Manager a detectat că au fost găsite toate fişierele necesare pentru instalarea %1$s . Doriţi să le instalaţi? %1$s Preferințe de instalare Verificare actualizări… Limbă: %1$s Temă: %1$s Versiune: %1$s Eroare Ghid Oprește! Folosiți versiunea Magisk/TWRP a Vanced, care nu mai este în uz și nu poate fi actualizată folosind această aplicație. Vă rugăm să o eliminați prin eliminarea modulului Magisk/folosind dezinstalatorul Vanced TWRP. Pentru a instala Vanced, TREBUIE să dezactivați Optimizările MIUI în setările pentru dezvoltatori. (Puteți ignora această avertizare dacă utilizați un ROM bazat pe xiaomi.eu cu versiunea 20.2.20 sau mai recent) Optimizările MIUI sunt activate! Vă rugăm să NU ieșiți din aplicație în timpul acestui proces! Redescărcare Asigurați-vă că ați descărcat aplicația de pe vancedapp.com, de pe serverul Discord Vanced sau de pe GitHub Vanced Versiune Bun venit Alegeți limba preferată pentru Vanced Cel mai recent Alb + %1$s Selectaţi cel puţin o limbă! Negru Întunecat Dezvoltatori Alți Contribuitori Surse Echipa Vanced Nu s-a reușit comanda chown pentru APK la proprietarul sistemului. Încercați din nou. Eroare la descărcarea %1$s Nu s-a putut aplica noua culoare de evidențiere Dezinstalarea pachetului %1$s a eșuat Nu s-a reușit localizarea fișierelor necesare pentru instalare. Redescărcați fișierele de instalare, apoi încercați din nou. Nu s-a reuşit localizarea fişierului apk pentru tema neagră/întunecată din stocare, vă rugăm să încercaţi din nou. Instalarea a eșuat deoarece utilizatorul a anulat instalarea. Instalarea a eșuat deoarece aplicația intră în conflict cu o aplicație deja instalată. Dezinstalați versiunea curentă a aplicației, apoi încercați din nou. Instalarea a eșuat deoarece utilizatorul a încercat să retrogradeze pachetul. Dezinstalați actualizările din aplicația stock YouTube, apoi încercați din nou. Instalarea a eșuat din motive necunoscute. Pentru asistență, intră pe grupul nostru de Telegram sau Discord. Te rugăm să atașezi și o captură de ecran din meniul Avansat Instalarea a eșuat deoarece fișierul de instalare este incompatibil cu dispozitivul dvs. Ștergeți fișierele descărcate din Setări, apoi încercați din nou. Instalarea a eșuat deoarece fișierele apk sunt corupte, încercați din nou. Instalarea a eșuat deoarece este activată optimizarea MIUI. Dezactivați optimizarea MIUI, apoi încercați din nou. Instalarea a eșuat deoarece verificarea semnăturii apk este activată. Dezactivați verificarea semnăturii apk, apoi încercați din nou. Instalarea a eșuat deoarece dispozitivul nu are suficient spațiu liber. Nu s-a putut găsi fișierul apk pentru tema neagră/întunecată din instalator. Ștergeți datele aplicației Manager, apoi încercați din nou. Localizarea instalarii YouTube-ului stock a eșuat dupa instalarea divizată. ================================================ FILE: app/src/main/res/values-ru-rRU/strings.xml ================================================ Отмена Закрыть Пользовательская реализация GMS (сервисов Google) для Vanced создана на основе microG. Модифицированный клиент YouTube с массой полезных функций! Vanced, но для YouTube Music! Относительно меньше возможностей, но удовлетворит ваши потребности. Сброс Сохранить Выберите ваши приложения О нас Руководство Менеджер Логи Настройки Обновить Менеджер На устройстве есть рут-права? Предоставить root-права Давайте приступим Выберите хотя бы одно приложение! Не знаете, что это, или не хотите использовать рут версию? Просто нажмите на синюю стрелку ниже! О %1$s Скачать Информация Запустить Переустановить Удалить Обновить Приложения Список изменений Загрузка %1$s Установить Последняя: Сначала установите Vanced microG Рут-доступ не предоставлен Социальные сети Поддержите нас Недоступно Установлена: Второстепенный цвет Оформление Поведение Удалить загруженные файлы Файлы успешно удалены Это позволяет нам собирать информацию о производительности приложения и журналы сбоев Аналитика Firebase Язык Открывать ссылки в Chrome Custom Tabs Использовать Chrome Custom Tabs Push Уведомления для %1$s Получать уведомления о выходе обновления для %1$s Не удалось сохранить новое значение времени Скрипт Таймера сна Настройка значения времени сна, используемого в скрипте /data/adb/service.d/app.sh, полезно для решения проблем монтирования Как в системе Тема оформления Тёмная тема Светлая тема Центр обновлений Обновлений не найдено Вариант Не удалось сохранить логи Логи успешно сохранены Подробнее Обнаружены установочные файлы для %1$s! Менеджер обнаружил все необходимые файлы для установки %1$s. Продолжить установку? Параметры установки %1$s Проверка обновлений… Язык(и): %1$s Тема: %1$s Версия: %1$s Ошибка Руководство Стойте! Похоже, вы используете Magisk/TWRP версию Vanced, которая больше не поддерживается и не может быть обновлена с помощью этого приложения. Пожалуйста, удалите модуль Vanced через Magisk или с помощью деинсталлятора Vanced для TWRP. Чтобы установить Vanced, вы ДОЛЖНЫ отключить оптимизацию MIUI в настройках разработчика. (Вы можете проигнорировать это предупреждение, если вы используете прошивку на xiaomi.eu версии 20.2.20+) Оптимизация MIUI включена! Пожалуйста, НЕ выходите из приложения в течение этого процесса! Скачать заново Пожалуйста, убедитесь, что вы скачали это приложение с vancedapp.com, сервера Vanced в Discord или с официального GitHub Версия Добро пожаловать Выберите предпочитаемый язык для Vanced Последняя Светлая + %1$s Выберите хотя бы один язык! Черный Темный Разработчики Менеджера Другие участники Исходники Команда Vanced Не удалось передать apk владельцу системы, попробуйте еще раз. Ошибка загрузки %1$s Не удалось применить новый второстепенный цвет Ошибка установки пакета %1$s Не удалось найти необходимые файлы для установки. Повторно загрузите установочные файлы и попробуйте еще раз. Не удалось найти apk-файл для черной/темной темы в памяти устройства, повторите попытку. Установка не была выполнена, поскольку пользователь прервал установку. Установка не удалась, так как приложение конфликтует с уже установленным приложением. Удалите текущую версию приложения, затем повторите попытку. Установка не удалась, так как пользователь попытался понизить версию приложения. Удалите обновления обычного приложения YouTube, затем повторите попытку. Установка не удалась по неизвестным причинам, присоединитесь к нашим каналам Telegram или Discord для дальнейшей поддержки. Пожалуйста, также прикрепите скриншот из расширенного меню Установка не удалась, так как установочный файл несовместим с вашим устройством. Очистите загруженные файлы в настройках, затем повторите попытку. Установка не удалась, так как установочные файлы повреждены, попробуйте еще раз. Установка не удалась, так как включена Оптимизация MIUI. Отключите Оптимизацию MIUI, затем повторите попытку. Установка не удалась, так как включена проверка подписи apk. Отключите проверку подписи apk, а затем повторите попытку. Установка не удалась из-за отсутствия на устройстве свободного места. Не удалось найти apk-файл для черной/темной темы в программе установки. Удалите данные приложения из Менеджера и повторите попытку. Не удалось найти стандартный путь установки YouTube после раздельной установки. ================================================ FILE: app/src/main/res/values-si-rLK/strings.xml ================================================ අවලංගු කරන්න වසන්න A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. ප්‍රතිස්ථාපනය කරන්න සුරකින්න ඔබගේ යෙදුම් තෝරන්න මේ ගැන Guide Manager Logs සැකසුම් Update Manager Is Your Device Rooted? Grant Root Permission Let\'s get started Select at least one app! Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! About %1$s Download Info Launch Reinstall Uninstall Update Apps Changelog Downloading %1$s ස්ථාපනය අලුත් Install Vanced microG first මූල ප්‍රවේශය ලබා දී නොමැත Social Media Support us නොමැත ස්ථාපනය: අනෙක් වර්ණය Appearance Behavior Clear downloaded files Successfully cleared files This lets us collect information about app performance and crash logs Firebase Analytics භාෂාව Links will open in Chrome Custom Tabs Use Chrome Custom Tabs %1$s Push Notifications Receive push notifications when an update for %1$s is released Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues System Default තේමාව අඳුරු තේමාව Light Theme Manager Update Center No new updates Variant Could not save logs Successfully saved logs Details %1$s installation files detected! Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s දෝෂය මාර්ගෝපදේශය නවත්වන්න! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Redownload Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub අනුවාදය ආයුබෝවන් Choose your preferred language(s) for Vanced Latest Light + %1$s Select at least one language! Black Dark Manager Devs Other Contributors මූලාශ්‍ර Vanced Team Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to apply new accent color Failed to uninstall package %1$s Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. Installation failed because the apk files are corrupted, please try again. Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. Installation failed because the device doesn\'t have enough free space. Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. Failed to locate the stock YouTube installation path after split installation. ================================================ FILE: app/src/main/res/values-sk-rSK/strings.xml ================================================ Zrušiť Zavrieť Vlastná implementácia GMS pre Vanced založená na projekte microG. Upravený YouTube klient s mnohými užitočnými funkciami! Vanced, ale YouTube Music! Obsahuje o trochu menej funkcií, ale splní vaše potreby. Resetovať Uložiť Vyberte svoje aplikácie O aplikácií Sprievodca Manažér Logy Nastavenia Aktualizovať Manažéra Má vaše zariadenie oprávnenie root? Udeliť oprávnenie root Začnime Vyberte aspoň jednu aplikáciu! Neviete, čo to je alebo nechcete používať verziu s prístupom root? Stačí kliknúť na modrú šípku dole! O aplikácií %1$s Stiahnuť Informácie Spustiť Preinštalovať Odinštalovať Aktualizovať Aplikácie Zoznam zmien Sťahovanie %1$s Inštalovať Najnovšie: Najprv nainštalujte Vanced microG Root prístup nebol udelený Sociálne médiá Podporte nás Nedostupné Nainštalované: Sekundárna farba Vzhľad Správanie Vymazať stiahnuté súbory Súbory boli úspešne vymazané Toto nám umožňuje zhromažďovať informácie o výkone aplikácie a logy o zlyhaní Firebase Analytics Jazyk Odkazy sa otvoria na vlastných kartách prehliadača Chrome Používať vlastné karty prehliadača Chrome %1$s Vyskakovacie oznámenia Dostávať upozornenia ak je dostupná aktualizácia pre %1$s Nepodarilo sa uložiť novú hodnotu času Doba nečinnosti root skriptu Upravte hodnotu doby nečinnosti použitú v skripte /data/adb/service.d/app.sh, ktorá je užitočná na riešenie problémov s pripojením Systémovo predvolené Téma Tmavá téma Svetlá téma Centrum aktualizácií Žiadne nové aktualizácie Varianta Logy nebolo možné uložiť Logy boli úspešne uložené Podrobnosti Nájdených %1$s inštalačných súborov! Manažér zistil, že všetky potrebné súbory na inštaláciu aplikácie %1$s boli nájdené. Prajete si spustiť inštaláciu? %1$s Predvoľby inštalácie Kontrola aktualizácií… Jazyk(y): %1$s Téma: %1$s Verzia: %1$s Chyba Sprievodca Zadržte! Používate verziu Vanced pre Magisk/TWRP, ktorej vývoj bol ukončený, a ktorú nie je možno pomocou tejto aplikácie aktualizovať. Odstráňte ju prosím odobraním modulu Magisk/použitím TWRP Vanced odinštalátora. Ak chcete nainštalovať Vanced, MUSÍTE deaktivovať optimalizáciu MIUI v nastaveniach pre vývojárov. (Toto varovanie môžete ignorovať, ak používate ROM 20.2.20 alebo novšiu, založenú na xiaomi.eu) Optimalizácie MIUI sú zapnuté! Počas tohto procesu NEODCHÁDZAJTE z aplikácie! Stiahnuť znova Uistite sa, že ste si aplikáciu stiahli zo stránky vancedapp.com, servera Vanced Discord alebo Vanced GitHub Verzia Vitajte Vyberte si jeden alebo viac preferovaných jazykov pre Vanced Najnovšie Svetlý + %1$s Vyberte aspoň jeden jazyk! Čierna Tmavá Vývojári aplikácie Ostatní prispievatelia Zdrojové kódy Tím Vanced Nepodarilo sa zmeniť vlastníka súboru APK na vlastníka systému. Skúste to znovu prosím. Chyba pri sťahovaní %1$s Nepodarilo sa nastaviť novú sekundárnu farbu Nepodarilo sa odinštalovať balíček %1$s Nepodarilo sa nájsť požadované súbory na inštaláciu. Opätovne stiahnite inštalačné súbory a skúste to znova. V lokálnom úložisku sa nepodarilo nájsť APK súbor pre čiernu/tmavú tému. Skúste to znovu prosím. Inštalácia zlyhala, kvôli zrušeniu užívateľom. Inštalácia zlyhala, pretože aplikácia je v konflikte s už nainštalovanou aplikáciou. Odinštalujte aktuálnu verziu aplikácie a potom to skúste znova. Inštalácia zlyhala, pretože užívateľ sa pokúsil downgradovať balík. Odinštalujte aktualizácie z pôvodnej aplikácie a potom to skúste znova. Inštalácia zlyhala z neznámych dôvodov. Pre poskytnutie podpory sa pripojte sa k nášmu Telegramu alebo Discordu. Pripojte tiež snímky obrazovky z ponuky Pokročilé Inštalácia zlyhala, pretože inštalačný súbor nie je kompatibilný s vaším zariadením. V Nastaveniach vymažte stiahnuté súbory a potom to skúste znova. Inštalácia zlyhala, pretože súbory APK sú poškodené. Skúste to prosím znova. Inštalácia zlyhala, pretože je povolená optimalizácia MIUI. Zakážte optimalizáciu MIUI a potom to skúste znova. Inštalácia zlyhala, pretože overenie podpisu APK je povolené. Zakážte overenie podpisu APK a potom to skúste znova. Inštalácia zlyhala, pretože v zariadení nie je dostatok voľného miesta. Z inštalačného programu sa nepodarilo nájsť súbor APK pre čiernu/tmavú tému. Vymažte údaje aplikácie Vanced Manager a potom to skúste znova. Po split inštalácii aplikácie sa nepodarilo nájsť cestu inštalácie originálnej YouTube aplikácie. ================================================ FILE: app/src/main/res/values-so-rSO/strings.xml ================================================ Ka noqo Xidh A custom GMS Implementation for Vanced based on the microG Project. A modified YouTube client with many useful features! Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. Dib uceli Kaydi Dooro apps-ka Anaga Guide Maamule Logs Fadhiga Cusboonaysii Aaladaada miyay root-garaysan tahay? U Ogolow Fasaxa Root-ka Aan bilawno Ugu yaraan hal app dooro! Ma aqaano wuxuu kani yahay ama ma doonayo inaan isticmaalo midka root-ka ah? Aayar taabo falaadha buluuga ah ee hoose! Ku saabsan %1$s Download Info Launch Reinstall Uninstall Update Apps Waxa isbadalay Dajinaya %1$s Kushub U dambeeyay: Install Vanced microG first \'Root\' looma fasaxin Baraha Bulshada Na taageer Lama heli karo Ka kujira: Midabka Muuqaalka Dabeecada Nadiifi waxyaabaha lasoo dajiyay Waa la nadiifiyay Tani waxay noo ogolaanaysaa inaan uruurino xog ku saabsan shaqaynta app-ka iyo kaydinta xogta khaladaadka dhaca Falanqaynta Firebase Luuqada Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay Isticmaal Daaqadaha Chrome %1$s Ogaysiisyadiisa Ha kuu soo dhacaan ogaysiisyo marka mid cusub oo %1$s ah lasoo saaro Laguma guulaysan in cadadka wakhtiga la kaydiyo Qormada Wakhtiga Jiifka ee Root-ka Habee cadadka wakhtiga jiifka ee loo isticmaalay qormada /data/adb/service.d/app.s, waxay muhiim u tahay cilladaha galinta Sida aaladu tahay Nashqada Nashqad Madow Nashqad Cad Xarunta Cusboonaysiinta Manager-ka Majiro wax cusub Nooca Could not save logs Successfully saved logs Details %1$s faylashiisii kushubi lahaa ayaa la helay! Manager-ku wuxuu helay dhamaan faylashii loo baahnaa %1$s inuu ku shubmo. Ma rabtaa inaad ku shubto? Fadhiga Kushubida %1$s Hubinaya wax cusub… Luuqada(ha): %1$s Nashqada: %1$s Tirsiga: %1$s Khalad Hagitaan Jooji! Waxaad isticmaalaysaa version-ka Vanced ee loogu talagalay Magisk/TWRP, kaasoo aan hada la taageerin halkana lagama cusboonaysiin karo. Fadlan iska saar lifaaqa Magisk/adoo isticmaalaya kasaaraha Vanced ee TWRP-ga xagiisa. To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) MIUI Optimizations are enabled! Please do NOT exit the app during this process! Dib udaji Iska hubi inaad app-ka kaso dajisatay vancedapp.com, xaga martigaliyaha Discord, ama meesha Vanced ee GitHub Tirsiga Soo dhawoow Dooro luuqada(ha) aad rabto ee app-ka Vanced Latest Cadiin + %1$s Ugu yaraan hal luuqad dooro! Black Dark Sameeyaasha Manager-ka Other Contributors Tixraacyo Kooxda Vanced Laguma guulaysan in APK-ga `mulkiilihiisa loo badalo` barnaamijka aaladu kushaqayso, fadlan markale kuceli. Khalad ayaa ka dhacay soo dajintii %1$s Laguma guulaysanin in midabka cusub lagu fadhiisiyo Laguma guulaysan in laga saaro %1$s Laguma guulaysan in la helo faylashii ku shubi lahaa. Dib-usoodaji faylasha, kadibna isku day markale. Laguma guulaysanin in faylka apk-ga ee nashqada madow/mugdiga laga helo kaydka aalaada, fadlan markale isku day. Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay. Ku shubidii way guuldaraysatay sababtoo ah app-ka waxay iskhilaafeen mid horay ugu jiray aalada. Ka saar nooca hadda ee kujira, kadib markale ku celi. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu Ku shubidii way guuldaraysatay sababtoo ah faylka kuma shaqaynayo aaladaada. Xaga Fadhiga ka saar waxyaabaha lasoo dajiyay, kadib markale isku day. Ku shubidii way guuldaraysatay sababtoo ah faylashii apk-ga ayaa khalkhalsan, markale isku day. Ku shubidii way guuldaraysatay sababtoo ah waxaa furan MIUI Optimization. Xidh MIUI Optimization-ka, kadib markale ku celi. Ku shubidii way guuldaraysatay sababtoo ah waxaa furan xaqiijinta saxiixa apk-ga. Xidh xaqiijinta saxiixa apk-ga, kadibna markale ku celi. Installation failed because the device doesn\'t have enough free space. Lama helin faylka apk-ga ee nashqada madow/mugdiga ah. Tirtir xogta Manager-ka, kadib markale ku celi. Waa lagu guuldaraysatay in la helo wadadii ku shubida app-ka caadiga ah ee YouTube-ka ee kuxigtay ku shubida kala qaybsan. ================================================ FILE: app/src/main/res/values-sr-rSP/strings.xml ================================================ Откажи Затвори Независна GMS имплементација за Vanced заснована на microG пројекту. Модификовани YouTube клијент са многим корисним функцијама! Vanced, али за YouTube Music! Релативно са мање напредних карактеристикама, али ће задовољити ваше потребе. Ресетуј Сачувај Одабери своје апликације О апликацији Водич Менаџер Дневници Поставке Освежи Менаџера Да ли је ваш уређај рутован? Омогућите дозволу за рут Хајде да почнемо Одабери барем једну апликацију! Не знате шта је ово или не желите да користите роот верзију апликације? Само кликните на плаву стрелицу испод! О %s Преузми Инфо Покрени Reinstall Деинсталирај Ажурирај Апликације Историја измена Преузимање %1$s Инсталација Најновија: Инсталирајте прво Vanced microG Root приступ није омогућен Социјалне мреже Подржите нас Недоступно Инсталирана: Боја наглашавања Изглед Понашање Обриши преузете датотеке Успешно брисање датотека Ово нам омогућава да прикупљамо извештаје о перформансама и грешкама Firebase Анализа Језик Линкови ће бити отворени у Chrome Custom Tabs Користите Chrome Custom Tabs %1$s слање обавештења Примај обавештења када је достигнута верзија %1$s Грешка при снимању вредности за ново време Роот скрипта за Време спавања Подесите време спавања путем у /data/adb/service.d/app.sh скрипти, ово је корисно код грешке при повезивању Системски подразумевано Тема Тамна тема Светла тема Менаџер ажурирања Нема нове верзије Варијанта Није могуће снимити дневнике Успешно сачувани дневници Детаљи %1$s верзија је пронађена! Менаџер је пронашао све датотеке за %1$s верзију инсталације. Да ли желите да инсталирате? %1$s Инсталациона подешавања Провера ажурирања… Језик (Језици):%1$s Тема: %1$s Верзија: %1$s Грешка Водич Заустави! Користите Magisk/TWRP верзију Vanced апликације, која више није подржана и чије коришћење није могуће. Молимо Вас да уклоните ову апликацију из Magisk/TWRP-а путем Vanced апликације за деинсталацију. Да би апликација Vanced била исправно инсталирана морате да искључите оптимизацију за ову апликацију у MIUI подешавањима за програмере.( Ову напомену можете да занемарите у случају ако користите верзију 20.2.20 и новију xiaomi.eu ROM-а) MIUI оптимизација је укључена! Немојте излазити из апликације у току овога процеса! Поново преузми Преузмите апликацију само са официјелног Vanced сајта vancedapp.com, Vanced Discord сервера или Vanced GitHub-а Верзија Добро дошли Одаберите језик за коришћење Vanced апликације Најновија Осветљење+%1$s Одаберите барем један језик! Црно Тамно Менаџер развоја Други покровитељи Извор Vanced Тим Грешка при додели apk власнику система, покушајте поново. Грешка приликом преузимања %1$s Неуспешно постављање нове носеће боје Неуспешно деинсталирање пакета %1$s Није могуће пронаћи датотеке за инсталацију. Преузмите их поново и поновите инсталацију. Није могуће пронаћи apk датотеку за црно/тамну тему у меморијском простору, покушајте поново. Инсталација није успешна, корисник је обуставио инсталацију. Инсталација неуспешна, зато што је дошло до конфликта са већ инсталираном верзијом. Деинсталирајте тренутну верзију Vanced-а и затим покушајте поново. Инсталација није успешна, корисник је покушао да инсталира старију верзију преко новије верзије апликације. Деинсталирајте све до предодређене инсталиране верзије YouTubе апликације, затим покушајте поново. Неуспешна инсталација услед непознатих разлога, Прикључите се нашем Telegram или Discord каналима за помоћ. Молимо да прикључите снимак екрана из Проширеног Менија Инсталација је неуспешна јер инсталациона датотека није компатибилна са вашим уређајем. Очистите преузете датотеке у Подешавањима и затим покушајте поново. Инсталација није успеla јер је apk датотека оштећена, покушајте поново. Инсталација неуспешна јер је укључена оптимизација за ову апликацију у MIUI систему. Искључите MIUI оптимизацију за ову апликацију и затим покушајте поново. Инсталација неуспешна јер је укључена провера потписа преузете apk датотеке. Искључите apk проверу и затим покушајте поново. Инсталација неуспешна јер на уређају нема довољно слободног простора. Није могуће пронаћи apk датотеку за црно/тамну тему у инсталационим датотекама. Очистите податке у Менаџеру и покушајте поново. Није могуће пронаћи подразумевану YouTube локацију за инсталацију после подељене инсталације. ================================================ FILE: app/src/main/res/values-sv-rSE/strings.xml ================================================ Avbryt Stäng En anpassad GMS-implementering för Vanced baserad på microG-projektet. En modifierad YouTube-klient med många användbara funktioner! Vanced, men för YouTube Music! Relativt mindre funktionsrika men uppfyller dina behov. Återställ Spara Välj dina appar Om Guide Hanterare Loggar Inställningar Uppdatera hanteraren Är din enhet rotad? Ge Posting Permission Nu sätter vi igång Välj minst en zoomnivå! Vet du inte vad detta är eller inte vill använda rotversionen? Klicka bara på den blå pilen nedan! Cirka %1$s Download Info Launch Reinstall Uninstall Update Appar Ändringslogg Laddar ned %1$s Install Senaste: Installera Vanced microG först Root-åtkomst inte beviljat Sociala medier Stöd oss Ej tillgänglig Installerad: Accentfärg Utseende Beteende Rensa nedladdade filer Rensade data Detta gör att vi kan samla in information om appens prestanda och kraschloggar Firebase Analys Språk Länkar öppnas i Chrome Custom Tabs Använd Chrome-anpassade flikar %1$s push-meddelanden Få push-meddelanden när en uppdatering för %1$s släpps Det gick inte att spara nytt tidsvärde Root-skript sömntid Justera vilotidsvärde som används i /data/adb/service.d/app.sh skript, användbart för att fixa monteringsproblem Systemstandard Tema Mörkt tema Ljust tema Ansvarig uppdateringscenter Inga nya uppdateringar Variant Kunde inte spara sida Sparades Detaljer %1$s installationsfiler upptäckt! Manager upptäckte att alla nödvändiga filer för %1$s installation hittades. Vill du installera? %1$s Valda installationsinställningar Söker efter uppdateringar… Språk: %1$s Tema: %1$s Version %1$s Fel Guide Stopp! Ser ut som om du använder Magisk versionen av Vanced, som är avbruten och inte kan uppdateras med den här appen. Ta bort den först genom att ta bort magisk modulen. För att installera Vanced, måste du inaktivera MIUI Optimisations i utvecklarinställningarna. (Du kan ignorera denna varning om du använder 20.2.20 eller senare xiaomi.eu-baserad ROM) MIUI Optimeringar är aktiverade! Vänligen avsluta INTE appen under denna process! Ladda ner igen Se till att du laddade ner appen från vancedapp.com, den Vanced Discord-servern eller den Vanced GitHub Version Välkommen Välj önskade språk för Vanced Senaste Ljus + %1$s Välj minst ett språk! Svart Mörk Hanteraren Dev Andra bidragsgivare Källor Vanced Team Misslyckades att Chown Apk till systemägare, Försök igen. Laddar ned %1$s Det gick inte att tillämpa ny accentfärg Det gick inte att avinstallera paket %1$s Det gick inte att hitta de nödvändiga filerna för installationen. Ladda ner installationsfilerna igen och försök igen. Det gick inte att hitta apk-fil för svart/mörkt tema från lagring, försök igen. Åtgärden misslyckades eftersom användaren avbröt installationen. Installationen misslyckades eftersom appen står i konflikt med en redan installerad app. Avinstallera den aktuella versionen av Vanced, försök sedan igen. Installationen misslyckades eftersom användaren försökte nedgradera paketet. Avinstallera uppdateringar från lagerappen YouTube, försök sedan igen. Installationen misslyckades av okända skäl, gå med i vårt Telegram eller Discord för ytterligare stöd. Vänligen bifoga även en skärmdump från menyn Avancerat Installationen misslyckades eftersom installationsfilen är inkompatibel med din enhet. Rensa nedladdade filer i Inställningarna och försök igen. Installationen misslyckades eftersom apk-filerna är skadade, försök igen. Installationen misslyckades eftersom MIUI-optimering är aktiverad. Inaktivera MIUI-optimering och försök igen. Installationen misslyckades eftersom apk signaturverifiering är aktiverad. Inaktivera apk signaturverifiering och försök igen. Installationen misslyckades eftersom enheten inte har tillräckligt med ledigt utrymme. Det gick inte att hitta apk-fil för svart/mörkt tema från installationsprogrammet. Rensa appdata från Manager och försök igen. Det gick inte att hitta sökvägen för lagerinstallationen på YouTube efter delad installation. ================================================ FILE: app/src/main/res/values-ta-rIN/strings.xml ================================================ ரத்துசெய் மூடுக மைக்ஜிக் திட்டத்தின் அடிப்படையில் ஒரு தனிபயன் GMS செயல்படுத்துதல். பல பயனுள்ள அம்சங்களுடன் ஒரு திருத்தப்பட்ட YouTube வாடிக்கையாளர்! Vanced, ஆனால் YouTube இசை! ஒப்பீட்டளவில் குறைவான அம்சம் நிறைந்த பணக்காரர்கள் ஆனால் உங்கள் தேவைகளை பூர்த்தி செய்கிறார்கள். மீட்டமை சேமிக்கவும் உங்கள் பயன்பாடுகளைத் தேர்ந்தெடுக்கவும் பற்றி வழிகாட்டி மேலாளர் பதிவுகள் அமைப்புகள் புதுப்பிப்பு மேலாளர் உங்கள் சாதனம் வேரூன்றியதா? கிராண்ட் ரூட் அனுமதி தொடங்குவோம் குறைந்தது ஒரு பயன்பாட்டையாவது தேர்ந்தெடுக்கவும்! இது என்னவென்று தெரியவில்லையா அல்லது ரூட் பதிப்பைப் பயன்படுத்த விரும்பவில்லையா? கீழே உள்ள நீல அம்புக்குறியைக் கிளிக் செய்க! பற்றி %1$s Download Info Launch Reinstall Uninstall Update பயன்பாடுகள் சேஞ்ச்லாக் %1$s ஐப் பதிவிறக்குகிறது நிறுவு சமீபத்தியது: முதலில் Vanced Microg ஐ நிறுவவும் ரூட் அக்சஸ் வழங்கப்படவில்லை சமூக ஊடகம் எங்களை ஆதரியுங்கள் கிடைக்கவில்லை நிறுவப்பட்டது: கவனங்கவர் நிறம் தோற்றம் செயல்பாடு பதிவிறக்கிய கோப்புகளை அழிக்கவும் கோப்புகளை வெற்றிகரமாக அழித்துவிட்டது பயன்பாட்டு செயல்திறன் மற்றும் செயலிழப்பு பதிவுகள் பற்றிய தகவல்களை சேகரிக்க இது எங்களுக்கு உதவுகிறது ஃபயர்பேஸ் அனலிட்டிக்ஸ் மொழி Chrome தனிப்பயன் தாவல்களில் இணைப்புகள் திறக்கப்படும் Chrome தனிப்பயன் தாவல்களைப் பயன்படுத்தவும் %1$s புஷ் அறிவிப்புகள் %1$s க்கான புதுப்பிப்பு வெளியிடப்படும் போது புஷ் அறிவிப்புகளைப் பெறுக புதிய நேர மதிப்பைச் சேமிப்பதில் தோல்வி ரூட் ஸ்கிரிப்ட் தூக்க நேரம் பெருகிவரும் சிக்கல்களை சரிசெய்ய பயனுள்ளதாக இருக்கும் /data/adb/service.d/app.sh ஸ்கிரிப்டில் பயன்படுத்தப்படும் தூக்க நேர மதிப்பை சரிசெய்யவும் கணினி இயல்புநிலை தீம் இருண்ட தீம் ஒளி தீம் மேலாளர் புதுப்பிப்பு மையம் புதிய புதுப்பிப்புகள் இல்லை மாறுபாடு பதிவுகளைச் சேமிக்க முடியவில்லை பதிவுகள் வெற்றிகரமாக சேமிக்கப்பட்டன விவரங்கள் %1$s நிறுவல் கோப்புகள் கண்டறியப்பட்டன! %1$s நிறுவலுக்கு தேவையான அனைத்து கோப்புகளும் கண்டறியப்பட்டதை மேலாளர் கண்டறிந்தார். நீங்கள் அதை நிறுவ விரும்புகிறீர்களா? %1$s நிறுவல் விருப்பத்தேர்வுகள் புதுப்பிப்புகளைச் சரிபார்க்கிறது… மொழி: %1$s தீம் %1$s பதிப்பு: %1$s பிழை வழிகாட்டி நிறுத்து! நீங்கள் வேன்ஸின் மேஜிஸ்க் / டி. டபிள்யூ. ஆர். பி பதிப்பைப் பயன்படுத்துகிறீர்கள், இது நிறுத்தப்பட்டது மற்றும் இந்த பயன்பாட்டைப் பயன்படுத்தி புதுப்பிக்க முடியாது. மேஜிஸ்க் தொகுதியை அகற்றி / TWRP Vanced uninstaller ஐப் பயன்படுத்தி அதை அகற்றவும். Vanced நிறுவ, நீங்கள் டெவலப்பர் அமைப்புகளில் Miui மேம்படுத்தல்களை முடக்க வேண்டும். (நீங்கள் 20.2.20 அல்லது பின்னர் xiaomi.eu அடிப்படையிலான ROM ஐப் பயன்படுத்துகிறீர்களானால் இந்த எச்சரிக்கையை நீங்கள் புறக்கணிக்கலாம்) MIUI மேம்படுத்தல்கள் இயக்கப்பட்டன! இந்த செயல்முறையின் போது பயன்பாட்டை விட்டு வெளியேற வேண்டாம்! மீண்டும் பதிவிறக்கு பயன்பாட்டை vancedapp.com, Vanced Discord சேவையகம் அல்லது Vanced GitHub இலிருந்து பதிவிறக்கம் செய்துள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள் பதிப்பு வரவேற்பு வேன்ஸ்டுக்காக உங்களுக்கு விருப்பமான மொழியைத் தேர்வுசெய்க சமீபத்தியது ஒளி + %1$s குறைந்தது ஒரு மொழியையாவது தேர்ந்தெடுக்கவும்! கருப்பு இருள் மேலாளர் டெவலப்பர்கள் பிற பங்களிப்பாளர்கள் மூலம் Vanced கூட்டணி கணினி உரிமையாளருக்கு APK ஐத் தேடுவதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். %1$s பதிவிறக்குவதில் தோழ்வி புதிய உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துவதில் தோல்வி %1$s நீக்குவதில் தோல்வி நிறுவலுக்கு தேவையான கோப்புகளை கண்டுபிடிப்பதில் தோல்வி. நிறுவல் கோப்புகளை மீண்டும் பதிவிறக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். சேமிப்பகத்திலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பை கண்டுபிடிப்பதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். பயனர் நிறுவலை நிறுத்தியதால் நிறுவல் தோல்வியடைந்தது. ஏற்கனவே நிறுவப்பட்ட பயன்பாட்டுடன் பயன்பாடு முரண்படுவதால் நிறுவல் தோல்வியடைந்தது. பயன்பாட்டின் தற்போதைய பதிப்பை நிறுவல் நீக்கி, பின்னர் மீண்டும் முயற்சிக்கவும். பயனர் தொகுப்பை தரமிறக்க முயற்சித்ததால் நிறுவல் தோல்வியடைந்தது. பங்கு பயன்பாட்டிலிருந்து புதுப்பிப்புகளை நிறுவல் நீக்க, பின்னர் மீண்டும் முயற்சிக்கவும். நிறுவல் அறியப்படாத காரணங்களுக்காக தோல்வியடைந்தது, எங்கள் டெலிகிராம் அல்லது மேலும் ஆதரவுக்கு இணக்கமாக இருக்கலாம். மேம்பட்ட மெனுவிலிருந்து ஒரு ஸ்கிரீன் ஷாட்டை இணைக்கவும் நிறுவல் கோப்பு உங்கள் சாதனத்துடன் பொருந்தாததால் நிறுவல் தோல்வியடைந்தது. அமைப்புகளில் பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். நிறுவல் தோல்வியுற்றது, ஏனெனில் Apk கோப்புகள் சிதைந்துள்ளன, தயவுசெய்து மீண்டும் முயற்சிக்கவும். MIUI உகப்பாக்கம் இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. MIUI உகப்பாக்கத்தை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். Apk கையொப்ப சரிபார்ப்பு இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. Apk கையொப்ப சரிபார்ப்பை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். சாதனம் போதுமான இலவச இடம் இல்லை என்பதால் நிறுவல் தோல்வியடைந்தது. நிறுவியிலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பைக் கண்டுபிடிப்பதில் தோல்வி. மேலாளரின் பயன்பாட்டுத் தரவை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். பிளவு நிறுவலுக்குப் பிறகு பங்கு YouTube நிறுவல் பாதையை கண்டுபிடிப்பதில் தோல்வி. ================================================ FILE: app/src/main/res/values-th-rTH/strings.xml ================================================ ยกเลิก ปิด การปรับใช้ GMS แบบกำหนดเองสำหรับ Vanced ตามโครงการ microG ไคลเอนต์ YouTube ที่ได้รับการแก้ไขพร้อมคุณสมบัติที่มีประโยชน์มากมาย! Vanced สำหรับ YouTube Music! คุณสมบัติค่อนข้างน้อย แต่ตอบสนองความต้องการของคุณ ล้างค่าเริ่มต้น บันทึก เลือกแอปพลิเคชันของคุณ ข้อมูลเกี่ยวกับทีมนักพัฒนา แนะนำ ตัวจัดการ บันทึกข้อมูลระบบ ตั้งค่า อัพเดทตัวจัดการ อุปกรณ์ของคุณได้รูทหรือไม่? ให้สิทธิ์การใช้งานของรูท เริ่มกันเลย! เลือกแอปพลิเคชั่นอย่างน้อยหนึ่งรายการ! ไม่รู้/ไม่ต้องการใช้เวอร์ชั่นรูท? แค่คลิ๊กบนไอคอนธนูสีฟ้า! เกี่ยวกับ %1$s ดาวน์โหลด ข้อมูล เปิด Reinstall ถอนการติดตั้ง อัพเดท แอป บันทึกการเปลี่ยนแปลง กำลังดาวน์โหลด %1$s ติดตั้ง ล่าสุด: ติดตั้ง Vanced microG ก่อน ไม่ได้รับสิทธิ์ของรูท สื่อสังคม สนับสนุนพวกเรา ไม่สามารถใช้ได้ ติดตั้งแล้ว: สีหลัก ลักษณะที่ปรากฏ ลักษณะการทำงาน ล้างไฟล์ที่ดาวน์โหลดไว้ ล้างข้อมูลเรียบร้อยแล้ว สำหรับ รวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของแอป และบันทึกข้อขัดข้อง การวิเคราะห์ Firebase ภาษา ลิ้งค์จะเปิดไปยังแท็บที่กำหนดเองของ Chrome ใช้แท็บที่กำหนดเองของ Chrome %1$s การแจ้งเตือนแบบพุช รับการแจ้งเตือนแบบพุช เมื่อมีการเผยแพร่อัปเดต %1$s ล่าสุด Failed to save new time value Root Script Sleep Time Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues ค่าเริ่มต้นของระบบ ธีม ธีมมืด ธีมสว่าง การจัดการอัพเดพหลัก ไม่มีอัพเดตใหม่ ตัวแปร ไม่สามารถบันทึกได้ ดำเนินการบันทึกเรียบร้อยแล้ว รายละเอียด %1$s ตรวจพบไฟล์สำหรับการติดตั้ง! ตรวจพบการอัพเดทไฟล์สำหรับติดตั้งใหม่ที่จำเป็น %1$s คุณต้องการติดตั้งหรือไม่? %1$s กำหนดค่าการติดตั้ง ตรวจหาการปรับปรุงใหม่ๆ… ภาษา: %1$s ธีม: %1$s รุ่น: %1$s ผิดพลาด คู่มือ หยุด! คุณกำลังใช้ Vanced เวอร์ชัน Magisk / TWRP ซึ่งถูกยกเลิกและไม่สามารถอัปเดตได้จากแอปนี้ กรุณาลบออกโดยการถอดโมดูล Magisk / ใช้โปรแกรมถอนการติดตั้ง TWRP Vanced ในการติดตั้ง Vanced คุณต้องปิดใช้งาน การเพิ่มประสิทธิภาพ MIUI ในการตั้งค่าสำหรับนักพัฒนา (คุณสามารถเพิกเฉยต่อคำเตือนนี้ได้ หากคุณใช้ based ROM xiaomi.eu 20.2.20 หรือใหม่กว่า) เปิดใช้งานการเพิ่มประสิทธิภาพ MIUI แล้ว! โปรดอย่าออกจากแอปในระหว่างขั้นตอนนี้! ดาวน์โหลดอีกครั้ง ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดแอพจากช่องทางที่ถูกต้อง vancedapp.com, เซิร์ฟเวอร์ Vanced Discord หรือ Vanced GitHub รุ่น ยินดีต้อนรับ เลือกภาษาที่คุณต้องการใช้สำหรับ Vanced ล่าสุด เบา + %1$s เลือกอย่างน้อยหนึ่งภาษา! สีดำ สีเข้ม ตัวจัดการ Devs ผู้ร่วมให้ข้อมูลอื่น ๆ แหล่งที่มา ทีมงาน Vanced ไม่สามารถ `chown` APK ในระบบได้ โปรดลองอีกครั้ง เกิดข้อผิดพลาดในการดาวน์โหลด %1$s การใช้สีที่เน้นใหม่มีความผิดพลาด ถอนการติดตั้งแพ็กเกจไม่สำเร็จ %1$s ไม่สามารถค้นหาไฟล์สำหรับการติดตั้งที่ต้องการได้. กรุณาดาวน์โหลดไฟล์สำหรับการติดตั้งใหม่แล้วลองอีกครั้ง ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้ม จากที่เก็บข้อมูล โปรดลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากผู้ใช้ยกเลิกการติดตั้ง การติดตั้งล้มเหลวเนื่องจากแอปขัดแย้งกับแอปที่ติดตั้งไว้ก่อนหน้า ถอนการติดตั้งแอปเวอร์ชันปัจจุบันแล้วลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากผู้ใช้พยายามดาวน์เกรดแพ็กเกจ ถอนการติดตั้งการอัปเดตจากแอปเดิมก่อน แล้วลองอีกครั้ง การติดตั้งล้มเหลวโดยไม่ทราบสาเหตุเข้าร่วม Telegram หรือ Discord ของเราเพื่อรับการสนับสนุนเพิ่มเติม โปรดแนบภาพหน้าจอจากเมนู การติดตั้งล้มเหลวเนื่องจากไฟล์การติดตั้งเข้ากันไม่ได้กับอุปกรณ์ของคุณ กรุณาล้างไฟล์ที่ดาวน์โหลดในการตั้งค่า แล้วลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากไฟล์ apk เสียหายโปรดลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากเปิดใช้งาน MIUI Optimization โปรดปิดการใช้งาน MIUI Optimization แล้วลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากเปิดใช้งานการตรวจสอบลายเซ็น apk กรุณาปิดใช้งานการตรวจสอบลายเซ็น apk แล้วลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากอุปกรณ์มีพื้นที่ว่างไม่เพียงพอ ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้มจากโปรแกรมติดตั้ง กรุณาล้างข้อมูลแอปVanced-Manager แล้วลองอีกครั้ง ไม่พบเส้นทางการติดตั้งสต็อกของ YouTube หลังจากการติดตั้งแบบแยก ================================================ FILE: app/src/main/res/values-tr-rTR/strings.xml ================================================ İptal Kapat Vanced için geliştirilmiş microG Projesi tabanlı GMH sürümü. İşe yarar birçok özellikle modifiye edilmiş YouTube sürümü! Yine Vanced, ama YouTube Music için! Kıyasen daha az özelliğe sahip ama beklentilerini karşılayacaktır. Sıfırla Kaydet Uygulamalarınızı Seçin Hakkında Rehber Manager Geçmiş kayıtlar Ayarlar Manager\'ı güncelle Cihazın rootlu mu? Root yetkisi ver Haydi başlayalım En az bir uygulama seçin! Root\'un ne olduğunu bilmiyor veya root sürümünü kullanmak istemiyorsan, alttaki mavi oka tıklayabilirsin! %1$s hakkında İndir Bilgi Başlat Yeniden yükle Kaldır Güncelleştir Uygulamalar Sürüm Notları %1$s indiriliyor Yükle En son: Vanced microG\'yi kurmalısın Root erişimi verilmedi Sosyal Medya Tıkla, destek ol Yüklenmemiş Yüklü: Tema Rengi Görünüm Davranış İndirilen dosyaları temizle Dosyalar başarıyla temizlendi Uygulama hakkında performans ve hata kayıtlarını toplamamıza izin verir Firebase Analizi Dil Bağlantılar Chrome Özel Sekmelerinde açılacaktır Chrome Özel Sekmelerini kullan %1$s Anlık Bildirimleri %1$s için bir güncelleme yayınlandığında anlık bildirimler alın Yeni zaman değeri kaydedilemedi Root kurulumu, bekletme süresi [Gelişmiş] Kurulum sırasında çalıştırılan /data/adb/service.d/app.sh dosyasındaki uyku/bekletme süresinin değer ayarı. Kurulum sırasında oluşan hatalara çözüm olabilir Sistem varsayılanı Tema Koyu Tema Açık Tema Manager Güncelleme Merkezi Yeni güncelleme yok Sürüm yapısı Kayıtlar kaydedilemedi Kayıtlar başarıyla kaydedildi Ayrıntılar %1$s için kurulum dosyaları bulundu! Manager, %1$s kurulumu için gerekli olan dosyaları belirledi. Yüklemek ister misiniz? %1$s Kurulum Tercihleri Güncellemeler kontrol ediliyor… Dil(ler): %1$s Tema: %1$s Sürüm: %1$s Hata Kılavuz Durdur! Geliştirilmesi durdurulan ve bu uygulama ile güncellenemeyen Vanced\'ın, Magisk/TWRP sürümünü kullanıyorsunuz. Lütfen Magisk/TWRP sürümünü cihazınızdan kaldırın. Vanced\'ı yükleyebilmek için, geliştirici ayarlarından/seçeneklerinden MIUI optimizasyonunu devre dışı bırakmalısın. (xiaomi.eu tabanlı 20.2.20 sürüm veya üzeri ROM kullanıyorsan, bu uyarıyı göz ardı edebilirsin) MIUI Optimizasyonu aktif gözüküyor! İşlem süresince LÜTFEN uygulamadan çıkmayın! Tekrar İndir Uygulamayı vancedapp.com, Vanced Discord sunucusu, veya Vanced GitHub\'dan indirdiğinizden emin olun Sürüm Hoş Geldiniz Vanced için tercih ettiğiniz dil(ler)i seçin En yeni Açık renk + %1$s En az bir dil seçmelisin! Siyah (amoled) Koyu renk Manager Geliştiricileri Katkıda bulunan diğer kişiler Kaynaklar Vanced Ekibi APK dosyasına sistem yetkisi atanamadı, lütfen tekrar deneyin. %1$s indirilirken hata oluştu Yeni vurgu rengi uygulanamadı %1$s kaldırılırken hata oluştu Kurulum için gerekli olan dosyaları belirlerken bir hata oluştu. Kurulum dosyalarını tekrar indirip, yeniden deneyin. Depolama alanında Siyah/Koyu temanın APK dosyasını belirlerken bir hata oluştu. Tekrar deneyin lütfen. Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu. Uygulama önceden yüklenmiş bir uygulamayla çakıştığından yükleme başarısız oldu. Uygulamanın mevcut sürümünü kaldırın ve ardından tekrar deneyin. Kullanıcı eski sürümü yüklemeye çalıştığı için kurulum tamamlanamadı. Orijinal YouTube uygulamasının güncellemelerini kaldırdıktan sonra yeniden deneyin. Kurulum, bilinmeyen sebeplerden dolayı başarısız oldu. Telegram grubu veya Discord sunucusundan destek alabilirsin. Ayrıca, detaylar ekranının bir ekran görüntüsünü alıp, yardım talebinle birlikte iletmeyi unutma lütfen. Kurulum dosyası cihazınız ile uyumsuz olduğu için kurulum işlemi başarısız oldu. Ayarlar\'da indirilen dosyaları temizleyip, tekrar deneyin. APK dosyaları çözümlenemediğinden, kurulum başarısız oldu. Lütfen yeniden deneyin. MIUI Optimizasyonu etkin olduğundan, kurulum başarısız oldu. MIUI Optimizasyonunu devre dışı bırakıp, yeniden deneyin. APK imza doğrulaması etkin olduğundan, kurulum başarısız oldu. APK imza doğrulamasını devre dışı bırakıp, yeniden deneyin. Yetersiz depolama alanından dolayı kurulum başarısız oldu. Yükleyicide Siyah/Koyu tema için APK dosyalarını ararken bir hata oluştu. Manager\'ın verilerini temizleyip, yeniden deneyin. Ayrı kurulum işleminden sonra orijinal YouTube kurulum yolu belirlenemedi. ================================================ FILE: app/src/main/res/values-uk-rUA/strings.xml ================================================ Скасувати Закрити Модифікований GMS для Vanced на основі проекту microG. Модифікований клієнт YouTube з безліччю корисних функцій! Vanced, але для YouTube Music! Відносно менш функціональний, але задовольняє ваші потреби. Скинути Зберегти Виберіть Ваші Додатки Про нас Посібник Менеджер Логи Налаштування Оновіть Менеджер На Пристрої Є Root Права? Надати Root Права Почнімо Оберіть принаймні один додаток! Не знаєте, що це або не хочете використовувати рутовану версію? Просто натисніть синю стрілку внизу! Про %1$s Download Інформація Відкрити Reinstall Видалити Update Додатки Список змін Завантаження %1$s Встановити Найновіша: Спочатку встановіть Vanced microG Права суперкористувача не були надані Соціальні мережі Підтримайте нас Недоступно Встановлена: Вторинний колір Вигляд Поведінка Очистити завантажені файли Файли було успішно очищено Це дозволяє нам збирати інформацію про продуктивність додатка та журнали збоїв Аналітика Firebase Мова Відкривати посилання в Chrome Custom Tabs Використовувати Chrome Custom Tabs %1$s Спливаючі Сповіщення Отримувати спливаючі сповіщення, коли доступне оновлення для %1$s Не вдалося зберегти нове значення часу Скрипт Таймера сну Налаштування значення часу сну, використовуваного в скрипті /data/adb/service.d/app.sh, корисно для вирішення проблем монтування Системна Тема Темна тема Світла тема Центр Оновлень Оновлень не знайдено Варіант Не вдалося зберегти логи Логи успішно збережені Детальніше Знайдено %1$s файлів для встановлення! Менеджер виявив, що всі необхідні файли для %1$s встановлення було знайдено. Бажаєте встановити їх? Параметри встановлення %1$s Перевірка оновлень… Мова(и): %1$s Тема: %1$s Версія: %1$s Помилка Гайд Зупинись! Ви використовуєте Magisk/TWRP версію Vanced, яка припиняється і не може бути оновлена за допомогою цього застосунку. Будь ласка, видаліть його, видаливши модуль Magisk / з використання TWRP Vanced uninstaller. Щоб встановити Vanced, ви ПОВИННІ вимкнути оптимізацію MIUI у налаштуваннях розробника. (Ви можете ігнорувати це попередження якщо ви використовуєте 20.2.20 або новіші xiaomi.eu ROM) Оптимізацію MIUI увімкнено! Будь ласка, НЕ завершуйте роботу додатку під час цього процесу! Завантажити заново Переконайтеся, що ви завантажили додаток з vancedapp.com, Vanced Discord сервер або Vanced GitHub Версія Привіт! Виберіть бажану мову(и) для Vanced Найновіша Світла + %1$s Оберіть принаймні одну мову! Чорний Темний Розробники Менеджера Інші учасники Джерела Команда Vanced Не вдалося створити файл APK системного власника програми, будь ласка, повторіть спробу. Помилка Завантаження %1$s Не вдалося застосувати новий другорядний колір Не вдалося видалити пакет %1$s Не вдалося знайти необхідні файли для встановлення. Повторно завантажте файли і спробуйте ще раз. Не вдалося знайти apk-файл для чорної/темної теми зі сховища, спробуйте ще раз. Встановлення не вдалося, оскільки користувач перервав встановлення. Встановлення не вдалася, так як додаток конфліктує з уже встановленим додатком. Видаліть поточну версію додатку, і спробуйте ще раз. Встановлення не вдалася, так як користувач спробував знизити версію програми. Видаліть поновлення звичайного додатку YouTube, спробуйте ще раз. Не вдалося встановити з невідомих причин, підключіться до нашої Telegram групи або Discord сервера для подальшої підтримки. Будь ласка, додайте знімок екрану з розширеного меню Помилка встановлення, оскільки файл несумісний з вашим пристроєм. Очистіть завантажені файли в Налаштуваннях, а потім спробуйте ще раз. Встановлення неможливе, оскільки apk-файли пошкоджені, будь ласка, спробуйте ще раз. Помилка встановлення, оскільки увімкнена оптимізація MIUI. Вимкніть оптимізацію MIUI і спробуйте ще раз. Помилка встановлення, оскільки увімкнено перевірку підпису apk. Вимкніть перевірку підпису apk, а потім спробуйте ще раз. Помилка встановлення, так як на пристрої недостатньо вільного місця. Не вдалося знайти apk-файл для чорної/темної теми в програмі встановлення. Видаліть дані додатка з Менеджера і спробуйте ще раз. Не вдалося знайти типовий шлях встановлення YouTube після роздільного встановлення. ================================================ FILE: app/src/main/res/values-vi-rVN/strings.xml ================================================ Hủy Đóng GMS Nhúng đã được tuỳ chỉnh cho Vanced dựa trên Dự án microG. Một ứng dụng YouTube đã được sửa đổi với nhiều tính năng hữu ích! Vanced, nhưng cho YouTube Music! Khá ít tính năng nhưng đáp ứng được nhu cầu của bạn. Đặt lại Lưu Chọn ứng dụng của bạn Giới thiệu Hướng dẫn Manager Nhật ký Cài đặt Cập nhật Manager Thiết Bị Của Bạn Đã Được Root? Cấp quyền root Bắt đầu Chọn ít nhất một ứng dụng! Bạn không biết đây là gì hoặc không muốn sử dụng phiên bản root? hãy nhấp vào dấu > bên dưới! Thông tin về %1$s Tải xuống Thông tin Mở Cài đặt lại Gỡ cài đặt Cập nhật Các ứng dụng Các thay đổi Đang tải xuống %1$s Cài đặt Mới nhất: Bạn phải cài Vanced microG trước Quyền root không được cấp Mạng xã hội Hỗ trợ chúng tôi Chưa cài Đã cài đặt: Màu chủ đạo Giao diện Ứng dụng Xóa các tệp tin đã tải về Xóa các tệp tin thành công Cho phép chúng tôi thu thập thông tin về hiệu suất và sự cố của ứng dụng Firebase Analytics Ngôn ngữ Các liên kết sẽ mở trong Chrome Custom Tabs Sử dụng Chrome Custom Tabs Thông báo cho %1$s Nhận thông báo khi một bản cập nhật của %1$s được phát hành Lưu giá trị thời gian mới thất bại Thời gian ngủ của tập lệnh root Điều chỉnh giá trị thời gian ngủ được sử dụng trong tập lệnh /data/adb/service.d/app.sh, hữu ích khi khắc phục các vấn đề về mounting Mặc định hệ thống Nền Nền tối Nền sáng Cập nhật Manager Không có cập nhật mới Phiên bản Lưu nhật ký thất bại Lưu nhật ký thành công Chi tiết Phát hiện tệp cài đặt của %1$s! Manager đã tìm thấy tất cả các tệp cần thiết để cài đặt %1$s. Bạn có muốn cài đặt nó không? %1$s Tùy biến Cài đặt Đang kiểm tra cập nhật… Ngôn ngữ: %1$s Nền: %1$s Phiên bản: %1$s Lỗi Hướng dẫn Khoan đã! Bạn đang sử dụng phiên bản Magisk/TWRP của Vanced, hiện đã bị ngừng phát triển và không thể được cập nhập bằng ứng dụng này. Hãy gỡ mô-đun Magisk/flash trình gỡ cài đặt TWRP. Để cài Vanced, bạn PHẢI vô hiệu hóa Tối ưu hóa MIUI trong cài đặt nhà phát triển. (Bỏ qua cảnh báo này nếu bạn đang sử dụng ROM dựa trên xiaomi.eu phiên bản 20.2.20 hoặc mới hơn) Tối ưu hoá MIUI đang được kích hoạt! Vui lòng KHÔNG thoát khỏi ứng dụng trong tiến trình này! Tải lại Chắc chắn rằng bạn đã tải ứng dụng này từ vancedapp.com, server Discord của Vanced hoặc GitHub của Vanced Phiên bản Chào mừng Chọn ngôn ngữ mong muốn cho Vanced Mới nhất Sáng + %1$s Chọn ít nhất một ngôn ngữ! Đen Tối Đội ngũ phát triển Những người đóng góp khác Nguồn Đội ngũ Vanced Thay đổi quyền sở hữu APK cho chủ hệ thống thất bại, vui lòng thử lại. Lỗi khi tải xuống %1$s Áp dụng màu chủ đạo mới thất bại Gỡ cài đặt %1$s thất bại Không thể xác định các tệp tin cần thiết để cài đặt. Tải lại các tệp cài đặt rồi thử lại. Xác định tệp tin apk cho nền đen/tối từ bộ nhớ thất bại, vui lòng thử lại. Cài đặt thất bại do người dùng hủy. Cài đặt thất bại do có xung đột với ứng dụng đã được cài đặt trước đó. Gỡ cài đặt phiên bản hiện tại của ứng dụng rồi thử lại. Cài đặt thất bại do người dùng cố hạ cấp ứng dụng. Gỡ cài đặt các bản cập nhật khỏi ứng dụng gốc rồi thử lại. Cài đặt thất bại do lí do không xác định, tham gia Telegram hoặc Discord để được hỗ trợ. Vui lòng kèm theo ảnh chụp màn hình từ phần Chi tiết Cài đặt thất bại do tệp tin cài đặt không tương thích với thiết bị của bạn. Xóa các tệp tin đã tải về trong Cài đặt rồi thử lại. Cài đặt thất bại do các tệp tin apk bị lỗi, xin hãy thử lại. Cài đặt thất bại do Tối ưu hóa MIUI được kích hoạt. Vô hiệu hóa Tối ưu hóa MIUI rồi thử lại. Cài đặt thất bại do xác minh chứng chỉ apk được kích hoạt. Vô hiệu hóa xác minh chứng chỉ apk rồi thử lại. Cài đặt thất bại do thiết bị của bạn không có đủ bộ nhớ trống. Tìm kiếm tệp tin apk cho nền đen/tối từ trình cài đặt thất bại. Xoá dữ liệu của Manager rồi thử lại. Không thể xác định thư mục cài đặt của YouTube gốc sau khi tải split. ================================================ FILE: app/src/main/res/values-zh-rCN/strings.xml ================================================ 取消 关闭 以 microG 项目为基础並只用于 Vanced 的自定义 Google 移动服务。 经过修改的 YouTube 客户端,具有许多有用的功能! Vanced ,不过是 YouTube Music !功能相对较少,但足以满足您的需求。 重置 保存 选择您的应用 关于 指南 Manager 日志 设置 更新 Manager 您的设备是否拥有 Root 权限? 授予 Root 权限 让我们开始吧 选择至少一个应用! 不知道这是什么或不想使用 Root 版本?只需点击下面的蓝色箭头! 关于 %1$s 下载 信息 打开 Reinstall 卸载 更新 应用 变更日志 正在下载 %1$s 安装 最新: 请先安装 Vanced microG 未授予 Root 权限 社交媒体 支持我们 不可用 已安装: 强调色 外观 行为 清除已下载文件 成功清除文件 这允许我们收集有关应用性能和崩溃日志的信息 Firebase 分析 语言 链接会使用 Chrome Custom Tabs 打开 使用 Chrome Custom Tabs %1$s 推送通知 %1$s 有可用更新时接收推送通知 保存新定时器值失败 Root 脚本睡眠定时器 调整 /data/adb/service.d/app.sh 脚本中的睡眠定时器值,有助于修复挂载问题。 系统默认 主题 深色主题 浅色主题 Manager 更新中心 无可用更新 版本 无法保存日志 日志保存成功 详细信息 检测到 %1$s 安装文件! Manager 检测到 %1$s 所需要的安装文件。您想现在安装吗? %1$s 安装首选设定 正在检查更新… 语言: %1$s 主题: %1$s 版本: %1$s 错误 说明 警告! 您正在使用 Magisk/TWRP 版的 Vanced,它已被停止支持且无法通过此应用更新。请通过移除 Magisk 模块 / 使用 TWRP Vanced 卸载器来移除它。 为了能够安装 Vanced,您必须在开发者设置中禁用 MIUI 优化。(如果您正在使用基于 xiaomi.eu 20.2.20 或更新的 ROM,您可以忽略此警告) MIUI 优化已启用! 请不要在此过程中退出应用! 重新下载 请确保您是从 vancedapp.com 、 Vanced Discord 服务器或 Vanced Github 下载本应用 版本 欢迎 为 Vanced 选择您的首选语言 最新 浅色 + %1$s 选择至少一种语言! 黑色 深色 Manager 开发人员 其它贡献者: 源码 Vanced 团队 无法 `chown` apk 为系统拥有者,请重试。 %1$s 下载错误 无法应用新的强调色 %1$s 卸载失败 无法找到需要安装的文件。重新下载安装文件,然后重试。 无法从存储中找到黑色/深色主题的 apk 文件,请重试。 用户放弃安装导致安装失败。 应用与已安装的应用发生冲突导致安装失败。卸载当前的版本,然后重试。 用户试图降级应用导致安装失败。卸载官方应用的更新,然后重试。 未知原因导致安装失败,请加入我们的 Telegram 或 Discord 并附上高级设置中的截图以获得更多支援。 安装文件与您的设备不相容导致安装失败。请在设置中清除已下载的文件,然后重试。 apk 文件已被损坏导致安装失败,请重试。 MIUI 优化已被启用导致安装失败。禁用 MIUI 优化,然后重试。 apk 签名验证已被启用导致安装失败。禁用apk 签名验证,然后重试。 设备的可用空间不足导致安装失败。 无法从安装程式中找到黑色/深色主题的 apk 文件。清除 Manager 的应用数据,然后重试。 分包安装后无法定位原生 YouTube 的安装路径。 ================================================ FILE: app/src/main/res/values-zh-rTW/strings.xml ================================================ 取消 關閉 以 microG 項目為基礎並用於 Vanced 的 GMS 工具。 經過修改而具有許多有用功能的 YouTube 客戶端! Vanced ,不過是 YouTube Music!功能相對較少但足以滿足您的需要。 重設 儲存 選擇您需要的應用程式 關於 說明 Manager 日誌 設定 更新 Manager 您的裝置擁有 Root 權限嗎? 授予 Root 權限 讓我們開始吧 請至少選擇一個應用程式! 不知道這是什麼,或者不想使用 Root 版本?只需點選下面的藍色箭頭! 關於 %1$s 下載 關於 啟動 重新安裝 解除安裝 更新 應用程式 更新日誌 正在下載 %1$s 安裝 最新: 請先安裝 Vanced microG 未授予 Root 權限 社交媒體 支持我們 無法使用 已安裝: 輔色 外觀 行為 清除已下載的檔案 成功清除檔案 這讓我們可以收集關於應用程式效能和崩潰日誌的資訊 Firebase 分析 語言 連結會使用 Chrome Custom Tabs 開啟 使用 Chrome Custom Tabs %1$s 推送通知 有可用更新時接收 %1$s 推送通知 儲存定時器時間失敗 Root 腳本休眠時間 調整 /data/adb/service.d/app.sh 指令碼中的休眠時間值,對修復掛載問題很有用 系統預設 主題 深色主題 淺色主題 Manager 更新中心 沒有更新 版本 無法儲存日誌 日誌成功儲存 詳細資訊 偵測到 %1$s 的安裝檔案! Manager 找到所有 %1$s 所需的安裝檔案。您打算安裝嗎? %1$s 安裝偏好設定 正在檢查更新… 語言:%1$s 主題: %1$s 版本: %1$s 錯誤 說明 警告! 您正使用 Magisk/TWRP 版本的 Vanced ,它已停止支援並無法透過此程式更新。請透過移除 Magisk 模組/使用 TWRP Vanced 解除安裝程式來移除它。 欲安裝 Vanced,請先至開發人員選項停用 MIUI 優化。(若您正在使用 20.2.20 或更新版本且基於的 xiaomi.eu 的系統,請忽略此警告) 已啟用 MIUI 優化! 在此過程中請不要退出應用程式! 重新下載 請確保您從 vancedapp.com、Vanced Discord 伺服器或 Vanced GitHub 下載本程式 版本 歡迎 為 Vanced 選擇您偏好的語言 最新 淺色 + %1$s 請至少選擇一種語言! 黑色 深色 Manager 開發者 其他貢獻者: 原始碼 Vanced 團隊 無法 `chown` apk 為系統擁有者,請重試。 %1$s 下載錯誤 無法套用新的輔色 %1$s 解除安裝失敗 無法找到安裝所需的檔案。請重新下載安裝檔案,然後再試。 無法在儲存空間中找到深色/黑色主題的 apk 檔案,請再試。 使用者放棄安裝導致安裝失敗。 程式與已安裝的程式發生衝突導致安裝失敗。解除安裝當前的版本,然後重試。 使用者試圖降級導致安裝失敗。解除安裝原生應用程式的更新,然後重試。 未知原因導致安裝失敗,請附上進階設定的截圖至我們的 Telegram 或 Discord 取得更多支援 安裝檔案與您的裝置不相容導致安裝失敗。請在設定中清除已下載的檔案,然後重試。 apk 檔案已被損毀導致安裝失敗,請重試。 MIUI 優化已被啟用導致安裝失敗。停用 MIUI 優化,然後重試。 apk 簽名驗證已被啟用導致安裝失敗。停用 apk 簽名驗證,然後重試。 裝置的可用空間不足導致安裝失敗。 在安裝程式中找不到深色/黑色主題的 apk 檔案。請清除 Manager 應用程式的資料,然後再試。 分割安裝後無法找到原生 YouTube 安裝路徑。 ================================================ FILE: app/src/main/res/xml/file_provider.xml ================================================ ================================================ FILE: build.gradle.kts ================================================ buildscript { repositories { google() mavenCentral() } val kotlinVersion = "1.6.10" dependencies { classpath("com.android.tools.build:gradle:7.1.2") classpath(kotlin("gradle-plugin", version = kotlinVersion)) classpath(kotlin("serialization", version = kotlinVersion)) } } allprojects { repositories { google() mavenCentral() maven(url = "https://jitpack.io") } } task("clean") { delete(rootProject.buildDir) } ================================================ FILE: crowdin.yml ================================================ files: - source: /app/src/main/res/values/strings.xml translation: /app/src/main/res/values-%android_code%/strings.xml ================================================ FILE: gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ================================================ FILE: gradle.properties ================================================ ## For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx1024m -XX:MaxPermSize=256m org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Sun Dec 13 13:42:32 GET 2020 android.enableJetifier=true android.useAndroidX=true kotlin.code.style=official ================================================ FILE: gradlew ================================================ #!/usr/bin/env sh # # Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin or MSYS, switch paths to Windows format before running java if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=`expr $i + 1` done case $i in 0) set -- ;; 1) set -- "$args0" ;; 2) set -- "$args0" "$args1" ;; 3) set -- "$args0" "$args1" "$args2" ;; 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" exec "$JAVACMD" "$@" ================================================ FILE: gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: settings.gradle.kts ================================================ rootProject.name = "Vanced Manager" include(":app")