mirror of
https://github.com/YTVanced/VancedManager
synced 2024-11-24 20:25:13 +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 commit2d30eb60af
. * Revert "added back a fix for split installer" This reverts commitaeaa0d445e
. * Revert "Added an option to switch between internal and external storage" This reverts commit98c4b88961
. * 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:
parent
6cb674537e
commit
bd27e34b40
152 changed files with 3533 additions and 2648 deletions
48
README.md
48
README.md
|
@ -1,11 +1,4 @@
|
||||||
Pull requests should be made to the Dev branch as that is the working branch, master is for release code.
|
# Vanced Manager [![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg)](https://github.com/YTVanced/VancedManager/releases/latest)
|
||||||
======
|
|
||||||
For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for YouTube Vanced. Any issues with translations should be posted there too.
|
|
||||||
======
|
|
||||||
Vanced FAQ (from the faq branch) now available on the playstore! https://play.google.com/store/apps/details?id=com.vanced.faq
|
|
||||||
|
|
||||||
[![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg)](https://github.com/YTVanced/VancedManager/releases/latest)
|
|
||||||
# Vanced Manager
|
|
||||||
Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out.
|
Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out.
|
||||||
Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born.
|
Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born.
|
||||||
|
|
||||||
|
@ -13,22 +6,29 @@ After 3 months of development, we are finally ready to introduce Vanced Manager
|
||||||
|
|
||||||
##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity.
|
##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report issues regarding background activity.
|
||||||
|
|
||||||
## Vanced Developers
|
## Contributions
|
||||||
- xfileFIN
|
Pull requests should be made to the Dev branch as that is the working branch, master is for release code.
|
||||||
- KevinX8
|
|
||||||
- Zanezam
|
|
||||||
- Laura Almeida
|
|
||||||
|
|
||||||
## Vanced Manager Developers
|
For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for YouTube Vanced. Any issues with translations should be posted there too.
|
||||||
- Xinto (X1nto)
|
|
||||||
- Koopah (ostajic)
|
|
||||||
|
|
||||||
## Contributors
|
## TODO
|
||||||
- AioiLight
|
- [ ] Clean up the ViewModel and DataModel code
|
||||||
- HaliksaR
|
- [ ] Migrate to Jetpack Compose when it's officially released
|
||||||
|
|
||||||
## Credits
|
## Building [![Build](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml/badge.svg?branch=dev)](https://github.com/YTVanced/VancedManager/actions/workflows/debug.yml)
|
||||||
- topjohnwu for his wonderful [LibSU](https://github.com/topjohnwu/libsu)
|
### Using Android Studio
|
||||||
- aefyr for [SAI](https://github.com/aefyr/SAI), which was an inspiration for our Manager
|
Clone the repo, open it in Android Studio and build the app.
|
||||||
- kittinunf for [Fuel](https://github.com/kittinunf/Fuel) HTTP client
|
|
||||||
- cbeust for [klaxon](https://github.com/cbeust/klaxon) JSON parser
|
### Using command line
|
||||||
|
#### On Windows:
|
||||||
|
```powershell
|
||||||
|
.\gradlew.bat assembleDebug
|
||||||
|
```
|
||||||
|
#### On Linux/macOS:
|
||||||
|
```bash
|
||||||
|
chmod +x gradlew
|
||||||
|
./gradlew assembleDebug
|
||||||
|
```
|
||||||
|
|
||||||
|
## Vanced FAQ
|
||||||
|
Vanced FAQ (from the faq branch) now available on the playstore! https://play.google.com/store/apps/details?id=com.vanced.faq
|
|
@ -16,8 +16,8 @@ android {
|
||||||
applicationId = "com.vanced.manager"
|
applicationId = "com.vanced.manager"
|
||||||
minSdkVersion(21)
|
minSdkVersion(21)
|
||||||
targetSdkVersion(30)
|
targetSdkVersion(30)
|
||||||
versionCode = 251
|
versionCode = 260
|
||||||
versionName = "2.5.1 (Weed)"
|
versionName = "2.6.0 (Crimson)"
|
||||||
|
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|
||||||
|
@ -103,12 +103,12 @@ dependencies {
|
||||||
implementation("androidx.browser:browser:1.3.0")
|
implementation("androidx.browser:browser:1.3.0")
|
||||||
implementation("androidx.constraintlayout:constraintlayout:2.0.4")
|
implementation("androidx.constraintlayout:constraintlayout:2.0.4")
|
||||||
implementation("androidx.core:core-ktx:1.3.2")
|
implementation("androidx.core:core-ktx:1.3.2")
|
||||||
implementation("androidx.fragment:fragment-ktx:1.3.0")
|
implementation("androidx.fragment:fragment-ktx:1.3.2")
|
||||||
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0")
|
implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1")
|
||||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0")
|
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
|
||||||
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
|
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
|
||||||
implementation("androidx.navigation:navigation-fragment-ktx:2.3.3")
|
implementation("androidx.navigation:navigation-fragment-ktx:2.3.5")
|
||||||
implementation("androidx.navigation:navigation-ui-ktx:2.3.3")
|
implementation("androidx.navigation:navigation-ui-ktx:2.3.5")
|
||||||
implementation("androidx.preference:preference-ktx:1.1.1")
|
implementation("androidx.preference:preference-ktx:1.1.1")
|
||||||
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
|
||||||
|
|
||||||
|
@ -128,31 +128,28 @@ dependencies {
|
||||||
implementation("com.google.android.material:material:1.3.0")
|
implementation("com.google.android.material:material:1.3.0")
|
||||||
|
|
||||||
// JSON parser
|
// JSON parser
|
||||||
implementation("com.beust:klaxon:5.4")
|
implementation("com.beust:klaxon:5.5")
|
||||||
|
|
||||||
// Crowdin
|
// Crowdin
|
||||||
implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0")
|
implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0")
|
||||||
|
|
||||||
// Tips
|
|
||||||
implementation("com.github.florent37:viewtooltip:1.2.2")
|
|
||||||
|
|
||||||
// HTTP networking
|
// HTTP networking
|
||||||
implementation("com.github.kittinunf.fuel:fuel:2.3.0")
|
implementation("com.github.kittinunf.fuel:fuel:2.3.1")
|
||||||
implementation("com.github.kittinunf.fuel:fuel-coroutines:2.2.3")
|
implementation("com.github.kittinunf.fuel:fuel-coroutines:2.3.1")
|
||||||
implementation("com.github.kittinunf.fuel:fuel-json:2.2.3")
|
implementation("com.github.kittinunf.fuel:fuel-json:2.3.1")
|
||||||
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
|
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
|
||||||
implementation("com.squareup.retrofit2:retrofit:2.9.0")
|
implementation("com.squareup.retrofit2:retrofit:2.9.0")
|
||||||
|
|
||||||
// Root permissions
|
// Root permissions
|
||||||
implementation("com.github.topjohnwu.libsu:core:3.1.1")
|
implementation("com.github.topjohnwu.libsu:core:3.1.2")
|
||||||
implementation("com.github.topjohnwu.libsu:io:3.1.1")
|
implementation("com.github.topjohnwu.libsu:io:3.1.2")
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
implementation("com.google.android:flexbox:2.0.1")
|
implementation("com.google.android:flexbox:2.0.1")
|
||||||
|
|
||||||
// Firebase
|
// Firebase
|
||||||
implementation("com.google.firebase:firebase-analytics-ktx:18.0.2")
|
implementation("com.google.firebase:firebase-analytics-ktx:18.0.3")
|
||||||
implementation("com.google.firebase:firebase-crashlytics:17.3.1")
|
implementation("com.google.firebase:firebase-crashlytics:17.4.1")
|
||||||
implementation("com.google.firebase:firebase-messaging:21.0.1")
|
implementation("com.google.firebase:firebase-messaging:21.1.0")
|
||||||
implementation("com.google.firebase:firebase-perf:19.1.1")
|
implementation("com.google.firebase:firebase-perf:19.1.1")
|
||||||
}
|
}
|
||||||
|
|
2
app/proguard-rules.pro
vendored
2
app/proguard-rules.pro
vendored
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
# Uncomment this to preserve the line number information for
|
# Uncomment this to preserve the line number information for
|
||||||
# debugging stack traces.
|
# debugging stack traces.
|
||||||
#-keepattributes SourceFile,LineNumberTable
|
-keepattributes SourceFile, LineNumberTable
|
||||||
|
|
||||||
# If you keep the line number information, uncomment this to
|
# If you keep the line number information, uncomment this to
|
||||||
# hide the original source file name.
|
# hide the original source file name.
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<!-- is required for some Android 5.x devices -->
|
<!-- is required for some Android 5.x devices -->
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="22"
|
||||||
tools:ignore="ScopedStorage" />
|
tools:ignore="ScopedStorage" />
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
|
@ -35,7 +36,7 @@
|
||||||
tools:ignore="UnusedAttribute">
|
tools:ignore="UnusedAttribute">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.core.SplashScreenActivity"
|
android:name=".ui.SplashScreenActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
@ -66,8 +67,7 @@
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<data
|
<data
|
||||||
android:scheme="https"
|
android:scheme="https"
|
||||||
android:host="vancedapp.com"
|
android:host="api.vancedapp.com"/>
|
||||||
android:pathPrefix="/downloads"/>
|
|
||||||
|
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
|
|
@ -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))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -10,7 +10,8 @@ import com.vanced.manager.databinding.ViewNotificationSettingBinding
|
||||||
import com.vanced.manager.model.NotifModel
|
import com.vanced.manager.model.NotifModel
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.defPrefs
|
||||||
|
|
||||||
class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNotifAdapter.GetNotifViewHolder>() {
|
class GetNotifAdapter(private val context: Context) :
|
||||||
|
RecyclerView.Adapter<GetNotifAdapter.GetNotifViewHolder>() {
|
||||||
|
|
||||||
private val prefs = context.defPrefs
|
private val prefs = context.defPrefs
|
||||||
|
|
||||||
|
@ -35,7 +36,8 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
|
||||||
|
|
||||||
private val apps = arrayOf(vanced, music, microg)
|
private val apps = arrayOf(vanced, music, microg)
|
||||||
|
|
||||||
inner class GetNotifViewHolder(val binding: ViewNotificationSettingBinding) : RecyclerView.ViewHolder(binding.root) {
|
inner class GetNotifViewHolder(val binding: ViewNotificationSettingBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root) {
|
||||||
val switch = binding.notifSwitch
|
val switch = binding.notifSwitch
|
||||||
fun bind(position: Int) {
|
fun bind(position: Int) {
|
||||||
val app = apps[position]
|
val app = apps[position]
|
||||||
|
@ -44,15 +46,21 @@ class GetNotifAdapter(private val context: Context) : RecyclerView.Adapter<GetNo
|
||||||
setSummary(app.switchSummary)
|
setSummary(app.switchSummary)
|
||||||
setTitle(app.switchTitle)
|
setTitle(app.switchTitle)
|
||||||
setDefaultValue(true)
|
setDefaultValue(true)
|
||||||
with (prefs) {
|
with(prefs) {
|
||||||
setChecked(getBoolean( "enable_" + app.key.substringBefore("_"), true) && getBoolean(app.key, true))
|
setChecked(
|
||||||
|
getBoolean(
|
||||||
|
"enable_" + app.key.substringBefore("_"),
|
||||||
|
true
|
||||||
|
) && getBoolean(app.key, true)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GetNotifViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GetNotifViewHolder {
|
||||||
val view = ViewNotificationSettingBinding.inflate(LayoutInflater.from(context), parent, false)
|
val view =
|
||||||
|
ViewNotificationSettingBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||||
return GetNotifViewHolder(view)
|
return GetNotifViewHolder(view)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,8 @@ class LinkAdapter(
|
||||||
|
|
||||||
val links = arrayOf(instagram, youtube, github, website, telegram, twitter, discord, reddit)
|
val links = arrayOf(instagram, youtube, github, website, telegram, twitter, discord, reddit)
|
||||||
|
|
||||||
inner class LinkViewHolder(private val binding: ViewSocialLinkBinding) : RecyclerView.ViewHolder(binding.root) {
|
inner class LinkViewHolder(private val binding: ViewSocialLinkBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root) {
|
||||||
|
|
||||||
val logo = binding.linkImage
|
val logo = binding.linkImage
|
||||||
|
|
||||||
|
|
|
@ -18,21 +18,22 @@ class SelectAppsAdapter(private val context: Context) :
|
||||||
|
|
||||||
private val vanced = SelectAppModel(
|
private val vanced = SelectAppModel(
|
||||||
context.getString(R.string.vanced),
|
context.getString(R.string.vanced),
|
||||||
context.getString(R.string.select_apps_vanced),
|
context.getString(R.string.description_vanced),
|
||||||
"vanced",
|
"vanced",
|
||||||
prefs.enableVanced
|
prefs.enableVanced
|
||||||
)
|
)
|
||||||
|
|
||||||
private val music = SelectAppModel(
|
private val music = SelectAppModel(
|
||||||
context.getString(R.string.music),
|
context.getString(R.string.music),
|
||||||
context.getString(R.string.select_apps_music),
|
context.getString(R.string.description_vanced_music),
|
||||||
"music",
|
"music",
|
||||||
prefs.enableMusic
|
prefs.enableMusic
|
||||||
)
|
)
|
||||||
|
|
||||||
val apps = arrayOf(vanced, music)
|
val apps = arrayOf(vanced, music)
|
||||||
|
|
||||||
inner class SelectAppsViewHolder(binding: ViewAppCheckboxBinding) : RecyclerView.ViewHolder(binding.root) {
|
inner class SelectAppsViewHolder(binding: ViewAppCheckboxBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root) {
|
||||||
val appName = binding.appCheckboxText
|
val appName = binding.appCheckboxText
|
||||||
val appDescription = binding.appCheckboxDescription
|
val appDescription = binding.appCheckboxDescription
|
||||||
val appCard = binding.appCheckboxBg
|
val appCard = binding.appCheckboxBg
|
||||||
|
|
|
@ -18,7 +18,10 @@ class SponsorAdapter(
|
||||||
) : RecyclerView.Adapter<SponsorAdapter.LinkViewHolder>() {
|
) : RecyclerView.Adapter<SponsorAdapter.LinkViewHolder>() {
|
||||||
|
|
||||||
private val brave = SponsorModel(
|
private val brave = SponsorModel(
|
||||||
if (currentTheme == LIGHT) AppCompatResources.getDrawable(context, R.drawable.ic_brave_light) else AppCompatResources.getDrawable(context, R.drawable.ic_brave),
|
if (currentTheme == LIGHT) AppCompatResources.getDrawable(
|
||||||
|
context,
|
||||||
|
R.drawable.ic_brave_light
|
||||||
|
) else AppCompatResources.getDrawable(context, R.drawable.ic_brave),
|
||||||
"Brave",
|
"Brave",
|
||||||
BRAVE
|
BRAVE
|
||||||
)
|
)
|
||||||
|
|
|
@ -10,12 +10,14 @@ import com.crowdin.platform.data.remote.NetworkType
|
||||||
import com.vanced.manager.BuildConfig.*
|
import com.vanced.manager.BuildConfig.*
|
||||||
import com.vanced.manager.utils.AppUtils.log
|
import com.vanced.manager.utils.AppUtils.log
|
||||||
import com.vanced.manager.utils.loadJson
|
import com.vanced.manager.utils.loadJson
|
||||||
|
import com.vanced.manager.utils.managerAccent
|
||||||
|
import com.vanced.manager.utils.mutableAccentColor
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
open class App: Application() {
|
open class App : Application() {
|
||||||
|
|
||||||
private val prefs by lazy { getDefaultSharedPreferences(this) }
|
private val prefs by lazy { getDefaultSharedPreferences(this) }
|
||||||
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
||||||
|
@ -23,8 +25,9 @@ open class App: Application() {
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
scope.launch { loadJson(this@App) }
|
scope.launch { loadJson(this@App) }
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
mutableAccentColor.value = prefs.managerAccent
|
||||||
Crowdin.init(this,
|
Crowdin.init(
|
||||||
|
this,
|
||||||
CrowdinConfig.Builder().apply {
|
CrowdinConfig.Builder().apply {
|
||||||
withDistributionHash(CROWDIN_HASH)
|
withDistributionHash(CROWDIN_HASH)
|
||||||
withNetworkType(NetworkType.WIFI)
|
withNetworkType(NetworkType.WIFI)
|
||||||
|
|
|
@ -22,7 +22,9 @@ object MusicDownloader {
|
||||||
|
|
||||||
fun downloadMusic(context: Context, version: String? = null) {
|
fun downloadMusic(context: Context, version: String? = null) {
|
||||||
val prefs = context.defPrefs
|
val prefs = context.defPrefs
|
||||||
musicVersion = version ?: prefs.musicVersion?.getLatestAppVersion(musicVersions.value?.value ?: listOf(""))
|
musicVersion = version ?: prefs.musicVersion?.getLatestAppVersion(
|
||||||
|
musicVersions.value?.value ?: listOf("")
|
||||||
|
)
|
||||||
versionCode = music.value?.int("versionCode")
|
versionCode = music.value?.int("versionCode")
|
||||||
variant = prefs.managerVariant
|
variant = prefs.managerVariant
|
||||||
baseurl = "$baseInstallUrl/music/v$musicVersion"
|
baseurl = "$baseInstallUrl/music/v$musicVersion"
|
||||||
|
@ -35,31 +37,43 @@ object MusicDownloader {
|
||||||
|
|
||||||
private fun downloadApk(context: Context, apk: String = "music") {
|
private fun downloadApk(context: Context, apk: String = "music") {
|
||||||
val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk"
|
val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk"
|
||||||
download(url, "$baseurl/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = {
|
download(
|
||||||
if (variant == "root" && apk != "stock") {
|
url,
|
||||||
downloadApk(context, "stock")
|
"$baseurl/",
|
||||||
return@download
|
folderName!!,
|
||||||
}
|
getFileNameFromUrl(url),
|
||||||
|
context,
|
||||||
when (apk) {
|
onDownloadComplete = {
|
||||||
"music" -> {
|
if (variant == "root" && apk != "stock") {
|
||||||
if (variant == "root") {
|
downloadApk(context, "stock")
|
||||||
if (validateTheme(downloadPath!!, "root", hashUrl!!, context)) {
|
return@download
|
||||||
if (downloadStockCheck(musicRootPkg, versionCode!!, context))
|
|
||||||
downloadApk(context, "stock")
|
|
||||||
else
|
|
||||||
startMusicInstall(context)
|
|
||||||
} else {
|
|
||||||
downloadApk(context, apk)
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
startMusicInstall(context)
|
|
||||||
}
|
}
|
||||||
"stock" -> startMusicInstall(context)
|
|
||||||
}
|
when (apk) {
|
||||||
}, onError = {
|
"music" -> {
|
||||||
downloadingFile.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url)))
|
if (variant == "root") {
|
||||||
})
|
if (validateTheme(downloadPath!!, "root", hashUrl!!, context)) {
|
||||||
|
if (downloadStockCheck(musicRootPkg, versionCode!!, context))
|
||||||
|
downloadApk(context, "stock")
|
||||||
|
else
|
||||||
|
startMusicInstall(context)
|
||||||
|
} else {
|
||||||
|
downloadApk(context, apk)
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
startMusicInstall(context)
|
||||||
|
}
|
||||||
|
"stock" -> startMusicInstall(context)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onError = {
|
||||||
|
downloadingFile.postValue(
|
||||||
|
context.getString(
|
||||||
|
R.string.error_downloading,
|
||||||
|
getFileNameFromUrl(url)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startMusicInstall(context: Context) {
|
fun startMusicInstall(context: Context) {
|
||||||
|
|
|
@ -47,7 +47,9 @@ object VancedDownloader {
|
||||||
lang = it.split(", ").toMutableList()
|
lang = it.split(", ").toMutableList()
|
||||||
}
|
}
|
||||||
theme = prefs.theme
|
theme = prefs.theme
|
||||||
vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf(""))
|
vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion(
|
||||||
|
vancedVersions.value?.value ?: listOf("")
|
||||||
|
)
|
||||||
themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme"
|
themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme"
|
||||||
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
|
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
|
||||||
arch = getArch()
|
arch = getArch()
|
||||||
|
@ -68,53 +70,68 @@ object VancedDownloader {
|
||||||
"theme" -> "$themePath/$theme.apk"
|
"theme" -> "$themePath/$theme.apk"
|
||||||
"arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk"
|
"arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk"
|
||||||
"stock" -> "$themePath/stock.apk"
|
"stock" -> "$themePath/stock.apk"
|
||||||
"dpi" -> "$themePath/dpi.apk"
|
"dpi" -> "$themePath/dpi.apk"
|
||||||
"lang" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang[count]}.apk"
|
"lang" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang[count]}.apk"
|
||||||
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
|
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
|
||||||
}
|
}
|
||||||
|
|
||||||
download(url, "$baseInstallUrl/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = {
|
download(
|
||||||
when (type) {
|
url,
|
||||||
"theme" ->
|
"$baseInstallUrl/",
|
||||||
if (variant == "root") {
|
folderName!!,
|
||||||
if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) {
|
getFileNameFromUrl(url),
|
||||||
if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context))
|
context,
|
||||||
downloadSplits(context, "arch")
|
onDownloadComplete = {
|
||||||
else
|
when (type) {
|
||||||
startVancedInstall(context)
|
"theme" ->
|
||||||
|
if (variant == "root") {
|
||||||
|
if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) {
|
||||||
|
if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context))
|
||||||
|
downloadSplits(context, "arch")
|
||||||
|
else
|
||||||
|
startVancedInstall(context)
|
||||||
|
} else
|
||||||
|
downloadSplits(context, "theme")
|
||||||
} else
|
} else
|
||||||
downloadSplits(context, "theme")
|
downloadSplits(context, "arch")
|
||||||
} else
|
"arch" -> if (variant == "root") downloadSplits(
|
||||||
downloadSplits(context, "arch")
|
context,
|
||||||
"arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang")
|
"stock"
|
||||||
"stock" -> downloadSplits(context, "dpi")
|
) else downloadSplits(context, "lang")
|
||||||
"dpi" -> downloadSplits(context, "lang")
|
"stock" -> downloadSplits(context, "dpi")
|
||||||
"lang" -> {
|
"dpi" -> downloadSplits(context, "lang")
|
||||||
count++
|
"lang" -> {
|
||||||
succesfulLangCount++
|
count++
|
||||||
if (count < lang.size)
|
succesfulLangCount++
|
||||||
downloadSplits(context, "lang")
|
if (count < lang.size)
|
||||||
else
|
downloadSplits(context, "lang")
|
||||||
startVancedInstall(context)
|
else
|
||||||
}
|
startVancedInstall(context)
|
||||||
|
|
||||||
}
|
|
||||||
}, onError = {
|
|
||||||
if (type == "lang") {
|
|
||||||
count++
|
|
||||||
when {
|
|
||||||
count < lang.size -> downloadSplits(context, "lang")
|
|
||||||
succesfulLangCount == 0 -> {
|
|
||||||
lang.add("en")
|
|
||||||
downloadSplits(context, "lang")
|
|
||||||
}
|
}
|
||||||
else -> startVancedInstall(context)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
}
|
||||||
downloadingFile.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url)))
|
},
|
||||||
}
|
onError = {
|
||||||
})
|
if (type == "lang") {
|
||||||
|
count++
|
||||||
|
when {
|
||||||
|
count < lang.size -> downloadSplits(context, "lang")
|
||||||
|
succesfulLangCount == 0 -> {
|
||||||
|
lang.add("en")
|
||||||
|
downloadSplits(context, "lang")
|
||||||
|
}
|
||||||
|
else -> startVancedInstall(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
downloadingFile.postValue(
|
||||||
|
context.getString(
|
||||||
|
R.string.error_downloading,
|
||||||
|
getFileNameFromUrl(url)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startVancedInstall(context: Context, variant: String? = this.variant) {
|
fun startVancedInstall(context: Context, variant: String? = this.variant) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import com.vanced.manager.utils.AppUtils.sendCloseDialog
|
||||||
import com.vanced.manager.utils.AppUtils.sendFailure
|
import com.vanced.manager.utils.AppUtils.sendFailure
|
||||||
import com.vanced.manager.utils.AppUtils.sendRefresh
|
import com.vanced.manager.utils.AppUtils.sendRefresh
|
||||||
|
|
||||||
class AppInstallerService: Service() {
|
class AppInstallerService : Service() {
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
|
||||||
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
|
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
|
||||||
|
@ -31,7 +31,7 @@ class AppInstallerService: Service() {
|
||||||
else -> {
|
else -> {
|
||||||
sendCloseDialog(this)
|
sendCloseDialog(this)
|
||||||
intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)?.let {
|
intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)?.let {
|
||||||
sendFailure(it,this)
|
sendFailure(it, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import android.os.IBinder
|
||||||
import com.vanced.manager.utils.AppUtils.log
|
import com.vanced.manager.utils.AppUtils.log
|
||||||
import com.vanced.manager.utils.AppUtils.sendRefresh
|
import com.vanced.manager.utils.AppUtils.sendRefresh
|
||||||
|
|
||||||
class AppUninstallerService: Service() {
|
class AppUninstallerService : Service() {
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
val pkgName = intent?.getStringExtra("pkg")
|
val pkgName = intent?.getStringExtra("pkg")
|
||||||
|
|
5
app/src/main/java/com/vanced/manager/model/ButtonTag.kt
Normal file
5
app/src/main/java/com/vanced/manager/model/ButtonTag.kt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package com.vanced.manager.model
|
||||||
|
|
||||||
|
enum class ButtonTag {
|
||||||
|
INSTALL, UPDATE, REINSTALL
|
||||||
|
}
|
|
@ -1,9 +1,10 @@
|
||||||
package com.vanced.manager.model
|
package com.vanced.manager.model
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
@ -17,24 +18,28 @@ open class DataModel(
|
||||||
lifecycleOwner: LifecycleOwner,
|
lifecycleOwner: LifecycleOwner,
|
||||||
val appPkg: String,
|
val appPkg: String,
|
||||||
val appName: String,
|
val appName: String,
|
||||||
val appIcon: Drawable?
|
val appDescription: String,
|
||||||
|
@DrawableRes val appIcon: Int
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val versionCode = MutableLiveData<Int>()
|
private val versionCode = MutableLiveData<Int>()
|
||||||
private val installedVersionCode = MutableLiveData<Int>()
|
private val installedVersionCode = MutableLiveData<Int>()
|
||||||
|
private val unavailable = context.getString(R.string.unavailable)
|
||||||
|
private val pm = context.packageManager
|
||||||
|
|
||||||
val isAppInstalled = MutableLiveData<Boolean>()
|
val isAppInstalled = MutableLiveData<Boolean>()
|
||||||
val versionName = MutableLiveData<String>()
|
val versionName = MutableLiveData<String>()
|
||||||
val installedVersionName = MutableLiveData<String>()
|
val installedVersionName = MutableLiveData<String>()
|
||||||
val buttonTxt = MutableLiveData<String>()
|
val buttonTag = MutableLiveData<ButtonTag>()
|
||||||
|
val buttonImage = MutableLiveData<Drawable>()
|
||||||
val changelog = MutableLiveData<String>()
|
val changelog = MutableLiveData<String>()
|
||||||
|
|
||||||
private fun fetch() {
|
private fun fetch() {
|
||||||
val jobj = jsonObject.value
|
val jobj = jsonObject.value
|
||||||
isAppInstalled.value = isAppInstalled(appPkg)
|
isAppInstalled.value = isAppInstalled(appPkg)
|
||||||
versionCode.value = jobj?.int("versionCode") ?: 0
|
versionCode.value = jobj?.int("versionCode") ?: 0
|
||||||
versionName.value = jobj?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)
|
versionName.value = jobj?.string("version") ?: unavailable
|
||||||
changelog.value = jobj?.string("changelog") ?: context.getString(R.string.unavailable)
|
changelog.value = jobj?.string("changelog") ?: unavailable
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -44,12 +49,13 @@ open class DataModel(
|
||||||
fetch()
|
fetch()
|
||||||
}
|
}
|
||||||
isAppInstalled.observe(this) {
|
isAppInstalled.observe(this) {
|
||||||
installedVersionCode.value = getPkgVersionCode(appPkg)
|
installedVersionCode.value = getPkgVersionCode(appPkg, it)
|
||||||
installedVersionName.value = getPkgVersionName(appPkg)
|
installedVersionName.value = getPkgVersionName(appPkg, it)
|
||||||
}
|
}
|
||||||
versionCode.observe(this) { versionCode ->
|
versionCode.observe(this) { versionCode ->
|
||||||
installedVersionCode.observe(this) { installedVersionCode ->
|
installedVersionCode.observe(this) { installedVersionCode ->
|
||||||
buttonTxt.value = compareInt(installedVersionCode, versionCode)
|
buttonTag.value = compareInt(installedVersionCode, versionCode)
|
||||||
|
buttonImage.value = compareIntDrawable(installedVersionCode, versionCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,37 +63,48 @@ open class DataModel(
|
||||||
|
|
||||||
open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager)
|
open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager)
|
||||||
|
|
||||||
private fun getPkgVersionName(pkg: String): String {
|
private fun getPkgVersionName(pkg: String, isAppInstalled: Boolean): String {
|
||||||
val pm = context.packageManager
|
return if (isAppInstalled) {
|
||||||
return try {
|
pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: unavailable
|
||||||
pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable)
|
} else {
|
||||||
} catch (e: PackageManager.NameNotFoundException) {
|
unavailable
|
||||||
context.getString(R.string.unavailable)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
private fun getPkgVersionCode(pkg: String): Int {
|
private fun getPkgVersionCode(pkg: String, isAppInstalled: Boolean): Int {
|
||||||
val pm = context.packageManager
|
return if (isAppInstalled) {
|
||||||
return try {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
||||||
pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0
|
pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0
|
||||||
else
|
else
|
||||||
pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0
|
pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0
|
||||||
} catch (e: PackageManager.NameNotFoundException) {
|
|
||||||
|
} else {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun compareInt(int1: Int?, int2: Int?): String {
|
private fun compareInt(int1: Int?, int2: Int?): ButtonTag {
|
||||||
if (int2 != null && int1 != null) {
|
if (int2 != null && int1 != null) {
|
||||||
return when {
|
return when {
|
||||||
int1 == 0 -> context.getString(R.string.install)
|
int1 == 0 -> ButtonTag.INSTALL
|
||||||
int2 > int1 -> context.getString(R.string.update)
|
int2 > int1 -> ButtonTag.UPDATE
|
||||||
int2 == int1 || int1 > int2 -> context.getString(R.string.button_reinstall)
|
int1 >= int2 -> ButtonTag.REINSTALL
|
||||||
else -> context.getString(R.string.install)
|
else -> ButtonTag.INSTALL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return context.getString(R.string.install)
|
return ButtonTag.INSTALL
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun compareIntDrawable(int1: Int?, int2: Int?): Drawable {
|
||||||
|
if (int2 != null && int1 != null) {
|
||||||
|
return when {
|
||||||
|
int1 == 0 -> ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
|
||||||
|
int2 > int1 -> ContextCompat.getDrawable(context, R.drawable.ic_app_update)!!
|
||||||
|
int1 >= int2 -> ContextCompat.getDrawable(context, R.drawable.ic_app_reinstall)!!
|
||||||
|
else -> ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ContextCompat.getDrawable(context, R.drawable.ic_app_download)!!
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
package com.vanced.manager.model
|
package com.vanced.manager.model
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.drawable.Drawable
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import com.beust.klaxon.JsonObject
|
import com.beust.klaxon.JsonObject
|
||||||
|
@ -13,15 +13,16 @@ class RootDataModel(
|
||||||
lifecycleOwner: LifecycleOwner,
|
lifecycleOwner: LifecycleOwner,
|
||||||
appPkg: String,
|
appPkg: String,
|
||||||
appName: String,
|
appName: String,
|
||||||
appIcon: Drawable?,
|
appDescription: String,
|
||||||
|
@DrawableRes appIcon: Int,
|
||||||
//BUG THIS!
|
//BUG THIS!
|
||||||
//kotlin thinks that this value is null if we use
|
//kotlin thinks that this value is null if we use
|
||||||
//private val scriptName: String
|
//private val scriptName: String
|
||||||
//Although it's impossible for it to be null.
|
//Although it's impossible for it to be null.
|
||||||
//Ironic, isn't it?
|
//Ironic, isn't it?
|
||||||
private val scriptName: String?
|
private val scriptName: String?
|
||||||
): DataModel(
|
) : DataModel(
|
||||||
jsonObject, context, lifecycleOwner, appPkg, appName, appIcon
|
jsonObject, context, lifecycleOwner, appPkg, appName, appDescription, appIcon
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun isAppInstalled(pkg: String): Boolean {
|
override fun isAppInstalled(pkg: String): Boolean {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package com.vanced.manager.model
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
|
|
||||||
data class SponsorModel(
|
data class SponsorModel(
|
||||||
val logo: Drawable?,
|
val logo: Drawable?,
|
||||||
val name: String,
|
val name: String,
|
||||||
val url: String
|
val url: String
|
||||||
)
|
)
|
|
@ -32,6 +32,7 @@ import com.vanced.manager.utils.AppUtils.currentLocale
|
||||||
import com.vanced.manager.utils.AppUtils.faqpkg
|
import com.vanced.manager.utils.AppUtils.faqpkg
|
||||||
import com.vanced.manager.utils.AppUtils.log
|
import com.vanced.manager.utils.AppUtils.log
|
||||||
import com.vanced.manager.utils.AppUtils.playStorePkg
|
import com.vanced.manager.utils.AppUtils.playStorePkg
|
||||||
|
import com.vanced.manager.utils.AppUtils.vancedRootPkg
|
||||||
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
|
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
@ -74,7 +75,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
initDialogs(intent.getBooleanExtra("firstLaunch", false))
|
initDialogs(intent.getBooleanExtra("firstLaunch", false))
|
||||||
manager.observe(this) {
|
manager.observe(this) {
|
||||||
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
|
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
|
||||||
ManagerUpdateDialog.newInstance(false).show(this)
|
ManagerUpdateDialog.newInstance(true).show(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +86,10 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
|
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
|
||||||
binding.toolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable(this, R.drawable.ic_keyboard_backspace_black_24dp) else null
|
binding.toolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable(
|
||||||
|
this,
|
||||||
|
R.drawable.ic_keyboard_backspace_black_24dp
|
||||||
|
) else null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
|
@ -101,10 +105,6 @@ class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
android.R.id.home -> {
|
|
||||||
onBackPressedDispatcher.onBackPressed()
|
|
||||||
true
|
|
||||||
}
|
|
||||||
R.id.toolbar_about -> {
|
R.id.toolbar_about -> {
|
||||||
navHost.navigate(HomeFragmentDirections.toAboutFragment())
|
navHost.navigate(HomeFragmentDirections.toAboutFragment())
|
||||||
true
|
true
|
||||||
|
@ -140,7 +140,8 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
R.id.toolbar_update_manager -> {
|
R.id.toolbar_update_manager -> {
|
||||||
ManagerUpdateDialog.newInstance(false).show(supportFragmentManager, "manager_update")
|
ManagerUpdateDialog.newInstance(false)
|
||||||
|
.show(supportFragmentManager, "manager_update")
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
R.id.dev_settings -> {
|
R.id.dev_settings -> {
|
||||||
|
@ -173,8 +174,14 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
when (newConfig.orientation) {
|
when (newConfig.orientation) {
|
||||||
Configuration.ORIENTATION_PORTRAIT -> log("VMUI", "screen orientation changed to portrait")
|
Configuration.ORIENTATION_PORTRAIT -> log(
|
||||||
Configuration.ORIENTATION_LANDSCAPE -> log("VMUI", "screen orientation changed to landscape")
|
"VMUI",
|
||||||
|
"screen orientation changed to portrait"
|
||||||
|
)
|
||||||
|
Configuration.ORIENTATION_LANDSCAPE -> log(
|
||||||
|
"VMUI",
|
||||||
|
"screen orientation changed to landscape"
|
||||||
|
)
|
||||||
else -> log("VMUI", "screen orientation changed to [REDACTED]")
|
else -> log("VMUI", "screen orientation changed to [REDACTED]")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,7 +215,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMiuiOptimizationsEnabled) {
|
if (isMiuiOptimizationsEnabled) {
|
||||||
DialogContainer.applyAccentMiuiDialog(this)
|
DialogContainer.miuiDialog(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +224,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (variant == "root") {
|
if (variant == "root") {
|
||||||
if (PackageHelper.getPackageVersionName("com.google.android.youtube", packageManager) == "14.21.54") {
|
if (PackageHelper.getPackageVersionName(vancedRootPkg, packageManager) == "14.21.54") {
|
||||||
DialogContainer.basicDialog(
|
DialogContainer.basicDialog(
|
||||||
getString(R.string.hold_on),
|
getString(R.string.hold_on),
|
||||||
getString(R.string.magisk_vanced),
|
getString(R.string.magisk_vanced),
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
package com.vanced.manager.ui.core
|
package com.vanced.manager.ui
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||||
import com.vanced.manager.ui.MainActivity
|
|
||||||
import com.vanced.manager.ui.WelcomeActivity
|
|
||||||
|
|
||||||
class SplashScreenActivity : AppCompatActivity() {
|
class SplashScreenActivity : AppCompatActivity() {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package com.vanced.manager.ui
|
package com.vanced.manager.ui
|
||||||
|
|
||||||
import android.animation.Animator
|
|
||||||
import android.animation.ValueAnimator
|
import android.animation.ValueAnimator
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator
|
import android.util.LayoutDirection
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.animation.addListener
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
import com.vanced.manager.adapter.WelcomePageAdapter
|
import com.vanced.manager.adapter.WelcomePageAdapter
|
||||||
import com.vanced.manager.databinding.ActivityWelcomeBinding
|
import com.vanced.manager.databinding.ActivityWelcomeBinding
|
||||||
|
@ -12,21 +12,22 @@ import kotlin.math.abs
|
||||||
|
|
||||||
class WelcomeActivity : AppCompatActivity() {
|
class WelcomeActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var viewPager2: ViewPager2
|
|
||||||
private lateinit var binding: ActivityWelcomeBinding
|
private lateinit var binding: ActivityWelcomeBinding
|
||||||
|
private var isRtl = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
binding = ActivityWelcomeBinding.inflate(layoutInflater)
|
binding = ActivityWelcomeBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
viewPager2 = binding.welcomeViewpager
|
isRtl = resources.configuration.layoutDirection == LayoutDirection.RTL
|
||||||
viewPager2.apply {
|
|
||||||
|
binding.welcomeViewpager.apply {
|
||||||
adapter = WelcomePageAdapter(this@WelcomeActivity)
|
adapter = WelcomePageAdapter(this@WelcomeActivity)
|
||||||
isUserInputEnabled = false
|
isUserInputEnabled = false
|
||||||
setPageTransformer { page, position ->
|
setPageTransformer { page, position ->
|
||||||
page.apply {
|
page.apply {
|
||||||
val pageWidth = width
|
val pageWidth = width.toFloat()
|
||||||
//Thank you, fragula dev!
|
//Thank you, fragula dev!
|
||||||
when {
|
when {
|
||||||
position > 0 && position < 1 -> {
|
position > 0 && position < 1 -> {
|
||||||
|
@ -35,7 +36,7 @@ class WelcomeActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
position > -1 && position <= 0 -> {
|
position > -1 && position <= 0 -> {
|
||||||
alpha = 1.0f - abs(position * 0.7f)
|
alpha = 1.0f - abs(position * 0.7f)
|
||||||
translationX = -pageWidth * position / 1.3F
|
translationX = pageWidth.rtlCompat * position / 1.3F
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,21 +45,25 @@ class WelcomeActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
if (viewPager2.currentItem == 0) {
|
with(binding) {
|
||||||
super.onBackPressed()
|
if (welcomeViewpager.currentItem == 0) {
|
||||||
} else {
|
super.onBackPressed()
|
||||||
navigateTo(viewPager2.currentItem - 1)
|
} else {
|
||||||
|
navigateTo(welcomeViewpager.currentItem - 1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun navigateTo(position: Int) {
|
fun navigateTo(position: Int) {
|
||||||
viewPager2.currentPosition = position
|
binding.welcomeViewpager.currentPosition = position
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val Float.rtlCompat get() = if (isRtl) this else -this
|
||||||
|
|
||||||
//Shit way to implement animation duration, but at least it works
|
//Shit way to implement animation duration, but at least it works
|
||||||
private var ViewPager2.currentPosition: Int
|
private var ViewPager2.currentPosition: Int
|
||||||
get() = currentItem
|
get() = currentItem
|
||||||
set(value) {
|
set(value) {
|
||||||
val pixelsToDrag: Int = width * (value - currentItem)
|
val pixelsToDrag: Int = width * (value - currentItem)
|
||||||
val animator = ValueAnimator.ofInt(0, pixelsToDrag)
|
val animator = ValueAnimator.ofInt(0, pixelsToDrag)
|
||||||
var previousValue = 0
|
var previousValue = 0
|
||||||
|
@ -66,16 +71,13 @@ class WelcomeActivity : AppCompatActivity() {
|
||||||
addUpdateListener { valueAnimator ->
|
addUpdateListener { valueAnimator ->
|
||||||
val currentValue = valueAnimator.animatedValue as Int
|
val currentValue = valueAnimator.animatedValue as Int
|
||||||
val currentPxToDrag = (currentValue - previousValue).toFloat()
|
val currentPxToDrag = (currentValue - previousValue).toFloat()
|
||||||
fakeDragBy(-currentPxToDrag)
|
fakeDragBy(currentPxToDrag.rtlCompat)
|
||||||
previousValue = currentValue
|
previousValue = currentValue
|
||||||
}
|
}
|
||||||
addListener(object : Animator.AnimatorListener {
|
addListener(
|
||||||
override fun onAnimationStart(animation: Animator?) { beginFakeDrag() }
|
onStart = { beginFakeDrag() },
|
||||||
override fun onAnimationEnd(animation: Animator?) { endFakeDrag() }
|
onEnd = { endFakeDrag() }
|
||||||
override fun onAnimationCancel(animation: Animator?) {}
|
)
|
||||||
override fun onAnimationRepeat(animation: Animator?) {}
|
|
||||||
})
|
|
||||||
interpolator = AccelerateDecelerateInterpolator()
|
|
||||||
duration = 500
|
duration = 500
|
||||||
start()
|
start()
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ class EmptyPreference @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setSummary(newSummary: String) {
|
fun setSummary(newSummary: String) {
|
||||||
with (binding) {
|
with(binding) {
|
||||||
preferenceSummary.text = newSummary
|
preferenceSummary.text = newSummary
|
||||||
preferenceSummary.isVisible = true
|
preferenceSummary.isVisible = true
|
||||||
preferenceTitle.setPadding(0, 0, 0, 0)
|
preferenceTitle.setPadding(0, 0, 0, 0)
|
||||||
|
@ -40,10 +40,11 @@ class EmptyPreference @JvmOverloads constructor(
|
||||||
|
|
||||||
private fun initAttrs(context: Context, attrs: AttributeSet?) {
|
private fun initAttrs(context: Context, attrs: AttributeSet?) {
|
||||||
attrs?.let { mAttrs ->
|
attrs?.let { mAttrs ->
|
||||||
val typedArray = context.obtainStyledAttributes(mAttrs, R.styleable.EmptyPreference, 0, 0)
|
val typedArray =
|
||||||
|
context.obtainStyledAttributes(mAttrs, R.styleable.EmptyPreference, 0, 0)
|
||||||
val title = typedArray.getText(R.styleable.EmptyPreference_preference_title)
|
val title = typedArray.getText(R.styleable.EmptyPreference_preference_title)
|
||||||
val summary = typedArray.getText(R.styleable.EmptyPreference_preference_summary)
|
val summary = typedArray.getText(R.styleable.EmptyPreference_preference_summary)
|
||||||
with (binding) {
|
with(binding) {
|
||||||
if (summary != null) {
|
if (summary != null) {
|
||||||
preferenceSummary.text = summary
|
preferenceSummary.text = summary
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -27,7 +27,8 @@ class PreferenceCategory @JvmOverloads constructor(
|
||||||
|
|
||||||
private fun initAttrs(context: Context, attrs: AttributeSet?) {
|
private fun initAttrs(context: Context, attrs: AttributeSet?) {
|
||||||
attrs.let { mAttrs ->
|
attrs.let { mAttrs ->
|
||||||
val typedArray = context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0)
|
val typedArray =
|
||||||
|
context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0)
|
||||||
val title = typedArray.getText(R.styleable.PreferenceCategory_category_title)
|
val title = typedArray.getText(R.styleable.PreferenceCategory_category_title)
|
||||||
|
|
||||||
binding.categoryTitle.text = title
|
binding.categoryTitle.text = title
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.vanced.manager.ui.core
|
package com.vanced.manager.ui.core
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.CompoundButton
|
import android.widget.CompoundButton
|
||||||
|
@ -31,6 +32,13 @@ class PreferenceSwitch @JvmOverloads constructor(
|
||||||
|
|
||||||
private var mListener: OnCheckedListener? = null
|
private var mListener: OnCheckedListener? = null
|
||||||
|
|
||||||
|
private val prefListener =
|
||||||
|
SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
|
||||||
|
if (key == prefKey) {
|
||||||
|
binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var _binding: ViewPreferenceSwitchBinding? = null
|
private var _binding: ViewPreferenceSwitchBinding? = null
|
||||||
|
|
||||||
val binding: ViewPreferenceSwitchBinding
|
val binding: ViewPreferenceSwitchBinding
|
||||||
|
@ -38,11 +46,7 @@ class PreferenceSwitch @JvmOverloads constructor(
|
||||||
|
|
||||||
init {
|
init {
|
||||||
_binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true)
|
_binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true)
|
||||||
prefs.registerOnSharedPreferenceChangeListener { sharedPreferences, key ->
|
prefs.registerOnSharedPreferenceChangeListener(prefListener)
|
||||||
if (key == prefKey) {
|
|
||||||
binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
attrs?.let { mAttrs ->
|
attrs?.let { mAttrs ->
|
||||||
with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) {
|
with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) {
|
||||||
val title = getText(R.styleable.PreferenceSwitch_switch_title)
|
val title = getText(R.styleable.PreferenceSwitch_switch_title)
|
||||||
|
|
|
@ -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))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,9 +7,7 @@ import androidx.core.graphics.ColorUtils
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.accentColor
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.defPrefs
|
|
||||||
import com.vanced.manager.utils.lifecycleOwner
|
import com.vanced.manager.utils.lifecycleOwner
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedMaterialButton @JvmOverloads constructor(
|
class ThemedMaterialButton @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -18,8 +16,7 @@ class ThemedMaterialButton @JvmOverloads constructor(
|
||||||
) : MaterialButton(context, attributeSet, defStyleAttr) {
|
) : MaterialButton(context, attributeSet, defStyleAttr) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setBgColor(context.defPrefs.managerAccent)
|
context.lifecycleOwner?.let { owner ->
|
||||||
context.lifecycleOwner()?.let { owner ->
|
|
||||||
accentColor.observe(owner) { color ->
|
accentColor.observe(owner) { color ->
|
||||||
setBgColor(color.toInt())
|
setBgColor(color.toInt())
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,14 +5,13 @@ import android.content.res.ColorStateList
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.google.android.material.checkbox.MaterialCheckBox
|
import com.google.android.material.checkbox.MaterialCheckBox
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedMaterialCheckbox @JvmOverloads constructor(
|
class ThemedMaterialCheckbox @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attributeSet: AttributeSet? = null,
|
attributeSet: AttributeSet? = null,
|
||||||
) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) {
|
) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) {
|
||||||
init {
|
init {
|
||||||
buttonTintList = ColorStateList.valueOf(context.defPrefs.managerAccent)
|
buttonTintList = ColorStateList.valueOf(accentColor.value!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,14 +5,13 @@ import android.content.res.ColorStateList
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.google.android.material.radiobutton.MaterialRadioButton
|
import com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedMaterialRadioButton @JvmOverloads constructor(
|
class ThemedMaterialRadioButton @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attributeSet: AttributeSet? = null,
|
attributeSet: AttributeSet? = null,
|
||||||
) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) {
|
) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) {
|
||||||
init {
|
init {
|
||||||
buttonTintList = ColorStateList.valueOf(context.defPrefs.managerAccent)
|
buttonTintList = ColorStateList.valueOf(accentColor.value!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,8 +4,7 @@ import android.content.Context
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.google.android.material.slider.Slider
|
import com.google.android.material.slider.Slider
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedMaterialSlider @JvmOverloads constructor(
|
class ThemedMaterialSlider @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -14,7 +13,7 @@ class ThemedMaterialSlider @JvmOverloads constructor(
|
||||||
) : Slider(context, attributeSet, defStyleAttr) {
|
) : Slider(context, attributeSet, defStyleAttr) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val accentValue = ColorStateList.valueOf(context.defPrefs.managerAccent)
|
val accentValue = ColorStateList.valueOf(accentColor.value!!)
|
||||||
thumbTintList = accentValue
|
thumbTintList = accentValue
|
||||||
trackActiveTintList = accentValue
|
trackActiveTintList = accentValue
|
||||||
trackInactiveTintList = accentValue.withAlpha(70)
|
trackInactiveTintList = accentValue.withAlpha(70)
|
||||||
|
|
|
@ -6,10 +6,7 @@ import android.util.AttributeSet
|
||||||
import androidx.core.graphics.ColorUtils
|
import androidx.core.graphics.ColorUtils
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.vanced.manager.utils.accentColor
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.defPrefs
|
|
||||||
import com.vanced.manager.utils.lifecycleOwner
|
import com.vanced.manager.utils.lifecycleOwner
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
|
|
||||||
class ThemedOutlinedMaterialButton @JvmOverloads constructor(
|
class ThemedOutlinedMaterialButton @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -17,8 +14,7 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
|
||||||
defStyleAttr: Int = 0
|
defStyleAttr: Int = 0
|
||||||
) : MaterialButton(context, attributeSet, defStyleAttr) {
|
) : MaterialButton(context, attributeSet, defStyleAttr) {
|
||||||
init {
|
init {
|
||||||
applyAccent(context.defPrefs.managerAccent)
|
context.lifecycleOwner?.let { owner ->
|
||||||
context.lifecycleOwner()?.let { owner ->
|
|
||||||
accentColor.observe(owner) { color ->
|
accentColor.observe(owner) { color ->
|
||||||
applyAccent(color.toInt())
|
applyAccent(color.toInt())
|
||||||
}
|
}
|
||||||
|
@ -27,6 +23,9 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor(
|
||||||
|
|
||||||
private fun applyAccent(color: Int) {
|
private fun applyAccent(color: Int) {
|
||||||
setTextColor(color)
|
setTextColor(color)
|
||||||
rippleColor = ColorStateList(arrayOf(intArrayOf()), intArrayOf(ColorUtils.setAlphaComponent(color, 50)))
|
rippleColor = ColorStateList(
|
||||||
|
arrayOf(intArrayOf()),
|
||||||
|
intArrayOf(ColorUtils.setAlphaComponent(color, 50))
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,21 +4,27 @@ import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedSwipeRefreshlayout @JvmOverloads constructor(
|
class ThemedSwipeRefreshlayout @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attributeSet: AttributeSet? = null
|
attributeSet: AttributeSet? = null
|
||||||
) : SwipeRefreshLayout(context, attributeSet) {
|
) : SwipeRefreshLayout(context, attributeSet) {
|
||||||
init {
|
init {
|
||||||
setColorSchemeColors(context.defPrefs.managerAccent)
|
setColorSchemeColors(accentColor.value!!)
|
||||||
initAttrs(context, attributeSet)
|
initAttrs(context, attributeSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initAttrs(context: Context, attributeSet: AttributeSet?) {
|
private fun initAttrs(context: Context, attributeSet: AttributeSet?) {
|
||||||
attributeSet.let {
|
attributeSet.let {
|
||||||
val typedAttrs = context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0)
|
val typedAttrs =
|
||||||
setProgressBackgroundColorSchemeColor(typedAttrs.getColor(R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor, 0))
|
context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0)
|
||||||
|
setProgressBackgroundColorSchemeColor(
|
||||||
|
typedAttrs.getColor(
|
||||||
|
R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor,
|
||||||
|
0
|
||||||
|
)
|
||||||
|
)
|
||||||
typedAttrs.recycle()
|
typedAttrs.recycle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,20 +9,18 @@ import androidx.core.graphics.ColorUtils
|
||||||
import androidx.core.graphics.drawable.DrawableCompat
|
import androidx.core.graphics.drawable.DrawableCompat
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.accentColor
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.defPrefs
|
|
||||||
import com.vanced.manager.utils.lifecycleOwner
|
import com.vanced.manager.utils.lifecycleOwner
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedSwitchCompat @JvmOverloads constructor(
|
class ThemedSwitchCompat @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attributeSet: AttributeSet? = null,
|
attributeSet: AttributeSet? = null,
|
||||||
) : SwitchCompat(context, attributeSet, R.attr.switchStyle) {
|
) : SwitchCompat(context, attributeSet, R.attr.switchStyle) {
|
||||||
|
|
||||||
private val states = arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked))
|
private val states =
|
||||||
|
arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked))
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setSwitchColors(context.defPrefs.managerAccent)
|
context.lifecycleOwner?.let { owner ->
|
||||||
context.lifecycleOwner()?.let { owner ->
|
|
||||||
accentColor.observe(owner) { color ->
|
accentColor.observe(owner) { color ->
|
||||||
setSwitchColors(color.toInt())
|
setSwitchColors(color.toInt())
|
||||||
}
|
}
|
||||||
|
@ -32,7 +30,13 @@ class ThemedSwitchCompat @JvmOverloads constructor(
|
||||||
private fun setSwitchColors(color: Int) {
|
private fun setSwitchColors(color: Int) {
|
||||||
val thumbColors = intArrayOf(Color.LTGRAY, color)
|
val thumbColors = intArrayOf(Color.LTGRAY, color)
|
||||||
val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70))
|
val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70))
|
||||||
DrawableCompat.setTintList(DrawableCompat.wrap(thumbDrawable), ColorStateList(states, thumbColors))
|
DrawableCompat.setTintList(
|
||||||
DrawableCompat.setTintList(DrawableCompat.wrap(trackDrawable), ColorStateList(states, trackColors))
|
DrawableCompat.wrap(thumbDrawable),
|
||||||
|
ColorStateList(states, thumbColors)
|
||||||
|
)
|
||||||
|
DrawableCompat.setTintList(
|
||||||
|
DrawableCompat.wrap(trackDrawable),
|
||||||
|
ColorStateList(states, trackColors)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,9 +4,7 @@ import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import androidx.appcompat.widget.AppCompatTextView
|
import androidx.appcompat.widget.AppCompatTextView
|
||||||
import com.vanced.manager.utils.accentColor
|
import com.vanced.manager.utils.accentColor
|
||||||
import com.vanced.manager.utils.defPrefs
|
|
||||||
import com.vanced.manager.utils.lifecycleOwner
|
import com.vanced.manager.utils.lifecycleOwner
|
||||||
import com.vanced.manager.utils.managerAccent
|
|
||||||
|
|
||||||
class ThemedTextView @JvmOverloads constructor(
|
class ThemedTextView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -14,8 +12,7 @@ class ThemedTextView @JvmOverloads constructor(
|
||||||
defStyleAttr: Int = 0
|
defStyleAttr: Int = 0
|
||||||
) : AppCompatTextView(context, attributeSet, defStyleAttr) {
|
) : AppCompatTextView(context, attributeSet, defStyleAttr) {
|
||||||
init {
|
init {
|
||||||
setTextColor(context.defPrefs.managerAccent)
|
context.lifecycleOwner?.let { owner ->
|
||||||
context.lifecycleOwner()?.let { owner ->
|
|
||||||
accentColor.observe(owner) { color ->
|
accentColor.observe(owner) { color ->
|
||||||
setTextColor(color.toInt())
|
setTextColor(color.toInt())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.vanced.manager.ui.dialogs
|
package com.vanced.manager.ui.dialogs
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
@ -72,20 +73,28 @@ class AppDownloadDialog : BindingDialogFragment<DialogAppDownloadBinding>() {
|
||||||
appDownloadHeader.text = app
|
appDownloadHeader.text = app
|
||||||
if (arguments?.getBoolean(TAG_INSTALLING) == false) {
|
if (arguments?.getBoolean(TAG_INSTALLING) == false) {
|
||||||
when (app) {
|
when (app) {
|
||||||
getString(R.string.vanced) -> downloadVanced(requireContext(), arguments?.getString(TAG_VERSION))
|
getString(R.string.vanced) -> downloadVanced(
|
||||||
getString(R.string.music) -> downloadMusic(requireContext(), arguments?.getString(TAG_VERSION))
|
requireContext(),
|
||||||
|
arguments?.getString(TAG_VERSION)
|
||||||
|
)
|
||||||
|
getString(R.string.music) -> downloadMusic(
|
||||||
|
requireContext(),
|
||||||
|
arguments?.getString(TAG_VERSION)
|
||||||
|
)
|
||||||
getString(R.string.microg) -> downloadMicrog(requireContext())
|
getString(R.string.microg) -> downloadMicrog(requireContext())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
private fun DialogAppDownloadBinding.bindDownloadProgress() {
|
private fun DialogAppDownloadBinding.bindDownloadProgress() {
|
||||||
downloadProgress.observe(viewLifecycleOwner) {
|
downloadProgress.observe(viewLifecycleOwner) {
|
||||||
appDownloadProgressbar.progress = it
|
appDownloadProgressbar.progress = it
|
||||||
|
appDownloadProgress.text = "$it%"
|
||||||
}
|
}
|
||||||
installing.observe(viewLifecycleOwner) { installing ->
|
installing.observe(viewLifecycleOwner) { installing ->
|
||||||
appDownloadProgressbar.isVisible = !installing
|
appDownloadProgressbarContainer.isVisible = !installing
|
||||||
appInstallProgressbar.isVisible = installing
|
appInstallProgressbar.isVisible = installing
|
||||||
appDownloadFile.isVisible = !installing
|
appDownloadFile.isVisible = !installing
|
||||||
appDownloadCancel.isEnabled = !installing
|
appDownloadCancel.isEnabled = !installing
|
||||||
|
|
|
@ -2,11 +2,10 @@ package com.vanced.manager.ui.dialogs
|
||||||
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.drawable.ColorDrawable
|
import android.graphics.drawable.ColorDrawable
|
||||||
import android.graphics.drawable.Drawable
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.core.graphics.drawable.toBitmap
|
import androidx.annotation.DrawableRes
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.core.ui.base.BindingDialogFragment
|
import com.vanced.manager.core.ui.base.BindingDialogFragment
|
||||||
import com.vanced.manager.databinding.DialogAppInfoBinding
|
import com.vanced.manager.databinding.DialogAppInfoBinding
|
||||||
|
@ -21,13 +20,15 @@ class AppInfoDialog : BindingDialogFragment<DialogAppInfoBinding>() {
|
||||||
|
|
||||||
fun newInstance(
|
fun newInstance(
|
||||||
appName: String?,
|
appName: String?,
|
||||||
appIcon: Drawable?,
|
@DrawableRes appIcon: Int?,
|
||||||
changelog: String?
|
changelog: String?
|
||||||
): AppInfoDialog = AppInfoDialog().apply {
|
): AppInfoDialog = AppInfoDialog().apply {
|
||||||
arguments = Bundle().apply {
|
arguments = Bundle().apply {
|
||||||
putString(TAG_APP_NAME, appName)
|
putString(TAG_APP_NAME, appName)
|
||||||
putString(TAG_CHANGELOG, changelog)
|
putString(TAG_CHANGELOG, changelog)
|
||||||
putParcelable(TAG_APP_ICON, appIcon?.toBitmap())
|
if (appIcon != null) {
|
||||||
|
putInt(TAG_APP_ICON, appIcon)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +48,7 @@ class AppInfoDialog : BindingDialogFragment<DialogAppInfoBinding>() {
|
||||||
with(binding) {
|
with(binding) {
|
||||||
aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME))
|
aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME))
|
||||||
aboutAppChangelog.text = arguments?.getString(TAG_CHANGELOG)
|
aboutAppChangelog.text = arguments?.getString(TAG_CHANGELOG)
|
||||||
aboutAppImage.setImageBitmap(arguments?.getParcelable(TAG_APP_ICON))
|
arguments?.getInt(TAG_APP_ICON)?.let { aboutAppImage.setImageResource(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,11 +11,12 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.core.ui.ext.showDialog
|
import com.vanced.manager.core.ui.ext.showDialog
|
||||||
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
|
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
|
||||||
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
||||||
|
import com.vanced.manager.utils.checkedButtonTag
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.defPrefs
|
||||||
import com.vanced.manager.utils.formatVersion
|
import com.vanced.manager.utils.formatVersion
|
||||||
import com.vanced.manager.utils.getCheckedButtonTag
|
|
||||||
|
|
||||||
class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
|
class AppVersionSelectorDialog :
|
||||||
|
BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
|
||||||
|
|
||||||
private val prefs by lazy { requireActivity().defPrefs }
|
private val prefs by lazy { requireActivity().defPrefs }
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ class AppVersionSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRa
|
||||||
}
|
}
|
||||||
dialogTitle.text = getString(R.string.version)
|
dialogTitle.text = getString(R.string.version)
|
||||||
dialogSave.setOnClickListener {
|
dialogSave.setOnClickListener {
|
||||||
val checkedTag = dialogRadiogroup.getCheckedButtonTag()
|
val checkedTag = dialogRadiogroup.checkedButtonTag
|
||||||
if (checkedTag != null) {
|
if (checkedTag != null) {
|
||||||
prefs.edit { putString("${arguments?.getString(TAG_APP)}_version", checkedTag) }
|
prefs.edit { putString("${arguments?.getString(TAG_APP)}_version", checkedTag) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@ import androidx.core.content.edit
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.applyAccent
|
|
||||||
import com.vanced.manager.utils.isMiuiOptimizationsEnabled
|
import com.vanced.manager.utils.isMiuiOptimizationsEnabled
|
||||||
import com.vanced.manager.utils.openUrl
|
import com.vanced.manager.utils.openUrl
|
||||||
|
import com.vanced.manager.utils.showWithAccent
|
||||||
|
|
||||||
object DialogContainer {
|
object DialogContainer {
|
||||||
|
|
||||||
|
@ -20,17 +20,17 @@ object DialogContainer {
|
||||||
}
|
}
|
||||||
setOnCancelListener {
|
setOnCancelListener {
|
||||||
if (context.isMiuiOptimizationsEnabled) {
|
if (context.isMiuiOptimizationsEnabled) {
|
||||||
applyAccentMiuiDialog(context)
|
miuiDialog(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
create()
|
create()
|
||||||
applyAccent()
|
showWithAccent()
|
||||||
}
|
}
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
prefs.edit { putBoolean("firstLaunch", false) }
|
prefs.edit { putBoolean("firstLaunch", false) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun applyAccentMiuiDialog(context: Context) {
|
fun miuiDialog(context: Context) {
|
||||||
MaterialAlertDialogBuilder(context).apply {
|
MaterialAlertDialogBuilder(context).apply {
|
||||||
setTitle(context.getString(R.string.miui_one_title))
|
setTitle(context.getString(R.string.miui_one_title))
|
||||||
setMessage(context.getString(R.string.miui_one))
|
setMessage(context.getString(R.string.miui_one))
|
||||||
|
@ -44,7 +44,7 @@ object DialogContainer {
|
||||||
}
|
}
|
||||||
setCancelable(false)
|
setCancelable(false)
|
||||||
create()
|
create()
|
||||||
applyAccent()
|
showWithAccent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ object DialogContainer {
|
||||||
setMessage("So this statement is false huh? I'll go with True!")
|
setMessage("So this statement is false huh? I'll go with True!")
|
||||||
setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() }
|
setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() }
|
||||||
create()
|
create()
|
||||||
applyAccent()
|
showWithAccent()
|
||||||
}
|
}
|
||||||
|
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
@ -68,28 +68,54 @@ object DialogContainer {
|
||||||
when (msg) {
|
when (msg) {
|
||||||
context.getString(R.string.installation_signature) -> {
|
context.getString(R.string.installation_signature) -> {
|
||||||
setPositiveButton(context.getString(R.string.guide)) { _, _ ->
|
setPositiveButton(context.getString(R.string.guide)) { _, _ ->
|
||||||
openUrl("https://lmgtfy.com/?q=andnixsh+apk+verification+disable", R.color.Twitter, context)
|
openUrl(
|
||||||
|
"https://lmgtfy.com/?q=andnixsh+apk+verification+disable",
|
||||||
|
R.color.Twitter,
|
||||||
|
context
|
||||||
|
)
|
||||||
}
|
}
|
||||||
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
||||||
if (fullMsg != null)
|
if (fullMsg != null)
|
||||||
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) }
|
setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
|
||||||
|
basicDialog(
|
||||||
|
context.getString(R.string.advanced),
|
||||||
|
fullMsg,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
context.getString(R.string.installation_miui) -> {
|
context.getString(R.string.installation_miui) -> {
|
||||||
setPositiveButton(context.getString(R.string.guide)) { _, _ ->
|
setPositiveButton(context.getString(R.string.guide)) { _, _ ->
|
||||||
openUrl("https://telegra.ph/How-to-install-v15-on-MIUI-02-11", R.color.Telegram, context)
|
openUrl(
|
||||||
|
"https://telegra.ph/How-to-install-v15-on-MIUI-02-11",
|
||||||
|
R.color.Telegram,
|
||||||
|
context
|
||||||
|
)
|
||||||
}
|
}
|
||||||
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
||||||
if (fullMsg != null)
|
if (fullMsg != null)
|
||||||
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) }
|
setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
|
||||||
|
basicDialog(
|
||||||
|
context.getString(R.string.advanced),
|
||||||
|
fullMsg,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
||||||
if (fullMsg != null)
|
if (fullMsg != null)
|
||||||
setNegativeButton(context.getString(R.string.advanced)) { _, _ -> basicDialog(context.getString(R.string.advanced), fullMsg, context) }
|
setNegativeButton(context.getString(R.string.advanced)) { _, _ ->
|
||||||
|
basicDialog(
|
||||||
|
context.getString(R.string.advanced),
|
||||||
|
fullMsg,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
create()
|
create()
|
||||||
applyAccent()
|
showWithAccent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +125,7 @@ object DialogContainer {
|
||||||
setMessage(msg)
|
setMessage(msg)
|
||||||
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
|
||||||
create()
|
create()
|
||||||
applyAccent()
|
showWithAccent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,8 @@ import com.vanced.manager.databinding.DialogInstallationFilesDetectedBinding
|
||||||
import com.vanced.manager.utils.defPrefs
|
import com.vanced.manager.utils.defPrefs
|
||||||
import com.vanced.manager.utils.managerVariant
|
import com.vanced.manager.utils.managerVariant
|
||||||
|
|
||||||
class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() {
|
class InstallationFilesDetectedDialog :
|
||||||
|
BindingBottomSheetDialogFragment<DialogInstallationFilesDetectedBinding>() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@ -40,9 +41,11 @@ class InstallationFilesDetectedDialog : BindingBottomSheetDialogFragment<DialogI
|
||||||
|
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
with(binding) {
|
with(binding) {
|
||||||
val app = arguments?.getString(TAG_APP) ?: throw IllegalArgumentException("app name is null")
|
val app =
|
||||||
|
arguments?.getString(TAG_APP) ?: throw IllegalArgumentException("app name is null")
|
||||||
installationDetectedTitle.text = getString(R.string.app_install_files_detected, app)
|
installationDetectedTitle.text = getString(R.string.app_install_files_detected, app)
|
||||||
installationDetectedSummary.text = getString(R.string.app_install_files_detected_summary, app)
|
installationDetectedSummary.text =
|
||||||
|
getString(R.string.app_install_files_detected_summary, app)
|
||||||
installationDetectedRedownload.setOnClickListener {
|
installationDetectedRedownload.setOnClickListener {
|
||||||
dismiss()
|
dismiss()
|
||||||
when (app) {
|
when (app) {
|
||||||
|
|
|
@ -50,9 +50,20 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
|
||||||
hexEdittext.apply {
|
hexEdittext.apply {
|
||||||
setText(accent.toHex(), TextView.BufferType.EDITABLE)
|
setText(accent.toHex(), TextView.BufferType.EDITABLE)
|
||||||
addTextChangedListener(object : TextWatcher {
|
addTextChangedListener(object : TextWatcher {
|
||||||
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
|
override fun beforeTextChanged(
|
||||||
|
s: CharSequence?,
|
||||||
|
start: Int,
|
||||||
|
count: Int,
|
||||||
|
after: Int
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
override fun onTextChanged(
|
||||||
|
s: CharSequence?,
|
||||||
|
start: Int,
|
||||||
|
before: Int,
|
||||||
|
count: Int
|
||||||
|
) {
|
||||||
if (length() == 0) {
|
if (length() == 0) {
|
||||||
setText("#")
|
setText("#")
|
||||||
setSelection(1)
|
setSelection(1)
|
||||||
|
@ -63,7 +74,8 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
|
||||||
val colorFromEditText = Color.parseColor(text.toString())
|
val colorFromEditText = Color.parseColor(text.toString())
|
||||||
accentPicker.setColor(colorFromEditText)
|
accentPicker.setColor(colorFromEditText)
|
||||||
mutableAccentColor.value = colorFromEditText
|
mutableAccentColor.value = colorFromEditText
|
||||||
} catch (e: IllegalArgumentException) {}
|
} catch (e: IllegalArgumentException) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +108,11 @@ class ManagerAccentColorDialog : BindingDialogFragment<DialogManagerAccentColorB
|
||||||
prefs.managerAccent = colorFromEditText
|
prefs.managerAccent = colorFromEditText
|
||||||
} catch (e: IllegalArgumentException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
log("VMTheme", getString(R.string.failed_accent))
|
log("VMTheme", getString(R.string.failed_accent))
|
||||||
Toast.makeText(requireActivity(), getString(R.string.failed_accent), Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireActivity(),
|
||||||
|
getString(R.string.failed_accent),
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES
|
||||||
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.databinding.DialogManagerLanguageBinding
|
import com.vanced.manager.databinding.DialogManagerLanguageBinding
|
||||||
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
||||||
import com.vanced.manager.utils.getCheckedButtonTag
|
import com.vanced.manager.utils.checkedButtonTag
|
||||||
import com.vanced.manager.utils.getLanguageFormat
|
import com.vanced.manager.utils.getLanguageFormat
|
||||||
import com.vanced.manager.utils.managerLang
|
import com.vanced.manager.utils.managerLang
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment<DialogManagerLang
|
||||||
val language = prefs.managerLang
|
val language = prefs.managerLang
|
||||||
root.findViewWithTag<ThemedMaterialRadioButton>(language)?.isChecked = true
|
root.findViewWithTag<ThemedMaterialRadioButton>(language)?.isChecked = true
|
||||||
languageSave.setOnClickListener {
|
languageSave.setOnClickListener {
|
||||||
val newPref = binding.languageRadiogroup.getCheckedButtonTag()
|
val newPref = binding.languageRadiogroup.checkedButtonTag
|
||||||
if (language != newPref) {
|
if (language != newPref) {
|
||||||
prefs.managerLang = newPref
|
prefs.managerLang = newPref
|
||||||
dismiss()
|
dismiss()
|
||||||
|
|
|
@ -7,7 +7,7 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||||
import com.google.android.material.radiobutton.MaterialRadioButton
|
import com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.databinding.DialogManagerThemeBinding
|
import com.vanced.manager.databinding.DialogManagerThemeBinding
|
||||||
import com.vanced.manager.utils.getCheckedButtonTag
|
import com.vanced.manager.utils.checkedButtonTag
|
||||||
import com.vanced.manager.utils.managerTheme
|
import com.vanced.manager.utils.managerTheme
|
||||||
|
|
||||||
class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() {
|
class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBinding>() {
|
||||||
|
@ -36,7 +36,7 @@ class ManagerThemeDialog : BindingBottomSheetDialogFragment<DialogManagerThemeBi
|
||||||
val theme = prefs.managerTheme
|
val theme = prefs.managerTheme
|
||||||
root.findViewWithTag<MaterialRadioButton>(theme).isChecked = true
|
root.findViewWithTag<MaterialRadioButton>(theme).isChecked = true
|
||||||
themeSave.setOnClickListener {
|
themeSave.setOnClickListener {
|
||||||
val newPref = themeRadiogroup.getCheckedButtonTag()
|
val newPref = themeRadiogroup.checkedButtonTag
|
||||||
if (theme != newPref) {
|
if (theme != newPref) {
|
||||||
prefs.managerTheme = newPref
|
prefs.managerTheme = newPref
|
||||||
dismiss()
|
dismiss()
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.vanced.manager.ui.dialogs
|
package com.vanced.manager.ui.dialogs
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
@ -57,7 +58,8 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
|
||||||
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||||
bindData()
|
bindData()
|
||||||
if (arguments?.getBoolean(TAG_FORCE_UPDATE) == true) {
|
if (arguments?.getBoolean(TAG_FORCE_UPDATE) == true) {
|
||||||
binding.managerUpdatePatient.text = requireActivity().getString(R.string.please_be_patient)
|
binding.managerUpdatePatient.text =
|
||||||
|
requireActivity().getString(R.string.please_be_patient)
|
||||||
downloadManager(requireActivity())
|
downloadManager(requireActivity())
|
||||||
} else {
|
} else {
|
||||||
checkUpdates()
|
checkUpdates()
|
||||||
|
@ -77,10 +79,12 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
private fun DialogManagerUpdateBinding.bindDownloadProgress() {
|
private fun DialogManagerUpdateBinding.bindDownloadProgress() {
|
||||||
downloadProgress.observe(viewLifecycleOwner) {
|
downloadProgress.observe(viewLifecycleOwner) {
|
||||||
managerUpdateProgressbar.progress = it
|
managerUpdateProgressbar.progress = it
|
||||||
managerUpdateProgressbar.isVisible = it != 0
|
managerUpdateProgressbarContainer.isVisible = it != 0
|
||||||
|
managerUpdateProgress.text = "$it%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,10 +100,12 @@ class ManagerUpdateDialog : BindingDialogFragment<DialogManagerUpdateBinding>()
|
||||||
|
|
||||||
private fun checkUpdates() {
|
private fun checkUpdates() {
|
||||||
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
|
if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) {
|
||||||
binding.managerUpdatePatient.text = requireActivity().getString(R.string.please_be_patient)
|
binding.managerUpdatePatient.text =
|
||||||
|
requireActivity().getString(R.string.please_be_patient)
|
||||||
downloadManager(requireActivity())
|
downloadManager(requireActivity())
|
||||||
} else {
|
} else {
|
||||||
binding.managerUpdatePatient.text = requireActivity().getString(R.string.update_not_found)
|
binding.managerUpdatePatient.text =
|
||||||
|
requireActivity().getString(R.string.update_not_found)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.databinding.DialogManagerVariantBinding
|
import com.vanced.manager.databinding.DialogManagerVariantBinding
|
||||||
import com.vanced.manager.utils.getCheckedButtonTag
|
import com.vanced.manager.utils.checkedButtonTag
|
||||||
import com.vanced.manager.utils.managerVariant
|
import com.vanced.manager.utils.managerVariant
|
||||||
|
|
||||||
class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() {
|
class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVariantBinding>() {
|
||||||
|
@ -37,11 +37,11 @@ class ManagerVariantDialog : BindingBottomSheetDialogFragment<DialogManagerVaria
|
||||||
val variant = prefs.managerVariant
|
val variant = prefs.managerVariant
|
||||||
root.findViewWithTag<MaterialRadioButton>(variant).isChecked = true
|
root.findViewWithTag<MaterialRadioButton>(variant).isChecked = true
|
||||||
variantSave.setOnClickListener {
|
variantSave.setOnClickListener {
|
||||||
val newPref = variantRadiogroup.getCheckedButtonTag()
|
val newPref = variantRadiogroup.checkedButtonTag
|
||||||
if (variant != newPref) {
|
if (variant != newPref) {
|
||||||
prefs.managerVariant =
|
prefs.managerVariant =
|
||||||
if (newPref == "root" && Shell.rootAccess()) {
|
if (newPref == "root" && Shell.rootAccess()) {
|
||||||
"root"
|
"root"
|
||||||
} else {
|
} else {
|
||||||
"nonroot"
|
"nonroot"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.vanced.manager.ui.dialogs
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.core.ui.ext.showDialog
|
import com.vanced.manager.core.ui.ext.showDialog
|
||||||
|
@ -34,8 +33,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
with(binding) {
|
with(binding) {
|
||||||
val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions()
|
val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions()
|
||||||
musicInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.music))
|
musicInstallTitle.text =
|
||||||
musicVersion.text = getString(R.string.chosen_version, prefs.musicVersion?.formatVersion(requireActivity()))
|
getString(R.string.app_installation_preferences, getString(R.string.music))
|
||||||
|
musicVersion.text = getString(
|
||||||
|
R.string.chosen_version,
|
||||||
|
prefs.musicVersion?.formatVersion(requireActivity())
|
||||||
|
)
|
||||||
openVersionSelectorLayout.setOnClickListener {
|
openVersionSelectorLayout.setOnClickListener {
|
||||||
dismiss()
|
dismiss()
|
||||||
showDialog(
|
showDialog(
|
||||||
|
@ -46,36 +49,12 @@ class MusicPreferencesDialog : BindingBottomSheetDialogFragment<DialogMusicPrefe
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
musicInstall.setOnClickListener {
|
musicInstall.setOnClickListener {
|
||||||
fun downloadMusic(version: String? = null) {
|
dismiss()
|
||||||
dismiss()
|
showDialog(
|
||||||
showDialog(
|
AppDownloadDialog.newInstance(
|
||||||
AppDownloadDialog.newInstance(
|
app = getString(R.string.music)
|
||||||
app = getString(R.string.music),
|
|
||||||
version = version
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
if (prefs.managerVariant == "nonroot" && isMicrogBroken && prefs.musicVersion?.getLatestAppVersion(musicVersions.value?.value ?: listOf(""))?.replace(".", "")?.take(3)?.toIntOrNull() ?: 0 >= 411 &&
|
|
||||||
!PackageHelper.isPackageInstalled(
|
|
||||||
AppUtils.musicPkg,
|
|
||||||
requireActivity().packageManager
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
MaterialAlertDialogBuilder(requireActivity()).apply {
|
|
||||||
setTitle(R.string.microg_bug)
|
|
||||||
setMessage(R.string.microg_bug_summary_music)
|
|
||||||
setPositiveButton(R.string.auth_dialog_ok) { _, _ ->
|
|
||||||
downloadMusic("4.07.51")
|
|
||||||
}
|
|
||||||
setNeutralButton(R.string.cancel) { _, _ ->
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
create()
|
|
||||||
}.applyAccent()
|
|
||||||
return@setOnClickListener
|
|
||||||
}
|
|
||||||
|
|
||||||
downloadMusic()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,11 @@ class SelectAppsDialog : BindingBottomSheetDialogFragment<DialogSelectAppsBindin
|
||||||
}
|
}
|
||||||
selectAppsSave.setOnClickListener {
|
selectAppsSave.setOnClickListener {
|
||||||
if (ad.apps.all { app -> !app.isChecked }) {
|
if (ad.apps.all { app -> !app.isChecked }) {
|
||||||
Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireActivity(),
|
||||||
|
R.string.select_at_least_one_app,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
prefs.edit {
|
prefs.edit {
|
||||||
|
|
|
@ -32,7 +32,7 @@ class ServiceDTimerDialog : BindingDialogFragment<DialogServicedTimerBinding>()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
with (binding) {
|
with(binding) {
|
||||||
servicedSlider.value = prefs.getInt("serviced_sleep_timer", 1).toFloat()
|
servicedSlider.value = prefs.getInt("serviced_sleep_timer", 1).toFloat()
|
||||||
servicedCancel.setOnClickListener {
|
servicedCancel.setOnClickListener {
|
||||||
dismiss()
|
dismiss()
|
||||||
|
@ -41,12 +41,26 @@ class ServiceDTimerDialog : BindingDialogFragment<DialogServicedTimerBinding>()
|
||||||
try {
|
try {
|
||||||
arrayOf("vanced", "music").forEach { app ->
|
arrayOf("vanced", "music").forEach { app ->
|
||||||
if (scriptExists(app)) {
|
if (scriptExists(app)) {
|
||||||
val apkFPath = "${PackageHelper.apkInstallPath}/${app.capitalize(Locale.ROOT)}/base.apk"
|
val apkFPath =
|
||||||
getPackageDir(requireActivity(), getPkgNameRoot(app))?.let { it1 -> requireActivity().writeServiceDScript(apkFPath, it1, app) }
|
"${PackageHelper.apkInstallPath}/${app.capitalize(Locale.ROOT)}/base.apk"
|
||||||
|
getPackageDir(
|
||||||
|
requireActivity(),
|
||||||
|
getPkgNameRoot(app)
|
||||||
|
)?.let { it1 ->
|
||||||
|
requireActivity().writeServiceDScript(
|
||||||
|
apkFPath,
|
||||||
|
it1,
|
||||||
|
app
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
Toast.makeText(requireActivity(), R.string.script_save_failed, Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireActivity(),
|
||||||
|
R.string.script_save_failed,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,11 +45,12 @@ class URLChangeDialog : BindingDialogFragment<DialogCustomUrlBinding>() {
|
||||||
TextView.BufferType.EDITABLE
|
TextView.BufferType.EDITABLE
|
||||||
)
|
)
|
||||||
urlSave.setOnClickListener {
|
urlSave.setOnClickListener {
|
||||||
val finalUrl = if (urlInput.text?.startsWith("https://") == true || urlInput.text?.startsWith("http://") == true) {
|
val finalUrl =
|
||||||
urlInput.text?.removeSuffix("/").toString()
|
if (urlInput.text?.startsWith("https://") == true || urlInput.text?.startsWith("http://") == true) {
|
||||||
} else {
|
urlInput.text?.removeSuffix("/").toString()
|
||||||
"https://${urlInput.text}".removeSuffix("/")
|
} else {
|
||||||
}
|
"https://${urlInput.text}".removeSuffix("/")
|
||||||
|
}
|
||||||
saveUrl(finalUrl)
|
saveUrl(finalUrl)
|
||||||
}
|
}
|
||||||
urlReset.setOnClickListener { saveUrl(baseUrl) }
|
urlReset.setOnClickListener { saveUrl(baseUrl) }
|
||||||
|
|
|
@ -19,7 +19,8 @@ import com.vanced.manager.utils.lang
|
||||||
import com.vanced.manager.utils.vanced
|
import com.vanced.manager.utils.vanced
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {
|
class VancedLanguageSelectionDialog :
|
||||||
|
BindingBottomSheetDialogFragment<DialogVancedLanguageSelectionBinding>() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@ -52,7 +53,11 @@ class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment<DialogVan
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chosenLangs.isEmpty()) {
|
if (chosenLangs.isEmpty()) {
|
||||||
Toast.makeText(requireActivity(), R.string.select_at_least_one_lang, Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireActivity(),
|
||||||
|
R.string.select_at_least_one_lang,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
prefs.lang = chosenLangs.joinToString()
|
prefs.lang = chosenLangs.joinToString()
|
||||||
|
|
|
@ -3,14 +3,11 @@ package com.vanced.manager.ui.dialogs
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.core.ui.ext.showDialog
|
import com.vanced.manager.core.ui.ext.showDialog
|
||||||
import com.vanced.manager.databinding.DialogVancedPreferencesBinding
|
import com.vanced.manager.databinding.DialogVancedPreferencesBinding
|
||||||
import com.vanced.manager.utils.*
|
import com.vanced.manager.utils.*
|
||||||
import com.vanced.manager.utils.AppUtils.vancedPkg
|
|
||||||
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() {
|
class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPreferencesBinding>() {
|
||||||
|
@ -43,9 +40,16 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
|
||||||
showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT))
|
showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT))
|
||||||
}
|
}
|
||||||
val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions()
|
val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions()
|
||||||
vancedInstallTitle.text = getString(R.string.app_installation_preferences, getString(R.string.vanced))
|
vancedInstallTitle.text =
|
||||||
vancedTheme.text = getString(R.string.chosen_theme, installPrefs.theme?.convertToAppTheme(requireActivity()))
|
getString(R.string.app_installation_preferences, getString(R.string.vanced))
|
||||||
vancedVersion.text = getString(R.string.chosen_version, defPrefs.vancedVersion?.formatVersion(requireActivity()))
|
vancedTheme.text = getString(
|
||||||
|
R.string.chosen_theme,
|
||||||
|
installPrefs.theme?.convertToAppTheme(requireActivity())
|
||||||
|
)
|
||||||
|
vancedVersion.text = getString(
|
||||||
|
R.string.chosen_version,
|
||||||
|
defPrefs.vancedVersion?.formatVersion(requireActivity())
|
||||||
|
)
|
||||||
vancedLang.text = getString(R.string.chosen_lang, showLang)
|
vancedLang.text = getString(R.string.chosen_lang, showLang)
|
||||||
openThemeSelectorLayout.setOnClickListener {
|
openThemeSelectorLayout.setOnClickListener {
|
||||||
dismiss()
|
dismiss()
|
||||||
|
@ -68,33 +72,12 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment<DialogVancedPre
|
||||||
if (showLang.isEmpty()) {
|
if (showLang.isEmpty()) {
|
||||||
installPrefs.lang = "en"
|
installPrefs.lang = "en"
|
||||||
}
|
}
|
||||||
|
dismiss()
|
||||||
fun downloadVanced(version: String? = null) {
|
showDialog(
|
||||||
dismiss()
|
AppDownloadDialog.newInstance(
|
||||||
showDialog(
|
app = getString(R.string.vanced)
|
||||||
AppDownloadDialog.newInstance(
|
|
||||||
app = getString(R.string.vanced),
|
|
||||||
version = version
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
)
|
||||||
|
|
||||||
if (defPrefs.managerVariant == "nonroot" && isMicrogBroken && defPrefs.vancedVersion?.getLatestAppVersion(vancedVersions.value?.value ?: listOf(""))?.take(2)?.toIntOrNull() == 16 && !isPackageInstalled(vancedPkg, requireActivity().packageManager)) {
|
|
||||||
MaterialAlertDialogBuilder(requireActivity()).apply {
|
|
||||||
setTitle(R.string.microg_bug)
|
|
||||||
setMessage(R.string.microg_bug_summary)
|
|
||||||
setPositiveButton(R.string.auth_dialog_ok) { _, _ ->
|
|
||||||
downloadVanced("15.43.32")
|
|
||||||
}
|
|
||||||
setNeutralButton(R.string.cancel) { _, _ ->
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
create()
|
|
||||||
}.applyAccent()
|
|
||||||
return@setOnClickListener
|
|
||||||
}
|
|
||||||
|
|
||||||
downloadVanced()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,12 +10,13 @@ import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment
|
||||||
import com.vanced.manager.core.ui.ext.showDialog
|
import com.vanced.manager.core.ui.ext.showDialog
|
||||||
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
|
import com.vanced.manager.databinding.DialogBottomRadioButtonBinding
|
||||||
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
import com.vanced.manager.ui.core.ThemedMaterialRadioButton
|
||||||
|
import com.vanced.manager.utils.checkedButtonTag
|
||||||
import com.vanced.manager.utils.convertToAppTheme
|
import com.vanced.manager.utils.convertToAppTheme
|
||||||
import com.vanced.manager.utils.getCheckedButtonTag
|
|
||||||
import com.vanced.manager.utils.theme
|
import com.vanced.manager.utils.theme
|
||||||
import com.vanced.manager.utils.vanced
|
import com.vanced.manager.utils.vanced
|
||||||
|
|
||||||
class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
|
class VancedThemeSelectorDialog :
|
||||||
|
BindingBottomSheetDialogFragment<DialogBottomRadioButtonBinding>() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@ -24,7 +25,12 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val prefs by lazy { requireActivity().getSharedPreferences("installPrefs", Context.MODE_PRIVATE) }
|
private val prefs by lazy {
|
||||||
|
requireActivity().getSharedPreferences(
|
||||||
|
"installPrefs",
|
||||||
|
Context.MODE_PRIVATE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
override fun binding(
|
override fun binding(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
@ -51,7 +57,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
|
||||||
tag.isChecked = true
|
tag.isChecked = true
|
||||||
}
|
}
|
||||||
dialogSave.setOnClickListener {
|
dialogSave.setOnClickListener {
|
||||||
val checkedTag = binding.dialogRadiogroup.getCheckedButtonTag()
|
val checkedTag = binding.dialogRadiogroup.checkedButtonTag
|
||||||
if (checkedTag != null) {
|
if (checkedTag != null) {
|
||||||
prefs.theme = checkedTag
|
prefs.theme = checkedTag
|
||||||
}
|
}
|
||||||
|
@ -60,7 +66,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment<DialogBottomR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadButtons() = vanced.value?.array<String>("themes")?.value?.map {theme ->
|
private fun loadButtons() = vanced.value?.array<String>("themes")?.value?.map { theme ->
|
||||||
ThemedMaterialRadioButton(requireActivity()).apply {
|
ThemedMaterialRadioButton(requireActivity()).apply {
|
||||||
text = theme.convertToAppTheme(requireActivity())
|
text = theme.convertToAppTheme(requireActivity())
|
||||||
tag = theme
|
tag = theme
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -6,7 +6,6 @@ import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
@ -37,11 +36,11 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
private fun dataBind() {
|
private fun dataBind() {
|
||||||
requireActivity().title = getString(R.string.title_about)
|
requireActivity().title = getString(R.string.title_about)
|
||||||
binding.root.setOnClickListener {
|
binding.aboutVersionCard.setOnClickListener {
|
||||||
showDialog(
|
showDialog(
|
||||||
AppInfoDialog.newInstance(
|
AppInfoDialog.newInstance(
|
||||||
appName = getString(R.string.app_name),
|
appName = getString(R.string.app_name),
|
||||||
appIcon = AppCompatResources.getDrawable(requireActivity(), R.mipmap.ic_launcher),
|
appIcon = R.mipmap.ic_launcher,
|
||||||
changelog = manager.value?.string("changelog")
|
changelog = manager.value?.string("changelog")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -61,10 +60,18 @@ class AboutFragment : BindingFragment<FragmentAboutBinding>() {
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
|
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
|
||||||
val devSettings = prefs.getBoolean("devSettings", false)
|
val devSettings = prefs.getBoolean("devSettings", false)
|
||||||
if (!devSettings) {
|
if (!devSettings) {
|
||||||
Toast.makeText(requireContext(), "Dev options unlocked!", Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireContext(),
|
||||||
|
"Dev options unlocked!",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
prefs.edit { putBoolean("devSettings", true) }
|
prefs.edit { putBoolean("devSettings", true) }
|
||||||
} else
|
} else
|
||||||
Toast.makeText(requireContext(), "Dev options already unlocked", Toast.LENGTH_SHORT).show()
|
Toast.makeText(
|
||||||
|
requireContext(),
|
||||||
|
"Dev options already unlocked",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
|
||||||
}
|
}
|
||||||
return@setOnTouchListener true
|
return@setOnTouchListener true
|
||||||
|
|
|
@ -41,7 +41,12 @@ class GrantRootFragment : BindingFragment<FragmentGrantRootBinding>() {
|
||||||
|
|
||||||
private fun grantRoot() {
|
private fun grantRoot() {
|
||||||
if (Shell.rootAccess()) {
|
if (Shell.rootAccess()) {
|
||||||
getDefaultSharedPreferences(requireActivity()).edit { putString("vanced_variant", "root") }
|
getDefaultSharedPreferences(requireActivity()).edit {
|
||||||
|
putString(
|
||||||
|
"vanced_variant",
|
||||||
|
"root"
|
||||||
|
)
|
||||||
|
}
|
||||||
navigateToFirstLaunch()
|
navigateToFirstLaunch()
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show()
|
||||||
|
|
|
@ -9,18 +9,14 @@ import android.view.LayoutInflater
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.core.content.edit
|
|
||||||
import androidx.core.content.res.ResourcesCompat
|
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import androidx.preference.PreferenceManager
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.crowdin.platform.util.inflateWithCrowdin
|
import com.crowdin.platform.util.inflateWithCrowdin
|
||||||
import com.github.florent37.viewtooltip.ViewTooltip
|
|
||||||
import com.google.android.flexbox.FlexboxLayoutManager
|
import com.google.android.flexbox.FlexboxLayoutManager
|
||||||
import com.google.android.flexbox.JustifyContent
|
import com.google.android.flexbox.JustifyContent
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.adapter.AppListAdapter
|
import com.vanced.manager.adapter.ExpandableAppListAdapter
|
||||||
import com.vanced.manager.adapter.LinkAdapter
|
import com.vanced.manager.adapter.LinkAdapter
|
||||||
import com.vanced.manager.adapter.SponsorAdapter
|
import com.vanced.manager.adapter.SponsorAdapter
|
||||||
import com.vanced.manager.core.ui.base.BindingFragment
|
import com.vanced.manager.core.ui.base.BindingFragment
|
||||||
|
@ -42,8 +38,6 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
|
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
|
||||||
private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(requireActivity()) }
|
|
||||||
private var tooltip: ViewTooltip? = null
|
|
||||||
|
|
||||||
override fun binding(
|
override fun binding(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
@ -58,29 +52,13 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
requireActivity().title = getString(R.string.title_home)
|
requireActivity().title = getString(R.string.title_home)
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
with (binding) {
|
with(binding) {
|
||||||
homeRefresh.setOnRefreshListener { viewModel.fetchData() }
|
homeRefresh.setOnRefreshListener { viewModel.fetchData() }
|
||||||
isFetching.observe(viewLifecycleOwner) { homeRefresh.isRefreshing = it }
|
isFetching.observe(viewLifecycleOwner) { homeRefresh.isRefreshing = it }
|
||||||
|
|
||||||
if (prefs.getBoolean("show_changelog_tooltip", true)) {
|
|
||||||
tooltip = ViewTooltip
|
|
||||||
.on(recyclerAppList)
|
|
||||||
.position(ViewTooltip.Position.TOP)
|
|
||||||
.autoHide(false, 0)
|
|
||||||
.color(ResourcesCompat.getColor(requireActivity().resources, R.color.Twitter, null))
|
|
||||||
.withShadow(false)
|
|
||||||
.corner(25)
|
|
||||||
.onHide {
|
|
||||||
prefs.edit { putBoolean("show_changelog_tooltip", false) }
|
|
||||||
}
|
|
||||||
.text(requireActivity().getString(R.string.app_changelog_tooltip))
|
|
||||||
|
|
||||||
tooltip?.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
recyclerAppList.apply {
|
recyclerAppList.apply {
|
||||||
layoutManager = LinearLayoutManager(requireActivity())
|
layoutManager = LinearLayoutManager(requireActivity())
|
||||||
adapter = AppListAdapter(requireActivity(), viewModel, tooltip)
|
adapter = ExpandableAppListAdapter(requireActivity(), viewModel /*, tooltip*/)
|
||||||
setHasFixedSize(true)
|
setHasFixedSize(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +88,6 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
localBroadcastManager.unregisterReceiver(broadcastReceiver)
|
localBroadcastManager.unregisterReceiver(broadcastReceiver)
|
||||||
tooltip?.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
|
@ -121,7 +98,11 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>() {
|
||||||
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
|
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
when (intent.action) {
|
when (intent.action) {
|
||||||
INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg").toString(), intent.getStringExtra("fullErrorMsg"), requireActivity())
|
INSTALL_FAILED -> installAlertBuilder(
|
||||||
|
intent.getStringExtra("errorMsg").toString(),
|
||||||
|
intent.getStringExtra("fullErrorMsg"),
|
||||||
|
requireActivity()
|
||||||
|
)
|
||||||
REFRESH_HOME -> viewModel.fetchData()
|
REFRESH_HOME -> viewModel.fetchData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
|
||||||
val hour = calendar.get(Calendar.HOUR_OF_DAY)
|
val hour = calendar.get(Calendar.HOUR_OF_DAY)
|
||||||
val minute = calendar.get(Calendar.MINUTE)
|
val minute = calendar.get(Calendar.MINUTE)
|
||||||
val second = calendar.get(Calendar.SECOND)
|
val second = calendar.get(Calendar.SECOND)
|
||||||
val log = File(requireActivity().getExternalFilesDir("logs")?.path + "/$year$month${day}_$hour$minute$second.log")
|
val log =
|
||||||
|
File(requireActivity().getExternalFilesDir("logs")?.path + "/$year$month${day}_$hour$minute$second.log")
|
||||||
FileWriter(log).apply {
|
FileWriter(log).apply {
|
||||||
append(logs)
|
append(logs)
|
||||||
flush()
|
flush()
|
||||||
|
@ -46,7 +47,8 @@ class LogFragment : BindingFragment<FragmentLogBinding>() {
|
||||||
}
|
}
|
||||||
Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show()
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
Toast.makeText(requireActivity(), R.string.logs_not_saved, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireActivity(), R.string.logs_not_saved, Toast.LENGTH_SHORT)
|
||||||
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,8 @@ class SelectAppsFragment : BindingFragment<FragmentSelectAppsBinding>() {
|
||||||
|
|
||||||
private fun actionOnClickAppsFab() {
|
private fun actionOnClickAppsFab() {
|
||||||
if (selectAdapter.apps.all { app -> !app.isChecked }) {
|
if (selectAdapter.apps.all { app -> !app.isChecked }) {
|
||||||
Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT)
|
||||||
|
.show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val prefs = getDefaultSharedPreferences(requireActivity())
|
val prefs = getDefaultSharedPreferences(requireActivity())
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.view.MenuInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
|
@ -34,6 +35,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) }
|
private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) }
|
||||||
|
|
||||||
private lateinit var variant: String
|
private lateinit var variant: String
|
||||||
|
private lateinit var parentActivity: FragmentActivity
|
||||||
|
|
||||||
override fun binding(
|
override fun binding(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
@ -43,6 +45,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
|
|
||||||
override fun otherSetups() {
|
override fun otherSetups() {
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
|
parentActivity = requireActivity()
|
||||||
bindData()
|
bindData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,8 +66,8 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
|
|
||||||
private fun FragmentSettingsBinding.bindRecycler() {
|
private fun FragmentSettingsBinding.bindRecycler() {
|
||||||
notificationsRecycler.apply {
|
notificationsRecycler.apply {
|
||||||
layoutManager = LinearLayoutManager(requireActivity())
|
layoutManager = LinearLayoutManager(parentActivity)
|
||||||
adapter = GetNotifAdapter(requireActivity())
|
adapter = GetNotifAdapter(parentActivity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +75,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
firebase.setOnCheckedListener { _, isChecked ->
|
firebase.setOnCheckedListener { _, isChecked ->
|
||||||
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked)
|
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked)
|
||||||
FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked
|
FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked
|
||||||
FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(isChecked)
|
FirebaseAnalytics.getInstance(parentActivity).setAnalyticsCollectionEnabled(isChecked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +96,13 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
private fun FragmentSettingsBinding.bindClearFiles() {
|
private fun FragmentSettingsBinding.bindClearFiles() {
|
||||||
clearFiles.setOnClickListener {
|
clearFiles.setOnClickListener {
|
||||||
with(requireActivity()) {
|
with(requireActivity()) {
|
||||||
listOf("vanced/nonroot", "vanced/root", "music/nonroot", "music/root", "microg").forEach { dir ->
|
listOf(
|
||||||
|
"vanced/nonroot",
|
||||||
|
"vanced/root",
|
||||||
|
"music/nonroot",
|
||||||
|
"music/root",
|
||||||
|
"microg"
|
||||||
|
).forEach { dir ->
|
||||||
File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively()
|
File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively()
|
||||||
}
|
}
|
||||||
Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show()
|
||||||
|
@ -116,7 +125,7 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FragmentSettingsBinding.bindManagerAccentColor() {
|
private fun FragmentSettingsBinding.bindManagerAccentColor() {
|
||||||
managerAccentColor.apply{
|
managerAccentColor.apply {
|
||||||
setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex())
|
setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex())
|
||||||
setOnClickListener { showDialog(ManagerAccentColorDialog()) }
|
setOnClickListener { showDialog(ManagerAccentColorDialog()) }
|
||||||
accentColor.observe(viewLifecycleOwner) {
|
accentColor.observe(viewLifecycleOwner) {
|
||||||
|
@ -128,14 +137,15 @@ class SettingsFragment : BindingFragment<FragmentSettingsBinding>() {
|
||||||
private fun FragmentSettingsBinding.bindManagerLanguage() {
|
private fun FragmentSettingsBinding.bindManagerLanguage() {
|
||||||
val langPref = prefs.getString("manager_lang", "System Default")
|
val langPref = prefs.getString("manager_lang", "System Default")
|
||||||
managerLanguage.apply {
|
managerLanguage.apply {
|
||||||
setSummary(getLanguageFormat(requireActivity(), requireNotNull(langPref)))
|
setSummary(getLanguageFormat(parentActivity, requireNotNull(langPref)))
|
||||||
setOnClickListener { showDialog(ManagerLanguageDialog()) }
|
setOnClickListener { showDialog(ManagerLanguageDialog()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
val devSettings = getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false)
|
val devSettings =
|
||||||
|
getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false)
|
||||||
if (devSettings) {
|
if (devSettings) {
|
||||||
inflater.inflate(R.menu.dev_settings_menu, menu)
|
inflater.inflate(R.menu.dev_settings_menu, menu)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import androidx.lifecycle.AndroidViewModel
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.openUrl
|
import com.vanced.manager.utils.openUrl
|
||||||
|
|
||||||
class AboutViewModel(application: Application): AndroidViewModel(application) {
|
class AboutViewModel(application: Application) : AndroidViewModel(application) {
|
||||||
|
|
||||||
fun openUrl(url: String) {
|
fun openUrl(url: String) {
|
||||||
openUrl(url, R.color.GitHub, getApplication())
|
openUrl(url, R.color.GitHub, getApplication())
|
||||||
|
|
|
@ -1,24 +1,23 @@
|
||||||
package com.vanced.manager.ui.viewmodels
|
package com.vanced.manager.ui.viewmodels
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.ActivityNotFoundException
|
import android.content.ActivityNotFoundException
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.View
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||||
import com.crowdin.platform.Crowdin
|
import com.crowdin.platform.Crowdin
|
||||||
import com.google.android.material.button.MaterialButton
|
|
||||||
import com.vanced.manager.R
|
import com.vanced.manager.R
|
||||||
import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD
|
import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD
|
||||||
import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT
|
import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT
|
||||||
import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM
|
import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM
|
||||||
import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER
|
import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER
|
||||||
import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE
|
import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE
|
||||||
|
import com.vanced.manager.model.ButtonTag
|
||||||
import com.vanced.manager.model.DataModel
|
import com.vanced.manager.model.DataModel
|
||||||
import com.vanced.manager.model.RootDataModel
|
import com.vanced.manager.model.RootDataModel
|
||||||
import com.vanced.manager.ui.dialogs.AppDownloadDialog
|
import com.vanced.manager.ui.dialogs.AppDownloadDialog
|
||||||
|
@ -40,7 +39,9 @@ import com.vanced.manager.utils.PackageHelper.uninstallRootApk
|
||||||
import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist
|
import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
|
//TODO fix leak
|
||||||
|
@SuppressLint("StaticFieldLeak")
|
||||||
|
class HomeViewModel(private val activity: FragmentActivity) : ViewModel() {
|
||||||
|
|
||||||
private val prefs = getDefaultSharedPreferences(activity)
|
private val prefs = getDefaultSharedPreferences(activity)
|
||||||
private val variant get() = prefs.getString("vanced_variant", "nonroot")
|
private val variant get() = prefs.getString("vanced_variant", "nonroot")
|
||||||
|
@ -77,9 +78,18 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
|
||||||
|
|
||||||
fun launchApp(app: String, isRoot: Boolean) {
|
fun launchApp(app: String, isRoot: Boolean) {
|
||||||
val componentName = when (app) {
|
val componentName = when (app) {
|
||||||
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(vancedRootPkg, "$vancedRootPkg.HomeActivity") else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity")
|
activity.getString(R.string.vanced) -> if (isRoot) ComponentName(
|
||||||
activity.getString(R.string.music) -> if (isRoot) ComponentName(musicRootPkg, "$musicRootPkg.activities.MusicActivity") else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity")
|
vancedRootPkg,
|
||||||
activity.getString(R.string.microg) -> ComponentName(microgPkg, "org.microg.gms.ui.SettingsActivity")
|
"$vancedRootPkg.HomeActivity"
|
||||||
|
) else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity")
|
||||||
|
activity.getString(R.string.music) -> if (isRoot) ComponentName(
|
||||||
|
musicRootPkg,
|
||||||
|
"$musicRootPkg.activities.MusicActivity"
|
||||||
|
) else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity")
|
||||||
|
activity.getString(R.string.microg) -> ComponentName(
|
||||||
|
microgPkg,
|
||||||
|
"org.microg.gms.ui.SettingsActivity"
|
||||||
|
)
|
||||||
else -> throw IllegalArgumentException("Can't open this app")
|
else -> throw IllegalArgumentException("Can't open this app")
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -90,19 +100,18 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun openInstallDialog(view: View, app: String) {
|
fun openInstallDialog(buttonTag: ButtonTag?, app: String) {
|
||||||
if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) {
|
if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) {
|
||||||
microgToast.show()
|
microgToast.show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((view as MaterialButton).text == activity.getString(R.string.update)) {
|
if (buttonTag == ButtonTag.UPDATE) {
|
||||||
when (app) {
|
when (app) {
|
||||||
activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity)
|
activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity)
|
||||||
activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity)
|
activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity)
|
||||||
else -> AppDownloadDialog.newInstance(app).show(activity)
|
else -> AppDownloadDialog.newInstance(app).show(activity)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,16 +164,66 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
with (activity) {
|
with(activity) {
|
||||||
if (variant == "root") {
|
if (variant == "root") {
|
||||||
vancedRootModel.value = RootDataModel(vanced, this, this, vancedRootPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced), "vanced")
|
vancedRootModel.value = RootDataModel(
|
||||||
musicRootModel.value = RootDataModel(music, this, this, musicRootPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music), "music")
|
vanced,
|
||||||
|
this,
|
||||||
|
this,
|
||||||
|
vancedRootPkg,
|
||||||
|
this.getString(R.string.vanced),
|
||||||
|
activity.getString(R.string.description_vanced),
|
||||||
|
R.drawable.ic_vanced,
|
||||||
|
"vanced"
|
||||||
|
)
|
||||||
|
musicRootModel.value = RootDataModel(
|
||||||
|
music,
|
||||||
|
this,
|
||||||
|
this,
|
||||||
|
musicRootPkg,
|
||||||
|
this.getString(R.string.music),
|
||||||
|
activity.getString(R.string.description_vanced_music),
|
||||||
|
R.drawable.ic_music,
|
||||||
|
"music"
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
vancedModel.value = DataModel(vanced, this, this, vancedPkg, this.getString(R.string.vanced), AppCompatResources.getDrawable(this, R.drawable.ic_vanced))
|
vancedModel.value = DataModel(
|
||||||
musicModel.value = DataModel(music, this, this, musicPkg, this.getString(R.string.music), AppCompatResources.getDrawable(this, R.drawable.ic_music))
|
vanced,
|
||||||
microgModel.value = DataModel(microg, this, this, microgPkg, this.getString(R.string.microg), AppCompatResources.getDrawable(this, R.drawable.ic_microg))
|
this,
|
||||||
|
this,
|
||||||
|
vancedPkg,
|
||||||
|
this.getString(R.string.vanced),
|
||||||
|
activity.getString(R.string.description_vanced),
|
||||||
|
R.drawable.ic_vanced
|
||||||
|
)
|
||||||
|
musicModel.value = DataModel(
|
||||||
|
music,
|
||||||
|
this,
|
||||||
|
this,
|
||||||
|
musicPkg,
|
||||||
|
this.getString(R.string.music),
|
||||||
|
activity.getString(R.string.description_vanced_music),
|
||||||
|
R.drawable.ic_music
|
||||||
|
)
|
||||||
|
microgModel.value = DataModel(
|
||||||
|
microg,
|
||||||
|
this,
|
||||||
|
this,
|
||||||
|
microgPkg,
|
||||||
|
this.getString(R.string.microg),
|
||||||
|
activity.getString(R.string.description_microg),
|
||||||
|
R.drawable.ic_microg
|
||||||
|
)
|
||||||
}
|
}
|
||||||
managerModel.value = DataModel(manager, this, this, managerPkg, this.getString(R.string.app_name), AppCompatResources.getDrawable(this, R.mipmap.ic_launcher))
|
managerModel.value = DataModel(
|
||||||
|
manager,
|
||||||
|
this,
|
||||||
|
this,
|
||||||
|
managerPkg,
|
||||||
|
this.getString(R.string.app_name),
|
||||||
|
"Just manager meh",
|
||||||
|
R.mipmap.ic_launcher
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.io.IOException
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
object AppUtils : CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
|
|
||||||
const val vancedPkg = "com.vanced.android.youtube"
|
const val vancedPkg = "com.vanced.android.youtube"
|
||||||
const val vancedRootPkg = "com.google.android.youtube"
|
const val vancedRootPkg = "com.google.android.youtube"
|
||||||
|
@ -40,7 +40,12 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
SpannableString("$tag: $message\n").apply {
|
SpannableString("$tag: $message\n").apply {
|
||||||
setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 0, tag.length + 1, 0)
|
setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 0, tag.length + 1, 0)
|
||||||
setSpan(StyleSpan(Typeface.BOLD), 0, tag.length + 1, 0)
|
setSpan(StyleSpan(Typeface.BOLD), 0, tag.length + 1, 0)
|
||||||
setSpan(ForegroundColorSpan(Color.MAGENTA), tag.length + 2, tag.length + message.length + 2, 0)
|
setSpan(
|
||||||
|
ForegroundColorSpan(Color.MAGENTA),
|
||||||
|
tag.length + 2,
|
||||||
|
tag.length + message.length + 2,
|
||||||
|
0
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
Log.d(tag, message)
|
Log.d(tag, message)
|
||||||
|
@ -49,7 +54,8 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
fun sendRefresh(context: Context): Job {
|
fun sendRefresh(context: Context): Job {
|
||||||
return launch {
|
return launch {
|
||||||
delay(700)
|
delay(700)
|
||||||
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
|
LocalBroadcastManager.getInstance(context)
|
||||||
|
.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +63,8 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
return launch {
|
return launch {
|
||||||
delay(700)
|
delay(700)
|
||||||
installing.postValue(false)
|
installing.postValue(false)
|
||||||
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(AppDownloadDialog.CLOSE_DIALOG))
|
LocalBroadcastManager.getInstance(context)
|
||||||
|
.sendBroadcast(Intent(AppDownloadDialog.CLOSE_DIALOG))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +99,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
private fun printableHexString(data: ByteArray): String {
|
private fun printableHexString(data: ByteArray): String {
|
||||||
// Create Hex String
|
// Create Hex String
|
||||||
val hexString: StringBuilder = StringBuilder()
|
val hexString: StringBuilder = StringBuilder()
|
||||||
for (aMessageDigest:Byte in data) {
|
for (aMessageDigest: Byte in data) {
|
||||||
var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt())
|
var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt())
|
||||||
while (h.length < 2)
|
while (h.length < 2)
|
||||||
h = "0$h"
|
h = "0$h"
|
||||||
|
@ -127,12 +134,9 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
status.contains("ModApk_Missing") -> context.getString(R.string.modapk_missing)
|
status.contains("ModApk_Missing") -> context.getString(R.string.modapk_missing)
|
||||||
status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
|
status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
|
||||||
status.contains("Path_Missing") -> context.getString(R.string.path_missing)
|
status.contains("Path_Missing") -> context.getString(R.string.path_missing)
|
||||||
status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> {
|
status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> context.getString(
|
||||||
if (context.isMiuiOptimizationsEnabled)
|
R.string.installation_miui
|
||||||
context.getString(R.string.installation_miui)
|
)
|
||||||
else
|
|
||||||
context.getString(R.string.installation_blocked)
|
|
||||||
}
|
|
||||||
else -> context.getString(R.string.installation_failed)
|
else -> context.getString(R.string.installation_failed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,12 +49,20 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
|
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
launch {
|
launch {
|
||||||
if (response.body()?.let { writeFile(it, context.getExternalFilesDir(fileFolder)?.path + "/" + fileName) } == true) {
|
if (response.body()?.let {
|
||||||
|
writeFile(
|
||||||
|
it,
|
||||||
|
context.getExternalFilesDir(fileFolder)?.path + "/" + fileName
|
||||||
|
)
|
||||||
|
} == true) {
|
||||||
onDownloadComplete()
|
onDownloadComplete()
|
||||||
} else {
|
} else {
|
||||||
onError("Could not save file")
|
onError("Could not save file")
|
||||||
downloadProgress.postValue(0)
|
downloadProgress.postValue(0)
|
||||||
log("VMDownloader", "Failed to save file: $url\n${response.errorBody()}")
|
log(
|
||||||
|
"VMDownloader",
|
||||||
|
"Failed to save file: $url\n${response.errorBody()}"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -111,33 +119,40 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) {
|
||||||
|
|
||||||
fun downloadManager(context: Context) {
|
fun downloadManager(context: Context) {
|
||||||
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
|
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
|
||||||
download(url,"https://github.com/YTVanced/VancedManager/", "manager", "manager.apk", context, onDownloadComplete = {
|
download(
|
||||||
val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk")
|
url,
|
||||||
val uri =
|
"https://github.com/YTVanced/VancedManager/",
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
"manager",
|
||||||
FileProvider.getUriForFile(context, "${context.packageName}.provider", apk)
|
"manager.apk",
|
||||||
else
|
context,
|
||||||
Uri.fromFile(apk)
|
onDownloadComplete = {
|
||||||
|
val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk")
|
||||||
|
val uri =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||||
|
FileProvider.getUriForFile(context, "${context.packageName}.provider", apk)
|
||||||
|
else
|
||||||
|
Uri.fromFile(apk)
|
||||||
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW)
|
val intent = Intent(Intent.ACTION_VIEW)
|
||||||
intent.setDataAndType(uri, "application/vnd.android.package-archive")
|
intent.setDataAndType(uri, "application/vnd.android.package-archive")
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
try {
|
try {
|
||||||
context.startActivity(intent)
|
context.startActivity(intent)
|
||||||
} catch (e: ActivityNotFoundException) {
|
} catch (e: ActivityNotFoundException) {
|
||||||
log("VMDownloader", e.stackTraceToString())
|
log("VMDownloader", e.stackTraceToString())
|
||||||
} finally {
|
} finally {
|
||||||
sendCloseDialog(context)
|
sendCloseDialog(context)
|
||||||
}
|
}
|
||||||
}, onError = {
|
},
|
||||||
downloadingFile.postValue(
|
onError = {
|
||||||
context.getString(
|
downloadingFile.postValue(
|
||||||
R.string.error_downloading,
|
context.getString(
|
||||||
"manager.apk"
|
R.string.error_downloading,
|
||||||
|
"manager.apk"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,10 @@ import com.vanced.manager.R
|
||||||
import com.vanced.manager.utils.AppUtils.log
|
import com.vanced.manager.utils.AppUtils.log
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
fun RadioGroup.getCheckedButtonTag(): String? {
|
val RadioGroup.checkedButtonTag: String?
|
||||||
return findViewById<MaterialRadioButton>(checkedRadioButtonId)?.tag?.toString()
|
get() = findViewById<MaterialRadioButton>(
|
||||||
}
|
checkedRadioButtonId
|
||||||
|
)?.tag?.toString()
|
||||||
|
|
||||||
fun DialogFragment.show(activity: FragmentActivity) {
|
fun DialogFragment.show(activity: FragmentActivity) {
|
||||||
try {
|
try {
|
||||||
|
@ -27,47 +28,43 @@ fun DialogFragment.show(activity: FragmentActivity) {
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
log("VMUI", e.stackTraceToString())
|
log("VMUI", e.stackTraceToString())
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun List<String>.convertToAppVersions(): List<String> = listOf("latest") + reversed()
|
fun List<String>.convertToAppVersions(): List<String> = listOf("latest") + reversed()
|
||||||
|
|
||||||
fun String.formatVersion(context: Context): String = if (this == "latest") context.getString(R.string.install_latest) else this
|
fun String.formatVersion(context: Context): String =
|
||||||
|
if (this == "latest") context.getString(R.string.install_latest) else this
|
||||||
|
|
||||||
fun String.convertToAppTheme(context: Context): String {
|
fun String.convertToAppTheme(context: Context): String = with(context) {
|
||||||
return with(context) {
|
getString(
|
||||||
getString(R.string.light_plus_other, if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black))
|
R.string.light_plus_other,
|
||||||
}
|
if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun String.getLatestAppVersion(versions: List<String>): String = if (this == "latest") versions.reversed()[0] else this
|
fun String.getLatestAppVersion(versions: List<String>): String =
|
||||||
|
if (this == "latest") versions.reversed()[0] else this
|
||||||
|
|
||||||
fun Context.lifecycleOwner(): LifecycleOwner? {
|
val Context.lifecycleOwner: LifecycleOwner?
|
||||||
var curContext = this
|
get() = when (this) {
|
||||||
var maxDepth = 20
|
is LifecycleOwner -> this
|
||||||
while (maxDepth-- > 0 && curContext !is LifecycleOwner) {
|
!is LifecycleOwner -> (this as ContextWrapper).baseContext as LifecycleOwner
|
||||||
curContext = (curContext as ContextWrapper).baseContext
|
else -> null
|
||||||
}
|
}
|
||||||
return if (curContext is LifecycleOwner) {
|
|
||||||
curContext
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this)
|
fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this)
|
||||||
|
|
||||||
//Material team decided to keep their LinearProgressIndicator final
|
//Material team decided to keep their LinearProgressIndicator final
|
||||||
//At least extension methods exist
|
//At least extension methods exist
|
||||||
fun LinearProgressIndicator.applyAccent() {
|
fun LinearProgressIndicator.applyAccent() {
|
||||||
with(accentColor.value ?: context.defPrefs.managerAccent) {
|
with(accentColor.value!!) {
|
||||||
setIndicatorColor(this)
|
setIndicatorColor(this)
|
||||||
trackColor = ColorUtils.setAlphaComponent(this, 70)
|
trackColor = ColorUtils.setAlphaComponent(this, 70)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun MaterialAlertDialogBuilder.applyAccent() {
|
fun MaterialAlertDialogBuilder.showWithAccent() {
|
||||||
with(accentColor.value ?: context.defPrefs.managerAccent) {
|
with(accentColor.value!!) {
|
||||||
show().apply {
|
show().apply {
|
||||||
getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with)
|
getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with)
|
||||||
getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with)
|
getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with)
|
||||||
|
@ -86,5 +83,5 @@ fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) {
|
||||||
chcon u:object_r:apk_data_file:s0 $apkFPath
|
chcon u:object_r:apk_data_file:s0 $apkFPath
|
||||||
mount -o bind $apkFPath $path
|
mount -o bind $apkFPath $path
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
SuFileOutputStream.open(shellFileZ).use { out -> out.write(script.toByteArray())}
|
SuFileOutputStream.open(shellFileZ).use { out -> out.write(script.toByteArray()) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,11 @@ import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
|
|
||||||
val Context.installPrefs: SharedPreferences get() = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
|
val Context.installPrefs: SharedPreferences
|
||||||
|
get() = getSharedPreferences(
|
||||||
|
"installPrefs",
|
||||||
|
Context.MODE_PRIVATE
|
||||||
|
)
|
||||||
|
|
||||||
var SharedPreferences.lang
|
var SharedPreferences.lang
|
||||||
get() = getString("lang", getDefaultVancedLanguages())
|
get() = getString("lang", getDefaultVancedLanguages())
|
||||||
|
|
|
@ -43,16 +43,23 @@ var baseInstallUrl = ""
|
||||||
|
|
||||||
fun openUrl(url: String, color: Int, context: Context) {
|
fun openUrl(url: String, color: Int, context: Context) {
|
||||||
try {
|
try {
|
||||||
val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
|
val customTabPrefs =
|
||||||
|
getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true)
|
||||||
if (customTabPrefs) {
|
if (customTabPrefs) {
|
||||||
val builder = CustomTabsIntent.Builder()
|
val builder = CustomTabsIntent.Builder()
|
||||||
val params = CustomTabColorSchemeParams.Builder().setToolbarColor(ContextCompat.getColor(context, color))
|
val params = CustomTabColorSchemeParams.Builder()
|
||||||
|
.setToolbarColor(ContextCompat.getColor(context, color))
|
||||||
builder.setDefaultColorSchemeParams(params.build())
|
builder.setDefaultColorSchemeParams(params.build())
|
||||||
val customTabsIntent = builder.build()
|
val customTabsIntent = builder.build()
|
||||||
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
customTabsIntent.launchUrl(context, url.toUri())
|
customTabsIntent.launchUrl(context, url.toUri())
|
||||||
} else
|
} else
|
||||||
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
|
context.startActivity(
|
||||||
|
Intent(
|
||||||
|
Intent.ACTION_VIEW,
|
||||||
|
url.toUri()
|
||||||
|
).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
)
|
||||||
|
|
||||||
} catch (e: ActivityNotFoundException) {
|
} catch (e: ActivityNotFoundException) {
|
||||||
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show()
|
||||||
|
@ -103,7 +110,7 @@ suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) {
|
||||||
val versions = getJson("$baseInstallUrl/versions.json?$fetchTime")
|
val versions = getJson("$baseInstallUrl/versions.json?$fetchTime")
|
||||||
isMicrogBroken = latest?.boolean("is_microg_broken") ?: false
|
isMicrogBroken = latest?.boolean("is_microg_broken") ?: false
|
||||||
vanced.postValue(latest?.obj("vanced"))
|
vanced.postValue(latest?.obj("vanced"))
|
||||||
vancedVersions.postValue(versions?.array("vanced") )
|
vancedVersions.postValue(versions?.array("vanced"))
|
||||||
music.postValue(latest?.obj("music"))
|
music.postValue(latest?.obj("music"))
|
||||||
musicVersions.postValue(versions?.array("music"))
|
musicVersions.postValue(versions?.array("music"))
|
||||||
microg.postValue(latest?.obj("microg"))
|
microg.postValue(latest?.obj("microg"))
|
||||||
|
@ -137,4 +144,4 @@ fun checkSHA256(sha256: String, updateFile: File): Boolean {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const val baseUrl = "https://vancedapp.com/api/v1"
|
const val baseUrl = "https://api.vancedapp.com/api/v1"
|
|
@ -23,7 +23,10 @@ class LanguageContextWrapper(base: Context?) : ContextWrapper(base) {
|
||||||
val sysLocale = Resources.getSystem().configuration.locale
|
val sysLocale = Resources.getSystem().configuration.locale
|
||||||
val locale = when {
|
val locale = when {
|
||||||
pref == "System Default" -> Locale(sysLocale.language, sysLocale.country)
|
pref == "System Default" -> Locale(sysLocale.language, sysLocale.country)
|
||||||
pref?.length!! > 2 -> Locale(pref.substring(0, pref.length - 3), pref.substring(pref.length - 2))
|
pref?.length!! > 2 -> Locale(
|
||||||
|
pref.substring(0, pref.length - 3),
|
||||||
|
pref.substring(pref.length - 2)
|
||||||
|
)
|
||||||
else -> Locale(pref)
|
else -> Locale(pref)
|
||||||
}
|
}
|
||||||
currentLocale = locale
|
currentLocale = locale
|
||||||
|
|
|
@ -34,7 +34,10 @@ fun getLanguageFormat(context: Context, language: String): String {
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
fun getDefaultVancedLanguages(): String {
|
fun getDefaultVancedLanguages(): String {
|
||||||
val serverLangs = vanced.value?.array("langs") ?: mutableListOf("")
|
val serverLangs = vanced.value?.array("langs") ?: mutableListOf("")
|
||||||
val sysLocales = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(Resources.getSystem().configuration.locale.language)
|
val sysLocales =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf(
|
||||||
|
Resources.getSystem().configuration.locale.language
|
||||||
|
)
|
||||||
val finalLangs = mutableListOf<String>()
|
val finalLangs = mutableListOf<String>()
|
||||||
sysLocales.forEach { sysLocale ->
|
sysLocales.forEach { sysLocale ->
|
||||||
when {
|
when {
|
||||||
|
|
|
@ -5,4 +5,8 @@ import android.provider.Settings
|
||||||
|
|
||||||
private const val MIUI_OPTIMIZATION = "miui_optimization"
|
private const val MIUI_OPTIMIZATION = "miui_optimization"
|
||||||
|
|
||||||
val Context.isMiuiOptimizationsEnabled: Boolean get() = Settings.Secure.getString(contentResolver, MIUI_OPTIMIZATION) == "1"
|
val Context.isMiuiOptimizationsEnabled: Boolean
|
||||||
|
get() = Settings.Secure.getString(
|
||||||
|
contentResolver,
|
||||||
|
MIUI_OPTIMIZATION
|
||||||
|
) == "1"
|
|
@ -22,14 +22,18 @@ import com.vanced.manager.utils.AppUtils.vancedRootPkg
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.io.*
|
import java.io.File
|
||||||
|
import java.io.FileInputStream
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStream
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object PackageHelper {
|
object PackageHelper {
|
||||||
|
|
||||||
const val apkInstallPath = "/data/adb"
|
const val apkInstallPath = "/data/adb"
|
||||||
private const val INSTALLER_TAG = "VMInstall"
|
private const val INSTALLER_TAG = "VMInstall"
|
||||||
private val vancedThemes = vanced.value?.array<String>("themes")?.value ?: listOf("black", "dark", "pink", "blue")
|
private val vancedThemes =
|
||||||
|
vanced.value?.array<String>("themes")?.value ?: listOf("black", "dark", "pink", "blue")
|
||||||
|
|
||||||
init {
|
init {
|
||||||
Shell.enableVerboseLogging = BuildConfig.DEBUG
|
Shell.enableVerboseLogging = BuildConfig.DEBUG
|
||||||
|
@ -64,6 +68,7 @@ object PackageHelper {
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
|
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
|
||||||
return try {
|
return try {
|
||||||
packageManager.getPackageInfo(packageName, 0)
|
packageManager.getPackageInfo(packageName, 0)
|
||||||
|
@ -81,7 +86,7 @@ object PackageHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
fun getPkgVerCode(pkg: String, pm:PackageManager): Int? {
|
fun getPkgVerCode(pkg: String, pm: PackageManager): Int? {
|
||||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
||||||
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
|
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
|
||||||
else
|
else
|
||||||
|
@ -122,9 +127,15 @@ object PackageHelper {
|
||||||
if (files?.isNotEmpty() == true) {
|
if (files?.isNotEmpty() == true) {
|
||||||
for (file in files) {
|
for (file in files) {
|
||||||
when {
|
when {
|
||||||
vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add("base")
|
vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add(
|
||||||
file.name.matches(Regex("split_config\\.(..)\\.apk")) && !splitFiles.contains("lang") -> splitFiles.add("lang")
|
"base"
|
||||||
(file.name.startsWith("split_config.arm") || file.name.startsWith("split_config.x86")) && !splitFiles.contains("arch") -> splitFiles.add("arch")
|
)
|
||||||
|
file.name.matches(Regex("split_config\\.(..)\\.apk")) && !splitFiles.contains(
|
||||||
|
"lang"
|
||||||
|
) -> splitFiles.add("lang")
|
||||||
|
(file.name.startsWith("split_config.arm") || file.name.startsWith("split_config.x86")) && !splitFiles.contains(
|
||||||
|
"arch"
|
||||||
|
) -> splitFiles.add("arch")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (splitFiles.size == 3) {
|
if (splitFiles.size == 3) {
|
||||||
|
@ -160,7 +171,8 @@ object PackageHelper {
|
||||||
val callbackIntent = Intent(context, AppInstallerService::class.java)
|
val callbackIntent = Intent(context, AppInstallerService::class.java)
|
||||||
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
|
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
|
||||||
val packageInstaller = context.packageManager.packageInstaller
|
val packageInstaller = context.packageManager.packageInstaller
|
||||||
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
val params =
|
||||||
|
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
||||||
val sessionId: Int
|
val sessionId: Int
|
||||||
var session: PackageInstaller.Session? = null
|
var session: PackageInstaller.Session? = null
|
||||||
try {
|
try {
|
||||||
|
@ -193,7 +205,7 @@ object PackageHelper {
|
||||||
|
|
||||||
//moving apk to tmp folder in order to avoid permission denials
|
//moving apk to tmp folder in order to avoid permission denials
|
||||||
Shell.su("mv ${apk.path} $newPath").exec()
|
Shell.su("mv ${apk.path} $newPath").exec()
|
||||||
val command = Shell.su("pm install $newPath").exec()
|
val command = Shell.su("pm install -r $newPath").exec()
|
||||||
Shell.su("rm $newPath").exec()
|
Shell.su("rm $newPath").exec()
|
||||||
if (command.isSuccess) {
|
if (command.isSuccess) {
|
||||||
return true
|
return true
|
||||||
|
@ -207,7 +219,13 @@ object PackageHelper {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun installRootApp(context: Context, app: String, appVerCode: Int?, pkg: String, modApkBool: (fileName: String) -> Boolean) = CoroutineScope(Dispatchers.IO).launch {
|
private fun installRootApp(
|
||||||
|
context: Context,
|
||||||
|
app: String,
|
||||||
|
appVerCode: Int?,
|
||||||
|
pkg: String,
|
||||||
|
modApkBool: (fileName: String) -> Boolean
|
||||||
|
) = CoroutineScope(Dispatchers.IO).launch {
|
||||||
Shell.getShell {
|
Shell.getShell {
|
||||||
val apkFilesPath = context.getExternalFilesDir("$app/root")?.path
|
val apkFilesPath = context.getExternalFilesDir("$app/root")?.path
|
||||||
val files = File(apkFilesPath.toString()).listFiles()?.toList()
|
val files = File(apkFilesPath.toString()).listFiles()?.toList()
|
||||||
|
@ -268,7 +286,8 @@ object PackageHelper {
|
||||||
val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString())
|
val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString())
|
||||||
var session: PackageInstaller.Session? = null
|
var session: PackageInstaller.Session? = null
|
||||||
val sessionId: Int
|
val sessionId: Int
|
||||||
val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
val sessionParams =
|
||||||
|
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
|
||||||
val callbackIntent = Intent(context, AppInstallerService::class.java)
|
val callbackIntent = Intent(context, AppInstallerService::class.java)
|
||||||
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
|
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
|
||||||
try {
|
try {
|
||||||
|
@ -296,10 +315,19 @@ object PackageHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun installSplitApkFilesRoot(apkFiles: List<File>?, context: Context) : Boolean {
|
private fun installSplitApkFilesRoot(apkFiles: List<File>?, context: Context): Boolean {
|
||||||
val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json")
|
val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json")
|
||||||
log(INSTALLER_TAG, "installing split apk files: ${apkFiles?.map { it.name }}")
|
log(INSTALLER_TAG, "installing split apk files: ${apkFiles?.map { it.name }}")
|
||||||
val sessionId = Shell.su("pm install-create").exec().out.joinToString(" ").filter { it.isDigit() }.toInt()
|
val sessionId =
|
||||||
|
Shell.su("pm install-create -r").exec().out.joinToString(" ").filter { it.isDigit() }
|
||||||
|
.toIntOrNull()
|
||||||
|
|
||||||
|
if (sessionId == null) {
|
||||||
|
sendFailure("Session ID is null", context)
|
||||||
|
sendCloseDialog(context)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
apkFiles?.filter { !filenames.contains(it.name) }?.forEach { apkFile ->
|
apkFiles?.filter { !filenames.contains(it.name) }?.forEach { apkFile ->
|
||||||
val apkName = apkFile.name
|
val apkName = apkFile.name
|
||||||
log(INSTALLER_TAG, "installing APK: $apkName")
|
log(INSTALLER_TAG, "installing APK: $apkName")
|
||||||
|
@ -353,12 +381,18 @@ object PackageHelper {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupScript(apkFPath: String, path: String, app: String, pkg: String, context: Context): Boolean
|
private fun setupScript(
|
||||||
{
|
apkFPath: String,
|
||||||
|
path: String,
|
||||||
|
app: String,
|
||||||
|
pkg: String,
|
||||||
|
context: Context
|
||||||
|
): Boolean {
|
||||||
try {
|
try {
|
||||||
log(INSTALLER_TAG, "Setting up script")
|
log(INSTALLER_TAG, "Setting up script")
|
||||||
context.writeServiceDScript(apkFPath, path, app)
|
context.writeServiceDScript(apkFPath, path, app)
|
||||||
Shell.su("""echo "#!/system/bin/sh\nwhile read line; do echo \${"$"}{line} | grep $pkg | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts" > /data/adb/post-fs-data.d/$app.sh""").exec()
|
Shell.su("""echo "#!/system/bin/sh\nwhile read line; do echo \${"$"}{line} | grep $pkg | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts" > /data/adb/post-fs-data.d/$app.sh""")
|
||||||
|
.exec()
|
||||||
return Shell.su("chmod 744 /data/adb/service.d/$app.sh").exec().isSuccess
|
return Shell.su("chmod 744 /data/adb/service.d/$app.sh").exec().isSuccess
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
sendFailure(e.stackTraceToString(), context)
|
sendFailure(e.stackTraceToString(), context)
|
||||||
|
@ -371,7 +405,8 @@ object PackageHelper {
|
||||||
private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean {
|
private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean {
|
||||||
log(INSTALLER_TAG, "Linking app")
|
log(INSTALLER_TAG, "Linking app")
|
||||||
Shell.su("am force-stop $pkg").exec()
|
Shell.su("am force-stop $pkg").exec()
|
||||||
Shell.su("""for i in ${'$'}(ls /data/app/ | grep $pkg | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """).exec()
|
Shell.su("""for i in ${'$'}(ls /data/app/ | grep $pkg | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """)
|
||||||
|
.exec()
|
||||||
val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec()
|
val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec()
|
||||||
Thread.sleep(500)
|
Thread.sleep(500)
|
||||||
Shell.su("am force-stop $pkg").exec()
|
Shell.su("am force-stop $pkg").exec()
|
||||||
|
@ -383,12 +418,17 @@ object PackageHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
//check version and perform action based on result
|
//check version and perform action based on result
|
||||||
private fun checkVersion(versionCode: Int, baseApkFiles: List<File>, pkg: String, context: Context): Boolean {
|
private fun checkVersion(
|
||||||
|
versionCode: Int,
|
||||||
|
baseApkFiles: List<File>,
|
||||||
|
pkg: String,
|
||||||
|
context: Context
|
||||||
|
): Boolean {
|
||||||
log(INSTALLER_TAG, "Checking stock version")
|
log(INSTALLER_TAG, "Checking stock version")
|
||||||
val path = getPackageDir(context, pkg)
|
val path = getPackageDir(context, pkg)
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
if (path.contains("/data/app/")) {
|
if (path.contains("/data/app/")) {
|
||||||
when (getVersionNumber(pkg, context)?.let { compareVersion(it,versionCode) } ) {
|
when (getVersionNumber(pkg, context)?.let { compareVersion(it, versionCode) }) {
|
||||||
1 -> return fixHigherVer(baseApkFiles, pkg, context)
|
1 -> return fixHigherVer(baseApkFiles, pkg, context)
|
||||||
-1 -> return installStock(baseApkFiles, pkg, context)
|
-1 -> return installStock(baseApkFiles, pkg, context)
|
||||||
}
|
}
|
||||||
|
@ -402,7 +442,7 @@ object PackageHelper {
|
||||||
private fun getPkgInfo(pkg: String, context: Context): PackageInfo? {
|
private fun getPkgInfo(pkg: String, context: Context): PackageInfo? {
|
||||||
return try {
|
return try {
|
||||||
context.packageManager.getPackageInfo(pkg, 0)
|
context.packageManager.getPackageInfo(pkg, 0)
|
||||||
} catch (e:Exception) {
|
} catch (e: Exception) {
|
||||||
log(INSTALLER_TAG, "Unable to get package info")
|
log(INSTALLER_TAG, "Unable to get package info")
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
@ -417,10 +457,13 @@ object PackageHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
//uninstall current update and install base that works with patch
|
//uninstall current update and install base that works with patch
|
||||||
private fun fixHigherVer(apkFiles: List<File>, pkg: String, context: Context) : Boolean {
|
private fun fixHigherVer(apkFiles: List<File>, pkg: String, context: Context): Boolean {
|
||||||
log(INSTALLER_TAG, "Downgrading stock")
|
log(INSTALLER_TAG, "Downgrading stock")
|
||||||
if (uninstallRootApk(pkg)) {
|
if (uninstallRootApk(pkg)) {
|
||||||
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(apkFiles, context) else installRootMusic(apkFiles, context)
|
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(
|
||||||
|
apkFiles,
|
||||||
|
context
|
||||||
|
) else installRootMusic(apkFiles, context)
|
||||||
}
|
}
|
||||||
sendFailure(listOf("Failed_Uninstall").toMutableList(), context)
|
sendFailure(listOf("Failed_Uninstall").toMutableList(), context)
|
||||||
sendCloseDialog(context)
|
sendCloseDialog(context)
|
||||||
|
@ -430,7 +473,10 @@ object PackageHelper {
|
||||||
//install stock youtube matching vanced version
|
//install stock youtube matching vanced version
|
||||||
private fun installStock(baseApkFiles: List<File>, pkg: String, context: Context): Boolean {
|
private fun installStock(baseApkFiles: List<File>, pkg: String, context: Context): Boolean {
|
||||||
log(INSTALLER_TAG, "Installing stock")
|
log(INSTALLER_TAG, "Installing stock")
|
||||||
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(baseApkFiles, context) else installRootMusic(baseApkFiles, context)
|
return if (pkg == vancedRootPkg) installSplitApkFilesRoot(
|
||||||
|
baseApkFiles,
|
||||||
|
context
|
||||||
|
) else installRootMusic(baseApkFiles, context)
|
||||||
}
|
}
|
||||||
|
|
||||||
//set chcon to apk_data_file
|
//set chcon to apk_data_file
|
||||||
|
@ -448,20 +494,20 @@ object PackageHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
//move patch to data/app
|
//move patch to data/app
|
||||||
private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context) : Boolean {
|
private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context): Boolean {
|
||||||
log(INSTALLER_TAG, "Moving app")
|
log(INSTALLER_TAG, "Moving app")
|
||||||
val apkinF = SuFile.open(apkFile)
|
val apkinF = SuFile.open(apkFile)
|
||||||
val apkoutF = SuFile.open(path)
|
val apkoutF = SuFile.open(path)
|
||||||
|
|
||||||
if(apkinF.exists()) {
|
if (apkinF.exists()) {
|
||||||
try {
|
try {
|
||||||
Shell.su("am force-stop $pkg").exec()
|
Shell.su("am force-stop $pkg").exec()
|
||||||
|
|
||||||
//Shell.su("rm -r SuFile.open(path).parent")
|
//Shell.su("rm -r SuFile.open(path).parent")
|
||||||
|
|
||||||
copy(apkinF,apkoutF)
|
copy(apkinF, apkoutF)
|
||||||
Shell.su("chmod 644 $path").exec().isSuccess
|
Shell.su("chmod 644 $path").exec().isSuccess
|
||||||
return if(Shell.su("chown system:system $path").exec().isSuccess) {
|
return if (Shell.su("chown system:system $path").exec().isSuccess) {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
sendFailure(listOf("Chown_Fail").toMutableList(), context)
|
sendFailure(listOf("Chown_Fail").toMutableList(), context)
|
||||||
|
@ -469,9 +515,7 @@ object PackageHelper {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} catch (e: IOException) {
|
||||||
catch (e: IOException)
|
|
||||||
{
|
|
||||||
sendFailure(listOf("${e.message}").toMutableList(), context)
|
sendFailure(listOf("${e.message}").toMutableList(), context)
|
||||||
sendCloseDialog(context)
|
sendCloseDialog(context)
|
||||||
log(INSTALLER_TAG, e.stackTraceToString())
|
log(INSTALLER_TAG, e.stackTraceToString())
|
||||||
|
@ -494,13 +538,14 @@ object PackageHelper {
|
||||||
private fun getVersionNumber(pkg: String, context: Context): Int? {
|
private fun getVersionNumber(pkg: String, context: Context): Int? {
|
||||||
try {
|
try {
|
||||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
||||||
context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
|
context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and(
|
||||||
|
0xFFFFFFFF
|
||||||
|
).toInt()
|
||||||
else
|
else
|
||||||
context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode
|
context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode
|
||||||
}
|
} catch (e: Exception) {
|
||||||
catch (e : Exception) {
|
|
||||||
val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec()
|
val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec()
|
||||||
if(execRes.isSuccess) {
|
if (execRes.isSuccess) {
|
||||||
val result = execRes.out
|
val result = execRes.out
|
||||||
var version = 0
|
var version = 0
|
||||||
result
|
result
|
||||||
|
@ -524,9 +569,8 @@ object PackageHelper {
|
||||||
val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec()
|
val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec()
|
||||||
if (execRes.isSuccess) {
|
if (execRes.isSuccess) {
|
||||||
val result = execRes.out
|
val result = execRes.out
|
||||||
for (line in result)
|
for (line in result) {
|
||||||
{
|
if (line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
|
||||||
if(line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
null
|
null
|
||||||
|
@ -538,7 +582,8 @@ object PackageHelper {
|
||||||
try {
|
try {
|
||||||
log(INSTALLER_TAG, "Setting installer package to $installer for $target")
|
log(INSTALLER_TAG, "Setting installer package to $installer for $target")
|
||||||
val installerUid = context.packageManager.getPackageUid(installer, 0)
|
val installerUid = context.packageManager.getPackageUid(installer, 0)
|
||||||
val res = Shell.su("""su $installerUid -c 'pm set-installer $target $installer'""").exec()
|
val res =
|
||||||
|
Shell.su("""su $installerUid -c 'pm set-installer $target $installer'""").exec()
|
||||||
if (res.out.any { line -> line.contains("Success") }) {
|
if (res.out.any { line -> line.contains("Success") }) {
|
||||||
log(INSTALLER_TAG, "Installer package successfully set")
|
log(INSTALLER_TAG, "Installer package successfully set")
|
||||||
return
|
return
|
||||||
|
|
|
@ -11,7 +11,7 @@ const val LIGHT = "Light"
|
||||||
const val DARK = "Dark"
|
const val DARK = "Dark"
|
||||||
const val SYSTEM_DEFAULT = "System Default"
|
const val SYSTEM_DEFAULT = "System Default"
|
||||||
|
|
||||||
val mutableAccentColor = MutableLiveData<Int>()
|
val mutableAccentColor = MutableLiveData(defAccentColor)
|
||||||
val accentColor: LiveData<Int> = mutableAccentColor
|
val accentColor: LiveData<Int> = mutableAccentColor
|
||||||
|
|
||||||
var currentTheme = ""
|
var currentTheme = ""
|
||||||
|
|
16
app/src/main/res/drawable/app_image_placeholder.xml
Normal file
16
app/src/main/res/drawable/app_image_placeholder.xml
Normal 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>
|
10
app/src/main/res/drawable/ic_app_download.xml
Normal file
10
app/src/main/res/drawable/ic_app_download.xml
Normal 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>
|
10
app/src/main/res/drawable/ic_app_info.xml
Normal file
10
app/src/main/res/drawable/ic_app_info.xml
Normal 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>
|
10
app/src/main/res/drawable/ic_app_reinstall.xml
Normal file
10
app/src/main/res/drawable/ic_app_reinstall.xml
Normal 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>
|
10
app/src/main/res/drawable/ic_app_uninstall.xml
Normal file
10
app/src/main/res/drawable/ic_app_uninstall.xml
Normal 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>
|
10
app/src/main/res/drawable/ic_app_update.xml
Normal file
10
app/src/main/res/drawable/ic_app_update.xml
Normal 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>
|
|
@ -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>
|
|
|
@ -1,43 +1,33 @@
|
||||||
<vector android:height="64dp" android:viewportHeight="2000"
|
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
|
||||||
android:viewportWidth="2000" android:width="64dp"
|
android:viewportWidth="1833.2" android:width="64dp"
|
||||||
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
|
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<path android:fillColor="?colorSettingsTitle" android:pathData="M1388.1,1415.4L1388.1,1415.4c-91.4,84.5 -216.9,133.3 -365.8,133.3c-208.7,0 -399.6,-117.6 -493.3,-304.1c-78.3,-156 -78.3,-339.8 0,-495.7c93.7,-186.6 284.6,-304.3 493.3,-304.3c137.1,-1.6 269.6,49.9 369.4,143.6L1234,745.9c-57,-54.4 -133.1,-84 -211.8,-82.8c-144,0 -266.3,97.2 -309.9,228c-23.1,68.6 -23.1,142.8 0,211.4h0.2c43.8,130.6 165.9,227.8 309.9,227.8c74.4,0 138.2,-19 187.6,-52.6v-0.1c58.2,-38.5 98,-99.2 110.3,-167.7h-298.2V897.2H1543c6.5,36.9 9.5,74.6 9.5,112.2C1552.5,1177.2 1492.5,1319.2 1388.1,1415.4z"/>
|
<path android:fillColor="#171719" android:pathData="M1806.6,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.5,99.7 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.3,705.9 1806.6,588.1z"/>
|
||||||
<path android:fillColor="#953A9A" android:pathData="M1293.9,595.9m-14.5,0a14.5,14.5 0,1 1,29 0a14.5,14.5 0,1 1,-29 0"/>
|
<path android:fillColor="#FFFFFF" android:pathData="M1298.6,1334.2L1298.6,1334.2c-91.4,84.5 -216.9,133.3 -365.8,133.3c-304.9,0 -552,-247.2 -552,-552s247.2,-552.1 552,-552.1c137.1,-1.6 269.4,49.8 369.4,143.6l-157.7,157.7c-57,-54.3 -133.1,-84.1 -211.8,-82.8c-144,0 -266.3,97.2 -309.9,228c-23.1,68.6 -23.1,142.8 0,211.4h0.2c43.8,130.6 165.9,227.8 309.9,227.8c74.4,0 138.2,-19 187.6,-52.6v-0.1c58.1,-38.5 98,-99.1 110.3,-167.7H932.6V816h520.9c6.4,37.1 9.6,74.6 9.5,112.2C1463,1096 1403,1238 1298.6,1334.2z"/>
|
||||||
<path android:pathData="M1256.2,582.2c-2.7,0 -5.3,-0.7 -7.8,-2.3c-54.3,-34.7 -120.6,-56.3 -186.8,-61c-7.9,-0.6 -13.9,-7.5 -13.4,-15.4c0.6,-7.9 7.4,-13.9 15.4,-13.4c70.9,5 142,28.2 200.3,65.4c6.7,4.3 8.7,13.2 4.4,19.9C1265.6,579.8 1261,582.2 1256.2,582.2z">
|
<path android:fillColor="#953A9A" android:pathData="M1204.4,514.7m-14.5,0a14.5,14.5 0,1 1,29 0a14.5,14.5 0,1 1,-29 0"/>
|
||||||
|
<path android:pathData="M1166.7,501c-2.8,0 -5.5,-0.8 -7.8,-2.3c-54.3,-34.7 -120.6,-56.3 -186.8,-61c-8,-0.6 -14,-7.4 -13.4,-15.4c0.6,-8 7.4,-14 15.4,-13.4c70.9,5 142,28.2 200.3,65.4c6.7,4.3 8.7,13.2 4.4,19.9c0,0 0,0 0,0C1176.2,498.5 1171.7,501.1 1166.7,501z">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient android:endX="1048.1708" android:endY="536.1355"
|
<gradient android:endX="958.6746" android:endY="454.97253"
|
||||||
android:startX="1270.5692" android:startY="536.1355" android:type="linear">
|
android:startX="1181.0735" android:startY="454.97253" android:type="linear">
|
||||||
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
<item android:color="#FF953A9A" android:offset="0"/>
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path android:pathData="M663.5,709.5L663.5,709.5L663.5,709.5l-8,10.6l-3.9,5.3l-3.7,5.5c-2.4,3.7 -4.9,7.3 -7.3,11l-6.8,11.3c-1.1,1.9 -2.3,3.8 -3.4,5.7l-3.1,5.8c-2.1,3.9 -4.2,7.8 -6.2,11.7l-5.6,11.9c-0.9,2 -1.9,4 -2.8,6l-2.5,6.1l-5,12.2l-4.4,12.4l-2.2,6.2l-1.9,6.3l-3.8,12.6c-4.5,17 -8.6,34 -11.1,51.4l-1,6.5c-0.3,2.2 -0.7,4.3 -0.9,6.5l-1.5,13.1c-0.2,2.2 -0.5,4.3 -0.7,6.5l-0.4,6.6l-0.9,13.1l-0.1,1.6v1.6l-0.1,3.3l-0.2,6.6l-0.2,6.6c0,2.2 -0.1,4.4 -0.1,6.6l0.3,13.1l0.1,6.6c0.1,2.2 0.3,4.4 0.4,6.6c0.8,17.5 2.6,34.8 5.3,52l2.2,12.9l2.7,12.8c0.2,1.1 0.4,2.1 0.7,3.2l0.8,3.2l1.6,6.3c0.5,2.1 1,4.2 1.6,6.3l1.8,6.3c9.3,33.5 22.7,65.8 39.2,96.2c8.3,15.2 17.6,29.8 27.5,43.9c10,14.1 20.7,27.7 32.2,40.5c46,51.5 103.7,91.8 167.1,117.4l0,0c7.7,3.1 11.4,11.8 8.3,19.5s-11.8,11.4 -19.5,8.3c-0.1,-0.1 -0.3,-0.1 -0.5,-0.2c-66.6,-29.7 -126.2,-74.6 -172.5,-130.3c-11.7,-13.8 -22.3,-28.5 -32.3,-43.6c-9.9,-15.1 -19,-30.7 -27.1,-46.8c-16.1,-32.2 -28.8,-66.2 -37.2,-101.1l-1.6,-6.5c-0.5,-2.2 -0.9,-4.4 -1.4,-6.6l-1.4,-6.6l-0.7,-3.3c-0.2,-1.1 -0.4,-2.2 -0.6,-3.3l-2.3,-13.3l-1.8,-13.3c-2.2,-17.8 -3.4,-35.7 -3.6,-53.5c0,-2.2 -0.1,-4.5 -0.2,-6.7l0.1,-6.7l0.2,-13.4c0,-2.2 0.2,-4.5 0.3,-6.7l0.4,-6.7l0.4,-6.7l0.2,-3.3l0.1,-1.7l0.2,-1.7l1.4,-13.3l0.7,-6.6c0.3,-2.2 0.6,-4.4 1,-6.6l2,-13.2c0.3,-2.2 0.8,-4.4 1.2,-6.6l1.3,-6.6C587.3,830.2 618.1,763.6 663.5,709.5L663.5,709.5L663.5,709.5z">
|
<path android:pathData="M574,628.3L574,628.3l-8,10.6l-3.9,5.3l-3.7,5.5c-2.4,3.7 -4.9,7.3 -7.3,11l-6.8,11.3c-1.1,1.9 -2.3,3.8 -3.4,5.7l-3.1,5.8c-2.1,3.9 -4.2,7.8 -6.2,11.7l-5.6,11.9c-0.9,2 -1.9,4 -2.8,6l-2.5,6.1l-5,12.2l-4.4,12.4l-2.2,6.2l-1.9,6.3l-3.8,12.6c-4.5,17 -8.6,34 -11.1,51.4l-1,6.5c-0.3,2.2 -0.7,4.3 -0.9,6.5l-1.5,13.1c-0.2,2.2 -0.5,4.3 -0.7,6.5l-0.4,6.6l-0.9,13.1l-0.1,1.6v1.6l-0.1,3.3l-0.2,6.6l-0.2,6.6c0,2.2 -0.1,4.4 -0.1,6.6l0.3,13.1l0.1,6.6c0.1,2.2 0.3,4.4 0.4,6.6c0.8,17.4 2.6,34.8 5.3,52l2.2,12.9l2.7,12.8c0.2,1.1 0.4,2.1 0.7,3.2l0.8,3.2l1.6,6.3c0.5,2.1 1,4.2 1.6,6.3l1.8,6.3c14,50.2 36.5,97.6 66.7,140.1c49.9,70.7 119.1,125.5 199.3,157.9l0,0c7.8,2.8 11.9,11.3 9.2,19.1c-2.8,7.8 -11.3,11.9 -19.1,9.2c-0.4,-0.1 -0.8,-0.3 -1.2,-0.5c-0.1,-0.1 -0.3,-0.1 -0.5,-0.2c-66.7,-29.7 -125.7,-74.3 -172.5,-130.3c-11.6,-13.9 -22.4,-28.4 -32.3,-43.6c-29.8,-45.2 -51.5,-95.3 -64.3,-147.9l-1.6,-6.5c-0.5,-2.2 -0.9,-4.4 -1.4,-6.6l-1.4,-6.6l-0.7,-3.3l-0.6,-3.3l-2.3,-13.3l-1.8,-13.3c-2.2,-17.8 -3.4,-35.6 -3.6,-53.5c0,-2.2 -0.1,-4.5 -0.2,-6.7l0.1,-6.7l0.2,-13.4c0,-2.2 0.2,-4.5 0.3,-6.7l0.4,-6.7l0.4,-6.7l0.2,-3.3l0.1,-1.7l0.2,-1.7l1.4,-13.3l0.7,-6.6c0.3,-2.2 0.6,-4.4 1,-6.6l2,-13.2c0.3,-2.2 0.8,-4.4 1.2,-6.6l1.3,-6.6C497.8,749 528.6,682.4 574,628.3L574,628.3z">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient android:endX="555.1798" android:endY="1071.7072"
|
<gradient android:endX="465.6893" android:endY="990.6765"
|
||||||
android:startX="870.6317" android:startY="1073.554" android:type="linear">
|
android:startX="781.1393" android:startY="992.51654" android:type="linear">
|
||||||
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
<item android:color="#FF953A9A" android:offset="0"/>
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path android:fillColor="#00000000"
|
<path android:fillColor="#953A9A" android:pathData="M823.1,1363.4m-16.5,0a16.5,16.5 0,1 1,33 0a16.5,16.5 0,1 1,-33 0"/>
|
||||||
android:pathData="M1332.5,1204.5" android:strokeLineCap="round"
|
<path android:pathData="M1453.5,816c-27.8,20 -57.3,51 -65.9,76.6c-6.5,18 -17.4,29.8 -28.3,30.3c-9.6,0 -23,-12.8 -28.4,-30.9c-8.6,-23.9 -23.1,-50.6 -50,-76L1453.5,816zM1353.1,957.8c1.3,6.7 7.3,9.9 14,8.6s11.7,-6.6 10.4,-13.4s-14.1,-17.6 -14.1,-17.6S1351.7,951 1353.1,957.8z">
|
||||||
android:strokeLineJoin="round" android:strokeWidth="29">
|
|
||||||
<aapt:attr name="android:strokeColor">
|
|
||||||
<gradient android:endX="1332.5" android:endY="1204.5"
|
|
||||||
android:startX="1332.5" android:startY="1204.5" android:type="linear">
|
|
||||||
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
|
||||||
</gradient>
|
|
||||||
</aapt:attr>
|
|
||||||
</path>
|
|
||||||
<path android:fillColor="#953A9A" android:pathData="M912.6,1444.6m-16.5,0a16.5,16.5 0,1 1,33 0a16.5,16.5 0,1 1,-33 0"/>
|
|
||||||
<path android:pathData="M1543,897.2c-27.8,20 -57.3,51 -65.9,76.6c-6.5,18 -17.4,29.8 -28.3,30.3c-9.6,0 -23,-12.8 -28.4,-30.9c-8.6,-23.9 -23.1,-50.6 -50,-76L1543,897.2L1543,897.2zM1442.6,1039c1.3,6.7 7.3,9.9 14,8.6s11.7,-6.6 10.4,-13.4c-1.3,-6.7 -14.1,-17.6 -14.1,-17.6S1441.2,1032.2 1442.6,1039z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient android:endX="1456.7" android:endY="1047.8848"
|
<gradient android:endX="1367.21" android:endY="966.72473"
|
||||||
android:startX="1456.7" android:startY="897.2" android:type="linear">
|
android:startX="1367.21" android:startY="816.04004" android:type="linear">
|
||||||
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
<item android:color="#FF953A9A" android:offset="0"/>
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
|
|
|
@ -1,27 +1,42 @@
|
||||||
<vector android:height="63dp"
|
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
|
||||||
android:viewportHeight="2000"
|
android:viewportWidth="1833.2" android:width="64dp"
|
||||||
android:viewportWidth="2000"
|
|
||||||
android:width="63dp"
|
|
||||||
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
|
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<path android:fillColor="#0C0C0F" android:pathData="M1000,1000m-900,0a900,900 0,1 1,1800 0a900,900 0,1 1,-1800 0"/>
|
<path android:fillColor="#171719" android:pathData="M1806.5,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.4,99.8 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.2,705.9 1806.5,588.1z"/>
|
||||||
<path android:fillColor="#FFFFFF" android:pathData="M1297.99,934.95L913.69,687c-16.68,-9.72 -38.08,-4.08 -47.8,12.59l-0.75,1.28c-9.72,16.67 -4.09,38.07 12.59,47.79l367.49,221.11c23.91,14.39 23.77,49.1 -0.25,63.29l-369.18,218.11c-16.76,9.58 -22.58,30.93 -13,47.69l0.73,1.29c9.58,16.76 30.93,22.57 47.69,12.99l386.24,-244.83C1346.25,1037.38 1346.54,966.28 1297.99,934.95z"/>
|
<path android:fillColor="#FFFFFF" android:pathData="M1526,918.6c0.1,70.4 -11.9,140.2 -35.4,206.5c-84.9,238 -312.2,408.4 -579.3,408.4c-339.6,0 -614.9,-275.3 -614.9,-614.9s275.2,-614.9 614.8,-614.9c284.2,0 523.3,192.8 593.8,454.6c11.9,43.9 18.8,89 20.6,134.4C1525.8,901.4 1526,910 1526,918.6z"/>
|
||||||
<path android:pathData="M1101.77,966.16L912.55,859.57c-24.49,-13.8 -54.77,3.9 -54.77,32v213.18c0,28.11 30.28,45.8 54.77,32l189.22,-106.59C1126.71,1016.12 1126.71,980.21 1101.77,966.16z">
|
<path android:pathData="M1083.5,881.2L844.2,743c-29.2,-16.8 -65.9,4.3 -65.9,38v276.3c0,33.9 36.7,55 65.9,38l239.3,-138.2C1112.8,940.4 1112.8,898 1083.5,881.2z">
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient android:endX="1035.8003" android:endY="898.2145"
|
<gradient android:endX="998.231" android:endY="793.7089"
|
||||||
android:startX="835.8939" android:startY="1098.121" android:type="linear">
|
android:startX="747.3128" android:startY="1044.6271" android:type="linear">
|
||||||
<item android:color="#FF2E73FF" android:offset="0"/>
|
<item android:color="#FF2E73FF" android:offset="0"/>
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path android:fillColor="#00000000"
|
<path android:fillColor="#FFFFFF" android:pathData="M1038,894.9c-1.1,0 -2.2,-0.3 -3.1,-0.9L986.3,866c-2.9,-1.9 -3.7,-5.8 -1.9,-8.7c1.7,-2.7 5.2,-3.6 8.1,-2.2l48.5,28.1c3,1.7 4.1,5.5 2.4,8.5c0,0 0,0 0,0C1042.4,893.7 1040.3,894.9 1038,894.9L1038,894.9z"/>
|
||||||
android:pathData="M1000,1000m-650,0a650,650 0,1 1,1300 0a650,650 0,1 1,-1300 0" android:strokeWidth="71">
|
<path android:fillColor="#FFFFFF" android:pathData="M1058.6,899.9m-8.5,0a8.5,8.5 0,1 1,17 0a8.5,8.5 0,1 1,-17 0"/>
|
||||||
<aapt:attr name="android:strokeColor">
|
<path android:pathData="M1604.1,822.3l-99.1,-64c11.8,43.9 18.7,89 20.5,134.4c25.1,25.5 24,67.9 -3,92c-3.2,2.8 -6.7,5.4 -10.4,7.6l-9.6,5.7l-611.7,361.4l-18.6,11.1c-29,16.6 -39.2,53.5 -22.6,82.6c0,0 0,0.1 0.1,0.1l1.3,2.3c16.6,29 53.5,39.2 82.6,22.6c0.1,0 0.1,0 0.1,-0.1l193,-122.3l363.7,-230.5l4.9,-3.1l107.8,-68.4C1687.7,999.9 1688.3,876.6 1604.1,822.3z">
|
||||||
<gradient android:endX="1484.7217" android:endY="515.2783"
|
<aapt:attr name="android:fillColor">
|
||||||
android:startX="515.2783" android:startY="1484.7217" android:type="linear">
|
<gradient android:endX="1618.3806" android:endY="832.1469"
|
||||||
|
android:startX="921.5201" android:startY="1529.0074" android:type="linear">
|
||||||
<item android:color="#FF2E73FF" android:offset="0"/>
|
<item android:color="#FF2E73FF" android:offset="0"/>
|
||||||
<item android:color="#FFFF0032" android:offset="1"/>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
<path android:fillColor="#953A9A" android:pathData="M1319.9,567.3m-16.6,0a16.6,16.6 0,1 1,33.2 0a16.6,16.6 0,1 1,-33.2 0"/>
|
||||||
|
<path android:pathData="M409,1114.5c-44.8,-111.5 -50.7,-238.6 -16.3,-354.5c8.6,-29 19.6,-57.2 32.9,-84.4c6.6,-13.5 13.9,-26.9 21.7,-39.9s16.2,-25.6 25,-37.9s18.2,-24.2 28,-35.8s20.1,-22.6 30.9,-33.3s22,-20.9 33.6,-30.7s23.7,-19 36.1,-27.7s25.2,-17 38.3,-24.8s26.6,-14.9 40.3,-21.4s27.7,-12.7 41.9,-18s28.8,-10.2 43.3,-14.4c3.7,-1 7.4,-2.1 11.1,-3l11.1,-2.8l11.2,-2.5l2.8,-0.7l2.8,-0.6l5.6,-1.1c15,-2.9 30.1,-5.3 45.2,-7c30.4,-3.4 61,-4.2 91.5,-2.5c61.3,3.3 121.6,16.9 178.3,40.2c56.9,23.5 109.5,56.3 155.6,97c5.3,4.7 5.8,12.8 1.1,18.1c-4.7,5.3 -12.8,5.8 -18.1,1.1l-0.1,-0.1l-0.1,-0.1c-87.5,-80.3 -199.6,-128.6 -318,-137.1c-29.5,-2.1 -59,-1.8 -88.5,0.9c-14.7,1.4 -29.3,3.4 -43.9,6l-5.5,1l-2.8,0.5l-2.7,0.6l-10.9,2.2l-10.8,2.6c-3.6,0.9 -7.2,1.9 -10.7,2.7c-14.3,3.8 -28.4,8.2 -42.4,13.2s-27.6,10.6 -41.2,16.8s-26.7,12.9 -39.6,20.2s-25.5,15.1 -37.7,23.5s-24.2,17.2 -35.8,26.5c-11.5,9.3 -22.7,19.2 -33.4,29.5s-21.1,21 -30.9,32.2c-9.8,11.2 -19.2,22.7 -28.1,34.6s-17.3,24.2 -25.3,36.9s-15.1,25.7 -21.9,39c-13.6,26.6 -25,54.2 -34,82.7C362.7,875.8 366.1,1002.2 409,1114.5z">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient android:endX="513.1837" android:endY="1189.3452"
|
||||||
|
android:startX="1005.7236" android:startY="336.2454" android:type="linear">
|
||||||
|
<item android:color="#FF953A9A" android:offset="0"/>
|
||||||
|
<item android:color="#FF9C3693" android:offset="0.02"/>
|
||||||
|
<item android:color="#FFBB2575" android:offset="0.12"/>
|
||||||
|
<item android:color="#FFD4185C" android:offset="0.23"/>
|
||||||
|
<item android:color="#FFE70D49" android:offset="0.35"/>
|
||||||
|
<item android:color="#FFF5063C" android:offset="0.49"/>
|
||||||
|
<item android:color="#FFFD0134" android:offset="0.67"/>
|
||||||
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -1,41 +1,46 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector android:height="64.15012dp" android:viewportHeight="1837.5"
|
||||||
xmlns:aapt="http://schemas.android.com/aapt"
|
android:viewportWidth="1833.2" android:width="64dp"
|
||||||
android:width="73.36dp"
|
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
android:height="56dp"
|
<path android:fillColor="#171719" android:pathData="M1806.5,588.1c-48.1,-286.5 -206.4,-480.1 -497.1,-544.9c-257,-57.3 -516.6,-57.4 -773.8,-1.8C265.4,99.8 98.8,268 40.5,538.9C-13,787.2 -13,1037 37.5,1285.6c54.8,269.8 213.9,445.6 485.5,507.1c264.7,59.9 531.5,59.9 795.6,-1.6c210.2,-48.9 364.6,-169.8 443.2,-378.1c56.9,-151 63.1,-308.4 71.4,-522.1C1833.2,823.3 1826.2,705.9 1806.5,588.1z"/>
|
||||||
android:viewportWidth="506.854"
|
<path android:fillColor="#FFFFFF" android:pathData="M1563.9,918.3c0,0 0,35.3 -1.6,84.2c-1.3,38.7 -3.6,86 -7.8,130.9c-3.9,42 -9.4,82.1 -17.2,111.3c-14.6,55.1 -57.7,98.4 -112.4,113.2c-45.8,12.4 -155.4,19 -260,22.6c-121.8,4.2 -236.9,4.2 -236.9,4.2s-4.4,0 -12.4,0c-67.9,-0.3 -395.8,-2.8 -484.5,-26.7c-54.7,-14.7 -97.8,-58.1 -112.4,-113.2c-26.6,-99.8 -26.6,-326.4 -26.6,-326.4s0,-224.9 26.6,-324.7c14.6,-55.1 57.7,-98.4 112.4,-113.2c77.3,-20.8 335.9,-25.4 446.3,-26.5c31.2,-0.3 50.6,-0.3 50.6,-0.3s83.1,0 182.8,2.6c14,0.4 28.4,0.8 42.9,1.2c1.5,0 3,0.1 4.4,0.1c9.6,0.3 19.3,0.7 29,1c20.3,0.8 40.6,1.7 60.3,2.7c50.8,2.7 98.4,6.3 134.3,11.1c0.7,0.1 1.4,0.2 2,0.3c1.6,0.2 3.1,0.4 4.7,0.7c6.7,1 12.9,2 18.6,3c6.7,1.2 12.7,2.6 17.9,4c54.7,14.7 97.8,58.1 112.4,113.2c10.2,38.5 16.5,95.5 20.4,151.1c3.4,49.2 5,97.2 5.6,130.2C1563.9,901.5 1563.9,918.3 1563.9,918.3z"/>
|
||||||
android:viewportHeight="385.268">
|
<path android:pathData="M1074.6,886.3l-207,-119.5c-25.3,-14.6 -57,3.7 -57,32.9v239c0,29.3 31.7,47.5 57,32.9l207,-119.5C1099.9,937.5 1099.9,900.9 1074.6,886.3z">
|
||||||
<path
|
<aapt:attr name="android:fillColor">
|
||||||
android:fillColor="#FF000000"
|
<gradient android:endX="1000.8886" android:endY="810.7363"
|
||||||
android:pathData="M65.934,26.129l-33,29c0,0 -30,148 -17,212s18,97 91,99s324,0 324,0s80.265,-33.664 59,-261.959C474.934,-56.871 65.934,26.129 65.934,26.129z"/>
|
android:startX="783.8582" android:startY="1027.7668" android:type="linear">
|
||||||
<path
|
<item android:color="#FF2E73FF" android:offset="4.795011E-7"/>
|
||||||
android:pathData="M496.496,69.709c-7.661,-28.84 -30.24,-51.548 -58.94,-59.265c-6.213,-1.68 -25.124,-6.773 -108.001,-9.24C289.744,0.014 253.792,0 253.434,0s-36.311,0.014 -76.124,1.204c-82.879,2.478 -101.785,7.577 -107.98,9.24C40.635,18.164 18.03,40.87 10.375,69.709C0.294,107.577 0,183.781 0,192.349c0,8.625 0.28,85.365 10.36,123.214c7.658,28.842 30.24,51.549 58.94,59.266c6.213,1.68 25.125,6.773 107.999,9.238c39.824,1.199 75.774,1.199 76.135,1.199s36.312,0 76.121,-1.203c82.88,-2.479 101.788,-7.574 107.987,-9.238c28.703,-7.725 51.296,-30.432 58.951,-59.25c10.078,-37.871 10.358,-114.609 10.358,-123.235C506.867,183.767 506.576,107.562 496.496,69.709zM470.714,308.698c-5.217,19.637 -20.583,35.098 -40.095,40.348c-35.362,9.537 -177.174,9.537 -177.174,9.537s-141.809,0 -177.172,-9.537c-19.51,-5.25 -34.877,-20.721 -40.093,-40.348c-9.475,-35.588 -9.475,-116.366 -9.475,-116.366s0,-80.185 9.475,-115.771c5.216,-19.636 20.583,-35.101 40.093,-40.348c35.351,-9.537 177.159,-9.537 177.159,-9.537s141.809,0 177.173,9.537c19.511,5.248 34.877,20.72 40.093,40.348c9.478,35.588 9.478,115.771 9.478,115.771S480.175,273.11 470.714,308.698z">
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
<aapt:attr name="android:fillColor">
|
</gradient>
|
||||||
<gradient
|
</aapt:attr>
|
||||||
android:startY="383.625"
|
</path>
|
||||||
android:startX="62.4463"
|
<path android:fillColor="#FFFFFF" android:pathData="M1035.2,898.2c-0.9,0 -1.8,-0.2 -2.7,-0.7l-42,-24.3c-2.6,-1.5 -3.5,-4.8 -2,-7.4c1.5,-2.6 4.8,-3.5 7.4,-2l42,24.3c2.6,1.5 3.5,4.8 2,7.4C1038.9,897.2 1037.1,898.2 1035.2,898.2z"/>
|
||||||
android:endY="1.6556"
|
<path android:fillColor="#FFFFFF" android:pathData="M1051.4,900.9m-5.8,0a5.8,5.8 0,1 1,11.6 0a5.8,5.8 0,1 1,-11.6 0"/>
|
||||||
android:endX="444.4157"
|
<path android:pathData="M1468.1,680.3c-5.6,0 -10.6,-3.9 -11.9,-9.5c-0.9,-3.9 -1.8,-7.5 -2.7,-11c-10.1,-38 -35.7,-70.5 -70.2,-89.3c-9.7,-5.2 -19.9,-9.3 -30.5,-12.2c-5.5,-1.4 -11.4,-2.7 -16.7,-3.7c-4.5,-0.8 -15,-2.7 -25.8,-4.2c-6.7,-0.9 -11.4,-7.1 -10.4,-13.8c0.9,-6.7 7.1,-11.4 13.8,-10.4c13.9,1.9 25.6,4.1 26.9,4.4h0.1c5.7,1.1 12.1,2.5 18,4c0.1,0 0.2,0 0.2,0.1c12.5,3.4 24.5,8.2 35.9,14.4c40.4,21.9 70.4,60 82.2,104.5c1,3.7 2,7.7 2.9,11.8c1.5,6.6 -2.6,13.1 -9.2,14.6C1469.9,680.2 1469,680.3 1468.1,680.3z">
|
||||||
android:type="linear">
|
<aapt:attr name="android:fillColor">
|
||||||
<item android:offset="0" android:color="#FF0262FC"/>
|
<gradient android:endX="1339.9901" android:endY="508.03302"
|
||||||
<item android:offset="1" android:color="#FFFE0020"/>
|
android:startX="1447.4285" android:startY="694.1216" android:type="linear">
|
||||||
</gradient>
|
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
||||||
</aapt:attr>
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
</path>
|
</gradient>
|
||||||
<path
|
</aapt:attr>
|
||||||
android:pathData="M328.099,174.927l-107.603,-69.423c-4.666,-2.723 -10.656,-1.147 -13.381,3.521c-0.002,0.002 -0.003,0.004 -0.004,0.006l-0.21,0.354c-2.715,4.67 -1.138,10.657 3.525,13.384l102.896,61.911c6.695,4.026 6.656,13.745 -0.067,17.721L209.883,263.47c-4.688,2.688 -6.314,8.66 -3.643,13.354l0.207,0.357c2.688,4.688 8.66,6.314 13.354,3.641l108.146,-68.555C341.614,203.608 341.692,183.701 328.099,174.927z"
|
</path>
|
||||||
android:fillColor="#FFFFFF"/>
|
<path android:fillColor="#953A9A" android:pathData="M1476.5,708.1m-12.7,0a12.7,12.7 0,1 1,25.4 0a12.7,12.7 0,1 1,-25.4 0"/>
|
||||||
<path
|
<path android:pathData="M377.4,1158c5.6,0 10.6,3.9 11.9,9.5c0.9,3.9 1.8,7.5 2.7,11c10.1,38 35.7,70.5 70.2,89.3c9.7,5.2 19.9,9.3 30.5,12.2c5.5,1.4 11.4,2.7 16.7,3.7c4.5,0.8 15,2.7 25.8,4.2c6.7,0.9 11.4,7.1 10.4,13.8c-0.9,6.7 -7.1,11.4 -13.8,10.4c-13.9,-1.9 -25.6,-4.1 -26.9,-4.4h-0.1c-5.7,-1.1 -12.1,-2.5 -18,-4c-0.1,0 -0.2,0 -0.2,-0.1c-12.5,-3.4 -24.5,-8.2 -35.9,-14.4c-40.4,-21.9 -70.4,-60 -82.2,-104.5c-1,-3.7 -2,-7.7 -2.9,-11.8c-1.5,-6.6 2.6,-13.1 9.2,-14.6C375.6,1158.1 376.5,1158 377.4,1158z">
|
||||||
android:pathData="M273.159,183.669l-52.979,-29.846c-6.859,-3.863 -15.338,1.09 -15.338,8.961v59.689c0,7.871 8.479,12.824 15.338,8.961l52.979,-29.846C280.143,197.669 280.143,187.589 273.159,183.669z">
|
<aapt:attr name="android:fillColor">
|
||||||
<aapt:attr name="android:fillColor">
|
<gradient android:endX="455.5205" android:endY="1158.0405"
|
||||||
<gradient
|
android:startX="455.5205" android:startY="1312.2747" android:type="linear">
|
||||||
android:startY="220.6162"
|
<item android:color="#FF953A9A" android:offset="4.04912E-7"/>
|
||||||
android:startX="198.7153"
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
android:endY="164.6422"
|
</gradient>
|
||||||
android:endX="254.6893"
|
</aapt:attr>
|
||||||
android:type="linear">
|
</path>
|
||||||
<item android:offset="0" android:color="#FF0262FC"/>
|
<path android:fillColor="#FF0032" android:pathData="M368.9,1130.2m-12.7,0a12.7,12.7 0,1 1,25.4 0a12.7,12.7 0,1 1,-25.4 0"/>
|
||||||
<item android:offset="1" android:color="#FFFE0020"/>
|
<path android:pathData="M877.4,454c-12.1,-19.5 -13.3,-44.9 -1,-66.1l1.4,-2.3c17.8,-30.6 57,-40.9 87.6,-23.1l145.4,93.8c-99.7,-2.6 -182.8,-2.6 -182.8,-2.6S908.6,453.7 877.4,454zM1669.5,816.8l-111.8,-72.1c3.4,49.2 5,97.2 5.6,130.2l9.5,5.7c43.8,26.4 43.6,90 -0.5,116l-10.1,6l-646.6,382l-19.7,11.7c-30.7,17.6 -41.4,56.7 -23.8,87.4l1.4,2.4c17.5,30.7 56.7,41.4 87.4,23.8l204,-129.3l389.7,-247l114,-72.3C1757.9,1004.5 1758.5,874.2 1669.5,816.8z">
|
||||||
</gradient>
|
<aapt:attr name="android:fillColor">
|
||||||
</aapt:attr>
|
<gradient android:endX="1427.5623" android:endY="570.1407"
|
||||||
</path>
|
android:startX="690.922" android:startY="1306.7809" android:type="linear">
|
||||||
|
<item android:color="#FF2E73FF" android:offset="4.795011E-7"/>
|
||||||
|
<item android:color="#FFFF0032" android:offset="1"/>
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -17,18 +17,39 @@
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/app_download_patient"
|
android:id="@+id/app_download_patient"
|
||||||
|
style="@style/DialogCardSubtitle"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/app_download_header"
|
android:layout_below="@id/app_download_header"
|
||||||
android:text="@string/please_be_patient"
|
android:layout_marginBottom="18dp"
|
||||||
style="@style/DialogCardSubtitle" />
|
android:text="@string/please_be_patient" />
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
<RelativeLayout
|
||||||
android:id="@+id/app_download_progressbar"
|
android:id="@+id/app_download_progressbar_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/app_download_patient"
|
android:layout_below="@id/app_download_patient">
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
app:trackCornerRadius="15dp"
|
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||||
tools:progress="10" />
|
android:id="@+id/app_download_progressbar"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:trackCornerRadius="15dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_toStartOf="@id/app_download_progress"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
tools:progress="10" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/app_download_progress"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:textSize="15sp"
|
||||||
|
tools:text="20%" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||||
android:id="@+id/app_install_progressbar"
|
android:id="@+id/app_install_progressbar"
|
||||||
|
@ -36,8 +57,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
android:layout_below="@id/app_download_progressbar"
|
android:layout_below="@id/app_download_progressbar_container"
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:indeterminate="true"
|
android:indeterminate="true"
|
||||||
app:trackCornerRadius="15dp" />
|
app:trackCornerRadius="15dp" />
|
||||||
|
|
||||||
|
@ -45,7 +65,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/app_install_progressbar"
|
android:layout_below="@id/app_install_progressbar"
|
||||||
android:layout_marginTop="8dp">
|
android:layout_marginTop="6dp">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/app_download_file"
|
android:id="@+id/app_download_file"
|
||||||
|
|
|
@ -21,23 +21,42 @@
|
||||||
android:text="@string/checking_updates"
|
android:text="@string/checking_updates"
|
||||||
style="@style/DialogCardSubtitle"/>
|
style="@style/DialogCardSubtitle"/>
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
<RelativeLayout
|
||||||
android:id="@+id/manager_update_progressbar"
|
android:id="@+id/manager_update_progressbar_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/manager_update_patient"
|
android:layout_below="@id/manager_update_patient"
|
||||||
android:layout_marginTop="32dp"
|
android:layout_marginTop="18dp">
|
||||||
android:paddingBottom="8dp"
|
|
||||||
app:trackCornerRadius="15dp"
|
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||||
tools:progress="10"
|
android:id="@+id/manager_update_progressbar"
|
||||||
tools:visibility="visible" />
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:trackCornerRadius="15dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_toStartOf="@id/manager_update_progress"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
tools:progress="10" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/manager_update_progress"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:textSize="15sp"
|
||||||
|
tools:text="20%" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
<com.vanced.manager.ui.core.ThemedOutlinedMaterialButton
|
<com.vanced.manager.ui.core.ThemedOutlinedMaterialButton
|
||||||
android:id="@+id/manager_update_cancel"
|
android:id="@+id/manager_update_cancel"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_below="@id/manager_update_progressbar"
|
android:layout_below="@id/manager_update_progressbar_container"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
android:text="@string/cancel"
|
android:text="@string/cancel"
|
||||||
style="@style/OutlinedButtonStyle" />
|
style="@style/OutlinedButtonStyle" />
|
||||||
|
|
||||||
|
|
|
@ -10,16 +10,16 @@
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginVertical="16dp"
|
||||||
android:layout_marginTop="@dimen/stdp"
|
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/about_version_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:cardCornerRadius="8dp">
|
app:cardCornerRadius="12dp">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -16,7 +16,13 @@
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical"
|
||||||
|
android:paddingVertical="12dp">
|
||||||
|
|
||||||
|
<com.vanced.manager.ui.core.ThemedTextView
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
|
android:text="@string/apps"
|
||||||
|
style="@style/CardTextHeader" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_app_list"
|
android:id="@+id/recycler_app_list"
|
||||||
|
@ -25,7 +31,7 @@
|
||||||
android:nestedScrollingEnabled="false"
|
android:nestedScrollingEnabled="false"
|
||||||
android:layout_marginHorizontal="8dp"
|
android:layout_marginHorizontal="8dp"
|
||||||
tools:itemCount="3"
|
tools:itemCount="3"
|
||||||
tools:listitem="@layout/view_app" />
|
tools:listitem="@layout/view_app_expandable" />
|
||||||
|
|
||||||
<com.vanced.manager.ui.core.ThemedTextView
|
<com.vanced.manager.ui.core.ThemedTextView
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
|
@ -53,7 +59,6 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
android:nestedScrollingEnabled="false"
|
android:nestedScrollingEnabled="false"
|
||||||
android:paddingBottom="8dp"
|
|
||||||
tools:itemCount="6"
|
tools:itemCount="6"
|
||||||
tools:listitem="@layout/view_social_link" />
|
tools:listitem="@layout/view_social_link" />
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:paddingHorizontal="8dp"
|
android:paddingHorizontal="8dp"
|
||||||
android:paddingTop="16dp">
|
android:paddingVertical="12dp">
|
||||||
|
|
||||||
<com.vanced.manager.ui.core.PreferenceCategory
|
<com.vanced.manager.ui.core.PreferenceCategory
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -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>
|
|
182
app/src/main/res/layout/view_app_expandable.xml
Normal file
182
app/src/main/res/layout/view_app_expandable.xml
Normal 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>
|
||||||
|
|
|
@ -41,7 +41,8 @@
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/settings_fragment"
|
android:id="@+id/settings_fragment"
|
||||||
android:name="com.vanced.manager.ui.fragments.SettingsFragment"
|
android:name="com.vanced.manager.ui.fragments.SettingsFragment"
|
||||||
android:label="@string/title_settings">
|
android:label="@string/title_settings"
|
||||||
|
tools:layout="@layout/fragment_settings">
|
||||||
|
|
||||||
<action
|
<action
|
||||||
android:id="@+id/toDevSettingsFragment"
|
android:id="@+id/toDevSettingsFragment"
|
||||||
|
@ -76,6 +77,7 @@
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/dev_settings_fragment"
|
android:id="@+id/dev_settings_fragment"
|
||||||
android:name="com.vanced.manager.ui.fragments.DevSettingsFragment"
|
android:name="com.vanced.manager.ui.fragments.DevSettingsFragment"
|
||||||
android:label="Dev Settings" />
|
android:label="Dev Settings"
|
||||||
|
tools:layout="@layout/fragment_dev_settings"/>
|
||||||
|
|
||||||
</navigation>
|
</navigation>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">What is your favourite song</string>
|
<string name="cancel">What is your favourite song</string>
|
||||||
<string name="close">Maak toe</string>
|
<string name="close">Maak toe</string>
|
||||||
|
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
|
||||||
|
<string name="description_vanced">A modified YouTube client with many useful features!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
|
||||||
<string name="reset">Herstel</string>
|
<string name="reset">Herstel</string>
|
||||||
<string name="save">Stoor</string>
|
<string name="save">Stoor</string>
|
||||||
<string name="select_apps">Select Your Apps</string>
|
<string name="select_apps">Select Your Apps</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Oor</string>
|
<string name="title_about">Oor</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">Guide</string>
|
||||||
<string name="title_logs">Logs</string>
|
|
||||||
<string name="title_home">Manager</string>
|
<string name="title_home">Manager</string>
|
||||||
|
<string name="title_logs">Logs</string>
|
||||||
<string name="title_settings">Settings</string>
|
<string name="title_settings">Settings</string>
|
||||||
<string name="update_manager">Update Manager</string>
|
<string name="update_manager">Update Manager</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Is Your Device Rooted?</string>
|
<string name="are_you_rooted">Is Your Device Rooted?</string>
|
||||||
<string name="grant_root">Grant Root Permission</string>
|
<string name="grant_root">Grant Root Permission</string>
|
||||||
<string name="select_at_least_one_app">Select at least one app!</string>
|
|
||||||
<string name="select_apps_music">Vanced, but for YouTube Music!\nrelatively less feature-rich but fulfills your needs.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced is the stock Android YouTube App, but better!</string>
|
|
||||||
<string name="lets_get_started">Let\'s get started</string>
|
<string name="lets_get_started">Let\'s get started</string>
|
||||||
|
<string name="select_at_least_one_app">Select at least one app!</string>
|
||||||
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
|
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">About %1$s</string>
|
<string name="about_app">About %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Tap on the card to see the changelog.</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Launch</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Uninstall</string>
|
||||||
|
<string name="accessibility_update">Update</string>
|
||||||
|
<string name="apps">Apps</string>
|
||||||
<string name="changelog">Changelog</string>
|
<string name="changelog">Changelog</string>
|
||||||
<string name="downloading_file">Downloading %1$s</string>
|
<string name="downloading_file">Downloading %1$s</string>
|
||||||
<string name="install">Install</string>
|
<string name="install">Install</string>
|
||||||
<string name="button_reinstall">Reinstall</string>
|
|
||||||
<string name="version_installed">Installed:</string>
|
|
||||||
<string name="latest">Latest:</string>
|
<string name="latest">Latest:</string>
|
||||||
<string name="no_microg">microG isn\'t installed</string>
|
<string name="no_microg">Install Vanced microG first</string>
|
||||||
<string name="root_not_granted">Root access not granted</string>
|
<string name="root_not_granted">Root access not granted</string>
|
||||||
<string name="unavailable">Unavailable</string>
|
|
||||||
<string name="update">Update</string>
|
|
||||||
<string name="social_media">Social Media</string>
|
<string name="social_media">Social Media</string>
|
||||||
<string name="support_us">Support us</string>
|
<string name="support_us">Support us</string>
|
||||||
|
<string name="unavailable">Unavailable</string>
|
||||||
|
<string name="version_installed">Installed:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Accent Color</string>
|
<string name="accent_color">Accent Color</string>
|
||||||
<string name="category_appearance">Appearance</string>
|
<string name="category_appearance">Appearance</string>
|
||||||
<string name="category_behaviour">Behavior</string>
|
<string name="category_behaviour">Behavior</string>
|
||||||
<string name="clear_files">Clear downloaded files</string>
|
<string name="clear_files">Clear downloaded files</string>
|
||||||
<string name="cleared_files">Successfully cleared files</string>
|
<string name="cleared_files">Successfully cleared files</string>
|
||||||
<string name="firebase_title">Firebase Analytics</string>
|
|
||||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||||
|
<string name="firebase_title">Firebase Analytics</string>
|
||||||
<string name="language_title">Language</string>
|
<string name="language_title">Language</string>
|
||||||
<string name="link_title">Use Chrome Custom Tabs</string>
|
|
||||||
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
|
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
|
||||||
<string name="system_default">System Default</string>
|
<string name="link_title">Use Chrome Custom Tabs</string>
|
||||||
|
<string name="push_notifications">%1$s Push Notifications</string>
|
||||||
|
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
|
||||||
<string name="script_save_failed">Failed to save new time value</string>
|
<string name="script_save_failed">Failed to save new time value</string>
|
||||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
||||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
||||||
|
<string name="system_default">System Default</string>
|
||||||
<string name="theme">Theme</string>
|
<string name="theme">Theme</string>
|
||||||
<string name="theme_dark">Dark Theme</string>
|
<string name="theme_dark">Dark Theme</string>
|
||||||
<string name="theme_light">Light Theme</string>
|
<string name="theme_light">Light Theme</string>
|
||||||
<string name="push_notifications">%1$s Push Notifications</string>
|
|
||||||
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
|
|
||||||
<string name="update_center">Manager Update Center</string>
|
<string name="update_center">Manager Update Center</string>
|
||||||
<string name="update_not_found">No new updates</string>
|
<string name="update_not_found">No new updates</string>
|
||||||
<string name="variant">Variant</string>
|
<string name="variant">Variant</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Successfully saved logs</string>
|
|
||||||
<string name="logs_not_saved">Could not save logs</string>
|
<string name="logs_not_saved">Could not save logs</string>
|
||||||
|
<string name="logs_saved">Successfully saved logs</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Advanced</string>
|
<string name="advanced">Details</string>
|
||||||
<string name="app_install_files_detected">%1$s installation files detected!</string>
|
<string name="app_install_files_detected">%1$s installation files detected!</string>
|
||||||
<string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string>
|
<string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s Installation Preferences</string>
|
||||||
<string name="checking_updates">Checking for updates…</string>
|
<string name="checking_updates">Checking for updates…</string>
|
||||||
<string name="chosen_lang">Language(s): %1$s</string>
|
<string name="chosen_lang">Language(s): %1$s</string>
|
||||||
<string name="chosen_theme">Theme: %1$s</string>
|
<string name="chosen_theme">Theme: %1$s</string>
|
||||||
<string name="chosen_version">Version: %1$s</string>
|
<string name="chosen_version">Version: %1$s</string>
|
||||||
|
<string name="error">Error</string>
|
||||||
<string name="guide">Guide</string>
|
<string name="guide">Guide</string>
|
||||||
<string name="hold_on">Stop!</string>
|
<string name="hold_on">Stop!</string>
|
||||||
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
||||||
<string name="error">Error</string>
|
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
||||||
|
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
||||||
<string name="redownload">Redownload</string>
|
<string name="redownload">Redownload</string>
|
||||||
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
||||||
<string name="app_installation_preferences">%1$s Installation Preferences</string>
|
|
||||||
<string name="version">Version</string>
|
<string name="version">Version</string>
|
||||||
<string name="microg_bug">Bug in microG</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">Welcome</string>
|
<string name="welcome">Welcome</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
|
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
||||||
<string name="error_downloading">Error Downloading %1$s</string>
|
<string name="error_downloading">Error Downloading %1$s</string>
|
||||||
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
|
|
||||||
<string name="failed_accent">Failed to apply new accent color</string>
|
<string name="failed_accent">Failed to apply new accent color</string>
|
||||||
|
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
|
||||||
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
|
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
|
||||||
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
|
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
|
||||||
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
||||||
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
|
|
||||||
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
|
||||||
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
||||||
|
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
||||||
<string name="installation_incompatible">Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again.</string>
|
<string name="installation_incompatible">Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again.</string>
|
||||||
<string name="installation_invalid">Installation failed because the apk files are corrupted, please try again.</string>
|
<string name="installation_invalid">Installation failed because the apk files are corrupted, please try again.</string>
|
||||||
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
|
|
||||||
<string name="installation_miui">Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again.</string>
|
<string name="installation_miui">Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again.</string>
|
||||||
|
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
||||||
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
|
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
|
||||||
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>
|
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">إلغاء</string>
|
<string name="cancel">إلغاء</string>
|
||||||
<string name="close">إغلاق</string>
|
<string name="close">إغلاق</string>
|
||||||
|
<string name="description_microg">نسخة خاصة من خدمات جوجل للجوال معدة خصيصا لتطبيق ڤانسد بناءً على مشروع microG.</string>
|
||||||
|
<string name="description_vanced">تطبيق يوتيوب معدل مع العديد من الميزات المفيدة!</string>
|
||||||
|
<string name="description_vanced_music">ڤانسد لموسيقى يوتيوب! يلبي احتياجاتك حتى وان كان يضم ميزات اقل من ڤانسد.</string>
|
||||||
<string name="reset">إعادة تعيين</string>
|
<string name="reset">إعادة تعيين</string>
|
||||||
<string name="save">حفظ</string>
|
<string name="save">حفظ</string>
|
||||||
<string name="select_apps">اختر تطبيقاتك</string>
|
<string name="select_apps">اختر تطبيقاتك</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">حول</string>
|
<string name="title_about">حول</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">دليل الاستخدام</string>
|
||||||
<string name="title_logs">السجل</string>
|
|
||||||
<string name="title_home">المدير</string>
|
<string name="title_home">المدير</string>
|
||||||
|
<string name="title_logs">السجلات</string>
|
||||||
<string name="title_settings">الإعدادات</string>
|
<string name="title_settings">الإعدادات</string>
|
||||||
<string name="update_manager">تحديث المدير</string>
|
<string name="update_manager">تحديث المدير</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">هل جهازك مروت؟</string>
|
<string name="are_you_rooted">هل جهازك مروت؟</string>
|
||||||
<string name="grant_root">امنح صلاحيات الروت</string>
|
<string name="grant_root">امنح صلاحيات الروت</string>
|
||||||
<string name="select_at_least_one_app">حدد تطبيق واحد على الأقل!</string>
|
|
||||||
<string name="select_apps_music">ڤانسد، ولكن لموسيقى يوتيوب! \n نسبياً فيه مميزات أقل ولكن يلبي احتياجاتك.</string>
|
|
||||||
<string name="select_apps_vanced">يوتيوب ڤانسد هو يوتيوب الأندرويد العادي، ولكن أفضل!</string>
|
|
||||||
<string name="lets_get_started">فلنبدأ</string>
|
<string name="lets_get_started">فلنبدأ</string>
|
||||||
|
<string name="select_at_least_one_app">اختر تطبيقاً واحداً على الأقل!</string>
|
||||||
<string name="willing_to_use_root">لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل!</string>
|
<string name="willing_to_use_root">لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">حوالي %1$s</string>
|
<string name="about_app">حول %1$s</string>
|
||||||
<string name="app_changelog_tooltip">أضغط على إحدى البطاقات لعرض سجل التغييرات.</string>
|
<string name="accessibility_download">تنزيل</string>
|
||||||
|
<string name="accessibility_info">المعلومات</string>
|
||||||
|
<string name="accessibility_launch">تشغيل</string>
|
||||||
|
<string name="accessibility_reinstall">أعد التثبيت</string>
|
||||||
|
<string name="accessibility_uninstall">إلغاء التثبيت</string>
|
||||||
|
<string name="accessibility_update">تحديث</string>
|
||||||
|
<string name="apps">التطبيقات</string>
|
||||||
<string name="changelog">سجل التغييرات</string>
|
<string name="changelog">سجل التغييرات</string>
|
||||||
<string name="downloading_file">جارٍ تنزيل %1$s</string>
|
<string name="downloading_file">جارٍ تنزيل %1$s</string>
|
||||||
<string name="install">تثبيت</string>
|
<string name="install">تثبيت</string>
|
||||||
<string name="button_reinstall">إعادة التثبيت</string>
|
|
||||||
<string name="version_installed">مثبت:</string>
|
|
||||||
<string name="latest">الأحدث:</string>
|
<string name="latest">الأحدث:</string>
|
||||||
<string name="no_microg">لم يتم تثبيت microG</string>
|
<string name="no_microg">قم بتثبيت Vanced microG أولاً</string>
|
||||||
<string name="root_not_granted">لم يتم منح صلاحيات الروت</string>
|
<string name="root_not_granted">لم يتم منح صلاحيات الروت</string>
|
||||||
<string name="unavailable">غير متاح</string>
|
|
||||||
<string name="update">تحديث</string>
|
|
||||||
<string name="social_media">وسائل التواصل الإجتماعي</string>
|
<string name="social_media">وسائل التواصل الإجتماعي</string>
|
||||||
<string name="support_us">ادعمنا</string>
|
<string name="support_us">ادعمنا</string>
|
||||||
|
<string name="unavailable">غير متاح</string>
|
||||||
|
<string name="version_installed">مثبت:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">الألوان</string>
|
<string name="accent_color">الألوان</string>
|
||||||
<string name="category_appearance">المظهر</string>
|
<string name="category_appearance">المظهر</string>
|
||||||
<string name="category_behaviour">السلوك</string>
|
<string name="category_behaviour">السلوك</string>
|
||||||
<string name="clear_files">مسح الملفات التي تم تنزيلها</string>
|
<string name="clear_files">مسح الملفات التي تم تنزيلها</string>
|
||||||
<string name="cleared_files">تم مسح الملفات بنجاح</string>
|
<string name="cleared_files">تم مسح الملفات بنجاح</string>
|
||||||
<string name="firebase_title">تحليلات Firebase</string>
|
|
||||||
<string name="firebase_summary">هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال</string>
|
<string name="firebase_summary">هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال</string>
|
||||||
|
<string name="firebase_title">تحليلات Firebase</string>
|
||||||
<string name="language_title">اللغة</string>
|
<string name="language_title">اللغة</string>
|
||||||
<string name="link_title">استخدم علامات تبويب مخصصة لمتصفح كروم</string>
|
|
||||||
<string name="link_custom_tabs">سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم</string>
|
<string name="link_custom_tabs">سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم</string>
|
||||||
<string name="system_default">الوضع الافتراضي</string>
|
<string name="link_title">استخدم علامات تبويب مخصصة لمتصفح كروم</string>
|
||||||
|
<string name="push_notifications">إشعارات %1$s</string>
|
||||||
|
<string name="push_notifications_summary">تلقي الإشعارات عند إصدار تحديث لـ %1$s</string>
|
||||||
<string name="script_save_failed">فشل في حفظ القيمة الزمنية الجديدة</string>
|
<string name="script_save_failed">فشل في حفظ القيمة الزمنية الجديدة</string>
|
||||||
<string name="script_sleep_timer">Script sleep time للروت</string>
|
<string name="script_sleep_timer">Script sleep time للروت</string>
|
||||||
<string name="script_sleep_timer_description">ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب</string>
|
<string name="script_sleep_timer_description">ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب</string>
|
||||||
|
<string name="system_default">الوضع الافتراضي</string>
|
||||||
<string name="theme">السمة</string>
|
<string name="theme">السمة</string>
|
||||||
<string name="theme_dark">السمة الداكنة</string>
|
<string name="theme_dark">السمة الداكنة</string>
|
||||||
<string name="theme_light">السمة الفاتحة</string>
|
<string name="theme_light">السمة الفاتحة</string>
|
||||||
<string name="push_notifications">إشعارات %1$s</string>
|
|
||||||
<string name="push_notifications_summary">تلقي الإشعارات عند إصدار تحديث لـ %1$s</string>
|
|
||||||
<string name="update_center">مركز التحديث</string>
|
<string name="update_center">مركز التحديث</string>
|
||||||
<string name="update_not_found">لا توجد تحديثات جديدة</string>
|
<string name="update_not_found">لا توجد تحديثات جديدة</string>
|
||||||
<string name="variant">النوع</string>
|
<string name="variant">النوع</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">تم حفظ السجل بنجاح</string>
|
|
||||||
<string name="logs_not_saved">تعذر حفظ السجل</string>
|
<string name="logs_not_saved">تعذر حفظ السجل</string>
|
||||||
|
<string name="logs_saved">تم حفظ السجل بنجاح</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">إعدادات متقدمة</string>
|
<string name="advanced">التفاصيل</string>
|
||||||
<string name="app_install_files_detected">تم اكتشاف ملفات تثبيت %1$s!</string>
|
<string name="app_install_files_detected">تم اكتشاف ملفات تثبيت %1$s!</string>
|
||||||
<string name="app_install_files_detected_summary">اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟</string>
|
<string name="app_install_files_detected_summary">اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟</string>
|
||||||
|
<string name="app_installation_preferences">تفضيلات تثبيت %1$s</string>
|
||||||
<string name="checking_updates">جارٍ التحقق من وجود تحديثات…</string>
|
<string name="checking_updates">جارٍ التحقق من وجود تحديثات…</string>
|
||||||
<string name="chosen_lang">اللغة/اللغات: %1$s</string>
|
<string name="chosen_lang">اللغة/اللغات: %1$s</string>
|
||||||
<string name="chosen_theme">السمة: %1$s</string>
|
<string name="chosen_theme">السمة: %1$s</string>
|
||||||
<string name="chosen_version">الإصدار: %1$s</string>
|
<string name="chosen_version">الإصدار: %1$s</string>
|
||||||
|
<string name="error">خطأ</string>
|
||||||
<string name="guide">الدليل</string>
|
<string name="guide">الدليل</string>
|
||||||
<string name="hold_on">إيقاف!</string>
|
<string name="hold_on">إيقاف!</string>
|
||||||
<string name="magisk_vanced">يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP.</string>
|
<string name="magisk_vanced">يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP.</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
<string name="miui_one">من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا)</string>
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one_title">تحسينات MIUI مفعلة!</string>
|
||||||
<string name="error">خطأ</string>
|
<string name="please_be_patient">الرجاء عدم الخروج من التطبيق أثناء هذه العملية!</string>
|
||||||
<string name="redownload">إعادة التنزيل</string>
|
<string name="redownload">إعادة التنزيل</string>
|
||||||
<string name="security_context">تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub</string>
|
<string name="security_context">تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub</string>
|
||||||
<string name="app_installation_preferences">تفضيلات تثبيت %1$s</string>
|
|
||||||
<string name="version">الإصدار</string>
|
<string name="version">الإصدار</string>
|
||||||
<string name="microg_bug">خطأ في المايكروجي</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">مرحباً بك</string>
|
<string name="welcome">مرحباً بك</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">اختر لغتك(لغاتك) المفضلة لڤانسد</string>
|
<string name="choose_preferred_language">اختر لغتك(لغاتك) المفضلة لڤانسد</string>
|
||||||
|
@ -94,26 +96,25 @@
|
||||||
<string name="vanced_dark">داكن</string>
|
<string name="vanced_dark">داكن</string>
|
||||||
<!-- About Page -->
|
<!-- About Page -->
|
||||||
<string name="manager_dev">مطوري المدير</string>
|
<string name="manager_dev">مطوري المدير</string>
|
||||||
<string name="other_contributors">Other Contributors</string>
|
<string name="other_contributors">مساهمين آخرين</string>
|
||||||
<string name="sources">المصادر</string>
|
<string name="sources">المصادر</string>
|
||||||
<string name="vanced_team">فريق ڤانسد</string>
|
<string name="vanced_team">فريق ڤانسد</string>
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى.</string>
|
<string name="chown_fail">فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى.</string>
|
||||||
<string name="error_downloading">خطأ في تنزيل %1$s</string>
|
<string name="error_downloading">خطأ في تنزيل %1$s</string>
|
||||||
<string name="failed_uninstall">فشل في الغاء تثبيت الحزمة %1$s</string>
|
|
||||||
<string name="failed_accent">فشل تطبيق لون النسق الجديد</string>
|
<string name="failed_accent">فشل تطبيق لون النسق الجديد</string>
|
||||||
|
<string name="failed_uninstall">فشل في الغاء تثبيت حزمة %1$s</string>
|
||||||
<string name="files_missing_va">فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى.</string>
|
<string name="files_missing_va">فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى.</string>
|
||||||
<string name="ifile_missing">فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى.</string>
|
<string name="ifile_missing">فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى.</string>
|
||||||
<string name="installation_aborted">فشل التثبيت لأن المستخدم ألغى التثبيت.</string>
|
<string name="installation_aborted">فشل التثبيت لأن المستخدم ألغى التثبيت.</string>
|
||||||
<string name="installation_blocked">فشل التثبيت لأن المستخدم قام بحظر التثبيت.</string>
|
|
||||||
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
|
||||||
<string name="installation_conflict">فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى.</string>
|
<string name="installation_conflict">فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_downgrade">فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى.</string>
|
||||||
|
<string name="installation_failed">فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم. يرجى أيضاً إرفاق لقطة الشاشة من القائمة المتقدمة</string>
|
||||||
<string name="installation_incompatible">فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى.</string>
|
<string name="installation_incompatible">فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى.</string>
|
||||||
<string name="installation_invalid">فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى.</string>
|
<string name="installation_invalid">فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى.</string>
|
||||||
<string name="installation_signature">فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى.</string>
|
|
||||||
<string name="installation_miui">فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى.</string>
|
<string name="installation_miui">فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_signature">فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى.</string>
|
||||||
|
<string name="installation_storage">فشل التثبيت، مساحة جهازك الخالية لا تكفي. </string>
|
||||||
<string name="modapk_missing">فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى.</string>
|
<string name="modapk_missing">فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى.</string>
|
||||||
<string name="path_missing">فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة.</string>
|
<string name="path_missing">فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -3,90 +3,92 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">İmtina</string>
|
<string name="cancel">İmtina</string>
|
||||||
<string name="close">Bağla</string>
|
<string name="close">Bağla</string>
|
||||||
|
<string name="description_microg">microG Layihəsi əsasında Vanced üçün təkmilləşdirilmiş özəl bir GMS tətbiqi.</string>
|
||||||
|
<string name="description_vanced">Çoxlu faydalı özəllikləri ilə modifikasiya edilmiş YouTube versiyası!</string>
|
||||||
|
<string name="description_vanced_music">Yenə Vanced, ancaq YouTube Msuic üçün! Nisbətən daha az özəlliyi olsa da, ehtiyaclarınızı qarşılayacaq.</string>
|
||||||
<string name="reset">Sıfırla</string>
|
<string name="reset">Sıfırla</string>
|
||||||
<string name="save">Saxla</string>
|
<string name="save">Saxla</string>
|
||||||
<string name="select_apps">Tətbiqlərinizi Seçin</string>
|
<string name="select_apps">Tətbiqlərinizi Seçin</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Haqqında</string>
|
<string name="title_about">Haqqında</string>
|
||||||
<string name="title_guide">Bələdçi</string>
|
<string name="title_guide">Bələdçi</string>
|
||||||
<string name="title_logs">Qeydlər</string>
|
|
||||||
<string name="title_home">Menecer</string>
|
<string name="title_home">Menecer</string>
|
||||||
|
<string name="title_logs">Qeydlər</string>
|
||||||
<string name="title_settings">Tənzimləmələr</string>
|
<string name="title_settings">Tənzimləmələr</string>
|
||||||
<string name="update_manager">Yeniləmə Meneceri</string>
|
<string name="update_manager">Yeniləmə Meneceri</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Cihazınızda root varmı?</string>
|
<string name="are_you_rooted">Cihazınızda root varmı?</string>
|
||||||
<string name="grant_root">Root İcazəsi Ver</string>
|
<string name="grant_root">Root İcazəsi Ver</string>
|
||||||
<string name="select_at_least_one_app">Ən azı bir tətbiq seçin!</string>
|
|
||||||
<string name="select_apps_music">Vanced, amma YouTube Musiqi üçün!\nçox daha az xüsusiyyətli olsa da ehtiyaclarınızı qarşılayır.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced adi Android YouTube tətbiqi olsa da daha yaxşıdır!</string>
|
|
||||||
<string name="lets_get_started">Gəlin başlayaq</string>
|
<string name="lets_get_started">Gəlin başlayaq</string>
|
||||||
|
<string name="select_at_least_one_app">Ən azı bir tətbiq seçin!</string>
|
||||||
<string name="willing_to_use_root">Root versiyasının nə olduğunu bilmirsiz ya da sadəcə istifadə etmək istəmirsiz? onda aşağıdakı göy oxa toxunun!</string>
|
<string name="willing_to_use_root">Root versiyasının nə olduğunu bilmirsiz ya da sadəcə istifadə etmək istəmirsiz? onda aşağıdakı göy oxa toxunun!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">%1$s Haqqında</string>
|
<string name="about_app">%1$s Haqqında</string>
|
||||||
<string name="app_changelog_tooltip">Yenilikləri görmək üçün karta toxunun.</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Launch</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Uninstall</string>
|
||||||
|
<string name="accessibility_update">Update</string>
|
||||||
|
<string name="apps">Tətbiqlər</string>
|
||||||
<string name="changelog">Dəyişikliklər</string>
|
<string name="changelog">Dəyişikliklər</string>
|
||||||
<string name="downloading_file">%1$s endirilir</string>
|
<string name="downloading_file">%1$s endirilir</string>
|
||||||
<string name="install">Quraşdır</string>
|
<string name="install">Quraşdır</string>
|
||||||
<string name="button_reinstall">Yenidən quraşdır</string>
|
|
||||||
<string name="version_installed">Quraşdırıldı:</string>
|
|
||||||
<string name="latest">Ən son:</string>
|
<string name="latest">Ən son:</string>
|
||||||
<string name="no_microg">microG quraşdırılmayıb</string>
|
<string name="no_microg">Əvvəlcə Vanced microG-ni quraşdırın</string>
|
||||||
<string name="root_not_granted">Root icazəsi verilməyib</string>
|
<string name="root_not_granted">Root icazəsi verilməyib</string>
|
||||||
<string name="unavailable">Əlçatmazdır</string>
|
|
||||||
<string name="update">Yenilə</string>
|
|
||||||
<string name="social_media">Sosial Media</string>
|
<string name="social_media">Sosial Media</string>
|
||||||
<string name="support_us">Bizi dəstəklə</string>
|
<string name="support_us">Bizi dəstəklə</string>
|
||||||
|
<string name="unavailable">Əlçatmazdır</string>
|
||||||
|
<string name="version_installed">Qurulan:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Tema rəngi</string>
|
<string name="accent_color">Tema rəngi</string>
|
||||||
<string name="category_appearance">Görünüş</string>
|
<string name="category_appearance">Görünüş</string>
|
||||||
<string name="category_behaviour">Davranış</string>
|
<string name="category_behaviour">Davranış</string>
|
||||||
<string name="clear_files">Endirilmiş faylları təmizlə</string>
|
<string name="clear_files">Endirilmiş faylları təmizlə</string>
|
||||||
<string name="cleared_files">Fayllar uğurla təmizləndi</string>
|
<string name="cleared_files">Fayllar uğurla təmizləndi</string>
|
||||||
<string name="firebase_title">Firebase Analitikləri</string>
|
|
||||||
<string name="firebase_summary">Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir</string>
|
<string name="firebase_summary">Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir</string>
|
||||||
|
<string name="firebase_title">Firebase Analitikləri</string>
|
||||||
<string name="language_title">Dil</string>
|
<string name="language_title">Dil</string>
|
||||||
<string name="link_title">Chrome Özəl Vərəqlərini istifadə et</string>
|
|
||||||
<string name="link_custom_tabs">Bağlantılar Chrome Özəl Vərəqlərində açılacaq</string>
|
<string name="link_custom_tabs">Bağlantılar Chrome Özəl Vərəqlərində açılacaq</string>
|
||||||
<string name="system_default">İlkin Sistem</string>
|
<string name="link_title">Chrome Özəl Vərəqlərini istifadə et</string>
|
||||||
|
<string name="push_notifications">%1$s Ani Bildirişlər</string>
|
||||||
|
<string name="push_notifications_summary">%1$s üçün yeni buraxılış olanda ani bildirişlər alın</string>
|
||||||
<string name="script_save_failed">Yeni vaxt qiymətini saxlamaq olmadı</string>
|
<string name="script_save_failed">Yeni vaxt qiymətini saxlamaq olmadı</string>
|
||||||
<string name="script_sleep_timer">Root Qoşma Gözləmə Müddəti</string>
|
<string name="script_sleep_timer">Root Qoşma Gözləmə Müddəti</string>
|
||||||
<string name="script_sleep_timer_description">/data/adb/service.d/app.sh kodundakı yuxu vaxtı qiymətini nizamlayın, bu qoşma xətalarını aradan qaldırmağa kömək edəcək</string>
|
<string name="script_sleep_timer_description">/data/adb/service.d/app.sh kodundakı yuxu vaxtı qiymətini nizamlayın, bu qoşma xətalarını aradan qaldırmağa kömək edəcək</string>
|
||||||
<string name="theme">Tema</string>
|
<string name="system_default">İlkin Sistem</string>
|
||||||
|
<string name="theme">Mövzu</string>
|
||||||
<string name="theme_dark">Tünd mövzu</string>
|
<string name="theme_dark">Tünd mövzu</string>
|
||||||
<string name="theme_light">Açıq mövzu</string>
|
<string name="theme_light">Açıq mövzu</string>
|
||||||
<string name="push_notifications">%1$s Ani Bildirişlər</string>
|
|
||||||
<string name="push_notifications_summary">%1$s üçün yeni buraxılış olanda ani bildirişlər alın</string>
|
|
||||||
<string name="update_center">Menecer Yeniləmə Mərkəzi</string>
|
<string name="update_center">Menecer Yeniləmə Mərkəzi</string>
|
||||||
<string name="update_not_found">Yeniləmə yoxdur</string>
|
<string name="update_not_found">Yeniləmə yoxdur</string>
|
||||||
<string name="variant">Variant</string>
|
<string name="variant">Variant</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
|
|
||||||
<string name="logs_not_saved">Qeydləri saxlamaq olmadı</string>
|
<string name="logs_not_saved">Qeydləri saxlamaq olmadı</string>
|
||||||
|
<string name="logs_saved">Qeydlər uğurla saxlandı</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Qabaqcıl</string>
|
<string name="advanced">Təfsilatlar</string>
|
||||||
<string name="app_install_files_detected">%1$s quraşdırma faylı aşkarlandı!</string>
|
<string name="app_install_files_detected">%1$s quraşdırma faylı aşkarlandı!</string>
|
||||||
<string name="app_install_files_detected_summary">Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz?</string>
|
<string name="app_install_files_detected_summary">Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s Qurma Seçimləri</string>
|
||||||
<string name="checking_updates">Yeniləmələr yoxlanılır…</string>
|
<string name="checking_updates">Yeniləmələr yoxlanılır…</string>
|
||||||
<string name="chosen_lang">Dil(lər): %1$s</string>
|
<string name="chosen_lang">Dil(lər): %1$s</string>
|
||||||
<string name="chosen_theme">Mövzu: %1$s</string>
|
<string name="chosen_theme">Mövzu: %1$s</string>
|
||||||
<string name="chosen_version">Versiya: %1$s</string>
|
<string name="chosen_version">Versiya: %1$s</string>
|
||||||
|
<string name="error">Xəta</string>
|
||||||
<string name="guide">Bələdçi</string>
|
<string name="guide">Bələdçi</string>
|
||||||
<string name="hold_on">Dayandır!</string>
|
<string name="hold_on">Dayandır!</string>
|
||||||
<string name="magisk_vanced">Buraxılışı dayandırılan və bu tətbiq istifadə edərək yenilənə bilməyən Vanced-in Magisk/TWRP versiyasını istifadə edirsiniz. Zəhmət olmasa magisk modulunu/TWRP Vanced silici istifadə edərək silin.</string>
|
<string name="magisk_vanced">Buraxılışı dayandırılan və bu tətbiq istifadə edərək yenilənə bilməyən Vanced-in Magisk/TWRP versiyasını istifadə edirsiniz. Zəhmət olmasa magisk modulunu/TWRP Vanced silici istifadə edərək silin.</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
<string name="miui_one">Vanced-i quraşdırmaq üçün tərtibatçı tənzimləmələrindən MIUI Optimallaşdırmasını sıradan çıxartmaq LAZIMDIR. (20.2.20 və ya yuxarı xiaomi.eu əsaslı ROM istifadə edirsinizsə bu xəbərdarlığı nəzərə almaya bilərsiniz)</string>
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one_title">MIUI Optimizasiyaları açıqdır!</string>
|
||||||
<string name="error">Xəta</string>
|
<string name="please_be_patient">Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN!</string>
|
||||||
<string name="redownload">Yenidən endir</string>
|
<string name="redownload">Yenidən endir</string>
|
||||||
<string name="security_context">Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun</string>
|
<string name="security_context">Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun</string>
|
||||||
<string name="app_installation_preferences">%1$s Qurma Seçimləri</string>
|
|
||||||
<string name="version">Versiya</string>
|
<string name="version">Versiya</string>
|
||||||
<string name="microg_bug">Amma microG\'də</string>
|
<string name="welcome">Xoş gəlmisiniz</string>
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN!</string>
|
|
||||||
<string name="welcome">Xoş gəldiniz</string>
|
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Vanced üçün tərcih etdiyiniz dili seçin</string>
|
<string name="choose_preferred_language">Vanced üçün istədiyiniz dili seçin</string>
|
||||||
<string name="install_latest">Ən son</string>
|
<string name="install_latest">Ən son</string>
|
||||||
<string name="light_plus_other">İşıqlı + %1$s</string>
|
<string name="light_plus_other">İşıqlı + %1$s</string>
|
||||||
<string name="select_at_least_one_lang">Ən azı bir dil seçin!</string>
|
<string name="select_at_least_one_lang">Ən azı bir dil seçin!</string>
|
||||||
|
@ -94,26 +96,25 @@
|
||||||
<string name="vanced_dark">Qaranlıq</string>
|
<string name="vanced_dark">Qaranlıq</string>
|
||||||
<!-- About Page -->
|
<!-- About Page -->
|
||||||
<string name="manager_dev">Menecer Tərtibatçıları</string>
|
<string name="manager_dev">Menecer Tərtibatçıları</string>
|
||||||
<string name="other_contributors">Other Contributors</string>
|
<string name="other_contributors">Digər Dəstəkçilər</string>
|
||||||
<string name="sources">Mənbələr</string>
|
<string name="sources">Mənbələr</string>
|
||||||
<string name="vanced_team">Vanced Birliyi</string>
|
<string name="vanced_team">Vanced Birliyi</string>
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın.</string>
|
<string name="chown_fail">Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın.</string>
|
||||||
<string name="error_downloading">%1$s endirilmə xətası</string>
|
<string name="error_downloading">%1$s Yüklənərkən xəta</string>
|
||||||
<string name="failed_uninstall">%1$s paketini silinmədi</string>
|
|
||||||
<string name="failed_accent">Yeni ikinci rəngi təyin etmək alınmadı</string>
|
<string name="failed_accent">Yeni ikinci rəngi təyin etmək alınmadı</string>
|
||||||
|
<string name="failed_uninstall">%1$s paketini silmək olmur</string>
|
||||||
<string name="files_missing_va">Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın.</string>
|
<string name="files_missing_va">Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın.</string>
|
||||||
<string name="ifile_missing">Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın.</string>
|
<string name="ifile_missing">Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın.</string>
|
||||||
<string name="installation_aborted">İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu.</string>
|
<string name="installation_aborted">İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu.</string>
|
||||||
<string name="installation_blocked">İstifadəçi quraşdırmanı əngəllədiyi üçün quraşdırılma uğursuz oldu.</string>
|
|
||||||
<string name="installation_downgrade">İstifadəçi paketi alt versiyaya keçirməyə çalışdığı üçün quraşdırılma uğursuz oldu. Stok YouTube tətbiqindən yeniləmələri silib yenidən sınayın.</string>
|
|
||||||
<string name="installation_conflict">Tətbiq əvvəlcədən quraşdırılmış bir tətbiqlə toqquşduğu üçün quraşdırılma uğursuz oldu. Vanced-in cari versiyasını silib yenidən sınayın.</string>
|
<string name="installation_conflict">Tətbiq əvvəlcədən quraşdırılmış bir tətbiqlə toqquşduğu üçün quraşdırılma uğursuz oldu. Vanced-in cari versiyasını silib yenidən sınayın.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_downgrade">İstifadəçi paketi alt versiyaya keçirməyə çalışdığı üçün quraşdırılma uğursuz oldu. Stok YouTube tətbiqindən yeniləmələri silib yenidən sınayın.</string>
|
||||||
|
<string name="installation_failed">Bilinməyən səbəblərdən qurma alınmadı, əlavə yardım üçün Telegram və ya Discordumuza qoşulun. Xahiş olunur Qabaqcıl bölməsindən ekran görüntüsü də əlavə edin</string>
|
||||||
<string name="installation_incompatible">Quraşdırma faylı cihazınıza uyğun gəlmədiyi üçün quraşdırılma uğursuz oldu. Tənzimləmələrdən endirilmiş faylları təmizləyib yenidən sınayın.</string>
|
<string name="installation_incompatible">Quraşdırma faylı cihazınıza uyğun gəlmədiyi üçün quraşdırılma uğursuz oldu. Tənzimləmələrdən endirilmiş faylları təmizləyib yenidən sınayın.</string>
|
||||||
<string name="installation_invalid">Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın.</string>
|
<string name="installation_invalid">Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın.</string>
|
||||||
<string name="installation_signature">Apk imza təsdiqləmə fəal olduğu üçün quraşdırılma uğursuz oldu. Apk imza təsdiqləməsini sıradan çıxarıb yenidən sınayın.</string>
|
|
||||||
<string name="installation_miui">MIUI Optimallaşdırma fəal olduğu üçün quraşdırılma uğursuz oldu. MIUI Optimallaşdırmanı sıradan çıxarıb yenidən sınayın.</string>
|
<string name="installation_miui">MIUI Optimallaşdırma fəal olduğu üçün quraşdırılma uğursuz oldu. MIUI Optimallaşdırmanı sıradan çıxarıb yenidən sınayın.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_signature">Apk imza təsdiqləmə fəal olduğu üçün quraşdırılma uğursuz oldu. Apk imza təsdiqləməsini sıradan çıxarıb yenidən sınayın.</string>
|
||||||
|
<string name="installation_storage">Cihazda yaddaş az olduğundan qurma alınmadı.</string>
|
||||||
<string name="modapk_missing">Quraşdırıcıda qara/tünd tema üçün apk faylı tapılmadı. Menecer-in tətbiq verilənlərini təmizləyib yenidən sınayın.</string>
|
<string name="modapk_missing">Quraşdırıcıda qara/tünd tema üçün apk faylı tapılmadı. Menecer-in tətbiq verilənlərini təmizləyib yenidən sınayın.</string>
|
||||||
<string name="path_missing">Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı.</string>
|
<string name="path_missing">Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -3,90 +3,92 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">Отказ</string>
|
<string name="cancel">Отказ</string>
|
||||||
<string name="close">Затвори</string>
|
<string name="close">Затвори</string>
|
||||||
|
<string name="description_microg">Персонализирано внедряване на GMS за Vanced въз основа на проекта microG.</string>
|
||||||
|
<string name="description_vanced">Модифициран клиент за YouTube с много полезни функции!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, но за YouTube Music! Относително по-малко богат на функции, но ще отговори на вашите нужди.</string>
|
||||||
<string name="reset">Изчисти</string>
|
<string name="reset">Изчисти</string>
|
||||||
<string name="save">Запази</string>
|
<string name="save">Запази</string>
|
||||||
<string name="select_apps">Изберете приложения</string>
|
<string name="select_apps">Изберете приложения</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Относно</string>
|
<string name="title_about">Относно</string>
|
||||||
<string name="title_guide">Ръководство</string>
|
<string name="title_guide">Ръководство</string>
|
||||||
<string name="title_logs">Логове</string>
|
|
||||||
<string name="title_home">Мениджър</string>
|
<string name="title_home">Мениджър</string>
|
||||||
|
<string name="title_logs">Логове</string>
|
||||||
<string name="title_settings">Настройки</string>
|
<string name="title_settings">Настройки</string>
|
||||||
<string name="update_manager">Обнови Vanced Manager</string>
|
<string name="update_manager">Обнови Vanced Manager</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Имате ли Root достъп на устройството си?</string>
|
<string name="are_you_rooted">Имате ли Root достъп на устройството си?</string>
|
||||||
<string name="grant_root">Разрешете Root достъп</string>
|
<string name="grant_root">Разрешете Root достъп</string>
|
||||||
<string name="select_at_least_one_app">Изберете поне едно приложение!</string>
|
|
||||||
<string name="select_apps_music">Vanced, но за YouTube Music!\nс по-малко функции, но ще задоволи нуждите Ви.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced е като оригиналното YouTube приложение, но значително подобрено!</string>
|
|
||||||
<string name="lets_get_started">Да започваме</string>
|
<string name="lets_get_started">Да започваме</string>
|
||||||
|
<string name="select_at_least_one_app">Изберете поне едно приложение!</string>
|
||||||
<string name="willing_to_use_root">Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу!</string>
|
<string name="willing_to_use_root">Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">Относно %1$s</string>
|
<string name="about_app">Относно %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Докоснете картичката, за да видите списъка с промени.</string>
|
<string name="accessibility_download">Изтегляне</string>
|
||||||
|
<string name="accessibility_info">Информация</string>
|
||||||
|
<string name="accessibility_launch">Стартиране</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Деинсталиране</string>
|
||||||
|
<string name="accessibility_update">Актуализиране</string>
|
||||||
|
<string name="apps">Приложения</string>
|
||||||
<string name="changelog">Списък с промени</string>
|
<string name="changelog">Списък с промени</string>
|
||||||
<string name="downloading_file">Изтегляне на %1$s</string>
|
<string name="downloading_file">Изтегляне на %1$s</string>
|
||||||
<string name="install">Инсталиране</string>
|
<string name="install">Инсталиране</string>
|
||||||
<string name="button_reinstall">Преинсталиране</string>
|
|
||||||
<string name="version_installed">Инсталиранa:</string>
|
|
||||||
<string name="latest">Най-нова:</string>
|
<string name="latest">Най-нова:</string>
|
||||||
<string name="no_microg">microG не е инсталирано</string>
|
<string name="no_microg">Инсталирайте първо Vanced microG</string>
|
||||||
<string name="root_not_granted">Root достъп не е разрешен</string>
|
<string name="root_not_granted">Root достъп не е разрешен</string>
|
||||||
<string name="unavailable">Недостъпно</string>
|
|
||||||
<string name="update">Обновяване</string>
|
|
||||||
<string name="social_media">Социални медии</string>
|
<string name="social_media">Социални медии</string>
|
||||||
<string name="support_us">Подкрепете ни</string>
|
<string name="support_us">Подкрепете ни</string>
|
||||||
|
<string name="unavailable">Недостъпно</string>
|
||||||
|
<string name="version_installed">Инсталиранa:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Акцентиращ цвят</string>
|
<string name="accent_color">Акцентиращ цвят</string>
|
||||||
<string name="category_appearance">Външен вид</string>
|
<string name="category_appearance">Външен вид</string>
|
||||||
<string name="category_behaviour">Поведение</string>
|
<string name="category_behaviour">Поведение</string>
|
||||||
<string name="clear_files">Изчисти изтеглените файлове</string>
|
<string name="clear_files">Изчисти изтеглените файлове</string>
|
||||||
<string name="cleared_files">Файловете са изчистени успешно</string>
|
<string name="cleared_files">Файловете са изчистени успешно</string>
|
||||||
<string name="firebase_title">Firebase анализ</string>
|
|
||||||
<string name="firebase_summary">Позволява ни да събираме информация за поведението на приложението и доклади за сривове</string>
|
<string name="firebase_summary">Позволява ни да събираме информация за поведението на приложението и доклади за сривове</string>
|
||||||
|
<string name="firebase_title">Firebase анализ</string>
|
||||||
<string name="language_title">Език</string>
|
<string name="language_title">Език</string>
|
||||||
<string name="link_title">Ползвай персонализирани раздели на Chrome</string>
|
|
||||||
<string name="link_custom_tabs">Връзките ще се отварят в персонализирани раздели на Chrome</string>
|
<string name="link_custom_tabs">Връзките ще се отварят в персонализирани раздели на Chrome</string>
|
||||||
<string name="system_default">По подразбиране за системата</string>
|
<string name="link_title">Ползвай персонализирани раздели на Chrome</string>
|
||||||
|
<string name="push_notifications">%1$s насочени известия</string>
|
||||||
|
<string name="push_notifications_summary">Получаване на насочени известия, когато има нова версия на %1$s</string>
|
||||||
<string name="script_save_failed">Неуспешно запазване на новата стойност за времето</string>
|
<string name="script_save_failed">Неуспешно запазване на новата стойност за времето</string>
|
||||||
<string name="script_sleep_timer">Време за заспиване на Root скрипта</string>
|
<string name="script_sleep_timer">Време за заспиване на Root скрипта</string>
|
||||||
<string name="script_sleep_timer_description">Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране</string>
|
<string name="script_sleep_timer_description">Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране</string>
|
||||||
|
<string name="system_default">По подразбиране за системата</string>
|
||||||
<string name="theme">Тема</string>
|
<string name="theme">Тема</string>
|
||||||
<string name="theme_dark">Тъмна тема</string>
|
<string name="theme_dark">Тъмна тема</string>
|
||||||
<string name="theme_light">Светла тема</string>
|
<string name="theme_light">Светла тема</string>
|
||||||
<string name="push_notifications">%1$s насочени известия</string>
|
|
||||||
<string name="push_notifications_summary">Получаване на насочени известия, когато има нова версия на %1$s</string>
|
|
||||||
<string name="update_center">Център за актуализации</string>
|
<string name="update_center">Център за актуализации</string>
|
||||||
<string name="update_not_found">Няма актуализации</string>
|
<string name="update_not_found">Няма актуализации</string>
|
||||||
<string name="variant">Вариант</string>
|
<string name="variant">Вариант</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Успешно запазени логове</string>
|
|
||||||
<string name="logs_not_saved">Не могат да се запазят логовете</string>
|
<string name="logs_not_saved">Не могат да се запазят логовете</string>
|
||||||
|
<string name="logs_saved">Успешно запазени логове</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Разширени</string>
|
<string name="advanced">Подробности</string>
|
||||||
<string name="app_install_files_detected">%1$s инсталационни файлове са открити!</string>
|
<string name="app_install_files_detected">%1$s инсталационни файлове са открити!</string>
|
||||||
<string name="app_install_files_detected_summary">Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате?</string>
|
<string name="app_install_files_detected_summary">Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате?</string>
|
||||||
|
<string name="app_installation_preferences">Предпочитания за инсталация на %1$s</string>
|
||||||
<string name="checking_updates">Проверка за актуализации…</string>
|
<string name="checking_updates">Проверка за актуализации…</string>
|
||||||
<string name="chosen_lang">Език(ци): %1$s</string>
|
<string name="chosen_lang">Език(ци): %1$s</string>
|
||||||
<string name="chosen_theme">Тема: %1$s</string>
|
<string name="chosen_theme">Тема: %1$s</string>
|
||||||
<string name="chosen_version">Версия: %1$s</string>
|
<string name="chosen_version">Версия: %1$s</string>
|
||||||
|
<string name="error">Грешка</string>
|
||||||
<string name="guide">Ръководство</string>
|
<string name="guide">Ръководство</string>
|
||||||
<string name="hold_on">Стоп!</string>
|
<string name="hold_on">Стоп!</string>
|
||||||
<string name="magisk_vanced">Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller.</string>
|
<string name="magisk_vanced">Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller.</string>
|
||||||
<string name="miui_one_title">MIUI оптимизациите са включени!</string>
|
|
||||||
<string name="miui_one">За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu)</string>
|
<string name="miui_one">За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu)</string>
|
||||||
<string name="error">Грешка</string>
|
<string name="miui_one_title">MIUI оптимизациите са включени!</string>
|
||||||
|
<string name="please_be_patient">Моля, НЕ излизайте от приложението по време на този процес!</string>
|
||||||
<string name="redownload">Изтегли отново</string>
|
<string name="redownload">Изтегли отново</string>
|
||||||
<string name="security_context">Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub</string>
|
<string name="security_context">Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub</string>
|
||||||
<string name="app_installation_preferences">Предпочитания за инсталация на %1$s</string>
|
|
||||||
<string name="version">Версия</string>
|
<string name="version">Версия</string>
|
||||||
<string name="microg_bug">Бъг в microG</string>
|
|
||||||
<string name="microg_bug_summary">Поради бъг в microG инсталирането на Vanced версия 16 изисква първо да се инсталира версия 15.43.32 след това да влезете в профила си след което може да инсталирате 16 и по-нова. Да се инсталира ли версия 15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Поради бъг в microG инсталирането на Music версия 4.11 изисква първо да се инсталира версия 4.07.51 след това да влезете в профила си след което може да инсталирате 4.11 и по-нова. Да се инсталира ли версия 4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Моля, НЕ излизайте от приложението по време на този процес!</string>
|
|
||||||
<string name="welcome">Добре дошли</string>
|
<string name="welcome">Добре дошли</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Изберете предпочитани език(ци) за Vanced</string>
|
<string name="choose_preferred_language">Изберете предпочитан(и) език(ци) за Vanced</string>
|
||||||
<string name="install_latest">Най-нова</string>
|
<string name="install_latest">Най-нова</string>
|
||||||
<string name="light_plus_other">Светла + %1$s</string>
|
<string name="light_plus_other">Светла + %1$s</string>
|
||||||
<string name="select_at_least_one_lang">Изберете поне един език!</string>
|
<string name="select_at_least_one_lang">Изберете поне един език!</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Неуспешно`chown` APK към собственика на системата, моля опитайте отново.</string>
|
<string name="chown_fail">Неуспешно`chown` APK към собственика на системата, моля опитайте отново.</string>
|
||||||
<string name="error_downloading">Грешка при изтегляне на %1$s</string>
|
<string name="error_downloading">Грешка при изтегляне на %1$s</string>
|
||||||
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
|
|
||||||
<string name="failed_accent">Неуспешно задаване на акцентиращ цвят</string>
|
<string name="failed_accent">Неуспешно задаване на акцентиращ цвят</string>
|
||||||
|
<string name="failed_uninstall">Неуспешно деинсталиране на %1$s</string>
|
||||||
<string name="files_missing_va">Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак.</string>
|
<string name="files_missing_va">Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак.</string>
|
||||||
<string name="ifile_missing">Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново.</string>
|
<string name="ifile_missing">Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново.</string>
|
||||||
<string name="installation_aborted">Инсталацията е неуспешна, защото е прекратена от потребителя.</string>
|
<string name="installation_aborted">Инсталацията е неуспешна, защото е прекратена от потребителя.</string>
|
||||||
<string name="installation_blocked">Инсталацията е неуспешна, защото е блокирана от потребителя.</string>
|
|
||||||
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
|
|
||||||
<string name="installation_conflict">Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново.</string>
|
<string name="installation_conflict">Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново.</string>
|
||||||
|
<string name="installation_downgrade">Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново.</string>
|
||||||
<string name="installation_failed">Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени</string>
|
<string name="installation_failed">Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени</string>
|
||||||
<string name="installation_incompatible">Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново.</string>
|
<string name="installation_incompatible">Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново.</string>
|
||||||
<string name="installation_invalid">Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново.</string>
|
<string name="installation_invalid">Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново.</string>
|
||||||
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
|
|
||||||
<string name="installation_miui">Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново.</string>
|
<string name="installation_miui">Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново.</string>
|
||||||
|
<string name="installation_signature">Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново.</string>
|
||||||
<string name="installation_storage">Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място.</string>
|
<string name="installation_storage">Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място.</string>
|
||||||
<string name="modapk_missing">Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново.</string>
|
<string name="modapk_missing">Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново.</string>
|
||||||
<string name="path_missing">Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране.</string>
|
<string name="path_missing">Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">বাতিল করুন</string>
|
<string name="cancel">বাতিল করুন</string>
|
||||||
<string name="close">বন্ধ করুন</string>
|
<string name="close">বন্ধ করুন</string>
|
||||||
|
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
|
||||||
|
<string name="description_vanced">A modified YouTube client with many useful features!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
|
||||||
<string name="reset">পুনরায় স্থির করুন</string>
|
<string name="reset">পুনরায় স্থির করুন</string>
|
||||||
<string name="save">সংরক্ষণ করুন</string>
|
<string name="save">সংরক্ষণ করুন</string>
|
||||||
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
|
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">সম্বন্ধে</string>
|
<string name="title_about">সম্বন্ধে</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">Guide</string>
|
||||||
<string name="title_logs">Logs</string>
|
|
||||||
<string name="title_home">ম্যানেজার</string>
|
<string name="title_home">ম্যানেজার</string>
|
||||||
|
<string name="title_logs">Logs</string>
|
||||||
<string name="title_settings">সেটিংস</string>
|
<string name="title_settings">সেটিংস</string>
|
||||||
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
|
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">আপনার ডিভাইস কি রুটেড?</string>
|
<string name="are_you_rooted">আপনার ডিভাইস কি রুটেড?</string>
|
||||||
<string name="grant_root">রুটের অনুমতি দিন</string>
|
<string name="grant_root">রুটের অনুমতি দিন</string>
|
||||||
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
|
|
||||||
<string name="select_apps_music">ভ্যান্সড, তবে ইউটিউবের জন্য!\nতুলনামূলক কম ফিচার-বিশিষ্ট কিন্তু আপনার চাহিদা পূরণ করবে।</string>
|
|
||||||
<string name="select_apps_vanced">ইউটিউব ভ্যান্সড হল স্টক অ্যান্ড্রয়েড ইউটিউব অ্যাপ, তবে আরো ভাল!</string>
|
|
||||||
<string name="lets_get_started">চলুন শুরু করি</string>
|
<string name="lets_get_started">চলুন শুরু করি</string>
|
||||||
|
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
|
||||||
<string name="willing_to_use_root">এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন!</string>
|
<string name="willing_to_use_root">এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">সম্পর্কিত তথ্য %1$s</string>
|
<string name="about_app">সম্পর্কিত তথ্য %1$s</string>
|
||||||
<string name="app_changelog_tooltip">পরিবর্তন তালিকা দেখতে কার্ডে ট্যাপ করুন।</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Launch</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Uninstall</string>
|
||||||
|
<string name="accessibility_update">Update</string>
|
||||||
|
<string name="apps">Apps</string>
|
||||||
<string name="changelog">পরিবর্তন তালিকা</string>
|
<string name="changelog">পরিবর্তন তালিকা</string>
|
||||||
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
||||||
<string name="install">ইনস্টল করুন</string>
|
<string name="install">ইনস্টল করুন</string>
|
||||||
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
|
|
||||||
<string name="version_installed">ইনস্টল করা আছে:</string>
|
|
||||||
<string name="latest">সর্বশেষ:</string>
|
<string name="latest">সর্বশেষ:</string>
|
||||||
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string>
|
<string name="no_microg">Install Vanced microG first</string>
|
||||||
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
|
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
|
||||||
<string name="unavailable">অনুপলব্ধ</string>
|
|
||||||
<string name="update">আপডেট</string>
|
|
||||||
<string name="social_media">Social Media</string>
|
<string name="social_media">Social Media</string>
|
||||||
<string name="support_us">Support us</string>
|
<string name="support_us">Support us</string>
|
||||||
|
<string name="unavailable">অনুপলব্ধ</string>
|
||||||
|
<string name="version_installed">ইনস্টল করা আছে:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
|
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
|
||||||
<string name="category_appearance">চেহারা</string>
|
<string name="category_appearance">চেহারা</string>
|
||||||
<string name="category_behaviour">আচরণ</string>
|
<string name="category_behaviour">আচরণ</string>
|
||||||
<string name="clear_files">ডাউনলোড করা ফাইলগুলি সাফ করুন</string>
|
<string name="clear_files">ডাউনলোড করা ফাইলগুলি সাফ করুন</string>
|
||||||
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
|
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
|
||||||
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
|
|
||||||
<string name="firebase_summary">এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে।</string>
|
<string name="firebase_summary">এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে।</string>
|
||||||
|
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
|
||||||
<string name="language_title">ভাষা</string>
|
<string name="language_title">ভাষা</string>
|
||||||
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
|
|
||||||
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে</string>
|
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে</string>
|
||||||
<string name="system_default">সিস্টেম দ্বারা নির্ধারিত</string>
|
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
|
||||||
|
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তি</string>
|
||||||
|
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
|
||||||
<string name="script_save_failed">Failed to save new time value</string>
|
<string name="script_save_failed">Failed to save new time value</string>
|
||||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
||||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
||||||
|
<string name="system_default">সিস্টেম দ্বারা নির্ধারিত</string>
|
||||||
<string name="theme">থিম</string>
|
<string name="theme">থিম</string>
|
||||||
<string name="theme_dark">গাঢ় থিম</string>
|
<string name="theme_dark">গাঢ় থিম</string>
|
||||||
<string name="theme_light">হালকা থিম</string>
|
<string name="theme_light">হালকা থিম</string>
|
||||||
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তি</string>
|
|
||||||
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
|
|
||||||
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
|
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
|
||||||
<string name="update_not_found">কোনো নতুন আপডেট নেই</string>
|
<string name="update_not_found">কোনো নতুন আপডেট নেই</string>
|
||||||
<string name="variant">রকমফের</string>
|
<string name="variant">রকমফের</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Successfully saved logs</string>
|
|
||||||
<string name="logs_not_saved">Could not save logs</string>
|
<string name="logs_not_saved">Could not save logs</string>
|
||||||
|
<string name="logs_saved">Successfully saved logs</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">সূক্ষ্ম</string>
|
<string name="advanced">Details</string>
|
||||||
<string name="app_install_files_detected">%1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে!</string>
|
<string name="app_install_files_detected">%1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে!</string>
|
||||||
<string name="app_install_files_detected_summary">ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান?</string>
|
<string name="app_install_files_detected_summary">ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s Installation Preferences</string>
|
||||||
<string name="checking_updates">আপডেট আছে কিনা দেখা হচ্ছে…</string>
|
<string name="checking_updates">আপডেট আছে কিনা দেখা হচ্ছে…</string>
|
||||||
<string name="chosen_lang">ভাষা (গুলি):%1$s</string>
|
<string name="chosen_lang">ভাষা (গুলি):%1$s</string>
|
||||||
<string name="chosen_theme">থিম: %1$s</string>
|
<string name="chosen_theme">থিম: %1$s</string>
|
||||||
<string name="chosen_version">ভার্সন: %1$s</string>
|
<string name="chosen_version">ভার্সন: %1$s</string>
|
||||||
|
<string name="error">ত্রুটি</string>
|
||||||
<string name="guide">সহায়িকা</string>
|
<string name="guide">সহায়িকা</string>
|
||||||
<string name="hold_on">থামো!</string>
|
<string name="hold_on">থামো!</string>
|
||||||
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
||||||
<string name="error">ত্রুটি</string>
|
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
||||||
|
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
||||||
<string name="redownload">Redownload</string>
|
<string name="redownload">Redownload</string>
|
||||||
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
||||||
<string name="app_installation_preferences">%1$s Installation Preferences</string>
|
|
||||||
<string name="version">Version</string>
|
<string name="version">Version</string>
|
||||||
<string name="microg_bug">Bug in microG</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">স্বাগতম</string>
|
<string name="welcome">স্বাগতম</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string>
|
<string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
||||||
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
|
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
|
||||||
<string name="failed_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
|
|
||||||
<string name="failed_accent">Failed to apply new accent color</string>
|
<string name="failed_accent">Failed to apply new accent color</string>
|
||||||
|
<string name="failed_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
|
||||||
<string name="files_missing_va">সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন.</string>
|
<string name="files_missing_va">সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন.</string>
|
||||||
<string name="ifile_missing">স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
|
<string name="ifile_missing">স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
|
||||||
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
||||||
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
|
|
||||||
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
|
||||||
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
||||||
|
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
||||||
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
||||||
<string name="installation_invalid">অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
|
<string name="installation_invalid">অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
|
||||||
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
|
|
||||||
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
||||||
|
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
||||||
<string name="modapk_missing">ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
<string name="modapk_missing">ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
||||||
<string name="path_missing">ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ.</string>
|
<string name="path_missing">ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ.</string>
|
||||||
|
|
|
@ -3,117 +3,118 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">বাতিল করুন</string>
|
<string name="cancel">বাতিল করুন</string>
|
||||||
<string name="close">বন্ধ করুন</string>
|
<string name="close">বন্ধ করুন</string>
|
||||||
|
<string name="description_microg">মাইক্রোজি প্রকল্পের ভিত্তিতে ভ্যান্সডের জন্য একটি কাস্টম জিএমএস বাস্তবায়ন।.</string>
|
||||||
|
<string name="description_vanced">অনেক দরকারী বৈশিষ্ট্য সহ একটি পরিবর্তিত ইউটিউব ক্লায়েন্ট!</string>
|
||||||
|
<string name="description_vanced_music">ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য! তুলনামূলকভাবে কম বৈশিষ্ট্য সমৃদ্ধ তবে আপনার চাহিদা পূরণ করবে।.</string>
|
||||||
<string name="reset">পুনরায় স্থির করুন</string>
|
<string name="reset">পুনরায় স্থির করুন</string>
|
||||||
<string name="save">সংরক্ষণ করুন</string>
|
<string name="save">সংরক্ষণ করুন</string>
|
||||||
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
|
<string name="select_apps">আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">সম্বন্ধে</string>
|
<string name="title_about">সম্বন্ধে</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">গাইড</string>
|
||||||
<string name="title_logs">Logs</string>
|
|
||||||
<string name="title_home">ম্যানেজার</string>
|
<string name="title_home">ম্যানেজার</string>
|
||||||
|
<string name="title_logs">লগস</string>
|
||||||
<string name="title_settings">সেটিংস</string>
|
<string name="title_settings">সেটিংস</string>
|
||||||
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
|
<string name="update_manager">ম্যানেজার আপডেট করুন</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে?</string>
|
<string name="are_you_rooted">আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে?</string>
|
||||||
<string name="grant_root">রুট অনুমতি মঞ্জুর করুন</string>
|
<string name="grant_root">রুট অনুমতি মঞ্জুর করুন</string>
|
||||||
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
|
|
||||||
<string name="select_apps_music">ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য!\nতুলনামূলকভাবে কম বৈশিষ্ট্যযুক্ত, তবে আপনার চাহিদা পূরণ করবে।</string>
|
|
||||||
<string name="select_apps_vanced">ইউটিউব ভ্যান্সড হল স্টক অ্যান্ড্রয়েড ইউটিউব অ্যাপ, তবে আরো ভাল!</string>
|
|
||||||
<string name="lets_get_started">শুরু করা যাক</string>
|
<string name="lets_get_started">শুরু করা যাক</string>
|
||||||
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
|
<string name="select_at_least_one_app">অন্তত একটি অ্যাপ নির্বাচন করুন!</string>
|
||||||
|
<string name="willing_to_use_root">এটি কি তা জানেন না বা রুট ভার্সনটি ব্যবহার করতে চান না? কেবল নীচের নীল তীর চিহ্নটি ক্লিক করুন!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">%1$s এর সম্বন্ধে</string>
|
<string name="about_app">%1$s এর সম্বন্ধে</string>
|
||||||
<string name="app_changelog_tooltip">পরিবর্তন নথি দেখতে কার্ডে আলতো চাপুন।</string>
|
<string name="accessibility_download">ডাউনলোড</string>
|
||||||
|
<string name="accessibility_info">তথ্য</string>
|
||||||
|
<string name="accessibility_launch">লঞ্চ করুন</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">আনইনস্টল</string>
|
||||||
|
<string name="accessibility_update">আপডেট</string>
|
||||||
|
<string name="apps">অ্যাপস</string>
|
||||||
<string name="changelog">পরিবর্তন নথি</string>
|
<string name="changelog">পরিবর্তন নথি</string>
|
||||||
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
||||||
<string name="install">ইনস্টল করুন</string>
|
<string name="install">ইনস্টল করুন</string>
|
||||||
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
|
|
||||||
<string name="version_installed">ইনস্টল করা আছে:</string>
|
|
||||||
<string name="latest">সর্বশেষ:</string>
|
<string name="latest">সর্বশেষ:</string>
|
||||||
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string>
|
<string name="no_microg">প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন</string>
|
||||||
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
|
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
|
||||||
|
<string name="social_media">সোশ্যাল মিডিয়া</string>
|
||||||
|
<string name="support_us">আমাদের সমর্থন করুন</string>
|
||||||
<string name="unavailable">অনুপলব্ধ</string>
|
<string name="unavailable">অনুপলব্ধ</string>
|
||||||
<string name="update">আপডেট</string>
|
<string name="version_installed">ইনস্টল করা আছে:</string>
|
||||||
<string name="social_media">সামাজিক মাধ্যম</string>
|
|
||||||
<string name="support_us">আমাদের সমর্থন</string>
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
|
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
|
||||||
<string name="category_appearance">রূপ</string>
|
<string name="category_appearance">রূপ</string>
|
||||||
<string name="category_behaviour">আচরণ</string>
|
<string name="category_behaviour">আচরণ</string>
|
||||||
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
|
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
|
||||||
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
|
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
|
||||||
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
|
|
||||||
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
|
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
|
||||||
|
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
|
||||||
<string name="language_title">ভাষা</string>
|
<string name="language_title">ভাষা</string>
|
||||||
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
|
|
||||||
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে</string>
|
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে</string>
|
||||||
|
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
|
||||||
|
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তিগুলি</string>
|
||||||
|
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
|
||||||
|
<string name="script_save_failed">নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ হয়েছে</string>
|
||||||
|
<string name="script_sleep_timer">রুট স্ক্রিপ্ট স্লিপ টাইম</string>
|
||||||
|
<string name="script_sleep_timer_description">মাউন্টিং ইস্যু ফিক্স করার জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত স্লিপ টাইম মানটি অ্যাডজাস্ট করুন</string>
|
||||||
<string name="system_default">সিস্টেম দ্বারা র্নির্ধারিত</string>
|
<string name="system_default">সিস্টেম দ্বারা র্নির্ধারিত</string>
|
||||||
<string name="script_save_failed">নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ</string>
|
|
||||||
<string name="script_sleep_timer">রুট স্ক্রিপ্ট ঘুম সময়</string>
|
|
||||||
<string name="script_sleep_timer_description">মাউন্টিং ইস্যু সমাধানের জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত ঘুমের মানটি সামঞ্জস্য করুন</string>
|
|
||||||
<string name="theme">থিম</string>
|
<string name="theme">থিম</string>
|
||||||
<string name="theme_dark">গাঢ় থিম</string>
|
<string name="theme_dark">গাঢ় থিম</string>
|
||||||
<string name="theme_light">হালকা থিম</string>
|
<string name="theme_light">হালকা থিম</string>
|
||||||
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তিগুলি</string>
|
|
||||||
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান</string>
|
|
||||||
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
|
<string name="update_center">ম্যানেজার আপডেট কেন্দ্র</string>
|
||||||
<string name="update_not_found">কোনো নতুন আপডেট নেই</string>
|
<string name="update_not_found">কোনো নতুন আপডেট নেই</string>
|
||||||
<string name="variant">বিকল্প</string>
|
<string name="variant">বিকল্প</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Successfully saved logs</string>
|
<string name="logs_not_saved">লগগুলি সংরক্ষণ করা যায়নি</string>
|
||||||
<string name="logs_not_saved">Could not save logs</string>
|
<string name="logs_saved">সফলভাবে লগ সংরক্ষণ করা হয়েছে</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">উন্নত</string>
|
<string name="advanced">বিশদ</string>
|
||||||
<string name="app_install_files_detected">ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে!</string>
|
<string name="app_install_files_detected">ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে!</string>
|
||||||
<string name="app_install_files_detected_summary">%1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান?</string>
|
<string name="app_install_files_detected_summary">%1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s ইনস্টল করার পছন্দগুলি</string>
|
||||||
<string name="checking_updates">আপডেটের জন্য চেক করা হচ্ছে…</string>
|
<string name="checking_updates">আপডেটের জন্য চেক করা হচ্ছে…</string>
|
||||||
<string name="chosen_lang">ভাষা(গুলি): %1$s</string>
|
<string name="chosen_lang">ভাষা(গুলি): %1$s</string>
|
||||||
<string name="chosen_theme">থিম: %1$s</string>
|
<string name="chosen_theme">থিম: %1$s</string>
|
||||||
<string name="chosen_version">সংস্করণ: %1$s</string>
|
<string name="chosen_version">সংস্করণ: %1$s</string>
|
||||||
|
<string name="error">ত্রুটি</string>
|
||||||
<string name="guide">সহায়িকা</string>
|
<string name="guide">সহায়িকা</string>
|
||||||
<string name="hold_on">থামুন!</string>
|
<string name="hold_on">থামুন!</string>
|
||||||
<string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</string>
|
<string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
<string name="miui_one">ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন)</string>
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one_title">MIUI অপটিমাইজেশন সক্ষম করা আছে!</string>
|
||||||
<string name="error">ত্রুটি</string>
|
<string name="please_be_patient">এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না!</string>
|
||||||
<string name="redownload">পুনরায় ডাউনলোড করুন</string>
|
<string name="redownload">পুনরায় ডাউনলোড করুন</string>
|
||||||
<string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string>
|
<string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string>
|
||||||
<string name="app_installation_preferences">%1$s ইনস্টল করার পছন্দগুলি</string>
|
|
||||||
<string name="version">সংস্করণ</string>
|
<string name="version">সংস্করণ</string>
|
||||||
<string name="microg_bug">মাইক্রোজি মধ্যে বাগ</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">স্বাগত</string>
|
<string name="welcome">স্বাগত</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন</string>
|
<string name="choose_preferred_language">ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন</string>
|
||||||
<string name="install_latest">Latest</string>
|
<string name="install_latest">সর্বশেষ</string>
|
||||||
<string name="light_plus_other">হাল্কা + %1$s</string>
|
<string name="light_plus_other">হাল্কা + %1$s</string>
|
||||||
<string name="select_at_least_one_lang">অন্তত একটি ভাষা নির্বাচন করুন!</string>
|
<string name="select_at_least_one_lang">অন্তত একটি ভাষা নির্বাচন করুন!</string>
|
||||||
<string name="vanced_black">Black</string>
|
<string name="vanced_black">কালো</string>
|
||||||
<string name="vanced_dark">Dark</string>
|
<string name="vanced_dark">অন্ধকার</string>
|
||||||
<!-- About Page -->
|
<!-- About Page -->
|
||||||
<string name="manager_dev">ম্যানেজার বিকাশকারীরা</string>
|
<string name="manager_dev">ম্যানেজার বিকাশকারীরা</string>
|
||||||
<string name="other_contributors">Other Contributors</string>
|
<string name="other_contributors">অন্যান্য অবদানকারী</string>
|
||||||
<string name="sources">উৎসগুলি</string>
|
<string name="sources">উৎসগুলি</string>
|
||||||
<string name="vanced_team">ভ্যান্সড টীম</string>
|
<string name="vanced_team">ভ্যান্সড টীম</string>
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
|
<string name="chown_fail">System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
|
||||||
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
|
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
|
||||||
|
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ হয়েছে</string>
|
||||||
<string name="failed_uninstall">%1$s পেকেজ আনইনস্টল করা যাইনি</string>
|
<string name="failed_uninstall">%1$s পেকেজ আনইনস্টল করা যাইনি</string>
|
||||||
<string name="failed_accent">নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ</string>
|
|
||||||
<string name="files_missing_va">ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন।</string>
|
<string name="files_missing_va">ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="ifile_missing">স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
|
<string name="ifile_missing">স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_aborted">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন।</string>
|
<string name="installation_aborted">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন।</string>
|
||||||
<string name="installation_blocked">ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা অবরুদ্ধ করেছেন।</string>
|
<string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
<string name="installation_downgrade">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব রয়েছে ts অ্যাপ্লিকেশনটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।.</string>
|
<string name="installation_failed">অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
|
||||||
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string>
|
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string>
|
<string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
|
|
||||||
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
|
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
|
<string name="installation_storage">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা নেই।</string>
|
||||||
<string name="modapk_missing">ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।</string>
|
<string name="modapk_missing">ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।</string>
|
||||||
<string name="path_missing">স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ।</string>
|
<string name="path_missing">স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ।</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -1,89 +1,91 @@
|
||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">Cancel</string>
|
<string name="cancel">Cancel·lar</string>
|
||||||
<string name="close">Tanca</string>
|
<string name="close">Tanca</string>
|
||||||
|
<string name="description_microg">Implementació modificada de GMS per a Cancer basada en el Projecte microG.</string>
|
||||||
|
<string name="description_vanced">Una aplicació modificada de YouTube amb moltes característiques útils!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, però per a YouTube Music! Amb relativament menys característiques, però que assoleix les vostres necessitats.</string>
|
||||||
<string name="reset">Restableix</string>
|
<string name="reset">Restableix</string>
|
||||||
<string name="save">Desa</string>
|
<string name="save">Desa</string>
|
||||||
<string name="select_apps">Select Your Apps</string>
|
<string name="select_apps">Seleccioneu les aplicacions</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Quant a</string>
|
<string name="title_about">Quant a</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">Guia</string>
|
||||||
<string name="title_logs">Logs</string>
|
|
||||||
<string name="title_home">Gestor</string>
|
<string name="title_home">Gestor</string>
|
||||||
|
<string name="title_logs">Registre</string>
|
||||||
<string name="title_settings">Configuració</string>
|
<string name="title_settings">Configuració</string>
|
||||||
<string name="update_manager">Update Manager</string>
|
<string name="update_manager">Gestionador d\'actualitzacions</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Is Your Device Rooted?</string>
|
<string name="are_you_rooted">Té el vostre dispositiu accés de Superusuari (\'Root\')?</string>
|
||||||
<string name="grant_root">Grant Root Permission</string>
|
<string name="grant_root">Concedir permís de Superusuari (\'Root\')</string>
|
||||||
<string name="select_at_least_one_app">Select at least one app!</string>
|
<string name="lets_get_started">Comencem-hi</string>
|
||||||
<string name="select_apps_music">Vanced, but for YouTube Music!\nrelatively less feature-rich but fulfills your needs.</string>
|
<string name="select_at_least_one_app">Selecciona com a mínim una aplicació!</string>
|
||||||
<string name="select_apps_vanced">YouTube Vanced is the stock Android YouTube App, but better!</string>
|
<string name="willing_to_use_root">No saps què és o no vols utilitzar la versió de Superusuari (\'Root\')? Simplement clica la fletxa blava de sota!</string>
|
||||||
<string name="lets_get_started">Let\'s get started</string>
|
|
||||||
<string name="willing_to_use_root">Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below!</string>
|
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">About %1$s</string>
|
<string name="about_app">Sobre %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Tap on the card to see the changelog.</string>
|
<string name="accessibility_download">Descarrega</string>
|
||||||
<string name="changelog">Changelog</string>
|
<string name="accessibility_info">Informació</string>
|
||||||
|
<string name="accessibility_launch">Llança</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Desinstal·la</string>
|
||||||
|
<string name="accessibility_update">Actualitza</string>
|
||||||
|
<string name="apps">Aplicacions</string>
|
||||||
|
<string name="changelog">Registre de canvis</string>
|
||||||
<string name="downloading_file">Descarregant %1$s</string>
|
<string name="downloading_file">Descarregant %1$s</string>
|
||||||
<string name="install">Instal·lar</string>
|
<string name="install">Instal·lar</string>
|
||||||
<string name="button_reinstall">Reinstal·la</string>
|
|
||||||
<string name="version_installed">Instal·lat:</string>
|
|
||||||
<string name="latest">Darrera:</string>
|
<string name="latest">Darrera:</string>
|
||||||
<string name="no_microg">microG no està instal·lat</string>
|
<string name="no_microg">Instal·la primer Vanced microG</string>
|
||||||
<string name="root_not_granted">L\'accés arrel no s\'ha concedit</string>
|
<string name="root_not_granted">L\'accés arrel no s\'ha concedit</string>
|
||||||
|
<string name="social_media">Xarxes socials</string>
|
||||||
|
<string name="support_us">Dóna\'ns suport</string>
|
||||||
<string name="unavailable">No disponible</string>
|
<string name="unavailable">No disponible</string>
|
||||||
<string name="update">Actualitza</string>
|
<string name="version_installed">Instal·lat:</string>
|
||||||
<string name="social_media">Social Media</string>
|
|
||||||
<string name="support_us">Support us</string>
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Color d\'èmfasi</string>
|
<string name="accent_color">Color d\'èmfasi</string>
|
||||||
<string name="category_appearance">Appearance</string>
|
<string name="category_appearance">Aparença</string>
|
||||||
<string name="category_behaviour">Behavior</string>
|
<string name="category_behaviour">Comportament</string>
|
||||||
<string name="clear_files">Esborrar fitxers descarregats</string>
|
<string name="clear_files">Esborrar fitxers descarregats</string>
|
||||||
<string name="cleared_files">Fitxers netejats correctament</string>
|
<string name="cleared_files">Fitxers netejats correctament</string>
|
||||||
<string name="firebase_title">Firebase Analytics</string>
|
<string name="firebase_summary">Permet-te\'ns recollir informació sobre el rendiment de l\'aplicació i els registres d\'error</string>
|
||||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
<string name="firebase_title">Estadístiques de Firebase</string>
|
||||||
<string name="language_title">Language</string>
|
<string name="language_title">Llengua</string>
|
||||||
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</string>
|
|
||||||
<string name="link_custom_tabs">Els enllaços s\'obriran en pestanyes personalitzades del Chrome</string>
|
<string name="link_custom_tabs">Els enllaços s\'obriran en pestanyes personalitzades del Chrome</string>
|
||||||
<string name="system_default">System Default</string>
|
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</string>
|
||||||
<string name="script_save_failed">Failed to save new time value</string>
|
<string name="push_notifications">%1$s notificacions automàtiques</string>
|
||||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
<string name="push_notifications_summary">Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s</string>
|
||||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
<string name="script_save_failed">Error a l\'hora de guardar un nou valor de temps</string>
|
||||||
|
<string name="script_sleep_timer">Temps de repòs de la seqüència de comandes de Superusuari (\'Root\')</string>
|
||||||
|
<string name="script_sleep_timer_description">Ajusta el temps de repòs emprat a l\'script /data/adb/service.d/app.sh, útil per solventar problemes de muntatge</string>
|
||||||
|
<string name="system_default">Per defecte del sistema</string>
|
||||||
<string name="theme">Tema</string>
|
<string name="theme">Tema</string>
|
||||||
<string name="theme_dark">Tema fosc</string>
|
<string name="theme_dark">Tema fosc</string>
|
||||||
<string name="theme_light">Tema clar</string>
|
<string name="theme_light">Tema clar</string>
|
||||||
<string name="push_notifications">%1$s notificacions automàtiques</string>
|
|
||||||
<string name="push_notifications_summary">Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s</string>
|
|
||||||
<string name="update_center">Gestor d\'actualitzacions</string>
|
<string name="update_center">Gestor d\'actualitzacions</string>
|
||||||
<string name="update_not_found">Cap actualització</string>
|
<string name="update_not_found">Cap actualització</string>
|
||||||
<string name="variant">Variant</string>
|
<string name="variant">Variant</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Successfully saved logs</string>
|
<string name="logs_not_saved">No s\'han pogut desar els registres</string>
|
||||||
<string name="logs_not_saved">Could not save logs</string>
|
<string name="logs_saved">Registres desats satisfactòriament</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Advanced</string>
|
<string name="advanced">Detalls</string>
|
||||||
<string name="app_install_files_detected">%1$s installation files detected!</string>
|
<string name="app_install_files_detected">Arxius d\'instal·lació de %1$s detectats!</string>
|
||||||
<string name="app_install_files_detected_summary">Manager detected that all necessary files for %1$s installation were found. Do you want to install it?</string>
|
<string name="app_install_files_detected_summary">El gestionador ha trobat tots els arxius necessaris per a l\'instal·lació de %1$s. Voleu instalar-ho?</string>
|
||||||
<string name="checking_updates">Checking for updates…</string>
|
<string name="app_installation_preferences">Preferències d\'instal·lació de %1$s</string>
|
||||||
<string name="chosen_lang">Idioma: %1$s</string>
|
<string name="checking_updates">Cercant actualitzacions…</string>
|
||||||
|
<string name="chosen_lang">Llengua(es): %1$s</string>
|
||||||
<string name="chosen_theme">Tema: %1$s</string>
|
<string name="chosen_theme">Tema: %1$s</string>
|
||||||
<string name="chosen_version">Version: %1$s</string>
|
<string name="chosen_version">Versió: %1$s</string>
|
||||||
<string name="guide">Guia</string>
|
|
||||||
<string name="hold_on">Atura!</string>
|
|
||||||
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
|
||||||
<string name="error">Error</string>
|
<string name="error">Error</string>
|
||||||
|
<string name="guide">Guia</string>
|
||||||
|
<string name="hold_on">Atura\'t!</string>
|
||||||
|
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller.</string>
|
||||||
|
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
||||||
|
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
||||||
|
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
||||||
<string name="redownload">Redownload</string>
|
<string name="redownload">Redownload</string>
|
||||||
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
<string name="security_context">Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub</string>
|
||||||
<string name="app_installation_preferences">%1$s Installation Preferences</string>
|
|
||||||
<string name="version">Version</string>
|
<string name="version">Version</string>
|
||||||
<string name="microg_bug">Bug in microG</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">Benvingut</string>
|
<string name="welcome">Benvingut</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string>
|
<string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
<string name="chown_fail">Failed to `chown` APK to system owner, please try again.</string>
|
||||||
<string name="error_downloading">Error en descarregar %1$s</string>
|
<string name="error_downloading">Error en descarregar %1$s</string>
|
||||||
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
|
|
||||||
<string name="failed_accent">Failed to apply new accent color</string>
|
<string name="failed_accent">Failed to apply new accent color</string>
|
||||||
|
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
|
||||||
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
|
<string name="files_missing_va">Failed to locate the required files for installation. Re-download the installation files, then try again.</string>
|
||||||
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
|
<string name="ifile_missing">Failed to locate apk file for black/dark theme from storage, please try again.</string>
|
||||||
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
<string name="installation_aborted">Installation failed because the user aborted the installation.</string>
|
||||||
<string name="installation_blocked">Installation failed because the user blocked the installation.</string>
|
|
||||||
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
|
||||||
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again.</string>
|
||||||
|
<string name="installation_downgrade">Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
||||||
<string name="installation_incompatible">La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar.</string>
|
<string name="installation_incompatible">La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar.</string>
|
||||||
<string name="installation_invalid">La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar.</string>
|
<string name="installation_invalid">La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar.</string>
|
||||||
<string name="installation_signature">La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar.</string>
|
|
||||||
<string name="installation_miui">La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar.</string>
|
<string name="installation_miui">La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar.</string>
|
||||||
|
<string name="installation_signature">La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
||||||
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
|
<string name="modapk_missing">Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again.</string>
|
||||||
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>
|
<string name="path_missing">Failed to locate the stock YouTube installation path after split installation.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">هەڵوەشاندنەوە</string>
|
<string name="cancel">هەڵوەشاندنەوە</string>
|
||||||
<string name="close">داخستن</string>
|
<string name="close">داخستن</string>
|
||||||
|
<string name="description_microg">A custom GMS Implementation for Vanced based on the microG Project.</string>
|
||||||
|
<string name="description_vanced">A modified YouTube client with many useful features!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs.</string>
|
||||||
<string name="reset">ڕێکخستنەوە</string>
|
<string name="reset">ڕێکخستنەوە</string>
|
||||||
<string name="save">پاراستن</string>
|
<string name="save">پاراستن</string>
|
||||||
<string name="select_apps">بەرنامەکانت دیاریبکە</string>
|
<string name="select_apps">بەرنامەکانت دیاریبکە</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">دەربارە</string>
|
<string name="title_about">دەربارە</string>
|
||||||
<string name="title_guide">زانیاری</string>
|
<string name="title_guide">زانیاری</string>
|
||||||
<string name="title_logs">تۆماری نوێکاری</string>
|
|
||||||
<string name="title_home">بەرێوەبردن</string>
|
<string name="title_home">بەرێوەبردن</string>
|
||||||
|
<string name="title_logs">تۆماری نوێکاری</string>
|
||||||
<string name="title_settings">ڕێکخستنەکان</string>
|
<string name="title_settings">ڕێکخستنەکان</string>
|
||||||
<string name="update_manager">نوێکردنەوەی بەرنامە</string>
|
<string name="update_manager">نوێکردنەوەی بەرنامە</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">مۆبایلەکەت ڕۆت کراوە؟</string>
|
<string name="are_you_rooted">مۆبایلەکەت ڕۆت کراوە؟</string>
|
||||||
<string name="grant_root">ڕێگەپێدانی ڕۆت Root</string>
|
<string name="grant_root">ڕێگەپێدانی ڕۆت Root</string>
|
||||||
<string name="select_at_least_one_app">لانیکەم دانەیەک دیاریبکە!</string>
|
|
||||||
<string name="select_apps_music">Vanced، بەڵام بۆ یوتوب میوزیک!\nتایبەتمەندی کەمتر بەڵام پڕتر لە پێویستیەکانت.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced هەمان بەرنامەی یوتوبە بەڵام بەشێوەکی باشتر!</string>
|
|
||||||
<string name="lets_get_started">دەست پێکردن</string>
|
<string name="lets_get_started">دەست پێکردن</string>
|
||||||
|
<string name="select_at_least_one_app">لانیکەم دانەیەک دیاریبکە!</string>
|
||||||
<string name="willing_to_use_root">ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا!</string>
|
<string name="willing_to_use_root">ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">دەربارەی %1$s</string>
|
<string name="about_app">دەربارەی %1$s</string>
|
||||||
<string name="app_changelog_tooltip">پەنجەی پێدابنێ بۆ بینینی گۆڕانکارییەکان.</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Launch</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Uninstall</string>
|
||||||
|
<string name="accessibility_update">Update</string>
|
||||||
|
<string name="apps">بەرنامەکان</string>
|
||||||
<string name="changelog">گۆڕانکارییەکان</string>
|
<string name="changelog">گۆڕانکارییەکان</string>
|
||||||
<string name="downloading_file">داگرتنی %1$s</string>
|
<string name="downloading_file">داگرتنی %1$s</string>
|
||||||
<string name="install">دامەزراندن</string>
|
<string name="install">دامەزراندن</string>
|
||||||
<string name="button_reinstall">دامەزراندنەوە</string>
|
|
||||||
<string name="version_installed">دامەزرێنراو:</string>
|
|
||||||
<string name="latest">دوایین:</string>
|
<string name="latest">دوایین:</string>
|
||||||
<string name="no_microg">دانەبەزێنراوە microG</string>
|
<string name="no_microg">Install Vanced microG first</string>
|
||||||
<string name="root_not_granted">ڕێگەپێدانی Root نەدراوە</string>
|
<string name="root_not_granted">ڕێگەپێدانی Root نەدراوە</string>
|
||||||
<string name="unavailable">بەردەست نیە</string>
|
|
||||||
<string name="update">نوێکردنەوە</string>
|
|
||||||
<string name="social_media">تۆڕە کۆمەڵایەتییەکان</string>
|
<string name="social_media">تۆڕە کۆمەڵایەتییەکان</string>
|
||||||
<string name="support_us">پشتگیریکردن</string>
|
<string name="support_us">پشتگیریکردن</string>
|
||||||
|
<string name="unavailable">بەردەست نیە</string>
|
||||||
|
<string name="version_installed">دامەزرێنراو:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">ڕەنگی سەرەکی</string>
|
<string name="accent_color">ڕەنگی سەرەکی</string>
|
||||||
<string name="category_appearance">ڕووکار</string>
|
<string name="category_appearance">ڕووکار</string>
|
||||||
<string name="category_behaviour">ڕێکخستن</string>
|
<string name="category_behaviour">ڕێکخستن</string>
|
||||||
<string name="clear_files">سڕینەوەی فایلە داگیراوەکان</string>
|
<string name="clear_files">سڕینەوەی فایلە داگیراوەکان</string>
|
||||||
<string name="cleared_files">فایلەکان بەسەرکەتوویی سڕانەوە</string>
|
<string name="cleared_files">فایلەکان بەسەرکەتوویی سڕانەوە</string>
|
||||||
<string name="firebase_title">Firebase شیکردنەوەی</string>
|
|
||||||
<string name="firebase_summary">کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا </string>
|
<string name="firebase_summary">کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا </string>
|
||||||
|
<string name="firebase_title">Firebase شیکردنەوەی</string>
|
||||||
<string name="language_title">زمان</string>
|
<string name="language_title">زمان</string>
|
||||||
<string name="link_title">بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم</string>
|
|
||||||
<string name="link_custom_tabs">بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە</string>
|
<string name="link_custom_tabs">بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە</string>
|
||||||
<string name="system_default">سیستەم</string>
|
<string name="link_title">بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم</string>
|
||||||
|
<string name="push_notifications">%1$s وەرگرتنی ئاگادارکردنەوەکان</string>
|
||||||
|
<string name="push_notifications_summary">وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا</string>
|
||||||
<string name="script_save_failed">پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو</string>
|
<string name="script_save_failed">پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو</string>
|
||||||
<string name="script_sleep_timer">Root Script Sleep Time</string>
|
<string name="script_sleep_timer">ماوەی وەستاندنی سکریپتی Root</string>
|
||||||
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
<string name="script_sleep_timer_description">Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues</string>
|
||||||
|
<string name="system_default">سیستەم</string>
|
||||||
<string name="theme">ڕووکار</string>
|
<string name="theme">ڕووکار</string>
|
||||||
<string name="theme_dark">تاریک</string>
|
<string name="theme_dark">تاریک</string>
|
||||||
<string name="theme_light">ڕووناک</string>
|
<string name="theme_light">ڕووناک</string>
|
||||||
<string name="push_notifications">%1$s وەرگرتنی ئاگادارکردنەوەکان</string>
|
|
||||||
<string name="push_notifications_summary">وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا</string>
|
|
||||||
<string name="update_center">ناوەندی نوێکردنەوە</string>
|
<string name="update_center">ناوەندی نوێکردنەوە</string>
|
||||||
<string name="update_not_found">هیچ نوێکردنەوەیەک نیە</string>
|
<string name="update_not_found">هیچ نوێکردنەوەیەک نیە</string>
|
||||||
<string name="variant">جۆر</string>
|
<string name="variant">جۆر</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Successfully saved logs</string>
|
<string name="logs_not_saved">نەتوانرا تۆمارەکە بپارێزرێت</string>
|
||||||
<string name="logs_not_saved">Could not save logs</string>
|
<string name="logs_saved">تۆمارەکە بەسەرکەوتوویی پارێزرا</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">پێشکەوتوو</string>
|
<string name="advanced">Details</string>
|
||||||
<string name="app_install_files_detected">%1$s فایل دۆزرایەوە بۆ دابەزاندن!</string>
|
<string name="app_install_files_detected">%1$s فایل دۆزرایەوە بۆ دابەزاندن!</string>
|
||||||
<string name="app_install_files_detected_summary">بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟</string>
|
<string name="app_install_files_detected_summary">بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟</string>
|
||||||
|
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</string>
|
||||||
<string name="checking_updates">پشکنین بۆ نوێکردنەوە…</string>
|
<string name="checking_updates">پشکنین بۆ نوێکردنەوە…</string>
|
||||||
<string name="chosen_lang">زمان: %1$s</string>
|
<string name="chosen_lang">زمان: %1$s</string>
|
||||||
<string name="chosen_theme">ڕووکار: %1$s</string>
|
<string name="chosen_theme">ڕووکار: %1$s</string>
|
||||||
<string name="chosen_version">وەشان: %1$s</string>
|
<string name="chosen_version">وەشان: %1$s</string>
|
||||||
|
<string name="error">هەڵەیەک ڕوویدا</string>
|
||||||
<string name="guide">زانیاری</string>
|
<string name="guide">زانیاری</string>
|
||||||
<string name="hold_on">وەستاندن!</string>
|
<string name="hold_on">وەستاندن!</string>
|
||||||
<string name="magisk_vanced">تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced.</string>
|
<string name="magisk_vanced">تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced.</string>
|
||||||
<string name="miui_one_title">MIUI Optimizations are enabled!</string>
|
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
||||||
<string name="error">هەڵەیەک ڕوویدا</string>
|
<string name="miui_one_title">باشترکردنی MIUI چالاککراوە!</string>
|
||||||
|
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
||||||
<string name="redownload">داگرتنەوە</string>
|
<string name="redownload">داگرتنەوە</string>
|
||||||
<string name="security_context">دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە</string>
|
<string name="security_context">دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە</string>
|
||||||
<string name="app_installation_preferences">%1$s ڕێکخستنەکانی دامەزراندن</string>
|
|
||||||
<string name="version">وەشان</string>
|
<string name="version">وەشان</string>
|
||||||
<string name="microg_bug">Bug in microG</string>
|
|
||||||
<string name="microg_bug_summary">Due to a bug in the original microG, installing Vanced v16+ first requires you to install v15.43.32, open it, then login and only then can you install v16 and higher. Do you want to proceed with the installation of v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Due to a bug in the original microG, installing Music v4.11+ first requires you to install v4.07.51, open it, then login and only then can you install v4.11 and higher. Do you want to proceed with the installation of v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Please do NOT exit the app during this process!</string>
|
|
||||||
<string name="welcome">بەخێربێیت</string>
|
<string name="welcome">بەخێربێیت</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە</string>
|
<string name="choose_preferred_language">زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە</string>
|
||||||
|
@ -94,25 +96,24 @@
|
||||||
<string name="vanced_dark">تاریک</string>
|
<string name="vanced_dark">تاریک</string>
|
||||||
<!-- About Page -->
|
<!-- About Page -->
|
||||||
<string name="manager_dev">کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید)</string>
|
<string name="manager_dev">کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید)</string>
|
||||||
<string name="other_contributors">Other Contributors</string>
|
<string name="other_contributors">وەرگێڕانی کوردی - گۆران غەریب </string>
|
||||||
<string name="sources">سەرچاوەکان</string>
|
<string name="sources">سەرچاوەکان</string>
|
||||||
<string name="vanced_team">Vanced تیمی</string>
|
<string name="vanced_team">Vanced تیمی</string>
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە.</string>
|
<string name="chown_fail">سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="error_downloading">کێشە ڕوویدا لە داگرتنی %1$s</string>
|
<string name="error_downloading">کێشە ڕوویدا لە داگرتنی %1$s</string>
|
||||||
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
|
|
||||||
<string name="failed_accent">گۆڕینی ڕەنگ سەرکەوتو نەبوو</string>
|
<string name="failed_accent">گۆڕینی ڕەنگ سەرکەوتو نەبوو</string>
|
||||||
|
<string name="failed_uninstall">سڕینەوەی %1$s سەرکەوتو نەبوو</string>
|
||||||
<string name="files_missing_va">سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە.</string>
|
<string name="files_missing_va">سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="ifile_missing">سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە.</string>
|
<string name="ifile_missing">سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="installation_aborted">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە.</string>
|
<string name="installation_aborted">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە.</string>
|
||||||
<string name="installation_blocked">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر ڕێگریکرد لە دابەزاندنەکە.</string>
|
|
||||||
<string name="installation_downgrade">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە.</string>
|
|
||||||
<string name="installation_conflict">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
<string name="installation_conflict">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
||||||
|
<string name="installation_downgrade">دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu</string>
|
||||||
<string name="installation_incompatible">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
<string name="installation_incompatible">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="installation_invalid">دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە.</string>
|
<string name="installation_invalid">دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە.</string>
|
||||||
<string name="installation_signature">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
|
||||||
<string name="installation_miui">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە.</string>
|
<string name="installation_miui">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە.</string>
|
||||||
|
<string name="installation_signature">دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
<string name="installation_storage">Installation failed because the device doesn\'t have enough free space.</string>
|
||||||
<string name="modapk_missing">سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە.</string>
|
<string name="modapk_missing">سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە.</string>
|
||||||
<string name="path_missing">سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان.</string>
|
<string name="path_missing">سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">Zrušit</string>
|
<string name="cancel">Zrušit</string>
|
||||||
<string name="close">Zavřít</string>
|
<string name="close">Zavřít</string>
|
||||||
|
<string name="description_microg">Vlastní implementace GMS pro Vanced založená na projektu microG.</string>
|
||||||
|
<string name="description_vanced">Upravený klient YouTube se spoustou užitečných funkcí!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, ale YouTube Music! Obsahuje o trochu méně funkcí, ale splní vaše potřeby.</string>
|
||||||
<string name="reset">Resetovat</string>
|
<string name="reset">Resetovat</string>
|
||||||
<string name="save">Uložit</string>
|
<string name="save">Uložit</string>
|
||||||
<string name="select_apps">Vyberte své aplikace</string>
|
<string name="select_apps">Vyberte své aplikace</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">O aplikaci</string>
|
<string name="title_about">O aplikaci</string>
|
||||||
<string name="title_guide">Průvodce</string>
|
<string name="title_guide">Průvodce</string>
|
||||||
<string name="title_logs">Záznamy</string>
|
|
||||||
<string name="title_home">Manager</string>
|
<string name="title_home">Manager</string>
|
||||||
|
<string name="title_logs">Záznamy</string>
|
||||||
<string name="title_settings">Nastavení</string>
|
<string name="title_settings">Nastavení</string>
|
||||||
<string name="update_manager">Aktualizovat Manager</string>
|
<string name="update_manager">Aktualizovat Manager</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Má vaše zařízení oprávnění root?</string>
|
<string name="are_you_rooted">Má vaše zařízení oprávnění root?</string>
|
||||||
<string name="grant_root">Udělit oprávnění root</string>
|
<string name="grant_root">Udělit oprávnění root</string>
|
||||||
<string name="select_at_least_one_app">Vyberte alespoň jednu aplikaci!</string>
|
|
||||||
<string name="select_apps_music">Vanced, ale YouTube Music!\nObsahuje o trochu méně funkcí, ale splní vaše potřeby.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced je vylepšená výchozí aplikace YouTube!</string>
|
|
||||||
<string name="lets_get_started">Začínáme</string>
|
<string name="lets_get_started">Začínáme</string>
|
||||||
|
<string name="select_at_least_one_app">Vyberte alespoň jednu aplikaci!</string>
|
||||||
<string name="willing_to_use_root">Nevíte, co to je, nebo nechcete používat verzi s přístupem root? V tom případě klikněte na modrou šipku níže!</string>
|
<string name="willing_to_use_root">Nevíte, co to je, nebo nechcete používat verzi s přístupem root? V tom případě klikněte na modrou šipku níže!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">O aplikaci %1$s</string>
|
<string name="about_app">O aplikaci %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Klepnutím na kartu zobrazíte seznam změn.</string>
|
<string name="accessibility_download">Stáhnout</string>
|
||||||
|
<string name="accessibility_info">Informace</string>
|
||||||
|
<string name="accessibility_launch">Spustit</string>
|
||||||
|
<string name="accessibility_reinstall">Přeinstalovat</string>
|
||||||
|
<string name="accessibility_uninstall">Odinstalovat</string>
|
||||||
|
<string name="accessibility_update">Aktualizovat</string>
|
||||||
|
<string name="apps">Aplikace</string>
|
||||||
<string name="changelog">Seznam změn</string>
|
<string name="changelog">Seznam změn</string>
|
||||||
<string name="downloading_file">Stahování %1$s</string>
|
<string name="downloading_file">Stahování %1$s</string>
|
||||||
<string name="install">Nainstalovat</string>
|
<string name="install">Nainstalovat</string>
|
||||||
<string name="button_reinstall">Přeinstalovat</string>
|
|
||||||
<string name="version_installed">Nainstalováno:</string>
|
|
||||||
<string name="latest">Nejnovější:</string>
|
<string name="latest">Nejnovější:</string>
|
||||||
<string name="no_microg">microG není nainstalováno</string>
|
<string name="no_microg">Nejprve nainstalujte Vanced microG</string>
|
||||||
<string name="root_not_granted">Root přístup nebyl udělen</string>
|
<string name="root_not_granted">Root přístup nebyl udělen</string>
|
||||||
<string name="unavailable">Není k dispozici</string>
|
|
||||||
<string name="update">Aktualizovat</string>
|
|
||||||
<string name="social_media">Sociální média</string>
|
<string name="social_media">Sociální média</string>
|
||||||
<string name="support_us">Podpořte nás</string>
|
<string name="support_us">Podpořte nás</string>
|
||||||
|
<string name="unavailable">Není k dispozici</string>
|
||||||
|
<string name="version_installed">Nainstalováno:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Doplňková barva</string>
|
<string name="accent_color">Doplňková barva</string>
|
||||||
<string name="category_appearance">Vzhled</string>
|
<string name="category_appearance">Vzhled</string>
|
||||||
<string name="category_behaviour">Chování</string>
|
<string name="category_behaviour">Chování</string>
|
||||||
<string name="clear_files">Vymazat stažené soubory</string>
|
<string name="clear_files">Vymazat stažené soubory</string>
|
||||||
<string name="cleared_files">Vymazání souborů proběhlo úspěšně</string>
|
<string name="cleared_files">Vymazání souborů proběhlo úspěšně</string>
|
||||||
<string name="firebase_title">Firebase analytika</string>
|
|
||||||
<string name="firebase_summary">Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání</string>
|
<string name="firebase_summary">Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání</string>
|
||||||
|
<string name="firebase_title">Firebase analytika</string>
|
||||||
<string name="language_title">Jazyk</string>
|
<string name="language_title">Jazyk</string>
|
||||||
<string name="link_title">Používat vlastní karty prohlížeče Chrome</string>
|
|
||||||
<string name="link_custom_tabs">Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome</string>
|
<string name="link_custom_tabs">Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome</string>
|
||||||
<string name="system_default">Výchozí systémové nastavení</string>
|
<string name="link_title">Používat vlastní karty prohlížeče Chrome</string>
|
||||||
|
<string name="push_notifications">%1$s vyskakovací oznámení</string>
|
||||||
|
<string name="push_notifications_summary">Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení</string>
|
||||||
<string name="script_save_failed">Nepodařilo se uložit novou hodnotu času</string>
|
<string name="script_save_failed">Nepodařilo se uložit novou hodnotu času</string>
|
||||||
<string name="script_sleep_timer">Doba nečinnosti kořenového skriptu</string>
|
<string name="script_sleep_timer">Doba nečinnosti kořenového skriptu</string>
|
||||||
<string name="script_sleep_timer_description">Upravte hodnotu doby nečinnosti použitou ve skriptu /data/adb/service.d/app.sh, která je užitečná pro opravu problémů s připojením</string>
|
<string name="script_sleep_timer_description">Upravte hodnotu doby nečinnosti použitou ve skriptu /data/adb/service.d/app.sh, která je užitečná pro opravu problémů s připojením</string>
|
||||||
|
<string name="system_default">Výchozí systémové nastavení</string>
|
||||||
<string name="theme">Motiv</string>
|
<string name="theme">Motiv</string>
|
||||||
<string name="theme_dark">Tmavý motiv</string>
|
<string name="theme_dark">Tmavý motiv</string>
|
||||||
<string name="theme_light">Světlý motiv</string>
|
<string name="theme_light">Světlý motiv</string>
|
||||||
<string name="push_notifications">%1$s vyskakovací oznámení</string>
|
|
||||||
<string name="push_notifications_summary">Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení</string>
|
|
||||||
<string name="update_center">Centrum aktualizací aplikace Manager</string>
|
<string name="update_center">Centrum aktualizací aplikace Manager</string>
|
||||||
<string name="update_not_found">Žádné nové aktualizace</string>
|
<string name="update_not_found">Žádné nové aktualizace</string>
|
||||||
<string name="variant">Varianta</string>
|
<string name="variant">Varianta</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Záznamy byly úspěšně uloženy</string>
|
|
||||||
<string name="logs_not_saved">Záznamy nelze uložit</string>
|
<string name="logs_not_saved">Záznamy nelze uložit</string>
|
||||||
|
<string name="logs_saved">Záznamy byly úspěšně uloženy</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Pokročilé</string>
|
<string name="advanced">Podrobnosti</string>
|
||||||
<string name="app_install_files_detected">Počet zjištěných instalačních souborů: %1$s</string>
|
<string name="app_install_files_detected">Počet zjištěných instalačních souborů: %1$s</string>
|
||||||
<string name="app_install_files_detected_summary">Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat?</string>
|
<string name="app_install_files_detected_summary">Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat?</string>
|
||||||
|
<string name="app_installation_preferences">Předvolby instalace: %1$s</string>
|
||||||
<string name="checking_updates">Kontrola aktualizací…</string>
|
<string name="checking_updates">Kontrola aktualizací…</string>
|
||||||
<string name="chosen_lang">Jazyk(y): %1$s</string>
|
<string name="chosen_lang">Jazyk(y): %1$s</string>
|
||||||
<string name="chosen_theme">Motiv: %1$s</string>
|
<string name="chosen_theme">Motiv: %1$s</string>
|
||||||
<string name="chosen_version">Verze: %1$s</string>
|
<string name="chosen_version">Verze: %1$s</string>
|
||||||
|
<string name="error">Chyba</string>
|
||||||
<string name="guide">Průvodce</string>
|
<string name="guide">Průvodce</string>
|
||||||
<string name="hold_on">Zadržte!</string>
|
<string name="hold_on">Zadržte!</string>
|
||||||
<string name="magisk_vanced">Používáte verzi Vanced pro Magisk/TWRP, jejíž vývoj byl ukončen a kterou nelze pomocí této aplikace aktualizovat. Odstraňte ji prosím odebráním modulu Magisk použitím Vanced odinstalátoru v TWRP.</string>
|
<string name="magisk_vanced">Používáte verzi Vanced pro Magisk/TWRP, jejíž vývoj byl ukončen a kterou nelze pomocí této aplikace aktualizovat. Odstraňte ji prosím odebráním modulu Magisk použitím Vanced odinstalátoru v TWRP.</string>
|
||||||
<string name="miui_one_title">Optimalizace MIUI jsou zapnuty!</string>
|
|
||||||
<string name="miui_one">Chcete‑li nainstalovat Vanced, MUSÍTE vypnout optimalizace MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM ze 20. 2. 2020 nebo novější založenou na xiaomi.eu)</string>
|
<string name="miui_one">Chcete‑li nainstalovat Vanced, MUSÍTE vypnout optimalizace MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM ze 20. 2. 2020 nebo novější založenou na xiaomi.eu)</string>
|
||||||
<string name="error">Chyba</string>
|
<string name="miui_one_title">Optimalizace MIUI jsou zapnuty!</string>
|
||||||
|
<string name="please_be_patient">Během tohoto procesu NEUKONČUJTE aplikaci!</string>
|
||||||
<string name="redownload">Stáhnout znovu</string>
|
<string name="redownload">Stáhnout znovu</string>
|
||||||
<string name="security_context">Ujistěte se, že jste si aplikaci stáhli z našeho webu vancedapp.com, z našeho Vanced Discord serveru nebo z našeho GitHubu</string>
|
<string name="security_context">Ujistěte se, že jste si aplikaci stáhli z našeho webu vancedapp.com, z našeho Vanced Discord serveru nebo z našeho GitHubu</string>
|
||||||
<string name="app_installation_preferences">Předvolby instalace: %1$s</string>
|
|
||||||
<string name="version">Verze</string>
|
<string name="version">Verze</string>
|
||||||
<string name="microg_bug">Chyba v microG</string>
|
|
||||||
<string name="microg_bug_summary">Kvůli chybě v původním microG, vyžaduje instalace Vanced v16+ nejprve instalaci verze 15.43.32. Otevřete ji, poté se přihlaste ke svému účtu a teprve poté nainstalujte verzi 16 a vyšší. Přejete si pokračovat v instalaci verze 15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">Kvůli chybě v původním microG, vyžaduje instalace Music v4.11+ nejprve instalaci verze 4.07.51. Otevřete ji, poté se přihlaste ke svému účtu a teprve poté nainstalujte verzi 4.11 a vyšší. Přejete si pokračovat v instalaci verze 4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Během tohoto procesu NEUKONČUJTE aplikaci!</string>
|
|
||||||
<string name="welcome">Vítejte</string>
|
<string name="welcome">Vítejte</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Vyberte si jeden nebo více preferovaných jazyků pro Vanced</string>
|
<string name="choose_preferred_language">Vyberte si jeden nebo více preferovaných jazyků pro Vanced</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu.</string>
|
<string name="chown_fail">Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu.</string>
|
||||||
<string name="error_downloading">Chyba při stahování %1$s</string>
|
<string name="error_downloading">Chyba při stahování %1$s</string>
|
||||||
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
|
|
||||||
<string name="failed_accent">Nepodařilo se nastavit novou doplňkovou barvu</string>
|
<string name="failed_accent">Nepodařilo se nastavit novou doplňkovou barvu</string>
|
||||||
|
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
|
||||||
<string name="files_missing_va">Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu.</string>
|
<string name="files_missing_va">Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu.</string>
|
||||||
<string name="ifile_missing">Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu.</string>
|
<string name="ifile_missing">Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu.</string>
|
||||||
<string name="installation_aborted">Instalace se nezdařila, protože uživatel přerušil instalaci.</string>
|
<string name="installation_aborted">Instalace se nezdařila, protože uživatel přerušil instalaci.</string>
|
||||||
<string name="installation_blocked">Instalace se nezdařila, protože uživatel zablokoval instalaci.</string>
|
|
||||||
<string name="installation_downgrade">Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu.</string>
|
|
||||||
<string name="installation_conflict">Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu.</string>
|
<string name="installation_conflict">Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu.</string>
|
||||||
|
<string name="installation_downgrade">Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu.</string>
|
||||||
<string name="installation_failed">Instalace se z neznámých důvodů nezdařila. Pro další podporu se připojte k našemu Telegramu nebo Discordu. Připojte také snímek obrazovky z nabídky Pokročilé</string>
|
<string name="installation_failed">Instalace se z neznámých důvodů nezdařila. Pro další podporu se připojte k našemu Telegramu nebo Discordu. Připojte také snímek obrazovky z nabídky Pokročilé</string>
|
||||||
<string name="installation_incompatible">Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte v Nastavení stažené soubory a poté to zkuste znovu.</string>
|
<string name="installation_incompatible">Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte v Nastavení stažené soubory a poté to zkuste znovu.</string>
|
||||||
<string name="installation_invalid">Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu.</string>
|
<string name="installation_invalid">Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu.</string>
|
||||||
<string name="installation_signature">Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu.</string>
|
|
||||||
<string name="installation_miui">Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu.</string>
|
<string name="installation_miui">Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu.</string>
|
||||||
|
<string name="installation_signature">Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu.</string>
|
||||||
<string name="installation_storage">Instalace se nezdařila, protože v zařízení není dostatek volného místa.</string>
|
<string name="installation_storage">Instalace se nezdařila, protože v zařízení není dostatek volného místa.</string>
|
||||||
<string name="modapk_missing">Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu.</string>
|
<string name="modapk_missing">Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu.</string>
|
||||||
<string name="path_missing">Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci.</string>
|
<string name="path_missing">Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">Annuller</string>
|
<string name="cancel">Annuller</string>
|
||||||
<string name="close">Luk</string>
|
<string name="close">Luk</string>
|
||||||
|
<string name="description_microg">En brugerdefineret GMS implementering for Vanced baseret på microG Project.</string>
|
||||||
|
<string name="description_vanced">En modificeret YouTube klient med mange nyttige funktioner!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, men for YouTube Music! Relativt mindre funktionsrig men opfylder dine behov.</string>
|
||||||
<string name="reset">Nulstil</string>
|
<string name="reset">Nulstil</string>
|
||||||
<string name="save">Gem</string>
|
<string name="save">Gem</string>
|
||||||
<string name="select_apps">Vælg Dine Apps</string>
|
<string name="select_apps">Vælg Dine Apps</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Om</string>
|
<string name="title_about">Om</string>
|
||||||
<string name="title_guide">Guide</string>
|
<string name="title_guide">Guide</string>
|
||||||
<string name="title_logs">Logfiler</string>
|
|
||||||
<string name="title_home">Manager</string>
|
<string name="title_home">Manager</string>
|
||||||
|
<string name="title_logs">Logfiler</string>
|
||||||
<string name="title_settings">Indstillinger</string>
|
<string name="title_settings">Indstillinger</string>
|
||||||
<string name="update_manager">Opdaterings Manager</string>
|
<string name="update_manager">Opdaterings Manager</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Er Din Enhed Rooted?</string>
|
<string name="are_you_rooted">Er Din Enhed Rooted?</string>
|
||||||
<string name="grant_root">Tildel Root Tilladelse</string>
|
<string name="grant_root">Tildel Root Tilladelse</string>
|
||||||
<string name="select_at_least_one_app">Vælg mindst én app!</string>
|
|
||||||
<string name="select_apps_music">Vanced, men for YouTube Music!\nrelativt mindre funktionsrig men opfylder dine behov.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced er standard YouTube App, men bedre!</string>
|
|
||||||
<string name="lets_get_started">Lad os komme igang</string>
|
<string name="lets_get_started">Lad os komme igang</string>
|
||||||
|
<string name="select_at_least_one_app">Vælg mindst én app!</string>
|
||||||
<string name="willing_to_use_root">Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor!</string>
|
<string name="willing_to_use_root">Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">Om %1$s</string>
|
<string name="about_app">Om %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Tryk på kortet for at se ændringsloggen.</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Launch</string>
|
||||||
|
<string name="accessibility_reinstall">Reinstall</string>
|
||||||
|
<string name="accessibility_uninstall">Uninstall</string>
|
||||||
|
<string name="accessibility_update">Update</string>
|
||||||
|
<string name="apps">Apps</string>
|
||||||
<string name="changelog">Ændringslog</string>
|
<string name="changelog">Ændringslog</string>
|
||||||
<string name="downloading_file">Downloader %1$s</string>
|
<string name="downloading_file">Downloader %1$s</string>
|
||||||
<string name="install">Installer</string>
|
<string name="install">Installer</string>
|
||||||
<string name="button_reinstall">Geninstaller</string>
|
|
||||||
<string name="version_installed">Installeret:</string>
|
|
||||||
<string name="latest">Seneste:</string>
|
<string name="latest">Seneste:</string>
|
||||||
<string name="no_microg">microG er ikke installeret</string>
|
<string name="no_microg">Installer først Vanced microG</string>
|
||||||
<string name="root_not_granted">Root adgang ikke tildelt</string>
|
<string name="root_not_granted">Root adgang ikke tildelt</string>
|
||||||
<string name="unavailable">Utilgængelig</string>
|
|
||||||
<string name="update">Opdater</string>
|
|
||||||
<string name="social_media">Sociale medier</string>
|
<string name="social_media">Sociale medier</string>
|
||||||
<string name="support_us">Støt os</string>
|
<string name="support_us">Støt os</string>
|
||||||
|
<string name="unavailable">Utilgængelig</string>
|
||||||
|
<string name="version_installed">Installeret:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Sekundær farve</string>
|
<string name="accent_color">Sekundær farve</string>
|
||||||
<string name="category_appearance">Udseende</string>
|
<string name="category_appearance">Udseende</string>
|
||||||
<string name="category_behaviour">Adfærd</string>
|
<string name="category_behaviour">Adfærd</string>
|
||||||
<string name="clear_files">Ryd hentede filer</string>
|
<string name="clear_files">Ryd hentede filer</string>
|
||||||
<string name="cleared_files">Filer ryddet succesfuldt</string>
|
<string name="cleared_files">Filer ryddet succesfuldt</string>
|
||||||
<string name="firebase_title">Firebase analyse</string>
|
|
||||||
<string name="firebase_summary">Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs</string>
|
<string name="firebase_summary">Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs</string>
|
||||||
|
<string name="firebase_title">Firebase analyse</string>
|
||||||
<string name="language_title">Sprog</string>
|
<string name="language_title">Sprog</string>
|
||||||
<string name="link_title">Brug Chrome Custom Faner</string>
|
|
||||||
<string name="link_custom_tabs">Links vil åbne i Chrome Custom Faner</string>
|
<string name="link_custom_tabs">Links vil åbne i Chrome Custom Faner</string>
|
||||||
<string name="system_default">System Standard</string>
|
<string name="link_title">Brug Chrome Custom Faner</string>
|
||||||
|
<string name="push_notifications">%1$s Push Notifikationer</string>
|
||||||
|
<string name="push_notifications_summary">Modtag push meddelelser når der er en ny opdatering til %1$s</string>
|
||||||
<string name="script_save_failed">Kunne ikke gemme ny tidsværdi</string>
|
<string name="script_save_failed">Kunne ikke gemme ny tidsværdi</string>
|
||||||
<string name="script_sleep_timer">Root script dvale tid</string>
|
<string name="script_sleep_timer">Root script dvale tid</string>
|
||||||
<string name="script_sleep_timer_description">Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer</string>
|
<string name="script_sleep_timer_description">Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer</string>
|
||||||
|
<string name="system_default">System Standard</string>
|
||||||
<string name="theme">Tema</string>
|
<string name="theme">Tema</string>
|
||||||
<string name="theme_dark">Mørkt tema</string>
|
<string name="theme_dark">Mørkt tema</string>
|
||||||
<string name="theme_light">Lyst tema</string>
|
<string name="theme_light">Lyst tema</string>
|
||||||
<string name="push_notifications">%1$s Push Notifikationer</string>
|
|
||||||
<string name="push_notifications_summary">Modtag push meddelelser når der er en ny opdatering til %1$s</string>
|
|
||||||
<string name="update_center">Manager opdaterings center</string>
|
<string name="update_center">Manager opdaterings center</string>
|
||||||
<string name="update_not_found">Ingen nye opdateringer</string>
|
<string name="update_not_found">Ingen nye opdateringer</string>
|
||||||
<string name="variant">Variant</string>
|
<string name="variant">Variant</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Logfiler gemt succesfuldt</string>
|
|
||||||
<string name="logs_not_saved">Kunne ikke gemme logfil</string>
|
<string name="logs_not_saved">Kunne ikke gemme logfil</string>
|
||||||
|
<string name="logs_saved">Logfiler gemt succesfuldt</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Avanceret</string>
|
<string name="advanced">Detaljer</string>
|
||||||
<string name="app_install_files_detected">%1$s installationsfiler fundet!</string>
|
<string name="app_install_files_detected">%1$s installationsfiler fundet!</string>
|
||||||
<string name="app_install_files_detected_summary">Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den?</string>
|
<string name="app_install_files_detected_summary">Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s Installationsindstillinger</string>
|
||||||
<string name="checking_updates">Søger efter opdateringer…</string>
|
<string name="checking_updates">Søger efter opdateringer…</string>
|
||||||
<string name="chosen_lang">Sprog:%1$s</string>
|
<string name="chosen_lang">Sprog:%1$s</string>
|
||||||
<string name="chosen_theme">Tema: %1$s</string>
|
<string name="chosen_theme">Tema: %1$s</string>
|
||||||
<string name="chosen_version">Version: %1$s</string>
|
<string name="chosen_version">Version: %1$s</string>
|
||||||
|
<string name="error">Fejl</string>
|
||||||
<string name="guide">Vejledning</string>
|
<string name="guide">Vejledning</string>
|
||||||
<string name="hold_on">Stop!</string>
|
<string name="hold_on">Stop!</string>
|
||||||
<string name="magisk_vanced">Det ser ud som om du bruger Magisk/TWRP versionen af Vanced. Den er ikke længere understøttet og kan derfor ikke opdateres igennem denne app. Vær venlig at fjerne magisk modulet/brug TWRP Vanced uninstaller.</string>
|
<string name="magisk_vanced">Det ser ud som om du bruger Magisk/TWRP versionen af Vanced. Den er ikke længere understøttet og kan derfor ikke opdateres igennem denne app. Vær venlig at fjerne magisk modulet/brug TWRP Vanced uninstaller.</string>
|
||||||
|
<string name="miui_one">For at installere Vanced er du NØDT til at slå MIUI optimering fra i udvikler indstillingerne. (Du kan ignorere denne advarsel hvis du bruger en 20.2.20 eller nyere xiaomi.eu baseret ROM)</string>
|
||||||
<string name="miui_one_title">MIUI Optimering er aktiveret!</string>
|
<string name="miui_one_title">MIUI Optimering er aktiveret!</string>
|
||||||
<string name="miui_one">To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
<string name="please_be_patient">Afslut venligst IKKE appen under denne proces!</string>
|
||||||
<string name="error">Fejl</string>
|
|
||||||
<string name="redownload">Hent igen</string>
|
<string name="redownload">Hent igen</string>
|
||||||
<string name="security_context">Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden</string>
|
<string name="security_context">Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden</string>
|
||||||
<string name="app_installation_preferences">%1$s Installationsindstillinger</string>
|
|
||||||
<string name="version">Version</string>
|
<string name="version">Version</string>
|
||||||
<string name="microg_bug">Fejl i microG</string>
|
|
||||||
<string name="microg_bug_summary">På grund af en fejl i microG, kræver installationen af Vanced 16+ først at du installerer v15.43.32, åbner, logger ind og først derefter kan du installere v16 og over. Vil du fortsætte med at installere v15.43.32?</string>
|
|
||||||
<string name="microg_bug_summary_music">På grund af en fejl i microG, kræver installationen af Music v4.11+ først at du installerer v4.07.51, åbner, logger ind og først derefter kan du installere v4.11 og over. Vil du at fortsætte med at installere v4.07.51?</string>
|
|
||||||
<string name="please_be_patient">Afslut venligst IKKE appen under denne proces!</string>
|
|
||||||
<string name="welcome">Velkommen</string>
|
<string name="welcome">Velkommen</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string>
|
<string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Kunne ikke vælge Apk til systemejer, Prøv igen.</string>
|
<string name="chown_fail">Kunne ikke vælge Apk til systemejer, Prøv igen.</string>
|
||||||
<string name="error_downloading">Fejl i download af %1$s</string>
|
<string name="error_downloading">Fejl i download af %1$s</string>
|
||||||
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
|
|
||||||
<string name="failed_accent">Kunne ikke anvende ny accentfarve</string>
|
<string name="failed_accent">Kunne ikke anvende ny accentfarve</string>
|
||||||
|
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
|
||||||
<string name="files_missing_va">Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen.</string>
|
<string name="files_missing_va">Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen.</string>
|
||||||
<string name="ifile_missing">Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen.</string>
|
<string name="ifile_missing">Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen.</string>
|
||||||
<string name="installation_aborted">Installationen fejlede fordi brugeren lukkede installationen.</string>
|
<string name="installation_aborted">Installationen fejlede fordi brugeren lukkede installationen.</string>
|
||||||
<string name="installation_blocked">Installationen fejlede fordi brugeren blokerede installationen.</string>
|
|
||||||
<string name="installation_downgrade">Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen.</string>
|
|
||||||
<string name="installation_conflict">Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen.</string>
|
<string name="installation_conflict">Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen.</string>
|
||||||
|
<string name="installation_downgrade">Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen.</string>
|
||||||
<string name="installation_failed">Installation mislykkedes af ukendte årsager, kom på vores Telegram eller Discord for yderligere hjælp. Vedhæft venligst også et skærmbillede fra menuen Avanceret</string>
|
<string name="installation_failed">Installation mislykkedes af ukendte årsager, kom på vores Telegram eller Discord for yderligere hjælp. Vedhæft venligst også et skærmbillede fra menuen Avanceret</string>
|
||||||
<string name="installation_incompatible">Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen.</string>
|
<string name="installation_incompatible">Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen.</string>
|
||||||
<string name="installation_invalid">Installationen fejlede fordi apk filerne er beskadiget, prøv igen.</string>
|
<string name="installation_invalid">Installationen fejlede fordi apk filerne er beskadiget, prøv igen.</string>
|
||||||
<string name="installation_signature">Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen.</string>
|
|
||||||
<string name="installation_miui">Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen.</string>
|
<string name="installation_miui">Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen.</string>
|
||||||
|
<string name="installation_signature">Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen.</string>
|
||||||
<string name="installation_storage">Installationen mislykkedes, fordi enheden ikke har nok ledig plads.</string>
|
<string name="installation_storage">Installationen mislykkedes, fordi enheden ikke har nok ledig plads.</string>
|
||||||
<string name="modapk_missing">Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen.</string>
|
<string name="modapk_missing">Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen.</string>
|
||||||
<string name="path_missing">Kunne ikke finde lageret YouTube-installationsstien efter split installation.</string>
|
<string name="path_missing">Kunne ikke finde lageret YouTube-installationsstien efter split installation.</string>
|
||||||
|
|
|
@ -3,87 +3,89 @@
|
||||||
<!-- Global Strings -->
|
<!-- Global Strings -->
|
||||||
<string name="cancel">Abbrechen</string>
|
<string name="cancel">Abbrechen</string>
|
||||||
<string name="close">Schließen</string>
|
<string name="close">Schließen</string>
|
||||||
|
<string name="description_microg">Eine eigene GMD-Implementation für Vanced, basierend auf dem MicroG-Projekt.</string>
|
||||||
|
<string name="description_vanced">Ein modifizierter YouTube-Client mit vielen nützlichen Funktionen!</string>
|
||||||
|
<string name="description_vanced_music">Vanced, aber für YouTube Music! Weniger Funktionen, stillt aber deine Bedürfnisse.</string>
|
||||||
<string name="reset">Zurücksetzen</string>
|
<string name="reset">Zurücksetzen</string>
|
||||||
<string name="save">Speichern</string>
|
<string name="save">Speichern</string>
|
||||||
<string name="select_apps">Wähle deine Apps</string>
|
<string name="select_apps">Wähle deine Apps</string>
|
||||||
<!-- Main Activity -->
|
<!-- Main Activity -->
|
||||||
<string name="title_about">Über</string>
|
<string name="title_about">Über</string>
|
||||||
<string name="title_guide">Anleitung</string>
|
<string name="title_guide">Anleitung</string>
|
||||||
<string name="title_logs">Protokolle</string>
|
|
||||||
<string name="title_home">Manager</string>
|
<string name="title_home">Manager</string>
|
||||||
|
<string name="title_logs">Protokolle</string>
|
||||||
<string name="title_settings">Einstellungen</string>
|
<string name="title_settings">Einstellungen</string>
|
||||||
<string name="update_manager">Update Manager</string>
|
<string name="update_manager">Update Manager</string>
|
||||||
<!-- Welcome Page -->
|
<!-- Welcome Page -->
|
||||||
<string name="are_you_rooted">Ist dein Gerät gerootet?</string>
|
<string name="are_you_rooted">Ist dein Gerät gerootet?</string>
|
||||||
<string name="grant_root">Root-Berechtigung erteilen</string>
|
<string name="grant_root">Root-Berechtigung erteilen</string>
|
||||||
<string name="select_at_least_one_app">Wähle mindestens eine App!</string>
|
|
||||||
<string name="select_apps_music">Vanced, aber für YouTube Music!\nWeniger funktionsreich, aber erfüllt dennoch deine Bedürfnisse.</string>
|
|
||||||
<string name="select_apps_vanced">YouTube Vanced ist die Standard-Android-YouTube-App, aber besser!</string>
|
|
||||||
<string name="lets_get_started">Los geht\'s</string>
|
<string name="lets_get_started">Los geht\'s</string>
|
||||||
|
<string name="select_at_least_one_app">Wähle mindestens eine App!</string>
|
||||||
<string name="willing_to_use_root">Du weißt nicht was das ist, oder willst die Root-Version nicht benutzen? klicke einfach den blauen Pfeil unten an!</string>
|
<string name="willing_to_use_root">Du weißt nicht was das ist, oder willst die Root-Version nicht benutzen? klicke einfach den blauen Pfeil unten an!</string>
|
||||||
<!-- Home Page -->
|
<!-- Home Page -->
|
||||||
<string name="about_app">Über %1$s</string>
|
<string name="about_app">Über %1$s</string>
|
||||||
<string name="app_changelog_tooltip">Tippe auf die Karte, um den Changelog zu sehen.</string>
|
<string name="accessibility_download">Download</string>
|
||||||
|
<string name="accessibility_info">Info</string>
|
||||||
|
<string name="accessibility_launch">Starten</string>
|
||||||
|
<string name="accessibility_reinstall">Neu installieren</string>
|
||||||
|
<string name="accessibility_uninstall">Deinstallieren</string>
|
||||||
|
<string name="accessibility_update">Aktualisieren</string>
|
||||||
|
<string name="apps">Anwendungen</string>
|
||||||
<string name="changelog">Änderungen</string>
|
<string name="changelog">Änderungen</string>
|
||||||
<string name="downloading_file">%1$s wird heruntergeladen</string>
|
<string name="downloading_file">%1$s wird heruntergeladen</string>
|
||||||
<string name="install">Installieren</string>
|
<string name="install">Installieren</string>
|
||||||
<string name="button_reinstall">Neu installieren</string>
|
|
||||||
<string name="version_installed">Installiert:</string>
|
|
||||||
<string name="latest">Neueste:</string>
|
<string name="latest">Neueste:</string>
|
||||||
<string name="no_microg">microG ist nicht installiert</string>
|
<string name="no_microg">Installiere zuerst Vanced MicroG</string>
|
||||||
<string name="root_not_granted">Root-Zugriff nicht erteilt</string>
|
<string name="root_not_granted">Root-Zugriff nicht erteilt</string>
|
||||||
<string name="unavailable">Nicht verfügbar</string>
|
|
||||||
<string name="update">Aktualisieren</string>
|
|
||||||
<string name="social_media">Soziale Medien</string>
|
<string name="social_media">Soziale Medien</string>
|
||||||
<string name="support_us">Unterstütze uns</string>
|
<string name="support_us">Unterstütze uns</string>
|
||||||
|
<string name="unavailable">Nicht verfügbar</string>
|
||||||
|
<string name="version_installed">Installiert:</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="accent_color">Akzentfarbe</string>
|
<string name="accent_color">Akzentfarbe</string>
|
||||||
<string name="category_appearance">Darstellung</string>
|
<string name="category_appearance">Darstellung</string>
|
||||||
<string name="category_behaviour">Verhalten</string>
|
<string name="category_behaviour">Verhalten</string>
|
||||||
<string name="clear_files">Heruntergeladene Dateien löschen</string>
|
<string name="clear_files">Heruntergeladene Dateien löschen</string>
|
||||||
<string name="cleared_files">Daten erfolgreich gelöscht</string>
|
<string name="cleared_files">Daten erfolgreich gelöscht</string>
|
||||||
<string name="firebase_title">Firebase-Analyse</string>
|
|
||||||
<string name="firebase_summary">Dadurch können wir Informationen über die Performance der App und Absturzprotokolle sammeln</string>
|
<string name="firebase_summary">Dadurch können wir Informationen über die Performance der App und Absturzprotokolle sammeln</string>
|
||||||
|
<string name="firebase_title">Firebase-Analyse</string>
|
||||||
<string name="language_title">Sprache</string>
|
<string name="language_title">Sprache</string>
|
||||||
<string name="link_title">Verwende Chrome Custom Tabs</string>
|
|
||||||
<string name="link_custom_tabs">Links werden in Chrome Custom Tabs geöffnet</string>
|
<string name="link_custom_tabs">Links werden in Chrome Custom Tabs geöffnet</string>
|
||||||
<string name="system_default">Systemstandard</string>
|
<string name="link_title">Verwende Chrome Custom Tabs</string>
|
||||||
|
<string name="push_notifications">%1$s Push-Benachrichtigungen</string>
|
||||||
|
<string name="push_notifications_summary">Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird</string>
|
||||||
<string name="script_save_failed">Speichern des neuen Zeitwertes fehlgeschlagen</string>
|
<string name="script_save_failed">Speichern des neuen Zeitwertes fehlgeschlagen</string>
|
||||||
<string name="script_sleep_timer">Wartezeit des Root-Skriptes</string>
|
<string name="script_sleep_timer">Wartezeit des Root-Skriptes</string>
|
||||||
<string name="script_sleep_timer_description">Anpassen des Wertes für die Ruhezeit, der im Skript /data/adb/service.d/app.sh verwendet wird, nützlich zur Behebung von Problemen beim Einbinden</string>
|
<string name="script_sleep_timer_description">Anpassen des Wertes für die Ruhezeit, der im Skript /data/adb/service.d/app.sh verwendet wird, nützlich zur Behebung von Problemen beim Einbinden</string>
|
||||||
|
<string name="system_default">Systemstandard</string>
|
||||||
<string name="theme">Theme</string>
|
<string name="theme">Theme</string>
|
||||||
<string name="theme_dark">Dunkles Theme</string>
|
<string name="theme_dark">Dunkles Theme</string>
|
||||||
<string name="theme_light">Helles Theme</string>
|
<string name="theme_light">Helles Theme</string>
|
||||||
<string name="push_notifications">%1$s Push-Benachrichtigungen</string>
|
|
||||||
<string name="push_notifications_summary">Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird</string>
|
|
||||||
<string name="update_center">Update Center</string>
|
<string name="update_center">Update Center</string>
|
||||||
<string name="update_not_found">Keine neuen Updates</string>
|
<string name="update_not_found">Keine neuen Updates</string>
|
||||||
<string name="variant">Variante</string>
|
<string name="variant">Variante</string>
|
||||||
<!-- Logs -->
|
<!-- Logs -->
|
||||||
<string name="logs_saved">Protokolle erfolgreich gespeichert</string>
|
|
||||||
<string name="logs_not_saved">Protokolle konnten nicht gespeichert werden</string>
|
<string name="logs_not_saved">Protokolle konnten nicht gespeichert werden</string>
|
||||||
|
<string name="logs_saved">Protokolle erfolgreich gespeichert</string>
|
||||||
<!-- Dialogs -->
|
<!-- Dialogs -->
|
||||||
<string name="advanced">Erweitert</string>
|
<string name="advanced">Details</string>
|
||||||
<string name="app_install_files_detected">%1$s Installationsdateien erkannt!</string>
|
<string name="app_install_files_detected">%1$s Installationsdateien erkannt!</string>
|
||||||
<string name="app_install_files_detected_summary">Manager hat festgestellt, dass alle notwendigen Dateien für die Installation von %1$s gefunden wurden. Möchtest Du sie installieren?</string>
|
<string name="app_install_files_detected_summary">Manager hat festgestellt, dass alle notwendigen Dateien für die Installation von %1$s gefunden wurden. Möchtest Du sie installieren?</string>
|
||||||
|
<string name="app_installation_preferences">%1$s Installationsoptionen</string>
|
||||||
<string name="checking_updates">Suche nach Updates…</string>
|
<string name="checking_updates">Suche nach Updates…</string>
|
||||||
<string name="chosen_lang">Sprache(n): %1$s</string>
|
<string name="chosen_lang">Sprache(n): %1$s</string>
|
||||||
<string name="chosen_theme">Theme: %1$s</string>
|
<string name="chosen_theme">Theme: %1$s</string>
|
||||||
<string name="chosen_version">Version: %1$s</string>
|
<string name="chosen_version">Version: %1$s</string>
|
||||||
|
<string name="error">Fehler</string>
|
||||||
<string name="guide">Erklärung</string>
|
<string name="guide">Erklärung</string>
|
||||||
<string name="hold_on">Stopp!</string>
|
<string name="hold_on">Stopp!</string>
|
||||||
<string name="magisk_vanced">Du benutzt die Magisk/TWRP-Version von Vanced, die nicht mehr unterstützt wird und mit dieser App nicht aktualisiert werden kann. Bitte entferne siie indem du das Magisk-Modul mit dem TWRP Vanced Uninstaller entfernst.</string>
|
<string name="magisk_vanced">Du benutzt die Magisk/TWRP-Version von Vanced, die nicht mehr unterstützt wird und mit dieser App nicht aktualisiert werden kann. Bitte entferne siie indem du das Magisk-Modul mit dem TWRP Vanced Uninstaller entfernst.</string>
|
||||||
<string name="miui_one_title">MIUI Optimierungen sind aktiviert!</string>
|
|
||||||
<string name="miui_one">Um Vanced installieren zu können, MÜSSEN Sie MIUI Optimierungen in den Entwickleroptionen deaktivieren. (Bitte ignorieren Sie diese Warnung, wenn Sie xiaomi.eu Roms mit der Version 20.2.20 oder höher verwenden.)</string>
|
<string name="miui_one">Um Vanced installieren zu können, MÜSSEN Sie MIUI Optimierungen in den Entwickleroptionen deaktivieren. (Bitte ignorieren Sie diese Warnung, wenn Sie xiaomi.eu Roms mit der Version 20.2.20 oder höher verwenden.)</string>
|
||||||
<string name="error">Fehler</string>
|
<string name="miui_one_title">MIUI Optimierungen sind aktiviert!</string>
|
||||||
|
<string name="please_be_patient">Bitte schließen Sie die App NICHT während dieses Prozesses!</string>
|
||||||
<string name="redownload">Erneut herunterladen</string>
|
<string name="redownload">Erneut herunterladen</string>
|
||||||
<string name="security_context">Stelle sicher, dass du die App von vancedapp.com, dem Vanced Discord Server oder dem Vanced GitHub heruntergeladen hast</string>
|
<string name="security_context">Stelle sicher, dass du die App von vancedapp.com, dem Vanced Discord Server oder dem Vanced GitHub heruntergeladen hast</string>
|
||||||
<string name="app_installation_preferences">%1$s Installationsoptionen</string>
|
|
||||||
<string name="version">Version</string>
|
<string name="version">Version</string>
|
||||||
<string name="microg_bug">Fehler in MicroG</string>
|
|
||||||
<string name="microg_bug_summary">Aufgrund eines Fehlers in MicroG ist es erforderlich, zuerst die Version v15.43.32 zu installieren, öffnen und sich anzumelden, um Vanced v16 und höher zu verwenden. Möchten Sie mit der Installation von v15.43.32 fortfahren?</string>
|
|
||||||
<string name="microg_bug_summary_music">Aufgrund eines Fehlers in MicroG, ist es erforderlich zuerst die Version v4.07.51 zu installieren, öffnen und sich anzumelden, um Vanced Music v4.11+ zu verwenden. Möchten Sie mit der Installation von v4.07.51 fortfahren?</string>
|
|
||||||
<string name="please_be_patient">Bitte schließen Sie die App NICHT während dieses Prozesses!</string>
|
|
||||||
<string name="welcome">Willkommen</string>
|
<string name="welcome">Willkommen</string>
|
||||||
<!-- Install Page -->
|
<!-- Install Page -->
|
||||||
<string name="choose_preferred_language">Wählen Sie ihre bevorzugte Sprache(n) für Vanced</string>
|
<string name="choose_preferred_language">Wählen Sie ihre bevorzugte Sprache(n) für Vanced</string>
|
||||||
|
@ -100,19 +102,18 @@
|
||||||
<!-- Error messages -->
|
<!-- Error messages -->
|
||||||
<string name="chown_fail">Fehler beim `chown` der APK zum Systembesitzer, bitte versuche es erneut.</string>
|
<string name="chown_fail">Fehler beim `chown` der APK zum Systembesitzer, bitte versuche es erneut.</string>
|
||||||
<string name="error_downloading">Download von %1$s fehlgeschlagen</string>
|
<string name="error_downloading">Download von %1$s fehlgeschlagen</string>
|
||||||
<string name="failed_uninstall">Entfernen von %1$s fehlgeschlagen</string>
|
|
||||||
<string name="failed_accent">Neue Akzentfarbe konnte nicht angewendet werden</string>
|
<string name="failed_accent">Neue Akzentfarbe konnte nicht angewendet werden</string>
|
||||||
|
<string name="failed_uninstall">Entfernen von %1$s fehlgeschlagen</string>
|
||||||
<string name="files_missing_va">Die benötigten Dateien für die Installation konnten nicht gefunden werden. Laden Sie die Installationsdateien erneut herunter und versuchen Sie es erneut.</string>
|
<string name="files_missing_va">Die benötigten Dateien für die Installation konnten nicht gefunden werden. Laden Sie die Installationsdateien erneut herunter und versuchen Sie es erneut.</string>
|
||||||
<string name="ifile_missing">Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden, bitte versuchen Sie es erneut.</string>
|
<string name="ifile_missing">Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden, bitte versuchen Sie es erneut.</string>
|
||||||
<string name="installation_aborted">Installation fehlgeschlagen, da der Benutzer die Installation abgebrochen hat.</string>
|
<string name="installation_aborted">Installation fehlgeschlagen, da der Benutzer die Installation abgebrochen hat.</string>
|
||||||
<string name="installation_blocked">Installation fehlgeschlagen, da der Benutzer die Installation blockiert hat.</string>
|
|
||||||
<string name="installation_downgrade">Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der stock YouTube App und versuchen Sie es erneut.</string>
|
|
||||||
<string name="installation_conflict">Die Installation ist fehlgeschlagen, weil die App in Konflikt mit einer bereits installierten App steht. Deinstalliere die aktuell installierte Version der App und versuchen es dann erneut.</string>
|
<string name="installation_conflict">Die Installation ist fehlgeschlagen, weil die App in Konflikt mit einer bereits installierten App steht. Deinstalliere die aktuell installierte Version der App und versuchen es dann erneut.</string>
|
||||||
<string name="installation_failed">Die Installation ist aus unbekannten Gründen fehlgeschlagen, betrete unser Telegram oder Discord für weitere Unterstützung. Bitte füge auch einen Screenshot aus dem Erweiterten Menü zu</string>
|
<string name="installation_downgrade">Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der YouTube App und versuchen Sie es erneut.</string>
|
||||||
|
<string name="installation_failed">Die Installation ist aus unbekannten Gründen fehlgeschlagen. Betrete unser Telegram Chat oder Discord Server für weitere Unterstützung und halte bitte einen Screenshot aus dem erweiterten Menü bereit</string>
|
||||||
<string name="installation_incompatible">Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut.</string>
|
<string name="installation_incompatible">Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut.</string>
|
||||||
<string name="installation_invalid">Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut.</string>
|
<string name="installation_invalid">Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut.</string>
|
||||||
<string name="installation_signature">Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut.</string>
|
|
||||||
<string name="installation_miui">Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut.</string>
|
<string name="installation_miui">Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut.</string>
|
||||||
|
<string name="installation_signature">Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut.</string>
|
||||||
<string name="installation_storage">Installation fehlgeschlagen, da das Gerät nicht genügend freien Speicherplatz hat.</string>
|
<string name="installation_storage">Installation fehlgeschlagen, da das Gerät nicht genügend freien Speicherplatz hat.</string>
|
||||||
<string name="modapk_missing">Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut.</string>
|
<string name="modapk_missing">Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut.</string>
|
||||||
<string name="path_missing">Fehler beim Auffinden des YouTube-Installationspfades nach der geteilten Installation.</string>
|
<string name="path_missing">Fehler beim Auffinden des YouTube-Installationspfades nach der geteilten Installation.</string>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue