Vanced Manager 2.6.0 (#516)

* updated app card UI

* bug fixes

* fixed grammar

* removed unnoticable animation to improve performance

* removed useless attribute

* kotlin extensions are stonks

* reference accent color variable instead of getting preference value every time

* updated old stuff

* removed useless check inside 'when' statement

* optimised lifecycleOwner getter

* property access syntax goes brrrrr

* small accent update

* added progress indicators to download dialogs

* fixed changelog not appearing when pressing card in about menu

* bumped up kotlin to 1.4.31

* fixed #437

* fixed #435

* fixed viewpager navigation on RTL layout

* added a check for session id in root installer

* updated strings

* always notify about miui error

* only run 1 animation at once

* require external storage

* sorted strings xml

* improved layouts to look more close to each other

* bumped up dependencies

* updated version

* fixed crash on manager update

* New Crowdin updates (#489)

* New translations strings.xml (Romanian)

* New translations strings.xml (Bengali)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (Swedish)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Marathi)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Thai)

* New translations strings.xml (Croatian)

* New translations strings.xml (Azerbaijani)

* New translations strings.xml (Hindi)

* New translations strings.xml (Filipino)

* New translations strings.xml (Sinhala)

* New translations strings.xml (Bengali, India)

* New translations strings.xml (Sorani (Kurdish))

* New translations strings.xml (Pashto)

* New translations strings.xml (Somali)

* New translations strings.xml (Russian)

* New translations strings.xml (Polish)

* New translations strings.xml (Arabic)

* New translations strings.xml (Spanish)

* New translations strings.xml (Slovak)

* New translations strings.xml (Malayalam)

* New translations strings.xml (Japanese)

* New translations strings.xml (Estonian)

* New translations strings.xml (French)

* New translations strings.xml (Kurdish)

* New translations strings.xml (Kurmanji (Kurdish))

* New translations strings.xml (Hungarian)

* New translations strings.xml (Finnish)

* New translations strings.xml (Korean)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Punjabi)

* New translations strings.xml (Bulgarian)

* New translations strings.xml (Catalan)

* New translations strings.xml (Czech)

* New translations strings.xml (Danish)

* New translations strings.xml (German)

* New translations strings.xml (Greek)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Italian)

* New translations strings.xml (Georgian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Punjabi, Pakistan)

* Added button info on long press

* preview adjustments to navigation xml

* moved splash screen activity to parent dir

* fixed buttontag getter

* updated readme

* fixed readme

* Added build section to readme

* Updated build instructions

* prevent stacktrace from obfuscating

* Added an option to switch between internal and external storage

* removed warning for music vanced

* added back a fix for split installer

* added -r option for root music installer

* Revert "prevent stacktrace from obfuscating"

This reverts commit 2d30eb60af.

* Revert "added back a fix for split installer"

This reverts commit aeaa0d445e.

* Revert "Added an option to switch between internal and external storage"

This reverts commit 98c4b88961.

* reverted all storage-related commits

* prevent stacktrace ovfuscation

* updated readme

* updated base url

* use storage perms only on android 5

* cleanup

* removed unused event file

* fixed dark overlay not disappearing after bottom dialog has been dismissed

* removed unecessary path from file_provider

* fixed lint for core-ui

* improved layout flexibility

* updated icons in expandable app item

* removed path prefix for api urls

* removed microg bug dialog

* fixed version code comparison

* New translations strings.xml (Romanian)

* New translations strings.xml (Croatian)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Indonesian)

* New translations strings.xml (Tamil)

* New translations strings.xml (Bengali)

* New translations strings.xml (Marathi)

* New translations strings.xml (Thai)

* New translations strings.xml (Estonian)

* New translations strings.xml (Swedish)

* New translations strings.xml (Azerbaijani)

* New translations strings.xml (Hindi)

* New translations strings.xml (Filipino)

* New translations strings.xml (Malayalam)

* New translations strings.xml (Sinhala)

* New translations strings.xml (Bengali, India)

* New translations strings.xml (Kurmanji (Kurdish))

* New translations strings.xml (Sorani (Kurdish))

* New translations strings.xml (Pashto)

* New translations strings.xml (Somali)

* New translations strings.xml (Punjabi, Pakistan)

* New translations strings.xml (Turkish)

* New translations strings.xml (Serbian (Cyrillic))

* New translations strings.xml (French)

* New translations strings.xml (Hebrew)

* New translations strings.xml (Spanish)

* New translations strings.xml (Afrikaans)

* New translations strings.xml (Arabic)

* New translations strings.xml (Bulgarian)

* New translations strings.xml (Catalan)

* New translations strings.xml (Czech)

* New translations strings.xml (Danish)

* New translations strings.xml (German)

* New translations strings.xml (Greek)

* New translations strings.xml (Finnish)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Slovak)

* New translations strings.xml (Italian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Georgian)

* New translations strings.xml (Korean)

* New translations strings.xml (Kurdish)

* New translations strings.xml (Dutch)

* New translations strings.xml (Norwegian)

* New translations strings.xml (Punjabi)

* New translations strings.xml (Polish)

* New translations strings.xml (Portuguese)

* New translations strings.xml (Russian)

* New translations strings.xml (Lithuanian)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Arabic)

* New translations strings.xml (Slovak)

* New translations strings.xml (Korean)

* New translations strings.xml (Polish)

* New Crowdin updates (#515)

* New translations strings.xml (Arabic)

* New translations strings.xml (Greek)

* New translations strings.xml (Dutch)

* New translations strings.xml (Turkish)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Indonesian)

Co-authored-by: X1nto <burtkni@yandex.ru>
Co-authored-by: Tornike Khintibidze <48173186+X1nto@users.noreply.github.com>
This commit is contained in:
KevinX8 2021-04-27 13:16:14 +01:00 committed by GitHub
parent 6cb674537e
commit bd27e34b40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
152 changed files with 3533 additions and 2648 deletions

View File

