0
0
Fork 0
mirror of https://github.com/YTVanced/VancedManager synced 2024-11-24 12:15:11 +00:00

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.
======
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
# 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)
Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out.
Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born.
After 3 months of development, we are finally ready to introduce Vanced Manager to the masses. Vanced manager can easily install and uninstall vanced and microg, has various settings for customisation and better experience. The Manager comes with an easy-to-use interface
##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity.
##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity.
## Vanced Developers
- xfileFIN
- KevinX8
- Zanezam
- Laura Almeida
## Contributions
Pull requests should be made to the Dev branch as that is the working branch, master is for release code.
## Vanced Manager Developers
- Xinto (X1nto)
- Koopah (ostajic)
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.
## Contributors
- AioiLight
- HaliksaR
## TODO
- [ ] Clean up the ViewModel and DataModel code
- [ ] Migrate to Jetpack Compose when it's officially released
## Credits
- topjohnwu for his wonderful [LibSU](https://github.com/topjohnwu/libsu)
- aefyr for [SAI](https://github.com/aefyr/SAI), which was an inspiration for our Manager
- kittinunf for [Fuel](https://github.com/kittinunf/Fuel) HTTP client
- cbeust for [klaxon](https://github.com/cbeust/klaxon) JSON parser
## Building [![Build](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml/badge.svg?branch=dev)](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml)
### Using Android Studio
Clone the repo, open it in Android Studio and build the app.
### Using command line
#### On Windows:
```powershell
.\gradlew.bat assembleDebug
```
#### On Linux/macOS:
```bash
chmod +x gradlew
./gradlew assembleDebug
```
## 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"
minSdkVersion(21)
targetSdkVersion(30)
versionCode = 251
versionName = "2.5.1 (Weed)"
versionCode = 260
versionName = "2.6.0 (Crimson)"
vectorDrawables.useSupportLibrary = true
@ -103,12 +103,12 @@ dependencies {
implementation("androidx.browser:browser:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.0.4")
implementation("androidx.core:core-ktx:1.3.2")
implementation("androidx.fragment:fragment-ktx:1.3.0")
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0")
implementation("androidx.fragment:fragment-ktx:1.3.2")
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.3.3")
implementation("androidx.navigation:navigation-ui-ktx:2.3.3")
implementation("androidx.navigation:navigation-fragment-ktx:2.3.5")
implementation("androidx.navigation:navigation-ui-ktx:2.3.5")
implementation("androidx.preference:preference-ktx:1.1.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
@ -128,31 +128,28 @@ dependencies {
implementation("com.google.android.material:material:1.3.0")
// JSON parser
implementation("com.beust:klaxon:5.4")
implementation("com.beust:klaxon:5.5")
// Crowdin
implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0")
// Tips
implementation("com.github.florent37:viewtooltip:1.2.2")
// HTTP networking
implementation("com.github.kittinunf.fuel:fuel:2.3.0")
implementation("com.github.kittinunf.fuel:fuel-coroutines:2.2.3")
implementation("com.github.kittinunf.fuel:fuel-json:2.2.3")
implementation("com.github.kittinunf.fuel:fuel:2.3.1")
implementation("com.github.kittinunf.fuel:fuel-coroutines:2.3.1")
implementation("com.github.kittinunf.fuel:fuel-json:2.3.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
// Root permissions
implementation("com.github.topjohnwu.libsu:core:3.1.1")
implementation("com.github.topjohnwu.libsu:io:3.1.1")
implementation("com.github.topjohnwu.libsu:core:3.1.2")
implementation("com.github.topjohnwu.libsu:io:3.1.2")
// Layout
implementation("com.google.android:flexbox:2.0.1")
// Firebase
implementation("com.google.firebase:firebase-analytics-ktx:18.0.2")
implementation("com.google.firebase:firebase-crashlytics:17.3.1")
implementation("com.google.firebase:firebase-messaging:21.0.1")
implementation("com.google.firebase:firebase-analytics-ktx:18.0.3")
implementation("com.google.firebase:firebase-crashlytics:17.4.1")
implementation("com.google.firebase:firebase-messaging:21.1.0")
implementation("com.google.firebase:firebase-perf:19.1.1")
}

View file

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

View file

@ -12,6 +12,7 @@
<!-- is required for some Android 5.x devices -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22"
tools:ignore="ScopedStorage" />
<queries>
@ -35,7 +36,7 @@
tools:ignore="UnusedAttribute">
<activity
android:name=".ui.core.SplashScreenActivity"
android:name=".ui.SplashScreenActivity"
android:label="@string/app_name"
android:theme="@style/SplashTheme">
<intent-filter>
@ -66,8 +67,7 @@
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="vancedapp.com"
android:pathPrefix="/downloads"/>
android:host="api.vancedapp.com"/>
</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.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
@ -35,7 +36,8 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
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
fun bind(position: Int) {
val app = apps[position]
@ -44,15 +46,21 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
setSummary(app.switchSummary)
setTitle(app.switchTitle)
setDefaultValue(true)
with (prefs) {
setChecked(getBoolean( "enable_" + app.key.substringBefore("_"), true) && getBoolean(app.key, true))
with(prefs) {
setChecked(
getBoolean(
"enable_" + app.key.substringBefore("_"),
true
) && getBoolean(app.key, true)
)
}
}
}
}
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)
}

View file

@ -57,7 +57,8 @@ class LinkAdapter(
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

View file

@ -18,21 +18,22 @@ class SelectAppsAdapter(private val context: Context) :
private val vanced = SelectAppModel(
context.getString(R.string.vanced),
context.getString(R.string.select_apps_vanced),
context.getString(R.string.description_vanced),
"vanced",
prefs.enableVanced
)
private val music = SelectAppModel(
context.getString(R.string.music),
context.getString(R.string.select_apps_music),
context.getString(R.string.description_vanced_music),
"music",
prefs.enableMusic
)
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 appDescription = binding.appCheckboxDescription
val appCard = binding.appCheckboxBg

View file

@ -18,7 +18,10 @@ class SponsorAdapter(
) : RecyclerView.Adapter<SponsorAdapter.LinkViewHolder>() {
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
)

View file

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

View file

@ -22,7 +22,9 @@ object MusicDownloader {
fun downloadMusic(context: Context, version: String? = null) {
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")
variant = prefs.managerVariant
baseurl = "$baseInstallUrl/music/v$musicVersion"
@ -35,31 +37,43 @@ object MusicDownloader {
private fun downloadApk(context: Context, apk: String = "music") {
val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk"
download(url, "$baseurl/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = {
if (variant == "root" && apk != "stock") {
downloadApk(context, "stock")
return@download
}
when (apk) {
"music" -> {
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)
download(
url,
"$baseurl/",
folderName!!,
getFileNameFromUrl(url),
context,
onDownloadComplete = {
if (variant == "root" && apk != "stock") {
downloadApk(context, "stock")
return@download
}
"stock" -> startMusicInstall(context)
}
}, onError = {
downloadingFile.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url)))
})
when (apk) {
"music" -> {
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) {

View file

@ -16,7 +16,7 @@ import com.vanced.manager.utils.PackageHelper.installVancedRoot
import java.io.File
object VancedDownloader {
private lateinit var prefs: SharedPreferences
private lateinit var defPrefs: SharedPreferences
private lateinit var arch: String
@ -47,7 +47,9 @@ object VancedDownloader {
lang = it.split(", ").toMutableList()
}
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"
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
arch = getArch()
@ -68,53 +70,68 @@ object VancedDownloader {
"theme" -> "$themePath/$theme.apk"
"arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.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"
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 = {
when (type) {
"theme" ->
if (variant == "root") {
if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) {
if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context))
downloadSplits(context, "arch")
else
startVancedInstall(context)
download(
url,
"$baseInstallUrl/",
folderName!!,
getFileNameFromUrl(url),
context,
onDownloadComplete = {
when (type) {
"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
downloadSplits(context, "theme")
} else
downloadSplits(context, "arch")
"arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang")
"stock" -> downloadSplits(context, "dpi")
"dpi" -> downloadSplits(context, "lang")
"lang" -> {
count++
succesfulLangCount++
if (count < lang.size)
downloadSplits(context, "lang")
else
startVancedInstall(context)
}
}
}, onError = {
if (type == "lang") {
count++
when {
count < lang.size -> downloadSplits(context, "lang")
succesfulLangCount == 0 -> {
lang.add("en")
downloadSplits(context, "lang")
downloadSplits(context, "arch")
"arch" -> if (variant == "root") downloadSplits(
context,
"stock"
) else downloadSplits(context, "lang")
"stock" -> downloadSplits(context, "dpi")
"dpi" -> downloadSplits(context, "lang")
"lang" -> {
count++
succesfulLangCount++
if (count < lang.size)
downloadSplits(context, "lang")
else
startVancedInstall(context)
}
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) {

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.sendRefresh
class AppInstallerService: Service() {
class AppInstallerService : Service() {
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
@ -31,7 +31,7 @@ class AppInstallerService: Service() {
else -> {
sendCloseDialog(this)
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.sendRefresh
class AppUninstallerService: Service() {
class AppUninstallerService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
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
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import android.os.Build
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
@ -17,24 +18,28 @@ open class DataModel(
lifecycleOwner: LifecycleOwner,
val appPkg: String,
val appName: String,
val appIcon: Drawable?
val appDescription: String,
@DrawableRes val appIcon: Int
) {
private val versionCode = 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 versionName = MutableLiveData<String>()
val installedVersionName = MutableLiveData<String>()
val buttonTxt = MutableLiveData<String>()
val buttonTag = MutableLiveData<ButtonTag>()
val buttonImage = MutableLiveData<Drawable>()
val changelog = MutableLiveData<String>()
private fun fetch() {
val jobj = jsonObject.value
isAppInstalled.value = isAppInstalled(appPkg)
versionCode.value = jobj?.int("versionCode") ?: 0
versionName.value = jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)
changelog.value = jobj?.string("changelog") ?: context.getString(R.string.unavailable)
versionName.value = jobj?.string("version") ?: unavailable
changelog.value = jobj?.string("changelog") ?: unavailable
}
init {
@ -44,12 +49,13 @@ open class DataModel(
fetch()
}
isAppInstalled.observe(this) {
installedVersionCode.value = getPkgVersionCode(appPkg)
installedVersionName.value = getPkgVersionName(appPkg)
installedVersionCode.value = getPkgVersionCode(appPkg, it)
installedVersionName.value = getPkgVersionName(appPkg, it)
}
versionCode.observe(this) { versionCode ->
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)
private fun getPkgVersionName(pkg: String): String {
val pm = context.packageManager
return try {
pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)
} catch (e: PackageManager.NameNotFoundException) {
context.getString(R.string.unavailable)
private fun getPkgVersionName(pkg: String, isAppInstalled: Boolean): String {
return if (isAppInstalled) {
pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: unavailable
} else {
unavailable
}
}
@Suppress("DEPRECATION")
private fun getPkgVersionCode(pkg: String): Int {
val pm = context.packageManager
return try {
private fun getPkgVersionCode(pkg: String, isAppInstalled: Boolean): Int {
return if (isAppInstalled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0
else
pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0
} catch (e: PackageManager.NameNotFoundException) {
} else {
0
}
}
private fun compareInt(int1: Int?, int2: Int?): String {
private fun compareInt(int1: Int?, int2: Int?): ButtonTag {
if (int2 != null && int1 != null) {
return when {
int1 == 0 -> context.getString(R.string.install)
int2 > int1 -> context.getString(R.string.update)
int2 == int1 || int1 > int2 -> context.getString(R.string.button_reinstall)
else -> context.getString(R.string.install)
int1 == 0 -> ButtonTag.INSTALL
int2 > int1 -> ButtonTag.UPDATE
int1 >= int2 -> ButtonTag.REINSTALL
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
import android.content.Context
import android.graphics.drawable.Drawable
import androidx.annotation.DrawableRes
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import com.beust.klaxon.JsonObject
@ -13,15 +13,16 @@ class RootDataModel(
lifecycleOwner: LifecycleOwner,
appPkg: String,
appName: String,
appIcon: Drawable?,
appDescription: String,
@DrawableRes appIcon: Int,
//BUG THIS!
//kotlin thinks that this value is null if we use
//private val scriptName: String
//Although it's impossible for it to be null.
//Ironic, isn't it?
private val scriptName: String?
): DataModel(
jsonObject, context, lifecycleOwner, appPkg, appName, appIcon
) : DataModel(
jsonObject, context, lifecycleOwner, appPkg, appName, appDescription, appIcon
) {
override fun isAppInstalled(pkg: String): Boolean {

View file

@ -3,7 +3,7 @@ package com.vanced.manager.model
import android.graphics.drawable.Drawable
data class SponsorModel(
val logo: Drawable?,
val name: String,
val url: String
val logo: Drawable?,
val name: 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.log
import com.vanced.manager.utils.AppUtils.playStorePkg
import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
class MainActivity : AppCompatActivity() {
@ -74,7 +75,7 @@ class MainActivity : AppCompatActivity() {
initDialogs(intent.getBooleanExtra("firstLaunch", false))
manager.observe(this) {
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) {
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() {
@ -101,10 +105,6 @@ class MainActivity : AppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
true
}
R.id.toolbar_about -> {
navHost.navigate(HomeFragmentDirections.toAboutFragment())
true
@ -140,7 +140,8 @@ class MainActivity : AppCompatActivity() {
}
}
R.id.toolbar_update_manager -> {
ManagerUpdateDialog.newInstance(false).show(supportFragmentManager, "manager_update")
ManagerUpdateDialog.newInstance(false)
.show(supportFragmentManager, "manager_update")
true
}
R.id.dev_settings -> {
@ -173,8 +174,14 @@ class MainActivity : AppCompatActivity() {
}
when (newConfig.orientation) {
Configuration.ORIENTATION_PORTRAIT -> log("VMUI", "screen orientation changed to portrait")
Configuration.ORIENTATION_LANDSCAPE -> log("VMUI", "screen orientation changed to landscape")
Configuration.ORIENTATION_PORTRAIT -> log(
"VMUI",
"screen orientation changed to portrait"
)
Configuration.ORIENTATION_LANDSCAPE -> log(
"VMUI",
"screen orientation changed to landscape"
)
else -> log("VMUI", "screen orientation changed to [REDACTED]")
}
@ -208,7 +215,7 @@ class MainActivity : AppCompatActivity() {
}
} else {
if (isMiuiOptimizationsEnabled) {
DialogContainer.applyAccentMiuiDialog(this)
DialogContainer.miuiDialog(this)
}
}
@ -217,7 +224,7 @@ class MainActivity : AppCompatActivity() {
}
if (variant == "root") {
if (PackageHelper.getPackageVersionName("com.google.android.youtube", packageManager) == "14.21.54") {
if (PackageHelper.getPackageVersionName(vancedRootPkg, packageManager) == "14.21.54") {
DialogContainer.basicDialog(
getString(R.string.hold_on),
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.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.WelcomeActivity
class SplashScreenActivity : AppCompatActivity() {

View file

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

View file

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

View file

@ -27,7 +27,8 @@ class PreferenceCategory @JvmOverloads constructor(
private fun initAttrs(context: Context, attrs: AttributeSet?) {
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)
binding.categoryTitle.text = title

View file

@ -1,6 +1,7 @@
package com.vanced.manager.ui.core
import android.content.Context
import android.content.SharedPreferences
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.CompoundButton
@ -31,6 +32,13 @@ class PreferenceSwitch @JvmOverloads constructor(
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
val binding: ViewPreferenceSwitchBinding
@ -38,11 +46,7 @@ class PreferenceSwitch @JvmOverloads constructor(
init {
_binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true)
prefs.registerOnSharedPreferenceChangeListener { sharedPreferences, key ->
if (key == prefKey) {
binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue)
}
}
prefs.registerOnSharedPreferenceChangeListener(prefListener)
attrs?.let { mAttrs ->
with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) {
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.vanced.manager.R
import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedMaterialButton @JvmOverloads constructor(
context: Context,
@ -18,8 +16,7 @@ class ThemedMaterialButton @JvmOverloads constructor(
) : MaterialButton(context, attributeSet, defStyleAttr) {
init {
setBgColor(context.defPrefs.managerAccent)
context.lifecycleOwner()?.let { owner ->
context.lifecycleOwner?.let { owner ->
accentColor.observe(owner) { color ->
setBgColor(color.toInt())
}

View file

@ -5,14 +5,13 @@ import android.content.res.ColorStateList
import android.util.AttributeSet
import com.google.android.material.checkbox.MaterialCheckBox
import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.managerAccent
import com.vanced.manager.utils.accentColor
class ThemedMaterialCheckbox @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) {
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 com.google.android.material.radiobutton.MaterialRadioButton
import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.managerAccent
import com.vanced.manager.utils.accentColor
class ThemedMaterialRadioButton @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) {
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.util.AttributeSet
import com.google.android.material.slider.Slider
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.managerAccent
import com.vanced.manager.utils.accentColor
class ThemedMaterialSlider @JvmOverloads constructor(
context: Context,
@ -14,7 +13,7 @@ class ThemedMaterialSlider @JvmOverloads constructor(
) : Slider(context, attributeSet, defStyleAttr) {
init {
val accentValue = ColorStateList.valueOf(context.defPrefs.managerAccent)
val accentValue = ColorStateList.valueOf(accentColor.value!!)
thumbTintList = accentValue
trackActiveTintList = accentValue
trackInactiveTintList = accentValue.withAlpha(70)

View file

@ -6,10 +6,7 @@ import android.util.AttributeSet
import androidx.core.graphics.ColorUtils
import com.google.android.material.button.MaterialButton
import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedOutlinedMaterialButton @JvmOverloads constructor(
context: Context,
@ -17,8 +14,7 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
defStyleAttr: Int = 0
) : MaterialButton(context, attributeSet, defStyleAttr) {
init {
applyAccent(context.defPrefs.managerAccent)
context.lifecycleOwner()?.let { owner ->
context.lifecycleOwner?.let { owner ->
accentColor.observe(owner) { color ->
applyAccent(color.toInt())
}
@ -27,6 +23,9 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
private fun applyAccent(color: Int) {
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 androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.vanced.manager.R
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.managerAccent
import com.vanced.manager.utils.accentColor
class ThemedSwipeRefreshlayout @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null
) : SwipeRefreshLayout(context, attributeSet) {
init {
setColorSchemeColors(context.defPrefs.managerAccent)
setColorSchemeColors(accentColor.value!!)
initAttrs(context, attributeSet)
}
private fun initAttrs(context: Context, attributeSet: AttributeSet?) {
attributeSet.let {
val typedAttrs = context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0)
setProgressBackgroundColorSchemeColor(typedAttrs.getColor(R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor, 0))
val typedAttrs =
context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0)
setProgressBackgroundColorSchemeColor(
typedAttrs.getColor(
R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor,
0
)
)
typedAttrs.recycle()
}
}

View file

@ -9,20 +9,18 @@ import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat
import com.vanced.manager.R
import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedSwitchCompat @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
) : 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 {
setSwitchColors(context.defPrefs.managerAccent)
context.lifecycleOwner()?.let { owner ->
context.lifecycleOwner?.let { owner ->
accentColor.observe(owner) { color ->
setSwitchColors(color.toInt())
}
@ -32,7 +30,13 @@ class ThemedSwitchCompat @JvmOverloads constructor(
private fun setSwitchColors(color: Int) {
val thumbColors = intArrayOf(Color.LTGRAY, color)
val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70))
DrawableCompat.setTintList(DrawableCompat.wrap(thumbDrawable), ColorStateList(states, thumbColors))
DrawableCompat.setTintList(DrawableCompat.wrap(trackDrawable), ColorStateList(states, trackColors))
DrawableCompat.setTintList(
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 androidx.appcompat.widget.AppCompatTextView
import com.vanced.manager.utils.accentColor
import com.vanced.manager.utils.defPrefs
import com.vanced.manager.utils.lifecycleOwner
import com.vanced.manager.utils.managerAccent
class ThemedTextView @JvmOverloads constructor(
context: Context,
@ -14,8 +12,7 @@ class ThemedTextView @JvmOverloads constructor(
defStyleAttr: Int = 0
) : AppCompatTextView(context, attributeSet, defStyleAttr) {
init {
setTextColor(context.defPrefs.managerAccent)
context.lifecycleOwner()?.let { owner ->
context.lifecycleOwner?.let { owner ->
accentColor.observe(owner) { color ->
setTextColor(color.toInt())
}

View file

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

View file

@ -2,11 +2,10 @@ package com.vanced.manager.ui.dialogs
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.graphics.drawable.toBitmap
import androidx.annotation.DrawableRes
import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingDialogFragment
import com.vanced.manager.databinding.DialogAppInfoBinding
@ -21,13 +20,15 @@ class AppInfoDialog : BindingDialogFragment<DialogAppInfoBinding>() {
fun newInstance(
appName: String?,
appIcon: Drawable?,
@DrawableRes appIcon: Int?,
changelog: String?
): AppInfoDialog = AppInfoDialog().apply {
arguments = Bundle().apply {
putString(TAG_APP_NAME, appName)
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) {
aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME))
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.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.defPrefs
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 }
@ -64,7 +65,7 @@ class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRa
}
dialogTitle.text = getString(R.string.version)
dialogSave.setOnClickListener {
val checkedTag = dialogRadiogroup.getCheckedButtonTag()
val checkedTag = dialogRadiogroup.checkedButtonTag
if (checkedTag != null) {
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 com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R
import com.vanced.manager.utils.applyAccent
import com.vanced.manager.utils.isMiuiOptimizationsEnabled
import com.vanced.manager.utils.openUrl
import com.vanced.manager.utils.showWithAccent
object DialogContainer {
@ -20,17 +20,17 @@ object DialogContainer {
}
setOnCancelListener {
if (context.isMiuiOptimizationsEnabled) {
applyAccentMiuiDialog(context)
miuiDialog(context)
}
}
create()
applyAccent()
showWithAccent()
}
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
prefs.edit { putBoolean("firstLaunch", false) }
}
fun applyAccentMiuiDialog(context: Context) {
fun miuiDialog(context: Context) {
MaterialAlertDialogBuilder(context).apply {
setTitle(context.getString(R.string.miui_one_title))
setMessage(context.getString(R.string.miui_one))
@ -44,7 +44,7 @@ object DialogContainer {
}
setCancelable(false)
create()
applyAccent()
showWithAccent()
}
}
@ -54,7 +54,7 @@ object DialogContainer {
setMessage("So this statement is false huh? I'll go with True!")
setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() }
create()
applyAccent()
showWithAccent()
}
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
@ -68,28 +68,54 @@ object DialogContainer {
when (msg) {
context.getString(R.string.installation_signature) -> {
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() }
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) -> {
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() }
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 -> {
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
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()
applyAccent()
showWithAccent()
}
}
@ -99,7 +125,7 @@ object DialogContainer {
setMessage(msg)
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
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.managerVariant
class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() {
class InstallationFilesDetectedDialog :
BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() {
companion object {
@ -40,9 +41,11 @@ class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogI
private fun bindData() {
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)
installationDetectedSummary.text = getString(R.string.app_install_files_detected_summary, app)
installationDetectedSummary.text =
getString(R.string.app_install_files_detected_summary, app)
installationDetectedRedownload.setOnClickListener {
dismiss()
when (app) {

View file

@ -50,9 +50,20 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
hexEdittext.apply {
setText(accent.toHex(), TextView.BufferType.EDITABLE)
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) {
setText("#")
setSelection(1)
@ -63,7 +74,8 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
val colorFromEditText = Color.parseColor(text.toString())
accentPicker.setColor(colorFromEditText)
mutableAccentColor.value = colorFromEditText
} catch (e: IllegalArgumentException) {}
} catch (e: IllegalArgumentException) {
}
}
}
@ -96,7 +108,11 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
prefs.managerAccent = colorFromEditText
} catch (e: IllegalArgumentException) {
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
}

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.databinding.DialogManagerLanguageBinding
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.managerLang
@ -43,7 +43,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment<DialogManagerLang
val language = prefs.managerLang
root.findViewWithTag<ThemedMaterialRadioButton>(language)?.isChecked = true
languageSave.setOnClickListener {
val newPref = binding.languageRadiogroup.getCheckedButtonTag()
val newPref = binding.languageRadiogroup.checkedButtonTag
if (language != newPref) {
prefs.managerLang = newPref
dismiss()

View file

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

View file

@ -1,5 +1,6 @@
package com.vanced.manager.ui.dialogs
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
@ -57,7 +58,8 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
bindData()
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())
} else {
checkUpdates()
@ -77,10 +79,12 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
}
}
@SuppressLint("SetTextI18n")
private fun DialogManagerUpdateBinding.bindDownloadProgress() {
downloadProgress.observe(viewLifecycleOwner) {
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() {
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())
} 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.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.databinding.DialogManagerVariantBinding
import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.managerVariant
class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() {
@ -37,11 +37,11 @@ class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVaria
val variant = prefs.managerVariant
root.findViewWithTag<MaterialRadioButton>(variant).isChecked = true
variantSave.setOnClickListener {
val newPref = variantRadiogroup.getCheckedButtonTag()
val newPref = variantRadiogroup.checkedButtonTag
if (variant != newPref) {
prefs.managerVariant =
if (newPref == "root" && Shell.rootAccess()) {
"root"
"root"
} else {
"nonroot"
}

View file

@ -3,7 +3,6 @@ package com.vanced.manager.ui.dialogs
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog
@ -34,8 +33,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
private fun bindData() {
with(binding) {
val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions()
musicInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.music))
musicVersion.text = getString(R.string.chosen_version, prefs.musicVersion?.formatVersion(requireActivity()))
musicInstallTitle.text =
getString(R.string.app_installation_preferences, getString(R.string.music))
musicVersion.text = getString(
R.string.chosen_version,
prefs.musicVersion?.formatVersion(requireActivity())
)
openVersionSelectorLayout.setOnClickListener {
dismiss()
showDialog(
@ -46,36 +49,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
)
}
musicInstall.setOnClickListener {
fun downloadMusic(version: String? = null) {
dismiss()
showDialog(
AppDownloadDialog.newInstance(
app = getString(R.string.music),
version = version
)
dismiss()
showDialog(
AppDownloadDialog.newInstance(
app = getString(R.string.music)
)
}
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 {
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
}
prefs.edit {

View file

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

View file

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

View file

@ -19,7 +19,8 @@ import com.vanced.manager.utils.lang
import com.vanced.manager.utils.vanced
import java.util.*
class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {
class VancedLanguageSelectionDialog :
BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {
companion object {
@ -52,7 +53,11 @@ class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVan
}
}
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
}
prefs.lang = chosenLangs.joinToString()

View file

@ -3,14 +3,11 @@ package com.vanced.manager.ui.dialogs
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
import com.vanced.manager.core.ui.ext.showDialog
import com.vanced.manager.databinding.DialogVancedPreferencesBinding
import com.vanced.manager.utils.*
import com.vanced.manager.utils.AppUtils.vancedPkg
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
import java.util.*
class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() {
@ -43,9 +40,16 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT))
}
val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions()
vancedInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.vanced))
vancedTheme.text = getString(R.string.chosen_theme, installPrefs.theme?.convertToAppTheme(requireActivity()))
vancedVersion.text = getString(R.string.chosen_version, defPrefs.vancedVersion?.formatVersion(requireActivity()))
vancedInstallTitle.text =
getString(R.string.app_installation_preferences, getString(R.string.vanced))
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)
openThemeSelectorLayout.setOnClickListener {
dismiss()
@ -68,33 +72,12 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
if (showLang.isEmpty()) {
installPrefs.lang = "en"
}
fun downloadVanced(version: String? = null) {
dismiss()
showDialog(
AppDownloadDialog.newInstance(
app = getString(R.string.vanced),
version = version
)
dismiss()
showDialog(
AppDownloadDialog.newInstance(
app = getString(R.string.vanced)
)
}
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.databinding.DialogBottomRadioButtonBinding
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
import com.vanced.manager.utils.checkedButtonTag
import com.vanced.manager.utils.convertToAppTheme
import com.vanced.manager.utils.getCheckedButtonTag
import com.vanced.manager.utils.theme
import com.vanced.manager.utils.vanced
class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
class VancedThemeSelectorDialog :
BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
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(
inflater: LayoutInflater,
@ -51,7 +57,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
tag.isChecked = true
}
dialogSave.setOnClickListener {
val checkedTag = binding.dialogRadiogroup.getCheckedButtonTag()
val checkedTag = binding.dialogRadiogroup.checkedButtonTag
if (checkedTag != null) {
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 {
text = theme.convertToAppTheme(requireActivity())
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.ViewGroup
import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.edit
import androidx.fragment.app.viewModels
import androidx.preference.PreferenceManager
@ -37,11 +36,11 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
@SuppressLint("ClickableViewAccessibility")
private fun dataBind() {
requireActivity().title = getString(R.string.title_about)
binding.root.setOnClickListener {
binding.aboutVersionCard.setOnClickListener {
showDialog(
AppInfoDialog.newInstance(
appName = getString(R.string.app_name),
appIcon = AppCompatResources.getDrawable(requireActivity(), R.mipmap.ic_launcher),
appIcon = R.mipmap.ic_launcher,
changelog = manager.value?.string("changelog")
)
)
@ -61,10 +60,18 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
val devSettings = prefs.getBoolean("devSettings", false)
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) }
} 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

View file

@ -41,7 +41,12 @@ class GrantRootFragment : BindingFragment<FragmentGrantRootBinding>() {
private fun grantRoot() {
if (Shell.rootAccess()) {
getDefaultSharedPreferences(requireActivity()).edit { putString("vanced_variant", "root") }
getDefaultSharedPreferences(requireActivity()).edit {
putString(
"vanced_variant",
"root"
)
}
navigateToFirstLaunch()
} else {
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.MenuInflater
import android.view.ViewGroup
import androidx.core.content.edit
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.viewModels
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.crowdin.platform.util.inflateWithCrowdin
import com.github.florent37.viewtooltip.ViewTooltip
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
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.SponsorAdapter
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 prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) }
private var tooltip: ViewTooltip? = null
override fun binding(
inflater: LayoutInflater,
@ -58,29 +52,13 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
private fun bindData() {
requireActivity().title = getString(R.string.title_home)
setHasOptionsMenu(true)
with (binding) {
with(binding) {
homeRefresh.setOnRefreshListener { viewModel.fetchData() }
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 {
layoutManager = LinearLayoutManager(requireActivity())
adapter = AppListAdapter(requireActivity(), viewModel, tooltip)
adapter = ExpandableAppListAdapter(requireActivity(), viewModel /*, tooltip*/)
setHasFixedSize(true)
}
@ -110,7 +88,6 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
override fun onPause() {
super.onPause()
localBroadcastManager.unregisterReceiver(broadcastReceiver)
tooltip?.close()
}
override fun onResume() {
@ -121,7 +98,11 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
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()
}
}

View file

@ -38,7 +38,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
val hour = calendar.get(Calendar.HOUR_OF_DAY)
val minute = calendar.get(Calendar.MINUTE)
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 {
append(logs)
flush()
@ -46,7 +47,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
}
Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show()
} 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() {
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
}
val prefs = getDefaultSharedPreferences(requireActivity())

View file

@ -7,6 +7,7 @@ import android.view.MenuInflater
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.analytics.FirebaseAnalytics
@ -34,6 +35,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) }
private lateinit var variant: String
private lateinit var parentActivity: FragmentActivity
override fun binding(
inflater: LayoutInflater,
@ -43,6 +45,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
override fun otherSetups() {
setHasOptionsMenu(true)
parentActivity = requireActivity()
bindData()
}
@ -63,8 +66,8 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private fun FragmentSettingsBinding.bindRecycler() {
notificationsRecycler.apply {
layoutManager = LinearLayoutManager(requireActivity())
adapter = GetNotifAdapter(requireActivity())
layoutManager = LinearLayoutManager(parentActivity)
adapter = GetNotifAdapter(parentActivity)
}
}
@ -72,7 +75,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
firebase.setOnCheckedListener { _, isChecked ->
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(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() {
clearFiles.setOnClickListener {
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()
}
Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show()
@ -116,7 +125,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
}
private fun FragmentSettingsBinding.bindManagerAccentColor() {
managerAccentColor.apply{
managerAccentColor.apply {
setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex())
setOnClickListener { showDialog(ManagerAccentColorDialog()) }
accentColor.observe(viewLifecycleOwner) {
@ -128,14 +137,15 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
private fun FragmentSettingsBinding.bindManagerLanguage() {
val langPref = prefs.getString("manager_lang", "System Default")
managerLanguage.apply {
setSummary(getLanguageFormat(requireActivity(), requireNotNull(langPref)))
setSummary(getLanguageFormat(parentActivity, requireNotNull(langPref)))
setOnClickListener { showDialog(ManagerLanguageDialog()) }
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
val devSettings = getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false)
val devSettings =
getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false)
if (devSettings) {
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.utils.openUrl
class AboutViewModel(application: Application): AndroidViewModel(application) {
class AboutViewModel(application: Application) : AndroidViewModel(application) {
fun openUrl(url: String) {
openUrl(url, R.color.GitHub, getApplication())

View file

@ -1,24 +1,23 @@
package com.vanced.manager.ui.viewmodels
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.crowdin.platform.Crowdin
import com.google.android.material.button.MaterialButton
import com.vanced.manager.R
import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD
import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT
import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM
import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER
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.RootDataModel
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 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 variant get() = prefs.getString("vanced_variant", "nonroot")
@ -58,7 +59,7 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
Crowdin.forceUpdate(activity)
}
}
private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG)
fun openUrl(url: String) {
@ -71,15 +72,24 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
BRAVE -> R.color.Brave
else -> R.color.Vanced
}
openUrl(url, color, activity)
}
fun launchApp(app: String, isRoot: Boolean) {
val componentName = when (app) {
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(vancedRootPkg, "$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")
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(
vancedRootPkg,
"$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")
}
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!!) {
microgToast.show()
return
}
if ((view as MaterialButton).text == activity.getString(R.string.update)) {
if (buttonTag == ButtonTag.UPDATE) {
when (app) {
activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity)
activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity)
else -> AppDownloadDialog.newInstance(app).show(activity)
else -> AppDownloadDialog.newInstance(app).show(activity)
}
return
}
@ -155,16 +164,66 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
}
init {
with (activity) {
with(activity) {
if (variant == "root") {
vancedRootModel.value = RootDataModel(vanced, this, this, vancedRootPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced), "vanced")
musicRootModel.value = RootDataModel(music, this, this, musicRootPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music), "music")
vancedRootModel.value = RootDataModel(
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 {
vancedModel.value = DataModel(vanced, this, this, vancedPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced))
musicModel.value = DataModel(music, this, this, musicPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music))
microgModel.value = DataModel(microg, this, this, microgPkg, this.getString(R.string.microg), AppCompatResources.getDrawable(this, R.drawable.ic_microg))
vancedModel.value = DataModel(
vanced,
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.util.*
object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
object AppUtils : CoroutineScope by CoroutineScope(Dispatchers.IO) {
const val vancedPkg = "com.vanced.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 {
setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 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)
@ -49,7 +54,8 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun sendRefresh(context: Context): Job {
return launch {
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 {
delay(700)
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 {
// Create Hex String
val hexString: StringBuilder = StringBuilder()
for (aMessageDigest:Byte in data) {
for (aMessageDigest: Byte in data) {
var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt())
while (h.length < 2)
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("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
status.contains("Path_Missing") -> context.getString(R.string.path_missing)
status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> {
if (context.isMiuiOptimizationsEnabled)
context.getString(R.string.installation_miui)
else
context.getString(R.string.installation_blocked)
}
status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> context.getString(
R.string.installation_miui
)
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>) {
if (response.isSuccessful) {
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()
} else {
onError("Could not save file")
downloadProgress.postValue(0)
log("VMDownloader", "Failed to save file: $url\n${response.errorBody()}")
log(
"VMDownloader",
"Failed to save file: $url\n${response.errorBody()}"
)
}
}
} else {
@ -111,33 +119,40 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun downloadManager(context: Context) {
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
download(url,"https://github.com/YTVanced/VancedManager/", "manager", "manager.apk", context, 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)
download(
url,
"https://github.com/YTVanced/VancedManager/",
"manager",
"manager.apk",
context,
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)
intent.setDataAndType(uri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
log("VMDownloader", e.stackTraceToString())
} finally {
sendCloseDialog(context)
}
}, onError = {
downloadingFile.postValue(
context.getString(
R.string.error_downloading,
"manager.apk"
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
log("VMDownloader", e.stackTraceToString())
} finally {
sendCloseDialog(context)
}
},
onError = {
downloadingFile.postValue(
context.getString(
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 java.util.*
fun RadioGroup.getCheckedButtonTag(): String? {
return findViewById<MaterialRadioButton>(checkedRadioButtonId)?.tag?.toString()
}
val RadioGroup.checkedButtonTag: String?
get() = findViewById<MaterialRadioButton>(
checkedRadioButtonId
)?.tag?.toString()
fun DialogFragment.show(activity: FragmentActivity) {
try {
@ -27,47 +28,43 @@ fun DialogFragment.show(activity: FragmentActivity) {
} catch (e: Exception) {
log("VMUI", e.stackTraceToString())
}
}
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 {
return with(context) {
getString(R.string.light_plus_other, if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black))
}
fun String.convertToAppTheme(context: Context): String = with(context) {
getString(
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? {
var curContext = this
var maxDepth = 20
while (maxDepth-- > 0 && curContext !is LifecycleOwner) {
curContext = (curContext as ContextWrapper).baseContext
val Context.lifecycleOwner: LifecycleOwner?
get() = when (this) {
is LifecycleOwner -> this
!is LifecycleOwner -> (this as ContextWrapper).baseContext as LifecycleOwner
else -> null
}
return if (curContext is LifecycleOwner) {
curContext
} else {
null
}
}
fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this)
//Material team decided to keep their LinearProgressIndicator final
//At least extension methods exist
fun LinearProgressIndicator.applyAccent() {
with(accentColor.value ?: context.defPrefs.managerAccent) {
with(accentColor.value!!) {
setIndicatorColor(this)
trackColor = ColorUtils.setAlphaComponent(this, 70)
}
}
fun MaterialAlertDialogBuilder.applyAccent() {
with(accentColor.value ?: context.defPrefs.managerAccent) {
fun MaterialAlertDialogBuilder.showWithAccent() {
with(accentColor.value!!) {
show().apply {
getButton(DialogInterface.BUTTON_POSITIVE).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
mount -o bind $apkFPath $path
""".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 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
get() = getString("lang", getDefaultVancedLanguages())

View file

@ -43,16 +43,23 @@ var baseInstallUrl = ""
fun openUrl(url: String, color: Int, context: Context) {
try {
val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
val customTabPrefs =
getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
if (customTabPrefs) {
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())
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, url.toUri())
} 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) {
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")
isMicrogBroken = latest?.boolean("is_microg_broken") ?: false
vanced.postValue(latest?.obj("vanced"))
vancedVersions.postValue(versions?.array("vanced") )
vancedVersions.postValue(versions?.array("vanced"))
music.postValue(latest?.obj("music"))
musicVersions.postValue(versions?.array("music"))
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 locale = when {
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)
}
currentLocale = locale

View file

@ -34,7 +34,10 @@ fun getLanguageFormat(context: Context, language: String): String {
@Suppress("DEPRECATION")
fun getDefaultVancedLanguages(): String {
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>()
sysLocales.forEach { sysLocale ->
when {

View file

@ -5,4 +5,8 @@ import android.provider.Settings
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.Dispatchers
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.*
object PackageHelper {
const val apkInstallPath = "/data/adb"
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 {
Shell.enableVerboseLogging = BuildConfig.DEBUG
@ -64,6 +68,7 @@ object PackageHelper {
else -> ""
}
}
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
return try {
packageManager.getPackageInfo(packageName, 0)
@ -81,7 +86,7 @@ object PackageHelper {
}
@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)
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
else
@ -122,9 +127,15 @@ object PackageHelper {
if (files?.isNotEmpty() == true) {
for (file in files) {
when {
vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add("base")
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")
vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add(
"base"
)
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) {
@ -160,7 +171,8 @@ object PackageHelper {
val callbackIntent = Intent(context, AppInstallerService::class.java)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
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
var session: PackageInstaller.Session? = null
try {
@ -193,7 +205,7 @@ object PackageHelper {
//moving apk to tmp folder in order to avoid permission denials
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()
if (command.isSuccess) {
return true
@ -207,7 +219,13 @@ object PackageHelper {
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 {
val apkFilesPath = context.getExternalFilesDir("$app/root")?.path
val files = File(apkFilesPath.toString()).listFiles()?.toList()
@ -268,7 +286,8 @@ object PackageHelper {
val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString())
var session: PackageInstaller.Session? = null
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 pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
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")
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 ->
val apkName = apkFile.name
log(INSTALLER_TAG, "installing APK: $apkName")
@ -353,12 +381,18 @@ object PackageHelper {
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 {
log(INSTALLER_TAG, "Setting up script")
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
} catch (e: IOException) {
sendFailure(e.stackTraceToString(), context)
@ -371,7 +405,8 @@ object PackageHelper {
private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean {
log(INSTALLER_TAG, "Linking app")
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()
Thread.sleep(500)
Shell.su("am force-stop $pkg").exec()
@ -383,12 +418,17 @@ object PackageHelper {
}
//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")
val path = getPackageDir(context, pkg)
if (path != null) {
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 installStock(baseApkFiles, pkg, context)
}
@ -402,7 +442,7 @@ object PackageHelper {
private fun getPkgInfo(pkg: String, context: Context): PackageInfo? {
return try {
context.packageManager.getPackageInfo(pkg, 0)
} catch (e:Exception) {
} catch (e: Exception) {
log(INSTALLER_TAG, "Unable to get package info")
null
}
@ -417,10 +457,13 @@ object PackageHelper {
}
//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")
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)
sendCloseDialog(context)
@ -430,7 +473,10 @@ object PackageHelper {
//install stock youtube matching vanced version
private fun installStock(baseApkFiles: List<File>, pkg: String, context: Context): Boolean {
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
@ -448,20 +494,20 @@ object PackageHelper {
}
//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")
val apkinF = SuFile.open(apkFile)
val apkoutF = SuFile.open(path)
if(apkinF.exists()) {
if (apkinF.exists()) {
try {
Shell.su("am force-stop $pkg").exec()
//Shell.su("rm -r SuFile.open(path).parent")
copy(apkinF,apkoutF)
copy(apkinF, apkoutF)
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
} else {
sendFailure(listOf("Chown_Fail").toMutableList(), context)
@ -469,9 +515,7 @@ object PackageHelper {
false
}
}
catch (e: IOException)
{
} catch (e: IOException) {
sendFailure(listOf("${e.message}").toMutableList(), context)
sendCloseDialog(context)
log(INSTALLER_TAG, e.stackTraceToString())
@ -494,13 +538,14 @@ object PackageHelper {
private fun getVersionNumber(pkg: String, context: Context): Int? {
try {
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
context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode
}
catch (e : Exception) {
} catch (e: Exception) {
val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec()
if(execRes.isSuccess) {
if (execRes.isSuccess) {
val result = execRes.out
var version = 0
result
@ -524,9 +569,8 @@ object PackageHelper {
val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec()
if (execRes.isSuccess) {
val result = execRes.out
for (line in result)
{
if(line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
for (line in result) {
if (line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
}
}
null
@ -538,7 +582,8 @@ object PackageHelper {
try {
log(INSTALLER_TAG, "Setting installer package to $installer for $target")
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") }) {
log(INSTALLER_TAG, "Installer package successfully set")
return

View file

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

View file

@ -11,7 +11,7 @@ const val LIGHT = "Light"
const val DARK = "Dark"
const val SYSTEM_DEFAULT = "System Default"
val mutableAccentColor = MutableLiveData<Int>()
val mutableAccentColor = MutableLiveData(defAccentColor)
val accentColor: LiveData<Int> = mutableAccentColor
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"
android:viewportWidth="2000" android:width="64dp"
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
android:viewportWidth="1833.2" android:width="64dp"
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="#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: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="#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="#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: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">
<gradient android:endX="1048.1708" android:endY="536.1355"
android:startX="1270.5692" android:startY="536.1355" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
<gradient android:endX="958.6746" android:endY="454.97253"
android:startX="1181.0735" android:startY="454.97253" android:type="linear">
<item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</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">
<gradient android:endX="555.1798" android:endY="1071.7072"
android:startX="870.6317" android:startY="1073.554" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
<gradient android:endX="465.6893" android:endY="990.6765"
android:startX="781.1393" android:startY="992.51654" android:type="linear">
<item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path android:fillColor="#00000000"
android:pathData="M1332.5,1204.5" android:strokeLineCap="round"
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">
<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"/>
<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">
<aapt:attr name="android:fillColor">
<gradient android:endX="1456.7" android:endY="1047.8848"
android:startX="1456.7" android:startY="897.2" android:type="linear">
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
<gradient android:endX="1367.21" android:endY="966.72473"
android:startX="1367.21" android:startY="816.04004" android:type="linear">
<item android:color="#FF953A9A" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>

View file

@ -1,27 +1,42 @@
<vector android:height="63dp"
android:viewportHeight="2000"
android:viewportWidth="2000"
android:width="63dp"
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
android:viewportWidth="1833.2" android:width="64dp"
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="#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: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: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="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="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">
<gradient android:endX="1035.8003" android:endY="898.2145"
android:startX="835.8939" android:startY="1098.121" android:type="linear">
<gradient android:endX="998.231" android:endY="793.7089"
android:startX="747.3128" android:startY="1044.6271" android:type="linear">
<item android:color="#FF2E73FF" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path android:fillColor="#00000000"
android:pathData="M1000,1000m-650,0a650,650 0,1 1,1300 0a650,650 0,1 1,-1300 0" android:strokeWidth="71">
<aapt:attr name="android:strokeColor">
<gradient android:endX="1484.7217" android:endY="515.2783"
android:startX="515.2783" android:startY="1484.7217" android:type="linear">
<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"/>
<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"/>
<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">
<aapt:attr name="android:fillColor">
<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="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</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>

View file

@ -1,41 +1,46 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="73.36dp"
android:height="56dp"
android:viewportWidth="506.854"
android:viewportHeight="385.268">
<path
android:fillColor="#FF000000"
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"/>
<path
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">
<aapt:attr name="android:fillColor">
<gradient
android:startY="383.625"
android:startX="62.4463"
android:endY="1.6556"
android:endX="444.4157"
android:type="linear">
<item android:offset="0" android:color="#FF0262FC"/>
<item android:offset="1" android:color="#FFFE0020"/>
</gradient>
</aapt:attr>
</path>
<path
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"
android:fillColor="#FFFFFF"/>
<path
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">
<gradient
android:startY="220.6162"
android:startX="198.7153"
android:endY="164.6422"
android:endX="254.6893"
android:type="linear">
<item android:offset="0" android:color="#FF0262FC"/>
<item android:offset="1" android:color="#FFFE0020"/>
</gradient>
</aapt:attr>
</path>
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
android:viewportWidth="1833.2" android:width="64dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<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="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"/>
<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">
<aapt:attr name="android:fillColor">
<gradient android:endX="1000.8886" android:endY="810.7363"
android:startX="783.8582" android:startY="1027.7668" android:type="linear">
<item android:color="#FF2E73FF" android:offset="4.795011E-7"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<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"/>
<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"/>
<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">
<aapt:attr name="android:fillColor">
<gradient android:endX="1339.9901" android:endY="508.03302"
android:startX="1447.4285" android:startY="694.1216" 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="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 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">
<aapt:attr name="android:fillColor">
<gradient android:endX="455.5205" android:endY="1158.0405"
android:startX="455.5205" android:startY="1312.2747" 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="#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"/>
<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">
<aapt:attr name="android:fillColor">
<gradient android:endX="1427.5623" android:endY="570.1407"
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>

View file

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

View file

@ -21,23 +21,42 @@
android:text="@string/checking_updates"
style="@style/DialogCardSubtitle"/>
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/manager_update_progressbar"
<RelativeLayout
android:id="@+id/manager_update_progressbar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/manager_update_patient"
android:layout_marginTop="32dp"
android:paddingBottom="8dp"
app:trackCornerRadius="15dp"
tools:progress="10"
tools:visibility="visible" />
android:layout_marginTop="18dp">
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/manager_update_progressbar"
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
android:id="@+id/manager_update_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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"
style="@style/OutlinedButtonStyle" />

View file

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

View file

@ -16,7 +16,13 @@
<LinearLayout
android:layout_width="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
android:id="@+id/recycler_app_list"
@ -25,7 +31,7 @@
android:nestedScrollingEnabled="false"
android:layout_marginHorizontal="8dp"
tools:itemCount="3"
tools:listitem="@layout/view_app" />
tools:listitem="@layout/view_app_expandable" />
<com.vanced.manager.ui.core.ThemedTextView
android:layout_marginTop="12dp"
@ -53,7 +59,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:nestedScrollingEnabled="false"
android:paddingBottom="8dp"
tools:itemCount="6"
tools:listitem="@layout/view_social_link" />

View file

@ -10,7 +10,7 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingHorizontal="8dp"
android:paddingTop="16dp">
android:paddingVertical="12dp">
<com.vanced.manager.ui.core.PreferenceCategory
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
android:id="@+id/settings_fragment"
android:name="com.vanced.manager.ui.fragments.SettingsFragment"
android:label="@string/title_settings">
android:label="@string/title_settings"
tools:layout="@layout/fragment_settings">
<action
android:id="@+id/toDevSettingsFragment"
@ -76,6 +77,7 @@
<fragment
android:id="@+id/dev_settings_fragment"
android:name="com.vanced.manager.ui.fragments.DevSettingsFragment"
android:label="Dev Settings" />
android:label="Dev Settings"
tools:layout="@layout/fragment_dev_settings"/>
</navigation>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">What is your favourite song</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="save">Stoor</string>
<string name="select_apps">Select Your Apps</string>
<!-- Main Activity -->
<string name="title_about">Oor</string>
<string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_home">Manager</string>
<string name="title_logs">Logs</string>
<string name="title_settings">Settings</string>
<string name="update_manager">Update Manager</string>
<!-- Welcome Page -->
<string name="are_you_rooted">Is Your Device Rooted?</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="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>
<!-- Home Page -->
<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="downloading_file">Downloading %1$s</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="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="unavailable">Unavailable</string>
<string name="update">Update</string>
<string name="social_media">Social Media</string>
<string name="support_us">Support us</string>
<string name="unavailable">Unavailable</string>
<string name="version_installed">Installed:</string>
<!-- Settings -->
<string name="accent_color">Accent Color</string>
<string name="category_appearance">Appearance</string>
<string name="category_behaviour">Behavior</string>
<string name="clear_files">Clear downloaded 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_title">Firebase Analytics</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="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_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="system_default">System Default</string>
<string name="theme">Theme</string>
<string name="theme_dark">Dark 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_not_found">No new updates</string>
<string name="variant">Variant</string>
<!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string>
<string name="logs_saved">Successfully saved logs</string>
<!-- 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_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="chosen_lang">Language(s): %1$s</string>
<string name="chosen_theme">Theme: %1$s</string>
<string name="chosen_version">Version: %1$s</string>
<string name="error">Error</string>
<string name="guide">Guide</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="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="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="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="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>
<!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages -->
<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="failed_uninstall">Failed to uninstall package %1$s</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="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_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_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_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_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_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="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>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">إلغاء</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="save">حفظ</string>
<string name="select_apps">اختر تطبيقاتك</string>
<!-- Main Activity -->
<string name="title_about">حول</string>
<string name="title_guide">Guide</string>
<string name="title_logs">السجل</string>
<string name="title_guide">دليل الاستخدام</string>
<string name="title_home">المدير</string>
<string name="title_logs">السجلات</string>
<string name="title_settings">الإعدادات</string>
<string name="update_manager">تحديث المدير</string>
<!-- Welcome Page -->
<string name="are_you_rooted">هل جهازك مروت؟</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="select_at_least_one_app">اختر تطبيقاً واحداً على الأقل!</string>
<string name="willing_to_use_root">لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل!</string>
<!-- Home Page -->
<string name="about_app">حوالي %1$s</string>
<string name="app_changelog_tooltip">أضغط على إحدى البطاقات لعرض سجل التغييرات.</string>
<string name="about_app">حول %1$s</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="downloading_file">جارٍ تنزيل %1$s</string>
<string name="install">تثبيت</string>
<string name="button_reinstall">إعادة التثبيت</string>
<string name="version_installed">مثبت:</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="unavailable">غير متاح</string>
<string name="update">تحديث</string>
<string name="social_media">وسائل التواصل الإجتماعي</string>
<string name="support_us">ادعمنا</string>
<string name="unavailable">غير متاح</string>
<string name="version_installed">مثبت:</string>
<!-- Settings -->
<string name="accent_color">الألوان</string>
<string name="category_appearance">المظهر</string>
<string name="category_behaviour">السلوك</string>
<string name="clear_files">مسح الملفات التي تم تنزيلها</string>
<string name="cleared_files">تم مسح الملفات بنجاح</string>
<string name="firebase_title">تحليلات Firebase</string>
<string name="firebase_summary">هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال</string>
<string name="firebase_title">تحليلات Firebase</string>
<string name="language_title">اللغة</string>
<string name="link_title">استخدم علامات تبويب مخصصة لمتصفح كروم</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_sleep_timer">Script sleep time للروت</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_dark">السمة الداكنة</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_not_found">لا توجد تحديثات جديدة</string>
<string name="variant">النوع</string>
<!-- Logs -->
<string name="logs_saved">تم حفظ السجل بنجاح</string>
<string name="logs_not_saved">تعذر حفظ السجل</string>
<string name="logs_saved">تم حفظ السجل بنجاح</string>
<!-- Dialogs -->
<string name="advanced">إعدادات متقدمة</string>
<string name="advanced">التفاصيل</string>
<string name="app_install_files_detected">تم اكتشاف ملفات تثبيت %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="chosen_lang">اللغة/اللغات: %1$s</string>
<string name="chosen_theme">السمة: %1$s</string>
<string name="chosen_version">الإصدار: %1$s</string>
<string name="error">خطأ</string>
<string name="guide">الدليل</string>
<string name="hold_on">إيقاف!</string>
<string name="magisk_vanced">يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP.</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">خطأ</string>
<string name="miui_one">من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا)</string>
<string name="miui_one_title">تحسينات MIUI مفعلة!</string>
<string name="please_be_patient">الرجاء عدم الخروج من التطبيق أثناء هذه العملية!</string>
<string name="redownload">إعادة التنزيل</string>
<string name="security_context">تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub</string>
<string name="app_installation_preferences">تفضيلات تثبيت %1$s</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>
<!-- Install Page -->
<string name="choose_preferred_language">اختر لغتك(لغاتك) المفضلة لڤانسد</string>
@ -94,26 +96,25 @@
<string name="vanced_dark">داكن</string>
<!-- About Page -->
<string name="manager_dev">مطوري المدير</string>
<string name="other_contributors">Other Contributors</string>
<string name="other_contributors">مساهمين آخرين</string>
<string name="sources">المصادر</string>
<string name="vanced_team">فريق ڤانسد</string>
<!-- Error messages -->
<string name="chown_fail">فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى.</string>
<string name="error_downloading">خطأ في تنزيل %1$s</string>
<string name="failed_uninstall">فشل في الغاء تثبيت الحزمة %1$s</string>
<string name="failed_accent">فشل تطبيق لون النسق الجديد</string>
<string name="failed_uninstall">فشل في الغاء تثبيت حزمة %1$s</string>
<string name="files_missing_va">فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى.</string>
<string name="ifile_missing">فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى.</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_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_invalid">فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى.</string>
<string name="installation_signature">فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى.</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="path_missing">فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة.</string>
</resources>

View file

@ -3,90 +3,92 @@
<!-- Global Strings -->
<string name="cancel">İmtina</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="save">Saxla</string>
<string name="select_apps">Tətbiqlərinizi Seçin</string>
<!-- Main Activity -->
<string name="title_about">Haqqında</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_logs">Qeydlər</string>
<string name="title_settings">Tənzimləmələr</string>
<string name="update_manager">Yeniləmə Meneceri</string>
<!-- Welcome Page -->
<string name="are_you_rooted">Cihazınızda root varmı?</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="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>
<!-- Home Page -->
<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="downloading_file">%1$s endirilir</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="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="unavailable">Əlçatmazdır</string>
<string name="update">Yenilə</string>
<string name="social_media">Sosial Media</string>
<string name="support_us">Bizi dəstəklə</string>
<string name="unavailable">Əlçatmazdır</string>
<string name="version_installed">Qurulan:</string>
<!-- Settings -->
<string name="accent_color">Tema rəngi</string>
<string name="category_appearance">Görünüş</string>
<string name="category_behaviour">Davranış</string>
<string name="clear_files">Endirilmiş faylları təmizlə</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_title">Firebase Analitikləri</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="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_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="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_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_not_found">Yeniləmə yoxdur</string>
<string name="variant">Variant</string>
<!-- Logs -->
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
<string name="logs_not_saved">Qeydləri saxlamaq olmadı</string>
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
<!-- 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_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="chosen_lang">Dil(lər): %1$s</string>
<string name="chosen_theme">Mövzu: %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="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="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">Xəta</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_title">MIUI Optimizasiyalarııqdır!</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="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="microg_bug">Amma microG\'də</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>
<string name="welcome">Xoş gəlmisiniz</string>
<!-- 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="light_plus_other">İşıqlı + %1$s</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>
<!-- About Page -->
<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="vanced_team">Vanced Birliyi</string>
<!-- Error messages -->
<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="failed_uninstall">%1$s paketini silinmədi</string>
<string name="error_downloading">%1$s Yüklənərkən xəta</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="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_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_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_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_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="path_missing">Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı.</string>
</resources>

View file

@ -3,90 +3,92 @@
<!-- Global Strings -->
<string name="cancel">Отказ</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="save">Запази</string>
<string name="select_apps">Изберете приложения</string>
<!-- Main Activity -->
<string name="title_about">Относно</string>
<string name="title_guide">Ръководство</string>
<string name="title_logs">Логове</string>
<string name="title_home">Мениджър</string>
<string name="title_logs">Логове</string>
<string name="title_settings">Настройки</string>
<string name="update_manager">Обнови Vanced Manager</string>
<!-- Welcome Page -->
<string name="are_you_rooted">Имате ли 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="select_at_least_one_app">Изберете поне едно приложение!</string>
<string name="willing_to_use_root">Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу!</string>
<!-- Home Page -->
<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="downloading_file">Изтегляне на %1$s</string>
<string name="install">Инсталиране</string>
<string name="button_reinstall">Преинсталиране</string>
<string name="version_installed">Инсталиранa:</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="unavailable">Недостъпно</string>
<string name="update">Обновяване</string>
<string name="social_media">Социални медии</string>
<string name="support_us">Подкрепете ни</string>
<string name="unavailable">Недостъпно</string>
<string name="version_installed">Инсталиранa:</string>
<!-- Settings -->
<string name="accent_color">Акцентиращ цвят</string>
<string name="category_appearance">Външен вид</string>
<string name="category_behaviour">Поведение</string>
<string name="clear_files">Изчисти изтеглените файлове</string>
<string name="cleared_files">Файловете са изчистени успешно</string>
<string name="firebase_title">Firebase анализ</string>
<string name="firebase_summary">Позволява ни да събираме информация за поведението на приложението и доклади за сривове</string>
<string name="firebase_title">Firebase анализ</string>
<string name="language_title">Език</string>
<string name="link_title">Ползвай персонализирани раздели на 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_sleep_timer">Време за заспиване на Root скрипта</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_dark">Тъмна тема</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_not_found">Няма актуализации</string>
<string name="variant">Вариант</string>
<!-- Logs -->
<string name="logs_saved">Успешно запазени логове</string>
<string name="logs_not_saved">Не могат да се запазят логовете</string>
<string name="logs_saved">Успешно запазени логове</string>
<!-- Dialogs -->
<string name="advanced">Разширени</string>
<string name="advanced">Подробности</string>
<string name="app_install_files_detected">%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="chosen_lang">Език(ци): %1$s</string>
<string name="chosen_theme">Тема: %1$s</string>
<string name="chosen_version">Версия: %1$s</string>
<string name="error">Грешка</string>
<string name="guide">Ръководство</string>
<string name="hold_on">Стоп!</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="error">Грешка</string>
<string name="miui_one_title">MIUI оптимизациите са включени!</string>
<string name="please_be_patient">Моля, НЕ излизайте от приложението по време на този процес!</string>
<string name="redownload">Изтегли отново</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="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>
<!-- Install Page -->
<string name="choose_preferred_language">Изберете предпочитани език(ци) за Vanced</string>
<string name="choose_preferred_language">Изберете предпочитан(и) език(ци) за Vanced</string>
<string name="install_latest">Най-нова</string>
<string name="light_plus_other">Светла + %1$s</string>
<string name="select_at_least_one_lang">Изберете поне един език!</string>
@ -100,19 +102,18 @@
<!-- Error messages -->
<string name="chown_fail">Неуспешно`chown` APK към собственика на системата, моля опитайте отново.</string>
<string name="error_downloading">Грешка при изтегляне на %1$s</string>
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
<string name="failed_accent">Неуспешно задаване на акцентиращ цвят</string>
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
<string name="files_missing_va">Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак.</string>
<string name="ifile_missing">Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново.</string>
<string name="installation_aborted">Инсталацията е неуспешна, защото е прекратена от потребителя.</string>
<string name="installation_blocked">Инсталацията е неуспешна, защото е блокирана от потребителя.</string>
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
<string name="installation_conflict">Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново.</string>
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
<string name="installation_failed">Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени</string>
<string name="installation_incompatible">Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново.</string>
<string name="installation_invalid">Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново.</string>
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
<string name="installation_miui">Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново.</string>
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
<string name="installation_storage">Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място.</string>
<string name="modapk_missing">Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново.</string>
<string name="path_missing">Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране.</string>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">বাতিল করুন</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="save">সংরক্ষণ করুন</string>
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
<!-- Main Activity -->
<string name="title_about">সম্বন্ধে</string>
<string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_home">ম্যানেজার</string>
<string name="title_logs">Logs</string>
<string name="title_settings">সেটিংস</string>
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
<!-- Welcome Page -->
<string name="are_you_rooted">আপনার ডিভাইস কি রুটেড?</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="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
<string name="willing_to_use_root">এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন!</string>
<!-- Home Page -->
<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="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="install">ইনস্টল করুন</string>
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
<string name="version_installed">ইনস্টল করা আছে:</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="unavailable">অনুপলব্ধ</string>
<string name="update">আপডেট</string>
<string name="social_media">Social Media</string>
<string name="support_us">Support us</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<!-- Settings -->
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
<string name="category_appearance">চেহারা</string>
<string name="category_behaviour">আচরণ</string>
<string name="clear_files">ডাউনলোড করা ফাইলগুলি সাফ করুন</string>
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
<string name="firebase_summary">এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে।</string>
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
<string name="language_title">ভাষা</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</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_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="system_default">সিস্টেম দ্বারা নির্ধারিত</string>
<string name="theme">থিম</string>
<string name="theme_dark">গাঢ় থিম</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_not_found">কোনো নতুন আপডেট নেই</string>
<string name="variant">রকমফের</string>
<!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string>
<string name="logs_saved">Successfully saved logs</string>
<!-- 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_summary">ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান?</string>
<string name="app_installation_preferences">%1$s Installation Preferences</string>
<string name="checking_updates">আপডেট আছে কিনা দেখা হচ্ছে…</string>
<string name="chosen_lang">ভাষা (গুলি):%1$s</string>
<string name="chosen_theme">থিম: %1$s</string>
<string name="chosen_version">ভার্সন: %1$s</string>
<string name="error">ত্রুটি</string>
<string name="guide">সহায়িকা</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="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">ত্রুটি</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="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="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>
<!-- Install Page -->
<string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string>
@ -100,19 +102,18 @@
<!-- Error messages -->
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</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_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
<string name="files_missing_va">সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন.</string>
<string name="ifile_missing">স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।.</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_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_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</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_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="modapk_missing">ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="path_missing">ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ.</string>

View file

@ -3,117 +3,118 @@
<!-- Global Strings -->
<string name="cancel">বাতিল করুন</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="save">সংরক্ষণ করুন</string>
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
<!-- Main Activity -->
<string name="title_about">সম্বন্ধে</string>
<string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_guide">গাইড</string>
<string name="title_home">ম্যানেজার</string>
<string name="title_logs">লগস</string>
<string name="title_settings">সেটিংস</string>
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
<!-- Welcome Page -->
<string name="are_you_rooted">আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে?</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="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 -->
<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="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="install">ইনস্টল করুন</string>
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<string name="latest">সর্বশেষ:</string>
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string>
<string name="no_microg">প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন</string>
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
<string name="social_media">সোশ্যাল মিডিয়া</string>
<string name="support_us">আমাদের সমর্থন করুন</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="update">আপডেট</string>
<string name="social_media">সামাজিক মাধ্যম</string>
<string name="support_us">আমাদের সমর্থন</string>
<string name="version_installed">ইনস্টল করা আছে:</string>
<!-- Settings -->
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
<string name="category_appearance">রূপ</string>
<string name="category_behaviour">আচরণ</string>
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
<string name="language_title">ভাষা</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</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="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_dark">গাঢ় থিম</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_not_found">কোনো নতুন আপডেট নেই</string>
<string name="variant">বিকল্প</string>
<!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string>
<string name="logs_not_saved">লগগুলি সংরক্ষণ করা যায়নি</string>
<string name="logs_saved">সফলভাবে লগ সংরক্ষণ করা হয়েছে</string>
<!-- Dialogs -->
<string name="advanced">উন্নত</string>
<string name="advanced">বিশদ</string>
<string name="app_install_files_detected">ইনস্টল করার জন্য %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="chosen_lang">ভাষা(গুলি): %1$s</string>
<string name="chosen_theme">থিম: %1$s</string>
<string name="chosen_version">সংস্করণ: %1$s</string>
<string name="error">ত্রুটি</string>
<string name="guide">সহায়িকা</string>
<string name="hold_on">থামুন!</string>
<string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</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">ত্রুটি</string>
<string name="miui_one">ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন)</string>
<string name="miui_one_title">MIUI অপটিমাইজেশন সক্ষম করা আছে!</string>
<string name="please_be_patient">এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না!</string>
<string name="redownload">পুনরায় ডাউনলোড করুন</string>
<string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string>
<string name="app_installation_preferences">%1$s ইনস্টল করার পছন্দগুলি</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>
<!-- Install Page -->
<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="select_at_least_one_lang">অন্তত একটি ভাষা নির্বাচন করুন!</string>
<string name="vanced_black">Black</string>
<string name="vanced_dark">Dark</string>
<string name="vanced_black">কালো</string>
<string name="vanced_dark">অন্ধকার</string>
<!-- About Page -->
<string name="manager_dev">ম্যানেজার বিকাশকারীরা</string>
<string name="other_contributors">Other Contributors</string>
<string name="other_contributors">অন্যান্য অবদানকারী</string>
<string name="sources">উৎসগুলি</string>
<string name="vanced_team">ভ্যান্সড টীম</string>
<!-- Error messages -->
<string name="chown_fail">System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ হয়েছে</string>
<string name="failed_uninstall">%1$s পেকেজ আন‌ইনস্টল করা যাইনি</string>
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ</string>
<string name="files_missing_va">ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="ifile_missing">স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</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">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব রয়েছে ts অ্যাপ্লিকেশনটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।.</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_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_downgrade">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_failed">অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন</string>
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string>
<string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</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="path_missing">স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ।</string>
</resources>

View file

@ -1,89 +1,91 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<!-- Global Strings -->
<string name="cancel">Cancel</string>
<string name="cancel">Cancel·lar</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="save">Desa</string>
<string name="select_apps">Select Your Apps</string>
<string name="select_apps">Seleccioneu les aplicacions</string>
<!-- Main Activity -->
<string name="title_about">Quant a</string>
<string name="title_guide">Guide</string>
<string name="title_logs">Logs</string>
<string name="title_guide">Guia</string>
<string name="title_home">Gestor</string>
<string name="title_logs">Registre</string>
<string name="title_settings">Configuració</string>
<string name="update_manager">Update Manager</string>
<string name="update_manager">Gestionador d\'actualitzacions</string>
<!-- Welcome Page -->
<string name="are_you_rooted">Is Your Device Rooted?</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="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="are_you_rooted">Té el vostre dispositiu accés de Superusuari (\'Root\')?</string>
<string name="grant_root">Concedir permís de Superusuari (\'Root\')</string>
<string name="lets_get_started">Comencem-hi</string>
<string name="select_at_least_one_app">Selecciona com a mínim una aplicació!</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>
<!-- Home Page -->
<string name="about_app">About %1$s</string>
<string name="app_changelog_tooltip">Tap on the card to see the changelog.</string>
<string name="changelog">Changelog</string>
<string name="about_app">Sobre %1$s</string>
<string name="accessibility_download">Descarrega</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="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="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="social_media">Xarxes socials</string>
<string name="support_us">Dóna\'ns suport</string>
<string name="unavailable">No disponible</string>
<string name="update">Actualitza</string>
<string name="social_media">Social Media</string>
<string name="support_us">Support us</string>
<string name="version_installed">Instal·lat:</string>
<!-- Settings -->
<string name="accent_color">Color d\'èmfasi</string>
<string name="category_appearance">Appearance</string>
<string name="category_behaviour">Behavior</string>
<string name="category_appearance">Aparença</string>
<string name="category_behaviour">Comportament</string>
<string name="clear_files">Esborrar fitxers descarregats</string>
<string name="cleared_files">Fitxers netejats correctament</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="language_title">Language</string>
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</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_title">Estadístiques de Firebase</string>
<string name="language_title">Llengua</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="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_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</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="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_dark">Tema fosc</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_not_found">Cap actualització</string>
<string name="variant">Variant</string>
<!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string>
<string name="logs_not_saved">No s\'han pogut desar els registres</string>
<string name="logs_saved">Registres desats satisfactòriament</string>
<!-- Dialogs -->
<string name="advanced">Advanced</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="checking_updates">Checking for updates…</string>
<string name="chosen_lang">Idioma: %1$s</string>
<string name="advanced">Detalls</string>
<string name="app_install_files_detected">Arxius d\'instal·lació de %1$s detectats!</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="app_installation_preferences">Preferències d\'instal·lació de %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_version">Version: %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="chosen_version">Versió: %1$s</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="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="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>
<!-- Install Page -->
<string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages -->
<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="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_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="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_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_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_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_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_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="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>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">هەڵوەشاندنەوە</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="save">پاراستن</string>
<string name="select_apps">بەرنامەکانت دیاریبکە</string>
<!-- Main Activity -->
<string name="title_about">دەربارە</string>
<string name="title_guide">زانیاری</string>
<string name="title_logs">تۆماری نوێکاری</string>
<string name="title_home">بەرێوەبردن</string>
<string name="title_logs">تۆماری نوێکاری</string>
<string name="title_settings">ڕێکخستنەکان</string>
<string name="update_manager">نوێکردنەوەی بەرنامە</string>
<!-- Welcome Page -->
<string name="are_you_rooted">مۆبایلەکەت ڕۆت کراوە؟</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="select_at_least_one_app">لانیکەم دانەیەک دیاریبکە!</string>
<string name="willing_to_use_root">ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا!</string>
<!-- Home Page -->
<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="downloading_file">داگرتنی %1$s</string>
<string name="install">دامەزراندن</string>
<string name="button_reinstall">دامەزراندنەوە</string>
<string name="version_installed">دامەزرێنراو:</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="unavailable">بەردەست نیە</string>
<string name="update">نوێکردنەوە</string>
<string name="social_media">تۆڕە کۆمەڵایەتییەکان</string>
<string name="support_us">پشتگیریکردن</string>
<string name="unavailable">بەردەست نیە</string>
<string name="version_installed">دامەزرێنراو:</string>
<!-- Settings -->
<string name="accent_color">ڕەنگی سەرەکی</string>
<string name="category_appearance">ڕووکار</string>
<string name="category_behaviour">ڕێکخستن</string>
<string name="clear_files">سڕینەوەی فایلە داگیراوەکان</string>
<string name="cleared_files">فایلەکان بەسەرکەتوویی سڕانەوە</string>
<string name="firebase_title">Firebase شیکردنەوەی</string>
<string name="firebase_summary">کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا </string>
<string name="firebase_title">Firebase شیکردنەوەی</string>
<string name="language_title">زمان</string>
<string name="link_title">بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم</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_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="system_default">سیستەم</string>
<string name="theme">ڕووکار</string>
<string name="theme_dark">تاریک</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_not_found">هیچ نوێکردنەوەیەک نیە</string>
<string name="variant">جۆر</string>
<!-- Logs -->
<string name="logs_saved">Successfully saved logs</string>
<string name="logs_not_saved">Could not save logs</string>
<string name="logs_not_saved">نەتوانرا تۆمارەکە بپارێزرێت</string>
<string name="logs_saved">تۆمارەکە بەسەرکەوتوویی پارێزرا</string>
<!-- 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_summary">بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟</string>
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</string>
<string name="checking_updates">پشکنین بۆ نوێکردنەوە…</string>
<string name="chosen_lang">زمان: %1$s</string>
<string name="chosen_theme">ڕووکار: %1$s</string>
<string name="chosen_version">وەشان: %1$s</string>
<string name="error">هەڵەیەک ڕوویدا</string>
<string name="guide">زانیاری</string>
<string name="hold_on">وەستاندن!</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="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="security_context">دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە</string>
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</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>
<!-- Install Page -->
<string name="choose_preferred_language">زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە</string>
@ -94,25 +96,24 @@
<string name="vanced_dark">تاریک</string>
<!-- About Page -->
<string name="manager_dev">کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید)</string>
<string name="other_contributors">Other Contributors</string>
<string name="other_contributors">وەرگێڕانی کوردی - گۆران غەریب </string>
<string name="sources">سەرچاوەکان</string>
<string name="vanced_team">Vanced تیمی</string>
<!-- Error messages -->
<string name="chown_fail">سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە.</string>
<string name="error_downloading">کێشە ڕوویدا لە داگرتنی %1$s</string>
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
<string name="failed_accent">گۆڕینی ڕەنگ سەرکەوتو نەبوو</string>
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
<string name="files_missing_va">سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="ifile_missing">سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە.</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_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_incompatible">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
<string name="installation_invalid">دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە.</string>
<string name="installation_signature">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە.</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="modapk_missing">سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە.</string>
<string name="path_missing">سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان.</string>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">Zrušit</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="save">Uložit</string>
<string name="select_apps">Vyberte své aplikace</string>
<!-- Main Activity -->
<string name="title_about">O aplikaci</string>
<string name="title_guide">Průvodce</string>
<string name="title_logs">Záznamy</string>
<string name="title_home">Manager</string>
<string name="title_logs">Záznamy</string>
<string name="title_settings">Nastavení</string>
<string name="update_manager">Aktualizovat Manager</string>
<!-- Welcome Page -->
<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="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="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>
<!-- Home Page -->
<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="downloading_file">Stahování %1$s</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="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="unavailable">Není k dispozici</string>
<string name="update">Aktualizovat</string>
<string name="social_media">Sociální média</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 -->
<string name="accent_color">Doplňková barva</string>
<string name="category_appearance">Vzhled</string>
<string name="category_behaviour">Chování</string>
<string name="clear_files">Vymazat stažené soubory</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_title">Firebase analytika</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="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_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="system_default">Výchozí systémové nastavení</string>
<string name="theme">Motiv</string>
<string name="theme_dark">Tmavý 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_not_found">Žádné nové aktualizace</string>
<string name="variant">Varianta</string>
<!-- 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_saved">Záznamy byly úspěšně uloženy</string>
<!-- 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_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="chosen_lang">Jazyk(y): %1$s</string>
<string name="chosen_theme">Motiv: %1$s</string>
<string name="chosen_version">Verze: %1$s</string>
<string name="error">Chyba</string>
<string name="guide">Průvodce</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="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="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="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="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>
<!-- Install Page -->
<string name="choose_preferred_language">Vyberte si jeden nebo více preferovaných jazyků pro Vanced</string>
@ -100,19 +102,18 @@
<!-- 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="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_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="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_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_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_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_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_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="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>

View file

@ -3,87 +3,89 @@
<!-- Global Strings -->
<string name="cancel">Annuller</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="save">Gem</string>
<string name="select_apps">Vælg Dine Apps</string>
<!-- Main Activity -->
<string name="title_about">Om</string>
<string name="title_guide">Guide</string>
<string name="title_logs">Logfiler</string>
<string name="title_home">Manager</string>
<string name="title_logs">Logfiler</string>
<string name="title_settings">Indstillinger</string>
<string name="update_manager">Opdaterings Manager</string>
<!-- Welcome Page -->
<string name="are_you_rooted">Er Din Enhed Rooted?</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="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>
<!-- Home Page -->
<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="downloading_file">Downloader %1$s</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="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="unavailable">Utilgængelig</string>
<string name="update">Opdater</string>
<string name="social_media">Sociale medier</string>
<string name="support_us">Støt os</string>
<string name="unavailable">Utilgængelig</string>
<string name="version_installed">Installeret:</string>
<!-- Settings -->
<string name="accent_color">Sekundær farve</string>
<string name="category_appearance">Udseende</string>
<string name="category_behaviour">Adfærd</string>
<string name="clear_files">Ryd hentede filer</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_title">Firebase analyse</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="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_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="system_default">System Standard</string>
<string name="theme">Tema</string>
<string name="theme_dark">Mørkt 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_not_found">Ingen nye opdateringer</string>
<string name="variant">Variant</string>
<!-- Logs -->
<string name="logs_saved">Logfiler gemt succesfuldt</string>
<string name="logs_not_saved">Kunne ikke gemme logfil</string>
<string name="logs_saved">Logfiler gemt succesfuldt</string>
<!-- 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_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="chosen_lang">Sprog:%1$s</string>
<string name="chosen_theme">Tema: %1$s</string>
<string name="chosen_version">Version: %1$s</string>
<string name="error">Fejl</string>
<string name="guide">Vejledning</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="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">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">Fejl</string>
<string name="please_be_patient">Afslut venligst IKKE appen under denne proces!</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="app_installation_preferences">%1$s Installationsindstillinger</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>
<!-- Install Page -->
<string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string>
@ -100,19 +102,18 @@
<!-- Error messages -->
<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="failed_uninstall">Fejlede i at fjerne pakke %1$s</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="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_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_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_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_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_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="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>

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