@ -1,34 +1,34 @@
Pull requests should be made to the Dev branch as that is the working branch, master is for release code. # Vanced Manager [![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg)](https://github.com/YTVanced/VancedManager/releases/latest)
======
For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for YouTube Vanced. Any issues with translations should be posted there too.
======
Vanced FAQ (from the faq branch) now available on the playstore! https://play.google.com/store/apps/details?id=com.vanced.faq
[![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg)](https://github.com/YTVanced/VancedManager/releases/latest)
# Vanced Manager
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. 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. 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 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. ##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity.
## Vanced Developers ## Contributions
- xfileFIN Pull requests should be made to the Dev branch as that is the working branch, master is for release code.
- KevinX8
- Zanezam
- Laura Almeida
## Vanced Manager Developers For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for YouTube Vanced. Any issues with translations should be posted there too.
- Xinto (X1nto)
- Koopah (ostajic)
## Contributors ## TODO
- AioiLight - [ ] Clean up the ViewModel and DataModel code
- HaliksaR - [ ] Migrate to Jetpack Compose when it's officially released
## Credits ## Building [![Build](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml/badge.svg?branch=dev)](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml)
- topjohnwu for his wonderful [LibSU](https://github.com/topjohnwu/libsu) ### Using Android Studio
- aefyr for [SAI](https://github.com/aefyr/SAI), which was an inspiration for our Manager Clone the repo, open it in Android Studio and build the app.
- kittinunf for [Fuel](https://github.com/kittinunf/Fuel) HTTP client
- cbeust for [klaxon](https://github.com/cbeust/klaxon) JSON parser ### Using command line
#### On Windows:
```powershell
.\gradlew.bat assembleDebug
```
#### On Linux/macOS:
```bash
chmod +x gradlew
./gradlew assembleDebug
```
## Vanced FAQ
Vanced FAQ (from the faq branch) now available on the playstore! https://play.google.com/store/apps/details?id=com.vanced.faq

View File

@ -16,8 +16,8 @@ android {
applicationId = "com.vanced.manager" applicationId = "com.vanced.manager"
minSdkVersion(21) minSdkVersion(21)
targetSdkVersion(30) targetSdkVersion(30)
versionCode = 251 versionCode = 260
versionName = "2.5.1 (Weed)" versionName = "2.6.0 (Crimson)"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
@ -103,12 +103,12 @@ dependencies {
implementation("androidx.browser:browser:1.3.0") implementation("androidx.browser:browser:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.0.4") implementation("androidx.constraintlayout:constraintlayout:2.0.4")
implementation("androidx.core:core-ktx:1.3.2") implementation("androidx.core:core-ktx:1.3.2")
implementation("androidx.fragment:fragment-ktx:1.3.0") implementation("androidx.fragment:fragment-ktx:1.3.2")
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0") implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0") implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.3.3") implementation("androidx.navigation:navigation-fragment-ktx:2.3.5")
implementation("androidx.navigation:navigation-ui-ktx:2.3.3") implementation("androidx.navigation:navigation-ui-ktx:2.3.5")
implementation("androidx.preference:preference-ktx:1.1.1") implementation("androidx.preference:preference-ktx:1.1.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
@ -128,31 +128,28 @@ dependencies {
implementation("com.google.android.material:material:1.3.0") implementation("com.google.android.material:material:1.3.0")
// JSON parser // JSON parser
implementation("com.beust:klaxon:5.4") implementation("com.beust:klaxon:5.5")
// Crowdin // Crowdin
implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0") implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0")
// Tips
implementation("com.github.florent37:viewtooltip:1.2.2")
// HTTP networking // HTTP networking
implementation("com.github.kittinunf.fuel:fuel:2.3.0") implementation("com.github.kittinunf.fuel:fuel:2.3.1")
implementation("com.github.kittinunf.fuel:fuel-coroutines:2.2.3") implementation("com.github.kittinunf.fuel:fuel-coroutines:2.3.1")
implementation("com.github.kittinunf.fuel:fuel-json:2.2.3") implementation("com.github.kittinunf.fuel:fuel-json:2.3.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:retrofit:2.9.0")
// Root permissions // Root permissions
implementation("com.github.topjohnwu.libsu:core:3.1.1") implementation("com.github.topjohnwu.libsu:core:3.1.2")
implementation("com.github.topjohnwu.libsu:io:3.1.1") implementation("com.github.topjohnwu.libsu:io:3.1.2")
// Layout // Layout
implementation("com.google.android:flexbox:2.0.1") implementation("com.google.android:flexbox:2.0.1")
// Firebase // Firebase
implementation("com.google.firebase:firebase-analytics-ktx:18.0.2") implementation("com.google.firebase:firebase-analytics-ktx:18.0.3")
implementation("com.google.firebase:firebase-crashlytics:17.3.1") implementation("com.google.firebase:firebase-crashlytics:17.4.1")
implementation("com.google.firebase:firebase-messaging:21.0.1") implementation("com.google.firebase:firebase-messaging:21.1.0")
implementation("com.google.firebase:firebase-perf:19.1.1") implementation("com.google.firebase:firebase-perf:19.1.1")
} }

View File

@ -17,7 +17,7 @@
# Uncomment this to preserve the line number information for # Uncomment this to preserve the line number information for
# debugging stack traces. # debugging stack traces.
#-keepattributes SourceFile,LineNumberTable -keepattributes SourceFile, LineNumberTable
# If you keep the line number information, uncomment this to # If you keep the line number information, uncomment this to
# hide the original source file name. # hide the original source file name.

View File

@ -12,6 +12,7 @@
<!-- is required for some Android 5.x devices --> <!-- is required for some Android 5.x devices -->
<uses-permission <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22"
tools:ignore="ScopedStorage" /> tools:ignore="ScopedStorage" />
<queries> <queries>
@ -35,7 +36,7 @@
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<activity <activity
android:name=".ui.core.SplashScreenActivity" android:name=".ui.SplashScreenActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/SplashTheme"> android:theme="@style/SplashTheme">
<intent-filter> <intent-filter>
@ -66,8 +67,7 @@
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data <data
android:scheme="https" android:scheme="https"
android:host="vancedapp.com" android:host="api.vancedapp.com"/>
android:pathPrefix="/downloads"/>
</intent-filter> </intent-filter>

View File

@ -1,115 +0,0 @@
package com.vanced.manager.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.recyclerview.widget.RecyclerView
import com.github.florent37.viewtooltip.ViewTooltip
import com.vanced.manager.R
import com.vanced.manager.databinding.ViewAppBinding
import com.vanced.manager.model.DataModel
import com.vanced.manager.model.RootDataModel
import com.vanced.manager.ui.dialogs.AppInfoDialog
import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.utils.*
class AppListAdapter(
private val activity: FragmentActivity,
private val viewModel: HomeViewModel,
private val tooltip: ViewTooltip?
) : RecyclerView.Adapter<AppListAdapter.ListViewHolder>() {
private val apps = mutableListOf<String>()
private val dataModels = mutableListOf<DataModel?>()
private val rootDataModels = mutableListOf<RootDataModel?>()
private val prefs = getDefaultSharedPreferences(activity)
private val isRoot = prefs.managerVariant == "root"
inner class ListViewHolder(private val binding: ViewAppBinding) : RecyclerView.ViewHolder(binding.root) {
val appCard = binding.appCard
fun bind(position: Int) {
val dataModel = if (isRoot) rootDataModels[position] else dataModels[position]
with(binding) {
appName.text = dataModel?.appName
dataModel?.buttonTxt?.observe(activity) {
appInstallButton.text = it
}
appInstallButton.setOnClickListener {
if (dataModel?.versionName?.value != activity.getString(R.string.unavailable)) {
viewModel.openInstallDialog(it, apps[position])
} else {
return@setOnClickListener
}
}
appUninstall.setOnClickListener {
dataModel?.appPkg?.let { it1 -> viewModel.uninstallPackage(it1) }
}
appLaunch.setOnClickListener {
viewModel.launchApp(apps[position], isRoot)
}
dataModel?.isAppInstalled?.observe(activity) {
appUninstall.isVisible = it
appLaunch.isVisible = it
}
dataModel?.versionName?.observe(activity) {
appRemoteVersion.text = it
}
dataModel?.installedVersionName?.observe(activity) {
appInstalledVersion.text = it
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
val view = ViewAppBinding.inflate(LayoutInflater.from(activity), parent, false)
return ListViewHolder(view)
}
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
holder.bind(position)
val dataModel = if (isRoot) rootDataModels[position] else dataModels[position]
holder.appCard.setOnClickListener {
tooltip?.close()
AppInfoDialog.newInstance(
appName = apps[position],
appIcon = dataModel?.appIcon,
changelog = dataModel?.changelog?.value
).show(activity.supportFragmentManager, "info")
}
}
override fun getItemCount(): Int = apps.size
init {
if (prefs.enableVanced) {
if (isRoot) {
rootDataModels.add(viewModel.vancedRootModel.value)
} else {
dataModels.add(viewModel.vancedModel.value)
}
apps.add(activity.getString(R.string.vanced))
}
if (prefs.enableMusic) {
if (isRoot) {
rootDataModels.add(viewModel.musicRootModel.value)
} else {
dataModels.add(viewModel.musicModel.value)
}
apps.add(activity.getString(R.string.music))
}
if (!isRoot) {
dataModels.add(viewModel.microgModel.value)
apps.add(activity.getString(R.string.microg))
}
}
}

View File

@ -0,0 +1,198 @@
package com.vanced.manager.adapter
import android.animation.ValueAnimator
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.animation.addListener
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.card.MaterialCardView
import com.vanced.manager.R
import com.vanced.manager.databinding.ViewAppExpandableBinding
import com.vanced.manager.model.ButtonTag
import com.vanced.manager.model.DataModel
import com.vanced.manager.ui.dialogs.AppInfoDialog
import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.utils.*
class ExpandableAppListAdapter(
private val activity: FragmentActivity,
private val viewModel: HomeViewModel
) : RecyclerView.Adapter<ExpandableAppListAdapter.ListViewHolder>() {
private val apps = mutableListOf<String>()
private val dataModels = mutableListOf<DataModel?>()
private val prefs = getDefaultSharedPreferences(activity)
private val isRoot = prefs.managerVariant == "root"
private var isAnimationRunning = false
inner class ListViewHolder(private val binding: ViewAppExpandableBinding) :
RecyclerView.ViewHolder(binding.root) {
private var isExpanded = false
fun bind(position: Int) {
val dataModel = dataModels[position]
with(binding) {
appTitle.text = dataModel?.appName
appDescription.text = dataModel?.appDescription
dataModel?.appIcon?.let { appIcon.setImageResource(it) }
appClickableLayout.setOnClickListener {
if (isAnimationRunning) return@setOnClickListener
val rootHeight = root.measuredHeight
val expandedViewHeight = appExpandedView.height
val expandedTranslation = appClickableLayout.height.toFloat()
when (isExpanded.also { isExpanded = !isExpanded }) {
true -> {
appExpandedView.toggle(0f, 0.8f, -expandedTranslation)
root.toggleCard(rootHeight - expandedViewHeight)
appExpandArrow.rotateArrow(90f)
}
false -> {
root.toggleCard(rootHeight + expandedViewHeight)
appExpandedView.toggle(1f, 1f, expandedTranslation)
appExpandArrow.rotateArrow(-90f)
}
}
}
appUninstall.setOnClickListener {
dataModel?.appPkg?.let { it1 -> viewModel.uninstallPackage(it1) }
}
appLaunch.setOnClickListener {
viewModel.launchApp(apps[position], isRoot)
}
appInfo.setOnClickListener {
AppInfoDialog.newInstance(
appName = apps[position],
appIcon = dataModel?.appIcon,
changelog = dataModel?.changelog?.value
).show(activity.supportFragmentManager, "info")
}
dataModel?.buttonTag?.observe(activity) { buttonTag ->
appDownload.apply {
setOnClickListener {
viewModel.openInstallDialog(
buttonTag,
apps[position]
)
}
contentDescription = activity.getString(
when (buttonTag) {
ButtonTag.UPDATE -> R.string.accessibility_update
ButtonTag.REINSTALL -> R.string.accessibility_reinstall
else -> R.string.accessibility_download
}
)
}
}
dataModel?.isAppInstalled?.observe(activity) {
appUninstall.isVisible = it
appLaunch.isVisible = it
}
dataModel?.versionName?.observe(activity) {
appVersionLatest.text = it
appDownload.isGone = it == activity.getString(R.string.unavailable)
}
dataModel?.installedVersionName?.observe(activity) {
appVersionInstalled.text = it
}
dataModel?.buttonImage?.observe(activity) {
if (it != null) {
appDownload.icon = it
}
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
val view = ViewAppExpandableBinding.inflate(LayoutInflater.from(activity), parent, false)
return ListViewHolder(view)
}
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
holder.bind(position)
}
override fun getItemCount(): Int = apps.size
private fun ImageView.rotateArrow(degrees: Float) {
animate().apply {
duration = animationDuration
rotation(degrees)
}
}
private fun View.toggle(
alpha: Float,
scale: Float,
translation: Float
) {
animate().apply {
duration = animationDuration
scaleX(scale)
scaleY(scale)
alpha(alpha)
translationYBy(translation)
}
}
private fun MaterialCardView.toggleCard(resultHeight: Int) {
ValueAnimator.ofInt(measuredHeight, resultHeight).apply {
duration = animationDuration
addUpdateListener { value ->
updateLayoutParams {
height = value.animatedValue as Int
}
}
addListener(
onStart = {
isAnimationRunning = true
},
onEnd = {
isAnimationRunning = false
}
)
}.start()
}
init {
if (prefs.enableVanced) {
if (isRoot) {
dataModels.add(viewModel.vancedRootModel.value)
} else {
dataModels.add(viewModel.vancedModel.value)
}
apps.add(activity.getString(R.string.vanced))
}
if (prefs.enableMusic) {
if (isRoot) {
dataModels.add(viewModel.musicRootModel.value)
} else {
dataModels.add(viewModel.musicModel.value)
}
apps.add(activity.getString(R.string.music))
}
if (!isRoot) {
dataModels.add(viewModel.microgModel.value)
apps.add(activity.getString(R.string.microg))
}
}
companion object {
const val animationDuration = 250L
}
}

View File

@ -10,7 +10,8 @@ import com.vanced.manager.databinding.ViewNotificationSettingBinding
import com.vanced.manager.model.NotifModel import com.vanced.manager.model.NotifModel
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.defPrefs
class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNotifAdapter.GetNotifViewHolder>() { class GetNotifAdapter(private val context: Context) :
RecyclerView.Adapter<GetNotifAdapter.GetNotifViewHolder>() {
private val prefs = context.defPrefs private val prefs = context.defPrefs
@ -35,7 +36,8 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
private val apps = arrayOf(vanced, music, microg) private val apps = arrayOf(vanced, music, microg)
inner class GetNotifViewHolder(val binding: ViewNotificationSettingBinding) : RecyclerView.ViewHolder(binding.root) { inner class GetNotifViewHolder(val binding: ViewNotificationSettingBinding) :
RecyclerView.ViewHolder(binding.root) {
val switch = binding.notifSwitch val switch = binding.notifSwitch
fun bind(position: Int) { fun bind(position: Int) {
val app = apps[position] val app = apps[position]
@ -44,15 +46,21 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
setSummary(app.switchSummary) setSummary(app.switchSummary)
setTitle(app.switchTitle) setTitle(app.switchTitle)
setDefaultValue(true) setDefaultValue(true)
with (prefs) { with(prefs) {
setChecked(getBoolean( "enable_" + app.key.substringBefore("_"), true) && getBoolean(app.key, true)) setChecked(
getBoolean(
"enable_" + app.key.substringBefore("_"),
true
) && getBoolean(app.key, true)
)
} }
} }
} }
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GetNotifViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GetNotifViewHolder {
val view = ViewNotificationSettingBinding.inflate(LayoutInflater.from(context), parent, false) val view =
ViewNotificationSettingBinding.inflate(LayoutInflater.from(context), parent, false)
return GetNotifViewHolder(view) return GetNotifViewHolder(view)
} }

View File

@ -57,7 +57,8 @@ class LinkAdapter(
val links = arrayOf(instagram, youtube, github, website, telegram, twitter, discord, reddit) val links = arrayOf(instagram, youtube, github, website, telegram, twitter, discord, reddit)
inner class LinkViewHolder(private val binding: ViewSocialLinkBinding) : RecyclerView.ViewHolder(binding.root) { inner class LinkViewHolder(private val binding: ViewSocialLinkBinding) :
RecyclerView.ViewHolder(binding.root) {
val logo = binding.linkImage val logo = binding.linkImage

View File

@ -18,21 +18,22 @@ class SelectAppsAdapter(private val context: Context) :
private val vanced = SelectAppModel( private val vanced = SelectAppModel(
context.getString(R.string.vanced), context.getString(R.string.vanced),
context.getString(R.string.select_apps_vanced), context.getString(R.string.description_vanced),
"vanced", "vanced",
prefs.enableVanced prefs.enableVanced
) )
private val music = SelectAppModel( private val music = SelectAppModel(
context.getString(R.string.music), context.getString(R.string.music),
context.getString(R.string.select_apps_music), context.getString(R.string.description_vanced_music),
"music", "music",
prefs.enableMusic prefs.enableMusic
) )
val apps = arrayOf(vanced, music) val apps = arrayOf(vanced, music)
inner class SelectAppsViewHolder(binding: ViewAppCheckboxBinding) : RecyclerView.ViewHolder(binding.root) { inner class SelectAppsViewHolder(binding: ViewAppCheckboxBinding) :
RecyclerView.ViewHolder(binding.root) {
val appName = binding.appCheckboxText val appName = binding.appCheckboxText
val appDescription = binding.appCheckboxDescription val appDescription = binding.appCheckboxDescription
val appCard = binding.appCheckboxBg val appCard = binding.appCheckboxBg

View File

@ -18,7 +18,10 @@ class SponsorAdapter(
) : RecyclerView.Adapter<SponsorAdapter.LinkViewHolder>() { ) : RecyclerView.Adapter<SponsorAdapter.LinkViewHolder>() {
private val brave = SponsorModel( private val brave = SponsorModel(
if (currentTheme == LIGHT) AppCompatResources.getDrawable(context, R.drawable.ic_brave_light) else AppCompatResources.getDrawable(context, R.drawable.ic_brave), if (currentTheme == LIGHT) AppCompatResources.getDrawable(
context,
R.drawable.ic_brave_light
) else AppCompatResources.getDrawable(context, R.drawable.ic_brave),
"Brave", "Brave",
BRAVE BRAVE
) )

View File

@ -10,12 +10,14 @@ import com.crowdin.platform.data.remote.NetworkType
import com.vanced.manager.BuildConfig.* import com.vanced.manager.BuildConfig.*
import com.vanced.manager.utils.AppUtils.log import com.vanced.manager.utils.AppUtils.log
import com.vanced.manager.utils.loadJson import com.vanced.manager.utils.loadJson
import com.vanced.manager.utils.managerAccent
import com.vanced.manager.utils.mutableAccentColor
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
open class App: Application() { open class App : Application() {
private val prefs by lazy { getDefaultSharedPreferences(this) } private val prefs by lazy { getDefaultSharedPreferences(this) }
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
@ -23,8 +25,9 @@ open class App: Application() {
override fun onCreate() { override fun onCreate() {
scope.launch { loadJson(this@App) } scope.launch { loadJson(this@App) }
super.onCreate() super.onCreate()
mutableAccentColor.value = prefs.managerAccent
Crowdin.init(this, Crowdin.init(
this,
CrowdinConfig.Builder().apply { CrowdinConfig.Builder().apply {
withDistributionHash(CROWDIN_HASH) withDistributionHash(CROWDIN_HASH)
withNetworkType(NetworkType.WIFI) withNetworkType(NetworkType.WIFI)

View File

@ -22,7 +22,9 @@ object MusicDownloader {
fun downloadMusic(context: Context, version: String? = null) { fun downloadMusic(context: Context, version: String? = null) {
val prefs = context.defPrefs val prefs = context.defPrefs
musicVersion = version ?: prefs.musicVersion?.getLatestAppVersion(musicVersions.value?.value ?: listOf("")) musicVersion = version ?: prefs.musicVersion?.getLatestAppVersion(
musicVersions.value?.value ?: listOf("")
)
versionCode = music.value?.int("versionCode") versionCode = music.value?.int("versionCode")
variant = prefs.managerVariant variant = prefs.managerVariant
baseurl = "$baseInstallUrl/music/v$musicVersion" baseurl = "$baseInstallUrl/music/v$musicVersion"
@ -35,31 +37,43 @@ object MusicDownloader {
private fun downloadApk(context: Context, apk: String = "music") { private fun downloadApk(context: Context, apk: String = "music") {
val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk" val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk"
download(url, "$baseurl/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = { download(
if (variant == "root" && apk != "stock") { url,
downloadApk(context, "stock") "$baseurl/",
return@download folderName!!,
} getFileNameFromUrl(url),
context,
when (apk) { onDownloadComplete = {
"music" -> { if (variant == "root" && apk != "stock") {
if (variant == "root") { downloadApk(context, "stock")
if (validateTheme(downloadPath!!, "root", hashUrl!!, context)) { return@download
if (downloadStockCheck(musicRootPkg, versionCode!!, context))
downloadApk(context, "stock")
else
startMusicInstall(context)
} else {
downloadApk(context, apk)
}
} else
startMusicInstall(context)
} }
"stock" -> startMusicInstall(context)
} when (apk) {
}, onError = { "music" -> {
downloadingFile.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url))) if (variant == "root") {
}) if (validateTheme(downloadPath!!, "root", hashUrl!!, context)) {
if (downloadStockCheck(musicRootPkg, versionCode!!, context))
downloadApk(context, "stock")
else
startMusicInstall(context)
} else {
downloadApk(context, apk)
}
} else
startMusicInstall(context)
}
"stock" -> startMusicInstall(context)
}
},
onError = {
downloadingFile.postValue(
context.getString(
R.string.error_downloading,
getFileNameFromUrl(url)
)
)
})
} }
fun startMusicInstall(context: Context) { fun startMusicInstall(context: Context) {

View File

@ -16,7 +16,7 @@ import com.vanced.manager.utils.PackageHelper.installVancedRoot
import java.io.File import java.io.File
object VancedDownloader { object VancedDownloader {
private lateinit var prefs: SharedPreferences private lateinit var prefs: SharedPreferences
private lateinit var defPrefs: SharedPreferences private lateinit var defPrefs: SharedPreferences
private lateinit var arch: String private lateinit var arch: String
@ -47,7 +47,9 @@ object VancedDownloader {
lang = it.split(", ").toMutableList() lang = it.split(", ").toMutableList()
} }
theme = prefs.theme theme = prefs.theme
vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf("")) vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion(
vancedVersions.value?.value ?: listOf("")
)
themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme" themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme"
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json" hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
arch = getArch() arch = getArch()
@ -68,53 +70,68 @@ object VancedDownloader {
"theme" -> "$themePath/$theme.apk" "theme" -> "$themePath/$theme.apk"
"arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk" "arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk"
"stock" -> "$themePath/stock.apk" "stock" -> "$themePath/stock.apk"
"dpi" -> "$themePath/dpi.apk" "dpi" -> "$themePath/dpi.apk"
"lang" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang[count]}.apk" "lang" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang[count]}.apk"
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?") else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
} }
download(url, "$baseInstallUrl/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = { download(
when (type) { url,
"theme" -> "$baseInstallUrl/",
if (variant == "root") { folderName!!,
if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) { getFileNameFromUrl(url),
if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context)) context,
downloadSplits(context, "arch") onDownloadComplete = {
else when (type) {
startVancedInstall(context) "theme" ->
if (variant == "root") {
if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) {
if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context))
downloadSplits(context, "arch")
else
startVancedInstall(context)
} else
downloadSplits(context, "theme")
} else } else
downloadSplits(context, "theme") downloadSplits(context, "arch")
} else "arch" -> if (variant == "root") downloadSplits(
downloadSplits(context, "arch") context,
"arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang") "stock"
"stock" -> downloadSplits(context, "dpi") ) else downloadSplits(context, "lang")
"dpi" -> downloadSplits(context, "lang") "stock" -> downloadSplits(context, "dpi")
"lang" -> { "dpi" -> downloadSplits(context, "lang")
count++ "lang" -> {
succesfulLangCount++ count++
if (count < lang.size) succesfulLangCount++
downloadSplits(context, "lang") if (count < lang.size)
else downloadSplits(context, "lang")
startVancedInstall(context) else
} startVancedInstall(context)
}
}, onError = {
if (type == "lang") {
count++
when {
count < lang.size -> downloadSplits(context, "lang")
succesfulLangCount == 0 -> {
lang.add("en")
downloadSplits(context, "lang")
} }
else -> startVancedInstall(context)
}
} else { }
downloadingFile.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url))) },
} onError = {
}) if (type == "lang") {
count++
when {
count < lang.size -> downloadSplits(context, "lang")
succesfulLangCount == 0 -> {
lang.add("en")
downloadSplits(context, "lang")
}
else -> startVancedInstall(context)
}
} else {
downloadingFile.postValue(
context.getString(
R.string.error_downloading,
getFileNameFromUrl(url)
)
)
}
})
} }
fun startVancedInstall(context: Context, variant: String? = this.variant) { fun startVancedInstall(context: Context, variant: String? = this.variant) {

View File

@ -9,7 +9,7 @@ import com.vanced.manager.utils.AppUtils.sendCloseDialog
import com.vanced.manager.utils.AppUtils.sendFailure import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh import com.vanced.manager.utils.AppUtils.sendRefresh
class AppInstallerService: Service() { class AppInstallerService : Service() {
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
@ -31,7 +31,7 @@ class AppInstallerService: Service() {
else -> { else -> {
sendCloseDialog(this) sendCloseDialog(this)
intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)?.let { intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)?.let {
sendFailure(it,this) sendFailure(it, this)
} }
} }
} }

View File

@ -7,7 +7,7 @@ import android.os.IBinder
import com.vanced.manager.utils.AppUtils.log import com.vanced.manager.utils.AppUtils.log
import com.vanced.manager.utils.AppUtils.sendRefresh import com.vanced.manager.utils.AppUtils.sendRefresh
class AppUninstallerService: Service() { class AppUninstallerService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val pkgName = intent?.getStringExtra("pkg") val pkgName = intent?.getStringExtra("pkg")

View File

@ -0,0 +1,5 @@
package com.vanced.manager.model
enum class ButtonTag {
INSTALL, UPDATE, REINSTALL
}

View File

@ -1,9 +1,10 @@
package com.vanced.manager.model package com.vanced.manager.model
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@ -17,24 +18,28 @@ open class DataModel(
lifecycleOwner: LifecycleOwner, lifecycleOwner: LifecycleOwner,
val appPkg: String, val appPkg: String,
val appName: String, val appName: String,
val appIcon: Drawable? val appDescription: String,
@DrawableRes val appIcon: Int
) { ) {
private val versionCode = MutableLiveData<Int>() private val versionCode = MutableLiveData<Int>()
private val installedVersionCode = MutableLiveData<Int>() private val installedVersionCode = MutableLiveData<Int>()
private val unavailable = context.getString(R.string.unavailable)
private val pm = context.packageManager
val isAppInstalled = MutableLiveData<Boolean>() val isAppInstalled = MutableLiveData<Boolean>()
val versionName = MutableLiveData<String>() val versionName = MutableLiveData<String>()
val installedVersionName = MutableLiveData<String>() val installedVersionName = MutableLiveData<String>()
val buttonTxt = MutableLiveData<String>() val buttonTag = MutableLiveData<ButtonTag>()
val buttonImage = MutableLiveData<Drawable>()
val changelog = MutableLiveData<String>() val changelog = MutableLiveData<String>()
private fun fetch() { private fun fetch() {
val jobj = jsonObject.value val jobj = jsonObject.value
isAppInstalled.value = isAppInstalled(appPkg) isAppInstalled.value = isAppInstalled(appPkg)
versionCode.value = jobj?.int("versionCode") ?: 0 versionCode.value = jobj?.int("versionCode") ?: 0
versionName.value = jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable) versionName.value = jobj?.string("version") ?: unavailable
changelog.value = jobj?.string("changelog") ?: context.getString(R.string.unavailable) changelog.value = jobj?.string("changelog") ?: unavailable
} }
init { init {
@ -44,12 +49,13 @@ open class DataModel(
fetch() fetch()
} }
isAppInstalled.observe(this) { isAppInstalled.observe(this) {
installedVersionCode.value = getPkgVersionCode(appPkg) installedVersionCode.value = getPkgVersionCode(appPkg, it)
installedVersionName.value = getPkgVersionName(appPkg) installedVersionName.value = getPkgVersionName(appPkg, it)
} }
versionCode.observe(this) { versionCode -> versionCode.observe(this) { versionCode ->
installedVersionCode.observe(this) { installedVersionCode -> installedVersionCode.observe(this) { installedVersionCode ->
buttonTxt.value = compareInt(installedVersionCode, versionCode) buttonTag.value = compareInt(installedVersionCode, versionCode)
buttonImage.value = compareIntDrawable(installedVersionCode, versionCode)
} }
} }
} }
@ -57,37 +63,48 @@ open class DataModel(
open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager) open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager)
private fun getPkgVersionName(pkg: String): String { private fun getPkgVersionName(pkg: String, isAppInstalled: Boolean): String {
val pm = context.packageManager return if (isAppInstalled) {
return try { pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: unavailable
pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable) } else {
} catch (e: PackageManager.NameNotFoundException) { unavailable
context.getString(R.string.unavailable)
} }
} }
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
private fun getPkgVersionCode(pkg: String): Int { private fun getPkgVersionCode(pkg: String, isAppInstalled: Boolean): Int {
val pm = context.packageManager return if (isAppInstalled) {
return try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0 pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0
else else
pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0 pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0
} catch (e: PackageManager.NameNotFoundException) {
} else {
0 0
} }
} }
private fun compareInt(int1: Int?, int2: Int?): String { private fun compareInt(int1: Int?, int2: Int?): ButtonTag {
if (int2 != null && int1 != null) { if (int2 != null && int1 != null) {
return when { return when {
int1 == 0 -> context.getString(R.string.install) int1 == 0 -> ButtonTag.INSTALL
int2 > int1 -> context.getString(R.string.update) int2 > int1 -> ButtonTag.UPDATE
int2 == int1 || int1 > int2 -> context.getString(R.string.button_reinstall) int1 >= int2 -> ButtonTag.REINSTALL
else -> context.getString(R.string.install) else -> ButtonTag.INSTALL
} }
} }
return context.getString(R.string.install) return ButtonTag.INSTALL
}
private fun compareIntDrawable(int1: Int?, int2: Int?): Drawable {
if (int2 != null && int1 != null) {
return when {
int1 == 0 -> ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
int2 > int1 -> ContextCompat.getDrawable(context, R.drawable.ic_app_update)!!
int1 >= int2 -> ContextCompat.getDrawable(context, R.drawable.ic_app_reinstall)!!
else -> ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
}
}
return ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
} }
} }

View File

@ -1,7 +1,7 @@
package com.vanced.manager.model package com.vanced.manager.model
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import androidx.annotation.DrawableRes
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.beust.klaxon.JsonObject import com.beust.klaxon.JsonObject
@ -13,15 +13,16 @@ class RootDataModel(
lifecycleOwner: LifecycleOwner, lifecycleOwner: LifecycleOwner,
appPkg: String, appPkg: String,
appName: String, appName: String,
appIcon: Drawable?, appDescription: String,
@DrawableRes appIcon: Int,
//BUG THIS! //BUG THIS!
//kotlin thinks that this value is null if we use //kotlin thinks that this value is null if we use
//private val scriptName: String //private val scriptName: String
//Although it's impossible for it to be null. //Although it's impossible for it to be null.
//Ironic, isn't it? //Ironic, isn't it?
private val scriptName: String? private val scriptName: String?
): DataModel( ) : DataModel(
jsonObject, context, lifecycleOwner, appPkg, appName, appIcon jsonObject, context, lifecycleOwner, appPkg, appName, appDescription, appIcon
) { ) {
override fun isAppInstalled(pkg: String): Boolean { override fun isAppInstalled(pkg: String): Boolean {

View File

@ -3,7 +3,7 @@ package com.vanced.manager.model
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
data class SponsorModel( data class SponsorModel(
val logo: Drawable?, val logo: Drawable?,
val name: String, val name: String,
val url: String val url: String
) )

View File

@ -32,6 +32,7 @@ import com.vanced.manager.utils.AppUtils.currentLocale
import com.vanced.manager.utils.AppUtils.faqpkg import com.vanced.manager.utils.AppUtils.faqpkg
import com.vanced.manager.utils.AppUtils.log import com.vanced.manager.utils.AppUtils.log
import com.vanced.manager.utils.AppUtils.playStorePkg import com.vanced.manager.utils.AppUtils.playStorePkg
import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.PackageHelper.isPackageInstalled import com.vanced.manager.utils.PackageHelper.isPackageInstalled
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@ -74,7 +75,7 @@ class MainActivity : AppCompatActivity() {
initDialogs(intent.getBooleanExtra("firstLaunch", false)) initDialogs(intent.getBooleanExtra("firstLaunch", false))
manager.observe(this) { manager.observe(this) {
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) { if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
ManagerUpdateDialog.newInstance(false).show(this) ManagerUpdateDialog.newInstance(true).show(this)
} }
} }
} }
@ -85,7 +86,10 @@ class MainActivity : AppCompatActivity() {
} }
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) { private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
binding.toolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable(this, R.drawable.ic_keyboard_backspace_black_24dp) else null binding.toolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable(
this,
R.drawable.ic_keyboard_backspace_black_24dp
) else null
} }
override fun onPause() { override fun onPause() {
@ -101,10 +105,6 @@ class MainActivity : AppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) { return when (item.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
true
}
R.id.toolbar_about -> { R.id.toolbar_about -> {
navHost.navigate(HomeFragmentDirections.toAboutFragment()) navHost.navigate(HomeFragmentDirections.toAboutFragment())
true true
@ -140,7 +140,8 @@ class MainActivity : AppCompatActivity() {
} }
} }
R.id.toolbar_update_manager -> { R.id.toolbar_update_manager -> {
ManagerUpdateDialog.newInstance(false).show(supportFragmentManager, "manager_update") ManagerUpdateDialog.newInstance(false)
.show(supportFragmentManager, "manager_update")
true true
} }
R.id.dev_settings -> { R.id.dev_settings -> {
@ -173,8 +174,14 @@ class MainActivity : AppCompatActivity() {
} }
when (newConfig.orientation) { when (newConfig.orientation) {
Configuration.ORIENTATION_PORTRAIT -> log("VMUI", "screen orientation changed to portrait") Configuration.ORIENTATION_PORTRAIT -> log(
Configuration.ORIENTATION_LANDSCAPE -> log("VMUI", "screen orientation changed to landscape") "VMUI",
"screen orientation changed to portrait"
)
Configuration.ORIENTATION_LANDSCAPE -> log(
"VMUI",
"screen orientation changed to landscape"
)
else -> log("VMUI", "screen orientation changed to [REDACTED]") else -> log("VMUI", "screen orientation changed to [REDACTED]")
} }
@ -208,7 +215,7 @@ class MainActivity : AppCompatActivity() {
} }
} else { } else {
if (isMiuiOptimizationsEnabled) { if (isMiuiOptimizationsEnabled) {
DialogContainer.applyAccentMiuiDialog(this) DialogContainer.miuiDialog(this)
} }
} }
@ -217,7 +224,7 @@ class MainActivity : AppCompatActivity() {
} }
if (variant == "root") { if (variant == "root") {
if (PackageHelper.getPackageVersionName("com.google.android.youtube", packageManager) == "14.21.54") { if (PackageHelper.getPackageVersionName(vancedRootPkg, packageManager) == "14.21.54") {
DialogContainer.basicDialog( DialogContainer.basicDialog(
getString(R.string.hold_on), getString(R.string.hold_on),
getString(R.string.magisk_vanced), getString(R.string.magisk_vanced),

View File

@ -1,11 +1,9 @@
package com.vanced.manager.ui.core package com.vanced.manager.ui
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.WelcomeActivity
class SplashScreenActivity : AppCompatActivity() { class SplashScreenActivity : AppCompatActivity() {

View File

@ -1,10 +1,10 @@
package com.vanced.manager.ui package com.vanced.manager.ui
import android.animation.Animator
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.os.Bundle import android.os.Bundle
import android.view.animation.AccelerateDecelerateInterpolator import android.util.LayoutDirection
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.animation.addListener
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.vanced.manager.adapter.WelcomePageAdapter import com.vanced.manager.adapter.WelcomePageAdapter
import com.vanced.manager.databinding.ActivityWelcomeBinding import com.vanced.manager.databinding.ActivityWelcomeBinding
@ -12,21 +12,22 @@ import kotlin.math.abs
class WelcomeActivity : AppCompatActivity() { class WelcomeActivity : AppCompatActivity() {
private lateinit var viewPager2: ViewPager2
private lateinit var binding: ActivityWelcomeBinding private lateinit var binding: ActivityWelcomeBinding
private var isRtl = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityWelcomeBinding.inflate(layoutInflater) binding = ActivityWelcomeBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
viewPager2 = binding.welcomeViewpager isRtl = resources.configuration.layoutDirection == LayoutDirection.RTL
viewPager2.apply {
binding.welcomeViewpager.apply {
adapter = WelcomePageAdapter(this@WelcomeActivity) adapter = WelcomePageAdapter(this@WelcomeActivity)
isUserInputEnabled = false isUserInputEnabled = false
setPageTransformer { page, position -> setPageTransformer { page, position ->
page.apply { page.apply {
val pageWidth = width val pageWidth = width.toFloat()
//Thank you, fragula dev! //Thank you, fragula dev!
when { when {
position > 0 && position < 1 -> { position > 0 && position < 1 -> {
@ -35,7 +36,7 @@ class WelcomeActivity : AppCompatActivity() {
} }
position > -1 && position <= 0 -> { position > -1 && position <= 0 -> {
alpha = 1.0f - abs(position * 0.7f) alpha = 1.0f - abs(position * 0.7f)
translationX = -pageWidth * position / 1.3F translationX = pageWidth.rtlCompat * position / 1.3F
} }
} }
} }
@ -44,21 +45,25 @@ class WelcomeActivity : AppCompatActivity() {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (viewPager2.currentItem == 0) { with(binding) {
super.onBackPressed() if (welcomeViewpager.currentItem == 0) {
} else { super.onBackPressed()
navigateTo(viewPager2.currentItem - 1) } else {
navigateTo(welcomeViewpager.currentItem - 1)
}
} }
} }
fun navigateTo(position: Int) { fun navigateTo(position: Int) {
viewPager2.currentPosition = position binding.welcomeViewpager.currentPosition = position
} }
private val Float.rtlCompat get() = if (isRtl) this else -this
//Shit way to implement animation duration, but at least it works //Shit way to implement animation duration, but at least it works
private var ViewPager2.currentPosition: Int private var ViewPager2.currentPosition: Int
get() = currentItem get() = currentItem
set(value) { set(value) {
val pixelsToDrag: Int = width * (value - currentItem) val pixelsToDrag: Int = width * (value - currentItem)
val animator = ValueAnimator.ofInt(0, pixelsToDrag) val animator = ValueAnimator.ofInt(0, pixelsToDrag)
var previousValue = 0 var previousValue = 0
@ -66,16 +71,13 @@ class WelcomeActivity : AppCompatActivity() {
addUpdateListener { valueAnimator -> addUpdateListener { valueAnimator ->
val currentValue = valueAnimator.animatedValue as Int val currentValue = valueAnimator.animatedValue as Int
val currentPxToDrag = (currentValue - previousValue).toFloat() val currentPxToDrag = (currentValue - previousValue).toFloat()
fakeDragBy(-currentPxToDrag) fakeDragBy(currentPxToDrag.rtlCompat)
previousValue = currentValue previousValue = currentValue
} }
addListener(object : Animator.AnimatorListener { addListener(
override fun onAnimationStart(animation: Animator?) { beginFakeDrag() } onStart = { beginFakeDrag() },
override fun onAnimationEnd(animation: Animator?) { endFakeDrag() } onEnd = { endFakeDrag() }
override fun onAnimationCancel(animation: Animator?) {} )
override fun onAnimationRepeat(animation: Animator?) {}
})
interpolator = AccelerateDecelerateInterpolator()
duration = 500 duration = 500
start() start()
} }

View File

@ -31,7 +31,7 @@ class EmptyPreference @JvmOverloads constructor(
} }
fun setSummary(newSummary: String) { fun setSummary(newSummary: String) {
with (binding) { with(binding) {
preferenceSummary.text = newSummary preferenceSummary.text = newSummary
preferenceSummary.isVisible = true preferenceSummary.isVisible = true
preferenceTitle.setPadding(0, 0, 0, 0) preferenceTitle.setPadding(0, 0, 0, 0)
@ -40,10 +40,11 @@ class EmptyPreference @JvmOverloads constructor(
private fun initAttrs(context: Context, attrs: AttributeSet?) { private fun initAttrs(context: Context, attrs: AttributeSet?) {
attrs?.let { mAttrs -> attrs?.let { mAttrs ->
val typedArray = context.obtainStyledAttributes(mAttrs, R.styleable.EmptyPreference, 0, 0) val typedArray =
context.obtainStyledAttributes(mAttrs, R.styleable.EmptyPreference, 0, 0)
val title = typedArray.getText(R.styleable.EmptyPreference_preference_title) val title = typedArray.getText(R.styleable.EmptyPreference_preference_title)
val summary = typedArray.getText(R.styleable.EmptyPreference_preference_summary) val summary = typedArray.getText(R.styleable.EmptyPreference_preference_summary)
with (binding) { with(binding) {
if (summary != null) { if (summary != null) {
preferenceSummary.text = summary preferenceSummary.text = summary
} else { } else {

View File

@ -27,7 +27,8 @@ class PreferenceCategory @JvmOverloads constructor(
private fun initAttrs(context: Context, attrs: AttributeSet?) { private fun initAttrs(context: Context, attrs: AttributeSet?) {
attrs.let { mAttrs -> attrs.let { mAttrs ->
val typedArray = context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0) val typedArray =
context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0)
val title = typedArray.getText(R.styleable.PreferenceCategory_category_title) val title = typedArray.getText(R.styleable.PreferenceCategory_category_title)
binding.categoryTitle.text = title binding.categoryTitle.text = title

View File

@ -1,6 +1,7 @@
package com.vanced.manager.ui.core package com.vanced.manager.ui.core
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.CompoundButton import android.widget.CompoundButton
@ -31,6 +32,13 @@ class PreferenceSwitch @JvmOverloads constructor(
private var mListener: OnCheckedListener? = null private var mListener: OnCheckedListener? = null
private val prefListener =
SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
if (key == prefKey) {
binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue)
}
}
private var _binding: ViewPreferenceSwitchBinding? = null private var _binding: ViewPreferenceSwitchBinding? = null
val binding: ViewPreferenceSwitchBinding val binding: ViewPreferenceSwitchBinding
@ -38,11 +46,7 @@ class PreferenceSwitch @JvmOverloads constructor(
init { init {
_binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true) _binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true)
prefs.registerOnSharedPreferenceChangeListener { sharedPreferences, key -> prefs.registerOnSharedPreferenceChangeListener(prefListener)
if (key == prefKey) {
binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue)
}
}
attrs?.let { mAttrs -> attrs?.let { mAttrs ->
with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) { with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) {
val title = getText(R.styleable.PreferenceSwitch_switch_title) val title = getText(R.styleable.PreferenceSwitch_switch_title)

View File

@ -0,0 +1,19 @@
package com.vanced.manager.ui.core
import android.content.Context
import android.content.res.ColorStateList
import android.util.AttributeSet
import com.google.android.material.card.MaterialCardView
import com.vanced.manager.utils.accentColor
class ThemedAppCard @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = 0
) : MaterialCardView(context, attributeSet, defStyleAttr) {
init {
setCardBackgroundColor(ColorStateList.valueOf(accentColor.value!!).withAlpha(35))
}
}

View File

@ -0,0 +1,24 @@
package com.vanced.manager.ui.core
import android.content.Context
import android.content.res.ColorStateList
import android.util.AttributeSet
import android.widget.Toast
import com.google.android.material.button.MaterialButton
import com.vanced.manager.utils.accentColor
class ThemedIconButton @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyleAttr: Int = 0
) : MaterialButton(context, attributeSet, defStyleAttr) {
init {
iconTint = ColorStateList.valueOf(accentColor.value!!)
setOnLongClickListener {
Toast.makeText(context, contentDescription, Toast.LENGTH_SHORT).show()
true
}
}
}

View File

@ -7,9 +7,7 @@ import androidx.core.graphics.ColorUtils
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.accentColor import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedMaterialButton @JvmOverloads constructor( class ThemedMaterialButton @JvmOverloads constructor(
context: Context, context: Context,
@ -18,8 +16,7 @@ class ThemedMaterialButton @JvmOverloads constructor(
) : MaterialButton(context, attributeSet, defStyleAttr) { ) : MaterialButton(context, attributeSet, defStyleAttr) {
init { init {
setBgColor(context.defPrefs.managerAccent) context.lifecycleOwner?.let { owner ->
context.lifecycleOwner()?.let { owner ->
accentColor.observe(owner) { color -> accentColor.observe(owner) { color ->
setBgColor(color.toInt()) setBgColor(color.toInt())
} }

View File

@ -5,14 +5,13 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.checkbox.MaterialCheckBox import com.google.android.material.checkbox.MaterialCheckBox
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.managerAccent
class ThemedMaterialCheckbox @JvmOverloads constructor( class ThemedMaterialCheckbox @JvmOverloads constructor(
context: Context, context: Context,
attributeSet: AttributeSet? = null, attributeSet: AttributeSet? = null,
) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) { ) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) {
init { init {
buttonTintList = ColorStateList.valueOf(context.defPrefs.managerAccent) buttonTintList = ColorStateList.valueOf(accentColor.value!!)
} }
} }

View File

@ -5,14 +5,13 @@ import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.radiobutton.MaterialRadioButton import com.google.android.material.radiobutton.MaterialRadioButton
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.managerAccent
class ThemedMaterialRadioButton @JvmOverloads constructor( class ThemedMaterialRadioButton @JvmOverloads constructor(
context: Context, context: Context,
attributeSet: AttributeSet? = null, attributeSet: AttributeSet? = null,
) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) { ) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) {
init { init {
buttonTintList = ColorStateList.valueOf(context.defPrefs.managerAccent) buttonTintList = ColorStateList.valueOf(accentColor.value!!)
} }
} }

View File

@ -4,8 +4,7 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.slider.Slider import com.google.android.material.slider.Slider
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.managerAccent
class ThemedMaterialSlider @JvmOverloads constructor( class ThemedMaterialSlider @JvmOverloads constructor(
context: Context, context: Context,
@ -14,7 +13,7 @@ class ThemedMaterialSlider @JvmOverloads constructor(
) : Slider(context, attributeSet, defStyleAttr) { ) : Slider(context, attributeSet, defStyleAttr) {
init { init {
val accentValue = ColorStateList.valueOf(context.defPrefs.managerAccent) val accentValue = ColorStateList.valueOf(accentColor.value!!)
thumbTintList = accentValue thumbTintList = accentValue
trackActiveTintList = accentValue trackActiveTintList = accentValue
trackInactiveTintList = accentValue.withAlpha(70) trackInactiveTintList = accentValue.withAlpha(70)

View File

@ -6,10 +6,7 @@ import android.util.AttributeSet
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.vanced.manager.utils.accentColor import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedOutlinedMaterialButton @JvmOverloads constructor( class ThemedOutlinedMaterialButton @JvmOverloads constructor(
context: Context, context: Context,
@ -17,8 +14,7 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : MaterialButton(context, attributeSet, defStyleAttr) { ) : MaterialButton(context, attributeSet, defStyleAttr) {
init { init {
applyAccent(context.defPrefs.managerAccent) context.lifecycleOwner?.let { owner ->
context.lifecycleOwner()?.let { owner ->
accentColor.observe(owner) { color -> accentColor.observe(owner) { color ->
applyAccent(color.toInt()) applyAccent(color.toInt())
} }
@ -27,6 +23,9 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
private fun applyAccent(color: Int) { private fun applyAccent(color: Int) {
setTextColor(color) setTextColor(color)
rippleColor = ColorStateList(arrayOf(intArrayOf()), intArrayOf(ColorUtils.setAlphaComponent(color, 50))) rippleColor = ColorStateList(
arrayOf(intArrayOf()),
intArrayOf(ColorUtils.setAlphaComponent(color, 50))
)
} }
} }

View File

@ -4,21 +4,27 @@ import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.managerAccent
class ThemedSwipeRefreshlayout @JvmOverloads constructor( class ThemedSwipeRefreshlayout @JvmOverloads constructor(
context: Context, context: Context,
attributeSet: AttributeSet? = null attributeSet: AttributeSet? = null
) : SwipeRefreshLayout(context, attributeSet) { ) : SwipeRefreshLayout(context, attributeSet) {
init { init {
setColorSchemeColors(context.defPrefs.managerAccent) setColorSchemeColors(accentColor.value!!)
initAttrs(context, attributeSet) initAttrs(context, attributeSet)
} }
private fun initAttrs(context: Context, attributeSet: AttributeSet?) { private fun initAttrs(context: Context, attributeSet: AttributeSet?) {
attributeSet.let { attributeSet.let {
val typedAttrs = context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0) val typedAttrs =
setProgressBackgroundColorSchemeColor(typedAttrs.getColor(R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor, 0)) context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0)
setProgressBackgroundColorSchemeColor(
typedAttrs.getColor(
R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor,
0
)
)
typedAttrs.recycle() typedAttrs.recycle()
} }
} }

View File

@ -9,20 +9,18 @@ import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.accentColor import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedSwitchCompat @JvmOverloads constructor( class ThemedSwitchCompat @JvmOverloads constructor(
context: Context, context: Context,
attributeSet: AttributeSet? = null, attributeSet: AttributeSet? = null,
) : SwitchCompat(context, attributeSet, R.attr.switchStyle) { ) : SwitchCompat(context, attributeSet, R.attr.switchStyle) {
private val states = arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)) private val states =
arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked))
init { init {
setSwitchColors(context.defPrefs.managerAccent) context.lifecycleOwner?.let { owner ->
context.lifecycleOwner()?.let { owner ->
accentColor.observe(owner) { color -> accentColor.observe(owner) { color ->
setSwitchColors(color.toInt()) setSwitchColors(color.toInt())
} }
@ -32,7 +30,13 @@ class ThemedSwitchCompat @JvmOverloads constructor(
private fun setSwitchColors(color: Int) { private fun setSwitchColors(color: Int) {
val thumbColors = intArrayOf(Color.LTGRAY, color) val thumbColors = intArrayOf(Color.LTGRAY, color)
val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70)) val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70))
DrawableCompat.setTintList(DrawableCompat.wrap(thumbDrawable), ColorStateList(states, thumbColors)) DrawableCompat.setTintList(
DrawableCompat.setTintList(DrawableCompat.wrap(trackDrawable), ColorStateList(states, trackColors)) DrawableCompat.wrap(thumbDrawable),
ColorStateList(states, thumbColors)
)
DrawableCompat.setTintList(
DrawableCompat.wrap(trackDrawable),
ColorStateList(states, trackColors)
)
} }
} }

View File

@ -4,9 +4,7 @@ import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import com.vanced.manager.utils.accentColor import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedTextView @JvmOverloads constructor( class ThemedTextView @JvmOverloads constructor(
context: Context, context: Context,
@ -14,8 +12,7 @@ class ThemedTextView @JvmOverloads constructor(
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : AppCompatTextView(context, attributeSet, defStyleAttr) { ) : AppCompatTextView(context, attributeSet, defStyleAttr) {
init { init {
setTextColor(context.defPrefs.managerAccent) context.lifecycleOwner?.let { owner ->
context.lifecycleOwner()?.let { owner ->
accentColor.observe(owner) { color -> accentColor.observe(owner) { color ->
setTextColor(color.toInt()) setTextColor(color.toInt())
} }

View File

@ -1,5 +1,6 @@
package com.vanced.manager.ui.dialogs package com.vanced.manager.ui.dialogs
import android.annotation.SuppressLint
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -72,20 +73,28 @@ class AppDownloadDialog : BindingDialogFragment<DialogAppDownloadBinding>() {
appDownloadHeader.text = app appDownloadHeader.text = app
if (arguments?.getBoolean(TAG_INSTALLING) == false) { if (arguments?.getBoolean(TAG_INSTALLING) == false) {
when (app) { when (app) {
getString(R.string.vanced) -> downloadVanced(requireContext(), arguments?.getString(TAG_VERSION)) getString(R.string.vanced) -> downloadVanced(
getString(R.string.music) -> downloadMusic(requireContext(), arguments?.getString(TAG_VERSION)) requireContext(),
arguments?.getString(TAG_VERSION)
)
getString(R.string.music) -> downloadMusic(
requireContext(),
arguments?.getString(TAG_VERSION)
)
getString(R.string.microg) -> downloadMicrog(requireContext()) getString(R.string.microg) -> downloadMicrog(requireContext())
} }
} }
} }
} }
@SuppressLint("SetTextI18n")
private fun DialogAppDownloadBinding.bindDownloadProgress() { private fun DialogAppDownloadBinding.bindDownloadProgress() {
downloadProgress.observe(viewLifecycleOwner) { downloadProgress.observe(viewLifecycleOwner) {
appDownloadProgressbar.progress = it appDownloadProgressbar.progress = it
appDownloadProgress.text = "$it%"
} }
installing.observe(viewLifecycleOwner) { installing -> installing.observe(viewLifecycleOwner) { installing ->
appDownloadProgressbar.isVisible = !installing appDownloadProgressbarContainer.isVisible = !installing
appInstallProgressbar.isVisible = installing appInstallProgressbar.isVisible = installing
appDownloadFile.isVisible = !installing appDownloadFile.isVisible = !installing
appDownloadCancel.isEnabled = !installing appDownloadCancel.isEnabled = !installing

View File

@ -2,11 +2,10 @@ package com.vanced.manager.ui.dialogs
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.graphics.drawable.toBitmap import androidx.annotation.DrawableRes
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogAppInfoBinding import com.vanced.manager.databinding.DialogAppInfoBinding
@ -21,13 +20,15 @@ class AppInfoDialog : BindingDialogFragment<DialogAppInfoBinding>() {
fun newInstance( fun newInstance(
appName: String?, appName: String?,
appIcon: Drawable?, @DrawableRes appIcon: Int?,
changelog: String? changelog: String?
): AppInfoDialog = AppInfoDialog().apply { ): AppInfoDialog = AppInfoDialog().apply {
arguments = Bundle().apply { arguments = Bundle().apply {
putString(TAG_APP_NAME, appName) putString(TAG_APP_NAME, appName)
putString(TAG_CHANGELOG, changelog) putString(TAG_CHANGELOG, changelog)
putParcelable(TAG_APP_ICON, appIcon?.toBitmap()) if (appIcon != null) {
putInt(TAG_APP_ICON, appIcon)
}
} }
} }
} }
@ -47,7 +48,7 @@ class AppInfoDialog : BindingDialogFragment<DialogAppInfoBinding>() {
with(binding) { with(binding) {
aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME)) aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME))
aboutAppChangelog.text = arguments?.getString(TAG_CHANGELOG) aboutAppChangelog.text = arguments?.getString(TAG_CHANGELOG)
aboutAppImage.setImageBitmap(arguments?.getParcelable(TAG_APP_ICON)) arguments?.getInt(TAG_APP_ICON)?.let { aboutAppImage.setImageResource(it) }
} }
} }
} }

View File

@ -11,11 +11,12 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.formatVersion import com.vanced.manager.utils.formatVersion
import com.vanced.manager.utils.getCheckedButtonTag
class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() { class AppVersionSelectorDialog :
BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
private val prefs by lazy { requireActivity().defPrefs } private val prefs by lazy { requireActivity().defPrefs }
@ -64,7 +65,7 @@ class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRa
} }
dialogTitle.text = getString(R.string.version) dialogTitle.text = getString(R.string.version)
dialogSave.setOnClickListener { dialogSave.setOnClickListener {
val checkedTag = dialogRadiogroup.getCheckedButtonTag() val checkedTag = dialogRadiogroup.checkedButtonTag
if (checkedTag != null) { if (checkedTag != null) {
prefs.edit { putString("${arguments?.getString(TAG_APP)}_version", checkedTag) } prefs.edit { putString("${arguments?.getString(TAG_APP)}_version", checkedTag) }
} }

View File

@ -5,9 +5,9 @@ import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.applyAccent
import com.vanced.manager.utils.isMiuiOptimizationsEnabled import com.vanced.manager.utils.isMiuiOptimizationsEnabled
import com.vanced.manager.utils.openUrl import com.vanced.manager.utils.openUrl
import com.vanced.manager.utils.showWithAccent
object DialogContainer { object DialogContainer {
@ -20,17 +20,17 @@ object DialogContainer {
} }
setOnCancelListener { setOnCancelListener {
if (context.isMiuiOptimizationsEnabled) { if (context.isMiuiOptimizationsEnabled) {
applyAccentMiuiDialog(context) miuiDialog(context)
} }
} }
create() create()
applyAccent() showWithAccent()
} }
val prefs = PreferenceManager.getDefaultSharedPreferences(context) val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.edit { putBoolean("firstLaunch", false) } prefs.edit { putBoolean("firstLaunch", false) }
} }
fun applyAccentMiuiDialog(context: Context) { fun miuiDialog(context: Context) {
MaterialAlertDialogBuilder(context).apply { MaterialAlertDialogBuilder(context).apply {
setTitle(context.getString(R.string.miui_one_title)) setTitle(context.getString(R.string.miui_one_title))
setMessage(context.getString(R.string.miui_one)) setMessage(context.getString(R.string.miui_one))
@ -44,7 +44,7 @@ object DialogContainer {
} }
setCancelable(false) setCancelable(false)
create() create()
applyAccent() showWithAccent()
} }
} }
@ -54,7 +54,7 @@ object DialogContainer {
setMessage("So this statement is false huh? I'll go with True!") setMessage("So this statement is false huh? I'll go with True!")
setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() } setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() }
create() create()
applyAccent() showWithAccent()
} }
val prefs = PreferenceManager.getDefaultSharedPreferences(context) val prefs = PreferenceManager.getDefaultSharedPreferences(context)
@ -68,28 +68,54 @@ object DialogContainer {
when (msg) { when (msg) {
context.getString(R.string.installation_signature) -> { context.getString(R.string.installation_signature) -> {
setPositiveButton(context.getString(R.string.guide)) { _, _ -> setPositiveButton(context.getString(R.string.guide)) { _, _ ->
openUrl("https://lmgtfy.com/?q=andnixsh+apk+verification+disable", R.color.Twitter, context) openUrl(
"https://lmgtfy.com/?q=andnixsh+apk+verification+disable",
R.color.Twitter,
context
)
} }
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
if (fullMsg != null) if (fullMsg != null)
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) } setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
basicDialog(
context.getString(R.string.advanced),
fullMsg,
context
)
}
} }
context.getString(R.string.installation_miui) -> { context.getString(R.string.installation_miui) -> {
setPositiveButton(context.getString(R.string.guide)) { _, _ -> setPositiveButton(context.getString(R.string.guide)) { _, _ ->
openUrl("https://telegra.ph/How-to-install-v15-on-MIUI-02-11", R.color.Telegram, context) openUrl(
"https://telegra.ph/How-to-install-v15-on-MIUI-02-11",
R.color.Telegram,
context
)
} }
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
if (fullMsg != null) if (fullMsg != null)
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) } setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
basicDialog(
context.getString(R.string.advanced),
fullMsg,
context
)
}
} }
else -> { else -> {
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
if (fullMsg != null) if (fullMsg != null)
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) } setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
basicDialog(
context.getString(R.string.advanced),
fullMsg,
context
)
}
} }
} }
create() create()
applyAccent() showWithAccent()
} }
} }
@ -99,7 +125,7 @@ object DialogContainer {
setMessage(msg) setMessage(msg)
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
create() create()
applyAccent() showWithAccent()
} }
} }

View File

@ -13,7 +13,8 @@ import com.vanced.manager.databinding.DialogInstallationFilesDetectedBinding
import com.vanced.manager.utils.defPrefs import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.managerVariant import com.vanced.manager.utils.managerVariant
class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() { class InstallationFilesDetectedDialog :
BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() {
companion object { companion object {
@ -40,9 +41,11 @@ class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogI
private fun bindData() { private fun bindData() {
with(binding) { with(binding) {
val app = arguments?.getString(TAG_APP) ?: throw IllegalArgumentException("app name is null") val app =
arguments?.getString(TAG_APP) ?: throw IllegalArgumentException("app name is null")
installationDetectedTitle.text = getString(R.string.app_install_files_detected, app) installationDetectedTitle.text = getString(R.string.app_install_files_detected, app)
installationDetectedSummary.text = getString(R.string.app_install_files_detected_summary, app) installationDetectedSummary.text =
getString(R.string.app_install_files_detected_summary, app)
installationDetectedRedownload.setOnClickListener { installationDetectedRedownload.setOnClickListener {
dismiss() dismiss()
when (app) { when (app) {

View File

@ -50,9 +50,20 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
hexEdittext.apply { hexEdittext.apply {
setText(accent.toHex(), TextView.BufferType.EDITABLE) setText(accent.toHex(), TextView.BufferType.EDITABLE)
addTextChangedListener(object : TextWatcher { addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { override fun onTextChanged(
s: CharSequence?,
start: Int,
before: Int,
count: Int
) {
if (length() == 0) { if (length() == 0) {
setText("#") setText("#")
setSelection(1) setSelection(1)
@ -63,7 +74,8 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
val colorFromEditText = Color.parseColor(text.toString()) val colorFromEditText = Color.parseColor(text.toString())
accentPicker.setColor(colorFromEditText) accentPicker.setColor(colorFromEditText)
mutableAccentColor.value = colorFromEditText mutableAccentColor.value = colorFromEditText
} catch (e: IllegalArgumentException) {} } catch (e: IllegalArgumentException) {
}
} }
} }
@ -96,7 +108,11 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
prefs.managerAccent = colorFromEditText prefs.managerAccent = colorFromEditText
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
log("VMTheme", getString(R.string.failed_accent)) log("VMTheme", getString(R.string.failed_accent))
Toast.makeText(requireActivity(), getString(R.string.failed_accent), Toast.LENGTH_SHORT).show() Toast.makeText(
requireActivity(),
getString(R.string.failed_accent),
Toast.LENGTH_SHORT
).show()
return@setOnClickListener return@setOnClickListener
} }

View File

@ -10,7 +10,7 @@ import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerLanguageBinding import com.vanced.manager.databinding.DialogManagerLanguageBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.getCheckedButtonTag import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.getLanguageFormat import com.vanced.manager.utils.getLanguageFormat
import com.vanced.manager.utils.managerLang import com.vanced.manager.utils.managerLang
@ -43,7 +43,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment<DialogManagerLang
val language = prefs.managerLang val language = prefs.managerLang
root.findViewWithTag<ThemedMaterialRadioButton>(language)?.isChecked = true root.findViewWithTag<ThemedMaterialRadioButton>(language)?.isChecked = true
languageSave.setOnClickListener { languageSave.setOnClickListener {
val newPref = binding.languageRadiogroup.getCheckedButtonTag() val newPref = binding.languageRadiogroup.checkedButtonTag
if (language != newPref) { if (language != newPref) {
prefs.managerLang = newPref prefs.managerLang = newPref
dismiss() dismiss()

View File

@ -7,7 +7,7 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.google.android.material.radiobutton.MaterialRadioButton import com.google.android.material.radiobutton.MaterialRadioButton
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerThemeBinding import com.vanced.manager.databinding.DialogManagerThemeBinding
import com.vanced.manager.utils.getCheckedButtonTag import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.managerTheme import com.vanced.manager.utils.managerTheme
class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() { class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() {
@ -36,7 +36,7 @@ class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBi
val theme = prefs.managerTheme val theme = prefs.managerTheme
root.findViewWithTag<MaterialRadioButton>(theme).isChecked = true root.findViewWithTag<MaterialRadioButton>(theme).isChecked = true
themeSave.setOnClickListener { themeSave.setOnClickListener {
val newPref = themeRadiogroup.getCheckedButtonTag() val newPref = themeRadiogroup.checkedButtonTag
if (theme != newPref) { if (theme != newPref) {
prefs.managerTheme = newPref prefs.managerTheme = newPref
dismiss() dismiss()

View File

@ -1,5 +1,6 @@
package com.vanced.manager.ui.dialogs package com.vanced.manager.ui.dialogs
import android.annotation.SuppressLint
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -57,7 +58,8 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
bindData() bindData()
if (arguments?.getBoolean(TAG_FORCE_UPDATE) == true) { if (arguments?.getBoolean(TAG_FORCE_UPDATE) == true) {
binding.managerUpdatePatient.text = requireActivity().getString(R.string.please_be_patient) binding.managerUpdatePatient.text =
requireActivity().getString(R.string.please_be_patient)
downloadManager(requireActivity()) downloadManager(requireActivity())
} else { } else {
checkUpdates() checkUpdates()
@ -77,10 +79,12 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
} }
} }
@SuppressLint("SetTextI18n")
private fun DialogManagerUpdateBinding.bindDownloadProgress() { private fun DialogManagerUpdateBinding.bindDownloadProgress() {
downloadProgress.observe(viewLifecycleOwner) { downloadProgress.observe(viewLifecycleOwner) {
managerUpdateProgressbar.progress = it managerUpdateProgressbar.progress = it
managerUpdateProgressbar.isVisible = it != 0 managerUpdateProgressbarContainer.isVisible = it != 0
managerUpdateProgress.text = "$it%"
} }
} }
@ -96,10 +100,12 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
private fun checkUpdates() { private fun checkUpdates() {
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) { if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
binding.managerUpdatePatient.text = requireActivity().getString(R.string.please_be_patient) binding.managerUpdatePatient.text =
requireActivity().getString(R.string.please_be_patient)
downloadManager(requireActivity()) downloadManager(requireActivity())
} else { } else {
binding.managerUpdatePatient.text = requireActivity().getString(R.string.update_not_found) binding.managerUpdatePatient.text =
requireActivity().getString(R.string.update_not_found)
} }
} }

View File

@ -8,7 +8,7 @@ import com.google.android.material.radiobutton.MaterialRadioButton
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerVariantBinding import com.vanced.manager.databinding.DialogManagerVariantBinding
import com.vanced.manager.utils.getCheckedButtonTag import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.managerVariant import com.vanced.manager.utils.managerVariant
class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() { class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() {
@ -37,11 +37,11 @@ class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVaria
val variant = prefs.managerVariant val variant = prefs.managerVariant
root.findViewWithTag<MaterialRadioButton>(variant).isChecked = true root.findViewWithTag<MaterialRadioButton>(variant).isChecked = true
variantSave.setOnClickListener { variantSave.setOnClickListener {
val newPref = variantRadiogroup.getCheckedButtonTag() val newPref = variantRadiogroup.checkedButtonTag
if (variant != newPref) { if (variant != newPref) {
prefs.managerVariant = prefs.managerVariant =
if (newPref == "root" && Shell.rootAccess()) { if (newPref == "root" && Shell.rootAccess()) {
"root" "root"
} else { } else {
"nonroot" "nonroot"
} }

View File

@ -3,7 +3,6 @@ package com.vanced.manager.ui.dialogs
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
@ -34,8 +33,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
private fun bindData() { private fun bindData() {
with(binding) { with(binding) {
val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions() val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions()
musicInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.music)) musicInstallTitle.text =
musicVersion.text = getString(R.string.chosen_version, prefs.musicVersion?.formatVersion(requireActivity())) getString(R.string.app_installation_preferences, getString(R.string.music))
musicVersion.text = getString(
R.string.chosen_version,
prefs.musicVersion?.formatVersion(requireActivity())
)
openVersionSelectorLayout.setOnClickListener { openVersionSelectorLayout.setOnClickListener {
dismiss() dismiss()
showDialog( showDialog(
@ -46,36 +49,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
) )
} }
musicInstall.setOnClickListener { musicInstall.setOnClickListener {
fun downloadMusic(version: String? = null) { dismiss()
dismiss() showDialog(
showDialog( AppDownloadDialog.newInstance(
AppDownloadDialog.newInstance( app = getString(R.string.music)
app = getString(R.string.music),
version = version
)
) )
} )
if (prefs.managerVariant == "nonroot" && isMicrogBroken && prefs.musicVersion?.getLatestAppVersion(musicVersions.value?.value ?: listOf(""))?.replace(".", "")?.take(3)?.toIntOrNull() ?: 0 >= 411 &&
!PackageHelper.isPackageInstalled(
AppUtils.musicPkg,
requireActivity().packageManager
)
) {
MaterialAlertDialogBuilder(requireActivity()).apply {
setTitle(R.string.microg_bug)
setMessage(R.string.microg_bug_summary_music)
setPositiveButton(R.string.auth_dialog_ok) { _, _ ->
downloadMusic("4.07.51")
}
setNeutralButton(R.string.cancel) { _, _ ->
dismiss()
}
create()
}.applyAccent()
return@setOnClickListener
}
downloadMusic()
} }
} }
} }

View File

@ -43,7 +43,11 @@ class SelectAppsDialog : BindingBottomSheetDialogFragment<DialogSelectAppsBindin
} }
selectAppsSave.setOnClickListener { selectAppsSave.setOnClickListener {
if (ad.apps.all { app -> !app.isChecked }) { if (ad.apps.all { app -> !app.isChecked }) {
Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show() Toast.makeText(
requireActivity(),
R.string.select_at_least_one_app,
Toast.LENGTH_SHORT
).show()
return@setOnClickListener return@setOnClickListener
} }
prefs.edit { prefs.edit {

View File

@ -32,7 +32,7 @@ class ServiceDTimerDialog : BindingDialogFragment<DialogServicedTimerBinding>()
} }
private fun bindData() { private fun bindData() {
with (binding) { with(binding) {
servicedSlider.value = prefs.getInt("serviced_sleep_timer", 1).toFloat() servicedSlider.value = prefs.getInt("serviced_sleep_timer", 1).toFloat()
servicedCancel.setOnClickListener { servicedCancel.setOnClickListener {
dismiss() dismiss()
@ -41,12 +41,26 @@ class ServiceDTimerDialog : BindingDialogFragment<DialogServicedTimerBinding>()
try { try {
arrayOf("vanced", "music").forEach { app -> arrayOf("vanced", "music").forEach { app ->
if (scriptExists(app)) { if (scriptExists(app)) {
val apkFPath = "${PackageHelper.apkInstallPath}/${app.capitalize(Locale.ROOT)}/base.apk" val apkFPath =
getPackageDir(requireActivity(), getPkgNameRoot(app))?.let { it1 -> requireActivity().writeServiceDScript(apkFPath, it1, app) } "${PackageHelper.apkInstallPath}/${app.capitalize(Locale.ROOT)}/base.apk"
getPackageDir(
requireActivity(),
getPkgNameRoot(app)
)?.let { it1 ->
requireActivity().writeServiceDScript(
apkFPath,
it1,
app
)
}
} }
} }
} catch (e: IOException) { } catch (e: IOException) {
Toast.makeText(requireActivity(), R.string.script_save_failed, Toast.LENGTH_SHORT).show() Toast.makeText(
requireActivity(),
R.string.script_save_failed,
Toast.LENGTH_SHORT
).show()
return@setOnClickListener return@setOnClickListener
} }

View File

@ -45,11 +45,12 @@ class URLChangeDialog : BindingDialogFragment<DialogCustomUrlBinding>() {
TextView.BufferType.EDITABLE TextView.BufferType.EDITABLE
) )
urlSave.setOnClickListener { urlSave.setOnClickListener {
val finalUrl = if (urlInput.text?.startsWith("https://") == true || urlInput.text?.startsWith("http://") == true) { val finalUrl =
urlInput.text?.removeSuffix("/").toString() if (urlInput.text?.startsWith("https://") == true || urlInput.text?.startsWith("http://") == true) {
} else { urlInput.text?.removeSuffix("/").toString()
"https://${urlInput.text}".removeSuffix("/") } else {
} "https://${urlInput.text}".removeSuffix("/")
}
saveUrl(finalUrl) saveUrl(finalUrl)
} }
urlReset.setOnClickListener { saveUrl(baseUrl) } urlReset.setOnClickListener { saveUrl(baseUrl) }

View File

@ -19,7 +19,8 @@ import com.vanced.manager.utils.lang
import com.vanced.manager.utils.vanced import com.vanced.manager.utils.vanced
import java.util.* import java.util.*
class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() { class VancedLanguageSelectionDialog :
BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {
companion object { companion object {
@ -52,7 +53,11 @@ class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVan
} }
} }
if (chosenLangs.isEmpty()) { if (chosenLangs.isEmpty()) {
Toast.makeText(requireActivity(), R.string.select_at_least_one_lang, Toast.LENGTH_SHORT).show() Toast.makeText(
requireActivity(),
R.string.select_at_least_one_lang,
Toast.LENGTH_SHORT
).show()
return@setOnClickListener return@setOnClickListener
} }
prefs.lang = chosenLangs.joinToString() prefs.lang = chosenLangs.joinToString()

View File

@ -3,14 +3,11 @@ package com.vanced.manager.ui.dialogs
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogVancedPreferencesBinding import com.vanced.manager.databinding.DialogVancedPreferencesBinding
import com.vanced.manager.utils.* import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.vancedPkg
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
import java.util.* import java.util.*
class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() { class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() {
@ -43,9 +40,16 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT)) showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT))
} }
val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions() val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions()
vancedInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.vanced)) vancedInstallTitle.text =
vancedTheme.text = getString(R.string.chosen_theme, installPrefs.theme?.convertToAppTheme(requireActivity())) getString(R.string.app_installation_preferences, getString(R.string.vanced))
vancedVersion.text = getString(R.string.chosen_version, defPrefs.vancedVersion?.formatVersion(requireActivity())) vancedTheme.text = getString(
R.string.chosen_theme,
installPrefs.theme?.convertToAppTheme(requireActivity())
)
vancedVersion.text = getString(
R.string.chosen_version,
defPrefs.vancedVersion?.formatVersion(requireActivity())
)
vancedLang.text = getString(R.string.chosen_lang, showLang) vancedLang.text = getString(R.string.chosen_lang, showLang)
openThemeSelectorLayout.setOnClickListener { openThemeSelectorLayout.setOnClickListener {
dismiss() dismiss()
@ -68,33 +72,12 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
if (showLang.isEmpty()) { if (showLang.isEmpty()) {
installPrefs.lang = "en" installPrefs.lang = "en"
} }
dismiss()
fun downloadVanced(version: String? = null) { showDialog(
dismiss() AppDownloadDialog.newInstance(
showDialog( app = getString(R.string.vanced)
AppDownloadDialog.newInstance(
app = getString(R.string.vanced),
version = version
)
) )
} )
if (defPrefs.managerVariant == "nonroot" && isMicrogBroken && defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf(""))?.take(2)?.toIntOrNull() == 16 && !isPackageInstalled(vancedPkg, requireActivity().packageManager)) {
MaterialAlertDialogBuilder(requireActivity()).apply {
setTitle(R.string.microg_bug)
setMessage(R.string.microg_bug_summary)
setPositiveButton(R.string.auth_dialog_ok) { _, _ ->
downloadVanced("15.43.32")
}
setNeutralButton(R.string.cancel) { _, _ ->
dismiss()
}
create()
}.applyAccent()
return@setOnClickListener
}
downloadVanced()
} }
} }
} }

View File

@ -10,12 +10,13 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.convertToAppTheme import com.vanced.manager.utils.convertToAppTheme
import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.theme import com.vanced.manager.utils.theme
import com.vanced.manager.utils.vanced import com.vanced.manager.utils.vanced
class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() { class VancedThemeSelectorDialog :
BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
companion object { companion object {
@ -24,7 +25,12 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
} }
} }
private val prefs by lazy { requireActivity().getSharedPreferences("installPrefs", Context.MODE_PRIVATE) } private val prefs by lazy {
requireActivity().getSharedPreferences(
"installPrefs",
Context.MODE_PRIVATE
)
}
override fun binding( override fun binding(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -51,7 +57,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
tag.isChecked = true tag.isChecked = true
} }
dialogSave.setOnClickListener { dialogSave.setOnClickListener {
val checkedTag = binding.dialogRadiogroup.getCheckedButtonTag() val checkedTag = binding.dialogRadiogroup.checkedButtonTag
if (checkedTag != null) { if (checkedTag != null) {
prefs.theme = checkedTag prefs.theme = checkedTag
} }
@ -60,7 +66,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
} }
} }
private fun loadButtons() = vanced.value?.array<String>("themes")?.value?.map {theme -> private fun loadButtons() = vanced.value?.array<String>("themes")?.value?.map { theme ->
ThemedMaterialRadioButton(requireActivity()).apply { ThemedMaterialRadioButton(requireActivity()).apply {
text = theme.convertToAppTheme(requireActivity()) text = theme.convertToAppTheme(requireActivity())
tag = theme tag = theme

View File

@ -1,23 +0,0 @@
package com.vanced.manager.ui.events
open class Event<out T>(private val content: T) {
private var hasBeenHandled = false
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}

View File

@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.MotionEvent import android.view.MotionEvent
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.edit import androidx.core.content.edit
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
@ -37,11 +36,11 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun dataBind() { private fun dataBind() {
requireActivity().title = getString(R.string.title_about) requireActivity().title = getString(R.string.title_about)
binding.root.setOnClickListener { binding.aboutVersionCard.setOnClickListener {
showDialog( showDialog(
AppInfoDialog.newInstance( AppInfoDialog.newInstance(
appName = getString(R.string.app_name), appName = getString(R.string.app_name),
appIcon = AppCompatResources.getDrawable(requireActivity(), R.mipmap.ic_launcher), appIcon = R.mipmap.ic_launcher,
changelog = manager.value?.string("changelog") changelog = manager.value?.string("changelog")
) )
) )
@ -61,10 +60,18 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
val devSettings = prefs.getBoolean("devSettings", false) val devSettings = prefs.getBoolean("devSettings", false)
if (!devSettings) { if (!devSettings) {
Toast.makeText(requireContext(), "Dev options unlocked!", Toast.LENGTH_SHORT).show() Toast.makeText(
requireContext(),
"Dev options unlocked!",
Toast.LENGTH_SHORT
).show()
prefs.edit { putBoolean("devSettings", true) } prefs.edit { putBoolean("devSettings", true) }
} else } else
Toast.makeText(requireContext(), "Dev options already unlocked", Toast.LENGTH_SHORT).show() Toast.makeText(
requireContext(),
"Dev options already unlocked",
Toast.LENGTH_SHORT
).show()
} }
return@setOnTouchListener true return@setOnTouchListener true

View File

@ -41,7 +41,12 @@ class GrantRootFragment : BindingFragment<FragmentGrantRootBinding>() {
private fun grantRoot() { private fun grantRoot() {
if (Shell.rootAccess()) { if (Shell.rootAccess()) {
getDefaultSharedPreferences(requireActivity()).edit { putString("vanced_variant", "root") } getDefaultSharedPreferences(requireActivity()).edit {
putString(
"vanced_variant",
"root"
)
}
navigateToFirstLaunch() navigateToFirstLaunch()
} else { } else {
Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show() Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show()

View File

@ -9,18 +9,14 @@ import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.edit
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.crowdin.platform.util.inflateWithCrowdin import com.crowdin.platform.util.inflateWithCrowdin
import com.github.florent37.viewtooltip.ViewTooltip
import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent import com.google.android.flexbox.JustifyContent
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.adapter.AppListAdapter import com.vanced.manager.adapter.ExpandableAppListAdapter
import com.vanced.manager.adapter.LinkAdapter import com.vanced.manager.adapter.LinkAdapter
import com.vanced.manager.adapter.SponsorAdapter import com.vanced.manager.adapter.SponsorAdapter
import com.vanced.manager.core.ui.base.BindingFragment import com.vanced.manager.core.ui.base.BindingFragment
@ -42,8 +38,6 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
} }
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) }
private var tooltip: ViewTooltip? = null
override fun binding( override fun binding(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -58,29 +52,13 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
private fun bindData() { private fun bindData() {
requireActivity().title = getString(R.string.title_home) requireActivity().title = getString(R.string.title_home)
setHasOptionsMenu(true) setHasOptionsMenu(true)
with (binding) { with(binding) {
homeRefresh.setOnRefreshListener { viewModel.fetchData() } homeRefresh.setOnRefreshListener { viewModel.fetchData() }
isFetching.observe(viewLifecycleOwner) { homeRefresh.isRefreshing = it } isFetching.observe(viewLifecycleOwner) { homeRefresh.isRefreshing = it }
if (prefs.getBoolean("show_changelog_tooltip", true)) {
tooltip = ViewTooltip
.on(recyclerAppList)
.position(ViewTooltip.Position.TOP)
.autoHide(false, 0)
.color(ResourcesCompat.getColor(requireActivity().resources, R.color.Twitter, null))
.withShadow(false)
.corner(25)
.onHide {
prefs.edit { putBoolean("show_changelog_tooltip", false) }
}
.text(requireActivity().getString(R.string.app_changelog_tooltip))
tooltip?.show()
}
recyclerAppList.apply { recyclerAppList.apply {
layoutManager = LinearLayoutManager(requireActivity()) layoutManager = LinearLayoutManager(requireActivity())
adapter = AppListAdapter(requireActivity(), viewModel, tooltip) adapter = ExpandableAppListAdapter(requireActivity(), viewModel /*, tooltip*/)
setHasFixedSize(true) setHasFixedSize(true)
} }
@ -110,7 +88,6 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
localBroadcastManager.unregisterReceiver(broadcastReceiver) localBroadcastManager.unregisterReceiver(broadcastReceiver)
tooltip?.close()
} }
override fun onResume() { override fun onResume() {
@ -121,7 +98,11 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
when (intent.action) { when (intent.action) {
INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg").toString(), intent.getStringExtra("fullErrorMsg"), requireActivity()) INSTALL_FAILED -> installAlertBuilder(
intent.getStringExtra("errorMsg").toString(),
intent.getStringExtra("fullErrorMsg"),
requireActivity()
)
REFRESH_HOME -> viewModel.fetchData() REFRESH_HOME -> viewModel.fetchData()
} }
} }

View File

@ -38,7 +38,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
val hour = calendar.get(Calendar.HOUR_OF_DAY) val hour = calendar.get(Calendar.HOUR_OF_DAY)
val minute = calendar.get(Calendar.MINUTE) val minute = calendar.get(Calendar.MINUTE)
val second = calendar.get(Calendar.SECOND) val second = calendar.get(Calendar.SECOND)
val log = File(requireActivity().getExternalFilesDir("logs")?.path + "/$year$month${day}_$hour$minute$second.log") val log =
File(requireActivity().getExternalFilesDir("logs")?.path + "/$year$month${day}_$hour$minute$second.log")
FileWriter(log).apply { FileWriter(log).apply {
append(logs) append(logs)
flush() flush()
@ -46,7 +47,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
} }
Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show() Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show()
} catch (e: IOException) { } catch (e: IOException) {
Toast.makeText(requireActivity(), R.string.logs_not_saved, Toast.LENGTH_SHORT).show() Toast.makeText(requireActivity(), R.string.logs_not_saved, Toast.LENGTH_SHORT)
.show()
} }
} }
} }

View File

@ -45,7 +45,8 @@ class SelectAppsFragment : BindingFragment<FragmentSelectAppsBinding>() {
private fun actionOnClickAppsFab() { private fun actionOnClickAppsFab() {
if (selectAdapter.apps.all { app -> !app.isChecked }) { if (selectAdapter.apps.all { app -> !app.isChecked }) {
Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show() Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT)
.show()
return return
} }
val prefs = getDefaultSharedPreferences(requireActivity()) val prefs = getDefaultSharedPreferences(requireActivity())

View File

@ -7,6 +7,7 @@ import android.view.MenuInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
@ -34,6 +35,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) }
private lateinit var variant: String private lateinit var variant: String
private lateinit var parentActivity: FragmentActivity
override fun binding( override fun binding(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -43,6 +45,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
override fun otherSetups() { override fun otherSetups() {
setHasOptionsMenu(true) setHasOptionsMenu(true)
parentActivity = requireActivity()
bindData() bindData()
} }
@ -63,8 +66,8 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private fun FragmentSettingsBinding.bindRecycler() { private fun FragmentSettingsBinding.bindRecycler() {
notificationsRecycler.apply { notificationsRecycler.apply {
layoutManager = LinearLayoutManager(requireActivity()) layoutManager = LinearLayoutManager(parentActivity)
adapter = GetNotifAdapter(requireActivity()) adapter = GetNotifAdapter(parentActivity)
} }
} }
@ -72,7 +75,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
firebase.setOnCheckedListener { _, isChecked -> firebase.setOnCheckedListener { _, isChecked ->
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked) FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked)
FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked
FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(isChecked) FirebaseAnalytics.getInstance(parentActivity).setAnalyticsCollectionEnabled(isChecked)
} }
} }
@ -93,7 +96,13 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private fun FragmentSettingsBinding.bindClearFiles() { private fun FragmentSettingsBinding.bindClearFiles() {
clearFiles.setOnClickListener { clearFiles.setOnClickListener {
with(requireActivity()) { with(requireActivity()) {
listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir -> listOf(
"vanced/nonroot",
"vanced/root",
"music/nonroot",
"music/root",
"microg"
).forEach { dir ->
File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively() File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively()
} }
Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show() Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show()
@ -116,7 +125,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
} }
private fun FragmentSettingsBinding.bindManagerAccentColor() { private fun FragmentSettingsBinding.bindManagerAccentColor() {
managerAccentColor.apply{ managerAccentColor.apply {
setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex()) setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex())
setOnClickListener { showDialog(ManagerAccentColorDialog()) } setOnClickListener { showDialog(ManagerAccentColorDialog()) }
accentColor.observe(viewLifecycleOwner) { accentColor.observe(viewLifecycleOwner) {
@ -128,14 +137,15 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private fun FragmentSettingsBinding.bindManagerLanguage() { private fun FragmentSettingsBinding.bindManagerLanguage() {
val langPref = prefs.getString("manager_lang", "System Default") val langPref = prefs.getString("manager_lang", "System Default")
managerLanguage.apply { managerLanguage.apply {
setSummary(getLanguageFormat(requireActivity(), requireNotNull(langPref))) setSummary(getLanguageFormat(parentActivity, requireNotNull(langPref)))
setOnClickListener { showDialog(ManagerLanguageDialog()) } setOnClickListener { showDialog(ManagerLanguageDialog()) }
} }
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val devSettings = getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false) val devSettings =
getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false)
if (devSettings) { if (devSettings) {
inflater.inflate(R.menu.dev_settings_menu, menu) inflater.inflate(R.menu.dev_settings_menu, menu)
} }

View File

@ -5,7 +5,7 @@ import androidx.lifecycle.AndroidViewModel
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.openUrl import com.vanced.manager.utils.openUrl
class AboutViewModel(application: Application): AndroidViewModel(application) { class AboutViewModel(application: Application) : AndroidViewModel(application) {
fun openUrl(url: String) { fun openUrl(url: String) {
openUrl(url, R.color.GitHub, getApplication()) openUrl(url, R.color.GitHub, getApplication())

View File

@ -1,24 +1,23 @@
package com.vanced.manager.ui.viewmodels package com.vanced.manager.ui.viewmodels
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.ComponentName import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.crowdin.platform.Crowdin import com.crowdin.platform.Crowdin
import com.google.android.material.button.MaterialButton
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD
import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT
import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM
import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER
import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE
import com.vanced.manager.model.ButtonTag
import com.vanced.manager.model.DataModel import com.vanced.manager.model.DataModel
import com.vanced.manager.model.RootDataModel import com.vanced.manager.model.RootDataModel
import com.vanced.manager.ui.dialogs.AppDownloadDialog import com.vanced.manager.ui.dialogs.AppDownloadDialog
@ -40,7 +39,9 @@ import com.vanced.manager.utils.PackageHelper.uninstallRootApk
import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { //TODO fix leak
@SuppressLint("StaticFieldLeak")
class HomeViewModel(private val activity: FragmentActivity) : ViewModel() {
private val prefs = getDefaultSharedPreferences(activity) private val prefs = getDefaultSharedPreferences(activity)
private val variant get() = prefs.getString("vanced_variant", "nonroot") private val variant get() = prefs.getString("vanced_variant", "nonroot")
@ -58,7 +59,7 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
Crowdin.forceUpdate(activity) Crowdin.forceUpdate(activity)
} }
} }
private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG) private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG)
fun openUrl(url: String) { fun openUrl(url: String) {
@ -71,15 +72,24 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
BRAVE -> R.color.Brave BRAVE -> R.color.Brave
else -> R.color.Vanced else -> R.color.Vanced
} }
openUrl(url, color, activity) openUrl(url, color, activity)
} }
fun launchApp(app: String, isRoot: Boolean) { fun launchApp(app: String, isRoot: Boolean) {
val componentName = when (app) { val componentName = when (app) {
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(vancedRootPkg, "$vancedRootPkg.HomeActivity") else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity") activity.getString(R.string.vanced) -> if (isRoot) ComponentName(
activity.getString(R.string.music) -> if (isRoot) ComponentName(musicRootPkg, "$musicRootPkg.activities.MusicActivity") else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity") vancedRootPkg,
activity.getString(R.string.microg) -> ComponentName(microgPkg, "org.microg.gms.ui.SettingsActivity") "$vancedRootPkg.HomeActivity"
) else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity")
activity.getString(R.string.music) -> if (isRoot) ComponentName(
musicRootPkg,
"$musicRootPkg.activities.MusicActivity"
) else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity")
activity.getString(R.string.microg) -> ComponentName(
microgPkg,
"org.microg.gms.ui.SettingsActivity"
)
else -> throw IllegalArgumentException("Can't open this app") else -> throw IllegalArgumentException("Can't open this app")
} }
try { try {
@ -90,19 +100,18 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
} }
fun openInstallDialog(view: View, app: String) { fun openInstallDialog(buttonTag: ButtonTag?, app: String) {
if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) { if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) {
microgToast.show() microgToast.show()
return return
} }
if ((view as MaterialButton).text == activity.getString(R.string.update)) { if (buttonTag == ButtonTag.UPDATE) {
when (app) { when (app) {
activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity) activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity)
activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity) activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity)
else -> AppDownloadDialog.newInstance(app).show(activity) else -> AppDownloadDialog.newInstance(app).show(activity)
} }
return return
} }
@ -155,16 +164,66 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
} }
init { init {
with (activity) { with(activity) {
if (variant == "root") { if (variant == "root") {
vancedRootModel.value = RootDataModel(vanced, this, this, vancedRootPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced), "vanced") vancedRootModel.value = RootDataModel(
musicRootModel.value = RootDataModel(music, this, this, musicRootPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music), "music") vanced,
this,
this,
vancedRootPkg,
this.getString(R.string.vanced),
activity.getString(R.string.description_vanced),
R.drawable.ic_vanced,
"vanced"
)
musicRootModel.value = RootDataModel(
music,
this,
this,
musicRootPkg,
this.getString(R.string.music),
activity.getString(R.string.description_vanced_music),
R.drawable.ic_music,
"music"
)
} else { } else {
vancedModel.value = DataModel(vanced, this, this, vancedPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced)) vancedModel.value = DataModel(
musicModel.value = DataModel(music, this, this, musicPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music)) vanced,
microgModel.value = DataModel(microg, this, this, microgPkg, this.getString(R.string.microg), AppCompatResources.getDrawable(this, R.drawable.ic_microg)) this,
this,
vancedPkg,
this.getString(R.string.vanced),
activity.getString(R.string.description_vanced),
R.drawable.ic_vanced
)
musicModel.value = DataModel(
music,
this,
this,
musicPkg,
this.getString(R.string.music),
activity.getString(R.string.description_vanced_music),
R.drawable.ic_music
)
microgModel.value = DataModel(
microg,
this,
this,
microgPkg,
this.getString(R.string.microg),
activity.getString(R.string.description_microg),
R.drawable.ic_microg
)
} }
managerModel.value = DataModel(manager, this, this, managerPkg, this.getString(R.string.app_name), AppCompatResources.getDrawable(this, R.mipmap.ic_launcher)) managerModel.value = DataModel(
manager,
this,
this,
managerPkg,
this.getString(R.string.app_name),
"Just manager meh",
R.mipmap.ic_launcher
)
} }
} }
} }

View File

@ -20,7 +20,7 @@ import java.io.IOException
import java.security.MessageDigest import java.security.MessageDigest
import java.util.* import java.util.*
object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) { object AppUtils : CoroutineScope by CoroutineScope(Dispatchers.IO) {
const val vancedPkg = "com.vanced.android.youtube" const val vancedPkg = "com.vanced.android.youtube"
const val vancedRootPkg = "com.google.android.youtube" const val vancedRootPkg = "com.google.android.youtube"
@ -40,7 +40,12 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
SpannableString("$tag: $message\n").apply { SpannableString("$tag: $message\n").apply {
setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 0, tag.length + 1, 0) setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 0, tag.length + 1, 0)
setSpan(StyleSpan(Typeface.BOLD), 0, tag.length + 1, 0) setSpan(StyleSpan(Typeface.BOLD), 0, tag.length + 1, 0)
setSpan(ForegroundColorSpan(Color.MAGENTA), tag.length + 2, tag.length + message.length + 2, 0) setSpan(
ForegroundColorSpan(Color.MAGENTA),
tag.length + 2,
tag.length + message.length + 2,
0
)
} }
) )
Log.d(tag, message) Log.d(tag, message)
@ -49,7 +54,8 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun sendRefresh(context: Context): Job { fun sendRefresh(context: Context): Job {
return launch { return launch {
delay(700) delay(700)
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(HomeFragment.REFRESH_HOME)) LocalBroadcastManager.getInstance(context)
.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
} }
} }
@ -57,7 +63,8 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
return launch { return launch {
delay(700) delay(700)
installing.postValue(false) installing.postValue(false)
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(AppDownloadDialog.CLOSE_DIALOG)) LocalBroadcastManager.getInstance(context)
.sendBroadcast(Intent(AppDownloadDialog.CLOSE_DIALOG))
} }
} }
@ -92,7 +99,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
private fun printableHexString(data: ByteArray): String { private fun printableHexString(data: ByteArray): String {
// Create Hex String // Create Hex String
val hexString: StringBuilder = StringBuilder() val hexString: StringBuilder = StringBuilder()
for (aMessageDigest:Byte in data) { for (aMessageDigest: Byte in data) {
var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt()) var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt())
while (h.length < 2) while (h.length < 2)
h = "0$h" h = "0$h"
@ -127,12 +134,9 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
status.contains("ModApk_Missing") -> context.getString(R.string.modapk_missing) status.contains("ModApk_Missing") -> context.getString(R.string.modapk_missing)
status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va) status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
status.contains("Path_Missing") -> context.getString(R.string.path_missing) status.contains("Path_Missing") -> context.getString(R.string.path_missing)
status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> { status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> context.getString(
if (context.isMiuiOptimizationsEnabled) R.string.installation_miui
context.getString(R.string.installation_miui) )
else
context.getString(R.string.installation_blocked)
}
else -> context.getString(R.string.installation_failed) else -> context.getString(R.string.installation_failed)
} }
} }

View File

@ -49,12 +49,20 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) {
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.isSuccessful) { if (response.isSuccessful) {
launch { launch {
if (response.body()?.let { writeFile(it, context.getExternalFilesDir(fileFolder)?.path + "/" + fileName) } == true) { if (response.body()?.let {
writeFile(
it,
context.getExternalFilesDir(fileFolder)?.path + "/" + fileName
)
} == true) {
onDownloadComplete() onDownloadComplete()
} else { } else {
onError("Could not save file") onError("Could not save file")
downloadProgress.postValue(0) downloadProgress.postValue(0)
log("VMDownloader", "Failed to save file: $url\n${response.errorBody()}") log(
"VMDownloader",
"Failed to save file: $url\n${response.errorBody()}"
)
} }
} }
} else { } else {
@ -111,33 +119,40 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun downloadManager(context: Context) { fun downloadManager(context: Context) {
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk" val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
download(url,"https://github.com/YTVanced/VancedManager/", "manager", "manager.apk", context, onDownloadComplete = { download(
val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk") url,
val uri = "https://github.com/YTVanced/VancedManager/",
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) "manager",
FileProvider.getUriForFile(context, "${context.packageName}.provider", apk) "manager.apk",
else context,
Uri.fromFile(apk) onDownloadComplete = {
val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk")
val uri =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
FileProvider.getUriForFile(context, "${context.packageName}.provider", apk)
else
Uri.fromFile(apk)
val intent = Intent(Intent.ACTION_VIEW) val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/vnd.android.package-archive") intent.setDataAndType(uri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
try { try {
context.startActivity(intent) context.startActivity(intent)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
log("VMDownloader", e.stackTraceToString()) log("VMDownloader", e.stackTraceToString())
} finally { } finally {
sendCloseDialog(context) sendCloseDialog(context)
} }
}, onError = { },
downloadingFile.postValue( onError = {
context.getString( downloadingFile.postValue(
R.string.error_downloading, context.getString(
"manager.apk" R.string.error_downloading,
"manager.apk"
)
) )
) })
})
} }
} }

View File

@ -17,9 +17,10 @@ import com.vanced.manager.R
import com.vanced.manager.utils.AppUtils.log import com.vanced.manager.utils.AppUtils.log
import java.util.* import java.util.*
fun RadioGroup.getCheckedButtonTag(): String? { val RadioGroup.checkedButtonTag: String?
return findViewById<MaterialRadioButton>(checkedRadioButtonId)?.tag?.toString() get() = findViewById<MaterialRadioButton>(
} checkedRadioButtonId
)?.tag?.toString()
fun DialogFragment.show(activity: FragmentActivity) { fun DialogFragment.show(activity: FragmentActivity) {
try { try {
@ -27,47 +28,43 @@ fun DialogFragment.show(activity: FragmentActivity) {
} catch (e: Exception) { } catch (e: Exception) {
log("VMUI", e.stackTraceToString()) log("VMUI", e.stackTraceToString())
} }
} }
fun List<String>.convertToAppVersions(): List<String> = listOf("latest") + reversed() fun List<String>.convertToAppVersions(): List<String> = listOf("latest") + reversed()
fun String.formatVersion(context: Context): String = if (this == "latest") context.getString(R.string.install_latest) else this fun String.formatVersion(context: Context): String =
if (this == "latest") context.getString(R.string.install_latest) else this
fun String.convertToAppTheme(context: Context): String { fun String.convertToAppTheme(context: Context): String = with(context) {
return with(context) { getString(
getString(R.string.light_plus_other, if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black)) R.string.light_plus_other,
} if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black)
)
} }
fun String.getLatestAppVersion(versions: List<String>): String = if (this == "latest") versions.reversed()[0] else this fun String.getLatestAppVersion(versions: List<String>): String =
if (this == "latest") versions.reversed()[0] else this
fun Context.lifecycleOwner(): LifecycleOwner? { val Context.lifecycleOwner: LifecycleOwner?
var curContext = this get() = when (this) {
var maxDepth = 20 is LifecycleOwner -> this
while (maxDepth-- > 0 && curContext !is LifecycleOwner) { !is LifecycleOwner -> (this as ContextWrapper).baseContext as LifecycleOwner
curContext = (curContext as ContextWrapper).baseContext else -> null
} }
return if (curContext is LifecycleOwner) {
curContext
} else {
null
}
}
fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this)
//Material team decided to keep their LinearProgressIndicator final //Material team decided to keep their LinearProgressIndicator final
//At least extension methods exist //At least extension methods exist
fun LinearProgressIndicator.applyAccent() { fun LinearProgressIndicator.applyAccent() {
with(accentColor.value ?: context.defPrefs.managerAccent) { with(accentColor.value!!) {
setIndicatorColor(this) setIndicatorColor(this)
trackColor = ColorUtils.setAlphaComponent(this, 70) trackColor = ColorUtils.setAlphaComponent(this, 70)
} }
} }
fun MaterialAlertDialogBuilder.applyAccent() { fun MaterialAlertDialogBuilder.showWithAccent() {
with(accentColor.value ?: context.defPrefs.managerAccent) { with(accentColor.value!!) {
show().apply { show().apply {
getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with) getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with)
getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with) getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with)
@ -86,5 +83,5 @@ fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) {
chcon u:object_r:apk_data_file:s0 $apkFPath chcon u:object_r:apk_data_file:s0 $apkFPath
mount -o bind $apkFPath $path mount -o bind $apkFPath $path
""".trimIndent() """.trimIndent()
SuFileOutputStream.open(shellFileZ).use { out -> out.write(script.toByteArray())} SuFileOutputStream.open(shellFileZ).use { out -> out.write(script.toByteArray()) }
} }

View File

@ -4,7 +4,11 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.core.content.edit import androidx.core.content.edit
val Context.installPrefs: SharedPreferences get() = getSharedPreferences("installPrefs", Context.MODE_PRIVATE) val Context.installPrefs: SharedPreferences
get() = getSharedPreferences(
"installPrefs",
Context.MODE_PRIVATE
)
var SharedPreferences.lang var SharedPreferences.lang
get() = getString("lang", getDefaultVancedLanguages()) get() = getString("lang", getDefaultVancedLanguages())

View File

@ -43,16 +43,23 @@ var baseInstallUrl = ""
fun openUrl(url: String, color: Int, context: Context) { fun openUrl(url: String, color: Int, context: Context) {
try { try {
val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true) val customTabPrefs =
getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
if (customTabPrefs) { if (customTabPrefs) {
val builder = CustomTabsIntent.Builder() val builder = CustomTabsIntent.Builder()
val params = CustomTabColorSchemeParams.Builder().setToolbarColor(ContextCompat.getColor(context, color)) val params = CustomTabColorSchemeParams.Builder()
.setToolbarColor(ContextCompat.getColor(context, color))
builder.setDefaultColorSchemeParams(params.build()) builder.setDefaultColorSchemeParams(params.build())
val customTabsIntent = builder.build() val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, url.toUri()) customTabsIntent.launchUrl(context, url.toUri())
} else } else
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) context.startActivity(
Intent(
Intent.ACTION_VIEW,
url.toUri()
).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show()
@ -103,7 +110,7 @@ suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) {
val versions = getJson("$baseInstallUrl/versions.json?$fetchTime") val versions = getJson("$baseInstallUrl/versions.json?$fetchTime")
isMicrogBroken = latest?.boolean("is_microg_broken") ?: false isMicrogBroken = latest?.boolean("is_microg_broken") ?: false
vanced.postValue(latest?.obj("vanced")) vanced.postValue(latest?.obj("vanced"))
vancedVersions.postValue(versions?.array("vanced") ) vancedVersions.postValue(versions?.array("vanced"))
music.postValue(latest?.obj("music")) music.postValue(latest?.obj("music"))
musicVersions.postValue(versions?.array("music")) musicVersions.postValue(versions?.array("music"))
microg.postValue(latest?.obj("microg")) microg.postValue(latest?.obj("microg"))
@ -137,4 +144,4 @@ fun checkSHA256(sha256: String, updateFile: File): Boolean {
} }
} }
const val baseUrl = "https://vancedapp.com/api/v1" const val baseUrl = "https://api.vancedapp.com/api/v1"

View File

@ -23,7 +23,10 @@ class LanguageContextWrapper(base: Context?) : ContextWrapper(base) {
val sysLocale = Resources.getSystem().configuration.locale val sysLocale = Resources.getSystem().configuration.locale
val locale = when { val locale = when {
pref == "System Default" -> Locale(sysLocale.language, sysLocale.country) pref == "System Default" -> Locale(sysLocale.language, sysLocale.country)
pref?.length!! > 2 -> Locale(pref.substring(0, pref.length - 3), pref.substring(pref.length - 2)) pref?.length!! > 2 -> Locale(
pref.substring(0, pref.length - 3),
pref.substring(pref.length - 2)
)
else -> Locale(pref) else -> Locale(pref)
} }
currentLocale = locale currentLocale = locale

View File

@ -34,7 +34,10 @@ fun getLanguageFormat(context: Context, language: String): String {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
fun getDefaultVancedLanguages(): String { fun getDefaultVancedLanguages(): String {
val serverLangs = vanced.value?.array("langs") ?: mutableListOf("") val serverLangs = vanced.value?.array("langs") ?: mutableListOf("")
val sysLocales = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(Resources.getSystem().configuration.locale.language) val sysLocales =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(
Resources.getSystem().configuration.locale.language
)
val finalLangs = mutableListOf<String>() val finalLangs = mutableListOf<String>()
sysLocales.forEach { sysLocale -> sysLocales.forEach { sysLocale ->
when { when {

View File

@ -5,4 +5,8 @@ import android.provider.Settings
private const val MIUI_OPTIMIZATION = "miui_optimization" private const val MIUI_OPTIMIZATION = "miui_optimization"
val Context.isMiuiOptimizationsEnabled: Boolean get() = Settings.Secure.getString(contentResolver, MIUI_OPTIMIZATION) == "1" val Context.isMiuiOptimizationsEnabled: Boolean
get() = Settings.Secure.getString(
contentResolver,
MIUI_OPTIMIZATION
) == "1"

View File

@ -22,14 +22,18 @@ import com.vanced.manager.utils.AppUtils.vancedRootPkg
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.* import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
import java.util.* import java.util.*
object PackageHelper { object PackageHelper {
const val apkInstallPath = "/data/adb" const val apkInstallPath = "/data/adb"
private const val INSTALLER_TAG = "VMInstall" private const val INSTALLER_TAG = "VMInstall"
private val vancedThemes = vanced.value?.array<String>("themes")?.value ?: listOf("black", "dark", "pink", "blue") private val vancedThemes =
vanced.value?.array<String>("themes")?.value ?: listOf("black", "dark", "pink", "blue")
init { init {
Shell.enableVerboseLogging = BuildConfig.DEBUG Shell.enableVerboseLogging = BuildConfig.DEBUG
@ -64,6 +68,7 @@ object PackageHelper {
else -> "" else -> ""
} }
} }
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean { fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
return try { return try {
packageManager.getPackageInfo(packageName, 0) packageManager.getPackageInfo(packageName, 0)
@ -81,7 +86,7 @@ object PackageHelper {
} }
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
fun getPkgVerCode(pkg: String, pm:PackageManager): Int? { fun getPkgVerCode(pkg: String, pm: PackageManager): Int? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
else else
@ -122,9 +127,15 @@ object PackageHelper {
if (files?.isNotEmpty() == true) { if (files?.isNotEmpty() == true) {
for (file in files) { for (file in files) {
when { when {
vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add("base") vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add(
file.name.matches(Regex("split_config\\.(..)\\.apk")) && !splitFiles.contains("lang") -> splitFiles.add("lang") "base"
(file.name.startsWith("split_config.arm") || file.name.startsWith("split_config.x86")) && !splitFiles.contains("arch") -> splitFiles.add("arch") )
file.name.matches(Regex("split_config\\.(..)\\.apk")) && !splitFiles.contains(
"lang"
) -> splitFiles.add("lang")
(file.name.startsWith("split_config.arm") || file.name.startsWith("split_config.x86")) && !splitFiles.contains(
"arch"
) -> splitFiles.add("arch")
} }
if (splitFiles.size == 3) { if (splitFiles.size == 3) {
@ -160,7 +171,8 @@ object PackageHelper {
val callbackIntent = Intent(context, AppInstallerService::class.java) val callbackIntent = Intent(context, AppInstallerService::class.java)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
val packageInstaller = context.packageManager.packageInstaller val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) val params =
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId: Int val sessionId: Int
var session: PackageInstaller.Session? = null var session: PackageInstaller.Session? = null
try { try {
@ -193,7 +205,7 @@ object PackageHelper {
//moving apk to tmp folder in order to avoid permission denials //moving apk to tmp folder in order to avoid permission denials
Shell.su("mv ${apk.path} $newPath").exec() Shell.su("mv ${apk.path} $newPath").exec()
val command = Shell.su("pm install $newPath").exec() val command = Shell.su("pm install -r $newPath").exec()
Shell.su("rm $newPath").exec() Shell.su("rm $newPath").exec()
if (command.isSuccess) { if (command.isSuccess) {
return true return true
@ -207,7 +219,13 @@ object PackageHelper {
return false return false
} }
private fun installRootApp(context: Context, app: String, appVerCode: Int?, pkg: String, modApkBool: (fileName: String) -> Boolean) = CoroutineScope(Dispatchers.IO).launch { private fun installRootApp(
context: Context,
app: String,
appVerCode: Int?,
pkg: String,
modApkBool: (fileName: String) -> Boolean
) = CoroutineScope(Dispatchers.IO).launch {
Shell.getShell { Shell.getShell {
val apkFilesPath = context.getExternalFilesDir("$app/root")?.path val apkFilesPath = context.getExternalFilesDir("$app/root")?.path
val files = File(apkFilesPath.toString()).listFiles()?.toList() val files = File(apkFilesPath.toString()).listFiles()?.toList()
@ -268,7 +286,8 @@ object PackageHelper {
val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString()) val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString())
var session: PackageInstaller.Session? = null var session: PackageInstaller.Session? = null
val sessionId: Int val sessionId: Int
val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) val sessionParams =
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val callbackIntent = Intent(context, AppInstallerService::class.java) val callbackIntent = Intent(context, AppInstallerService::class.java)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
try { try {
@ -296,10 +315,19 @@ object PackageHelper {
} }
} }
private fun installSplitApkFilesRoot(apkFiles: List<File>?, context: Context) : Boolean { private fun installSplitApkFilesRoot(apkFiles: List<File>?, context: Context): Boolean {
val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json") val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json")
log(INSTALLER_TAG, "installing split apk files: ${apkFiles?.map { it.name }}") log(INSTALLER_TAG, "installing split apk files: ${apkFiles?.map { it.name }}")
val sessionId = Shell.su("pm install-create").exec().out.joinToString(" ").filter { it.isDigit() }.toInt() val sessionId =
Shell.su("pm install-create -r").exec().out.joinToString(" ").filter { it.isDigit() }
.toIntOrNull()
if (sessionId == null) {
sendFailure("Session ID is null", context)
sendCloseDialog(context)
return false
}
apkFiles?.filter { !filenames.contains(it.name) }?.forEach { apkFile -> apkFiles?.filter { !filenames.contains(it.name) }?.forEach { apkFile ->
val apkName = apkFile.name val apkName = apkFile.name
log(INSTALLER_TAG, "installing APK: $apkName") log(INSTALLER_TAG, "installing APK: $apkName")
@ -353,12 +381,18 @@ object PackageHelper {
return false return false
} }
private fun setupScript(apkFPath: String, path: String, app: String, pkg: String, context: Context): Boolean private fun setupScript(
{ apkFPath: String,
path: String,
app: String,
pkg: String,
context: Context
): Boolean {
try { try {
log(INSTALLER_TAG, "Setting up script") log(INSTALLER_TAG, "Setting up script")
context.writeServiceDScript(apkFPath, path, app) context.writeServiceDScript(apkFPath, path, app)
Shell.su("""echo "#!/system/bin/sh\nwhile read line; do echo \${"$"}{line} | grep $pkg | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts" > /data/adb/post-fs-data.d/$app.sh""").exec() Shell.su("""echo "#!/system/bin/sh\nwhile read line; do echo \${"$"}{line} | grep $pkg | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts" > /data/adb/post-fs-data.d/$app.sh""")
.exec()
return Shell.su("chmod 744 /data/adb/service.d/$app.sh").exec().isSuccess return Shell.su("chmod 744 /data/adb/service.d/$app.sh").exec().isSuccess
} catch (e: IOException) { } catch (e: IOException) {
sendFailure(e.stackTraceToString(), context) sendFailure(e.stackTraceToString(), context)
@ -371,7 +405,8 @@ object PackageHelper {
private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean { private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean {
log(INSTALLER_TAG, "Linking app") log(INSTALLER_TAG, "Linking app")
Shell.su("am force-stop $pkg").exec() Shell.su("am force-stop $pkg").exec()
Shell.su("""for i in ${'$'}(ls /data/app/ | grep $pkg | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """).exec() Shell.su("""for i in ${'$'}(ls /data/app/ | grep $pkg | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """)
.exec()
val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec() val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec()
Thread.sleep(500) Thread.sleep(500)
Shell.su("am force-stop $pkg").exec() Shell.su("am force-stop $pkg").exec()
@ -383,12 +418,17 @@ object PackageHelper {
} }
//check version and perform action based on result //check version and perform action based on result
private fun checkVersion(versionCode: Int, baseApkFiles: List<File>, pkg: String, context: Context): Boolean { private fun checkVersion(
versionCode: Int,
baseApkFiles: List<File>,
pkg: String,
context: Context
): Boolean {
log(INSTALLER_TAG, "Checking stock version") log(INSTALLER_TAG, "Checking stock version")
val path = getPackageDir(context, pkg) val path = getPackageDir(context, pkg)
if (path != null) { if (path != null) {
if (path.contains("/data/app/")) { if (path.contains("/data/app/")) {
when (getVersionNumber(pkg, context)?.let { compareVersion(it,versionCode) } ) { when (getVersionNumber(pkg, context)?.let { compareVersion(it, versionCode) }) {
1 -> return fixHigherVer(baseApkFiles, pkg, context) 1 -> return fixHigherVer(baseApkFiles, pkg, context)
-1 -> return installStock(baseApkFiles, pkg, context) -1 -> return installStock(baseApkFiles, pkg, context)
} }
@ -402,7 +442,7 @@ object PackageHelper {
private fun getPkgInfo(pkg: String, context: Context): PackageInfo? { private fun getPkgInfo(pkg: String, context: Context): PackageInfo? {
return try { return try {
context.packageManager.getPackageInfo(pkg, 0) context.packageManager.getPackageInfo(pkg, 0)
} catch (e:Exception) { } catch (e: Exception) {
log(INSTALLER_TAG, "Unable to get package info") log(INSTALLER_TAG, "Unable to get package info")
null null
} }
@ -417,10 +457,13 @@ object PackageHelper {
} }
//uninstall current update and install base that works with patch //uninstall current update and install base that works with patch
private fun fixHigherVer(apkFiles: List<File>, pkg: String, context: Context) : Boolean { private fun fixHigherVer(apkFiles: List<File>, pkg: String, context: Context): Boolean {
log(INSTALLER_TAG, "Downgrading stock") log(INSTALLER_TAG, "Downgrading stock")
if (uninstallRootApk(pkg)) { if (uninstallRootApk(pkg)) {
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(apkFiles, context) else installRootMusic(apkFiles, context) return if (pkg == vancedRootPkg) installSplitApkFilesRoot(
apkFiles,
context
) else installRootMusic(apkFiles, context)
} }
sendFailure(listOf("Failed_Uninstall").toMutableList(), context) sendFailure(listOf("Failed_Uninstall").toMutableList(), context)
sendCloseDialog(context) sendCloseDialog(context)
@ -430,7 +473,10 @@ object PackageHelper {
//install stock youtube matching vanced version //install stock youtube matching vanced version
private fun installStock(baseApkFiles: List<File>, pkg: String, context: Context): Boolean { private fun installStock(baseApkFiles: List<File>, pkg: String, context: Context): Boolean {
log(INSTALLER_TAG, "Installing stock") log(INSTALLER_TAG, "Installing stock")
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(baseApkFiles, context) else installRootMusic(baseApkFiles, context) return if (pkg == vancedRootPkg) installSplitApkFilesRoot(
baseApkFiles,
context
) else installRootMusic(baseApkFiles, context)
} }
//set chcon to apk_data_file //set chcon to apk_data_file
@ -448,20 +494,20 @@ object PackageHelper {
} }
//move patch to data/app //move patch to data/app
private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context) : Boolean { private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context): Boolean {
log(INSTALLER_TAG, "Moving app") log(INSTALLER_TAG, "Moving app")
val apkinF = SuFile.open(apkFile) val apkinF = SuFile.open(apkFile)
val apkoutF = SuFile.open(path) val apkoutF = SuFile.open(path)
if(apkinF.exists()) { if (apkinF.exists()) {
try { try {
Shell.su("am force-stop $pkg").exec() Shell.su("am force-stop $pkg").exec()
//Shell.su("rm -r SuFile.open(path).parent") //Shell.su("rm -r SuFile.open(path).parent")
copy(apkinF,apkoutF) copy(apkinF, apkoutF)
Shell.su("chmod 644 $path").exec().isSuccess Shell.su("chmod 644 $path").exec().isSuccess
return if(Shell.su("chown system:system $path").exec().isSuccess) { return if (Shell.su("chown system:system $path").exec().isSuccess) {
true true
} else { } else {
sendFailure(listOf("Chown_Fail").toMutableList(), context) sendFailure(listOf("Chown_Fail").toMutableList(), context)
@ -469,9 +515,7 @@ object PackageHelper {
false false
} }
} } catch (e: IOException) {
catch (e: IOException)
{
sendFailure(listOf("${e.message}").toMutableList(), context) sendFailure(listOf("${e.message}").toMutableList(), context)
sendCloseDialog(context) sendCloseDialog(context)
log(INSTALLER_TAG, e.stackTraceToString()) log(INSTALLER_TAG, e.stackTraceToString())
@ -494,13 +538,14 @@ object PackageHelper {
private fun getVersionNumber(pkg: String, context: Context): Int? { private fun getVersionNumber(pkg: String, context: Context): Int? {
try { try {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and(0xFFFFFFFF).toInt() context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and(
0xFFFFFFFF
).toInt()
else else
context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode
} } catch (e: Exception) {
catch (e : Exception) {
val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec() val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec()
if(execRes.isSuccess) { if (execRes.isSuccess) {
val result = execRes.out val result = execRes.out
var version = 0 var version = 0
result result
@ -524,9 +569,8 @@ object PackageHelper {
val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec() val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec()
if (execRes.isSuccess) { if (execRes.isSuccess) {
val result = execRes.out val result = execRes.out
for (line in result) for (line in result) {
{ if (line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
if(line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
} }
} }
null null
@ -538,7 +582,8 @@ object PackageHelper {
try { try {
log(INSTALLER_TAG, "Setting installer package to $installer for $target") log(INSTALLER_TAG, "Setting installer package to $installer for $target")
val installerUid = context.packageManager.getPackageUid(installer, 0) val installerUid = context.packageManager.getPackageUid(installer, 0)
val res = Shell.su("""su $installerUid -c 'pm set-installer $target $installer'""").exec() val res =
Shell.su("""su $installerUid -c 'pm set-installer $target $installer'""").exec()
if (res.out.any { line -> line.contains("Success") }) { if (res.out.any { line -> line.contains("Success") }) {
log(INSTALLER_TAG, "Installer package successfully set") log(INSTALLER_TAG, "Installer package successfully set")
return return

View File

@ -7,15 +7,15 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
val Context.defPrefs: SharedPreferences get() = getDefaultSharedPreferences(this) val Context.defPrefs: SharedPreferences get() = getDefaultSharedPreferences(this)
var SharedPreferences.managerTheme var SharedPreferences.managerTheme
get() = getString("manager_theme", "System Default") get() = getString("manager_theme", "System Default")
set(value) = edit { putString("manager_theme", value) } set(value) = edit { putString("manager_theme", value) }
var SharedPreferences.managerAccent var SharedPreferences.managerAccent
get() = getInt("manager_accent_color", defAccentColor) get() = getInt("manager_accent_color", defAccentColor)
set(value) = edit { putInt("manager_accent_color", value) } set(value) = edit { putInt("manager_accent_color", value) }
var SharedPreferences.managerVariant var SharedPreferences.managerVariant
get() = getString("vanced_variant", "nonroot") get() = getString("vanced_variant", "nonroot")
set(value) = edit { putString("vanced_variant", value) } set(value) = edit { putString("vanced_variant", value) }
@ -23,11 +23,11 @@ var SharedPreferences.managerLang
get() = getString("manager_lang", "System Default") get() = getString("manager_lang", "System Default")
set(value) = edit { putString("manager_lang", value) } set(value) = edit { putString("manager_lang", value) }
var SharedPreferences.installUrl var SharedPreferences.installUrl
get() = getString("install_url", baseUrl) get() = getString("install_url", baseUrl)
set(value) = edit { putString("install_url", value) } set(value) = edit { putString("install_url", value) }
var SharedPreferences.vancedVersion var SharedPreferences.vancedVersion
get() = getString("vanced_version", "latest") get() = getString("vanced_version", "latest")
set(value) = edit { putString("vanced_version", value) } set(value) = edit { putString("vanced_version", value) }

View File

@ -11,7 +11,7 @@ const val LIGHT = "Light"
const val DARK = "Dark" const val DARK = "Dark"
const val SYSTEM_DEFAULT = "System Default" const val SYSTEM_DEFAULT = "System Default"
val mutableAccentColor = MutableLiveData<Int>() val mutableAccentColor = MutableLiveData(defAccentColor)
val accentColor: LiveData<Int> = mutableAccentColor val accentColor: LiveData<Int> = mutableAccentColor
var currentTheme = "" var currentTheme = ""

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="48dp"
android:height="48dp" />
<solid
android:color="?colorSurface" />
<corners
android:radius="12dp" />
</shape>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M5,20h14v-2H5V20zM19,9h-4V3H9v6H5l7,7L19,9z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,6v3l4,-4 -4,-4v3c-4.42,0 -8,3.58 -8,8 0,1.57 0.46,3.03 1.24,4.26L6.7,14.8c-0.45,-0.83 -0.7,-1.79 -0.7,-2.8 0,-3.31 2.69,-6 6,-6zM18.76,7.74L17.3,9.2c0.44,0.84 0.7,1.79 0.7,2.8 0,3.31 -2.69,6 -6,6v-3l-4,4 4,4v-3c4.42,0 8,-3.58 8,-8 0,-1.57 -0.46,-3.03 -1.24,-4.26z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8.46,11.88l1.41,-1.41L12,12.59l2.12,-2.12 1.41,1.41L13.41,14l2.12,2.12 -1.41,1.41L12,15.41l-2.12,2.12 -1.41,-1.41L10.59,14l-2.13,-2.12zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M9,16h6v-6h4l-7,-7 -7,7h4zM5,18h14v2L5,20z"/>
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="25dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>

View File

@ -1,43 +1,33 @@
<vector android:height="64dp" android:viewportHeight="2000" <vector android:height="64.15012dp" android:viewportHeight="1837.5"
android:viewportWidth="2000" android:width="64dp" android:viewportWidth="1833.2" android:width="64dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?colorSettingsTitle" android:pathData="M1388.1,1415.4L1388.1,1415.4c-91.4,84.5 -216.9,133.3 -365.8,133.3c-208.7,0 -399.6,-117.6 -493.3,-304.1c-78.3,-156 -78.3,-339.8 0,-495.7c93.7,-186.6 284.6,-304.3 493.3,-304.3c137.1,-1.6 269.6,49.9 369.4,143.6L1234,745.9c-57,-54.4 -133.1,-84 -211.8,-82.8c-144,0 -266.3,97.2 -309.9,228c-23.1,68.6 -23.1,142.8 0,211.4h0.2c43.8,130.6 165.9,227.8 309.9,227.8c74.4,0 138.2,-19 187.6,-52.6v-0.1c58.2,-38.5 98,-99.2 110.3,-167.7h-298.2V897.2H1543c6.5,36.9 9.5,74.6 9.5,112.2C1552.5,1177.2 1492.5,1319.2 1388.1,1415.4z"/> <path android:fillColor="#171719" android:pathData="M1806.6,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.5,99.7 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.3,705.9 1806.6,588.1z"/>
<path android:fillColor="#953A9A" android:pathData="M1293.9,595.9m-14.5,0a14.5,14.5 0,1 1,29 0a14.5,14.5 0,1 1,-29 0"/> <path android:fillColor="#FFFFFF" android:pathData="M1298.6,1334.2L1298.6,1334.2c-91.4,84.5 -216.9,133.3 -365.8,133.3c-304.9,0 -552,-247.2 -552,-552s247.2,-552.1 552,-552.1c137.1,-1.6 269.4,49.8 369.4,143.6l-157.7,157.7c-57,-54.3 -133.1,-84.1 -211.8,-82.8c-144,0 -266.3,97.2 -309.9,228c-23.1,68.6 -23.1,142.8 0,211.4h0.2c43.8,130.6 165.9,227.8 309.9,227.8c74.4,0 138.2,-19 187.6,-52.6v-0.1c58.1,-38.5 98,-99.1 110.3,-167.7H932.6V816h520.9c6.4,37.1 9.6,74.6 9.5,112.2C1463,1096 1403,1238 1298.6,1334.2z"/>
<path android:pathData="M1256.2,582.2c-2.7,0 -5.3,-0.7 -7.8,-2.3c-54.3,-34.7 -120.6,-56.3 -186.8,-61c-7.9,-0.6 -13.9,-7.5 -13.4,-15.4c0.6,-7.9 7.4,-13.9 15.4,-13.4c70.9,5 142,28.2 200.3,65.4c6.7,4.3 8.7,13.2 4.4,19.9C1265.6,579.8 1261,582.2 1256.2,582.2z"> <path android:fillColor="#953A9A" android:pathData="M1204.4,514.7m-14.5,0a14.5,14.5 0,1 1,29 0a14.5,14.5 0,1 1,-29 0"/>
<path android:pathData="M1166.7,501c-2.8,0 -5.5,-0.8 -7.8,-2.3c-54.3,-34.7 -120.6,-56.3 -186.8,-61c-8,-0.6 -14,-7.4 -13.4,-15.4c0.6,-8 7.4,-14 15.4,-13.4c70.9,5 142,28.2 200.3,65.4c6.7,4.3 8.7,13.2 4.4,19.9c0,0 0,0 0,0C1176.2,498.5 1171.7,501.1 1166.7,501z">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
<gradient android:endX="1048.1708" android:endY="536.1355" <gradient android:endX="958.6746" android:endY="454.97253"
android:startX="1270.5692" android:startY="536.1355" android:type="linear"> android:startX="1181.0735" android:startY="454.97253" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/> <item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/> <item android:color="#FFFF0032" android:offset="1"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path android:pathData="M663.5,709.5L663.5,709.5L663.5,709.5l-8,10.6l-3.9,5.3l-3.7,5.5c-2.4,3.7 -4.9,7.3 -7.3,11l-6.8,11.3c-1.1,1.9 -2.3,3.8 -3.4,5.7l-3.1,5.8c-2.1,3.9 -4.2,7.8 -6.2,11.7l-5.6,11.9c-0.9,2 -1.9,4 -2.8,6l-2.5,6.1l-5,12.2l-4.4,12.4l-2.2,6.2l-1.9,6.3l-3.8,12.6c-4.5,17 -8.6,34 -11.1,51.4l-1,6.5c-0.3,2.2 -0.7,4.3 -0.9,6.5l-1.5,13.1c-0.2,2.2 -0.5,4.3 -0.7,6.5l-0.4,6.6l-0.9,13.1l-0.1,1.6v1.6l-0.1,3.3l-0.2,6.6l-0.2,6.6c0,2.2 -0.1,4.4 -0.1,6.6l0.3,13.1l0.1,6.6c0.1,2.2 0.3,4.4 0.4,6.6c0.8,17.5 2.6,34.8 5.3,52l2.2,12.9l2.7,12.8c0.2,1.1 0.4,2.1 0.7,3.2l0.8,3.2l1.6,6.3c0.5,2.1 1,4.2 1.6,6.3l1.8,6.3c9.3,33.5 22.7,65.8 39.2,96.2c8.3,15.2 17.6,29.8 27.5,43.9c10,14.1 20.7,27.7 32.2,40.5c46,51.5 103.7,91.8 167.1,117.4l0,0c7.7,3.1 11.4,11.8 8.3,19.5s-11.8,11.4 -19.5,8.3c-0.1,-0.1 -0.3,-0.1 -0.5,-0.2c-66.6,-29.7 -126.2,-74.6 -172.5,-130.3c-11.7,-13.8 -22.3,-28.5 -32.3,-43.6c-9.9,-15.1 -19,-30.7 -27.1,-46.8c-16.1,-32.2 -28.8,-66.2 -37.2,-101.1l-1.6,-6.5c-0.5,-2.2 -0.9,-4.4 -1.4,-6.6l-1.4,-6.6l-0.7,-3.3c-0.2,-1.1 -0.4,-2.2 -0.6,-3.3l-2.3,-13.3l-1.8,-13.3c-2.2,-17.8 -3.4,-35.7 -3.6,-53.5c0,-2.2 -0.1,-4.5 -0.2,-6.7l0.1,-6.7l0.2,-13.4c0,-2.2 0.2,-4.5 0.3,-6.7l0.4,-6.7l0.4,-6.7l0.2,-3.3l0.1,-1.7l0.2,-1.7l1.4,-13.3l0.7,-6.6c0.3,-2.2 0.6,-4.4 1,-6.6l2,-13.2c0.3,-2.2 0.8,-4.4 1.2,-6.6l1.3,-6.6C587.3,830.2 618.1,763.6 663.5,709.5L663.5,709.5L663.5,709.5z"> <path android:pathData="M574,628.3L574,628.3l-8,10.6l-3.9,5.3l-3.7,5.5c-2.4,3.7 -4.9,7.3 -7.3,11l-6.8,11.3c-1.1,1.9 -2.3,3.8 -3.4,5.7l-3.1,5.8c-2.1,3.9 -4.2,7.8 -6.2,11.7l-5.6,11.9c-0.9,2 -1.9,4 -2.8,6l-2.5,6.1l-5,12.2l-4.4,12.4l-2.2,6.2l-1.9,6.3l-3.8,12.6c-4.5,17 -8.6,34 -11.1,51.4l-1,6.5c-0.3,2.2 -0.7,4.3 -0.9,6.5l-1.5,13.1c-0.2,2.2 -0.5,4.3 -0.7,6.5l-0.4,6.6l-0.9,13.1l-0.1,1.6v1.6l-0.1,3.3l-0.2,6.6l-0.2,6.6c0,2.2 -0.1,4.4 -0.1,6.6l0.3,13.1l0.1,6.6c0.1,2.2 0.3,4.4 0.4,6.6c0.8,17.4 2.6,34.8 5.3,52l2.2,12.9l2.7,12.8c0.2,1.1 0.4,2.1 0.7,3.2l0.8,3.2l1.6,6.3c0.5,2.1 1,4.2 1.6,6.3l1.8,6.3c14,50.2 36.5,97.6 66.7,140.1c49.9,70.7 119.1,125.5 199.3,157.9l0,0c7.8,2.8 11.9,11.3 9.2,19.1c-2.8,7.8 -11.3,11.9 -19.1,9.2c-0.4,-0.1 -0.8,-0.3 -1.2,-0.5c-0.1,-0.1 -0.3,-0.1 -0.5,-0.2c-66.7,-29.7 -125.7,-74.3 -172.5,-130.3c-11.6,-13.9 -22.4,-28.4 -32.3,-43.6c-29.8,-45.2 -51.5,-95.3 -64.3,-147.9l-1.6,-6.5c-0.5,-2.2 -0.9,-4.4 -1.4,-6.6l-1.4,-6.6l-0.7,-3.3l-0.6,-3.3l-2.3,-13.3l-1.8,-13.3c-2.2,-17.8 -3.4,-35.6 -3.6,-53.5c0,-2.2 -0.1,-4.5 -0.2,-6.7l0.1,-6.7l0.2,-13.4c0,-2.2 0.2,-4.5 0.3,-6.7l0.4,-6.7l0.4,-6.7l0.2,-3.3l0.1,-1.7l0.2,-1.7l1.4,-13.3l0.7,-6.6c0.3,-2.2 0.6,-4.4 1,-6.6l2,-13.2c0.3,-2.2 0.8,-4.4 1.2,-6.6l1.3,-6.6C497.8,749 528.6,682.4 574,628.3L574,628.3z">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
<gradient android:endX="555.1798" android:endY="1071.7072" <gradient android:endX="465.6893" android:endY="990.6765"
android:startX="870.6317" android:startY="1073.554" android:type="linear"> android:startX="781.1393" android:startY="992.51654" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/> <item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/> <item android:color="#FFFF0032" android:offset="1"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path android:fillColor="#00000000" <path android:fillColor="#953A9A" android:pathData="M823.1,1363.4m-16.5,0a16.5,16.5 0,1 1,33 0a16.5,16.5 0,1 1,-33 0"/>
android:pathData="M1332.5,1204.5" android:strokeLineCap="round" <path android:pathData="M1453.5,816c-27.8,20 -57.3,51 -65.9,76.6c-6.5,18 -17.4,29.8 -28.3,30.3c-9.6,0 -23,-12.8 -28.4,-30.9c-8.6,-23.9 -23.1,-50.6 -50,-76L1453.5,816zM1353.1,957.8c1.3,6.7 7.3,9.9 14,8.6s11.7,-6.6 10.4,-13.4s-14.1,-17.6 -14.1,-17.6S1351.7,951 1353.1,957.8z">
android:strokeLineJoin="round" android:strokeWidth="29">
<aapt:attr name="android:strokeColor">
<gradient android:endX="1332.5" android:endY="1204.5"
android:startX="1332.5" android:startY="1204.5" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path android:fillColor="#953A9A" android:pathData="M912.6,1444.6m-16.5,0a16.5,16.5 0,1 1,33 0a16.5,16.5 0,1 1,-33 0"/>
<path android:pathData="M1543,897.2c-27.8,20 -57.3,51 -65.9,76.6c-6.5,18 -17.4,29.8 -28.3,30.3c-9.6,0 -23,-12.8 -28.4,-30.9c-8.6,-23.9 -23.1,-50.6 -50,-76L1543,897.2L1543,897.2zM1442.6,1039c1.3,6.7 7.3,9.9 14,8.6s11.7,-6.6 10.4,-13.4c-1.3,-6.7 -14.1,-17.6 -14.1,-17.6S1441.2,1032.2 1442.6,1039z">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
<gradient android:endX="1456.7" android:endY="1047.8848" <gradient android:endX="1367.21" android:endY="966.72473"
android:startX="1456.7" android:startY="897.2" android:type="linear"> android:startX="1367.21" android:startY="816.04004" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/> <item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/> <item android:color="#FFFF0032" android:offset="1"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>

View File

@ -1,27 +1,42 @@
<vector android:height="63dp" <vector android:height="64.15012dp" android:viewportHeight="1837.5"
android:viewportHeight="2000" android:viewportWidth="1833.2" android:width="64dp"
android:viewportWidth="2000"
android:width="63dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#0C0C0F" android:pathData="M1000,1000m-900,0a900,900 0,1 1,1800 0a900,900 0,1 1,-1800 0"/> <path android:fillColor="#171719" android:pathData="M1806.5,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.4,99.8 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.2,705.9 1806.5,588.1z"/>
<path android:fillColor="#FFFFFF" android:pathData="M1297.99,934.95L913.69,687c-16.68,-9.72 -38.08,-4.08 -47.8,12.59l-0.75,1.28c-9.72,16.67 -4.09,38.07 12.59,47.79l367.49,221.11c23.91,14.39 23.77,49.1 -0.25,63.29l-369.18,218.11c-16.76,9.58 -22.58,30.93 -13,47.69l0.73,1.29c9.58,16.76 30.93,22.57 47.69,12.99l386.24,-244.83C1346.25,1037.38 1346.54,966.28 1297.99,934.95z"/> <path android:fillColor="#FFFFFF" android:pathData="M1526,918.6c0.1,70.4 -11.9,140.2 -35.4,206.5c-84.9,238 -312.2,408.4 -579.3,408.4c-339.6,0 -614.9,-275.3 -614.9,-614.9s275.2,-614.9 614.8,-614.9c284.2,0 523.3,192.8 593.8,454.6c11.9,43.9 18.8,89 20.6,134.4C1525.8,901.4 1526,910 1526,918.6z"/>
<path android:pathData="M1101.77,966.16L912.55,859.57c-24.49,-13.8 -54.77,3.9 -54.77,32v213.18c0,28.11 30.28,45.8 54.77,32l189.22,-106.59C1126.71,1016.12 1126.71,980.21 1101.77,966.16z"> <path android:pathData="M1083.5,881.2L844.2,743c-29.2,-16.8 -65.9,4.3 -65.9,38v276.3c0,33.9 36.7,55 65.9,38l239.3,-138.2C1112.8,940.4 1112.8,898 1083.5,881.2z">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
<gradient android:endX="1035.8003" android:endY="898.2145" <gradient android:endX="998.231" android:endY="793.7089"
android:startX="835.8939" android:startY="1098.121" android:type="linear"> android:startX="747.3128" android:startY="1044.6271" android:type="linear">
<item android:color="#FF2E73FF" android:offset="0"/> <item android:color="#FF2E73FF" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/> <item android:color="#FFFF0032" android:offset="1"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path android:fillColor="#00000000" <path android:fillColor="#FFFFFF" android:pathData="M1038,894.9c-1.1,0 -2.2,-0.3 -3.1,-0.9L986.3,866c-2.9,-1.9 -3.7,-5.8 -1.9,-8.7c1.7,-2.7 5.2,-3.6 8.1,-2.2l48.5,28.1c3,1.7 4.1,5.5 2.4,8.5c0,0 0,0 0,0C1042.4,893.7 1040.3,894.9 1038,894.9L1038,894.9z"/>
android:pathData="M1000,1000m-650,0a650,650 0,1 1,1300 0a650,650 0,1 1,-1300 0" android:strokeWidth="71"> <path android:fillColor="#FFFFFF" android:pathData="M1058.6,899.9m-8.5,0a8.5,8.5 0,1 1,17 0a8.5,8.5 0,1 1,-17 0"/>
<aapt:attr name="android:strokeColor"> <path android:pathData="M1604.1,822.3l-99.1,-64c11.8,43.9 18.7,89 20.5,134.4c25.1,25.5 24,67.9 -3,92c-3.2,2.8 -6.7,5.4 -10.4,7.6l-9.6,5.7l-611.7,361.4l-18.6,11.1c-29,16.6 -39.2,53.5 -22.6,82.6c0,0 0,0.1 0.1,0.1l1.3,2.3c16.6,29 53.5,39.2 82.6,22.6c0.1,0 0.1,0 0.1,-0.1l193,-122.3l363.7,-230.5l4.9,-3.1l107.8,-68.4C1687.7,999.9 1688.3,876.6 1604.1,822.3z">
<gradient android:endX="1484.7217" android:endY="515.2783" <aapt:attr name="android:fillColor">
android:startX="515.2783" android:startY="1484.7217" android:type="linear"> <gradient android:endX="1618.3806" android:endY="832.1469"
android:startX="921.5201" android:startY="1529.0074" android:type="linear">
<item android:color="#FF2E73FF" android:offset="0"/> <item android:color="#FF2E73FF" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/> <item android:color="#FFFF0032" android:offset="1"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path android:fillColor="#953A9A" android:pathData="M1319.9,567.3m-16.6,0a16.6,16.6 0,1 1,33.2 0a16.6,16.6 0,1 1,-33.2 0"/>
<path android:pathData="M409,1114.5c-44.8,-111.5 -50.7,-238.6 -16.3,-354.5c8.6,-29 19.6,-57.2 32.9,-84.4c6.6,-13.5 13.9,-26.9 21.7,-39.9s16.2,-25.6 25,-37.9s18.2,-24.2 28,-35.8s20.1,-22.6 30.9,-33.3s22,-20.9 33.6,-30.7s23.7,-19 36.1,-27.7s25.2,-17 38.3,-24.8s26.6,-14.9 40.3,-21.4s27.7,-12.7 41.9,-18s28.8,-10.2 43.3,-14.4c3.7,-1 7.4,-2.1 11.1,-3l11.1,-2.8l11.2,-2.5l2.8,-0.7l2.8,-0.6l5.6,-1.1c15,-2.9 30.1,-5.3 45.2,-7c30.4,-3.4 61,-4.2 91.5,-2.5c61.3,3.3 121.6,16.9 178.3,40.2c56.9,23.5 109.5,56.3 155.6,97c5.3,4.7 5.8,12.8 1.1,18.1c-4.7,5.3 -12.8,5.8 -18.1,1.1l-0.1,-0.1l-0.1,-0.1c-87.5,-80.3 -199.6,-128.6 -318,-137.1c-29.5,-2.1 -59,-1.8 -88.5,0.9c-14.7,1.4 -29.3,3.4 -43.9,6l-5.5,1l-2.8,0.5l-2.7,0.6l-10.9,2.2l-10.8,2.6c-3.6,0.9 -7.2,1.9 -10.7,2.7c-14.3,3.8 -28.4,8.2 -42.4,13.2s-27.6,10.6 -41.2,16.8s-26.7,12.9 -39.6,20.2s-25.5,15.1 -37.7,23.5s-24.2,17.2 -35.8,26.5c-11.5,9.3 -22.7,19.2 -33.4,29.5s-21.1,21 -30.9,32.2c-9.8,11.2 -19.2,22.7 -28.1,34.6s-17.3,24.2 -25.3,36.9s-15.1,25.7 -21.9,39c-13.6,26.6 -25,54.2 -34,82.7C362.7,875.8 366.1,1002.2 409,1114.5z">
<aapt:attr name="android:fillColor">
<gradient android:endX="513.1837" android:endY="1189.3452"
android:startX="1005.7236" android:startY="336.2454" android:type="linear">
<item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FF9C3693" android:offset="0.02"/>
<item android:color="#FFBB2575" android:offset="0.12"/>
<item android:color="#FFD4185C" android:offset="0.23"/>
<item android:color="#FFE70D49" android:offset="0.35"/>
<item android:color="#FFF5063C" android:offset="0.49"/>
<item android:color="#FFFD0134" android:offset="0.67"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
</vector> </vector>

View File

@ -1,41 +1,46 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector android:height="64.15012dp" android:viewportHeight="1837.5"
xmlns:aapt="http://schemas.android.com/aapt" android:viewportWidth="1833.2" android:width="64dp"
android:width="73.36dp" xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
android:height="56dp" <path android:fillColor="#171719" android:pathData="M1806.5,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.4,99.8 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.2,705.9 1806.5,588.1z"/>
android:viewportWidth="506.854" <path android:fillColor="#FFFFFF" android:pathData="M1563.9,918.3c0,0 0,35.3 -1.6,84.2c-1.3,38.7 -3.6,86 -7.8,130.9c-3.9,42 -9.4,82.1 -17.2,111.3c-14.6,55.1 -57.7,98.4 -112.4,113.2c-45.8,12.4 -155.4,19 -260,22.6c-121.8,4.2 -236.9,4.2 -236.9,4.2s-4.4,0 -12.4,0c-67.9,-0.3 -395.8,-2.8 -484.5,-26.7c-54.7,-14.7 -97.8,-58.1 -112.4,-113.2c-26.6,-99.8 -26.6,-326.4 -26.6,-326.4s0,-224.9 26.6,-324.7c14.6,-55.1 57.7,-98.4 112.4,-113.2c77.3,-20.8 335.9,-25.4 446.3,-26.5c31.2,-0.3 50.6,-0.3 50.6,-0.3s83.1,0 182.8,2.6c14,0.4 28.4,0.8 42.9,1.2c1.5,0 3,0.1 4.4,0.1c9.6,0.3 19.3,0.7 29,1c20.3,0.8 40.6,1.7 60.3,2.7c50.8,2.7 98.4,6.3 134.3,11.1c0.7,0.1 1.4,0.2 2,0.3c1.6,0.2 3.1,0.4 4.7,0.7c6.7,1 12.9,2 18.6,3c6.7,1.2 12.7,2.6 17.9,4c54.7,14.7 97.8,58.1 112.4,113.2c10.2,38.5 16.5,95.5 20.4,151.1c3.4,49.2 5,97.2 5.6,130.2C1563.9,901.5 1563.9,918.3 1563.9,918.3z"/>
android:viewportHeight="385.268"> <path android:pathData="M1074.6,886.3l-207,-119.5c-25.3,-14.6 -57,3.7 -57,32.9v239c0,29.3 31.7,47.5 57,32.9l207,-119.5C1099.9,937.5 1099.9,900.9 1074.6,886.3z">
<path <aapt:attr name="android:fillColor">
android:fillColor="#FF000000" <gradient android:endX="1000.8886" android:endY="810.7363"
android:pathData="M65.934,26.129l-33,29c0,0 -30,148 -17,212s18,97 91,99s324,0 324,0s80.265,-33.664 59,-261.959C474.934,-56.871 65.934,26.129 65.934,26.129z"/> android:startX="783.8582" android:startY="1027.7668" android:type="linear">
<path <item android:color="#FF2E73FF" android:offset="4.795011E-7"/>
android:pathData="M496.496,69.709c-7.661,-28.84 -30.24,-51.548 -58.94,-59.265c-6.213,-1.68 -25.124,-6.773 -108.001,-9.24C289.744,0.014 253.792,0 253.434,0s-36.311,0.014 -76.124,1.204c-82.879,2.478 -101.785,7.577 -107.98,9.24C40.635,18.164 18.03,40.87 10.375,69.709C0.294,107.577 0,183.781 0,192.349c0,8.625 0.28,85.365 10.36,123.214c7.658,28.842 30.24,51.549 58.94,59.266c6.213,1.68 25.125,6.773 107.999,9.238c39.824,1.199 75.774,1.199 76.135,1.199s36.312,0 76.121,-1.203c82.88,-2.479 101.788,-7.574 107.987,-9.238c28.703,-7.725 51.296,-30.432 58.951,-59.25c10.078,-37.871 10.358,-114.609 10.358,-123.235C506.867,183.767 506.576,107.562 496.496,69.709zM470.714,308.698c-5.217,19.637 -20.583,35.098 -40.095,40.348c-35.362,9.537 -177.174,9.537 -177.174,9.537s-141.809,0 -177.172,-9.537c-19.51,-5.25 -34.877,-20.721 -40.093,-40.348c-9.475,-35.588 -9.475,-116.366 -9.475,-116.366s0,-80.185 9.475,-115.771c5.216,-19.636 20.583,-35.101 40.093,-40.348c35.351,-9.537 177.159,-9.537 177.159,-9.537s141.809,0 177.173,9.537c19.511,5.248 34.877,20.72 40.093,40.348c9.478,35.588 9.478,115.771 9.478,115.771S480.175,273.11 470.714,308.698z"> <item android:color="#FFFF0032" android:offset="1"/>
<aapt:attr name="android:fillColor"> </gradient>
<gradient </aapt:attr>
android:startY="383.625" </path>
android:startX="62.4463" <path android:fillColor="#FFFFFF" android:pathData="M1035.2,898.2c-0.9,0 -1.8,-0.2 -2.7,-0.7l-42,-24.3c-2.6,-1.5 -3.5,-4.8 -2,-7.4c1.5,-2.6 4.8,-3.5 7.4,-2l42,24.3c2.6,1.5 3.5,4.8 2,7.4C1038.9,897.2 1037.1,898.2 1035.2,898.2z"/>
android:endY="1.6556" <path android:fillColor="#FFFFFF" android:pathData="M1051.4,900.9m-5.8,0a5.8,5.8 0,1 1,11.6 0a5.8,5.8 0,1 1,-11.6 0"/>
android:endX="444.4157" <path android:pathData="M1468.1,680.3c-5.6,0 -10.6,-3.9 -11.9,-9.5c-0.9,-3.9 -1.8,-7.5 -2.7,-11c-10.1,-38 -35.7,-70.5 -70.2,-89.3c-9.7,-5.2 -19.9,-9.3 -30.5,-12.2c-5.5,-1.4 -11.4,-2.7 -16.7,-3.7c-4.5,-0.8 -15,-2.7 -25.8,-4.2c-6.7,-0.9 -11.4,-7.1 -10.4,-13.8c0.9,-6.7 7.1,-11.4 13.8,-10.4c13.9,1.9 25.6,4.1 26.9,4.4h0.1c5.7,1.1 12.1,2.5 18,4c0.1,0 0.2,0 0.2,0.1c12.5,3.4 24.5,8.2 35.9,14.4c40.4,21.9 70.4,60 82.2,104.5c1,3.7 2,7.7 2.9,11.8c1.5,6.6 -2.6,13.1 -9.2,14.6C1469.9,680.2 1469,680.3 1468.1,680.3z">
android:type="linear"> <aapt:attr name="android:fillColor">
<item android:offset="0" android:color="#FF0262FC"/> <gradient android:endX="1339.9901" android:endY="508.03302"
<item android:offset="1" android:color="#FFFE0020"/> android:startX="1447.4285" android:startY="694.1216" android:type="linear">
</gradient> <item android:color="#FF953A9A" android:offset="4.04912E-7"/>
</aapt:attr> <item android:color="#FFFF0032" android:offset="1"/>
</path> </gradient>
<path </aapt:attr>
android:pathData="M328.099,174.927l-107.603,-69.423c-4.666,-2.723 -10.656,-1.147 -13.381,3.521c-0.002,0.002 -0.003,0.004 -0.004,0.006l-0.21,0.354c-2.715,4.67 -1.138,10.657 3.525,13.384l102.896,61.911c6.695,4.026 6.656,13.745 -0.067,17.721L209.883,263.47c-4.688,2.688 -6.314,8.66 -3.643,13.354l0.207,0.357c2.688,4.688 8.66,6.314 13.354,3.641l108.146,-68.555C341.614,203.608 341.692,183.701 328.099,174.927z" </path>
android:fillColor="#FFFFFF"/> <path android:fillColor="#953A9A" android:pathData="M1476.5,708.1m-12.7,0a12.7,12.7 0,1 1,25.4 0a12.7,12.7 0,1 1,-25.4 0"/>
<path <path android:pathData="M377.4,1158c5.6,0 10.6,3.9 11.9,9.5c0.9,3.9 1.8,7.5 2.7,11c10.1,38 35.7,70.5 70.2,89.3c9.7,5.2 19.9,9.3 30.5,12.2c5.5,1.4 11.4,2.7 16.7,3.7c4.5,0.8 15,2.7 25.8,4.2c6.7,0.9 11.4,7.1 10.4,13.8c-0.9,6.7 -7.1,11.4 -13.8,10.4c-13.9,-1.9 -25.6,-4.1 -26.9,-4.4h-0.1c-5.7,-1.1 -12.1,-2.5 -18,-4c-0.1,0 -0.2,0 -0.2,-0.1c-12.5,-3.4 -24.5,-8.2 -35.9,-14.4c-40.4,-21.9 -70.4,-60 -82.2,-104.5c-1,-3.7 -2,-7.7 -2.9,-11.8c-1.5,-6.6 2.6,-13.1 9.2,-14.6C375.6,1158.1 376.5,1158 377.4,1158z">
android:pathData="M273.159,183.669l-52.979,-29.846c-6.859,-3.863 -15.338,1.09 -15.338,8.961v59.689c0,7.871 8.479,12.824 15.338,8.961l52.979,-29.846C280.143,197.669 280.143,187.589 273.159,183.669z"> <aapt:attr name="android:fillColor">
<aapt:attr name="android:fillColor"> <gradient android:endX="455.5205" android:endY="1158.0405"
<gradient android:startX="455.5205" android:startY="1312.2747" android:type="linear">
android:startY="220.6162" <item android:color="#FF953A9A" android:offset="4.04912E-7"/>
android:startX="198.7153" <item android:color="#FFFF0032" android:offset="1"/>
android:endY="164.6422" </gradient>
android:endX="254.6893" </aapt:attr>
android:type="linear"> </path>
<item android:offset="0" android:color="#FF0262FC"/> <path android:fillColor="#FF0032" android:pathData="M368.9,1130.2m-12.7,0a12.7,12.7 0,1 1,25.4 0a12.7,12.7 0,1 1,-25.4 0"/>
<item android:offset="1" android:color="#FFFE0020"/> <path android:pathData="M877.4,454c-12.1,-19.5 -13.3,-44.9 -1,-66.1l1.4,-2.3c17.8,-30.6 57,-40.9 87.6,-23.1l145.4,93.8c-99.7,-2.6 -182.8,-2.6 -182.8,-2.6S908.6,453.7 877.4,454zM1669.5,816.8l-111.8,-72.1c3.4,49.2 5,97.2 5.6,130.2l9.5,5.7c43.8,26.4 43.6,90 -0.5,116l-10.1,6l-646.6,382l-19.7,11.7c-30.7,17.6 -41.4,56.7 -23.8,87.4l1.4,2.4c17.5,30.7 56.7,41.4 87.4,23.8l204,-129.3l389.7,-247l114,-72.3C1757.9,1004.5 1758.5,874.2 1669.5,816.8z">
</gradient> <aapt:attr name="android:fillColor">
</aapt:attr> <gradient android:endX="1427.5623" android:endY="570.1407"
</path> android:startX="690.922" android:startY="1306.7809" android:type="linear">
<item android:color="#FF2E73FF" android:offset="4.795011E-7"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
</vector> </vector>

View File

@ -17,18 +17,39 @@
<TextView <TextView
android:id="@+id/app_download_patient" android:id="@+id/app_download_patient"
style="@style/DialogCardSubtitle"
android:layout_height="wrap_content"
android:layout_below="@id/app_download_header" android:layout_below="@id/app_download_header"
android:text="@string/please_be_patient" android:layout_marginBottom="18dp"
style="@style/DialogCardSubtitle" /> android:text="@string/please_be_patient" />
<com.google.android.material.progressindicator.LinearProgressIndicator <RelativeLayout
android:id="@+id/app_download_progressbar" android:id="@+id/app_download_progressbar_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/app_download_patient" android:layout_below="@id/app_download_patient">
android:layout_marginTop="24dp"
app:trackCornerRadius="15dp" <com.google.android.material.progressindicator.LinearProgressIndicator
tools:progress="10" /> android:id="@+id/app_download_progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:trackCornerRadius="15dp"
android:layout_alignParentStart="true"
android:layout_toStartOf="@id/app_download_progress"
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
tools:progress="10" />
<TextView
android:id="@+id/app_download_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:textSize="15sp"
tools:text="20%" />
</RelativeLayout>
<com.google.android.material.progressindicator.LinearProgressIndicator <com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/app_install_progressbar" android:id="@+id/app_install_progressbar"
@ -36,8 +57,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_below="@id/app_download_progressbar" android:layout_below="@id/app_download_progressbar_container"
android:layout_marginTop="24dp"
android:indeterminate="true" android:indeterminate="true"
app:trackCornerRadius="15dp" /> app:trackCornerRadius="15dp" />
@ -45,7 +65,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/app_install_progressbar" android:layout_below="@id/app_install_progressbar"
android:layout_marginTop="8dp"> android:layout_marginTop="6dp">
<TextView <TextView
android:id="@+id/app_download_file" android:id="@+id/app_download_file"

View File

@ -21,23 +21,42 @@
android:text="@string/checking_updates" android:text="@string/checking_updates"
style="@style/DialogCardSubtitle"/> style="@style/DialogCardSubtitle"/>
<com.google.android.material.progressindicator.LinearProgressIndicator <RelativeLayout
android:id="@+id/manager_update_progressbar" android:id="@+id/manager_update_progressbar_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/manager_update_patient" android:layout_below="@id/manager_update_patient"
android:layout_marginTop="32dp" android:layout_marginTop="18dp">
android:paddingBottom="8dp"
app:trackCornerRadius="15dp" <com.google.android.material.progressindicator.LinearProgressIndicator
tools:progress="10" android:id="@+id/manager_update_progressbar"
tools:visibility="visible" /> android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:trackCornerRadius="15dp"
android:layout_alignParentStart="true"
android:layout_toStartOf="@id/manager_update_progress"
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
tools:progress="10" />
<TextView
android:id="@+id/manager_update_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:textSize="15sp"
tools:text="20%" />
</RelativeLayout>
<com.vanced.manager.ui.core.ThemedOutlinedMaterialButton <com.vanced.manager.ui.core.ThemedOutlinedMaterialButton
android:id="@+id/manager_update_cancel" android:id="@+id/manager_update_cancel"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_below="@id/manager_update_progressbar" android:layout_below="@id/manager_update_progressbar_container"
android:layout_marginTop="8dp"
android:text="@string/cancel" android:text="@string/cancel"
style="@style/OutlinedButtonStyle" /> style="@style/OutlinedButtonStyle" />

View File

@ -10,16 +10,16 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginEnd="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginStart="16dp" android:layout_marginVertical="16dp"
android:layout_marginTop="@dimen/stdp"
android:clipToPadding="false" android:clipToPadding="false"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/about_version_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:cardCornerRadius="8dp"> app:cardCornerRadius="12dp">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -16,7 +16,13 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical"
android:paddingVertical="12dp">
<com.vanced.manager.ui.core.ThemedTextView
android:layout_marginStart="20dp"
android:text="@string/apps"
style="@style/CardTextHeader" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_app_list" android:id="@+id/recycler_app_list"
@ -25,7 +31,7 @@
android:nestedScrollingEnabled="false" android:nestedScrollingEnabled="false"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
tools:itemCount="3" tools:itemCount="3"
tools:listitem="@layout/view_app" /> tools:listitem="@layout/view_app_expandable" />
<com.vanced.manager.ui.core.ThemedTextView <com.vanced.manager.ui.core.ThemedTextView
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
@ -53,7 +59,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:nestedScrollingEnabled="false" android:nestedScrollingEnabled="false"
android:paddingBottom="8dp"
tools:itemCount="6" tools:itemCount="6"
tools:listitem="@layout/view_social_link" /> tools:listitem="@layout/view_social_link" />

View File

@ -10,7 +10,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:paddingHorizontal="8dp" android:paddingHorizontal="8dp"
android:paddingTop="16dp"> android:paddingVertical="12dp">
<com.vanced.manager.ui.core.PreferenceCategory <com.vanced.manager.ui.core.PreferenceCategory
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -1,107 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/app_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:cardBackgroundColor="?colorLinkBG"
app:cardCornerRadius="12dp"
app:cardElevation="0dp"
app:contentPaddingBottom="4dp"
app:contentPaddingLeft="12dp"
app:contentPaddingRight="12dp"
app:contentPaddingTop="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_view_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.vanced.manager.ui.core.ThemedTextView
android:id="@+id/app_name"
style="@style/CardTextHeader"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/vanced" />
<com.vanced.manager.ui.core.ThemedOutlinedMaterialButton
android:id="@+id/app_install_button"
style="@style/OutlinedButtonStyle"
android:textColor="?colorPrimary"
app:layout_constraintBottom_toTopOf="@id/app_uninstall"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/app_uninstall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/ic_delete_black_24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_install_button"
app:tint="?colorLinkImage" />
<ImageButton
android:id="@+id/app_launch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/ic_baseline_launch_24"
app:layout_constraintEnd_toStartOf="@id/app_uninstall"
app:layout_constraintTop_toBottomOf="@id/app_install_button"
android:layout_marginEnd="4dp"
app:tint="?colorLinkImage" />
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/app_remote_version_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:flexWrap="wrap"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toTopOf="@id/app_installed_version_container"
app:layout_constraintEnd_toStartOf="@id/app_install_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_name">
<TextView
style="@style/AppVersionText"
android:text="@string/latest" />
<TextView
android:id="@+id/app_remote_version"
style="@style/AppVersionText"
android:layout_marginStart="4dp" />
</com.google.android.flexbox.FlexboxLayout>
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/app_installed_version_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:flexWrap="wrap"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/app_install_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_remote_version_container">
<TextView
style="@style/AppVersionText"
android:text="@string/version_installed" />
<TextView
android:id="@+id/app_installed_version"
style="@style/AppVersionText"
android:layout_marginStart="4dp" />
</com.google.android.flexbox.FlexboxLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<com.vanced.manager.ui.core.ThemedAppCard
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="4dp"
app:cardElevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_expanded_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:paddingHorizontal="12dp"
android:alpha="0"
android:scaleX="0.8"
android:scaleY="0.8"
tools:alpha="100"
tools:scaleX="1"
tools:scaleY="1">
<LinearLayout
android:id="@+id/app_version_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/app_button_container">
<com.google.android.flexbox.FlexboxLayout
app:flexWrap="wrap"
app:flexDirection="row"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.vanced.manager.ui.core.ThemedTextView
android:id="@+id/app_version_latest_text"
style="@style/AppVersionText"
android:text="@string/latest" />
<com.vanced.manager.ui.core.ThemedTextView
android:id="@+id/app_version_latest"
style="@style/AppVersionTextNumber"
tools:text="16.XX.XX" />
</com.google.android.flexbox.FlexboxLayout>
<com.google.android.flexbox.FlexboxLayout
app:flexWrap="wrap"
app:flexDirection="row"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.vanced.manager.ui.core.ThemedTextView
android:id="@+id/app_version_installed_text"
style="@style/AppVersionText"
android:text="@string/version_installed"/>
<com.vanced.manager.ui.core.ThemedTextView
android:id="@+id/app_version_installed"
style="@style/AppVersionTextNumber"
android:textSize="12sp"
tools:text="16.XX.XX" />
</com.google.android.flexbox.FlexboxLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/app_button_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/app_version_container"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="16dp">
<com.vanced.manager.ui.core.ThemedIconButton
android:id="@+id/app_info"
style="@style/AppActionButton"
app:icon="@drawable/ic_app_info"
android:contentDescription="@string/accessibility_info"/>
<com.vanced.manager.ui.core.ThemedIconButton
android:id="@+id/app_uninstall"
style="@style/AppActionButton"
app:icon="@drawable/ic_app_uninstall"
android:contentDescription="@string/accessibility_uninstall"/>
<com.vanced.manager.ui.core.ThemedIconButton
android:id="@+id/app_launch"
style="@style/AppActionButton"
app:icon="@drawable/ic_baseline_launch_24"
android:contentDescription="@string/accessibility_launch"/>
<com.vanced.manager.ui.core.ThemedIconButton
android:id="@+id/app_download"
style="@style/AppActionButton"
app:icon="@drawable/ic_app_download"
android:contentDescription="@string/accessibility_download"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.card.MaterialCardView
android:id="@+id/app_clickable_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentPadding="12dp"
app:cardCornerRadius="0dp"
app:cardElevation="0dp"
app:cardBackgroundColor="?colorLinkBG"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/app_icon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/app_image_placeholder"/>
<LinearLayout
android:id="@+id/app_info_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/app_icon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/app_expand_arrow"
app:layout_constrainedWidth="true"
android:layout_marginHorizontal="12dp"
android:orientation="vertical">
<TextView
android:id="@+id/app_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="YouTube Vanced"
android:textColor="?colorLinkImage"
android:textSize="16sp"/>
<TextView
android:id="@+id/app_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
tools:text="The way we see the world" />
</LinearLayout>
<ImageView
android:id="@+id/app_expand_arrow"
android:layout_width="24dp"
android:layout_height="24dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/ic_baseline_navigate_next_36"
android:rotation="90"
app:tint="?colorLinkImage" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</com.vanced.manager.ui.core.ThemedAppCard>

View File

@ -41,7 +41,8 @@
<fragment <fragment
android:id="@+id/settings_fragment" android:id="@+id/settings_fragment"
android:name="com.vanced.manager.ui.fragments.SettingsFragment" android:name="com.vanced.manager.ui.fragments.SettingsFragment"
android:label="@string/title_settings"> android:label="@string/title_settings"
tools:layout="@layout/fragment_settings">
<action <action
android:id="@+id/toDevSettingsFragment" android:id="@+id/toDevSettingsFragment"
@ -76,6 +77,7 @@
<fragment <fragment
android:id="@+id/dev_settings_fragment" android:id="@+id/dev_settings_fragment"
android:name="com.vanced.manager.ui.fragments.DevSettingsFragment" android:name="com.vanced.manager.ui.fragments.DevSettingsFragment"
android:label="Dev Settings" /> android:label="Dev Settings"
tools:layout="@layout/fragment_dev_settings"/>
</navigation> </navigation>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">What is your favourite song</string> <string name="cancel">What is your favourite song</string>
<string name="close">Maak toe</string> <string name="close">Maak toe</string>
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
<string name="description_vanced">A modified YouTube client with many useful features!</string>
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
<string name="reset">Herstel</string> <string name="reset">Herstel</string>
<string name="save">Stoor</string> <string name="save">Stoor</string>
<string name="select_apps">Select Your Apps</string> <string name="select_apps">Select Your Apps</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">Oor</string> <string name="title_about">Oor</string>
<string name="title_guide">Guide</string> <string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_home">Manager</string> <string name="title_home">Manager</string>
<string name="title_logs">Logs</string>
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
<string name="update_manager">Update Manager</string> <string name="update_manager">Update Manager</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Is Your Device Rooted?</string> <string name="are_you_rooted">Is Your Device Rooted?</string>
<string name="grant_root">Grant Root Permission</string> <string name="grant_root">Grant Root Permission</string>
<string name="select_at_least_one_app">Select at least one app!</string>
<string name="select_apps_music">Vanced, but for YouTube Music!\nrelatively less feature-rich but fulfills your needs.</string>
<string name="select_apps_vanced">YouTube Vanced is the stock Android YouTube App, but better!</string>
<string name="lets_get_started">Let\'s get started</string> <string name="lets_get_started">Let\'s get started</string>
<string name="select_at_least_one_app">Select at least one app!</string>
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string> <string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">About %1$s</string> <string name="about_app">About %1$s</string>
<string name="app_changelog_tooltip">Tap on the card to see the changelog.</string> <string name="accessibility_download">Download</string>
<string name="accessibility_info">Info</string>
<string name="accessibility_launch">Launch</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Uninstall</string>
<string name="accessibility_update">Update</string>
<string name="apps">Apps</string>
<string name="changelog">Changelog</string> <string name="changelog">Changelog</string>
<string name="downloading_file">Downloading %1$s</string> <string name="downloading_file">Downloading %1$s</string>
<string name="install">Install</string> <string name="install">Install</string>
<string name="button_reinstall">Reinstall</string>
<string name="version_installed">Installed:</string>
<string name="latest">Latest:</string> <string name="latest">Latest:</string>
<string name="no_microg">microG isn\'t installed</string> <string name="no_microg">Install Vanced microG first</string>
<string name="root_not_granted">Root access not granted</string> <string name="root_not_granted">Root access not granted</string>
<string name="unavailable">Unavailable</string>
<string name="update">Update</string>
<string name="social_media">Social Media</string> <string name="social_media">Social Media</string>
<string name="support_us">Support us</string> <string name="support_us">Support us</string>
<string name="unavailable">Unavailable</string>
<string name="version_installed">Installed:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Accent Color</string> <string name="accent_color">Accent Color</string>
<string name="category_appearance">Appearance</string> <string name="category_appearance">Appearance</string>
<string name="category_behaviour">Behavior</string> <string name="category_behaviour">Behavior</string>
<string name="clear_files">Clear downloaded files</string> <string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string> <string name="cleared_files">Successfully cleared files</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string> <string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="language_title">Language</string> <string name="language_title">Language</string>
<string name="link_title">Use Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string> <string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
<string name="system_default">System Default</string> <string name="link_title">Use Chrome Custom Tabs</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="script_save_failed">Failed to save new time value</string> <string name="script_save_failed">Failed to save new time value</string>
<string name="script_sleep_timer">Root Script Sleep Time</string> <string name="script_sleep_timer">Root Script Sleep Time</string>
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string> <string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
<string name="system_default">System Default</string>
<string name="theme">Theme</string> <string name="theme">Theme</string>
<string name="theme_dark">Dark Theme</string> <string name="theme_dark">Dark Theme</string>
<string name="theme_light">Light Theme</string> <string name="theme_light">Light Theme</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="update_center">Manager Update Center</string> <string name="update_center">Manager Update Center</string>
<string name="update_not_found">No new updates</string> <string name="update_not_found">No new updates</string>
<string name="variant">Variant</string> <string name="variant">Variant</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string> <string name="logs_not_saved">Could not save logs</string>
<string name="logs_saved">Successfully saved logs</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Advanced</string> <string name="advanced">Details</string>
<string name="app_install_files_detected">%1$s installation files detected!</string> <string name="app_install_files_detected">%1$s installation files detected!</string>
<string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string> <string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="checking_updates">Checking for updates…</string> <string name="checking_updates">Checking for updates…</string>
<string name="chosen_lang">Language(s): %1$s</string> <string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_theme">Theme: %1$s</string> <string name="chosen_theme">Theme: %1$s</string>
<string name="chosen_version">Version: %1$s</string> <string name="chosen_version">Version: %1$s</string>
<string name="error">Error</string>
<string name="guide">Guide</string> <string name="guide">Guide</string>
<string name="hold_on">Stop!</string> <string name="hold_on">Stop!</string>
<string name="magisk_vanced">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.</string> <string name="magisk_vanced">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.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="miui_one">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)</string> <string name="miui_one">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)</string>
<string name="error">Error</string> <string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="redownload">Redownload</string> <string name="redownload">Redownload</string>
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string> <string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="microg_bug">Bug in microG</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">Welcome</string> <string name="welcome">Welcome</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string> <string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string> <string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
<string name="error_downloading">Error Downloading %1$s</string> <string name="error_downloading">Error Downloading %1$s</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="failed_accent">Failed to apply new accent color</string> <string name="failed_accent">Failed to apply new accent color</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string> <string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string> <string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
<string name="installation_aborted">Installation failed because the user aborted the installation.</string> <string name="installation_aborted">Installation failed because the user aborted the installation.</string>
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string> <string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
<string name="installation_incompatible">Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again.</string> <string name="installation_incompatible">Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again.</string>
<string name="installation_invalid">Installation failed because the apk files are corrupted, please try again.</string> <string name="installation_invalid">Installation failed because the apk files are corrupted, please try again.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_miui">Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again.</string> <string name="installation_miui">Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string> <string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string> <string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">إلغاء</string> <string name="cancel">إلغاء</string>
<string name="close">إغلاق</string> <string name="close">إغلاق</string>
<string name="description_microg">نسخة خاصة من خدمات جوجل للجوال معدة خصيصا لتطبيق ڤانسد بناءً على مشروع microG.</string>
<string name="description_vanced">تطبيق يوتيوب معدل مع العديد من الميزات المفيدة!</string>
<string name="description_vanced_music">ڤانسد لموسيقى يوتيوب! يلبي احتياجاتك حتى وان كان يضم ميزات اقل من ڤانسد.</string>
<string name="reset">إعادة تعيين</string> <string name="reset">إعادة تعيين</string>
<string name="save">حفظ</string> <string name="save">حفظ</string>
<string name="select_apps">اختر تطبيقاتك</string> <string name="select_apps">اختر تطبيقاتك</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">حول</string> <string name="title_about">حول</string>
<string name="title_guide">Guide</string> <string name="title_guide">دليل الاستخدام</string>
<string name="title_logs">السجل</string>
<string name="title_home">المدير</string> <string name="title_home">المدير</string>
<string name="title_logs">السجلات</string>
<string name="title_settings">الإعدادات</string> <string name="title_settings">الإعدادات</string>
<string name="update_manager">تحديث المدير</string> <string name="update_manager">تحديث المدير</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">هل جهازك مروت؟</string> <string name="are_you_rooted">هل جهازك مروت؟</string>
<string name="grant_root">امنح صلاحيات الروت</string> <string name="grant_root">امنح صلاحيات الروت</string>
<string name="select_at_least_one_app">حدد تطبيق واحد على الأقل!</string>
<string name="select_apps_music">ڤانسد، ولكن لموسيقى يوتيوب! \n نسبياً فيه مميزات أقل ولكن يلبي احتياجاتك.</string>
<string name="select_apps_vanced">يوتيوب ڤانسد هو يوتيوب الأندرويد العادي، ولكن أفضل!</string>
<string name="lets_get_started">فلنبدأ</string> <string name="lets_get_started">فلنبدأ</string>
<string name="select_at_least_one_app">اختر تطبيقاً واحداً على الأقل!</string>
<string name="willing_to_use_root">لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل!</string> <string name="willing_to_use_root">لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">حوالي %1$s</string> <string name="about_app">حول %1$s</string>
<string name="app_changelog_tooltip">أضغط على إحدى البطاقات لعرض سجل التغييرات.</string> <string name="accessibility_download">تنزيل</string>
<string name="accessibility_info">المعلومات</string>
<string name="accessibility_launch">تشغيل</string>
<string name="accessibility_reinstall">أعد التثبيت</string>
<string name="accessibility_uninstall">إلغاء التثبيت</string>
<string name="accessibility_update">تحديث</string>
<string name="apps">التطبيقات</string>
<string name="changelog">سجل التغييرات</string> <string name="changelog">سجل التغييرات</string>
<string name="downloading_file">جارٍ تنزيل %1$s</string> <string name="downloading_file">جارٍ تنزيل %1$s</string>
<string name="install">تثبيت</string> <string name="install">تثبيت</string>
<string name="button_reinstall">إعادة التثبيت</string>
<string name="version_installed">مثبت:</string>
<string name="latest">الأحدث:</string> <string name="latest">الأحدث:</string>
<string name="no_microg">لم يتم تثبيت microG</string> <string name="no_microg">قم بتثبيت Vanced microG أولاً</string>
<string name="root_not_granted">لم يتم منح صلاحيات الروت</string> <string name="root_not_granted">لم يتم منح صلاحيات الروت</string>
<string name="unavailable">غير متاح</string>
<string name="update">تحديث</string>
<string name="social_media">وسائل التواصل الإجتماعي</string> <string name="social_media">وسائل التواصل الإجتماعي</string>
<string name="support_us">ادعمنا</string> <string name="support_us">ادعمنا</string>
<string name="unavailable">غير متاح</string>
<string name="version_installed">مثبت:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">الألوان</string> <string name="accent_color">الألوان</string>
<string name="category_appearance">المظهر</string> <string name="category_appearance">المظهر</string>
<string name="category_behaviour">السلوك</string> <string name="category_behaviour">السلوك</string>
<string name="clear_files">مسح الملفات التي تم تنزيلها</string> <string name="clear_files">مسح الملفات التي تم تنزيلها</string>
<string name="cleared_files">تم مسح الملفات بنجاح</string> <string name="cleared_files">تم مسح الملفات بنجاح</string>
<string name="firebase_title">تحليلات Firebase</string>
<string name="firebase_summary">هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال</string> <string name="firebase_summary">هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال</string>
<string name="firebase_title">تحليلات Firebase</string>
<string name="language_title">اللغة</string> <string name="language_title">اللغة</string>
<string name="link_title">استخدم علامات تبويب مخصصة لمتصفح كروم</string>
<string name="link_custom_tabs">سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم</string> <string name="link_custom_tabs">سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم</string>
<string name="system_default">الوضع الافتراضي</string> <string name="link_title">استخدم علامات تبويب مخصصة لمتصفح كروم</string>
<string name="push_notifications">إشعارات %1$s</string>
<string name="push_notifications_summary">تلقي الإشعارات عند إصدار تحديث لـ %1$s</string>
<string name="script_save_failed">فشل في حفظ القيمة الزمنية الجديدة</string> <string name="script_save_failed">فشل في حفظ القيمة الزمنية الجديدة</string>
<string name="script_sleep_timer">Script sleep time للروت</string> <string name="script_sleep_timer">Script sleep time للروت</string>
<string name="script_sleep_timer_description">ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب</string> <string name="script_sleep_timer_description">ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب</string>
<string name="system_default">الوضع الافتراضي</string>
<string name="theme">السمة</string> <string name="theme">السمة</string>
<string name="theme_dark">السمة الداكنة</string> <string name="theme_dark">السمة الداكنة</string>
<string name="theme_light">السمة الفاتحة</string> <string name="theme_light">السمة الفاتحة</string>
<string name="push_notifications">إشعارات %1$s</string>
<string name="push_notifications_summary">تلقي الإشعارات عند إصدار تحديث لـ %1$s</string>
<string name="update_center">مركز التحديث</string> <string name="update_center">مركز التحديث</string>
<string name="update_not_found">لا توجد تحديثات جديدة</string> <string name="update_not_found">لا توجد تحديثات جديدة</string>
<string name="variant">النوع</string> <string name="variant">النوع</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">تم حفظ السجل بنجاح</string>
<string name="logs_not_saved">تعذر حفظ السجل</string> <string name="logs_not_saved">تعذر حفظ السجل</string>
<string name="logs_saved">تم حفظ السجل بنجاح</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">إعدادات متقدمة</string> <string name="advanced">التفاصيل</string>
<string name="app_install_files_detected">تم اكتشاف ملفات تثبيت %1$s!</string> <string name="app_install_files_detected">تم اكتشاف ملفات تثبيت %1$s!</string>
<string name="app_install_files_detected_summary">اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟</string> <string name="app_install_files_detected_summary">اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟</string>
<string name="app_installation_preferences">تفضيلات تثبيت %1$s</string>
<string name="checking_updates">جارٍ التحقق من وجود تحديثات…</string> <string name="checking_updates">جارٍ التحقق من وجود تحديثات…</string>
<string name="chosen_lang">اللغة/اللغات: %1$s</string> <string name="chosen_lang">اللغة/اللغات: %1$s</string>
<string name="chosen_theme">السمة: %1$s</string> <string name="chosen_theme">السمة: %1$s</string>
<string name="chosen_version">الإصدار: %1$s</string> <string name="chosen_version">الإصدار: %1$s</string>
<string name="error">خطأ</string>
<string name="guide">الدليل</string> <string name="guide">الدليل</string>
<string name="hold_on">إيقاف!</string> <string name="hold_on">إيقاف!</string>
<string name="magisk_vanced">يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP.</string> <string name="magisk_vanced">يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string> <string name="miui_one">من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا)</string>
<string name="miui_one">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)</string> <string name="miui_one_title">تحسينات MIUI مفعلة!</string>
<string name="error">خطأ</string> <string name="please_be_patient">الرجاء عدم الخروج من التطبيق أثناء هذه العملية!</string>
<string name="redownload">إعادة التنزيل</string> <string name="redownload">إعادة التنزيل</string>
<string name="security_context">تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub</string> <string name="security_context">تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub</string>
<string name="app_installation_preferences">تفضيلات تثبيت %1$s</string>
<string name="version">الإصدار</string> <string name="version">الإصدار</string>
<string name="microg_bug">خطأ في المايكروجي</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">مرحباً بك</string> <string name="welcome">مرحباً بك</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">اختر لغتك(لغاتك) المفضلة لڤانسد</string> <string name="choose_preferred_language">اختر لغتك(لغاتك) المفضلة لڤانسد</string>
@ -94,26 +96,25 @@
<string name="vanced_dark">داكن</string> <string name="vanced_dark">داكن</string>
<!-- About Page --> <!-- About Page -->
<string name="manager_dev">مطوري المدير</string> <string name="manager_dev">مطوري المدير</string>
<string name="other_contributors">Other Contributors</string> <string name="other_contributors">مساهمين آخرين</string>
<string name="sources">المصادر</string> <string name="sources">المصادر</string>
<string name="vanced_team">فريق ڤانسد</string> <string name="vanced_team">فريق ڤانسد</string>
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى.</string> <string name="chown_fail">فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى.</string>
<string name="error_downloading">خطأ في تنزيل %1$s</string> <string name="error_downloading">خطأ في تنزيل %1$s</string>
<string name="failed_uninstall">فشل في الغاء تثبيت الحزمة %1$s</string>
<string name="failed_accent">فشل تطبيق لون النسق الجديد</string> <string name="failed_accent">فشل تطبيق لون النسق الجديد</string>
<string name="failed_uninstall">فشل في الغاء تثبيت حزمة %1$s</string>
<string name="files_missing_va">فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى.</string> <string name="files_missing_va">فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى.</string>
<string name="ifile_missing">فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى.</string> <string name="ifile_missing">فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى.</string>
<string name="installation_aborted">فشل التثبيت لأن المستخدم ألغى التثبيت.</string> <string name="installation_aborted">فشل التثبيت لأن المستخدم ألغى التثبيت.</string>
<string name="installation_blocked">فشل التثبيت لأن المستخدم قام بحظر التثبيت.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_conflict">فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى.</string> <string name="installation_conflict">فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_downgrade">فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى.</string>
<string name="installation_failed">فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم. يرجى أيضاً إرفاق لقطة الشاشة من القائمة المتقدمة</string>
<string name="installation_incompatible">فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى.</string> <string name="installation_incompatible">فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى.</string>
<string name="installation_invalid">فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى.</string> <string name="installation_invalid">فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى.</string>
<string name="installation_signature">فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى.</string>
<string name="installation_miui">فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى.</string> <string name="installation_miui">فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_signature">فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى.</string>
<string name="installation_storage">فشل التثبيت، مساحة جهازك الخالية لا تكفي. </string>
<string name="modapk_missing">فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى.</string> <string name="modapk_missing">فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى.</string>
<string name="path_missing">فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة.</string> <string name="path_missing">فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة.</string>
</resources> </resources>

View File

@ -3,90 +3,92 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">İmtina</string> <string name="cancel">İmtina</string>
<string name="close">Bağla</string> <string name="close">Bağla</string>
<string name="description_microg">microG Layihəsi əsasında Vanced üçün təkmilləşdirilmiş özəl bir GMS tətbiqi.</string>
<string name="description_vanced">Çoxlu faydalı özəllikləri ilə modifikasiya edilmiş YouTube versiyası!</string>
<string name="description_vanced_music">Yenə Vanced, ancaq YouTube Msuic üçün! Nisbətən daha az özəlliyi olsa da, ehtiyaclarınızı qarşılayacaq.</string>
<string name="reset">Sıfırla</string> <string name="reset">Sıfırla</string>
<string name="save">Saxla</string> <string name="save">Saxla</string>
<string name="select_apps">Tətbiqlərinizi Seçin</string> <string name="select_apps">Tətbiqlərinizi Seçin</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">Haqqında</string> <string name="title_about">Haqqında</string>
<string name="title_guide">Bələdçi</string> <string name="title_guide">Bələdçi</string>
<string name="title_logs">Qeydlər</string>
<string name="title_home">Menecer</string> <string name="title_home">Menecer</string>
<string name="title_logs">Qeydlər</string>
<string name="title_settings">Tənzimləmələr</string> <string name="title_settings">Tənzimləmələr</string>
<string name="update_manager">Yeniləmə Meneceri</string> <string name="update_manager">Yeniləmə Meneceri</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Cihazınızda root varmı?</string> <string name="are_you_rooted">Cihazınızda root varmı?</string>
<string name="grant_root">Root İcazəsi Ver</string> <string name="grant_root">Root İcazəsi Ver</string>
<string name="select_at_least_one_app">Ən azı bir tətbiq seçin!</string>
<string name="select_apps_music">Vanced, amma YouTube Musiqi üçün!\nçox daha az xüsusiyyətli olsa da ehtiyaclarınızı qarşılayır.</string>
<string name="select_apps_vanced">YouTube Vanced adi Android YouTube tətbiqi olsa da daha yaxşıdır!</string>
<string name="lets_get_started">Gəlin başlayaq</string> <string name="lets_get_started">Gəlin başlayaq</string>
<string name="select_at_least_one_app">Ən azı bir tətbiq seçin!</string>
<string name="willing_to_use_root">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!</string> <string name="willing_to_use_root">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!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">%1$s Haqqında</string> <string name="about_app">%1$s Haqqında</string>
<string name="app_changelog_tooltip">Yenilikləri görmək üçün karta toxunun.</string> <string name="accessibility_download">Download</string>
<string name="accessibility_info">Info</string>
<string name="accessibility_launch">Launch</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Uninstall</string>
<string name="accessibility_update">Update</string>
<string name="apps">Tətbiqlər</string>
<string name="changelog">Dəyişikliklər</string> <string name="changelog">Dəyişikliklər</string>
<string name="downloading_file">%1$s endirilir</string> <string name="downloading_file">%1$s endirilir</string>
<string name="install">Quraşdır</string> <string name="install">Quraşdır</string>
<string name="button_reinstall">Yenidən quraşdır</string>
<string name="version_installed">Quraşdırıldı:</string>
<string name="latest">Ən son:</string> <string name="latest">Ən son:</string>
<string name="no_microg">microG quraşdırılmayıb</string> <string name="no_microg">Əvvəlcə Vanced microG-ni quraşdırın</string>
<string name="root_not_granted">Root icazəsi verilməyib</string> <string name="root_not_granted">Root icazəsi verilməyib</string>
<string name="unavailable">Əlçatmazdır</string>
<string name="update">Yenilə</string>
<string name="social_media">Sosial Media</string> <string name="social_media">Sosial Media</string>
<string name="support_us">Bizi dəstəklə</string> <string name="support_us">Bizi dəstəklə</string>
<string name="unavailable">Əlçatmazdır</string>
<string name="version_installed">Qurulan:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Tema rəngi</string> <string name="accent_color">Tema rəngi</string>
<string name="category_appearance">Görünüş</string> <string name="category_appearance">Görünüş</string>
<string name="category_behaviour">Davranış</string> <string name="category_behaviour">Davranış</string>
<string name="clear_files">Endirilmiş faylları təmizlə</string> <string name="clear_files">Endirilmiş faylları təmizlə</string>
<string name="cleared_files">Fayllar uğurla təmizləndi</string> <string name="cleared_files">Fayllar uğurla təmizləndi</string>
<string name="firebase_title">Firebase Analitikləri</string>
<string name="firebase_summary">Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir</string> <string name="firebase_summary">Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir</string>
<string name="firebase_title">Firebase Analitikləri</string>
<string name="language_title">Dil</string> <string name="language_title">Dil</string>
<string name="link_title">Chrome Özəl Vərəqlərini istifadə et</string>
<string name="link_custom_tabs">Bağlantılar Chrome Özəl Vərəqlərində açılacaq</string> <string name="link_custom_tabs">Bağlantılar Chrome Özəl Vərəqlərində açılacaq</string>
<string name="system_default">İlkin Sistem</string> <string name="link_title">Chrome Özəl Vərəqlərini istifadə et</string>
<string name="push_notifications">%1$s Ani Bildirişlər</string>
<string name="push_notifications_summary">%1$s üçün yeni buraxılış olanda ani bildirişlər alın</string>
<string name="script_save_failed">Yeni vaxt qiymətini saxlamaq olmadı</string> <string name="script_save_failed">Yeni vaxt qiymətini saxlamaq olmadı</string>
<string name="script_sleep_timer">Root Qoşma Gözləmə Müddəti</string> <string name="script_sleep_timer">Root Qoşma Gözləmə Müddəti</string>
<string name="script_sleep_timer_description">/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</string> <string name="script_sleep_timer_description">/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</string>
<string name="theme">Tema</string> <string name="system_default">İlkin Sistem</string>
<string name="theme">Mövzu</string>
<string name="theme_dark">Tünd mövzu</string> <string name="theme_dark">Tünd mövzu</string>
<string name="theme_light">ıq mövzu</string> <string name="theme_light">ıq mövzu</string>
<string name="push_notifications">%1$s Ani Bildirişlər</string>
<string name="push_notifications_summary">%1$s üçün yeni buraxılış olanda ani bildirişlər alın</string>
<string name="update_center">Menecer Yeniləmə Mərkəzi</string> <string name="update_center">Menecer Yeniləmə Mərkəzi</string>
<string name="update_not_found">Yeniləmə yoxdur</string> <string name="update_not_found">Yeniləmə yoxdur</string>
<string name="variant">Variant</string> <string name="variant">Variant</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
<string name="logs_not_saved">Qeydləri saxlamaq olmadı</string> <string name="logs_not_saved">Qeydləri saxlamaq olmadı</string>
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Qabaqcıl</string> <string name="advanced">Təfsilatlar</string>
<string name="app_install_files_detected">%1$s quraşdırma faylı aşkarlandı!</string> <string name="app_install_files_detected">%1$s quraşdırma faylı aşkarlandı!</string>
<string name="app_install_files_detected_summary">Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz?</string> <string name="app_install_files_detected_summary">Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz?</string>
<string name="app_installation_preferences">%1$s Qurma Seçimləri</string>
<string name="checking_updates">Yeniləmələr yoxlanılır…</string> <string name="checking_updates">Yeniləmələr yoxlanılır…</string>
<string name="chosen_lang">Dil(lər): %1$s</string> <string name="chosen_lang">Dil(lər): %1$s</string>
<string name="chosen_theme">Mövzu: %1$s</string> <string name="chosen_theme">Mövzu: %1$s</string>
<string name="chosen_version">Versiya: %1$s</string> <string name="chosen_version">Versiya: %1$s</string>
<string name="error">Xəta</string>
<string name="guide">Bələdçi</string> <string name="guide">Bələdçi</string>
<string name="hold_on">Dayandır!</string> <string name="hold_on">Dayandır!</string>
<string name="magisk_vanced">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.</string> <string name="magisk_vanced">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.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string> <string name="miui_one">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)</string>
<string name="miui_one">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)</string> <string name="miui_one_title">MIUI Optimizasiyalarııqdır!</string>
<string name="error">Xəta</string> <string name="please_be_patient">Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN!</string>
<string name="redownload">Yenidən endir</string> <string name="redownload">Yenidən endir</string>
<string name="security_context">Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun</string> <string name="security_context">Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun</string>
<string name="app_installation_preferences">%1$s Qurma Seçimləri</string>
<string name="version">Versiya</string> <string name="version">Versiya</string>
<string name="microg_bug">Amma microG\'də</string> <string name="welcome">Xoş gəlmisiniz</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN!</string>
<string name="welcome">Xoş gəldiniz</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Vanced üçün tərcih etdiyiniz dili seçin</string> <string name="choose_preferred_language">Vanced üçün istədiyiniz dili seçin</string>
<string name="install_latest">Ən son</string> <string name="install_latest">Ən son</string>
<string name="light_plus_other">İşıqlı + %1$s</string> <string name="light_plus_other">İşıqlı + %1$s</string>
<string name="select_at_least_one_lang">Ən azı bir dil seçin!</string> <string name="select_at_least_one_lang">Ən azı bir dil seçin!</string>
@ -94,26 +96,25 @@
<string name="vanced_dark">Qaranlıq</string> <string name="vanced_dark">Qaranlıq</string>
<!-- About Page --> <!-- About Page -->
<string name="manager_dev">Menecer Tərtibatçıları</string> <string name="manager_dev">Menecer Tərtibatçıları</string>
<string name="other_contributors">Other Contributors</string> <string name="other_contributors">Digər Dəstəkçilər</string>
<string name="sources">Mənbələr</string> <string name="sources">Mənbələr</string>
<string name="vanced_team">Vanced Birliyi</string> <string name="vanced_team">Vanced Birliyi</string>
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın.</string> <string name="chown_fail">Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın.</string>
<string name="error_downloading">%1$s endirilmə xətası</string> <string name="error_downloading">%1$s Yüklənərkən xəta</string>
<string name="failed_uninstall">%1$s paketini silinmədi</string>
<string name="failed_accent">Yeni ikinci rəngi təyin etmək alınmadı</string> <string name="failed_accent">Yeni ikinci rəngi təyin etmək alınmadı</string>
<string name="failed_uninstall">%1$s paketini silmək olmur</string>
<string name="files_missing_va">Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın.</string> <string name="files_missing_va">Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın.</string>
<string name="ifile_missing">Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın.</string> <string name="ifile_missing">Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın.</string>
<string name="installation_aborted">İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu.</string> <string name="installation_aborted">İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu.</string>
<string name="installation_blocked">İstifadəçi quraşdırmanı əngəllədiyi üçün quraşdırılma uğursuz oldu.</string>
<string name="installation_downgrade">İ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.</string>
<string name="installation_conflict">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.</string> <string name="installation_conflict">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.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_downgrade">İ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.</string>
<string name="installation_failed">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</string>
<string name="installation_incompatible">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.</string> <string name="installation_incompatible">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.</string>
<string name="installation_invalid">Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın.</string> <string name="installation_invalid">Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın.</string>
<string name="installation_signature">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.</string>
<string name="installation_miui">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.</string> <string name="installation_miui">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.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_signature">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.</string>
<string name="installation_storage">Cihazda yaddaş az olduğundan qurma alınmadı.</string>
<string name="modapk_missing">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.</string> <string name="modapk_missing">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.</string>
<string name="path_missing">Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı.</string> <string name="path_missing">Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı.</string>
</resources> </resources>

View File

@ -3,90 +3,92 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">Отказ</string> <string name="cancel">Отказ</string>
<string name="close">Затвори</string> <string name="close">Затвори</string>
<string name="description_microg">Персонализирано внедряване на GMS за Vanced въз основа на проекта microG.</string>
<string name="description_vanced">Модифициран клиент за YouTube с много полезни функции!</string>
<string name="description_vanced_music">Vanced, но за YouTube Music! Относително по-малко богат на функции, но ще отговори на вашите нужди.</string>
<string name="reset">Изчисти</string> <string name="reset">Изчисти</string>
<string name="save">Запази</string> <string name="save">Запази</string>
<string name="select_apps">Изберете приложения</string> <string name="select_apps">Изберете приложения</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">Относно</string> <string name="title_about">Относно</string>
<string name="title_guide">Ръководство</string> <string name="title_guide">Ръководство</string>
<string name="title_logs">Логове</string>
<string name="title_home">Мениджър</string> <string name="title_home">Мениджър</string>
<string name="title_logs">Логове</string>
<string name="title_settings">Настройки</string> <string name="title_settings">Настройки</string>
<string name="update_manager">Обнови Vanced Manager</string> <string name="update_manager">Обнови Vanced Manager</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Имате ли Root достъп на устройството си?</string> <string name="are_you_rooted">Имате ли Root достъп на устройството си?</string>
<string name="grant_root">Разрешете Root достъп</string> <string name="grant_root">Разрешете Root достъп</string>
<string name="select_at_least_one_app">Изберете поне едно приложение!</string>
<string name="select_apps_music">Vanced, но за YouTube Music!\nс по-малко функции, но ще задоволи нуждите Ви.</string>
<string name="select_apps_vanced">YouTube Vanced е като оригиналното YouTube приложение, но значително подобрено!</string>
<string name="lets_get_started">Да започваме</string> <string name="lets_get_started">Да започваме</string>
<string name="select_at_least_one_app">Изберете поне едно приложение!</string>
<string name="willing_to_use_root">Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу!</string> <string name="willing_to_use_root">Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">Относно %1$s</string> <string name="about_app">Относно %1$s</string>
<string name="app_changelog_tooltip">Докоснете картичката, за да видите списъка с промени.</string> <string name="accessibility_download">Изтегляне</string>
<string name="accessibility_info">Информация</string>
<string name="accessibility_launch">Стартиране</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Деинсталиране</string>
<string name="accessibility_update">Актуализиране</string>
<string name="apps">Приложения</string>
<string name="changelog">Списък с промени</string> <string name="changelog">Списък с промени</string>
<string name="downloading_file">Изтегляне на %1$s</string> <string name="downloading_file">Изтегляне на %1$s</string>
<string name="install">Инсталиране</string> <string name="install">Инсталиране</string>
<string name="button_reinstall">Преинсталиране</string>
<string name="version_installed">Инсталиранa:</string>
<string name="latest">Най-нова:</string> <string name="latest">Най-нова:</string>
<string name="no_microg">microG не е инсталирано</string> <string name="no_microg">Инсталирайте първо Vanced microG</string>
<string name="root_not_granted">Root достъп не е разрешен</string> <string name="root_not_granted">Root достъп не е разрешен</string>
<string name="unavailable">Недостъпно</string>
<string name="update">Обновяване</string>
<string name="social_media">Социални медии</string> <string name="social_media">Социални медии</string>
<string name="support_us">Подкрепете ни</string> <string name="support_us">Подкрепете ни</string>
<string name="unavailable">Недостъпно</string>
<string name="version_installed">Инсталиранa:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Акцентиращ цвят</string> <string name="accent_color">Акцентиращ цвят</string>
<string name="category_appearance">Външен вид</string> <string name="category_appearance">Външен вид</string>
<string name="category_behaviour">Поведение</string> <string name="category_behaviour">Поведение</string>
<string name="clear_files">Изчисти изтеглените файлове</string> <string name="clear_files">Изчисти изтеглените файлове</string>
<string name="cleared_files">Файловете са изчистени успешно</string> <string name="cleared_files">Файловете са изчистени успешно</string>
<string name="firebase_title">Firebase анализ</string>
<string name="firebase_summary">Позволява ни да събираме информация за поведението на приложението и доклади за сривове</string> <string name="firebase_summary">Позволява ни да събираме информация за поведението на приложението и доклади за сривове</string>
<string name="firebase_title">Firebase анализ</string>
<string name="language_title">Език</string> <string name="language_title">Език</string>
<string name="link_title">Ползвай персонализирани раздели на Chrome</string>
<string name="link_custom_tabs">Връзките ще се отварят в персонализирани раздели на Chrome</string> <string name="link_custom_tabs">Връзките ще се отварят в персонализирани раздели на Chrome</string>
<string name="system_default">По подразбиране за системата</string> <string name="link_title">Ползвай персонализирани раздели на Chrome</string>
<string name="push_notifications">%1$s насочени известия</string>
<string name="push_notifications_summary">Получаване на насочени известия, когато има нова версия на %1$s</string>
<string name="script_save_failed">Неуспешно запазване на новата стойност за времето</string> <string name="script_save_failed">Неуспешно запазване на новата стойност за времето</string>
<string name="script_sleep_timer">Време за заспиване на Root скрипта</string> <string name="script_sleep_timer">Време за заспиване на Root скрипта</string>
<string name="script_sleep_timer_description">Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране</string> <string name="script_sleep_timer_description">Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране</string>
<string name="system_default">По подразбиране за системата</string>
<string name="theme">Тема</string> <string name="theme">Тема</string>
<string name="theme_dark">Тъмна тема</string> <string name="theme_dark">Тъмна тема</string>
<string name="theme_light">Светла тема</string> <string name="theme_light">Светла тема</string>
<string name="push_notifications">%1$s насочени известия</string>
<string name="push_notifications_summary">Получаване на насочени известия, когато има нова версия на %1$s</string>
<string name="update_center">Център за актуализации</string> <string name="update_center">Център за актуализации</string>
<string name="update_not_found">Няма актуализации</string> <string name="update_not_found">Няма актуализации</string>
<string name="variant">Вариант</string> <string name="variant">Вариант</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Успешно запазени логове</string>
<string name="logs_not_saved">Не могат да се запазят логовете</string> <string name="logs_not_saved">Не могат да се запазят логовете</string>
<string name="logs_saved">Успешно запазени логове</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Разширени</string> <string name="advanced">Подробности</string>
<string name="app_install_files_detected">%1$s инсталационни файлове са открити!</string> <string name="app_install_files_detected">%1$s инсталационни файлове са открити!</string>
<string name="app_install_files_detected_summary">Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате?</string> <string name="app_install_files_detected_summary">Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате?</string>
<string name="app_installation_preferences">Предпочитания за инсталация на %1$s</string>
<string name="checking_updates">Проверка за актуализации…</string> <string name="checking_updates">Проверка за актуализации…</string>
<string name="chosen_lang">Език(ци): %1$s</string> <string name="chosen_lang">Език(ци): %1$s</string>
<string name="chosen_theme">Тема: %1$s</string> <string name="chosen_theme">Тема: %1$s</string>
<string name="chosen_version">Версия: %1$s</string> <string name="chosen_version">Версия: %1$s</string>
<string name="error">Грешка</string>
<string name="guide">Ръководство</string> <string name="guide">Ръководство</string>
<string name="hold_on">Стоп!</string> <string name="hold_on">Стоп!</string>
<string name="magisk_vanced">Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller.</string> <string name="magisk_vanced">Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller.</string>
<string name="miui_one_title">MIUI оптимизациите са включени!</string>
<string name="miui_one">За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu)</string> <string name="miui_one">За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu)</string>
<string name="error">Грешка</string> <string name="miui_one_title">MIUI оптимизациите са включени!</string>
<string name="please_be_patient">Моля, НЕ излизайте от приложението по време на този процес!</string>
<string name="redownload">Изтегли отново</string> <string name="redownload">Изтегли отново</string>
<string name="security_context">Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub</string> <string name="security_context">Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub</string>
<string name="app_installation_preferences">Предпочитания за инсталация на %1$s</string>
<string name="version">Версия</string> <string name="version">Версия</string>
<string name="microg_bug">Бъг в microG</string>
<string name="microg_bug_summary">Поради бъг в microG инсталирането на Vanced версия 16 изисква първо да се инсталира версия 15.43.32 след това да влезете в профила си след което може да инсталирате 16 и по-нова. Да се инсталира ли версия 15.43.32?</string>
<string name="microg_bug_summary_music">Поради бъг в microG инсталирането на Music версия 4.11 изисква първо да се инсталира версия 4.07.51 след това да влезете в профила си след което може да инсталирате 4.11 и по-нова. Да се инсталира ли версия 4.07.51?</string>
<string name="please_be_patient">Моля, НЕ излизайте от приложението по време на този процес!</string>
<string name="welcome">Добре дошли</string> <string name="welcome">Добре дошли</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Изберете предпочитани език(ци) за Vanced</string> <string name="choose_preferred_language">Изберете предпочитан(и) език(ци) за Vanced</string>
<string name="install_latest">Най-нова</string> <string name="install_latest">Най-нова</string>
<string name="light_plus_other">Светла + %1$s</string> <string name="light_plus_other">Светла + %1$s</string>
<string name="select_at_least_one_lang">Изберете поне един език!</string> <string name="select_at_least_one_lang">Изберете поне един език!</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Неуспешно`chown` APK към собственика на системата, моля опитайте отново.</string> <string name="chown_fail">Неуспешно`chown` APK към собственика на системата, моля опитайте отново.</string>
<string name="error_downloading">Грешка при изтегляне на %1$s</string> <string name="error_downloading">Грешка при изтегляне на %1$s</string>
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
<string name="failed_accent">Неуспешно задаване на акцентиращ цвят</string> <string name="failed_accent">Неуспешно задаване на акцентиращ цвят</string>
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
<string name="files_missing_va">Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак.</string> <string name="files_missing_va">Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак.</string>
<string name="ifile_missing">Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново.</string> <string name="ifile_missing">Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново.</string>
<string name="installation_aborted">Инсталацията е неуспешна, защото е прекратена от потребителя.</string> <string name="installation_aborted">Инсталацията е неуспешна, защото е прекратена от потребителя.</string>
<string name="installation_blocked">Инсталацията е неуспешна, защото е блокирана от потребителя.</string>
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
<string name="installation_conflict">Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново.</string> <string name="installation_conflict">Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново.</string>
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
<string name="installation_failed">Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени</string> <string name="installation_failed">Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени</string>
<string name="installation_incompatible">Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново.</string> <string name="installation_incompatible">Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново.</string>
<string name="installation_invalid">Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново.</string> <string name="installation_invalid">Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново.</string>
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
<string name="installation_miui">Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново.</string> <string name="installation_miui">Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново.</string>
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
<string name="installation_storage">Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място.</string> <string name="installation_storage">Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място.</string>
<string name="modapk_missing">Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново.</string> <string name="modapk_missing">Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново.</string>
<string name="path_missing">Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране.</string> <string name="path_missing">Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране.</string>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">বাতিল করুন</string> <string name="cancel">বাতিল করুন</string>
<string name="close">বন্ধ করুন</string> <string name="close">বন্ধ করুন</string>
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
<string name="description_vanced">A modified YouTube client with many useful features!</string>
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
<string name="reset">পুনরায় স্থির করুন</string> <string name="reset">পুনরায় স্থির করুন</string>
<string name="save">সংরক্ষণ করুন</string> <string name="save">সংরক্ষণ করুন</string>
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string> <string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">সম্বন্ধে</string> <string name="title_about">সম্বন্ধে</string>
<string name="title_guide">Guide</string> <string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_home">ম্যানেজার</string> <string name="title_home">ম্যানেজার</string>
<string name="title_logs">Logs</string>
<string name="title_settings">সেটিংস</string> <string name="title_settings">সেটিংস</string>
<string name="update_manager">ম্যানেজার আপডেট করুন</string> <string name="update_manager">ম্যানেজার আপডেট করুন</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">আপনার ডিভাইস কি রুটেড?</string> <string name="are_you_rooted">আপনার ডিভাইস কি রুটেড?</string>
<string name="grant_root">রুটের অনুমতি দিন</string> <string name="grant_root">রুটের অনুমতি দিন</string>
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
<string name="select_apps_music">ভ্যান্সড, তবে ইউটিউবের জন্য!\nতুলনামূলক কম ফিচার-বিশিষ্ট কিন্তু আপনার চাহিদা পূরণ করবে।</string>
<string name="select_apps_vanced">ইউটিউব ভ্যান্সড হল স্টক অ্যান্ড্রয়েড ইউটিউব অ্যাপ, তবে আরো ভাল!</string>
<string name="lets_get_started">চলুন শুরু করি</string> <string name="lets_get_started">চলুন শুরু করি</string>
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
<string name="willing_to_use_root">এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন!</string> <string name="willing_to_use_root">এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">সম্পর্কিত তথ্য %1$s</string> <string name="about_app">সম্পর্কিত তথ্য %1$s</string>
<string name="app_changelog_tooltip">পরিবর্তন তালিকা দেখতে কার্ডে ট্যাপ করুন।</string> <string name="accessibility_download">Download</string>
<string name="accessibility_info">Info</string>
<string name="accessibility_launch">Launch</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Uninstall</string>
<string name="accessibility_update">Update</string>
<string name="apps">Apps</string>
<string name="changelog">পরিবর্তন তালিকা</string> <string name="changelog">পরিবর্তন তালিকা</string>
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string> <string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="install">ইনস্টল করুন</string> <string name="install">ইনস্টল করুন</string>
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<string name="latest">সর্বশেষ:</string> <string name="latest">সর্বশেষ:</string>
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string> <string name="no_microg">Install Vanced microG first</string>
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string> <string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="update">আপডেট</string>
<string name="social_media">Social Media</string> <string name="social_media">Social Media</string>
<string name="support_us">Support us</string> <string name="support_us">Support us</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">অ্যাকসেন্ট রঙ</string> <string name="accent_color">অ্যাকসেন্ট রঙ</string>
<string name="category_appearance">চেহারা</string> <string name="category_appearance">চেহারা</string>
<string name="category_behaviour">আচরণ</string> <string name="category_behaviour">আচরণ</string>
<string name="clear_files">ডাউনলোড করা ফাইলগুলি সাফ করুন</string> <string name="clear_files">ডাউনলোড করা ফাইলগুলি সাফ করুন</string>
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string> <string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
<string name="firebase_summary">এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে।</string> <string name="firebase_summary">এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে।</string>
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
<string name="language_title">ভাষা</string> <string name="language_title">ভাষা</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে</string> <string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে</string>
<string name="system_default">সিস্টেম দ্বারা নির্ধারিত</string> <string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তি</string>
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
<string name="script_save_failed">Failed to save new time value</string> <string name="script_save_failed">Failed to save new time value</string>
<string name="script_sleep_timer">Root Script Sleep Time</string> <string name="script_sleep_timer">Root Script Sleep Time</string>
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string> <string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
<string name="system_default">সিস্টেম দ্বারা নির্ধারিত</string>
<string name="theme">থিম</string> <string name="theme">থিম</string>
<string name="theme_dark">গাঢ় থিম</string> <string name="theme_dark">গাঢ় থিম</string>
<string name="theme_light">হালকা থিম</string> <string name="theme_light">হালকা থিম</string>
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তি</string>
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string> <string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
<string name="update_not_found">কোনো নতুন আপডেট নেই</string> <string name="update_not_found">কোনো নতুন আপডেট নেই</string>
<string name="variant">রকমফের</string> <string name="variant">রকমফের</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string> <string name="logs_not_saved">Could not save logs</string>
<string name="logs_saved">Successfully saved logs</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">সূক্ষ্ম</string> <string name="advanced">Details</string>
<string name="app_install_files_detected">%1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে!</string> <string name="app_install_files_detected">%1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে!</string>
<string name="app_install_files_detected_summary">ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান?</string> <string name="app_install_files_detected_summary">ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান?</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="checking_updates">আপডেট আছে কিনা দেখা হচ্ছে…</string> <string name="checking_updates">আপডেট আছে কিনা দেখা হচ্ছে…</string>
<string name="chosen_lang">ভাষা (গুলি):%1$s</string> <string name="chosen_lang">ভাষা (গুলি):%1$s</string>
<string name="chosen_theme">থিম: %1$s</string> <string name="chosen_theme">থিম: %1$s</string>
<string name="chosen_version">ভার্সন: %1$s</string> <string name="chosen_version">ভার্সন: %1$s</string>
<string name="error">ত্রুটি</string>
<string name="guide">সহায়িকা</string> <string name="guide">সহায়িকা</string>
<string name="hold_on">থামো!</string> <string name="hold_on">থামো!</string>
<string name="magisk_vanced">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.</string> <string name="magisk_vanced">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.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="miui_one">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)</string> <string name="miui_one">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)</string>
<string name="error">ত্রুটি</string> <string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="redownload">Redownload</string> <string name="redownload">Redownload</string>
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string> <string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="microg_bug">Bug in microG</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">স্বাগতম</string> <string name="welcome">স্বাগতম</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string> <string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string> <string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string> <string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
<string name="failed_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
<string name="failed_accent">Failed to apply new accent color</string> <string name="failed_accent">Failed to apply new accent color</string>
<string name="failed_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
<string name="files_missing_va">সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন.</string> <string name="files_missing_va">সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন.</string>
<string name="ifile_missing">স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string> <string name="ifile_missing">স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
<string name="installation_aborted">Installation failed because the user aborted the installation.</string> <string name="installation_aborted">Installation failed because the user aborted the installation.</string>
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string> <string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string> <string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_invalid">অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string> <string name="installation_invalid">অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।.</string> <string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
<string name="modapk_missing">ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string> <string name="modapk_missing">ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="path_missing">ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ.</string> <string name="path_missing">ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ.</string>

View File

@ -3,117 +3,118 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">বাতিল করুন</string> <string name="cancel">বাতিল করুন</string>
<string name="close">বন্ধ করুন</string> <string name="close">বন্ধ করুন</string>
<string name="description_microg">মাইক্রোজি প্রকল্পের ভিত্তিতে ভ্যান্সডের জন্য একটি কাস্টম জিএমএস বাস্তবায়ন।.</string>
<string name="description_vanced">অনেক দরকারী বৈশিষ্ট্য সহ একটি পরিবর্তিত ইউটিউব ক্লায়েন্ট!</string>
<string name="description_vanced_music">ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য! তুলনামূলকভাবে কম বৈশিষ্ট্য সমৃদ্ধ তবে আপনার চাহিদা পূরণ করবে।.</string>
<string name="reset">পুনরায় স্থির করুন</string> <string name="reset">পুনরায় স্থির করুন</string>
<string name="save">সংরক্ষণ করুন</string> <string name="save">সংরক্ষণ করুন</string>
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string> <string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">সম্বন্ধে</string> <string name="title_about">সম্বন্ধে</string>
<string name="title_guide">Guide</string> <string name="title_guide">গাইড</string>
<string name="title_logs">Logs</string>
<string name="title_home">ম্যানেজার</string> <string name="title_home">ম্যানেজার</string>
<string name="title_logs">লগস</string>
<string name="title_settings">সেটিংস</string> <string name="title_settings">সেটিংস</string>
<string name="update_manager">ম্যানেজার আপডেট করুন</string> <string name="update_manager">ম্যানেজার আপডেট করুন</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে?</string> <string name="are_you_rooted">আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে?</string>
<string name="grant_root">রুট অনুমতি মঞ্জুর করুন</string> <string name="grant_root">রুট অনুমতি মঞ্জুর করুন</string>
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
<string name="select_apps_music">ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য!\nতুলনামূলকভাবে কম বৈশিষ্ট্যযুক্ত, তবে আপনার চাহিদা পূরণ করবে।</string>
<string name="select_apps_vanced">ইউটিউব ভ্যান্সড হল স্টক অ্যান্ড্রয়েড ইউটিউব অ্যাপ, তবে আরো ভাল!</string>
<string name="lets_get_started">শুরু করা যাক</string> <string name="lets_get_started">শুরু করা যাক</string>
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string> <string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
<string name="willing_to_use_root">এটি কি তা জানেন না বা রুট ভার্সনটি ব্যবহার করতে চান না? কেবল নীচের নীল তীর চিহ্নটি ক্লিক করুন!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">%1$s এর সম্বন্ধে</string> <string name="about_app">%1$s এর সম্বন্ধে</string>
<string name="app_changelog_tooltip">পরিবর্তন নথি দেখতে কার্ডে আলতো চাপুন।</string> <string name="accessibility_download">ডাউনলোড</string>
<string name="accessibility_info">তথ্য</string>
<string name="accessibility_launch">লঞ্চ করুন</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">আনইনস্টল</string>
<string name="accessibility_update">আপডেট</string>
<string name="apps">অ্যাপস</string>
<string name="changelog">পরিবর্তন নথি</string> <string name="changelog">পরিবর্তন নথি</string>
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string> <string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="install">ইনস্টল করুন</string> <string name="install">ইনস্টল করুন</string>
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<string name="latest">সর্বশেষ:</string> <string name="latest">সর্বশেষ:</string>
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string> <string name="no_microg">প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন</string>
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string> <string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
<string name="social_media">সোশ্যাল মিডিয়া</string>
<string name="support_us">আমাদের সমর্থন করুন</string>
<string name="unavailable">অনুপলব্ধ</string> <string name="unavailable">অনুপলব্ধ</string>
<string name="update">আপডেট</string> <string name="version_installed">ইনস্টল করা আছে:</string>
<string name="social_media">সামাজিক মাধ্যম</string>
<string name="support_us">আমাদের সমর্থন</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">অ্যাকসেন্ট রঙ</string> <string name="accent_color">অ্যাকসেন্ট রঙ</string>
<string name="category_appearance">রূপ</string> <string name="category_appearance">রূপ</string>
<string name="category_behaviour">আচরণ</string> <string name="category_behaviour">আচরণ</string>
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string> <string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string> <string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string> <string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
<string name="language_title">ভাষা</string> <string name="language_title">ভাষা</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে</string> <string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তিগুলি</string>
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
<string name="script_save_failed">নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ হয়েছে</string>
<string name="script_sleep_timer">রুট স্ক্রিপ্ট স্লিপ টাইম</string>
<string name="script_sleep_timer_description">মাউন্টিং ইস্যু ফিক্স করার জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত স্লিপ টাইম মানটি অ্যাডজাস্ট করুন</string>
<string name="system_default">সিস্টেম দ্বারা র্নির্ধারিত</string> <string name="system_default">সিস্টেম দ্বারা র্নির্ধারিত</string>
<string name="script_save_failed">নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ</string>
<string name="script_sleep_timer">রুট স্ক্রিপ্ট ঘুম সময়</string>
<string name="script_sleep_timer_description">মাউন্টিং ইস্যু সমাধানের জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত ঘুমের মানটি সামঞ্জস্য করুন</string>
<string name="theme">থিম</string> <string name="theme">থিম</string>
<string name="theme_dark">গাঢ় থিম</string> <string name="theme_dark">গাঢ় থিম</string>
<string name="theme_light">হালকা থিম</string> <string name="theme_light">হালকা থিম</string>
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তিগুলি</string>
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string> <string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
<string name="update_not_found">কোনো নতুন আপডেট নেই</string> <string name="update_not_found">কোনো নতুন আপডেট নেই</string>
<string name="variant">বিকল্প</string> <string name="variant">বিকল্প</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Successfully saved logs</string> <string name="logs_not_saved">লগগুলি সংরক্ষণ করা যায়নি</string>
<string name="logs_not_saved">Could not save logs</string> <string name="logs_saved">সফলভাবে লগ সংরক্ষণ করা হয়েছে</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">উন্নত</string> <string name="advanced">বিশদ</string>
<string name="app_install_files_detected">ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে!</string> <string name="app_install_files_detected">ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে!</string>
<string name="app_install_files_detected_summary">%1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান?</string> <string name="app_install_files_detected_summary">%1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান?</string>
<string name="app_installation_preferences">%1$s ইনস্টল করার পছন্দগুলি</string>
<string name="checking_updates">আপডেটের জন্য চেক করা হচ্ছে…</string> <string name="checking_updates">আপডেটের জন্য চেক করা হচ্ছে…</string>
<string name="chosen_lang">ভাষা(গুলি): %1$s</string> <string name="chosen_lang">ভাষা(গুলি): %1$s</string>
<string name="chosen_theme">থিম: %1$s</string> <string name="chosen_theme">থিম: %1$s</string>
<string name="chosen_version">সংস্করণ: %1$s</string> <string name="chosen_version">সংস্করণ: %1$s</string>
<string name="error">ত্রুটি</string>
<string name="guide">সহায়িকা</string> <string name="guide">সহায়িকা</string>
<string name="hold_on">থামুন!</string> <string name="hold_on">থামুন!</string>
<string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</string> <string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string> <string name="miui_one">ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন)</string>
<string name="miui_one">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)</string> <string name="miui_one_title">MIUI অপটিমাইজেশন সক্ষম করা আছে!</string>
<string name="error">ত্রুটি</string> <string name="please_be_patient">এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না!</string>
<string name="redownload">পুনরায় ডাউনলোড করুন</string> <string name="redownload">পুনরায় ডাউনলোড করুন</string>
<string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string> <string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string>
<string name="app_installation_preferences">%1$s ইনস্টল করার পছন্দগুলি</string>
<string name="version">সংস্করণ</string> <string name="version">সংস্করণ</string>
<string name="microg_bug">মাইক্রোজি মধ্যে বাগ</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">স্বাগত</string> <string name="welcome">স্বাগত</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন</string> <string name="choose_preferred_language">ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন</string>
<string name="install_latest">Latest</string> <string name="install_latest">সর্বশেষ</string>
<string name="light_plus_other">হাল্কা + %1$s</string> <string name="light_plus_other">হাল্কা + %1$s</string>
<string name="select_at_least_one_lang">অন্তত একটি ভাষা নির্বাচন করুন!</string> <string name="select_at_least_one_lang">অন্তত একটি ভাষা নির্বাচন করুন!</string>
<string name="vanced_black">Black</string> <string name="vanced_black">কালো</string>
<string name="vanced_dark">Dark</string> <string name="vanced_dark">অন্ধকার</string>
<!-- About Page --> <!-- About Page -->
<string name="manager_dev">ম্যানেজার বিকাশকারীরা</string> <string name="manager_dev">ম্যানেজার বিকাশকারীরা</string>
<string name="other_contributors">Other Contributors</string> <string name="other_contributors">অন্যান্য অবদানকারী</string>
<string name="sources">উৎসগুলি</string> <string name="sources">উৎসগুলি</string>
<string name="vanced_team">ভ্যান্সড টীম</string> <string name="vanced_team">ভ্যান্সড টীম</string>
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string> <string name="chown_fail">System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string> <string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ হয়েছে</string>
<string name="failed_uninstall">%1$s পেকেজ আন‌ইনস্টল করা যাইনি</string> <string name="failed_uninstall">%1$s পেকেজ আন‌ইনস্টল করা যাইনি</string>
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ</string>
<string name="files_missing_va">ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন।</string> <string name="files_missing_va">ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="ifile_missing">স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string> <string name="ifile_missing">স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
<string name="installation_aborted">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন।</string> <string name="installation_aborted">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন।</string>
<string name="installation_blocked">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা অবরুদ্ধ করেছেন।</string> <string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string> <string name="installation_downgrade">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব রয়েছে ts অ্যাপ্লিকেশনটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।.</string> <string name="installation_failed">অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string> <string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string> <string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string>
<string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string> <string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_storage">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা নেই।</string>
<string name="modapk_missing">ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।</string> <string name="modapk_missing">ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="path_missing">স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ।</string> <string name="path_missing">স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ।</string>
</resources> </resources>

View File

@ -1,89 +1,91 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources> <resources>
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">Cancel</string> <string name="cancel">Cancel·lar</string>
<string name="close">Tanca</string> <string name="close">Tanca</string>
<string name="description_microg">Implementació modificada de GMS per a Cancer basada en el Projecte microG.</string>
<string name="description_vanced">Una aplicació modificada de YouTube amb moltes característiques útils!</string>
<string name="description_vanced_music">Vanced, però per a YouTube Music! Amb relativament menys característiques, però que assoleix les vostres necessitats.</string>
<string name="reset">Restableix</string> <string name="reset">Restableix</string>
<string name="save">Desa</string> <string name="save">Desa</string>
<string name="select_apps">Select Your Apps</string> <string name="select_apps">Seleccioneu les aplicacions</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">Quant a</string> <string name="title_about">Quant a</string>
<string name="title_guide">Guide</string> <string name="title_guide">Guia</string>
<string name="title_logs">Logs</string>
<string name="title_home">Gestor</string> <string name="title_home">Gestor</string>
<string name="title_logs">Registre</string>
<string name="title_settings">Configuració</string> <string name="title_settings">Configuració</string>
<string name="update_manager">Update Manager</string> <string name="update_manager">Gestionador d\'actualitzacions</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Is Your Device Rooted?</string> <string name="are_you_rooted">Té el vostre dispositiu accés de Superusuari (\'Root\')?</string>
<string name="grant_root">Grant Root Permission</string> <string name="grant_root">Concedir permís de Superusuari (\'Root\')</string>
<string name="select_at_least_one_app">Select at least one app!</string> <string name="lets_get_started">Comencem-hi</string>
<string name="select_apps_music">Vanced, but for YouTube Music!\nrelatively less feature-rich but fulfills your needs.</string> <string name="select_at_least_one_app">Selecciona com a mínim una aplicació!</string>
<string name="select_apps_vanced">YouTube Vanced is the stock Android YouTube App, but better!</string> <string name="willing_to_use_root">No saps què és o no vols utilitzar la versió de Superusuari (\'Root\')? Simplement clica la fletxa blava de sota!</string>
<string name="lets_get_started">Let\'s get started</string>
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">About %1$s</string> <string name="about_app">Sobre %1$s</string>
<string name="app_changelog_tooltip">Tap on the card to see the changelog.</string> <string name="accessibility_download">Descarrega</string>
<string name="changelog">Changelog</string> <string name="accessibility_info">Informació</string>
<string name="accessibility_launch">Llança</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Desinstal·la</string>
<string name="accessibility_update">Actualitza</string>
<string name="apps">Aplicacions</string>
<string name="changelog">Registre de canvis</string>
<string name="downloading_file">Descarregant %1$s</string> <string name="downloading_file">Descarregant %1$s</string>
<string name="install">Instal·lar</string> <string name="install">Instal·lar</string>
<string name="button_reinstall">Reinstal·la</string>
<string name="version_installed">Instal·lat:</string>
<string name="latest">Darrera:</string> <string name="latest">Darrera:</string>
<string name="no_microg">microG no està instal·lat</string> <string name="no_microg">Instal·la primer Vanced microG</string>
<string name="root_not_granted">L\'accés arrel no s\'ha concedit</string> <string name="root_not_granted">L\'accés arrel no s\'ha concedit</string>
<string name="social_media">Xarxes socials</string>
<string name="support_us">Dóna\'ns suport</string>
<string name="unavailable">No disponible</string> <string name="unavailable">No disponible</string>
<string name="update">Actualitza</string> <string name="version_installed">Instal·lat:</string>
<string name="social_media">Social Media</string>
<string name="support_us">Support us</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Color d\'èmfasi</string> <string name="accent_color">Color d\'èmfasi</string>
<string name="category_appearance">Appearance</string> <string name="category_appearance">Aparença</string>
<string name="category_behaviour">Behavior</string> <string name="category_behaviour">Comportament</string>
<string name="clear_files">Esborrar fitxers descarregats</string> <string name="clear_files">Esborrar fitxers descarregats</string>
<string name="cleared_files">Fitxers netejats correctament</string> <string name="cleared_files">Fitxers netejats correctament</string>
<string name="firebase_title">Firebase Analytics</string> <string name="firebase_summary">Permet-te\'ns recollir informació sobre el rendiment de l\'aplicació i els registres d\'error</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string> <string name="firebase_title">Estadístiques de Firebase</string>
<string name="language_title">Language</string> <string name="language_title">Llengua</string>
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</string>
<string name="link_custom_tabs">Els enllaços s\'obriran en pestanyes personalitzades del Chrome</string> <string name="link_custom_tabs">Els enllaços s\'obriran en pestanyes personalitzades del Chrome</string>
<string name="system_default">System Default</string> <string name="link_title">Utilitza pestanyes personalitzades del Chrome</string>
<string name="script_save_failed">Failed to save new time value</string> <string name="push_notifications">%1$s notificacions automàtiques</string>
<string name="script_sleep_timer">Root Script Sleep Time</string> <string name="push_notifications_summary">Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s</string>
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string> <string name="script_save_failed">Error a l\'hora de guardar un nou valor de temps</string>
<string name="script_sleep_timer">Temps de repòs de la seqüència de comandes de Superusuari (\'Root\')</string>
<string name="script_sleep_timer_description">Ajusta el temps de repòs emprat a l\'script /data/adb/service.d/app.sh, útil per solventar problemes de muntatge</string>
<string name="system_default">Per defecte del sistema</string>
<string name="theme">Tema</string> <string name="theme">Tema</string>
<string name="theme_dark">Tema fosc</string> <string name="theme_dark">Tema fosc</string>
<string name="theme_light">Tema clar</string> <string name="theme_light">Tema clar</string>
<string name="push_notifications">%1$s notificacions automàtiques</string>
<string name="push_notifications_summary">Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s</string>
<string name="update_center">Gestor d\'actualitzacions</string> <string name="update_center">Gestor d\'actualitzacions</string>
<string name="update_not_found">Cap actualització</string> <string name="update_not_found">Cap actualització</string>
<string name="variant">Variant</string> <string name="variant">Variant</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Successfully saved logs</string> <string name="logs_not_saved">No s\'han pogut desar els registres</string>
<string name="logs_not_saved">Could not save logs</string> <string name="logs_saved">Registres desats satisfactòriament</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Advanced</string> <string name="advanced">Detalls</string>
<string name="app_install_files_detected">%1$s installation files detected!</string> <string name="app_install_files_detected">Arxius d\'instal·lació de %1$s detectats!</string>
<string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string> <string name="app_install_files_detected_summary">El gestionador ha trobat tots els arxius necessaris per a l\'instal·lació de %1$s. Voleu instalar-ho?</string>
<string name="checking_updates">Checking for updates…</string> <string name="app_installation_preferences">Preferències d\'instal·lació de %1$s</string>
<string name="chosen_lang">Idioma: %1$s</string> <string name="checking_updates">Cercant actualitzacions…</string>
<string name="chosen_lang">Llengua(es): %1$s</string>
<string name="chosen_theme">Tema: %1$s</string> <string name="chosen_theme">Tema: %1$s</string>
<string name="chosen_version">Version: %1$s</string> <string name="chosen_version">Versió: %1$s</string>
<string name="guide">Guia</string>
<string name="hold_on">Atura!</string>
<string name="magisk_vanced">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.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="miui_one">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)</string>
<string name="error">Error</string> <string name="error">Error</string>
<string name="guide">Guia</string>
<string name="hold_on">Atura\'t!</string>
<string name="magisk_vanced">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.</string>
<string name="miui_one">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)</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="redownload">Redownload</string> <string name="redownload">Redownload</string>
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string> <string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="microg_bug">Bug in microG</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">Benvingut</string> <string name="welcome">Benvingut</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string> <string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string> <string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
<string name="error_downloading">Error en descarregar %1$s</string> <string name="error_downloading">Error en descarregar %1$s</string>
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
<string name="failed_accent">Failed to apply new accent color</string> <string name="failed_accent">Failed to apply new accent color</string>
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string> <string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string> <string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
<string name="installation_aborted">Installation failed because the user aborted the installation.</string> <string name="installation_aborted">Installation failed because the user aborted the installation.</string>
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string> <string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
<string name="installation_incompatible">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.</string> <string name="installation_incompatible">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.</string>
<string name="installation_invalid">La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar.</string> <string name="installation_invalid">La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar.</string>
<string name="installation_signature">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.</string>
<string name="installation_miui">La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar.</string> <string name="installation_miui">La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar.</string>
<string name="installation_signature">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.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string> <string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string> <string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">هەڵوەشاندنەوە</string> <string name="cancel">هەڵوەشاندنەوە</string>
<string name="close">داخستن</string> <string name="close">داخستن</string>
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
<string name="description_vanced">A modified YouTube client with many useful features!</string>
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
<string name="reset">ڕێکخستنەوە</string> <string name="reset">ڕێکخستنەوە</string>
<string name="save">پاراستن</string> <string name="save">پاراستن</string>
<string name="select_apps">بەرنامەکانت دیاریبکە</string> <string name="select_apps">بەرنامەکانت دیاریبکە</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">دەربارە</string> <string name="title_about">دەربارە</string>
<string name="title_guide">زانیاری</string> <string name="title_guide">زانیاری</string>
<string name="title_logs">تۆماری نوێکاری</string>
<string name="title_home">بەرێوەبردن</string> <string name="title_home">بەرێوەبردن</string>
<string name="title_logs">تۆماری نوێکاری</string>
<string name="title_settings">ڕێکخستنەکان</string> <string name="title_settings">ڕێکخستنەکان</string>
<string name="update_manager">نوێکردنەوەی بەرنامە</string> <string name="update_manager">نوێکردنەوەی بەرنامە</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">مۆبایلەکەت ڕۆت کراوە؟</string> <string name="are_you_rooted">مۆبایلەکەت ڕۆت کراوە؟</string>
<string name="grant_root">ڕێگەپێدانی ڕۆت Root</string> <string name="grant_root">ڕێگەپێدانی ڕۆت Root</string>
<string name="select_at_least_one_app">لانیکەم دانەیەک دیاریبکە!</string>
<string name="select_apps_music">Vanced، بەڵام بۆ یوتوب میوزیک!\nتایبەتمەندی کەمتر بەڵام پڕتر لە پێویستیەکانت.</string>
<string name="select_apps_vanced">YouTube Vanced هەمان بەرنامەی یوتوبە بەڵام بەشێوەکی باشتر!</string>
<string name="lets_get_started">دەست پێکردن</string> <string name="lets_get_started">دەست پێکردن</string>
<string name="select_at_least_one_app">لانیکەم دانەیەک دیاریبکە!</string>
<string name="willing_to_use_root">ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا!</string> <string name="willing_to_use_root">ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">دەربارەی %1$s</string> <string name="about_app">دەربارەی %1$s</string>
<string name="app_changelog_tooltip">پەنجەی پێدابنێ بۆ بینینی گۆڕانکارییەکان.</string> <string name="accessibility_download">Download</string>
<string name="accessibility_info">Info</string>
<string name="accessibility_launch">Launch</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Uninstall</string>
<string name="accessibility_update">Update</string>
<string name="apps">بەرنامەکان</string>
<string name="changelog">گۆڕانکارییەکان</string> <string name="changelog">گۆڕانکارییەکان</string>
<string name="downloading_file">داگرتنی %1$s</string> <string name="downloading_file">داگرتنی %1$s</string>
<string name="install">دامەزراندن</string> <string name="install">دامەزراندن</string>
<string name="button_reinstall">دامەزراندنەوە</string>
<string name="version_installed">دامەزرێنراو:</string>
<string name="latest">دوایین:</string> <string name="latest">دوایین:</string>
<string name="no_microg">دانەبەزێنراوە microG</string> <string name="no_microg">Install Vanced microG first</string>
<string name="root_not_granted">ڕێگەپێدانی Root نەدراوە</string> <string name="root_not_granted">ڕێگەپێدانی Root نەدراوە</string>
<string name="unavailable">بەردەست نیە</string>
<string name="update">نوێکردنەوە</string>
<string name="social_media">تۆڕە کۆمەڵایەتییەکان</string> <string name="social_media">تۆڕە کۆمەڵایەتییەکان</string>
<string name="support_us">پشتگیریکردن</string> <string name="support_us">پشتگیریکردن</string>
<string name="unavailable">بەردەست نیە</string>
<string name="version_installed">دامەزرێنراو:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">ڕەنگی سەرەکی</string> <string name="accent_color">ڕەنگی سەرەکی</string>
<string name="category_appearance">ڕووکار</string> <string name="category_appearance">ڕووکار</string>
<string name="category_behaviour">ڕێکخستن</string> <string name="category_behaviour">ڕێکخستن</string>
<string name="clear_files">سڕینەوەی فایلە داگیراوەکان</string> <string name="clear_files">سڕینەوەی فایلە داگیراوەکان</string>
<string name="cleared_files">فایلەکان بەسەرکەتوویی سڕانەوە</string> <string name="cleared_files">فایلەکان بەسەرکەتوویی سڕانەوە</string>
<string name="firebase_title">Firebase شیکردنەوەی</string>
<string name="firebase_summary">کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا </string> <string name="firebase_summary">کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا </string>
<string name="firebase_title">Firebase شیکردنەوەی</string>
<string name="language_title">زمان</string> <string name="language_title">زمان</string>
<string name="link_title">بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم</string>
<string name="link_custom_tabs">بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە</string> <string name="link_custom_tabs">بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە</string>
<string name="system_default">سیستەم</string> <string name="link_title">بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم</string>
<string name="push_notifications">%1$s وەرگرتنی ئاگادارکردنەوەکان</string>
<string name="push_notifications_summary">وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا</string>
<string name="script_save_failed">پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو</string> <string name="script_save_failed">پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو</string>
<string name="script_sleep_timer">Root Script Sleep Time</string> <string name="script_sleep_timer">ماوەی وەستاندنی سکریپتی Root</string>
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string> <string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
<string name="system_default">سیستەم</string>
<string name="theme">ڕووکار</string> <string name="theme">ڕووکار</string>
<string name="theme_dark">تاریک</string> <string name="theme_dark">تاریک</string>
<string name="theme_light">ڕووناک</string> <string name="theme_light">ڕووناک</string>
<string name="push_notifications">%1$s وەرگرتنی ئاگادارکردنەوەکان</string>
<string name="push_notifications_summary">وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا</string>
<string name="update_center">ناوەندی نوێکردنەوە</string> <string name="update_center">ناوەندی نوێکردنەوە</string>
<string name="update_not_found">هیچ نوێکردنەوەیەک نیە</string> <string name="update_not_found">هیچ نوێکردنەوەیەک نیە</string>
<string name="variant">جۆر</string> <string name="variant">جۆر</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Successfully saved logs</string> <string name="logs_not_saved">نەتوانرا تۆمارەکە بپارێزرێت</string>
<string name="logs_not_saved">Could not save logs</string> <string name="logs_saved">تۆمارەکە بەسەرکەوتوویی پارێزرا</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">پێشکەوتوو</string> <string name="advanced">Details</string>
<string name="app_install_files_detected">%1$s فایل دۆزرایەوە بۆ دابەزاندن!</string> <string name="app_install_files_detected">%1$s فایل دۆزرایەوە بۆ دابەزاندن!</string>
<string name="app_install_files_detected_summary">بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟</string> <string name="app_install_files_detected_summary">بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟</string>
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</string>
<string name="checking_updates">پشکنین بۆ نوێکردنەوە…</string> <string name="checking_updates">پشکنین بۆ نوێکردنەوە…</string>
<string name="chosen_lang">زمان: %1$s</string> <string name="chosen_lang">زمان: %1$s</string>
<string name="chosen_theme">ڕووکار: %1$s</string> <string name="chosen_theme">ڕووکار: %1$s</string>
<string name="chosen_version">وەشان: %1$s</string> <string name="chosen_version">وەشان: %1$s</string>
<string name="error">هەڵەیەک ڕوویدا</string>
<string name="guide">زانیاری</string> <string name="guide">زانیاری</string>
<string name="hold_on">وەستاندن!</string> <string name="hold_on">وەستاندن!</string>
<string name="magisk_vanced">تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced.</string> <string name="magisk_vanced">تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced.</string>
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
<string name="miui_one">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)</string> <string name="miui_one">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)</string>
<string name="error">هەڵەیەک ڕوویدا</string> <string name="miui_one_title">باشترکردنی MIUI چالاککراوە!</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="redownload">داگرتنەوە</string> <string name="redownload">داگرتنەوە</string>
<string name="security_context">دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە</string> <string name="security_context">دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە</string>
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</string>
<string name="version">وەشان</string> <string name="version">وەشان</string>
<string name="microg_bug">Bug in microG</string>
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
<string name="welcome">بەخێربێیت</string> <string name="welcome">بەخێربێیت</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە</string> <string name="choose_preferred_language">زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە</string>
@ -94,25 +96,24 @@
<string name="vanced_dark">تاریک</string> <string name="vanced_dark">تاریک</string>
<!-- About Page --> <!-- About Page -->
<string name="manager_dev">کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید)</string> <string name="manager_dev">کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید)</string>
<string name="other_contributors">Other Contributors</string> <string name="other_contributors">وەرگێڕانی کوردی - گۆران غەریب </string>
<string name="sources">سەرچاوەکان</string> <string name="sources">سەرچاوەکان</string>
<string name="vanced_team">Vanced تیمی</string> <string name="vanced_team">Vanced تیمی</string>
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە.</string> <string name="chown_fail">سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە.</string>
<string name="error_downloading">کێشە ڕوویدا لە داگرتنی %1$s</string> <string name="error_downloading">کێشە ڕوویدا لە داگرتنی %1$s</string>
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
<string name="failed_accent">گۆڕینی ڕەنگ سەرکەوتو نەبوو</string> <string name="failed_accent">گۆڕینی ڕەنگ سەرکەوتو نەبوو</string>
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
<string name="files_missing_va">سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە.</string> <string name="files_missing_va">سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="ifile_missing">سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە.</string> <string name="ifile_missing">سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە.</string>
<string name="installation_aborted">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە.</string> <string name="installation_aborted">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە.</string>
<string name="installation_blocked">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر ڕێگریکرد لە دابەزاندنەکە.</string>
<string name="installation_downgrade">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە.</string>
<string name="installation_conflict">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string> <string name="installation_conflict">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="installation_downgrade">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string> <string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
<string name="installation_incompatible">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string> <string name="installation_incompatible">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="installation_invalid">دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە.</string> <string name="installation_invalid">دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە.</string>
<string name="installation_signature">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="installation_miui">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە.</string> <string name="installation_miui">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە.</string>
<string name="installation_signature">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string> <string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
<string name="modapk_missing">سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە.</string> <string name="modapk_missing">سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە.</string>
<string name="path_missing">سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان.</string> <string name="path_missing">سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان.</string>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">Zrušit</string> <string name="cancel">Zrušit</string>
<string name="close">Zavřít</string> <string name="close">Zavřít</string>
<string name="description_microg">Vlastní implementace GMS pro Vanced založená na projektu microG.</string>
<string name="description_vanced">Upravený klient YouTube se spoustou užitečných funkcí!</string>
<string name="description_vanced_music">Vanced, ale YouTube Music! Obsahuje o trochu méně funkcí, ale splní vaše potřeby.</string>
<string name="reset">Resetovat</string> <string name="reset">Resetovat</string>
<string name="save">Uložit</string> <string name="save">Uložit</string>
<string name="select_apps">Vyberte své aplikace</string> <string name="select_apps">Vyberte své aplikace</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">O aplikaci</string> <string name="title_about">O aplikaci</string>
<string name="title_guide">Průvodce</string> <string name="title_guide">Průvodce</string>
<string name="title_logs">Záznamy</string>
<string name="title_home">Manager</string> <string name="title_home">Manager</string>
<string name="title_logs">Záznamy</string>
<string name="title_settings">Nastavení</string> <string name="title_settings">Nastavení</string>
<string name="update_manager">Aktualizovat Manager</string> <string name="update_manager">Aktualizovat Manager</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Má vaše zařízení oprávnění root?</string> <string name="are_you_rooted">Má vaše zařízení oprávnění root?</string>
<string name="grant_root">Udělit oprávnění root</string> <string name="grant_root">Udělit oprávnění root</string>
<string name="select_at_least_one_app">Vyberte alespoň jednu aplikaci!</string>
<string name="select_apps_music">Vanced, ale YouTube Music!\nObsahuje o trochu méně funkcí, ale splní vaše potřeby.</string>
<string name="select_apps_vanced">YouTube Vanced je vylepšená výchozí aplikace YouTube!</string>
<string name="lets_get_started">Začínáme</string> <string name="lets_get_started">Začínáme</string>
<string name="select_at_least_one_app">Vyberte alespoň jednu aplikaci!</string>
<string name="willing_to_use_root">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!</string> <string name="willing_to_use_root">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!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">O aplikaci %1$s</string> <string name="about_app">O aplikaci %1$s</string>
<string name="app_changelog_tooltip">Klepnutím na kartu zobrazíte seznam změn.</string> <string name="accessibility_download">Stáhnout</string>
<string name="accessibility_info">Informace</string>
<string name="accessibility_launch">Spustit</string>
<string name="accessibility_reinstall">Přeinstalovat</string>
<string name="accessibility_uninstall">Odinstalovat</string>
<string name="accessibility_update">Aktualizovat</string>
<string name="apps">Aplikace</string>
<string name="changelog">Seznam změn</string> <string name="changelog">Seznam změn</string>
<string name="downloading_file">Stahování %1$s</string> <string name="downloading_file">Stahování %1$s</string>
<string name="install">Nainstalovat</string> <string name="install">Nainstalovat</string>
<string name="button_reinstall">Přeinstalovat</string>
<string name="version_installed">Nainstalováno:</string>
<string name="latest">Nejnovější:</string> <string name="latest">Nejnovější:</string>
<string name="no_microg">microG není nainstalováno</string> <string name="no_microg">Nejprve nainstalujte Vanced microG</string>
<string name="root_not_granted">Root přístup nebyl udělen</string> <string name="root_not_granted">Root přístup nebyl udělen</string>
<string name="unavailable">Není k dispozici</string>
<string name="update">Aktualizovat</string>
<string name="social_media">Sociální média</string> <string name="social_media">Sociální média</string>
<string name="support_us">Podpořte nás</string> <string name="support_us">Podpořte nás</string>
<string name="unavailable">Není k dispozici</string>
<string name="version_installed">Nainstalováno:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Doplňková barva</string> <string name="accent_color">Doplňková barva</string>
<string name="category_appearance">Vzhled</string> <string name="category_appearance">Vzhled</string>
<string name="category_behaviour">Chování</string> <string name="category_behaviour">Chování</string>
<string name="clear_files">Vymazat stažené soubory</string> <string name="clear_files">Vymazat stažené soubory</string>
<string name="cleared_files">Vymazání souborů proběhlo úspěšně</string> <string name="cleared_files">Vymazání souborů proběhlo úspěšně</string>
<string name="firebase_title">Firebase analytika</string>
<string name="firebase_summary">Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání</string> <string name="firebase_summary">Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání</string>
<string name="firebase_title">Firebase analytika</string>
<string name="language_title">Jazyk</string> <string name="language_title">Jazyk</string>
<string name="link_title">Používat vlastní karty prohlížeče Chrome</string>
<string name="link_custom_tabs">Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome</string> <string name="link_custom_tabs">Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome</string>
<string name="system_default">Výchozí systémové nastavení</string> <string name="link_title">Používat vlastní karty prohlížeče Chrome</string>
<string name="push_notifications">%1$s vyskakovací oznámení</string>
<string name="push_notifications_summary">Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení</string>
<string name="script_save_failed">Nepodařilo se uložit novou hodnotu času</string> <string name="script_save_failed">Nepodařilo se uložit novou hodnotu času</string>
<string name="script_sleep_timer">Doba nečinnosti kořenového skriptu</string> <string name="script_sleep_timer">Doba nečinnosti kořenového skriptu</string>
<string name="script_sleep_timer_description">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</string> <string name="script_sleep_timer_description">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</string>
<string name="system_default">Výchozí systémové nastavení</string>
<string name="theme">Motiv</string> <string name="theme">Motiv</string>
<string name="theme_dark">Tmavý motiv</string> <string name="theme_dark">Tmavý motiv</string>
<string name="theme_light">Světlý motiv</string> <string name="theme_light">Světlý motiv</string>
<string name="push_notifications">%1$s vyskakovací oznámení</string>
<string name="push_notifications_summary">Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení</string>
<string name="update_center">Centrum aktualizací aplikace Manager</string> <string name="update_center">Centrum aktualizací aplikace Manager</string>
<string name="update_not_found">Žádné nové aktualizace</string> <string name="update_not_found">Žádné nové aktualizace</string>
<string name="variant">Varianta</string> <string name="variant">Varianta</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Záznamy byly úspěšně uloženy</string>
<string name="logs_not_saved">Záznamy nelze uložit</string> <string name="logs_not_saved">Záznamy nelze uložit</string>
<string name="logs_saved">Záznamy byly úspěšně uloženy</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Pokročilé</string> <string name="advanced">Podrobnosti</string>
<string name="app_install_files_detected">Počet zjištěných instalačních souborů: %1$s</string> <string name="app_install_files_detected">Počet zjištěných instalačních souborů: %1$s</string>
<string name="app_install_files_detected_summary">Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat?</string> <string name="app_install_files_detected_summary">Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat?</string>
<string name="app_installation_preferences">Předvolby instalace: %1$s</string>
<string name="checking_updates">Kontrola aktualizací…</string> <string name="checking_updates">Kontrola aktualizací…</string>
<string name="chosen_lang">Jazyk(y): %1$s</string> <string name="chosen_lang">Jazyk(y): %1$s</string>
<string name="chosen_theme">Motiv: %1$s</string> <string name="chosen_theme">Motiv: %1$s</string>
<string name="chosen_version">Verze: %1$s</string> <string name="chosen_version">Verze: %1$s</string>
<string name="error">Chyba</string>
<string name="guide">Průvodce</string> <string name="guide">Průvodce</string>
<string name="hold_on">Zadržte!</string> <string name="hold_on">Zadržte!</string>
<string name="magisk_vanced">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.</string> <string name="magisk_vanced">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.</string>
<string name="miui_one_title">Optimalizace MIUI jsou zapnuty!</string>
<string name="miui_one">Chceteli 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)</string> <string name="miui_one">Chceteli 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)</string>
<string name="error">Chyba</string> <string name="miui_one_title">Optimalizace MIUI jsou zapnuty!</string>
<string name="please_be_patient">Během tohoto procesu NEUKONČUJTE aplikaci!</string>
<string name="redownload">Stáhnout znovu</string> <string name="redownload">Stáhnout znovu</string>
<string name="security_context">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</string> <string name="security_context">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</string>
<string name="app_installation_preferences">Předvolby instalace: %1$s</string>
<string name="version">Verze</string> <string name="version">Verze</string>
<string name="microg_bug">Chyba v microG</string>
<string name="microg_bug_summary">Kvůli chybě v původním microG, vyžaduje instalace Vanced v16+ nejprve instalaci verze 15.43.32. Otevřete ji, poté se přihlaste ke svému účtu a teprve poté nainstalujte verzi 16 a vyšší. Přejete si pokračovat v instalaci verze 15.43.32?</string>
<string name="microg_bug_summary_music">Kvůli chybě v původním microG, vyžaduje instalace Music v4.11+ nejprve instalaci verze 4.07.51. Otevřete ji, poté se přihlaste ke svému účtu a teprve poté nainstalujte verzi 4.11 a vyšší. Přejete si pokračovat v instalaci verze 4.07.51?</string>
<string name="please_be_patient">Během tohoto procesu NEUKONČUJTE aplikaci!</string>
<string name="welcome">Vítejte</string> <string name="welcome">Vítejte</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Vyberte si jeden nebo více preferovaných jazyků pro Vanced</string> <string name="choose_preferred_language">Vyberte si jeden nebo více preferovaných jazyků pro Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu.</string> <string name="chown_fail">Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu.</string>
<string name="error_downloading">Chyba při stahování %1$s</string> <string name="error_downloading">Chyba při stahování %1$s</string>
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
<string name="failed_accent">Nepodařilo se nastavit novou doplňkovou barvu</string> <string name="failed_accent">Nepodařilo se nastavit novou doplňkovou barvu</string>
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
<string name="files_missing_va">Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu.</string> <string name="files_missing_va">Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu.</string>
<string name="ifile_missing">Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu.</string> <string name="ifile_missing">Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu.</string>
<string name="installation_aborted">Instalace se nezdařila, protože uživatel přerušil instalaci.</string> <string name="installation_aborted">Instalace se nezdařila, protože uživatel přerušil instalaci.</string>
<string name="installation_blocked">Instalace se nezdařila, protože uživatel zablokoval instalaci.</string>
<string name="installation_downgrade">Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu.</string>
<string name="installation_conflict">Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu.</string> <string name="installation_conflict">Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu.</string>
<string name="installation_downgrade">Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu.</string>
<string name="installation_failed">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é</string> <string name="installation_failed">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é</string>
<string name="installation_incompatible">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.</string> <string name="installation_incompatible">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.</string>
<string name="installation_invalid">Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu.</string> <string name="installation_invalid">Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu.</string>
<string name="installation_signature">Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu.</string>
<string name="installation_miui">Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu.</string> <string name="installation_miui">Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu.</string>
<string name="installation_signature">Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu.</string>
<string name="installation_storage">Instalace se nezdařila, protože v zařízení není dostatek volného místa.</string> <string name="installation_storage">Instalace se nezdařila, protože v zařízení není dostatek volného místa.</string>
<string name="modapk_missing">Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu.</string> <string name="modapk_missing">Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu.</string>
<string name="path_missing">Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci.</string> <string name="path_missing">Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci.</string>

View File

@ -3,87 +3,89 @@
<!-- Global Strings --> <!-- Global Strings -->
<string name="cancel">Annuller</string> <string name="cancel">Annuller</string>
<string name="close">Luk</string> <string name="close">Luk</string>
<string name="description_microg">En brugerdefineret GMS implementering for Vanced baseret på microG Project.</string>
<string name="description_vanced">En modificeret YouTube klient med mange nyttige funktioner!</string>
<string name="description_vanced_music">Vanced, men for YouTube Music! Relativt mindre funktionsrig men opfylder dine behov.</string>
<string name="reset">Nulstil</string> <string name="reset">Nulstil</string>
<string name="save">Gem</string> <string name="save">Gem</string>
<string name="select_apps">Vælg Dine Apps</string> <string name="select_apps">Vælg Dine Apps</string>
<!-- Main Activity --> <!-- Main Activity -->
<string name="title_about">Om</string> <string name="title_about">Om</string>
<string name="title_guide">Guide</string> <string name="title_guide">Guide</string>
<string name="title_logs">Logfiler</string>
<string name="title_home">Manager</string> <string name="title_home">Manager</string>
<string name="title_logs">Logfiler</string>
<string name="title_settings">Indstillinger</string> <string name="title_settings">Indstillinger</string>
<string name="update_manager">Opdaterings Manager</string> <string name="update_manager">Opdaterings Manager</string>
<!-- Welcome Page --> <!-- Welcome Page -->
<string name="are_you_rooted">Er Din Enhed Rooted?</string> <string name="are_you_rooted">Er Din Enhed Rooted?</string>
<string name="grant_root">Tildel Root Tilladelse</string> <string name="grant_root">Tildel Root Tilladelse</string>
<string name="select_at_least_one_app">Vælg mindst én app!</string>
<string name="select_apps_music">Vanced, men for YouTube Music!\nrelativt mindre funktionsrig men opfylder dine behov.</string>
<string name="select_apps_vanced">YouTube Vanced er standard YouTube App, men bedre!</string>
<string name="lets_get_started">Lad os komme igang</string> <string name="lets_get_started">Lad os komme igang</string>
<string name="select_at_least_one_app">Vælg mindst én app!</string>
<string name="willing_to_use_root">Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor!</string> <string name="willing_to_use_root">Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor!</string>
<!-- Home Page --> <!-- Home Page -->
<string name="about_app">Om %1$s</string> <string name="about_app">Om %1$s</string>
<string name="app_changelog_tooltip">Tryk på kortet for at se ændringsloggen.</string> <string name="accessibility_download">Download</string>
<string name="accessibility_info">Info</string>
<string name="accessibility_launch">Launch</string>
<string name="accessibility_reinstall">Reinstall</string>
<string name="accessibility_uninstall">Uninstall</string>
<string name="accessibility_update">Update</string>
<string name="apps">Apps</string>
<string name="changelog">Ændringslog</string> <string name="changelog">Ændringslog</string>
<string name="downloading_file">Downloader %1$s</string> <string name="downloading_file">Downloader %1$s</string>
<string name="install">Installer</string> <string name="install">Installer</string>
<string name="button_reinstall">Geninstaller</string>
<string name="version_installed">Installeret:</string>
<string name="latest">Seneste:</string> <string name="latest">Seneste:</string>
<string name="no_microg">microG er ikke installeret</string> <string name="no_microg">Installer først Vanced microG</string>
<string name="root_not_granted">Root adgang ikke tildelt</string> <string name="root_not_granted">Root adgang ikke tildelt</string>
<string name="unavailable">Utilgængelig</string>
<string name="update">Opdater</string>
<string name="social_media">Sociale medier</string> <string name="social_media">Sociale medier</string>
<string name="support_us">Støt os</string> <string name="support_us">Støt os</string>
<string name="unavailable">Utilgængelig</string>
<string name="version_installed">Installeret:</string>
<!-- Settings --> <!-- Settings -->
<string name="accent_color">Sekundær farve</string> <string name="accent_color">Sekundær farve</string>
<string name="category_appearance">Udseende</string> <string name="category_appearance">Udseende</string>
<string name="category_behaviour">Adfærd</string> <string name="category_behaviour">Adfærd</string>
<string name="clear_files">Ryd hentede filer</string> <string name="clear_files">Ryd hentede filer</string>
<string name="cleared_files">Filer ryddet succesfuldt</string> <string name="cleared_files">Filer ryddet succesfuldt</string>
<string name="firebase_title">Firebase analyse</string>
<string name="firebase_summary">Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs</string> <string name="firebase_summary">Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs</string>
<string name="firebase_title">Firebase analyse</string>
<string name="language_title">Sprog</string> <string name="language_title">Sprog</string>
<string name="link_title">Brug Chrome Custom Faner</string>
<string name="link_custom_tabs">Links vil åbne i Chrome Custom Faner</string> <string name="link_custom_tabs">Links vil åbne i Chrome Custom Faner</string>
<string name="system_default">System Standard</string> <string name="link_title">Brug Chrome Custom Faner</string>
<string name="push_notifications">%1$s Push Notifikationer</string>
<string name="push_notifications_summary">Modtag push meddelelser når der er en ny opdatering til %1$s</string>
<string name="script_save_failed">Kunne ikke gemme ny tidsværdi</string> <string name="script_save_failed">Kunne ikke gemme ny tidsværdi</string>
<string name="script_sleep_timer">Root script dvale tid</string> <string name="script_sleep_timer">Root script dvale tid</string>
<string name="script_sleep_timer_description">Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer</string> <string name="script_sleep_timer_description">Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer</string>
<string name="system_default">System Standard</string>
<string name="theme">Tema</string> <string name="theme">Tema</string>
<string name="theme_dark">Mørkt tema</string> <string name="theme_dark">Mørkt tema</string>
<string name="theme_light">Lyst tema</string> <string name="theme_light">Lyst tema</string>
<string name="push_notifications">%1$s Push Notifikationer</string>
<string name="push_notifications_summary">Modtag push meddelelser når der er en ny opdatering til %1$s</string>
<string name="update_center">Manager opdaterings center</string> <string name="update_center">Manager opdaterings center</string>
<string name="update_not_found">Ingen nye opdateringer</string> <string name="update_not_found">Ingen nye opdateringer</string>
<string name="variant">Variant</string> <string name="variant">Variant</string>
<!-- Logs --> <!-- Logs -->
<string name="logs_saved">Logfiler gemt succesfuldt</string>
<string name="logs_not_saved">Kunne ikke gemme logfil</string> <string name="logs_not_saved">Kunne ikke gemme logfil</string>
<string name="logs_saved">Logfiler gemt succesfuldt</string>
<!-- Dialogs --> <!-- Dialogs -->
<string name="advanced">Avanceret</string> <string name="advanced">Detaljer</string>
<string name="app_install_files_detected">%1$s installationsfiler fundet!</string> <string name="app_install_files_detected">%1$s installationsfiler fundet!</string>
<string name="app_install_files_detected_summary">Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den?</string> <string name="app_install_files_detected_summary">Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den?</string>
<string name="app_installation_preferences">%1$s Installationsindstillinger</string>
<string name="checking_updates">Søger efter opdateringer…</string> <string name="checking_updates">Søger efter opdateringer…</string>
<string name="chosen_lang">Sprog:%1$s</string> <string name="chosen_lang">Sprog:%1$s</string>
<string name="chosen_theme">Tema: %1$s</string> <string name="chosen_theme">Tema: %1$s</string>
<string name="chosen_version">Version: %1$s</string> <string name="chosen_version">Version: %1$s</string>
<string name="error">Fejl</string>
<string name="guide">Vejledning</string> <string name="guide">Vejledning</string>
<string name="hold_on">Stop!</string> <string name="hold_on">Stop!</string>
<string name="magisk_vanced">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.</string> <string name="magisk_vanced">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.</string>
<string name="miui_one">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)</string>
<string name="miui_one_title">MIUI Optimering er aktiveret!</string> <string name="miui_one_title">MIUI Optimering er aktiveret!</string>
<string name="miui_one">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)</string> <string name="please_be_patient">Afslut venligst IKKE appen under denne proces!</string>
<string name="error">Fejl</string>
<string name="redownload">Hent igen</string> <string name="redownload">Hent igen</string>
<string name="security_context">Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden</string> <string name="security_context">Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden</string>
<string name="app_installation_preferences">%1$s Installationsindstillinger</string>
<string name="version">Version</string> <string name="version">Version</string>
<string name="microg_bug">Fejl i microG</string>
<string name="microg_bug_summary">På grund af en fejl i microG, kræver installationen af Vanced 16+ først at du installerer v15.43.32, åbner, logger ind og først derefter kan du installere v16 og over. Vil du fortsætte med at installere v15.43.32?</string>
<string name="microg_bug_summary_music">På grund af en fejl i microG, kræver installationen af Music v4.11+ først at du installerer v4.07.51, åbner, logger ind og først derefter kan du installere v4.11 og over. Vil du at fortsætte med at installere v4.07.51?</string>
<string name="please_be_patient">Afslut venligst IKKE appen under denne proces!</string>
<string name="welcome">Velkommen</string> <string name="welcome">Velkommen</string>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string> <string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages --> <!-- Error messages -->
<string name="chown_fail">Kunne ikke vælge Apk til systemejer, Prøv igen.</string> <string name="chown_fail">Kunne ikke vælge Apk til systemejer, Prøv igen.</string>
<string name="error_downloading">Fejl i download af %1$s</string> <string name="error_downloading">Fejl i download af %1$s</string>
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
<string name="failed_accent">Kunne ikke anvende ny accentfarve</string> <string name="failed_accent">Kunne ikke anvende ny accentfarve</string>
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
<string name="files_missing_va">Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen.</string> <string name="files_missing_va">Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen.</string>
<string name="ifile_missing">Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen.</string> <string name="ifile_missing">Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen.</string>
<string name="installation_aborted">Installationen fejlede fordi brugeren lukkede installationen.</string> <string name="installation_aborted">Installationen fejlede fordi brugeren lukkede installationen.</string>
<string name="installation_blocked">Installationen fejlede fordi brugeren blokerede installationen.</string>
<string name="installation_downgrade">Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen.</string>
<string name="installation_conflict">Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen.</string> <string name="installation_conflict">Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen.</string>
<string name="installation_downgrade">Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen.</string>
<string name="installation_failed">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</string> <string name="installation_failed">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</string>
<string name="installation_incompatible">Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen.</string> <string name="installation_incompatible">Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen.</string>
<string name="installation_invalid">Installationen fejlede fordi apk filerne er beskadiget, prøv igen.</string> <string name="installation_invalid">Installationen fejlede fordi apk filerne er beskadiget, prøv igen.</string>
<string name="installation_signature">Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen.</string>
<string name="installation_miui">Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen.</string> <string name="installation_miui">Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen.</string>
<string name="installation_signature">Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen.</string>
<string name="installation_storage">Installationen mislykkedes, fordi enheden ikke har nok ledig plads.</string> <string name="installation_storage">Installationen mislykkedes, fordi enheden ikke har nok ledig plads.</string>
<string name="modapk_missing">Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen.</string> <string name="modapk_missing">Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen.</string>
<string name="path_missing">Kunne ikke finde lageret YouTube-installationsstien efter split installation.</string> <string name="path_missing">Kunne ikke finde lageret YouTube-installationsstien efter split installation.</string>

Some files were not shown because too many files have changed in this diff Show More