diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..ec4bb386bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml index 901ccf42a9..88f9e20164 100644 --- a/.github/workflows/debug.yml +++ b/.github/workflows/debug.yml @@ -17,6 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 + - name: set up JDK 1.8 uses: actions/setup-java@v1 with: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000000..3ed45e68b8 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,26 @@ +name: Code Linter + +on: + push: + branches: + - dev + +jobs: + qodana: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/cache@v2 + with: + path: ~/work/_temp/_github_home/cache + key: ${{ runner.os }}-qodana-${{ github.ref }} + restore-keys: | + ${{ runner.os }}-qodana-${{ github.ref }} + ${{ runner.os }}-qodana- + - uses: docker://jetbrains/qodana-jvm-android + with: + args: --cache-dir=/github/home/cache --results-dir=/github/workspace/qodana --save-report --report-dir=/github/workspace/qodana/report + - uses: actions/upload-artifact@v2 + with: + path: qodana \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6b24209962..d8e6fd459c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,4 @@ .gradle/ .idea/ build/ -out/ -app/src/main/java/com/vanced/manager/core/base/DummyJava.java -app/build/ -app/release local.properties -/.github/ -*.iml diff --git a/README.md b/README.md index 11e5ff0930..fd35c5f894 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ # Vanced Manager -
- [![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg?style=for-the-badge)](https://github.com/YTVanced/VancedManager/releases/latest) [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg?style=for-the-badge)](https://github.com/YTVanced/VancedManager/releases/latest) -
+# **Now discontinued https://twitter.com/YTVanced/status/1503052250268286980** Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out. Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born. @@ -15,11 +13,7 @@ After 3 months of development, we are finally ready to introduce Vanced Manager ## Contributions Pull requests should be made to the Dev branch as that is the working branch, master is for release code. -For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for YouTube Vanced. Any issues with translations should be posted there too. - -## TODO -- [ ] Clean up the ViewModel and DataModel code -- [ ] Migrate to Jetpack Compose when it's officially released +For anyone who wants to provide translations please submit them to https://crowdin.com/project/vanced-manager as we also use it for Vanced. Any issues with translations should be posted there too. ## Building @@ -42,8 +36,3 @@ Clone the repo, open it in Android Studio and build the app. chmod +x gradlew ./gradlew assembleDebug ``` - -## Vanced FAQ -Vanced FAQ (from the faq branch) now available on the playstore! - -Get it on Google Play diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000000..956c004dc0 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4861b09b69..1c91716180 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,39 +1,35 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions + plugins { id("com.android.application") kotlin("android") - kotlin("kapt") - id("com.google.gms.google-services") - id("com.google.firebase.crashlytics") - id("com.google.firebase.firebase-perf") - id("androidx.navigation.safeargs.kotlin") - id("kotlin-android") + id("kotlin-parcelize") + kotlin("plugin.serialization") } +val composeVersion = "1.1.1" + android { - compileSdkVersion(30) + compileSdk = 31 defaultConfig { + minSdk = 21 + targetSdk = 31 + applicationId = "com.vanced.manager" - minSdkVersion(21) - targetSdkVersion(30) - versionCode = 260 - versionName = "2.6.0 (Crimson)" + + versionCode = 3000 + versionName = "3.0.0 (Re@Composed)" vectorDrawables.useSupportLibrary = true buildConfigField("String[]", "MANAGER_LANGUAGES", "{$languages}") - buildConfigField("Boolean", "ENABLE_CROWDIN_AUTH", "false") - buildConfigField("String", "CROWDIN_HASH", "\"${System.getenv("CROWDIN_HASH")}\"") - buildConfigField("String", "CROWDIN_CLIENT_ID", "\"${System.getenv("CROWDIN_CLIENT_ID")}\"") - buildConfigField("String", "CROWDIN_CLIENT_SECRET", "\"${System.getenv("CROWDIN_CLIENT_SECRET")}\"") } - lintOptions { - disable("MissingTranslation", "ExtraTranslation") - } - - applicationVariants.all { - resValue("string", "versionName", versionName) + lint { + disable += "MissingTranslation" + disable += "ExtraTranslation" } buildTypes { @@ -44,39 +40,49 @@ android { } buildFeatures { - viewBinding = true - //compose = true + compose = true } packagingOptions { - exclude("META-INF/DEPENDENCIES") - exclude("META-INF/*.kotlin_module") + resources.excludes.add("META-INF/DEPENDENCIES") + resources.excludes.add("META-INF/*.kotlin_module") } -// To inline the bytecode built with JVM target 1.8 into -// bytecode that is being built with JVM target 1.6. (e.g. navArgs) - + // To inline the bytecode built with JVM target 1.8 into + // bytecode that is being built with JVM target 1.6. (e.g. navArgs) compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - //useIR = true - } + composeOptions { + kotlinCompilerExtensionVersion = composeVersion } } + +tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "11" + optIn("androidx.compose.material3.ExperimentalMaterial3Api") + optIn("androidx.compose.animation.ExperimentalAnimationApi") + optIn("androidx.compose.foundation.ExperimentalFoundationApi") + } +} + +fun KotlinJvmOptions.optIn(library: String) { + freeCompilerArgs = freeCompilerArgs + + "-opt-in=$library" +} + val languages: String get() { val langs = arrayListOf("en", "bn_BD", "bn_IN", "pa_IN", "pa_PK", "pt_BR", "pt_PT", "zh_CN", "zh_TW") val exceptions = arrayOf("bn", "pa", "pt", "zh") File("$projectDir/src/main/res").listFiles()?.filter { val name = it.name - name.startsWith("values-") && !name.contains("v23") + name.startsWith("values") && !name.contains("v23") && !name.contains("night") }?.forEach { dir -> val dirname = dir.name.substringAfter("-").substringBefore("-") if (!exceptions.contains(dirname)) { @@ -87,69 +93,64 @@ val languages: String get() { } dependencies { - - //val composeVersion = "1.0.0-alpha12" - implementation(project(":core-presentation")) - implementation(project(":core-ui")) - - implementation(project(":library-network")) - - // Kotlin - implementation(kotlin("stdlib-jdk8")) implementation(kotlin("reflect")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") // AndroidX - implementation("androidx.appcompat:appcompat:1.2.0") - implementation("androidx.browser:browser:1.3.0") - implementation("androidx.constraintlayout:constraintlayout:2.0.4") - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.fragment:fragment-ktx:1.3.3") - implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1") - implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.3.5") - implementation("androidx.navigation:navigation-ui-ktx:2.3.5") - implementation("androidx.preference:preference-ktx:1.1.1") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") + implementation("androidx.core:core-ktx:1.7.0") + implementation("androidx.appcompat:appcompat:1.4.1") + implementation("androidx.browser:browser:1.4.0") + implementation("androidx.preference:preference-ktx:1.2.0") + implementation("androidx.activity:activity-compose:1.4.0") + val lifecycleVersion = "2.4.1" + implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion") // Compose -// implementation("androidx.compose.ui:ui:$composeVersion") -// implementation("androidx.compose.ui:ui-tooling:$composeVersion") -// implementation("androidx.compose.foundation:foundation:$composeVersion") -// implementation("androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha02") -// implementation("androidx.compose.material:material:$composeVersion") -// implementation("androidx.compose.material:material-icons-core:$composeVersion") -// implementation("androidx.compose.material:material-icons-extended:$composeVersion") -// implementation("androidx.compose.runtime:runtime-livedata:$composeVersion") - - // Appearance - implementation("com.github.madrapps:pikolo:2.0.1") - implementation("com.google.android.material:material:1.3.0") - - // JSON parser - implementation("com.beust:klaxon:5.5") - - // Crowdin - implementation("com.github.crowdin.mobile-sdk-android:sdk:1.4.0") - - // HTTP networking - implementation("com.github.kittinunf.fuel:fuel:2.3.1") - implementation("com.github.kittinunf.fuel:fuel-coroutines:2.3.1") - implementation("com.github.kittinunf.fuel:fuel-json:2.3.1") - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") - implementation("com.squareup.retrofit2:retrofit:2.9.0") - - // Root permissions - implementation("com.github.topjohnwu.libsu:core:3.1.2") - implementation("com.github.topjohnwu.libsu:io:3.1.2") - - // Layout - implementation("com.google.android:flexbox:2.0.1") - - // Firebase - implementation("com.google.firebase:firebase-analytics-ktx:18.0.3") - implementation("com.google.firebase:firebase-crashlytics:17.4.1") - implementation("com.google.firebase:firebase-messaging:21.1.0") - implementation("com.google.firebase:firebase-perf:19.1.1") + implementation("androidx.compose.compiler:compiler:$composeVersion") + implementation("androidx.compose.foundation:foundation:$composeVersion") + implementation("androidx.compose.material:material-icons-core:$composeVersion") + implementation("androidx.compose.material:material-icons-extended:$composeVersion") + implementation("androidx.compose.material:material:$composeVersion") + implementation("androidx.compose.material3:material3:1.0.0-alpha06") + implementation("androidx.compose.runtime:runtime-livedata:$composeVersion") + implementation("androidx.compose.ui:ui-tooling:$composeVersion") + implementation("androidx.compose.ui:ui-util:$composeVersion") + implementation("androidx.compose.ui:ui:$composeVersion") + + // Google + implementation("com.google.android.material:material:1.5.0") + + val accompanistVersion = "0.22.1-rc" + implementation("com.google.accompanist:accompanist-navigation-animation:$accompanistVersion") + implementation("com.google.accompanist:accompanist-placeholder-material:$accompanistVersion") + implementation("com.google.accompanist:accompanist-swiperefresh:$accompanistVersion") + implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion") + + // Other + implementation("com.github.zsoltk:compose-router:0.28.0") + + implementation("io.coil-kt:coil-compose:1.4.0") + + implementation("com.github.skydoves:orchestra-colorpicker:1.1.0") + + val libsuVersion = "3.2.1" + implementation("com.github.topjohnwu.libsu:core:$libsuVersion") + implementation("com.github.topjohnwu.libsu:io:$libsuVersion") + implementation("com.github.topjohnwu.libsu:busybox:$libsuVersion") + + val koinVersion = "3.1.3" + implementation("io.insert-koin:koin-android:$koinVersion") + implementation("io.insert-koin:koin-androidx-compose:$koinVersion") + + val retrofitVersion = "2.9.0" + implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") + implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion") + + implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.3") + androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0") } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 172f088481..a00bb84096 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -12,8 +12,13 @@ # public *; #} --keep class com.vanced.manager.core.App --keep class com.crowdin.platform.* { *; } +-keep class com.vanced.manager.network.dto.GithubReleaseDto { + *; +} + +-keep class com.vanced.manager.network.dto.GithubReleaseAssetDto { + *; +} # Uncomment this to preserve the line number information for # debugging stack traces. diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 81440f187c..edf4095177 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,19 +1,10 @@ - - - - - - - + + @@ -26,17 +17,16 @@ + android:supportsRtl="true"> @@ -44,63 +34,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:theme="@style/Theme.MaterialComponents.NoActionBar" + android:label="@string/app_name"/> - - + + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png deleted file mode 100644 index 7004eaa534..0000000000 Binary files a/app/src/main/ic_launcher-playstore.png and /dev/null differ diff --git a/app/src/main/java/com/vanced/manager/ManagerApplication.kt b/app/src/main/java/com/vanced/manager/ManagerApplication.kt new file mode 100644 index 0000000000..647ab8f9ec --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ManagerApplication.kt @@ -0,0 +1,31 @@ +package com.vanced.manager + +import android.app.Application +import com.vanced.manager.di.* +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin + +class ManagerApplication : Application() { + + override fun onCreate() { + super.onCreate() + + startKoin { + androidContext(this@ManagerApplication) + + modules( + apiModule, + customTabsModule, + datasourceModule, + downloaderModule, + installerModule, + managerModule, + networkModule, + repositoryModule, + serviceModule, + viewModelModule, + ) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/ExpandableAppListAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/ExpandableAppListAdapter.kt deleted file mode 100644 index 5ffb03fb49..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/ExpandableAppListAdapter.kt +++ /dev/null @@ -1,199 +0,0 @@ -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.dialogs.AppUninstallDialog -import com.vanced.manager.ui.viewmodels.HomeViewModel -import com.vanced.manager.utils.* - -class ExpandableAppListAdapter( - private val activity: FragmentActivity, - private val viewModel: HomeViewModel -) : RecyclerView.Adapter() { - - private val apps = mutableListOf() - private val dataModels = mutableListOf() - 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 { - AppUninstallDialog.newInstance(apps[position]).show(activity.supportFragmentManager, null) - } - 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 - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/GetNotifAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/GetNotifAdapter.kt deleted file mode 100644 index 7defd83418..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/GetNotifAdapter.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.vanced.manager.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.google.firebase.messaging.FirebaseMessaging -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewNotificationSettingBinding -import com.vanced.manager.model.NotifModel -import com.vanced.manager.utils.defPrefs - -class GetNotifAdapter(private val context: Context) : - RecyclerView.Adapter() { - - private val prefs = context.defPrefs - - private val vanced = NotifModel( - "Vanced-Update", - context.getString(R.string.push_notifications, context.getString(R.string.vanced)), - context.getString(R.string.push_notifications_summary, context.getString(R.string.vanced)), - "vanced_notifs" - ) - private val music = NotifModel( - "Music-Update", - context.getString(R.string.push_notifications, context.getString(R.string.music)), - context.getString(R.string.push_notifications_summary, context.getString(R.string.music)), - "music_notifs" - ) - private val microg = NotifModel( - "MicroG-Update", - context.getString(R.string.push_notifications, context.getString(R.string.microg)), - context.getString(R.string.push_notifications_summary, context.getString(R.string.microg)), - "microg_notifs" - ) - - private val apps = arrayOf(vanced, music, microg) - - inner class GetNotifViewHolder(val binding: ViewNotificationSettingBinding) : - RecyclerView.ViewHolder(binding.root) { - val switch = binding.notifSwitch - fun bind(position: Int) { - val app = apps[position] - with(binding.notifSwitch) { - setKey(app.key) - setSummary(app.switchSummary) - setTitle(app.switchTitle) - setDefaultValue(true) - with(prefs) { - setChecked( - getBoolean( - "enable_" + app.key.substringBefore("_"), - true - ) && getBoolean(app.key, true) - ) - } - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GetNotifViewHolder { - val view = - ViewNotificationSettingBinding.inflate(LayoutInflater.from(context), parent, false) - return GetNotifViewHolder(view) - } - - override fun onBindViewHolder(holder: GetNotifViewHolder, position: Int) { - holder.bind(position) - holder.switch.setOnCheckedListener { _, isChecked -> - when (isChecked) { - true -> FirebaseMessaging.getInstance().subscribeToTopic(apps[position].topic) - false -> FirebaseMessaging.getInstance().unsubscribeFromTopic(apps[position].topic) - } - } - } - - override fun getItemCount(): Int = 3 - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/LinkAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/LinkAdapter.kt deleted file mode 100644 index a123965d85..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/LinkAdapter.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.vanced.manager.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.appcompat.content.res.AppCompatResources -import androidx.recyclerview.widget.RecyclerView -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewSocialLinkBinding -import com.vanced.manager.model.LinkModel -import com.vanced.manager.ui.viewmodels.HomeViewModel - -class LinkAdapter( - private val context: Context, - private val viewModel: HomeViewModel -) : RecyclerView.Adapter() { - - private val instagram = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_instagram), - INSTAGRAM - ) - - private val youtube = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_youtube), - YOUTUBE - ) - - private val github = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_github), - GITHUB - ) - - private val website = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_website), - WEBSITE - ) - - private val telegram = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_telegram), - TELEGRAM - ) - - private val twitter = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_twitter), - TWITTER - ) - - private val discord = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_discord), - DISCORD - ) - - private val reddit = LinkModel( - AppCompatResources.getDrawable(context, R.drawable.ic_reddit), - REDDIT - ) - - val links = arrayOf(instagram, youtube, github, website, telegram, twitter, discord, reddit) - - inner class LinkViewHolder(private val binding: ViewSocialLinkBinding) : - RecyclerView.ViewHolder(binding.root) { - - val logo = binding.linkImage - - fun bind(position: Int) { - binding.linkBg.setOnClickListener { - viewModel.openUrl(links[position].linkUrl) - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LinkViewHolder { - val view = ViewSocialLinkBinding.inflate(LayoutInflater.from(context), parent, false) - return LinkViewHolder(view) - } - - override fun onBindViewHolder(holder: LinkViewHolder, position: Int) { - holder.bind(position) - holder.logo.setImageDrawable(links[position].linkIcon) - } - - override fun getItemCount(): Int = links.size - - companion object { - const val INSTAGRAM = "https://instagram.com/vanced.youtube" - const val YOUTUBE = "https://youtube.com/c/YouTubeVanced" - const val GITHUB = "https://github.com/YTVanced/VancedManager" - const val WEBSITE = "https://vancedapp.com" - const val TELEGRAM = "https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w" - const val TWITTER = "https://twitter.com/YTVanced" - const val DISCORD = "https://discord.gg/WCGNdRruzb" - const val REDDIT = "https://www.reddit.com/r/Vanced/" - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/SelectAppsAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/SelectAppsAdapter.kt deleted file mode 100644 index b4dbac9ef8..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/SelectAppsAdapter.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.vanced.manager.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import androidx.recyclerview.widget.RecyclerView -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewAppCheckboxBinding -import com.vanced.manager.model.SelectAppModel -import com.vanced.manager.utils.enableMusic -import com.vanced.manager.utils.enableVanced - -class SelectAppsAdapter(private val context: Context) : - RecyclerView.Adapter() { - - private val prefs by lazy { getDefaultSharedPreferences(context) } - - private val vanced = SelectAppModel( - context.getString(R.string.vanced), - context.getString(R.string.description_vanced), - "vanced", - prefs.enableVanced - ) - - private val music = SelectAppModel( - context.getString(R.string.music), - context.getString(R.string.description_vanced_music), - "music", - prefs.enableMusic - ) - - val apps = arrayOf(vanced, music) - - inner class SelectAppsViewHolder(binding: ViewAppCheckboxBinding) : - RecyclerView.ViewHolder(binding.root) { - val appName = binding.appCheckboxText - val appDescription = binding.appCheckboxDescription - val appCard = binding.appCheckboxBg - val checkbox = binding.appCheckbox - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SelectAppsViewHolder { - val view = ViewAppCheckboxBinding.inflate(LayoutInflater.from(context), parent, false) - return SelectAppsViewHolder(view) - } - - override fun onBindViewHolder(holder: SelectAppsViewHolder, position: Int) { - holder.appName.text = apps[position].appName - holder.appDescription.text = apps[position].appDescription - holder.checkbox.isChecked = apps[position].isChecked - holder.appCard.setOnClickListener { - holder.checkbox.isChecked = !holder.checkbox.isChecked - apps[position].isChecked = !apps[position].isChecked - } - } - - override fun getItemCount(): Int = 2 - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/SponsorAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/SponsorAdapter.kt deleted file mode 100644 index b93bc5f83b..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/SponsorAdapter.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.vanced.manager.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.appcompat.content.res.AppCompatResources -import androidx.recyclerview.widget.RecyclerView -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewSponsorBinding -import com.vanced.manager.model.SponsorModel -import com.vanced.manager.ui.viewmodels.HomeViewModel -import com.vanced.manager.utils.LIGHT -import com.vanced.manager.utils.currentTheme - -class SponsorAdapter( - private val context: Context, - private val viewModel: HomeViewModel -) : RecyclerView.Adapter() { - - private val brave = SponsorModel( - if (currentTheme == LIGHT) AppCompatResources.getDrawable( - context, - R.drawable.ic_brave_light - ) else AppCompatResources.getDrawable(context, R.drawable.ic_brave), - "Brave", - BRAVE - ) - - private val adguard = SponsorModel( - AppCompatResources.getDrawable(context, R.drawable.ic_adguard), - "AdGuard", - ADGUARD - ) - - val sponsors = arrayListOf(brave, adguard) - - inner class LinkViewHolder(private val binding: ViewSponsorBinding) : RecyclerView.ViewHolder( - binding.root - ) { - val logo = binding.sponsorLogo - fun bind(position: Int) { - with(binding) { - sponsorName.text = sponsors[position].name - cardSponsor.setOnClickListener { - viewModel.openUrl(sponsors[position].url) - } - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LinkViewHolder { - val view = ViewSponsorBinding.inflate(LayoutInflater.from(context), parent, false) - return LinkViewHolder(view) - } - - override fun onBindViewHolder(holder: LinkViewHolder, position: Int) { - holder.bind(position) - holder.logo.setImageDrawable(sponsors[position].logo) - } - - override fun getItemCount(): Int = 2 - - companion object { - const val BRAVE = "https://vancedapp.com/brave" - const val ADGUARD = "https://adguard.com/?aid=31141&source=manager" - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/adapter/WelcomePageAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/WelcomePageAdapter.kt deleted file mode 100644 index 40c1cab1f0..0000000000 --- a/app/src/main/java/com/vanced/manager/adapter/WelcomePageAdapter.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.vanced.manager.adapter - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity -import androidx.viewpager2.adapter.FragmentStateAdapter -import com.vanced.manager.ui.fragments.GrantRootFragment -import com.vanced.manager.ui.fragments.SelectAppsFragment -import com.vanced.manager.ui.fragments.WelcomeFragment - -class WelcomePageAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { - - override fun getItemCount(): Int = 3 - - override fun createFragment(position: Int): Fragment { - return when (position) { - 0 -> WelcomeFragment() - 1 -> SelectAppsFragment() - 2 -> GrantRootFragment() - else -> throw IllegalArgumentException("Unknown fragment") - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/core/App.kt b/app/src/main/java/com/vanced/manager/core/App.kt deleted file mode 100644 index 54cace32e3..0000000000 --- a/app/src/main/java/com/vanced/manager/core/App.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.vanced.manager.core - -import android.app.Application -import android.content.res.Configuration -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.crowdin.platform.Crowdin -import com.crowdin.platform.CrowdinConfig -import com.crowdin.platform.data.model.AuthConfig -import com.crowdin.platform.data.remote.NetworkType -import com.vanced.manager.BuildConfig.* -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.loadJson -import com.vanced.manager.utils.managerAccent -import com.vanced.manager.utils.mutableAccentColor -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.launch - -open class App : Application() { - - private val prefs by lazy { getDefaultSharedPreferences(this) } - private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) - - override fun onCreate() { - scope.launch { loadJson(this@App) } - super.onCreate() - mutableAccentColor.value = prefs.managerAccent - Crowdin.init( - this, - CrowdinConfig.Builder().apply { - withDistributionHash(CROWDIN_HASH) - withNetworkType(NetworkType.WIFI) - if (ENABLE_CROWDIN_AUTH) { - if (prefs.getBoolean("crowdin_real_time", false)) - withRealTimeUpdates() - - withSourceLanguage("en") - withAuthConfig(AuthConfig(CROWDIN_CLIENT_ID, CROWDIN_CLIENT_SECRET, null)) - withScreenshotEnabled() - log("test", "crowdin credentials") - } - }.build() - ) - - if (prefs.getBoolean("crowdin_upload_screenshot", false)) - Crowdin.registerScreenShotContentObserver(this) - - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - Crowdin.onConfigurationChanged() - } -} diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt deleted file mode 100644 index 1095bfae73..0000000000 --- a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.vanced.manager.core.downloader - -import android.content.Context -import com.vanced.manager.R -import com.vanced.manager.utils.* -import com.vanced.manager.utils.DownloadHelper.download -import com.vanced.manager.utils.PackageHelper.install - -object MicrogDownloader { - - private const val fileName = "microg.apk" - private const val folderName = "microg" - - fun downloadMicrog(context: Context) { - val url = microg.value?.string("url") ?: "" - download(url, "$baseInstallUrl/", folderName, fileName, context, onDownloadComplete = { - startMicrogInstall(context) - }, onError = { - downloadingFile.postValue(context.getString(R.string.error_downloading, fileName)) - }) - - } - - fun startMicrogInstall(context: Context) { - installing.postValue(true) - postReset() - install("${context.getExternalFilesDir(folderName)}/$fileName", context) - } -} diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt deleted file mode 100644 index 6b3eea09f3..0000000000 --- a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.vanced.manager.core.downloader - -import android.content.Context -import com.vanced.manager.R -import com.vanced.manager.utils.* -import com.vanced.manager.utils.AppUtils.musicRootPkg -import com.vanced.manager.utils.AppUtils.validateTheme -import com.vanced.manager.utils.DownloadHelper.download -import com.vanced.manager.utils.PackageHelper.downloadStockCheck -import com.vanced.manager.utils.PackageHelper.install -import com.vanced.manager.utils.PackageHelper.installMusicRoot - -object MusicDownloader { - - private var variant: String? = null - private var musicVersion: String? = null - private var versionCode: Int? = null - private var baseurl = "" - private var folderName: String? = null - private var downloadPath: String? = null - private var hashUrl: String? = null - - fun downloadMusic(context: Context, version: String? = null) { - val prefs = context.defPrefs - musicVersion = version ?: prefs.musicVersion?.getLatestAppVersion( - musicVersions.value?.value ?: listOf("") - ) - versionCode = music.value?.int("versionCode") - variant = prefs.managerVariant - baseurl = "$baseInstallUrl/music/v$musicVersion" - folderName = "music/$variant" - downloadPath = context.getExternalFilesDir(folderName)?.path - hashUrl = "$baseurl/hash.json" - - downloadApk(context) - } - - private fun downloadApk(context: Context, apk: String = "music") { - val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk" - download( - url, - "$baseurl/", - folderName!!, - getFileNameFromUrl(url), - context, - onDownloadComplete = { - if (variant == "root" && apk != "stock") { - downloadApk(context, "stock") - return@download - } - - when (apk) { - "music" -> { - if (variant == "root") { - if (validateTheme(downloadPath!!, "root", hashUrl!!, context)) { - if (downloadStockCheck(musicRootPkg, versionCode!!, context)) - downloadApk(context, "stock") - else - startMusicInstall(context) - } else { - downloadApk(context, apk) - } - } else - startMusicInstall(context) - } - "stock" -> startMusicInstall(context) - } - }, - onError = { - downloadingFile.postValue( - context.getString( - R.string.error_downloading, - getFileNameFromUrl(url) - ) - ) - }) - } - - fun startMusicInstall(context: Context) { - installing.postValue(true) - postReset() - if (variant == "root") - installMusicRoot(context) - else - install("${context.getExternalFilesDir("music/nonroot")}/nonroot.apk", context) - } -} diff --git a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt deleted file mode 100644 index 1114e39012..0000000000 --- a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt +++ /dev/null @@ -1,149 +0,0 @@ -package com.vanced.manager.core.downloader - -import android.content.Context -import android.content.SharedPreferences -import com.google.firebase.analytics.FirebaseAnalytics -import com.google.firebase.analytics.ktx.logEvent -import com.vanced.manager.R -import com.vanced.manager.utils.* -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.validateTheme -import com.vanced.manager.utils.AppUtils.vancedRootPkg -import com.vanced.manager.utils.DownloadHelper.download -import com.vanced.manager.utils.PackageHelper.downloadStockCheck -import com.vanced.manager.utils.PackageHelper.installSplitApkFiles -import com.vanced.manager.utils.PackageHelper.installVancedRoot -import java.io.File - -object VancedDownloader { - - private lateinit var prefs: SharedPreferences - private lateinit var defPrefs: SharedPreferences - private lateinit var arch: String - private var variant: String? = null - private var theme: String? = null - private var lang = mutableListOf() - - private lateinit var themePath: String - - private var count: Int = 0 - private var succesfulLangCount: Int = 0 - private var hashUrl = "" - - private var vancedVersionCode = 0 - private var vancedVersion: String? = null - - private var downloadPath: String? = null - private var folderName: String? = null - - fun downloadVanced(context: Context, version: String?) { - defPrefs = context.defPrefs - prefs = context.installPrefs - variant = defPrefs.managerVariant - folderName = "vanced/$variant" - downloadPath = context.getExternalFilesDir(folderName)?.path - File(downloadPath.toString()).deleteRecursively() - prefs.lang?.let { - lang = it.split(", ").toMutableList() - } - theme = prefs.theme - vancedVersion = version ?: defPrefs.vancedVersion?.getLatestAppVersion( - vancedVersions.value?.value ?: listOf("") - ) - themePath = "$baseInstallUrl/apks/v$vancedVersion/$variant/Theme" - hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json" - arch = getArch() - count = 0 - - vancedVersionCode = vanced.value?.int("versionCode") ?: 0 - try { - downloadSplits(context) - } catch (e: Exception) { - log("VMDownloader", e.stackTraceToString()) - downloadingFile.postValue(context.getString(R.string.error_downloading, "Vanced")) - } - - } - - private fun downloadSplits(context: Context, type: String = "theme") { - val url = when (type) { - "theme" -> "$themePath/$theme.apk" - "arch" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk" - "stock" -> "$themePath/stock.apk" - "dpi" -> "$themePath/dpi.apk" - "lang" -> "$baseInstallUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang[count]}.apk" - else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?") - } - - download( - url, - "$baseInstallUrl/", - folderName!!, - getFileNameFromUrl(url), - context, - onDownloadComplete = { - when (type) { - "theme" -> - if (variant == "root") { - if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) { - if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context)) - downloadSplits(context, "arch") - else - startVancedInstall(context) - } else - downloadSplits(context, "theme") - } else - downloadSplits(context, "arch") - "arch" -> if (variant == "root") downloadSplits( - context, - "stock" - ) else downloadSplits(context, "lang") - "stock" -> downloadSplits(context, "dpi") - "dpi" -> downloadSplits(context, "lang") - "lang" -> { - count++ - succesfulLangCount++ - if (count < lang.size) - downloadSplits(context, "lang") - else - startVancedInstall(context) - } - - } - }, - onError = { - if (type == "lang") { - count++ - when { - count < lang.size -> downloadSplits(context, "lang") - succesfulLangCount == 0 -> { - lang.add("en") - downloadSplits(context, "lang") - } - else -> startVancedInstall(context) - } - - } else { - downloadingFile.postValue( - context.getString( - R.string.error_downloading, - getFileNameFromUrl(url) - ) - ) - } - }) - } - - fun startVancedInstall(context: Context, variant: String? = this.variant) { - installing.postValue(true) - postReset() - FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.SELECT_ITEM) { - variant?.let { param("vanced_variant", it) } - theme?.let { param("vanced_theme", it) } - } - if (variant == "root") - installVancedRoot(context) - else - installSplitApkFiles(context, "vanced") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/core/firebase/CloudMessaging.kt b/app/src/main/java/com/vanced/manager/core/firebase/CloudMessaging.kt deleted file mode 100644 index 3870321cde..0000000000 --- a/app/src/main/java/com/vanced/manager/core/firebase/CloudMessaging.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.vanced.manager.core.firebase - -import com.google.firebase.messaging.FirebaseMessagingService -import com.vanced.manager.utils.AppUtils.log - -class CloudMessaging : FirebaseMessagingService() { - - override fun onNewToken(p0: String) { - log("VMC", "Generated new token: $p0") - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/core/installer/AppInstallerService.kt b/app/src/main/java/com/vanced/manager/core/installer/AppInstallerService.kt deleted file mode 100644 index df363d889a..0000000000 --- a/app/src/main/java/com/vanced/manager/core/installer/AppInstallerService.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.vanced.manager.core.installer - -import android.app.Service -import android.content.Intent -import android.content.pm.PackageInstaller -import android.os.IBinder -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.sendCloseDialog -import com.vanced.manager.utils.AppUtils.sendFailure -import com.vanced.manager.utils.AppUtils.sendRefresh - -class AppInstallerService : Service() { - - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { - when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { - PackageInstaller.STATUS_PENDING_USER_ACTION -> { - log(TAG, "Requesting user confirmation for installation") - val confirmationIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT) - confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - try { - startActivity(confirmationIntent) - } catch (e: Exception) { - log("VMInstall", "Unable to start installation") - } - } - PackageInstaller.STATUS_SUCCESS -> { - log(TAG, "Installation succeed") - sendCloseDialog(this) - sendRefresh(this) - } - else -> { - sendCloseDialog(this) - intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)?.let { - sendFailure(it, this) - } - } - } - stopSelf() - return START_NOT_STICKY - } - - override fun onBind(intent: Intent?): IBinder? { - return null - } - - companion object { - const val TAG = "VMInstall" - } - -} diff --git a/app/src/main/java/com/vanced/manager/core/installer/AppUninstallerService.kt b/app/src/main/java/com/vanced/manager/core/installer/AppUninstallerService.kt deleted file mode 100644 index 54d2d282a5..0000000000 --- a/app/src/main/java/com/vanced/manager/core/installer/AppUninstallerService.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.vanced.manager.core.installer - -import android.app.Service -import android.content.Intent -import android.content.pm.PackageInstaller -import android.os.IBinder -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.sendRefresh - -class AppUninstallerService : Service() { - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - val pkgName = intent?.getStringExtra("pkg") - when (intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { - PackageInstaller.STATUS_PENDING_USER_ACTION -> { - log(AppInstallerService.TAG, "Requesting user confirmation for uninstallation") - val confirmationIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT) - confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - try { - startActivity(confirmationIntent) - } catch (e: Exception) { - } - } - //Delay broadcast until activity (and fragment) show up on the screen - PackageInstaller.STATUS_SUCCESS -> { - sendRefresh(this) - log("VMpm", "Successfully uninstalled $pkgName") - } - PackageInstaller.STATUS_FAILURE -> { - sendRefresh(this) - log("VMpm", "Failed to uninstall $pkgName") - } - } - stopSelf() - return START_NOT_STICKY - } - - override fun onBind(intent: Intent?): IBinder? { - return null - } - -} diff --git a/app/src/main/java/com/vanced/manager/di/APIModule.kt b/app/src/main/java/com/vanced/manager/di/APIModule.kt new file mode 100644 index 0000000000..8ebd2b3006 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/APIModule.kt @@ -0,0 +1,48 @@ +package com.vanced.manager.di + +import com.vanced.manager.downloader.api.MicrogAPI +import com.vanced.manager.downloader.api.MusicAPI +import com.vanced.manager.downloader.api.VancedAPI +import com.vanced.manager.network.util.BASE +import okhttp3.OkHttpClient +import org.koin.dsl.module +import retrofit2.Retrofit +import retrofit2.create + +//TODO Add mirror support +val apiModule = module { + + fun provideVancedAPI( + okHttpClient: OkHttpClient + ): VancedAPI { + return Retrofit.Builder() + .baseUrl(BASE) + .client(okHttpClient) + .build() + .create() + } + + fun provideMusicAPI( + okHttpClient: OkHttpClient + ): MusicAPI { + return Retrofit.Builder() + .baseUrl(BASE) + .client(okHttpClient) + .build() + .create() + } + + fun provideMicrogAPI( + okHttpClient: OkHttpClient + ): MicrogAPI { + return Retrofit.Builder() + .baseUrl("https://github.com/YTVanced/VancedMicroG/") + .client(okHttpClient) + .build() + .create(MicrogAPI::class.java) + } + + single { provideVancedAPI(get()) } + single { provideMusicAPI(get()) } + single { provideMicrogAPI(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/CustomTabsModule.kt b/app/src/main/java/com/vanced/manager/di/CustomTabsModule.kt new file mode 100644 index 0000000000..ac552d20c3 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/CustomTabsModule.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.di + +import androidx.browser.customtabs.CustomTabsIntent +import org.koin.dsl.module + +val customTabsModule = module { + + fun provideChromeCustomTabs(): CustomTabsIntent { + return CustomTabsIntent.Builder() + .build() + } + + single { provideChromeCustomTabs() } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/DatasourceModule.kt b/app/src/main/java/com/vanced/manager/di/DatasourceModule.kt new file mode 100644 index 0000000000..d5eafe56d8 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/DatasourceModule.kt @@ -0,0 +1,23 @@ +package com.vanced.manager.di + +import android.content.Context +import com.vanced.manager.repository.source.PreferenceDatasource +import com.vanced.manager.repository.source.PreferenceDatasourceImpl +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val datasourceModule = module { + + fun providePreferenceDatasource( + context: Context + ): PreferenceDatasource { + return PreferenceDatasourceImpl( + sharedPreferences = context.getSharedPreferences( + "manager_settings", + Context.MODE_PRIVATE + ) + ) + } + + single { providePreferenceDatasource(androidContext()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/DownloaderModule.kt b/app/src/main/java/com/vanced/manager/di/DownloaderModule.kt new file mode 100644 index 0000000000..87521bad74 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/DownloaderModule.kt @@ -0,0 +1,48 @@ +package com.vanced.manager.di + +import android.content.Context +import com.vanced.manager.downloader.api.MicrogAPI +import com.vanced.manager.downloader.api.MusicAPI +import com.vanced.manager.downloader.api.VancedAPI +import com.vanced.manager.downloader.impl.MicrogDownloader +import com.vanced.manager.downloader.impl.MusicDownloader +import com.vanced.manager.downloader.impl.VancedDownloader +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val downloaderModule = module { + + fun provideVancedDownloader( + vancedAPI: VancedAPI, + context: Context, + ): VancedDownloader { + return VancedDownloader( + vancedAPI = vancedAPI, + context = context + ) + } + + fun provideMusicDownloader( + musicAPI: MusicAPI, + context: Context, + ): MusicDownloader { + return MusicDownloader( + musicAPI = musicAPI, + context = context + ) + } + + fun provideMicrogDownloader( + microgAPI: MicrogAPI, + context: Context, + ): MicrogDownloader { + return MicrogDownloader( + microgAPI = microgAPI, + context = context + ) + } + + single { provideVancedDownloader(get(), androidContext()) } + single { provideMusicDownloader(get(), androidContext()) } + single { provideMicrogDownloader(get(), androidContext()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/InstallerModuke.kt b/app/src/main/java/com/vanced/manager/di/InstallerModuke.kt new file mode 100644 index 0000000000..005b4a3425 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/InstallerModuke.kt @@ -0,0 +1,51 @@ +package com.vanced.manager.di + +import android.content.Context +import com.vanced.manager.installer.impl.MicrogInstaller +import com.vanced.manager.installer.impl.MusicInstaller +import com.vanced.manager.installer.impl.VancedInstaller +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.RootPackageManager +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val installerModule = module { + + fun provideVancedInstaller( + context: Context, + nonrootPackageManager: NonrootPackageManager, + rootPackageManager: RootPackageManager + ): VancedInstaller { + return VancedInstaller( + context = context, + nonrootPackageManager = nonrootPackageManager, + rootPackageManager = rootPackageManager + ) + } + + fun provideMusicInstaller( + context: Context, + nonrootPackageManager: NonrootPackageManager, + rootPackageManager: RootPackageManager + ): MusicInstaller { + return MusicInstaller( + context = context, + nonrootPackageManager = nonrootPackageManager, + rootPackageManager = rootPackageManager + ) + } + + fun provideMicrogInstaller( + context: Context, + nonrootPackageManager: NonrootPackageManager, + ): MicrogInstaller { + return MicrogInstaller( + context = context, + nonrootPackageManager = nonrootPackageManager + ) + } + + single { provideVancedInstaller(androidContext(), get(), get()) } + single { provideMusicInstaller(androidContext(), get(), get()) } + single { provideMicrogInstaller(androidContext(), get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/ManagerModule.kt b/app/src/main/java/com/vanced/manager/di/ManagerModule.kt new file mode 100644 index 0000000000..604f6e49bb --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/ManagerModule.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.di + +import android.content.Context +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.RootPackageManager +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module + +val managerModule = module { + + fun provideNonrootPackageManager( + context: Context + ): NonrootPackageManager { + return NonrootPackageManager( + context = context + ) + } + + fun provideRootPackageManager(): RootPackageManager { + return RootPackageManager() + } + + single { provideNonrootPackageManager(androidContext()) } + single { provideRootPackageManager() } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/NetworkModule.kt b/app/src/main/java/com/vanced/manager/di/NetworkModule.kt new file mode 100644 index 0000000000..bf3545b918 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/NetworkModule.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.di + +import okhttp3.OkHttpClient +import org.koin.dsl.module + +val networkModule = module { + + fun provideOkHttpClient(): OkHttpClient { + return OkHttpClient.Builder() + .build() + } + + single { provideOkHttpClient() } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt b/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt new file mode 100644 index 0000000000..c9dc67e7f1 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/RepositoryModule.kt @@ -0,0 +1,37 @@ +package com.vanced.manager.di + +import com.vanced.manager.network.GithubService +import com.vanced.manager.repository.AppRepository +import com.vanced.manager.repository.AppRepositoryImpl +import com.vanced.manager.repository.PreferenceRepository +import com.vanced.manager.repository.PreferenceRepositoryImpl +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.RootPackageManager +import com.vanced.manager.repository.source.PreferenceDatasource +import org.koin.dsl.module + +val repositoryModule = module { + + fun provideGithubRepository( + githubService: GithubService, + nonrootPackageManager: NonrootPackageManager, + rootPackageManager: RootPackageManager, + ): AppRepository { + return AppRepositoryImpl( + githubService = githubService, + nonrootPackageManager = nonrootPackageManager, + rootPackageManager = rootPackageManager + ) + } + + fun providePreferenceRepository( + preferenceDatasource: PreferenceDatasource + ): PreferenceRepository { + return PreferenceRepositoryImpl( + preferenceDatasource = preferenceDatasource + ) + } + + single { provideGithubRepository(get(), get(), get()) } + single { providePreferenceRepository(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/ServiceModule.kt b/app/src/main/java/com/vanced/manager/di/ServiceModule.kt new file mode 100644 index 0000000000..c828e70f95 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/ServiceModule.kt @@ -0,0 +1,31 @@ +package com.vanced.manager.di + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.vanced.manager.network.GithubService +import com.vanced.manager.network.util.GITHUB_API_BASE +import kotlinx.serialization.json.Json +import okhttp3.MediaType +import okhttp3.OkHttpClient +import org.koin.dsl.module +import retrofit2.Retrofit +import retrofit2.create + +private val json = Json { + ignoreUnknownKeys = true +} + +val serviceModule = module { + + fun provideGithubService( + okHttpClient: OkHttpClient + ): GithubService { + return Retrofit.Builder() + .baseUrl(GITHUB_API_BASE) + .addConverterFactory(json.asConverterFactory(MediaType.get("application/json"))) + .client(okHttpClient) + .build() + .create() + } + + single { provideGithubService(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt b/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt new file mode 100644 index 0000000000..d82ede038d --- /dev/null +++ b/app/src/main/java/com/vanced/manager/di/ViewModelModule.kt @@ -0,0 +1,70 @@ +package com.vanced.manager.di + +import android.app.Application +import com.vanced.manager.downloader.impl.MicrogDownloader +import com.vanced.manager.downloader.impl.MusicDownloader +import com.vanced.manager.downloader.impl.VancedDownloader +import com.vanced.manager.installer.impl.MicrogInstaller +import com.vanced.manager.installer.impl.MusicInstaller +import com.vanced.manager.installer.impl.VancedInstaller +import com.vanced.manager.repository.AppRepository +import com.vanced.manager.repository.PreferenceRepository +import com.vanced.manager.ui.viewmodel.ConfigurationViewModel +import com.vanced.manager.ui.viewmodel.InstallViewModel +import com.vanced.manager.ui.viewmodel.MainViewModel +import com.vanced.manager.ui.viewmodel.SettingsViewModel +import org.koin.android.ext.koin.androidApplication +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val viewModelModule = module { + + fun provideMainViewModel( + appRepository: AppRepository, + preferenceRepository: PreferenceRepository, + app: Application, + ): MainViewModel { + return MainViewModel( + appRepository = appRepository, + preferenceRepository = preferenceRepository, + app = app + ) + } + + fun provideInstallViewModel( + vancedDownloader: VancedDownloader, + musicDownloader: MusicDownloader, + microgDownloader: MicrogDownloader, + + vancedInstaller: VancedInstaller, + musicInstaller: MusicInstaller, + microgInstaller: MicrogInstaller, + ): InstallViewModel { + return InstallViewModel( + vancedDownloader = vancedDownloader, + musicDownloader = musicDownloader, + microgDownloader = microgDownloader, + + vancedInstaller = vancedInstaller, + musicInstaller = musicInstaller, + microgInstaller = microgInstaller + ) + } + + fun provideConfigurationViewModel(): ConfigurationViewModel { + return ConfigurationViewModel() + } + + fun provideSettingsViewModel( + preferenceRepository: PreferenceRepository + ): SettingsViewModel { + return SettingsViewModel( + preferenceRepository = preferenceRepository + ) + } + + viewModel { provideMainViewModel(get(), get(), androidApplication()) } + viewModel { provideInstallViewModel(get(), get(), get(), get(), get(), get()) } + viewModel { provideConfigurationViewModel() } + viewModel { provideSettingsViewModel(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/domain/model/App.kt b/app/src/main/java/com/vanced/manager/domain/model/App.kt new file mode 100644 index 0000000000..d9a76e21ea --- /dev/null +++ b/app/src/main/java/com/vanced/manager/domain/model/App.kt @@ -0,0 +1,59 @@ +package com.vanced.manager.domain.model + +import androidx.annotation.DrawableRes +import com.vanced.manager.R + +data class App( + val name: String, + @DrawableRes val iconResId: Int, + val changelog: String, + val remoteVersionCode: Int, + val remoteVersionName: String, + val installedVersionCode: Int?, + val installedVersionName: String?, + val packageName: String, + val launchActivity: String, + val state: AppState, + val app: AppType +) + +object AppData { + const val NAME_VANCED_YOUTUBE = "YouTube Vanced" + const val NAME_VANCED_YOUTUBE_MUSIC = "YouTube Vanced Music" + const val NAME_VANCED_MICROG = "Vanced microG" + const val NAME_VANCED_MANAGER = "Vanced Manager" + + const val ICON_VANCED_YOUTUBE = R.drawable.ic_vanced + const val ICON_VANCED_YOUTUBE_MUSIC = R.drawable.ic_music + const val ICON_VANCED_MICROG = R.drawable.ic_microg + const val ICON_VANCED_MANAGER = R.drawable.ic_manager + + const val PACKAGE_VANCED_YOUTUBE = "com.vanced.android.youtube" + const val PACKAGE_VANCED_YOUTUBE_MUSIC = "com.vanced.android.youtube.apps.music" + const val PACKAGE_VANCED_MICROG = "com.mgoogle.android.gms" + const val PACKAGE_VANCED_MANAGER = "com.vanced.manager" + + const val PACKAGE_ROOT_VANCED_YOUTUBE = "com.google.android.youtube" + const val PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC = "com.google.android.youtube.apps.music" + + const val LAUNCH_ACTIVITY_VANCED_YOUTUBE = "com.google.android.youtube.HomeActivity" + const val LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC = + "com.google.android.apps.youtube.music.activities.MusicActivity" + const val LAUNCH_ACTIVITY_VANCED_MICROG = "org.microg.gms.ui.SettingsActivity" + const val LAUNCH_ACTIVITY_VANCED_MANAGER = "" +} + +enum class AppType { + VANCED_YOUTUBE, + VANCED_YOUTUBE_MUSIC, + VANCED_MICROG, + VANCED_MANAGER, +} + +enum class AppState { + NOT_INSTALLED, + INSTALLED, + NEEDS_UPDATE +} + + diff --git a/app/src/main/java/com/vanced/manager/domain/model/InstallationOption.kt b/app/src/main/java/com/vanced/manager/domain/model/InstallationOption.kt new file mode 100644 index 0000000000..0900856732 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/domain/model/InstallationOption.kt @@ -0,0 +1,34 @@ +package com.vanced.manager.domain.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +sealed interface InstallationOption : Parcelable { + + val titleId: Int + val items: List + + @Parcelize + data class MultiSelect( + override val titleId: Int, + override val items: List, + val getOption: () -> Set, + val addOption: (String) -> Unit, + val removeOption: (String) -> Unit + ) : InstallationOption + + @Parcelize + data class SingleSelect( + override val titleId: Int, + override val items: List, + val getOption: () -> String, + val setOption: (String) -> Unit, + ) : InstallationOption + +} + +@Parcelize +data class InstallationOptionItem( + val key: String, + val displayText: (key: String) -> String, +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/api/MicrogAPI.kt b/app/src/main/java/com/vanced/manager/downloader/api/MicrogAPI.kt new file mode 100644 index 0000000000..e379b85ce0 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/api/MicrogAPI.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.downloader.api + +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Streaming + +interface MicrogAPI { + + @GET("releases/latest/download/microg.apk") + @Streaming + fun getFile(): Call + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/api/MusicAPI.kt b/app/src/main/java/com/vanced/manager/downloader/api/MusicAPI.kt new file mode 100644 index 0000000000..9eece8b5c8 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/api/MusicAPI.kt @@ -0,0 +1,18 @@ +package com.vanced.manager.downloader.api + +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Streaming + +interface MusicAPI { + + @GET("music/v{version}/{variant}.apk") + @Streaming + fun getFiles( + @Path("version") version: String, + @Path("variant") variant: String, + ): Call + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/api/VancedAPI.kt b/app/src/main/java/com/vanced/manager/downloader/api/VancedAPI.kt new file mode 100644 index 0000000000..27ae1e3096 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/api/VancedAPI.kt @@ -0,0 +1,20 @@ +package com.vanced.manager.downloader.api + +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Streaming + +interface VancedAPI { + + @GET("apks/v{version}/{variant}/{type}/{apkName}") + @Streaming + fun getFiles( + @Path("version") version: String, + @Path("variant") variant: String, + @Path("type") type: String, + @Path("apkName") apkName: String, + ): Call + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/base/AppDownloader.kt b/app/src/main/java/com/vanced/manager/downloader/base/AppDownloader.kt new file mode 100644 index 0000000000..d808a566a2 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/base/AppDownloader.kt @@ -0,0 +1,67 @@ +package com.vanced.manager.downloader.base + +import com.vanced.manager.util.writeFile +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.awaitResponse + +abstract class AppDownloader { + + data class DownloadFile( + val fileName: String, + val call: Call, + ) + + sealed class DownloadStatus { + object Success : DownloadStatus() + data class Error(val error: String, val fileName: String) : DownloadStatus() + + val isSuccess + get() = this is Success + + val isError + get() = this is Error + } + + abstract suspend fun download( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus + + abstract suspend fun downloadRoot( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus + + abstract fun getSavedFilePath(): String + + suspend inline fun downloadFiles( + files: Array, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + for (file in files) { + try { + onFile(file.fileName) + + val response = file.call.awaitResponse() + if (response.isSuccessful) { + response.body()?.writeFile(getSavedFilePath() + "/${file.fileName}", onProgress) + continue + } + + val error = response.errorBody()?.toString() + if (error != null) { + return DownloadStatus.Error(error, file.fileName) + } + } catch (e: Exception) { + return DownloadStatus.Error(e.stackTraceToString(), file.fileName) + } + } + + return DownloadStatus.Success + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/impl/MicrogDownloader.kt b/app/src/main/java/com/vanced/manager/downloader/impl/MicrogDownloader.kt new file mode 100644 index 0000000000..bcadbb472b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/impl/MicrogDownloader.kt @@ -0,0 +1,52 @@ +package com.vanced.manager.downloader.impl + +import android.content.Context +import com.vanced.manager.downloader.api.MicrogAPI +import com.vanced.manager.downloader.base.AppDownloader +import com.vanced.manager.downloader.util.getMicrogPath +import java.io.File + +class MicrogDownloader( + private val microgAPI: MicrogAPI, + private val context: Context, +) : AppDownloader() { + + override suspend fun download( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + val downloadStatus = downloadFiles( + files = arrayOf( + DownloadFile( + call = microgAPI.getFile(), + fileName = "microg.apk" + ) + ), + onProgress = onProgress, + onFile = onFile + ) + if (downloadStatus.isError) + return downloadStatus + + return DownloadStatus.Success + } + + override suspend fun downloadRoot( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + throw IllegalAccessException("Vanced microG does not have a root downloader") + } + + override fun getSavedFilePath(): String { + val directory = File(getMicrogPath(context)) + + if (!directory.exists()) + directory.mkdirs() + + return directory.path + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/impl/MusicDownloader.kt b/app/src/main/java/com/vanced/manager/downloader/impl/MusicDownloader.kt new file mode 100644 index 0000000000..5c3b6c669f --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/impl/MusicDownloader.kt @@ -0,0 +1,63 @@ +package com.vanced.manager.downloader.impl + +import android.content.Context +import com.vanced.manager.downloader.api.MusicAPI +import com.vanced.manager.downloader.base.AppDownloader +import com.vanced.manager.downloader.util.getVancedYoutubeMusicPath +import com.vanced.manager.preferences.holder.managerVariantPref +import com.vanced.manager.preferences.holder.musicVersionPref +import com.vanced.manager.util.getLatestOrProvidedAppVersion +import java.io.File + +class MusicDownloader( + private val musicAPI: MusicAPI, + private val context: Context, +) : AppDownloader() { + + private lateinit var absoluteVersion: String + + override suspend fun download( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + absoluteVersion = getLatestOrProvidedAppVersion(musicVersionPref, appVersions) + + val downloadStatus = downloadFiles( + files = arrayOf( + DownloadFile( + call = musicAPI.getFiles( + version = absoluteVersion, + variant = managerVariantPref, + ), + fileName = "music.apk" + ) + ), + onProgress = onProgress, + onFile = onFile + ) + if (downloadStatus.isError) + return downloadStatus + + return DownloadStatus.Success + } + + override suspend fun downloadRoot( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + return DownloadStatus.Success + } + + override fun getSavedFilePath(): String { + val directory = + File(getVancedYoutubeMusicPath(absoluteVersion, managerVariantPref, context)) + + if (!directory.exists()) + directory.mkdirs() + + return directory.path + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/impl/VancedDownloader.kt b/app/src/main/java/com/vanced/manager/downloader/impl/VancedDownloader.kt new file mode 100644 index 0000000000..909baf318a --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/impl/VancedDownloader.kt @@ -0,0 +1,86 @@ +package com.vanced.manager.downloader.impl + +import android.content.Context +import com.vanced.manager.downloader.api.VancedAPI +import com.vanced.manager.downloader.base.AppDownloader +import com.vanced.manager.downloader.util.getVancedYoutubePath +import com.vanced.manager.preferences.holder.managerVariantPref +import com.vanced.manager.preferences.holder.vancedLanguagesPref +import com.vanced.manager.preferences.holder.vancedThemePref +import com.vanced.manager.preferences.holder.vancedVersionPref +import com.vanced.manager.util.arch +import com.vanced.manager.util.getLatestOrProvidedAppVersion +import java.io.File + +class VancedDownloader( + private val vancedAPI: VancedAPI, + private val context: Context, +) : AppDownloader() { + + private lateinit var absoluteVersion: String + + override suspend fun download( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) + + val files = arrayOf( + getFile( + type = "Theme", + apkName = "$vancedThemePref.apk", + ), + getFile( + type = "Arch", + apkName = "split_config.$arch.apk", + ) + ) + vancedLanguagesPref.map { language -> + getFile( + type = "Language", + apkName = "split_config.$language.apk", + ) + } + + val downloadStatus = downloadFiles( + files = files, + onProgress = onProgress, + onFile = onFile, + ) + if (downloadStatus.isError) + return downloadStatus + + return DownloadStatus.Success + } + + override suspend fun downloadRoot( + appVersions: List?, + onProgress: (Float) -> Unit, + onFile: (String) -> Unit + ): DownloadStatus { + return DownloadStatus.Success + } + + override fun getSavedFilePath(): String { + val directory = File(getVancedYoutubePath(absoluteVersion, managerVariantPref, context)) + + if (!directory.exists()) + directory.mkdirs() + + return directory.path + } + + private fun getFile( + type: String, + apkName: String, + ) = DownloadFile( + call = vancedAPI.getFiles( + version = absoluteVersion, + variant = managerVariantPref, + type = type, + apkName = apkName + ), + fileName = apkName + ) + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/downloader/util/DownloadPath.kt b/app/src/main/java/com/vanced/manager/downloader/util/DownloadPath.kt new file mode 100644 index 0000000000..50df4f5b6d --- /dev/null +++ b/app/src/main/java/com/vanced/manager/downloader/util/DownloadPath.kt @@ -0,0 +1,39 @@ +package com.vanced.manager.downloader.util + +import android.content.Context + +fun getVancedYoutubePath( + version: String, + variant: String, + context: Context +) = context.getExternalFilesDirPath("vanced_youtube") + "/$version/$variant" + +fun getVancedYoutubeMusicPath( + version: String, + variant: String, + context: Context +) = context.getExternalFilesDirPath("vanced_music") + "/$version/$variant" + +fun getMicrogPath( + context: Context +) = context.getExternalFilesDirPath("microg") + +fun getStockYoutubePath( + version: String, + context: Context +) = context.getExternalFilesDirPath("stock_youtube") + "/$version" + +fun getStockYoutubeMusicPath( + version: String, + context: Context +) = context.getExternalFilesDirPath("stock_youtube_music") + "/$version" + +private fun Context.getExternalFilesDirPath( + type: String +): String { + val filesDir = getExternalFilesDir(type)!! //fuck null safety, amirite? + if (!filesDir.exists()) + filesDir.mkdirs() + + return filesDir.path +} diff --git a/app/src/main/java/com/vanced/manager/installer/base/AppInstaller.kt b/app/src/main/java/com/vanced/manager/installer/base/AppInstaller.kt new file mode 100644 index 0000000000..771bf97bf4 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/base/AppInstaller.kt @@ -0,0 +1,11 @@ +package com.vanced.manager.installer.base + +import com.vanced.manager.repository.manager.PackageManagerResult + +abstract class AppInstaller { + + abstract suspend fun install(appVersions: List?) + + abstract suspend fun installRoot(appVersions: List?): PackageManagerResult + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/impl/MicrogInstaller.kt b/app/src/main/java/com/vanced/manager/installer/impl/MicrogInstaller.kt new file mode 100644 index 0000000000..599a0361e6 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/impl/MicrogInstaller.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.installer.impl + +import android.content.Context +import com.vanced.manager.downloader.util.getMicrogPath +import com.vanced.manager.installer.base.AppInstaller +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.PackageManagerResult +import java.io.File + +class MicrogInstaller( + private val context: Context, + private val nonrootPackageManager: NonrootPackageManager, +) : AppInstaller() { + + override suspend fun install(appVersions: List?) { + val musicApk = File(getMicrogPath(context), "microg.apk") + + nonrootPackageManager.installApp(musicApk) + } + + override suspend fun installRoot(appVersions: List?): PackageManagerResult { + throw IllegalAccessException("Vanced microG does not have a root installer") + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/impl/MusicInstaller.kt b/app/src/main/java/com/vanced/manager/installer/impl/MusicInstaller.kt new file mode 100644 index 0000000000..e2444fb944 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/impl/MusicInstaller.kt @@ -0,0 +1,68 @@ +package com.vanced.manager.installer.impl + +import android.content.Context +import com.vanced.manager.domain.model.AppData +import com.vanced.manager.downloader.util.getStockYoutubeMusicPath +import com.vanced.manager.downloader.util.getVancedYoutubeMusicPath +import com.vanced.manager.installer.base.AppInstaller +import com.vanced.manager.installer.util.RootPatchHelper +import com.vanced.manager.preferences.holder.managerVariantPref +import com.vanced.manager.preferences.holder.musicVersionPref +import com.vanced.manager.preferences.holder.vancedVersionPref +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.PackageManagerResult +import com.vanced.manager.repository.manager.RootPackageManager +import com.vanced.manager.util.getLatestOrProvidedAppVersion +import java.io.File + +class MusicInstaller( + private val context: Context, + private val rootPackageManager: RootPackageManager, + private val nonrootPackageManager: NonrootPackageManager, +) : AppInstaller() { + + override suspend fun install(appVersions: List?) { + val absoluteVersion = getLatestOrProvidedAppVersion(musicVersionPref, appVersions) + + val musicApk = File( + getVancedYoutubeMusicPath( + absoluteVersion, + managerVariantPref, + context + ) + "/music.apk" + ) + + nonrootPackageManager.installApp(musicApk) + } + + override suspend fun installRoot(appVersions: List?): PackageManagerResult { + val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) + + val stock = File(getStockYoutubeMusicPath(absoluteVersion, context), "base.apk") + val vanced = File(getVancedYoutubeMusicPath(absoluteVersion, "root", context), "base.apk") + + val prepareStock = RootPatchHelper.prepareStock( + stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC, + stockVersion = absoluteVersion + ) { + rootPackageManager.installApp(stock) + } + if (prepareStock.isError) + return prepareStock + + val patchStock = RootPatchHelper.patchStock( + patchPath = vanced.absolutePath, + stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC, + app = APP_KEY + ) + if (patchStock.isError) + return patchStock + + return PackageManagerResult.Success(null) + } + + companion object { + const val APP_KEY = "youtube_music_vanced" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/impl/VancedInstaller.kt b/app/src/main/java/com/vanced/manager/installer/impl/VancedInstaller.kt new file mode 100644 index 0000000000..cdbdf5afe7 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/impl/VancedInstaller.kt @@ -0,0 +1,61 @@ +package com.vanced.manager.installer.impl + +import android.content.Context +import com.vanced.manager.domain.model.AppData +import com.vanced.manager.downloader.util.getStockYoutubePath +import com.vanced.manager.downloader.util.getVancedYoutubePath +import com.vanced.manager.installer.base.AppInstaller +import com.vanced.manager.installer.util.RootPatchHelper +import com.vanced.manager.preferences.holder.vancedVersionPref +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.PackageManagerResult +import com.vanced.manager.repository.manager.RootPackageManager +import com.vanced.manager.util.getLatestOrProvidedAppVersion +import java.io.File + +class VancedInstaller( + private val context: Context, + private val rootPackageManager: RootPackageManager, + private val nonrootPackageManager: NonrootPackageManager, +) : AppInstaller() { + + override suspend fun install(appVersions: List?) { + val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) + + val apks = File(getVancedYoutubePath(absoluteVersion, "nonroot", context)) + .listFiles() + + nonrootPackageManager.installSplitApp(apks!!) + } + + override suspend fun installRoot(appVersions: List?): PackageManagerResult { + val absoluteVersion = getLatestOrProvidedAppVersion(vancedVersionPref, appVersions) + + val stockApks = File(getStockYoutubePath(absoluteVersion, context)) + .listFiles() + val vancedBaseApk = getVancedYoutubePath(absoluteVersion, "root", context) + "/base.apk" + + val prepareStock = RootPatchHelper.prepareStock( + stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE, + stockVersion = absoluteVersion, + ) { + rootPackageManager.installSplitApp(stockApks!!) + } + if (prepareStock.isError) + return prepareStock + + val patchStock = RootPatchHelper.patchStock( + patchPath = vancedBaseApk, + stockPackage = AppData.PACKAGE_ROOT_VANCED_YOUTUBE, + app = APP_KEY + ) + if (patchStock.isError) + return patchStock + + return PackageManagerResult.Success(null) + } + + companion object { + const val APP_KEY = "youtube_vanced" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/service/AppInstallService.kt b/app/src/main/java/com/vanced/manager/installer/service/AppInstallService.kt new file mode 100644 index 0000000000..3eb740e3a0 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/service/AppInstallService.kt @@ -0,0 +1,46 @@ +package com.vanced.manager.installer.service + +import android.app.Service +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.IBinder + +class AppInstallService : Service() { + + override fun onStartCommand( + intent: Intent, + flags: Int, + startId: Int + ): Int { + val extraStatus = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999) + val extraStatusMessage = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + when (extraStatus) { + PackageInstaller.STATUS_PENDING_USER_ACTION -> { + startActivity( + intent.getParcelableExtra(Intent.EXTRA_INTENT).apply { + this?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + ) + } + else -> { + sendBroadcast(Intent().apply { + action = APP_INSTALL_ACTION + putExtra(EXTRA_INSTALL_STATUS, extraStatus) + putExtra(EXTRA_INSTALL_STATUS_MESSAGE, extraStatusMessage) + }) + } + } + stopSelf() + return START_NOT_STICKY + } + + override fun onBind(intent: Intent?): IBinder? = null + + companion object { + const val APP_INSTALL_ACTION = "APP_INSTALL_ACTION" + + const val EXTRA_INSTALL_STATUS = "EXTRA_INSTALL_STATUS" + const val EXTRA_INSTALL_STATUS_MESSAGE = "EXTRA_INSTALL_STATUS_MESSAGE" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/service/AppUninstallService.kt b/app/src/main/java/com/vanced/manager/installer/service/AppUninstallService.kt new file mode 100644 index 0000000000..28c04fab7c --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/service/AppUninstallService.kt @@ -0,0 +1,39 @@ +package com.vanced.manager.installer.service + +import android.app.Service +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.IBinder + +class AppUninstallService : Service() { + + override fun onStartCommand( + intent: Intent, + flags: Int, + startId: Int + ): Int { + when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { + PackageInstaller.STATUS_PENDING_USER_ACTION -> { + startActivity( + intent.getParcelableExtra(Intent.EXTRA_INTENT).apply { + this?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + ) + } + else -> { + sendBroadcast(Intent().apply { + action = APP_UNINSTALL_ACTION + }) + } + } + stopSelf() + return START_NOT_STICKY + } + + override fun onBind(intent: Intent?): IBinder? = null + + companion object { + const val APP_UNINSTALL_ACTION = "APP_UNINSTALL_ACTION" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/util/PM.kt b/app/src/main/java/com/vanced/manager/installer/util/PM.kt new file mode 100644 index 0000000000..b60d06c754 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/util/PM.kt @@ -0,0 +1,81 @@ +package com.vanced.manager.installer.util + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import android.content.pm.PackageManager +import android.os.Build +import com.vanced.manager.installer.service.AppInstallService +import com.vanced.manager.installer.service.AppUninstallService +import java.io.File + +private const val byteArraySize = 1024 * 1024 // Because 1,048,576 is not readable + +object PM { + + fun installApp(apk: File, context: Context) { + val packageInstaller = context.packageManager.packageInstaller + val session = + packageInstaller.openSession(packageInstaller.createSession(sessionParams)) + session.writeApk(apk) + session.commit(context.installIntentSender) + session.close() + } + + fun installSplitApp(apks: Array, context: Context) { + val packageInstaller = context.packageManager.packageInstaller + val session = + packageInstaller.openSession(packageInstaller.createSession(sessionParams)) + for (apk in apks) { + session.writeApk(apk) + } + session.commit(context.installIntentSender) + session.close() + } + + fun uninstallPackage(pkg: String, context: Context) { + val packageInstaller = context.packageManager.packageInstaller + packageInstaller.uninstall(pkg, context.uninstallIntentSender) + } +} + +private fun PackageInstaller.Session.writeApk(apk: File) { + apk.inputStream().use { inputStream -> + openWrite(apk.name, 0, apk.length()).use { outputStream -> + inputStream.copyTo(outputStream, byteArraySize) + fsync(outputStream) + } + } +} + +private val intentFlags + get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + PendingIntent.FLAG_MUTABLE + else + 0 + +private val sessionParams + get() = PackageInstaller.SessionParams( + PackageInstaller.SessionParams.MODE_FULL_INSTALL + ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setInstallReason(PackageManager.INSTALL_REASON_USER) + } + } + +private val Context.installIntentSender + get() = PendingIntent.getService( + this, + 0, + Intent(this, AppInstallService::class.java), + intentFlags + ).intentSender + +private val Context.uninstallIntentSender + get() = PendingIntent.getService( + this, + 0, + Intent(this, AppUninstallService::class.java), + intentFlags + ).intentSender \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/util/PMRoot.kt b/app/src/main/java/com/vanced/manager/installer/util/PMRoot.kt new file mode 100644 index 0000000000..3332d69229 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/util/PMRoot.kt @@ -0,0 +1,165 @@ +package com.vanced.manager.installer.util + +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileOutputStream +import com.vanced.manager.repository.manager.PackageManagerResult +import com.vanced.manager.repository.manager.PackageManagerError +import com.vanced.manager.repository.manager.getEnumForInstallFailed +import com.vanced.manager.util.errString +import com.vanced.manager.util.outString +import java.io.File +import java.io.IOException + +object PMRoot { + + fun installApp(apkPath: String): PackageManagerResult { + val apk = File(apkPath) + val tmpApk = copyApkToTemp(apk).getOrElse { exception -> + return PackageManagerResult.Error( + PackageManagerError.SESSION_FAILED_COPY, + exception.stackTraceToString() + ) + } + + val install = Shell.su("pm", "install", "-r", tmpApk.absolutePath).exec() + + tmpApk.delete() + + if (!install.isSuccess) { + val errString = install.errString + return PackageManagerResult.Error(getEnumForInstallFailed(errString), errString) + } + + return PackageManagerResult.Success(null) + } + + fun installSplitApp(apkPaths: List): PackageManagerResult { + val installCreate = Shell.su("pm", "install-create", "-r").exec() + + if (!installCreate.isSuccess) + return PackageManagerResult.Error(PackageManagerError.SESSION_FAILED_CREATE, installCreate.errString) + + val sessionId = installCreate.outString + + if (sessionId.toIntOrNull() == null) + return PackageManagerResult.Error(PackageManagerError.SESSION_INVALID_ID, installCreate.errString) + + for (apkPath in apkPaths) { + val apk = File(apkPath) + val tmpApk = copyApkToTemp(apk).getOrElse { exception -> + return PackageManagerResult.Error( + PackageManagerError.SESSION_FAILED_COPY, + exception.stackTraceToString() + ) + } + + val installWrite = + Shell.su("pm", "install-write", sessionId, tmpApk.name, tmpApk.absolutePath) + .exec() + + tmpApk.delete() + + if (!installWrite.isSuccess) + return PackageManagerResult.Error(PackageManagerError.SESSION_FAILED_WRITE, installWrite.errString) + } + + val installCommit = Shell.su("pm", "install-commit", sessionId).exec() + + if (!installCommit.isSuccess) { + val errString = installCommit.errString + return PackageManagerResult.Error(getEnumForInstallFailed(errString), errString) + } + + return PackageManagerResult.Success(null) + } + + fun uninstallApp(pkg: String): PackageManagerResult { + val uninstall = Shell.su("pm", "uninstall", pkg).exec() + + if (!uninstall.isSuccess) + return PackageManagerResult.Error(PackageManagerError.UNINSTALL_FAILED, uninstall.errString) + + return PackageManagerResult.Success(null) + } + + fun setInstallerPackage(targetPkg: String, installerPkg: String): PackageManagerResult { + val setInstaller = Shell.su("pm", "set-installer", targetPkg, installerPkg) + .exec() + + if (!setInstaller.isSuccess) + return PackageManagerResult.Error( + PackageManagerError.SET_FAILED_INSTALLER, + setInstaller.errString + ) + + return PackageManagerResult.Success(null) + } + + fun forceStopApp(pkg: String): PackageManagerResult { + val stopApp = Shell.su("am", "force-stop", pkg).exec() + + if (!stopApp.isSuccess) + return PackageManagerResult.Error(PackageManagerError.APP_FAILED_FORCE_STOP, stopApp.errString) + + return PackageManagerResult.Success(null) + } + + fun getPackageVersionName(pkg: String): PackageManagerResult { + val keyword = "versionName=" + val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() + + if (!dumpsys.isSuccess) + return PackageManagerResult.Error( + PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, + dumpsys.errString + ) + + return PackageManagerResult.Success(dumpsys.outString.removePrefix(keyword)) + } + + fun getPackageVersionCode(pkg: String): PackageManagerResult { + val keyword = "versionCode=" + val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() + + if (!dumpsys.isSuccess) + return PackageManagerResult.Error( + PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, + dumpsys.errString + ) + + return PackageManagerResult.Success( + dumpsys.outString.removePrefix(keyword).substringAfter("minSdk") + .toLong() + ) + } + + fun getPackageDir(pkg: String): PackageManagerResult { + val keyword = "path: " + val dumpsys = Shell.su("dumpsys", "package", pkg, "|", "grep", keyword).exec() + + if (!dumpsys.isSuccess) + return PackageManagerResult.Error(PackageManagerError.GET_FAILED_PACKAGE_DIR, dumpsys.errString) + + return PackageManagerResult.Success(dumpsys.outString.removePrefix(keyword)) + } +} + +private fun copyApkToTemp(apk: File): Result { + val tmpPath = "/data/local/tmp/${apk.name}" + + val tmpApk = SuFile(tmpPath).apply { + createNewFile() + } + + try { + SuFileOutputStream.open(tmpApk).use { + it.write(apk.readBytes()) + it.flush() + } + } catch (e: IOException) { + return Result.failure(e) + } + + return Result.success(tmpApk) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/util/PMRootResult.kt b/app/src/main/java/com/vanced/manager/installer/util/PMRootResult.kt new file mode 100644 index 0000000000..975d383b79 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/util/PMRootResult.kt @@ -0,0 +1,59 @@ +package com.vanced.manager.installer.util + +enum class PMRootStatus { + ACTION_FAILED_SET_INSTALLER, + ACTION_FAILED_GET_PACKAGE_DIR, + ACTION_FAILED_GET_PACKAGE_VERSION_NAME, + ACTION_FAILED_GET_PACKAGE_VERSION_CODE, + ACTION_FAILED_FORCE_STOP_APP, + + INSTALL_SUCCESSFUL, + INSTALL_FAILED_ABORTED, + INSTALL_FAILED_ALREADY_EXISTS, + INSTALL_FAILED_CPU_ABI_INCOMPATIBLE, + INSTALL_FAILED_INSUFFICIENT_STORAGE, + INSTALL_FAILED_INVALID_APK, + INSTALL_FAILED_VERSION_DOWNGRADE, + INSTALL_FAILED_PARSE_NO_CERTIFICATES, + INSTALL_FAILED_UNKNOWN, + + LINK_FAILED_UNMOUNT, + LINK_FAILED_MOUNT, + + PATCH_FAILED_COPY, + PATCH_FAILED_CHMOD, + PATCH_FAILED_CHOWN, + PATCH_FAILED_CHCON, + PATCH_FAILED_DESTROY, + + SESSION_FAILED_CREATE, + SESSION_FAILED_WRITE, + SESSION_FAILED_COPY, + SESSION_INVALID_ID, + + SCRIPT_FAILED_SETUP_POST_FS, + SCRIPT_FAILED_SETUP_SERVICE_D, + SCRIPT_FAILED_DESTROY_POST_FS, + SCRIPT_FAILED_DESTROY_SERVICE_D, + + UNINSTALL_SUCCESSFUL, + UNINSTALL_FAILED, +} + +sealed class PMRootResult { + data class Success(val value: V? = null) : PMRootResult() + data class Error(val error: PMRootStatus, val message: String) : PMRootResult() + + val isError + get() = this is Error + + val isSuccess + get() = this is Success +} + +inline fun PMRootResult.getOrElse(onError: (PMRootResult.Error) -> R): R? { + return when (this) { + is PMRootResult.Error -> onError(this) + is PMRootResult.Success -> return this.value + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/util/Patcher.kt b/app/src/main/java/com/vanced/manager/installer/util/Patcher.kt new file mode 100644 index 0000000000..4e01a583fd --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/util/Patcher.kt @@ -0,0 +1,180 @@ +package com.vanced.manager.installer.util + +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileOutputStream +import com.vanced.manager.io.ManagerSuFile +import com.vanced.manager.io.SUIOException +import com.vanced.manager.repository.manager.PackageManagerResult +import com.vanced.manager.repository.manager.PackageManagerError +import com.vanced.manager.util.errString +import java.io.File +import java.io.IOException + +object Patcher { + + fun setupScript( + app: String, + stockPackage: String, + stockPath: String, + ): PackageManagerResult { + val postFsDataScriptPath = getAppPostFsScriptPath(app) + val serviceDScriptPath = getAppServiceDScriptPath(app) + + val postFsDataScript = getPostFsDataScript(stockPackage) + val serviceDScript = getServiceDScript(getAppPatchPath(app), stockPath) + + val copyServiceDScript = copyScriptToDestination(postFsDataScript, postFsDataScriptPath) + if (copyServiceDScript.isFailure) + return PackageManagerResult.Error( + PackageManagerError.SCRIPT_FAILED_SETUP_POST_FS, + copyServiceDScript.exceptionOrNull()!!.stackTraceToString() + ) + + val copyPostFsDataScript = copyScriptToDestination(serviceDScript, serviceDScriptPath) + if (copyPostFsDataScript.isFailure) + return PackageManagerResult.Error( + PackageManagerError.SCRIPT_FAILED_SETUP_SERVICE_D, + copyPostFsDataScript.exceptionOrNull()!!.stackTraceToString() + ) + + return PackageManagerResult.Success(null) + } + + fun movePatchToDataAdb(patchPath: String, app: String): PackageManagerResult { + val newPatchPath = getAppPatchPath(app) + + val patchApk = File(patchPath) + val newPatchApk = SuFile(newPatchPath).apply { + if (exists()) + delete() + + createNewFile() + } + + try { + patchApk.copyTo(newPatchApk) + } catch (e: IOException) { + return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_COPY, e.stackTraceToString()) + } + + val chmod = Shell.su("chmod", "644", newPatchPath).exec() + if (!chmod.isSuccess) + return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHMOD, chmod.errString) + + val chown = Shell.su("chown", "system:system", newPatchPath).exec() + if (!chmod.isSuccess) + return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHOWN, chown.errString) + + return PackageManagerResult.Success(null) + } + + fun chconPatch(app: String): PackageManagerResult { + val chcon = Shell.su("chcon u:object_r:apk_data_file:s0 ${getAppPatchPath(app)}").exec() + if (!chcon.isSuccess) + return PackageManagerResult.Error(PackageManagerError.PATCH_FAILED_CHCON, chcon.errString) + + return PackageManagerResult.Success(null) + } + + fun linkPatch(app: String, stockPackage: String, stockPath: String): PackageManagerResult { + val umount = + Shell.su("""for i in ${'$'}(ls /data/app/ | grep $stockPackage | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """) + .exec() + if (!umount.isSuccess) + return PackageManagerResult.Error(PackageManagerError.LINK_FAILED_UNMOUNT, umount.errString) + + val mount = + Shell.su("su", "-mm", "-c", """"mount -o bind ${getAppPatchPath(app)} $stockPath"""") + .exec() + if (!mount.isSuccess) + return PackageManagerResult.Error(PackageManagerError.LINK_FAILED_MOUNT, mount.errString) + + return PackageManagerResult.Success(null) + } + + fun destroyPatch(app: String) = + cleanPatchFiles( + postFsPath = getAppPostFsScriptPath(app), + serviceDPath = getAppServiceDScriptPath(app), + patchPath = getAppPatchPath(app) + ) + + //TODO + fun destroyOldPatch(app: String) = + cleanPatchFiles( + postFsPath = "", + serviceDPath = "", + patchPath = "" + ) +} + +private fun getAppPatchPath(app: String) = "${getAppPatchFolderPath(app)}/base.apk" +private fun getAppPatchFolderPath(app: String) = "/data/adb/vanced_manager/$app" +private fun getAppPostFsScriptPath(app: String) = "/data/adb/post-fs-data.d/$app.sh" +private fun getAppServiceDScriptPath(app: String) = "/data/adb/service.d/$app.sh" + +//TODO support dynamic sleep timer +private fun getServiceDScript(patchPath: String, stockPath: String) = + """ + #!/system/bin/sh + while [ "${'$'}(getprop sys.boot_completed | tr -d '\r')" != "1" ]; do sleep 1; done + sleep 1 + chcon u:object_r:apk_data_file:s0 $patchPath + mount -o bind $patchPath $stockPath + """.trimIndent() + +private fun getPostFsDataScript(stockPackage: String) = + """ + #!/system/bin/sh + while read line; do echo \${'$'}{line} | grep $stockPackage | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts + """.trimIndent() + +private fun cleanPatchFiles( + postFsPath: String, + serviceDPath: String, + patchPath: String, +): PackageManagerResult { + val files = mapOf( + postFsPath to PackageManagerError.SCRIPT_FAILED_DESTROY_POST_FS, + serviceDPath to PackageManagerError.SCRIPT_FAILED_DESTROY_SERVICE_D, + patchPath to PackageManagerError.PATCH_FAILED_DESTROY, + ) + + for ((filePath, errorStatusType) in files) { + try { + with(ManagerSuFile(filePath)) { + if (exists()) delete() + } + } catch (e: SUIOException) { + return PackageManagerResult.Error(errorStatusType, e.stackTraceToString()) + } + } + + return PackageManagerResult.Success(null) +} + +private fun copyScriptToDestination( + script: String, + destination: String, +): Result { + val scriptFile = SuFile(destination) + .apply { + if (!exists()) createNewFile() + } + + try { + SuFileOutputStream.open(scriptFile).use { + it.write(script.toByteArray()) + it.flush() + } + val chmod = Shell.su("chmod", "744", scriptFile.absolutePath).exec() + if (!chmod.isSuccess) { + return Result.failure(Exception(chmod.errString)) + } + } catch (e: IOException) { + return Result.failure(e) + } + + return Result.success(null) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/installer/util/RootPatchHelper.kt b/app/src/main/java/com/vanced/manager/installer/util/RootPatchHelper.kt new file mode 100644 index 0000000000..04ec578a2c --- /dev/null +++ b/app/src/main/java/com/vanced/manager/installer/util/RootPatchHelper.kt @@ -0,0 +1,67 @@ +package com.vanced.manager.installer.util + +import com.vanced.manager.repository.manager.PackageManagerResult +import com.vanced.manager.repository.manager.getOrElse + +object RootPatchHelper { + + fun cleanPatches(app: String): PackageManagerResult { + val cleanOldPatches = Patcher.destroyOldPatch(app) + if (cleanOldPatches.isError) + return cleanOldPatches + + val cleanPatches = Patcher.destroyPatch(app) + if (cleanOldPatches.isError) + return cleanPatches + + return PackageManagerResult.Success(null) + } + + inline fun prepareStock( + stockPackage: String, + stockVersion: String, + install: () -> PackageManagerResult + ): PackageManagerResult { + val stockYoutubeVersion = PMRoot.getPackageVersionName(stockPackage) + .getOrElse { null } + if (stockYoutubeVersion != stockVersion) { + val uninstallStock = PMRoot.uninstallApp(stockPackage) + if (uninstallStock.isError) + return uninstallStock + + val installStock = install() + if (installStock.isError) + return installStock + } + + return PackageManagerResult.Success(null) + } + + fun patchStock( + patchPath: String, + stockPackage: String, + app: String + ): PackageManagerResult { + val movePatch = Patcher.movePatchToDataAdb(patchPath, app) + if (movePatch.isError) + return movePatch + + val chconPatch = Patcher.chconPatch(app) + if (chconPatch.isError) + return chconPatch + + val stockPackageDir = PMRoot.getPackageDir(stockPackage) + .getOrElse { error -> return error }!! + + val setupScript = Patcher.setupScript(app, stockPackage, stockPackageDir) + if (setupScript is PackageManagerResult.Error) + return setupScript + + val linkPatch = Patcher.linkPatch(app, stockPackage, stockPackageDir) + if (linkPatch is PackageManagerResult.Error) + return linkPatch + + return PackageManagerResult.Success(null) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/io/ManagerSuFile.kt b/app/src/main/java/com/vanced/manager/io/ManagerSuFile.kt new file mode 100644 index 0000000000..f0f7ce83f2 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/io/ManagerSuFile.kt @@ -0,0 +1,35 @@ +package com.vanced.manager.io + +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.io.SuFile +import com.vanced.manager.util.errString +import com.vanced.manager.util.outString +import java.io.File + +class ManagerSuFile : SuFile { + + sealed class SuFileResult { + data class Success(val output: String) : SuFileResult() + data class Error(val error: String) : SuFileResult() + } + + constructor(pathName: String) : super(pathName) + constructor(parent: String, child: String) : super(parent, child) + constructor(parent: File, child: String) : super(parent, child) + + private fun cmd(input: String): SuFileResult { + val cmd = Shell.su(input.replace("@@", escapedPath)).exec() + if (!cmd.isSuccess) + return SuFileResult.Error(cmd.errString) + + return SuFileResult.Success(cmd.outString) + } + + override fun delete(): Boolean { + val result = cmd("rm -f @@ || rmdir -f @@") + if (result is SuFileResult.Error) + throw SUIOException(result.error) + + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/io/SUIOException.kt b/app/src/main/java/com/vanced/manager/io/SUIOException.kt new file mode 100644 index 0000000000..1f73c8fb08 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/io/SUIOException.kt @@ -0,0 +1,9 @@ +package com.vanced.manager.io + +import java.io.IOException + +class SUIOException : IOException { + constructor(message: String) : super(message) + constructor(message: String, cause: Throwable) : super(message, cause) + constructor(cause: Throwable) : super(cause) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/AppListModel.kt b/app/src/main/java/com/vanced/manager/model/AppListModel.kt deleted file mode 100644 index b08928882c..0000000000 --- a/app/src/main/java/com/vanced/manager/model/AppListModel.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.vanced.manager.model - -import android.graphics.drawable.Drawable - -data class AppListModel( - val icon: Drawable?, - val appName: String?, - val remoteVersion: String?, - val installedVersion: String?, - val changelog: String?, - val pkg: String? -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/AppVersionsModel.kt b/app/src/main/java/com/vanced/manager/model/AppVersionsModel.kt deleted file mode 100644 index 37e12d1fcd..0000000000 --- a/app/src/main/java/com/vanced/manager/model/AppVersionsModel.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.vanced.manager.model - -data class AppVersionsModel( - val version: String, - val value: String -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/ButtonTag.kt b/app/src/main/java/com/vanced/manager/model/ButtonTag.kt deleted file mode 100644 index 602c50884f..0000000000 --- a/app/src/main/java/com/vanced/manager/model/ButtonTag.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.vanced.manager.model - -enum class ButtonTag { - INSTALL, UPDATE, REINSTALL -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/DataModel.kt b/app/src/main/java/com/vanced/manager/model/DataModel.kt deleted file mode 100644 index 64018dc75e..0000000000 --- a/app/src/main/java/com/vanced/manager/model/DataModel.kt +++ /dev/null @@ -1,110 +0,0 @@ -package com.vanced.manager.model - -import android.content.Context -import android.graphics.drawable.Drawable -import android.os.Build -import androidx.annotation.DrawableRes -import androidx.core.content.ContextCompat -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import com.beust.klaxon.JsonObject -import com.vanced.manager.R -import com.vanced.manager.utils.PackageHelper.isPackageInstalled - -open class DataModel( - private val jsonObject: LiveData, - private val context: Context, - lifecycleOwner: LifecycleOwner, - val appPkg: String, - val appName: String, - val appDescription: String, - @DrawableRes val appIcon: Int -) { - - private val versionCode = MutableLiveData() - private val installedVersionCode = MutableLiveData() - private val unavailable = context.getString(R.string.unavailable) - private val pm = context.packageManager - - val isAppInstalled = MutableLiveData() - val versionName = MutableLiveData() - val installedVersionName = MutableLiveData() - val buttonTag = MutableLiveData() - val buttonImage = MutableLiveData() - val changelog = MutableLiveData() - - private fun fetch() { - val jobj = jsonObject.value - isAppInstalled.value = isAppInstalled(appPkg) - versionCode.value = jobj?.int("versionCode") ?: 0 - versionName.value = jobj?.string("version") ?: unavailable - changelog.value = jobj?.string("changelog") ?: unavailable - } - - init { - fetch() - with(lifecycleOwner) { - jsonObject.observe(this) { - fetch() - } - isAppInstalled.observe(this) { - installedVersionCode.value = getPkgVersionCode(appPkg, it) - installedVersionName.value = getPkgVersionName(appPkg, it) - } - versionCode.observe(this) { versionCode -> - installedVersionCode.observe(this) { installedVersionCode -> - buttonTag.value = compareInt(installedVersionCode, versionCode) - buttonImage.value = compareIntDrawable(installedVersionCode, versionCode) - } - } - } - } - - open fun isAppInstalled(pkg: String): Boolean = isPackageInstalled(pkg, context.packageManager) - - private fun getPkgVersionName(pkg: String, isAppInstalled: Boolean): String { - return if (isAppInstalled) { - pm?.getPackageInfo(pkg, 0)?.versionName?.removeSuffix("-vanced") ?: unavailable - } else { - unavailable - } - } - - @Suppress("DEPRECATION") - private fun getPkgVersionCode(pkg: String, isAppInstalled: Boolean): Int { - return if (isAppInstalled) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - pm?.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() ?: 0 - else - pm?.getPackageInfo(pkg, 0)?.versionCode ?: 0 - - } else { - 0 - } - } - - private fun compareInt(int1: Int?, int2: Int?): ButtonTag { - if (int2 != null && int1 != null) { - return when { - int1 == 0 -> ButtonTag.INSTALL - int2 > int1 -> ButtonTag.UPDATE - int1 >= int2 -> ButtonTag.REINSTALL - else -> ButtonTag.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)!! - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/LinkModel.kt b/app/src/main/java/com/vanced/manager/model/LinkModel.kt deleted file mode 100644 index 3c370ffa01..0000000000 --- a/app/src/main/java/com/vanced/manager/model/LinkModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.vanced.manager.model - -import android.graphics.drawable.Drawable - -data class LinkModel( - val linkIcon: Drawable?, - val linkUrl: String -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/NotifModel.kt b/app/src/main/java/com/vanced/manager/model/NotifModel.kt deleted file mode 100644 index 1b302f4592..0000000000 --- a/app/src/main/java/com/vanced/manager/model/NotifModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.vanced.manager.model - -data class NotifModel( - val topic: String, - val switchTitle: String, - val switchSummary: String, - val key: String -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt deleted file mode 100644 index fc2cc4e898..0000000000 --- a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.vanced.manager.model - -import android.content.Context -import androidx.annotation.DrawableRes -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LiveData -import com.beust.klaxon.JsonObject -import com.vanced.manager.utils.PackageHelper - -class RootDataModel( - jsonObject: LiveData, - context: Context, - lifecycleOwner: LifecycleOwner, - appPkg: String, - appName: String, - appDescription: String, - @DrawableRes appIcon: Int, - //BUG THIS! - //kotlin thinks that this value is null if we use - //private val scriptName: String - //Although it's impossible for it to be null. - //Ironic, isn't it? - private val scriptName: String? -) : DataModel( - jsonObject, context, lifecycleOwner, appPkg, appName, appDescription, appIcon -) { - - override fun isAppInstalled(pkg: String): Boolean { - //Adapt to nullable shit - return if (scriptName?.let { PackageHelper.scriptExists(it) } == true) { - super.isAppInstalled(appPkg) - } else { - false - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/SelectAppModel.kt b/app/src/main/java/com/vanced/manager/model/SelectAppModel.kt deleted file mode 100644 index 18117db126..0000000000 --- a/app/src/main/java/com/vanced/manager/model/SelectAppModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.vanced.manager.model - -data class SelectAppModel( - val appName: String, - val appDescription: String, - val tag: String, - var isChecked: Boolean -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/SponsorModel.kt b/app/src/main/java/com/vanced/manager/model/SponsorModel.kt deleted file mode 100644 index 4468a3cdc8..0000000000 --- a/app/src/main/java/com/vanced/manager/model/SponsorModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.vanced.manager.model - -import android.graphics.drawable.Drawable - -data class SponsorModel( - val logo: Drawable?, - val name: String, - val url: String -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/model/VancedPrefModel.kt b/app/src/main/java/com/vanced/manager/model/VancedPrefModel.kt deleted file mode 100644 index 4f155b433f..0000000000 --- a/app/src/main/java/com/vanced/manager/model/VancedPrefModel.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.vanced.manager.model - -data class VancedPrefModel( - val name: String, - val value: String -) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/GithubService.kt b/app/src/main/java/com/vanced/manager/network/GithubService.kt new file mode 100644 index 0000000000..6927d45e8c --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/GithubService.kt @@ -0,0 +1,22 @@ +package com.vanced.manager.network + +import com.vanced.manager.network.dto.GithubReleaseDto +import retrofit2.http.GET + +private const val REPOS_VANCED = "repos/YTVanced" + +interface GithubService { + + @GET("$REPOS_VANCED/Vanced/releases/latest") + suspend fun getVancedYoutubeRelease(): GithubReleaseDto + + @GET("$REPOS_VANCED/VancedMusic/releases/latest") + suspend fun getVancedYoutubeMusicRelease(): GithubReleaseDto + + @GET("$REPOS_VANCED/VancedMicrog/releases/latest") + suspend fun getVancedMicrogRelease(): GithubReleaseDto + + @GET("$REPOS_VANCED/VancedManager/releases/latest") + suspend fun getVancedManagerRelease(): GithubReleaseDto + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/dto/GithubDto.kt b/app/src/main/java/com/vanced/manager/network/dto/GithubDto.kt new file mode 100644 index 0000000000..c9ced164ce --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/dto/GithubDto.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.network.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GithubReleaseDto( + @SerialName("tag_name") + val tagName: String, + + @SerialName("body") + val body: String, + + @SerialName("assets") + val assets: List +) + +@Serializable +data class GithubReleaseAssetDto( + @SerialName("name") + val name: String, + + @SerialName("browser_download_url") + val browserDownloadUrl: String +) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/network/util/Constants.kt b/app/src/main/java/com/vanced/manager/network/util/Constants.kt new file mode 100644 index 0000000000..deed27c078 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/network/util/Constants.kt @@ -0,0 +1,21 @@ +package com.vanced.manager.network.util + +const val BASE = "https://api.vancedapp.com/api/v1/" + +const val GITHUB_API_BASE = "https://api.github.com/" + +const val VANCED_NAME = "YouTube Vanced" +const val MUSIC_NAME = "YouTube Vanced Music" +const val MICROG_NAME = "Vanced microG" + +const val URL_SPONSOR_BRAVE = "https://vancedapp.com/brave" +const val URL_SPONSOR_ADGUARD = "https://adguard.com/?aid=31141&source=manager" + +const val URL_MEDIA_INSTAGRAM = "https://instagram.com/vanced.youtube" +const val URL_MEDIA_YOUTUBE = "https://youtube.com/c/YouTubeVanced" +const val URL_MEDIA_GITHUB = "https://github.com/YTVanced/VancedManager" +const val URL_MEDIA_WEBSITE = "https://vancedapp.com" +const val URL_MEDIA_TELEGRAM = "https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w" +const val URL_MEDIA_TWITTER = "https://twitter.com/YTVanced" +const val URL_MEDIA_DISCORD = "https://discord.gg/WCGNdRruzb" +const val URL_MEDIA_REDDIT = "https://www.reddit.com/r/Vanced/" \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/preferences/ManagerPreference.kt b/app/src/main/java/com/vanced/manager/preferences/ManagerPreference.kt new file mode 100644 index 0000000000..064db582be --- /dev/null +++ b/app/src/main/java/com/vanced/manager/preferences/ManagerPreference.kt @@ -0,0 +1,90 @@ +package com.vanced.manager.preferences + +import android.content.SharedPreferences +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.core.content.edit +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject +import kotlin.reflect.KProperty + +fun managerStringPreference( + key: String, + defaultValue: String = "" +) = ManagerPreference( + key = key, + defaultValue = defaultValue, + getter = SharedPreferences::getString, + setter = SharedPreferences.Editor::putString +) + +fun managerStringSetPreference( + key: String, + defaultValue: Set = setOf() +) = ManagerPreference( + key = key, + defaultValue = defaultValue, + getter = SharedPreferences::getStringSet, + setter = SharedPreferences.Editor::putStringSet +) + +fun managerBooleanPreference( + key: String, + defaultValue: Boolean = false +) = ManagerPreference( + key = key, + defaultValue = defaultValue, + getter = SharedPreferences::getBoolean, + setter = SharedPreferences.Editor::putBoolean +) + +fun managerIntPreference( + key: String, + defaultValue: Int = 0 +) = ManagerPreference( + key = key, + defaultValue = defaultValue, + getter = SharedPreferences::getInt, + setter = SharedPreferences.Editor::putInt +) + +fun managerLongPreference( + key: String, + defaultValue: Long = 0 +) = ManagerPreference( + key = key, + defaultValue = defaultValue, + getter = SharedPreferences::getLong, + setter = SharedPreferences.Editor::putLong +) + +class ManagerPreference( + private val key: String, + private val defaultValue: T, + private val getter: SharedPreferences.(key: String, defaultValue: T) -> T?, + private val setter: SharedPreferences.Editor.(key: String, newValue: T) -> Unit +) : KoinComponent { + + private val sharedPreferences: SharedPreferences by inject() + + var value by mutableStateOf(sharedPreferences.getter(key, defaultValue) ?: defaultValue) + private set + + operator fun getValue( + thisRef: Any?, + property: KProperty<*> + ) = value + + operator fun setValue( + thisRef: Any?, + property: KProperty<*>, + newValue: T + ) { + value = newValue + sharedPreferences.edit { + setter(key, newValue) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceDefaultValueHolder.kt b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceDefaultValueHolder.kt new file mode 100644 index 0000000000..cb209aa519 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceDefaultValueHolder.kt @@ -0,0 +1,12 @@ +package com.vanced.manager.preferences.holder + +const val MANAGER_VARIANT_DEFAULT_VALUE = "nonroot" + +const val MANAGER_THEME_DEFAULT_VALUE = "System Default" + +const val VANCED_THEME_DEFAULT_VALUE = "dark" +val VANCED_LANGUAGE_DEFAULT_VALUE = setOf("en") + +const val APP_VERSION_DEFAULT_VALUE = "latest" + +const val APP_ENABLED_DEFAULT_VALUE = true \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceHolder.kt b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceHolder.kt new file mode 100644 index 0000000000..bc000f9d18 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceHolder.kt @@ -0,0 +1,18 @@ +package com.vanced.manager.preferences.holder + +import com.vanced.manager.preferences.managerStringPreference +import com.vanced.manager.preferences.managerStringSetPreference + +var managerVariantPref by managerStringPreference( + MANAGER_VARIANT_KEY, + MANAGER_VARIANT_DEFAULT_VALUE +) + +var vancedThemePref by managerStringPreference(APP_VANCED_THEME_KEY, VANCED_THEME_DEFAULT_VALUE) +var vancedVersionPref by managerStringPreference(APP_VANCED_VERSION_KEY, APP_VERSION_DEFAULT_VALUE) +var vancedLanguagesPref by managerStringSetPreference( + APP_VANCED_LANGUAGE_KEY, + VANCED_LANGUAGE_DEFAULT_VALUE +) + +var musicVersionPref by managerStringPreference(APP_MUSIC_VERSION_KEY, APP_VERSION_DEFAULT_VALUE) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceKeyHolder.kt b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceKeyHolder.kt new file mode 100644 index 0000000000..c24886805e --- /dev/null +++ b/app/src/main/java/com/vanced/manager/preferences/holder/PreferenceKeyHolder.kt @@ -0,0 +1,16 @@ +package com.vanced.manager.preferences.holder + +const val USE_CUSTOM_TABS_KEY = "use_custom_tabs" +const val MANAGER_VARIANT_KEY = "manager_variant" + +const val MANAGER_THEME_KEY = "manager_theme" +const val MANAGER_ACCENT_COLOR_KEY = "manager_accent_color" + +const val APP_VANCED_THEME_KEY = "app_vanced_theme" +const val APP_VANCED_VERSION_KEY = "app_vanced_version" +const val APP_VANCED_LANGUAGE_KEY = "app_vanced_language" + +const val APP_MUSIC_VERSION_KEY = "app_music_version" + +const val VANCED_ENABLED_KEY = "manager_vanced_enabled" +const val MUSIC_ENABLED_KEY = "manager_music_enabled" \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/AppRepository.kt b/app/src/main/java/com/vanced/manager/repository/AppRepository.kt new file mode 100644 index 0000000000..5c96efce77 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/AppRepository.kt @@ -0,0 +1,187 @@ +package com.vanced.manager.repository + +import com.vanced.manager.domain.model.App +import com.vanced.manager.domain.model.AppData +import com.vanced.manager.domain.model.AppState +import com.vanced.manager.domain.model.AppType +import com.vanced.manager.network.GithubService +import com.vanced.manager.network.dto.GithubReleaseDto +import com.vanced.manager.repository.manager.NonrootPackageManager +import com.vanced.manager.repository.manager.PackageManager +import com.vanced.manager.repository.manager.RootPackageManager + +interface AppRepository { + + suspend fun getVancedYoutubeNonroot(): App + + suspend fun getVancedYoutubeRoot(): App + + suspend fun getVancedYoutubeMusicNonroot(): App + + suspend fun getVancedYoutubeMusicRoot(): App + + suspend fun getVancedMicrog(): App + + suspend fun getVancedManager(): App + +} + +class AppRepositoryImpl( + private val githubService: GithubService, + private val nonrootPackageManager: NonrootPackageManager, + private val rootPackageManager: RootPackageManager, +) : AppRepository { + + override suspend fun getVancedYoutubeNonroot(): App { + val githubRelease = githubService.getVancedYoutubeRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_YOUTUBE).getValueOrNull() + val installedVersionName = + nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_YOUTUBE).getValueOrNull() + return App( + name = AppData.NAME_VANCED_YOUTUBE, + iconResId = AppData.ICON_VANCED_YOUTUBE, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_YOUTUBE, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_YOUTUBE, + ) + } + + override suspend fun getVancedYoutubeRoot(): App { + val githubRelease = githubService.getVancedYoutubeRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + rootPackageManager.getVersionCode(AppData.PACKAGE_ROOT_VANCED_YOUTUBE).getValueOrNull() + val installedVersionName = + rootPackageManager.getVersionName(AppData.PACKAGE_ROOT_VANCED_YOUTUBE).getValueOrNull() + return App( + name = AppData.NAME_VANCED_YOUTUBE, + iconResId = AppData.ICON_VANCED_YOUTUBE, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_YOUTUBE, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_YOUTUBE, + ) + } + + override suspend fun getVancedYoutubeMusicNonroot(): App { + val githubRelease = githubService.getVancedYoutubeMusicRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_YOUTUBE_MUSIC).getValueOrNull() + val installedVersionName = + nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_YOUTUBE_MUSIC).getValueOrNull() + return App( + name = AppData.NAME_VANCED_YOUTUBE_MUSIC, + iconResId = AppData.ICON_VANCED_YOUTUBE_MUSIC, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_YOUTUBE_MUSIC, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_YOUTUBE_MUSIC, + ) + } + + override suspend fun getVancedYoutubeMusicRoot(): App { + val githubRelease = githubService.getVancedYoutubeMusicRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + rootPackageManager.getVersionCode(AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC).getValueOrNull() + val installedVersionName = + rootPackageManager.getVersionName(AppData.PACKAGE_ROOT_VANCED_YOUTUBE_MUSIC).getValueOrNull() + return App( + name = AppData.NAME_VANCED_YOUTUBE_MUSIC, + iconResId = AppData.ICON_VANCED_YOUTUBE_MUSIC, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_YOUTUBE_MUSIC, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_YOUTUBE_MUSIC, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_YOUTUBE_MUSIC, + ) + } + + override suspend fun getVancedMicrog(): App { + val githubRelease = githubService.getVancedMicrogRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_MICROG).getValueOrNull() + val installedVersionName = + nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_MICROG).getValueOrNull() + return App( + name = AppData.NAME_VANCED_MICROG, + iconResId = AppData.ICON_VANCED_MICROG, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_MICROG, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_MICROG, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_MICROG, + ) + } + + override suspend fun getVancedManager(): App { + val githubRelease = githubService.getVancedManagerRelease() + val remoteVersionCode = githubRelease.getVersionCode() + val remoteVersionName = githubRelease.getVersionName() + val installedVersionCode = + nonrootPackageManager.getVersionCode(AppData.PACKAGE_VANCED_MANAGER).getValueOrNull() + val installedVersionName = + nonrootPackageManager.getVersionName(AppData.PACKAGE_VANCED_MANAGER).getValueOrNull() + return App( + name = AppData.NAME_VANCED_MANAGER, + iconResId = AppData.ICON_VANCED_MANAGER, + changelog = githubRelease.body, + remoteVersionCode = remoteVersionCode, + remoteVersionName = remoteVersionName, + installedVersionCode = installedVersionCode, + installedVersionName = installedVersionName, + packageName = AppData.PACKAGE_VANCED_MANAGER, + launchActivity = AppData.LAUNCH_ACTIVITY_VANCED_MANAGER, + state = getNoonrotAppState(installedVersionCode, remoteVersionCode), + app = AppType.VANCED_MANAGER, + ) + } + + private fun getNoonrotAppState( + installedVersionCode: Int?, + remoteVersionCode: Int + ): AppState { + return when { + installedVersionCode == null -> AppState.NOT_INSTALLED + installedVersionCode < remoteVersionCode -> AppState.NEEDS_UPDATE + installedVersionCode >= remoteVersionCode -> AppState.INSTALLED + else -> AppState.NOT_INSTALLED + } + } + + private fun GithubReleaseDto.getVersionCode() = tagName.substringAfter("-").toInt() + private fun GithubReleaseDto.getVersionName() = tagName.substringBefore("-") +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/PreferenceRepository.kt b/app/src/main/java/com/vanced/manager/repository/PreferenceRepository.kt new file mode 100644 index 0000000000..b4140d19c6 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/PreferenceRepository.kt @@ -0,0 +1,77 @@ +package com.vanced.manager.repository + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import com.vanced.manager.repository.source.PreferenceData +import com.vanced.manager.repository.source.PreferenceDatasource + +interface PreferenceRepository { + + var managerUseCustomTabs: Boolean + var managerMode: ManagerMode + var managerTheme: ManagerTheme + +} + +class PreferenceRepositoryImpl( + private val preferenceDatasource: PreferenceDatasource +) : PreferenceRepository { + + override var managerUseCustomTabs: Boolean + get() = preferenceDatasource.managerUseCustomTabs + set(value) { + preferenceDatasource.managerUseCustomTabs = value + } + + override var managerMode: ManagerMode + get() = ManagerMode.fromValue(preferenceDatasource.managerMode) + set(value) { + preferenceDatasource.managerMode = value.value + } + + override var managerTheme: ManagerTheme + get() = ManagerTheme.fromValue(preferenceDatasource.managerTheme) + set(value) { + preferenceDatasource.managerTheme = value.value + } + +} + + +enum class ManagerTheme(val value: String) { + LIGHT(PreferenceData.MANAGER_THEME_VALUE_LIGHT), + DARK(PreferenceData.MANAGER_THEME_VALUE_DARK), + SYSTEM_DEFAULT(PreferenceData.MANAGER_THEME_VALUE_SYSTEM_DEFAULT); + + @Composable + fun isDark() = when (this) { + LIGHT -> false + DARK -> true + SYSTEM_DEFAULT -> isSystemInDarkTheme() + } + + companion object { + fun fromValue(value: String?): ManagerTheme { + return values().find { + it.value == value + } ?: SYSTEM_DEFAULT + } + } +} + +enum class ManagerMode(val value: String) { + ROOT(PreferenceData.MANAGER_MODE_VALUE_ROOT), + NONROOT(PreferenceData.MANAGER_MODE_VALUE_NONROOT); + + val isRoot get() = this == ROOT + val isNonroot get() = this == NONROOT + + companion object { + fun fromValue(value: String?): ManagerMode { + return when (value) { + "root" -> ROOT + else -> NONROOT + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/manager/PackageManager.kt b/app/src/main/java/com/vanced/manager/repository/manager/PackageManager.kt new file mode 100644 index 0000000000..c795c80521 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/manager/PackageManager.kt @@ -0,0 +1,489 @@ +package com.vanced.manager.repository.manager + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.Build +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileInputStream +import com.topjohnwu.superuser.io.SuFileOutputStream +import com.vanced.manager.installer.service.AppInstallService +import com.vanced.manager.installer.service.AppUninstallService +import com.vanced.manager.util.* +import java.io.File +import java.io.FileNotFoundException +import java.io.IOException +import kotlin.jvm.Throws + +interface PackageManager { + + suspend fun getVersionCode(packageName: String): PackageManagerResult + + suspend fun getVersionName(packageName: String): PackageManagerResult + + suspend fun getInstallationDir(packageName: String): PackageManagerResult + + suspend fun setInstaller(targetPackage: String, installerPackage: String): PackageManagerResult + + suspend fun forceStop(packageName: String): PackageManagerResult + + suspend fun installApp(apk: File): PackageManagerResult + + suspend fun installSplitApp(apks: Array): PackageManagerResult + + suspend fun uninstallApp(packageName: String): PackageManagerResult + +} + +class NonrootPackageManager( + private val context: Context +) : PackageManager { + + @SuppressLint("WrongConstant") + @Suppress("DEPRECATION") + override suspend fun getVersionCode(packageName: String): PackageManagerResult { + return try { + val packageInfo = context.packageManager.getPackageInfo(packageName, FLAG_NOTHING) + val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo.longVersionCode.and(VERSION_IGNORE_MAJOR).toInt() + } else { + packageInfo.versionCode + } + + PackageManagerResult.Success(versionCode) + } catch (e: android.content.pm.PackageManager.NameNotFoundException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, + message = e.stackTraceToString() + ) + } + } + + @SuppressLint("WrongConstant") + override suspend fun getVersionName(packageName: String): PackageManagerResult { + return try { + val versionName = context.packageManager + .getPackageInfo(packageName, FLAG_NOTHING) + .versionName + + PackageManagerResult.Success(versionName) + } catch (e: android.content.pm.PackageManager.NameNotFoundException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, + message = e.stackTraceToString() + ) + } + } + + @SuppressLint("WrongConstant") + override suspend fun getInstallationDir(packageName: String): PackageManagerResult { + return try { + val installationDir = context.packageManager + .getPackageInfo(packageName, FLAG_NOTHING) + .applicationInfo + .sourceDir + + PackageManagerResult.Success(installationDir) + } catch (e: android.content.pm.PackageManager.NameNotFoundException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_DIR, + message = e.stackTraceToString() + ) + } + } + + override suspend fun setInstaller( + targetPackage: String, + installerPackage: String + ): PackageManagerResult { + return PackageManagerResult.Error( + error = PackageManagerError.SET_FAILED_INSTALLER, + message = "Unsupported" + ) + } + + override suspend fun forceStop(packageName: String): PackageManagerResult { + return PackageManagerResult.Error( + error = PackageManagerError.APP_FAILED_FORCE_STOP, + message = "Unsupported" + ) + } + + override suspend fun installApp(apk: File): PackageManagerResult { + return createInstallationSession { + writeApkToSession(apk) + } + } + + override suspend fun installSplitApp(apks: Array): PackageManagerResult { + return createInstallationSession { + for (apk in apks) { + writeApkToSession(apk) + } + } + } + + override suspend fun uninstallApp(packageName: String): PackageManagerResult { + val packageInstaller = context.packageManager.packageInstaller + val pendingIntent = PendingIntent.getService( + context, + 0, + Intent(context, AppUninstallService::class.java), + intentFlags + ).intentSender + packageInstaller.uninstall(packageName, pendingIntent) + return PackageManagerResult.Success(null) + } + + private inline fun createInstallationSession( + block: PackageInstaller.Session.() -> Unit + ): PackageManagerResult { + val packageInstaller = context.packageManager.packageInstaller + val sessionParams = PackageInstaller.SessionParams( + PackageInstaller.SessionParams.MODE_FULL_INSTALL + ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setInstallReason(android.content.pm.PackageManager.INSTALL_REASON_USER) + } + } + val pendingIntent = PendingIntent.getService( + context, + 0, + Intent(context, AppInstallService::class.java), + intentFlags + ).intentSender + + val sessionId = tripleUnionTryCatch( + onCatch = { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_CREATE, + message = it.stackTraceToString() + ) + } + ) { + packageInstaller.createSession(sessionParams) + } + + val session = doubleUnionTryCatch( + onCatch = { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_CREATE, + message = it.stackTraceToString() + ) + } + ) { + packageInstaller.openSession(sessionId) + } + + try { + session.use { + it.block() + it.commit(pendingIntent) + } + } catch (e: IOException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_WRITE, + message = e.stackTraceToString() + ) + } catch (e: SecurityException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_COMMIT, + message = e.stackTraceToString() + ) + } + + return PackageManagerResult.Success(null) + } + + private fun PackageInstaller.Session.writeApkToSession(apk: File) { + apk.inputStream().use { inputStream -> + openWrite(apk.name, 0, apk.length()).use { outputStream -> + inputStream.copyTo(outputStream, byteArraySize) + fsync(outputStream) + } + } + } + + private val intentFlags: Int + get() { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + PendingIntent.FLAG_MUTABLE + else + 0 + } + + private companion object { + const val byteArraySize = 1024 * 1024 + + const val FLAG_NOTHING = 0 + const val VERSION_IGNORE_MAJOR = 0xFFFFFFFF + } + +} + +class RootPackageManager : PackageManager { + + override suspend fun getVersionCode(packageName: String): PackageManagerResult { + return try { + val keyword = "versionCode=" + val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() + val versionCode = dumpsys.removePrefix(keyword).substringAfter("minSdk").toInt() + + PackageManagerResult.Success(versionCode) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, + message = e.stderrOut + ) + } catch (e: java.lang.NumberFormatException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_CODE, + message = e.stackTraceToString() + ) + } + } + + override suspend fun getVersionName(packageName: String): PackageManagerResult { + return try { + val keyword = "versionName=" + val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() + val versionName = dumpsys.removePrefix(keyword) + + PackageManagerResult.Success(versionName) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_VERSION_NAME, + message = e.stderrOut + ) + } + } + + override suspend fun getInstallationDir(packageName: String): PackageManagerResult { + return try { + val keyword = "path: " + val dumpsys = Shell.su("dumpsys", "package", packageName, "|", "grep", keyword).awaitOutputOrThrow() + val installationDir = dumpsys.removePrefix(keyword) + + PackageManagerResult.Success(installationDir) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.GET_FAILED_PACKAGE_DIR, + message = e.stderrOut + ) + } + } + + override suspend fun setInstaller( + targetPackage: String, + installerPackage: String + ): PackageManagerResult { + return try { + Shell.su("pm", "set-installer", targetPackage, installerPackage).awaitOutputOrThrow() + + PackageManagerResult.Success(null) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.SET_FAILED_INSTALLER, + message = e.stderrOut + ) + } + } + + override suspend fun forceStop(packageName: String): PackageManagerResult { + return try { + Shell.su("am", "force-stop", packageName).awaitOutputOrThrow() + + PackageManagerResult.Success(null) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.APP_FAILED_FORCE_STOP, + message = e.stderrOut + ) + } + } + + override suspend fun installApp(apk: File): PackageManagerResult { + var tempApk: File? = null + return try { + tempApk = copyApkToTemp(apk) + Shell.su("pm", "install", "-r", tempApk.absolutePath).awaitOutputOrThrow() + + PackageManagerResult.Success(null) + } catch (e: IOException) { + PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_COPY, + message = e.stackTraceToString() + ) + } catch (e: SuException) { + PackageManagerResult.Error( + error = getEnumForInstallFailed(e.stderrOut), + message = e.stderrOut + ) + } finally { + tempApk?.delete() + } + } + + override suspend fun installSplitApp(apks: Array): PackageManagerResult { + val sessionId = try { + val installCreate = Shell.su("pm", "install-create", "-r").awaitOutputOrThrow() + + installCreate.toInt() + } catch (e: SuException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_CREATE, + message = e.stderrOut + ) + } catch (e: NumberFormatException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_INVALID_ID, + message = e.stackTraceToString() + ) + } + + for (apk in apks) { + var tempApk: File? = null + try { + tempApk = copyApkToTemp(apk) + Shell.su("pm", "install-write", sessionId.toString(), tempApk.name, tempApk.absolutePath).awaitOutputOrThrow() + } catch (e: SuException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_WRITE, + message = e.stderrOut + ) + } catch (e: IOException) { + return PackageManagerResult.Error( + error = PackageManagerError.SESSION_FAILED_COPY, + message = e.stackTraceToString() + ) + } finally { + tempApk?.delete() + } + } + + return try { + Shell.su("pm", "install-commit", sessionId.toString()).awaitOutputOrThrow() + + PackageManagerResult.Success(null) + } catch (e: SuException) { + PackageManagerResult.Error( + error = getEnumForInstallFailed(e.stderrOut), + message = e.stderrOut + ) + } + } + + override suspend fun uninstallApp(packageName: String): PackageManagerResult { + return try { + Shell.su("pm", "uninstall", packageName).awaitOutputOrThrow() + + PackageManagerResult.Success(null) + } catch (e: SuException) { + PackageManagerResult.Error( + error = PackageManagerError.UNINSTALL_FAILED, + message = e.stderrOut + ) + } + } + + @Throws( + IOException::class, + FileNotFoundException::class + ) + private fun copyApkToTemp(apk: File): SuFile { + val tmpPath = "/data/local/tmp/${apk.name}" + + val tmpApk = SuFile(tmpPath).apply { + createNewFile() + } + + SuFileInputStream.open(tmpApk).use { inputStream -> + SuFileOutputStream.open(tmpApk).use { outputStream -> + inputStream.copyTo(outputStream) + outputStream.flush() + } + } + + return tmpApk + } + +} + +enum class PackageManagerError { + SET_FAILED_INSTALLER, + GET_FAILED_PACKAGE_DIR, + GET_FAILED_PACKAGE_VERSION_NAME, + GET_FAILED_PACKAGE_VERSION_CODE, + + APP_FAILED_FORCE_STOP, + + SESSION_FAILED_CREATE, + SESSION_FAILED_COMMIT, + SESSION_FAILED_WRITE, + SESSION_FAILED_COPY, + SESSION_FAILED_OPEN, + SESSION_INVALID_ID, + + INSTALL_FAILED_ABORTED, + INSTALL_FAILED_ALREADY_EXISTS, + INSTALL_FAILED_CPU_ABI_INCOMPATIBLE, + INSTALL_FAILED_INSUFFICIENT_STORAGE, + INSTALL_FAILED_INVALID_APK, + INSTALL_FAILED_VERSION_DOWNGRADE, + INSTALL_FAILED_PARSE_NO_CERTIFICATES, + INSTALL_FAILED_UNKNOWN, + + UNINSTALL_FAILED, + + LINK_FAILED_UNMOUNT, + LINK_FAILED_MOUNT, + + PATCH_FAILED_COPY, + PATCH_FAILED_CHMOD, + PATCH_FAILED_CHOWN, + PATCH_FAILED_CHCON, + PATCH_FAILED_DESTROY, + + SCRIPT_FAILED_SETUP_POST_FS, + SCRIPT_FAILED_SETUP_SERVICE_D, + SCRIPT_FAILED_DESTROY_POST_FS, + SCRIPT_FAILED_DESTROY_SERVICE_D, +} + +fun getEnumForInstallFailed(outString: String): PackageManagerError { + return when { + outString.contains("INSTALL_FAILED_ABORTED") -> PackageManagerError.INSTALL_FAILED_ABORTED + outString.contains("INSTALL_FAILED_ALREADY_EXISTS") -> PackageManagerError.INSTALL_FAILED_ALREADY_EXISTS + outString.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE") -> PackageManagerError.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE + outString.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE") -> PackageManagerError.INSTALL_FAILED_INSUFFICIENT_STORAGE + outString.contains("INSTALL_FAILED_INVALID_APK") -> PackageManagerError.INSTALL_FAILED_INVALID_APK + outString.contains("INSTALL_FAILED_VERSION_DOWNGRADE") -> PackageManagerError.INSTALL_FAILED_VERSION_DOWNGRADE + outString.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES") -> PackageManagerError.INSTALL_FAILED_PARSE_NO_CERTIFICATES + else -> PackageManagerError.INSTALL_FAILED_UNKNOWN + } +} + +sealed class PackageManagerResult { + data class Success(val value: V?) : PackageManagerResult() + data class Error(val error: PackageManagerError, val message: String) : PackageManagerResult() + + fun getValueOrNull(): V? = getOrElse { null } + + val isError + get() = this is Error + + val isSuccess + get() = this is Success +} + +inline fun PackageManagerResult.getOrElse( + onError: (PackageManagerResult.Error) -> R? +): R? { + return when (this) { + is PackageManagerResult.Success -> this.value + is PackageManagerResult.Error -> onError(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/repository/source/PreferenceDatasource.kt b/app/src/main/java/com/vanced/manager/repository/source/PreferenceDatasource.kt new file mode 100644 index 0000000000..8d26d67459 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/repository/source/PreferenceDatasource.kt @@ -0,0 +1,77 @@ +package com.vanced.manager.repository.source + +import android.content.SharedPreferences + +interface PreferenceDatasource { + + var managerUseCustomTabs: Boolean + var managerMode: String + var managerTheme: String + +} + +class PreferenceDatasourceImpl( + private val sharedPreferences: SharedPreferences +) : PreferenceDatasource { + + override var managerUseCustomTabs: Boolean + get() = getBoolean( + PreferenceData.MANAGER_USE_CUSTOM_TABS_KEY, + PreferenceData.MANAGER_USE_CUSTOM_TABS_DEFAULT_VALUE + ) + set(value) { + putBoolean(PreferenceData.MANAGER_USE_CUSTOM_TABS_KEY, value) + } + + override var managerMode: String + get() = getString( + PreferenceData.MANAGER_MODE_KEY, + PreferenceData.MANAGER_MODE_DEFAULT_VALUE + ) + set(value) { + putString(PreferenceData.MANAGER_MODE_KEY, value) + } + + override var managerTheme: String + get() = getString( + PreferenceData.MANAGER_THEME_KEY, + PreferenceData.MANAGER_THEME_DEFAULT_VALUE + ) + set(value) { + putString(PreferenceData.MANAGER_THEME_KEY, value) + } + + private fun getString(key: String, defaultValue: String): String { + return sharedPreferences.getString(key, defaultValue) ?: defaultValue + } + + private fun getBoolean(key: String, defaultValue: Boolean): Boolean { + return sharedPreferences.getBoolean(key, defaultValue) + } + + private fun putString(key: String, value: String) { + sharedPreferences.edit().putString(key, value).apply() + } + + private fun putBoolean(key: String, value: Boolean) { + sharedPreferences.edit().putBoolean(key, value).apply() + } +} + +object PreferenceData { + + const val MANAGER_USE_CUSTOM_TABS_KEY = "manager_behaviour_use_custom_tabs" + const val MANAGER_USE_CUSTOM_TABS_DEFAULT_VALUE = true + + const val MANAGER_MODE_KEY = "manager_behaviour_mode" + const val MANAGER_MODE_VALUE_ROOT = "root" + const val MANAGER_MODE_VALUE_NONROOT = "nonroot" + const val MANAGER_MODE_DEFAULT_VALUE = MANAGER_MODE_VALUE_NONROOT + + const val MANAGER_THEME_KEY = "manager_appearance_theme" + const val MANAGER_THEME_VALUE_LIGHT = "light" + const val MANAGER_THEME_VALUE_DARK = "dark" + const val MANAGER_THEME_VALUE_SYSTEM_DEFAULT = "system_default" + const val MANAGER_THEME_DEFAULT_VALUE = MANAGER_THEME_VALUE_SYSTEM_DEFAULT + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/MainActivity.kt b/app/src/main/java/com/vanced/manager/ui/MainActivity.kt index 22f60c5095..9416609e69 100644 --- a/app/src/main/java/com/vanced/manager/ui/MainActivity.kt +++ b/app/src/main/java/com/vanced/manager/ui/MainActivity.kt @@ -1,237 +1,182 @@ package com.vanced.manager.ui -import android.content.ActivityNotFoundException -import android.content.ComponentName +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.content.res.Configuration -import android.net.Uri +import android.content.IntentFilter import android.os.Bundle -import android.view.MenuItem -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat -import androidx.navigation.NavDestination -import androidx.navigation.findNavController -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.setupWithNavController -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.crowdin.platform.Crowdin -import com.crowdin.platform.LoadingStateListener -import com.google.firebase.messaging.FirebaseMessaging -import com.vanced.manager.BuildConfig.ENABLE_CROWDIN_AUTH -import com.vanced.manager.BuildConfig.VERSION_CODE -import com.vanced.manager.R -import com.vanced.manager.databinding.ActivityMainBinding -import com.vanced.manager.ui.dialogs.DialogContainer -import com.vanced.manager.ui.dialogs.ManagerUpdateDialog -import com.vanced.manager.ui.dialogs.URLChangeDialog -import com.vanced.manager.ui.fragments.HomeFragmentDirections -import com.vanced.manager.ui.fragments.SettingsFragmentDirections -import com.vanced.manager.utils.* -import com.vanced.manager.utils.AppUtils.currentLocale -import com.vanced.manager.utils.AppUtils.faqpkg -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.playStorePkg -import com.vanced.manager.utils.AppUtils.vancedRootPkg -import com.vanced.manager.utils.PackageHelper.isPackageInstalled - -class MainActivity : AppCompatActivity() { - - lateinit var binding: ActivityMainBinding - private val navHost by lazy { findNavController(R.id.nav_host) } - - private val loadingObserver = object : LoadingStateListener { - val tag = "VMLocalisation" - override fun onDataChanged() { - log(tag, "Loaded data") - } - - override fun onFailure(throwable: Throwable) { - log(tag, "Failed to load data: ${throwable.stackTraceToString()}") +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.SideEffect +import com.github.zsoltk.compose.backpress.BackPressHandler +import com.github.zsoltk.compose.backpress.LocalBackPressHandler +import com.github.zsoltk.compose.router.Router +import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.vanced.manager.installer.service.AppInstallService +import com.vanced.manager.installer.service.AppUninstallService +import com.vanced.manager.ui.screen.* +import com.vanced.manager.ui.theme.ManagerTheme +import com.vanced.manager.ui.util.Screen +import com.vanced.manager.ui.util.animated +import com.vanced.manager.ui.viewmodel.InstallViewModel +import com.vanced.manager.ui.viewmodel.MainViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel + +class MainActivity : ComponentActivity() { + + private val installViewModel: InstallViewModel by viewModel() + private val mainViewModel: MainViewModel by viewModel() + + private val backPressHandler = BackPressHandler() + + private val installBroadcastReceiver = object : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + AppInstallService.APP_INSTALL_ACTION -> { + installViewModel.postInstallStatus( + pmStatus = intent.getIntExtra(AppInstallService.EXTRA_INSTALL_STATUS, -999), + extra = intent.getStringExtra(AppInstallService.EXTRA_INSTALL_STATUS_MESSAGE)!!, + ) + mainViewModel.fetch() + } + AppUninstallService.APP_UNINSTALL_ACTION -> { + mainViewModel.fetch() + } + } } - } override fun onCreate(savedInstanceState: Bundle?) { - setFinalTheme() super.onCreate(savedInstanceState) - if (ENABLE_CROWDIN_AUTH) - authCrowdin() - - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - with(binding) { - setSupportActionBar(toolbar) - toolbar.setupWithNavController( - this@MainActivity.navHost, - AppBarConfiguration(this@MainActivity.navHost.graph) - ) - } - navHost.addOnDestinationChangedListener { _, currFrag: NavDestination, _ -> - setDisplayHomeAsUpEnabled(currFrag.id != R.id.home_fragment) - } - - initDialogs(intent.getBooleanExtra("firstLaunch", false)) - manager.observe(this) { - if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) { - ManagerUpdateDialog.newInstance(true).show(this) - } - } - } - - override fun onBackPressed() { - if (!navHost.popBackStack()) - finish() - } - - private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) { - binding.toolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable( - this, - R.drawable.ic_keyboard_backspace_black_24dp - ) else null - } - - override fun onPause() { - super.onPause() - Crowdin.unregisterDataLoadingObserver(loadingObserver) - } - - override fun onResume() { - setFinalTheme() - super.onResume() - Crowdin.registerDataLoadingObserver(loadingObserver) - } + mainViewModel.fetch() + setContent { + val isDark = mainViewModel.appTheme.isDark() + ManagerTheme(darkMode = isDark) { + val surfaceColor = MaterialTheme.colorScheme.surface.animated + + val systemUiController = rememberSystemUiController() + + SideEffect { + systemUiController.setSystemBarsColor( + color = surfaceColor, + darkIcons = !isDark + ) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.toolbar_about -> { - navHost.navigate(HomeFragmentDirections.toAboutFragment()) - true - } - R.id.toolbar_settings -> { - navHost.navigate(HomeFragmentDirections.toSettingsFragment()) - true - } - R.id.toolbar_log -> { - navHost.navigate(HomeFragmentDirections.toLogFragment()) - true - } - R.id.toolbar_guide -> { - try { - val intent = if (isPackageInstalled(faqpkg, packageManager)) { - Intent().apply { - component = ComponentName(faqpkg, "$faqpkg.ui.MainActivity") - } - } else { - Intent(Intent.ACTION_VIEW).apply { - val uriBuilder = Uri.parse("https://play.google.com/store/apps/details") - .buildUpon() - .appendQueryParameter("id", faqpkg) - .appendQueryParameter("launch", "true") - data = uriBuilder.build() - setPackage(playStorePkg) + CompositionLocalProvider( + LocalBackPressHandler provides backPressHandler + ) { + Router("VancedManager", Screen.Home) { backStack -> + when (val screen = backStack.last()) { + is Screen.Home -> { + HomeScreen( + managerState = mainViewModel.appState, + onRefresh = { + mainViewModel.fetch() + }, + onToolbarScreenSelected = { + backStack.push(it) + }, + onAppDownloadClick = { app -> + /*if (installationOptions != null) { + backStack.push( + Screen.Configuration( + appName, + appVersions, + installationOptions + ) + ) + } else { + backStack.push(Screen.Install(appName, appVersions)) + }*/ + }, + onAppLaunchClick = { app -> + mainViewModel.launchApp(app.packageName, app.launchActivity) + }, + onAppUninstallClick = { app -> + mainViewModel.uninstallApp(app.packageName) + } + ) + } + is Screen.Settings -> { + SettingsScreen( + onToolbarBackButtonClick = { + backStack.pop() + }, + onThemeChange = { + mainViewModel.appTheme = it + } + ) + } + is Screen.About -> { + AboutScreen( + onToolbarBackButtonClick = { + backStack.pop() + } + ) + } + is Screen.Logs -> { + + } + is Screen.Configuration -> { + ConfigurationScreen( + installationOptions = screen.appInstallationOptions, + onToolbarBackButtonClick = { + backStack.pop() + }, + onFinishClick = { + backStack.push( + Screen.Install( + screen.appName, + screen.appVersions + ) + ) + } + ) + } + is Screen.Install -> { + InstallScreen( + appName = screen.appName, + appVersions = screen.appVersions, + viewModel = installViewModel, + onFinishClick = { + installViewModel.clear() + backStack.newRoot(Screen.Home) + } + ) + } } } - startActivity(intent) - true - } catch (e: ActivityNotFoundException) { - false } } - R.id.toolbar_update_manager -> { - ManagerUpdateDialog.newInstance(false) - .show(supportFragmentManager, "manager_update") - true - } - R.id.dev_settings -> { - navHost.navigate(SettingsFragmentDirections.toDevSettingsFragment()) - return true - } - else -> super.onOptionsItemSelected(item) - } - } - - override fun attachBaseContext(newBase: Context) { - super.attachBaseContext(Crowdin.wrapContext(LanguageContextWrapper.wrap(newBase))) - } - - //I have no idea why the fuck is super method deprecated - @Suppress("DEPRECATION") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - onActivityResult(requestCode) - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - - //update manager language when system language is changed - @Suppress("DEPRECATION") - if (newConfig.locale != currentLocale) { - recreate() //restarting activity in order to recreate viewmodels, otherwise some text won't update - return } - - when (newConfig.orientation) { - Configuration.ORIENTATION_PORTRAIT -> log( - "VMUI", - "screen orientation changed to portrait" - ) - Configuration.ORIENTATION_LANDSCAPE -> log( - "VMUI", - "screen orientation changed to landscape" - ) - else -> log("VMUI", "screen orientation changed to [REDACTED]") - } - } - override fun recreate() { - //needed for setting language smh - startActivity(Intent(this, this::class.java)) - finish() + override fun onBackPressed() { + if (!backPressHandler.handle()) + super.onBackPressed() } - private fun initDialogs(firstLaunch: Boolean) { - val prefs = getDefaultSharedPreferences(this) - val variant = prefs.managerVariant - prefs.getBoolean("show_root_dialog", true) - - if (intent?.data != null && intent.dataString?.startsWith("https") == true) { - val urldialog = URLChangeDialog() - val arg = Bundle() - arg.putString("url", intent.dataString) - urldialog.arguments = arg - urldialog.show(this) - } + override fun onStart() { + super.onStart() - if (firstLaunch) { - DialogContainer.showSecurityDialog(this) - with(FirebaseMessaging.getInstance()) { - subscribeToTopic("Vanced-Update") - subscribeToTopic("Music-Update") - subscribeToTopic("MicroG-Update") - } - } else { - if (isMiuiOptimizationsEnabled) { - DialogContainer.miuiDialog(this) + registerReceiver( + installBroadcastReceiver, + IntentFilter().apply { + addAction(AppInstallService.APP_INSTALL_ACTION) + addAction(AppUninstallService.APP_UNINSTALL_ACTION) } - } + ) + } - if (!prefs.getBoolean("statement", true)) { - DialogContainer.statementFalse(this) - } + override fun onStop() { + super.onStop() - if (variant == "root") { - if (PackageHelper.getPackageVersionName(vancedRootPkg, packageManager) == "14.21.54") { - DialogContainer.basicDialog( - getString(R.string.hold_on), - getString(R.string.magisk_vanced), - this - ) - } - } + unregisterReceiver(installBroadcastReceiver) } -} + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/SplashScreenActivity.kt b/app/src/main/java/com/vanced/manager/ui/SplashScreenActivity.kt index 6778af4a94..c82dcf68ab 100644 --- a/app/src/main/java/com/vanced/manager/ui/SplashScreenActivity.kt +++ b/app/src/main/java/com/vanced/manager/ui/SplashScreenActivity.kt @@ -2,21 +2,31 @@ package com.vanced.manager.ui import android.content.Intent import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.preference.PreferenceManager.getDefaultSharedPreferences +import androidx.activity.ComponentActivity +import com.topjohnwu.superuser.BusyBoxInstaller +import com.topjohnwu.superuser.Shell +import com.vanced.manager.BuildConfig -class SplashScreenActivity : AppCompatActivity() { +class SplashScreenActivity : ComponentActivity() { + + init { + Shell.enableVerboseLogging = BuildConfig.DEBUG + Shell.setDefaultBuilder( + Shell.Builder + .create() + .setInitializers(BusyBoxInstaller::class.java) + ) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (getDefaultSharedPreferences(this).getBoolean("firstLaunch", true)) { - startActivity(Intent(this, WelcomeActivity::class.java)) - finish() - } else { - startActivity(Intent(this, MainActivity::class.java)) + Shell.getShell { + startActivity( + Intent(this, MainActivity::class.java) + ) finish() } - } -} + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/WelcomeActivity.kt b/app/src/main/java/com/vanced/manager/ui/WelcomeActivity.kt deleted file mode 100644 index 2469462fae..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/WelcomeActivity.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.vanced.manager.ui - -import android.animation.ValueAnimator -import android.os.Bundle -import android.util.LayoutDirection -import androidx.appcompat.app.AppCompatActivity -import androidx.core.animation.addListener -import androidx.viewpager2.widget.ViewPager2 -import com.vanced.manager.adapter.WelcomePageAdapter -import com.vanced.manager.databinding.ActivityWelcomeBinding -import kotlin.math.abs - -class WelcomeActivity : AppCompatActivity() { - - private lateinit var binding: ActivityWelcomeBinding - private var isRtl = false - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = ActivityWelcomeBinding.inflate(layoutInflater) - setContentView(binding.root) - - isRtl = resources.configuration.layoutDirection == LayoutDirection.RTL - - binding.welcomeViewpager.apply { - adapter = WelcomePageAdapter(this@WelcomeActivity) - isUserInputEnabled = false - setPageTransformer { page, position -> - page.apply { - val pageWidth = width.toFloat() - //Thank you, fragula dev! - when { - position > 0 && position < 1 -> { - alpha = 1f - translationX = 0f - } - position > -1 && position <= 0 -> { - alpha = 1.0f - abs(position * 0.7f) - translationX = pageWidth.rtlCompat * position / 1.3F - } - } - } - } - } - } - - override fun onBackPressed() { - with(binding) { - if (welcomeViewpager.currentItem == 0) { - super.onBackPressed() - } else { - navigateTo(welcomeViewpager.currentItem - 1) - } - } - } - - fun navigateTo(position: Int) { - binding.welcomeViewpager.currentPosition = position - } - - private val Float.rtlCompat get() = if (isRtl) this else -this - - //Shit way to implement animation duration, but at least it works - private var ViewPager2.currentPosition: Int - get() = currentItem - set(value) { - val pixelsToDrag: Int = width * (value - currentItem) - val animator = ValueAnimator.ofInt(0, pixelsToDrag) - var previousValue = 0 - animator.apply { - addUpdateListener { valueAnimator -> - val currentValue = valueAnimator.animatedValue as Int - val currentPxToDrag = (currentValue - previousValue).toFloat() - fakeDragBy(currentPxToDrag.rtlCompat) - previousValue = currentValue - } - addListener( - onStart = { beginFakeDrag() }, - onEnd = { endFakeDrag() } - ) - duration = 500 - start() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerButton.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerButton.kt new file mode 100644 index 0000000000..86e3c2203c --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerButton.kt @@ -0,0 +1,148 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.dp + +@Composable +fun ManagerButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + elevation: ButtonElevation? = ButtonDefaults.buttonElevation(), + shape: Shape = RoundedCornerShape(20.0.dp), + border: BorderStroke? = null, + colors: ButtonColors = ButtonDefaults.buttonColors(), + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + content: @Composable RowScope.() -> Unit +) { + Button( + onClick, + modifier, + enabled, + interactionSource, + elevation, + shape, + border, + colors, + contentPadding, + content + ) +} + +@Composable +fun ManagerElevatedButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + elevation: ButtonElevation? = ButtonDefaults.elevatedButtonElevation(), + shape: Shape = RoundedCornerShape(20.0.dp), + border: BorderStroke? = null, + colors: ButtonColors = ButtonDefaults.elevatedButtonColors(), + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + content: @Composable RowScope.() -> Unit +) { + ElevatedButton( + onClick, + modifier, + enabled, + interactionSource, + elevation, + shape, + border, + colors, + contentPadding, + content + ) +} + +@Composable +fun ManagerFilledTonalButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(), + shape: Shape = RoundedCornerShape(20.0.dp), + border: BorderStroke? = null, + colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(), + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + content: @Composable RowScope.() -> Unit +) { + FilledTonalButton( + onClick, + modifier, + enabled, + interactionSource, + elevation, + shape, + border, + colors, + contentPadding, + content + ) +} + +@Composable +fun ManagerOutlinedButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + elevation: ButtonElevation? = null, + shape: Shape = RoundedCornerShape(20.0.dp), + border: BorderStroke? = ButtonDefaults.outlinedButtonBorder, + colors: ButtonColors = ButtonDefaults.outlinedButtonColors(), + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + content: @Composable RowScope.() -> Unit +) { + Button( + onClick, + modifier, + enabled, + interactionSource, + elevation, + shape, + border, + colors, + contentPadding, + content + ) +} + +@Composable +fun ManagerTextButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + elevation: ButtonElevation? = null, + shape: Shape = RoundedCornerShape(20.0.dp), + border: BorderStroke? = null, + colors: ButtonColors = ButtonDefaults.textButtonColors(), + contentPadding: PaddingValues = ButtonDefaults.ContentPadding, + content: @Composable RowScope.() -> Unit +) { + TextButton( + onClick, + modifier, + enabled, + interactionSource, + elevation, + shape, + border, + colors, + contentPadding, + content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerCard.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerCard.kt new file mode 100644 index 0000000000..890d68c7e0 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerCard.kt @@ -0,0 +1,127 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import com.vanced.manager.ui.theme.MediumShape +import com.vanced.manager.ui.util.animated + +@Composable +fun ManagerCard( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + shape: Shape = MediumShape, + containerColor: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(containerColor), + elevation: CardElevation = CardDefaults.cardElevation(), + content: @Composable ColumnScope.() -> Unit, +) { + if (onClick != null) { + val interactionSource = remember { MutableInteractionSource() } + Card( + modifier = modifier + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick + ), + interactionSource = interactionSource, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } else { + Card( + modifier = modifier, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } +} + +@Composable +fun ManagerElevatedCard( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + shape: Shape = MediumShape, + containerColor: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(containerColor), + elevation: CardElevation = CardDefaults.elevatedCardElevation(), + content: @Composable ColumnScope.() -> Unit, +) { + if (onClick != null) { + val interactionSource = remember { MutableInteractionSource() } + ElevatedCard( + modifier = modifier + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick + ), + interactionSource = interactionSource, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } else { + ElevatedCard( + modifier = modifier, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } +} + +@Composable +fun ManagerOutlinedCard( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + shape: Shape = MediumShape, + containerColor: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(containerColor), + elevation: CardElevation = CardDefaults.outlinedCardElevation(), + content: @Composable ColumnScope.() -> Unit, +) { + if (onClick != null) { + val interactionSource = remember { MutableInteractionSource() } + OutlinedCard( + modifier = modifier + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick + ), + interactionSource = interactionSource, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } else { + OutlinedCard( + modifier = modifier, + shape = shape, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + elevation = elevation, + content = content + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerDialog.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerDialog.kt new file mode 100644 index 0000000000..0b577290ba --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerDialog.kt @@ -0,0 +1,36 @@ +package com.vanced.manager.ui.component + +import androidx.compose.material3.AlertDialog +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.vanced.manager.ui.theme.LargeShape + +@Composable +fun ManagerDialog( + title: String, + onDismissRequest: () -> Unit, + confirmButton: @Composable () -> Unit, + modifier: Modifier = Modifier, + dismissButton: @Composable (() -> Unit)? = null, + icon: @Composable (() -> Unit)? = null, + content: @Composable () -> Unit, +) { + AlertDialog( + modifier = modifier, + title = { + ManagerText( + text = title, + textAlign = TextAlign.Center + ) + }, + text = content, + onDismissRequest = onDismissRequest, + confirmButton = confirmButton, + dismissButton = dismissButton, + icon = icon, + shape = LargeShape, + tonalElevation = 2.dp, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerDropdownMenu.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerDropdownMenu.kt new file mode 100644 index 0000000000..8076b88016 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerDropdownMenu.kt @@ -0,0 +1,124 @@ +package com.vanced.manager.ui.component + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.MutableTransitionState +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.tween +import androidx.compose.animation.core.updateTransition +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.OutlinedCard +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.* +import androidx.compose.ui.window.Popup +import androidx.compose.ui.window.PopupPositionProvider +import androidx.compose.ui.window.PopupProperties +import com.vanced.manager.ui.theme.SmallShape + +private const val TransitionDuration = 200 + +@ExperimentalAnimationApi +@Composable +fun ManagerDropdownMenu( + expanded: Boolean, + onDismissRequest: () -> Unit, + content: @Composable ColumnScope.() -> Unit, +) { + val expandedStates = remember { MutableTransitionState(false) } + expandedStates.targetState = expanded + + val transition = updateTransition(expandedStates, "ManagerDropDownMenu") + + val alphaAndScale by transition.animateFloat( + transitionSpec = { tween(durationMillis = TransitionDuration) }, + label = "AlphaAndScale" + ) { + if (it) 1f else 0f + } + + if (expandedStates.currentState || expandedStates.targetState) { + val density = LocalDensity.current + val popupPositionProvider = ManagerDropdownMenuPopupPositionProvider(density) + + Popup( + popupPositionProvider = popupPositionProvider, + onDismissRequest = onDismissRequest, + properties = PopupProperties(focusable = true) + ) { + OutlinedCard( + modifier = Modifier + .width(IntrinsicSize.Max) + .alpha(alphaAndScale) + .scale(alphaAndScale), + elevation = CardDefaults.elevatedCardElevation() + ) { + Column(content = content) + } + } + } +} + +@Composable +fun ManagerDropdownMenuItem( + title: String, + onClick: () -> Unit +) { + DropdownMenuItem( + onClick = onClick, + modifier = Modifier.clip(SmallShape), + text = { + ManagerText(text = title) + } + ) +} + +//Kanged from Menu.kt +private data class ManagerDropdownMenuPopupPositionProvider( + val density: Density +) : PopupPositionProvider { + + override fun calculatePosition( + anchorBounds: IntRect, + windowSize: IntSize, + layoutDirection: LayoutDirection, + popupContentSize: IntSize + ): IntOffset { + val verticalMargin = with(density) { 48.dp.roundToPx() } + + //Compute horizontal position. + val toRight = anchorBounds.left + val toLeft = anchorBounds.right - popupContentSize.width + val toDisplayRight = windowSize.width - popupContentSize.width + val toDisplayLeft = 0 + val x = if (layoutDirection == LayoutDirection.Ltr) { + sequenceOf(toRight, toLeft, toDisplayRight) + } else { + sequenceOf(toLeft, toRight, toDisplayLeft) + }.firstOrNull { + it >= 0 && it + popupContentSize.width <= windowSize.width + } ?: toLeft + + // Compute vertical position. + val toBottom = maxOf(anchorBounds.bottom, verticalMargin) + val toTop = anchorBounds.top - popupContentSize.height + val toCenter = anchorBounds.top - popupContentSize.height / 2 + val toDisplayBottom = windowSize.height - popupContentSize.height - verticalMargin + val y = sequenceOf(toBottom, toTop, toCenter, toDisplayBottom).firstOrNull { + it >= verticalMargin && it + popupContentSize.height <= windowSize.height - verticalMargin + } ?: toTop + + return IntOffset(x, y) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerLazyDsl.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerLazyDsl.kt new file mode 100644 index 0000000000..4c0e5aac19 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerLazyDsl.kt @@ -0,0 +1,113 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.gestures.FlingBehavior +import androidx.compose.foundation.gestures.ScrollableDefaults +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.* +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.vanced.manager.ui.util.EdgeToEdgeContentPadding + +@Composable +fun ManagerLazyColumn( + modifier: Modifier = Modifier, + state: LazyListState = rememberLazyListState(), + contentPadding: PaddingValues = PaddingValues( + start = EdgeToEdgeContentPadding, + end = EdgeToEdgeContentPadding, + bottom = 8.dp + ), + reverseLayout: Boolean = false, + verticalArrangement: Arrangement.Vertical = + Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Top else Alignment.Bottom), + horizontalAlignment: Alignment.Horizontal = Alignment.Start, + flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(), + content: LazyListScope.() -> Unit +) { + LazyColumn( + modifier = modifier, + state = state, + contentPadding = contentPadding, + reverseLayout = reverseLayout, + verticalArrangement = verticalArrangement, + horizontalAlignment = horizontalAlignment, + flingBehavior = flingBehavior, + content = content + ) +} + +@Composable +fun ManagerLazyRow( + modifier: Modifier = Modifier, + state: LazyListState = rememberLazyListState(), + contentPadding: PaddingValues = PaddingValues( + start = EdgeToEdgeContentPadding, + end = EdgeToEdgeContentPadding, + ), + reverseLayout: Boolean = false, + horizontalArrangement: Arrangement.Horizontal = + Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Start else Alignment.End), + verticalAlignment: Alignment.Vertical = Alignment.Top, + flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(), + content: LazyListScope.() -> Unit +) { + LazyRow( + modifier = modifier, + state = state, + contentPadding = contentPadding, + reverseLayout = reverseLayout, + horizontalArrangement = horizontalArrangement, + verticalAlignment = verticalAlignment, + flingBehavior = flingBehavior, + content = content + ) +} + +inline fun LazyListScope.managerCategory( + crossinline categoryName: @Composable () -> String, + content: LazyListScope.() -> Unit +) { + item { + ManagerText( + modifier = Modifier + .padding( + start = 8.dp, + top = 4.dp + ), + text = categoryName(), + textStyle = MaterialTheme.typography.headlineSmall, + ) + } + content() +} + +inline fun LazyListScope.items( + items: Map, + noinline key: ((key: K, value: V) -> Any)? = null, + crossinline itemContent: @Composable LazyItemScope.(key: K, value: V) -> Unit +) = items( + count = items.size, + key = if (key != null) { index -> + key(items.keys.elementAt(index), items.values.elementAt(index)) + } else null +) { index -> + itemContent(items.keys.elementAt(index), items.values.elementAt(index)) +} + +inline fun LazyListScope.itemsIndexed( + items: Map, + noinline key: ((index: Int, key: K, value: V) -> Any)? = null, + crossinline itemContent: @Composable LazyItemScope.(index: Int, key: K, value: V) -> Unit +) = items( + count = items.size, + key = if (key != null) { index -> + key(index, items.keys.elementAt(index), items.values.elementAt(index)) + } else null +) { index -> + itemContent(index, items.keys.elementAt(index), items.values.elementAt(index)) +} diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerListItem.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerListItem.kt new file mode 100644 index 0000000000..b89e021dee --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerListItem.kt @@ -0,0 +1,67 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.layout.* +import androidx.compose.material.ContentAlpha +import androidx.compose.material.LocalContentAlpha +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.util.DefaultContentPaddingVertical + +@Composable +fun ManagerListItem( + modifier: Modifier = Modifier, + title: @Composable () -> Unit, + description: @Composable (() -> Unit)? = null, + icon: @Composable (() -> Unit)? = null, + trailing: @Composable (() -> Unit)? = null +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(DefaultContentPaddingHorizontal) + ) { + if (icon != null) { + Box( + modifier = Modifier.align(Alignment.CenterVertically) + ) { + icon() + } + } + Column( + modifier = Modifier + .weight(1f) + .padding( + vertical = + if (description != null) DefaultContentPaddingVertical - 4.dp else DefaultContentPaddingVertical, + ) + .align(Alignment.CenterVertically) + ) { + CompositionLocalProvider( + LocalTextStyle provides MaterialTheme.typography.titleSmall + ) { + title() + } + if (description != null) { + CompositionLocalProvider( + LocalContentAlpha provides ContentAlpha.medium, + LocalTextStyle provides MaterialTheme.typography.bodySmall + ) { + description() + } + } + } + if (trailing != null) { + Box( + modifier = Modifier.align(Alignment.CenterVertically), + contentAlignment = Alignment.Center, + ) { + trailing() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerNavigator.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerNavigator.kt new file mode 100644 index 0000000000..7148c92b31 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerNavigator.kt @@ -0,0 +1,76 @@ +package com.vanced.manager.ui.component + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.with +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveableStateHolder +import androidx.compose.runtime.snapshots.SnapshotStateList +import com.vanced.manager.ui.util.Screen + +@Composable +fun rememberManagerNavigationController( + initialScreen: T +) = remember { + ManagerNavigationControllerImpl(initialScreen) +} + +interface ManagerNavigationController { + + val screens: SnapshotStateList + + fun push(item: T) + + fun pop(): Boolean + +} + +class ManagerNavigationControllerImpl( + initialScreen: T +) : ManagerNavigationController { + + override val screens: SnapshotStateList = + mutableStateListOf(initialScreen) + + override fun push(item: T) { + screens.add(item) + } + + override fun pop(): Boolean { + if (screens.size > 1) { + screens.removeLast() + return true + } + return false + } +} + +@Composable +fun ManagerNavigator( + navigationController: ManagerNavigationController, + content: @Composable (targetContent: T) -> Unit +) { + val saveableStateHolder = rememberSaveableStateHolder() + val screens = remember { navigationController.screens } + + //TODO Animation is not working for some weird reasons + AnimatedContent( + transitionSpec = { + if (targetState.size > initialState.size) { + slideIntoContainer(AnimatedContentScope.SlideDirection.Start) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.End) + } else { + slideIntoContainer(AnimatedContentScope.SlideDirection.End) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.Start) + } + }, + targetState = screens + ) { targetContents -> + val targetContent = targetContents.last() + saveableStateHolder.SaveableStateProvider(key = targetContent.route) { + content(targetContent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerPreference.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerPreference.kt new file mode 100644 index 0000000000..c3329422a6 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerPreference.kt @@ -0,0 +1,270 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Checkbox +import androidx.compose.material.Switch +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.vanced.manager.R +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.theme.LargeShape +import com.vanced.manager.ui.theme.SmallShape +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal + +@JvmInline +value class EntryText(val text: String) + +@JvmInline +value class EntryValue(val value: String) + +@Composable +fun ManagerPreference( + preferenceTitle: String, + preferenceDescription: String? = null, + trailing: @Composable () -> Unit = {}, + onClick: () -> Unit +) { + ManagerElevatedCard( + shape = LargeShape, + onClick = onClick + ) { + ManagerListItem( + modifier = Modifier + .padding(horizontal = DefaultContentPaddingHorizontal), + title = { + ManagerText(text = preferenceTitle) + }, + description = if (preferenceDescription != null) { + { + ManagerText(text = preferenceDescription) + } + } else null, + trailing = trailing, + ) + } +} + +@Composable +fun ManagerSwitchPreference( + preferenceTitle: String, + preferenceDescription: String? = null, + isChecked: Boolean, + onCheckedChange: (isChecked: Boolean) -> Unit +) { + ManagerPreference( + preferenceTitle = preferenceTitle, + preferenceDescription = preferenceDescription, + onClick = { + onCheckedChange(!isChecked) + }, + trailing = { + Switch( + checked = isChecked, + onCheckedChange = null + ) + } + ) +} + +@Composable +fun ManagerDialogPreference( + preferenceTitle: String, + preferenceDescription: String? = null, + showDialog: Boolean, + onClick: () -> Unit, + onDismissRequest: () -> Unit, + confirmButton: @Composable () -> Unit, + dismissButton: @Composable () -> Unit = {}, + trailing: @Composable () -> Unit = {}, + content: @Composable () -> Unit +) { + ManagerPreference( + preferenceTitle = preferenceTitle, + preferenceDescription = preferenceDescription, + trailing = trailing, + onClick = onClick + ) + if (showDialog) { + ManagerDialog( + title = preferenceTitle, + onDismissRequest = onDismissRequest, + confirmButton = confirmButton, + dismissButton = dismissButton, + content = content + ) + } +} + +@Composable +fun ManagerSingleSelectDialogPreference( + preferenceTitle: String, + preferenceDescription: String, + showDialog: Boolean, + selected: EntryValue, + entries: Map, + trailing: @Composable () -> Unit = {}, + onClick: () -> Unit, + onDismissRequest: () -> Unit, + onEntrySelect: (EntryValue) -> Unit, + onSave: () -> Unit, +) { + ManagerDialogPreference( + preferenceTitle = preferenceTitle, + preferenceDescription = preferenceDescription, + trailing = trailing, + confirmButton = { + TextButton(onClick = onSave) { + ManagerText(managerString(R.string.dialog_button_save)) + } + }, + dismissButton = { + TextButton(onClick = onDismissRequest) { + ManagerText(managerString(R.string.dialog_button_cancel)) + } + }, + onDismissRequest = onDismissRequest, + showDialog = showDialog, + onClick = onClick + ) { + LazyColumn( + modifier = Modifier.heightIn(max = 400.dp) + ) { + items(entries) { entryText, entryValue -> + ListDialogRadiobuttonItem( + modifier = Modifier.fillMaxWidth(), + text = entryText.text, + selected = selected == entryValue, + onClick = { + onEntrySelect(entryValue) + } + ) + } + } + } +} + +@Composable +fun ManagerMultiSelectDialogPreference( + preferenceTitle: String, + preferenceDescription: String, + showDialog: Boolean, + selected: List, + entries: Map, + trailing: @Composable () -> Unit = {}, + onClick: () -> Unit, + onDismissRequest: () -> Unit, + onEntriesSelect: (List) -> Unit, + onSave: () -> Unit, +) { + ManagerDialogPreference( + preferenceTitle = preferenceTitle, + preferenceDescription = preferenceDescription, + trailing = trailing, + confirmButton = { + TextButton(onClick = onSave) { + ManagerText(managerString(R.string.dialog_button_save)) + } + }, + dismissButton = { + TextButton(onClick = onDismissRequest) { + ManagerText(managerString(R.string.dialog_button_cancel)) + } + }, + onDismissRequest = onDismissRequest, + showDialog = showDialog, + onClick = onClick + ) { + LazyColumn( + modifier = Modifier.heightIn(max = 400.dp) + ) { + items(entries) { entryText, entryValue -> + ListDialogCheckboxItem( + text = entryText.text, + checked = selected.contains(entryValue), + onCheckedChange = { isChecked -> + val mutableSelected = selected.toMutableList() + when (isChecked) { + true -> mutableSelected.add(entryValue) + false -> mutableSelected.remove(entryValue) + } + onEntriesSelect(mutableSelected) + } + ) + } + } + } +} + +@Composable +private fun ListDialogRadiobuttonItem( + text: String, + selected: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + ListDialogItem( + modifier = modifier, + text = text, + onClick = onClick, + trailing = { + RadioButton( + selected = selected, + onClick = null + ) + } + ) +} + +@Composable +private fun ListDialogCheckboxItem( + text: String, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + modifier: Modifier = Modifier +) { + ListDialogItem( + modifier = modifier, + text = text, + onClick = { + onCheckedChange(!checked) + }, + trailing = { + Checkbox( + checked = checked, + onCheckedChange = null + ) + } + ) +} + +@Composable +private fun ListDialogItem( + text: String, + onClick: () -> Unit, + trailing: @Composable () -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .clip(SmallShape) + .clickable(onClick = onClick) + .padding(8.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + ManagerText( + modifier = Modifier.weight(1f), + text = text, + textStyle = MaterialTheme.typography.titleSmall + ) + trailing() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerProgressIndicator.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerProgressIndicator.kt new file mode 100644 index 0000000000..5ac2f88401 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerProgressIndicator.kt @@ -0,0 +1,43 @@ +package com.vanced.manager.ui.component + +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.material.ProgressIndicatorDefaults +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.vanced.manager.ui.util.animated + +@Composable +fun ManagerProgressIndicator( + modifier: Modifier = Modifier, + color: Color = MaterialTheme.colorScheme.primary, + trackColor: Color = MaterialTheme.colorScheme.surfaceVariant, +) { + LinearProgressIndicator( + modifier = modifier, + color = color.animated, + trackColor = trackColor.animated + ) +} + +@Composable +fun ManagerProgressIndicator( + progress: Float, + modifier: Modifier = Modifier, + color: Color = MaterialTheme.colorScheme.primary, + trackColor: Color = MaterialTheme.colorScheme.surfaceVariant, +) { + val animatedProgress by animateFloatAsState( + targetValue = progress, + animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec + ) + LinearProgressIndicator( + progress = animatedProgress, + modifier = modifier, + color = color.animated, + trackColor = trackColor.animated + ) +} diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerScaffold.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerScaffold.kt new file mode 100644 index 0000000000..364d5e82b2 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerScaffold.kt @@ -0,0 +1,42 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.material3.FabPosition +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.vanced.manager.ui.util.animated + +@Composable +fun ManagerScaffold( + modifier: Modifier = Modifier, + topBar: @Composable () -> Unit = {}, + bottomBar: @Composable () -> Unit = {}, + snackbarHost: @Composable () -> Unit = {}, + floatingActionButton: @Composable () -> Unit = {}, + floatingActionButtonPosition: FabPosition = FabPosition.End, + containerColor: Color = MaterialTheme.colorScheme.background, + contentColor: Color = contentColorFor(containerColor), + content: @Composable (PaddingValues) -> Unit +) { +// //M3 Scaffold doesn't support tonal elevation for Surface +// val absoluteTonalElevation = LocalAbsoluteTonalElevation.current + 1.dp +// CompositionLocalProvider( +// LocalAbsoluteTonalElevation provides absoluteTonalElevation +// ) { + Scaffold( + modifier = modifier, + topBar = topBar, + bottomBar = bottomBar, + snackbarHost = snackbarHost, + floatingActionButton = floatingActionButton, + floatingActionButtonPosition = floatingActionButtonPosition, + containerColor = containerColor.animated, + contentColor = contentColor.animated, + content = content + ) +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerSwipeRefresh.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerSwipeRefresh.kt new file mode 100644 index 0000000000..c66668d31c --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerSwipeRefresh.kt @@ -0,0 +1,46 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.google.accompanist.swiperefresh.SwipeRefresh +import com.google.accompanist.swiperefresh.SwipeRefreshIndicator +import com.google.accompanist.swiperefresh.SwipeRefreshState + +@Composable +fun ManagerSwipeRefresh( + swipeRefreshState: SwipeRefreshState, + onRefresh: () -> Unit, + modifier: Modifier = Modifier, + swipeEnabled: Boolean = true, + refreshTriggerDistance: Dp = 80.dp, + indicatorAlignment: Alignment = Alignment.TopCenter, + indicatorPadding: PaddingValues = PaddingValues(0.dp), + clipIndicatorToPadding: Boolean = true, + content: @Composable () -> Unit, +) { + SwipeRefresh( + modifier = modifier, + state = swipeRefreshState, + onRefresh = onRefresh, + indicator = { state, trigger -> + SwipeRefreshIndicator( + state = state, + refreshTriggerDistance = trigger, + scale = true, + contentColor = MaterialTheme.colorScheme.primary, + backgroundColor = MaterialTheme.colorScheme.surface + ) + }, + swipeEnabled = swipeEnabled, + refreshTriggerDistance = refreshTriggerDistance, + indicatorAlignment = indicatorAlignment, + indicatorPadding = indicatorPadding, + clipIndicatorToPadding = clipIndicatorToPadding, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerText.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerText.kt new file mode 100644 index 0000000000..bb326ef6a0 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerText.kt @@ -0,0 +1,44 @@ +package com.vanced.manager.ui.component + +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign + +@Composable +fun ManagerText( + text: String, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified, + textStyle: TextStyle = LocalTextStyle.current, + textAlign: TextAlign? = null, +) { + Text( + modifier = modifier, + text = text, + color = color, + style = textStyle, + textAlign = textAlign + ) +} + +@Composable +fun ManagerText( + text: AnnotatedString, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified, + textStyle: TextStyle = LocalTextStyle.current, + textAlign: TextAlign? = null, +) { + Text( + modifier = modifier, + text = text, + color = color, + style = textStyle, + textAlign = textAlign + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/component/ManagerTopAppBar.kt b/app/src/main/java/com/vanced/manager/ui/component/ManagerTopAppBar.kt new file mode 100644 index 0000000000..d702b86d4e --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/component/ManagerTopAppBar.kt @@ -0,0 +1,44 @@ +package com.vanced.manager.ui.component + +import androidx.compose.foundation.layout.RowScope +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun ManagerSmallTopAppBar( + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + navigationIcon: @Composable () -> Unit = {}, + actions: @Composable RowScope.() -> Unit = {}, + colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), + scrollBehavior: TopAppBarScrollBehavior? = null +) { + SmallTopAppBar( + modifier = modifier, + title = title, + actions = actions, + navigationIcon = navigationIcon, + colors = colors, + scrollBehavior = scrollBehavior + ) +} + +@Composable +fun ManagerCenterAlignedTopAppBar( + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + navigationIcon: @Composable () -> Unit = {}, + actions: @Composable RowScope.() -> Unit = {}, + colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), + scrollBehavior: TopAppBarScrollBehavior? = null +) { + CenterAlignedTopAppBar( + modifier = modifier, + title = title, + actions = actions, + navigationIcon = navigationIcon, + colors = colors, + scrollBehavior = scrollBehavior + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/compose/Colors.kt b/app/src/main/java/com/vanced/manager/ui/compose/Colors.kt deleted file mode 100644 index a60c9bfea7..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/compose/Colors.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.vanced.manager.ui.compose - diff --git a/app/src/main/java/com/vanced/manager/ui/compose/PreferenceViews.kt b/app/src/main/java/com/vanced/manager/ui/compose/PreferenceViews.kt deleted file mode 100644 index c0eb5dbc2d..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/compose/PreferenceViews.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.vanced.manager.ui.compose - -//import androidx.compose.foundation.clickable -//import androidx.compose.foundation.layout.Column -//import androidx.compose.foundation.layout.ColumnScope -//import androidx.compose.foundation.layout.padding -//import androidx.compose.material.Switch -//import androidx.compose.material.Text -//import androidx.compose.runtime.* -//import androidx.compose.ui.Modifier -//import androidx.compose.ui.graphics.Color -//import androidx.compose.ui.platform.LocalContext -//import androidx.compose.ui.tooling.preview.Preview -//import androidx.compose.ui.unit.dp -//import androidx.compose.ui.unit.em -//import androidx.compose.ui.unit.sp -//import androidx.constraintlayout.compose.ConstraintLayout -//import androidx.core.content.edit -//import androidx.preference.PreferenceManager -// -//@Composable -//@Preview -//inline fun PreferenceCategory( -// categoryTitle: String, -// content: @Composable ColumnScope.() -> Unit -//) { -// Column { -// Text( -// categoryTitle, -// letterSpacing = 0.15.em, -// color = Color(LocalContext.current.accentColor) -// ) -// content() -// } -//} -// -// -//@Composable -//@Preview -//inline fun SwitchPreference( -// preferenceTitle: String, -// preferenceDescription: String? = null, -// preferenceKey: String, -// defValue: Boolean = true, -// crossinline onCheckedChange: (Boolean) -> Unit = {} -//) { -// val prefs = PreferenceManager.getDefaultSharedPreferences(LocalContext.current) -// val isChecked = remember { mutableStateOf(prefs.getBoolean(preferenceKey, defValue)) } -// ConstraintLayout(modifier = Modifier.padding(12.dp, 4.dp).clickable { -// isChecked.value = !isChecked.value -// }) { -// val (title, description, switch) = createRefs() -// Text(preferenceTitle, fontSize = 16.sp, modifier = Modifier.constrainAs(title) { -// top.linkTo(parent.top) -// start.linkTo(parent.start) -// end.linkTo(switch.start, 4.dp) -// if (preferenceDescription != null) { -// bottom.linkTo(description.top) -// } else { -// bottom.linkTo(parent.bottom) -// } -// }) -// if (preferenceDescription != null) { -// Text(preferenceDescription, fontSize = 13.sp, modifier = Modifier.constrainAs(description) { -// top.linkTo(title.bottom) -// start.linkTo(parent.start) -// end.linkTo(switch.start, 8.dp) -// }) -// } -// Switch( -// isChecked.value, -// onCheckedChange = { -// prefs.edit { putBoolean(preferenceKey, it) } -// onCheckedChange(it) -// }, -// modifier = Modifier.clickable(false) {} -// ) -// } -//} -// -//@Composable -//@Preview -//fun Preference( -// preferenceTitle: String, -// preferenceDescription: String? = null, -// onClick: () -> Unit -//) { -// ConstraintLayout(modifier = Modifier.padding(12.dp, 4.dp).clickable(onClick = onClick)) { -// val (title, description, switch) = createRefs() -// Text(preferenceTitle, fontSize = 16.sp, modifier = Modifier.constrainAs(title) { -// top.linkTo(parent.top) -// start.linkTo(parent.start) -// end.linkTo(switch.start, 4.dp) -// if (preferenceDescription != null) { -// bottom.linkTo(description.top) -// } else { -// bottom.linkTo(parent.bottom) -// } -// }) -// if (preferenceDescription != null) { -// Text(preferenceDescription, fontSize = 13.sp, modifier = Modifier.constrainAs(description) { -// top.linkTo(title.bottom) -// }) -// } -// } -// -//} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/compose/Theme.kt b/app/src/main/java/com/vanced/manager/ui/compose/Theme.kt deleted file mode 100644 index 6f873761b7..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/compose/Theme.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.vanced.manager.ui.compose - -//import android.content.Context -//import androidx.compose.foundation.isSystemInDarkTheme -//import androidx.compose.material.MaterialTheme -//import androidx.compose.material.darkColors -//import androidx.compose.material.lightColors -//import androidx.compose.runtime.Composable -//import androidx.compose.runtime.MutableState -//import androidx.compose.runtime.mutableStateOf -//import androidx.compose.runtime.remember -//import androidx.compose.ui.graphics.Color -//import androidx.compose.ui.platform.LocalContext -//import androidx.preference.PreferenceManager.getDefaultSharedPreferences -//import com.vanced.manager.utils.mutableAccentColor -// -//const val Dark = "Dark" -//const val SystemDefault = "System Default" -// -//const val defAccentColor: Int = -13732865 -// -//val Context.accentColor get() = mutableAccentColor.value ?: getDefaultSharedPreferences(this).getInt("manager_accent_color", defAccentColor) -// -//enum class Theme { -// DARK, LIGHT -//} -// -//val lightColors = lightColors( -// primary = Color(defAccentColor) -//) -// -//val darkColors = darkColors( -// primary = Color(defAccentColor) -//) -// -//fun Context.retrieveTheme(): Theme = when (getDefaultSharedPreferences(this).getString("manager_theme", SystemDefault)) { -// SystemDefault -> if (isSystemInDarkTheme()) Theme.DARK else Theme.LIGHT -// Dark -> Theme.DARK -// else -> Theme.LIGHT -//} -// -//val Context.isDarkTheme: Boolean -// get() = retrieveTheme() == Theme.DARK -// -//fun Context.ManagerTheme( -// content: @Composable () -> Unit -//) { -// MaterialTheme( -// colors = if (isDarkTheme) darkColors else lightColors, -// content = content -// ) -//} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/EmptyPreference.kt b/app/src/main/java/com/vanced/manager/ui/core/EmptyPreference.kt deleted file mode 100644 index 69522bb8ef..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/EmptyPreference.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.FrameLayout -import androidx.core.view.isGone -import androidx.core.view.isVisible -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewPreferenceBinding - -class EmptyPreference @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, - defStyleRes: Int = 0 -) : FrameLayout(context, attrs, defStyle, defStyleRes) { - - private var _binding: ViewPreferenceBinding? = null - - val binding: ViewPreferenceBinding - get() = requireNotNull(_binding) - - init { - _binding = ViewPreferenceBinding.inflate(LayoutInflater.from(context), this, true) - initAttrs(context, attrs) - } - - fun setTitle(newTitle: String) { - binding.preferenceTitle.text = newTitle - } - - fun setSummary(newSummary: String) { - with(binding) { - preferenceSummary.text = newSummary - preferenceSummary.isVisible = true - preferenceTitle.setPadding(0, 0, 0, 0) - } - } - - private fun initAttrs(context: Context, attrs: AttributeSet?) { - attrs?.let { mAttrs -> - val typedArray = - context.obtainStyledAttributes(mAttrs, R.styleable.EmptyPreference, 0, 0) - val title = typedArray.getText(R.styleable.EmptyPreference_preference_title) - val summary = typedArray.getText(R.styleable.EmptyPreference_preference_summary) - with(binding) { - if (summary != null) { - preferenceSummary.text = summary - } else { - preferenceSummary.isGone = true - preferenceTitle.setPadding(0, 12, 0, 12) - } - preferenceTitle.text = title - } - typedArray.recycle() - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/PreferenceCategory.kt b/app/src/main/java/com/vanced/manager/ui/core/PreferenceCategory.kt deleted file mode 100644 index bb7f8591fd..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/PreferenceCategory.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.LinearLayout -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewPreferenceCategoryBinding - -class PreferenceCategory @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0 -) : LinearLayout(context, attrs, defStyle) { - - private var _binding: ViewPreferenceCategoryBinding? = null - - val binding: ViewPreferenceCategoryBinding - get() = requireNotNull(_binding) - - init { - _binding = ViewPreferenceCategoryBinding.inflate(LayoutInflater.from(context), this, true) - initAttrs(context, attrs) - setPadding(0, 4, 0, 0) - orientation = VERTICAL - } - - private fun initAttrs(context: Context, attrs: AttributeSet?) { - attrs.let { mAttrs -> - val typedArray = - context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0) - val title = typedArray.getText(R.styleable.PreferenceCategory_category_title) - - binding.categoryTitle.text = title - typedArray.recycle() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/PreferenceSwitch.kt b/app/src/main/java/com/vanced/manager/ui/core/PreferenceSwitch.kt deleted file mode 100644 index d80c588605..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/PreferenceSwitch.kt +++ /dev/null @@ -1,101 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.SharedPreferences -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.CompoundButton -import android.widget.FrameLayout -import androidx.core.content.edit -import com.vanced.manager.R -import com.vanced.manager.databinding.ViewPreferenceSwitchBinding -import com.vanced.manager.utils.defPrefs - -class PreferenceSwitch @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, - defStyleRes: Int = 0 -) : FrameLayout(context, attrs, defStyle, defStyleRes) { - - fun interface OnCheckedListener { - fun onChecked(buttonView: CompoundButton, isChecked: Boolean) - } - - private val prefs by lazy { context.defPrefs } - - var prefKey: String = "" - private set - - var defValue: Boolean = false - private set - - private var mListener: OnCheckedListener? = null - - private val prefListener = - SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> - if (key == prefKey) { - binding.preferenceSwitch.isChecked = sharedPreferences.getBoolean(key, defValue) - } - } - - private var _binding: ViewPreferenceSwitchBinding? = null - - val binding: ViewPreferenceSwitchBinding - get() = requireNotNull(_binding) - - init { - _binding = ViewPreferenceSwitchBinding.inflate(LayoutInflater.from(context), this, true) - prefs.registerOnSharedPreferenceChangeListener(prefListener) - attrs?.let { mAttrs -> - with(context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceSwitch, 0, 0)) { - val title = getText(R.styleable.PreferenceSwitch_switch_title) - val summary = getText(R.styleable.PreferenceSwitch_switch_summary) - val key = getText(R.styleable.PreferenceSwitch_switch_key) - val defValue = getBoolean(R.styleable.PreferenceSwitch_switch_def_value, false) - setKey(key) - setDefaultValue(defValue) - setTitle(title) - setSummary(summary) - recycle() - } - } - } - - override fun onFinishInflate() { - super.onFinishInflate() - setOnClickListener { - binding.preferenceSwitch.isChecked = !binding.preferenceSwitch.isChecked - } - binding.preferenceSwitch.setOnCheckedChangeListener { buttonView, isChecked -> - prefs.edit { putBoolean(prefKey, isChecked) } - mListener?.onChecked(buttonView, isChecked) - } - } - - fun setOnCheckedListener(listener: OnCheckedListener) { - mListener = listener - } - - fun setTitle(title: CharSequence?) { - binding.preferenceSwitchTitle.text = title - } - - fun setSummary(summary: CharSequence?) { - binding.preferenceSwitchSummary.text = summary - } - - fun setKey(key: CharSequence?) { - prefKey = key.toString() - binding.preferenceSwitch.isChecked = prefs.getBoolean(key.toString(), defValue) - } - - fun setDefaultValue(newVal: Boolean) { - defValue = newVal - binding.preferenceSwitch.isChecked = prefs.getBoolean(prefKey, newVal) - } - - fun setChecked(checked: Boolean) { - binding.preferenceSwitch.isChecked = checked - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedAppCard.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedAppCard.kt deleted file mode 100644 index cabfb2c6ed..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedAppCard.kt +++ /dev/null @@ -1,19 +0,0 @@ -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)) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedIconButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedIconButton.kt deleted file mode 100644 index 875ae6eb4e..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedIconButton.kt +++ /dev/null @@ -1,24 +0,0 @@ -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 - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt deleted file mode 100644 index 0e830ca83d..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.util.AttributeSet -import androidx.core.content.res.ResourcesCompat -import androidx.core.graphics.ColorUtils -import com.google.android.material.button.MaterialButton -import com.vanced.manager.R -import com.vanced.manager.utils.accentColor -import com.vanced.manager.utils.lifecycleOwner - -class ThemedMaterialButton @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, - defStyleAttr: Int = 0 -) : MaterialButton(context, attributeSet, defStyleAttr) { - - init { - context.lifecycleOwner?.let { owner -> - accentColor.observe(owner) { color -> - setBgColor(color.toInt()) - } - } - } - - private fun setBgColor(color: Int) { - setBackgroundColor(color) - if (ColorUtils.calculateLuminance(color) < 0.7) { - setTextColor(ResourcesCompat.getColor(resources, R.color.White, null)) - } else { - setTextColor(ResourcesCompat.getColor(resources, R.color.Black, null)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt deleted file mode 100644 index 4b8001bf2b..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.res.ColorStateList -import android.util.AttributeSet -import com.google.android.material.checkbox.MaterialCheckBox -import com.vanced.manager.R -import com.vanced.manager.utils.accentColor - -class ThemedMaterialCheckbox @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, -) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) { - init { - buttonTintList = ColorStateList.valueOf(accentColor.value!!) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt deleted file mode 100644 index 895bcf51cc..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.res.ColorStateList -import android.util.AttributeSet -import com.google.android.material.radiobutton.MaterialRadioButton -import com.vanced.manager.R -import com.vanced.manager.utils.accentColor - -class ThemedMaterialRadioButton @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, -) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) { - init { - buttonTintList = ColorStateList.valueOf(accentColor.value!!) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialSlider.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialSlider.kt deleted file mode 100644 index 8653121b73..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialSlider.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.res.ColorStateList -import android.util.AttributeSet -import com.google.android.material.slider.Slider -import com.vanced.manager.utils.accentColor - -class ThemedMaterialSlider @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, - defStyleAttr: Int = 0 -) : Slider(context, attributeSet, defStyleAttr) { - - init { - val accentValue = ColorStateList.valueOf(accentColor.value!!) - thumbTintList = accentValue - trackActiveTintList = accentValue - trackInactiveTintList = accentValue.withAlpha(70) - haloTintList = accentValue.withAlpha(60) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt deleted file mode 100644 index f8ac0e85db..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.res.ColorStateList -import android.util.AttributeSet -import androidx.core.graphics.ColorUtils -import com.google.android.material.button.MaterialButton -import com.vanced.manager.utils.accentColor -import com.vanced.manager.utils.lifecycleOwner - -class ThemedOutlinedMaterialButton @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, - defStyleAttr: Int = 0 -) : MaterialButton(context, attributeSet, defStyleAttr) { - init { - context.lifecycleOwner?.let { owner -> - accentColor.observe(owner) { color -> - applyAccent(color.toInt()) - } - } - } - - private fun applyAccent(color: Int) { - setTextColor(color) - rippleColor = ColorStateList( - arrayOf(intArrayOf()), - intArrayOf(ColorUtils.setAlphaComponent(color, 50)) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwipeRefreshlayout.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwipeRefreshlayout.kt deleted file mode 100644 index 123da47b4d..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwipeRefreshlayout.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.util.AttributeSet -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.vanced.manager.R -import com.vanced.manager.utils.accentColor - -class ThemedSwipeRefreshlayout @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null -) : SwipeRefreshLayout(context, attributeSet) { - init { - setColorSchemeColors(accentColor.value!!) - initAttrs(context, attributeSet) - } - - private fun initAttrs(context: Context, attributeSet: AttributeSet?) { - attributeSet.let { - val typedAttrs = - context.obtainStyledAttributes(it, R.styleable.ThemedSwipeRefreshlayout, 0, 0) - setProgressBackgroundColorSchemeColor( - typedAttrs.getColor( - R.styleable.ThemedSwipeRefreshlayout_progressBackgroundColor, - 0 - ) - ) - typedAttrs.recycle() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt deleted file mode 100644 index adcbd52b9e..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.content.res.ColorStateList -import android.graphics.Color -import android.util.AttributeSet -import androidx.appcompat.widget.SwitchCompat -import androidx.core.graphics.ColorUtils -import androidx.core.graphics.drawable.DrawableCompat -import com.vanced.manager.R -import com.vanced.manager.utils.accentColor -import com.vanced.manager.utils.lifecycleOwner - -class ThemedSwitchCompat @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, -) : SwitchCompat(context, attributeSet, R.attr.switchStyle) { - - private val states = - arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)) - - init { - context.lifecycleOwner?.let { owner -> - accentColor.observe(owner) { color -> - setSwitchColors(color.toInt()) - } - } - } - - private fun setSwitchColors(color: Int) { - val thumbColors = intArrayOf(Color.LTGRAY, color) - val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70)) - DrawableCompat.setTintList( - DrawableCompat.wrap(thumbDrawable), - ColorStateList(states, thumbColors) - ) - DrawableCompat.setTintList( - DrawableCompat.wrap(trackDrawable), - ColorStateList(states, trackColors) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt deleted file mode 100644 index 86af8211d4..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.vanced.manager.ui.core - -import android.content.Context -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatTextView -import com.vanced.manager.utils.accentColor -import com.vanced.manager.utils.lifecycleOwner - -class ThemedTextView @JvmOverloads constructor( - context: Context, - attributeSet: AttributeSet? = null, - defStyleAttr: Int = 0 -) : AppCompatTextView(context, attributeSet, defStyleAttr) { - init { - context.lifecycleOwner?.let { owner -> - accentColor.observe(owner) { color -> - setTextColor(color.toInt()) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt deleted file mode 100644 index a1bf20892d..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt +++ /dev/null @@ -1,125 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.annotation.SuppressLint -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.vanced.manager.R -import com.vanced.manager.core.downloader.MicrogDownloader.downloadMicrog -import com.vanced.manager.core.downloader.MusicDownloader.downloadMusic -import com.vanced.manager.core.downloader.VancedDownloader.downloadVanced -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogAppDownloadBinding -import com.vanced.manager.utils.* - -class AppDownloadDialog : BindingDialogFragment() { - - companion object { - - const val CLOSE_DIALOG = "close_dialog" - private const val TAG_APP = "TAG_APP" - private const val TAG_VERSION = "TAG_VERSION" - private const val TAG_INSTALLING = "TAG_INSTALLING" - - fun newInstance( - app: String, - version: String? = null, - installing: Boolean = false - ): AppDownloadDialog = AppDownloadDialog().apply { - arguments = Bundle().apply { - putString(TAG_APP, app) - putString(TAG_VERSION, version) - putBoolean(TAG_INSTALLING, installing) - } - } - } - - private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } - - private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == CLOSE_DIALOG) { - dismiss() - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogAppDownloadBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - } - - private fun bindData() { - with(binding) { - isCancelable = false - binding.appDownloadProgressbar.applyAccent() - binding.appInstallProgressbar.applyAccent() - bindDownloadProgress() - val app = arguments?.getString(TAG_APP) - appDownloadHeader.text = app - if (arguments?.getBoolean(TAG_INSTALLING) == false) { - when (app) { - getString(R.string.vanced) -> downloadVanced( - requireContext(), - arguments?.getString(TAG_VERSION) - ) - getString(R.string.music) -> downloadMusic( - requireContext(), - arguments?.getString(TAG_VERSION) - ) - getString(R.string.microg) -> downloadMicrog(requireContext()) - } - } - } - } - - @SuppressLint("SetTextI18n") - private fun DialogAppDownloadBinding.bindDownloadProgress() { - downloadProgress.observe(viewLifecycleOwner) { - appDownloadProgressbar.progress = it - appDownloadProgress.text = "$it%" - } - installing.observe(viewLifecycleOwner) { installing -> - appDownloadProgressbarContainer.isVisible = !installing - appInstallProgressbar.isVisible = installing - appDownloadFile.isVisible = !installing - appDownloadCancel.isEnabled = !installing - appDownloadCancel.setOnClickListener { - if (installing) { - return@setOnClickListener - } - currentDownload?.cancel() - downloadProgress.value = 0 - dismiss() - } - } - downloadingFile.observe(viewLifecycleOwner) { - appDownloadFile.text = it - } - } - - override fun onResume() { - super.onResume() - registerReceiver() - } - - private fun registerReceiver() { - val intentFilter = IntentFilter() - intentFilter.addAction(CLOSE_DIALOG) - localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppInfoDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppInfoDialog.kt deleted file mode 100644 index c3faeaafec..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppInfoDialog.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.annotation.DrawableRes -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogAppInfoBinding - -class AppInfoDialog : BindingDialogFragment() { - - companion object { - - private const val TAG_APP_NAME = "TAG_APP_NAME" - private const val TAG_APP_ICON = "TAG_APP_ICON" - private const val TAG_CHANGELOG = "TAG_CHANGELOG" - - fun newInstance( - appName: String?, - @DrawableRes appIcon: Int?, - changelog: String? - ): AppInfoDialog = AppInfoDialog().apply { - arguments = Bundle().apply { - putString(TAG_APP_NAME, appName) - putString(TAG_CHANGELOG, changelog) - if (appIcon != null) { - putInt(TAG_APP_ICON, appIcon) - } - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogAppInfoBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - } - - private fun bindData() { - with(binding) { - aboutAppName.text = getString(R.string.about_app, arguments?.getString(TAG_APP_NAME)) - aboutAppChangelog.text = arguments?.getString(TAG_CHANGELOG) - arguments?.getInt(TAG_APP_ICON)?.let { aboutAppImage.setImageResource(it) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppUninstallDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppUninstallDialog.kt deleted file mode 100644 index d6c1db6d7a..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppUninstallDialog.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.app.Activity -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogAppUninstallBinding - -class AppUninstallDialog : BindingDialogFragment() { - - companion object { - - private var TAG_APP_NAME: String? = null - - fun newInstance(appName: String?) : AppUninstallDialog = AppUninstallDialog().apply { - arguments = Bundle().apply { - TAG_APP_NAME = appName - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogAppUninstallBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - } - - private fun bindData() { - with(binding) { - appUninstallConfirm.setOnClickListener { - //uninstall instruction ?? - //dataModel?.appPkg?.let { it1 -> viewModel.uninstallPackage(it1) } (taken from original ExpandanbleAppListAdapter.kt) - //but uninstallPackage method is not static so I would be forced to spawn a new HomeViewModel instance - } - appUninstallCancel.setOnClickListener { - dismiss() - } - appUninstallMessage.text = getString(R.string.uninstall_app_text, TAG_APP_NAME) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt deleted file mode 100644 index a57983d3f9..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.content.DialogInterface -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.core.content.edit -import com.google.android.material.radiobutton.MaterialRadioButton -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogBottomRadioButtonBinding -import com.vanced.manager.ui.core.ThemedMaterialRadioButton -import com.vanced.manager.utils.checkedButtonTag -import com.vanced.manager.utils.defPrefs -import com.vanced.manager.utils.formatVersion - -class AppVersionSelectorDialog : - BindingBottomSheetDialogFragment() { - - private val prefs by lazy { requireActivity().defPrefs } - - companion object { - - private const val TAG_VERSIONS = "TAG_VERSIONS" - private const val TAG_APP = "TAG_APP" - - fun newInstance( - versions: List?, - app: String - ): AppVersionSelectorDialog = AppVersionSelectorDialog().apply { - arguments = Bundle().apply { - val arrayList = arrayListOf() - versions?.let { arrayList.addAll(it) } - putStringArrayList(TAG_VERSIONS, arrayList) - putString(TAG_APP, app) - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogBottomRadioButtonBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - loadBoxes()?.forEach { mrb -> - dialogRadiogroup.addView( - mrb, - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - } - val tag = root.findViewWithTag( - prefs.getString("${arguments?.getString(TAG_APP)}_version", "latest") - ) - if (tag != null) { - tag.isChecked = true - } - dialogTitle.text = getString(R.string.version) - dialogSave.setOnClickListener { - val checkedTag = dialogRadiogroup.checkedButtonTag - if (checkedTag != null) { - prefs.edit { putString("${arguments?.getString(TAG_APP)}_version", checkedTag) } - } - dismiss() - } - } - } - - private fun loadBoxes() = - arguments?.getStringArrayList(TAG_VERSIONS)?.map { version -> - ThemedMaterialRadioButton(requireActivity()).apply { - text = version.formatVersion(requireActivity()) - tag = version - textSize = 18f - } - } - - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - if (arguments?.getString(TAG_APP) == "vanced") { - showDialog(VancedPreferencesDialog()) - } else { - showDialog(MusicPreferencesDialog()) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt deleted file mode 100644 index ba34cd253b..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.content.Context -import androidx.core.content.edit -import androidx.preference.PreferenceManager -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.vanced.manager.R -import com.vanced.manager.utils.isMiuiOptimizationsEnabled -import com.vanced.manager.utils.openUrl -import com.vanced.manager.utils.showWithAccent - -object DialogContainer { - - fun showSecurityDialog(context: Context) { - MaterialAlertDialogBuilder(context).apply { - setTitle(context.resources.getString(R.string.welcome)) - setMessage(context.resources.getString(R.string.security_context)) - setPositiveButton(context.resources.getString(R.string.close)) { dialog, _ -> - dialog.cancel() - } - setOnCancelListener { - if (context.isMiuiOptimizationsEnabled) { - miuiDialog(context) - } - } - create() - showWithAccent() - } - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - prefs.edit { putBoolean("firstLaunch", false) } - } - - fun miuiDialog(context: Context) { - MaterialAlertDialogBuilder(context).apply { - setTitle(context.getString(R.string.miui_one_title)) - setMessage(context.getString(R.string.miui_one)) - setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - setPositiveButton(context.getString(R.string.guide)) { _, _ -> - openUrl( - "https://telegra.ph/How-to-install-v15-on-MIUI-02-11", - R.color.Telegram, - context - ) - } - setCancelable(false) - create() - showWithAccent() - } - } - - fun statementFalse(context: Context) { - MaterialAlertDialogBuilder(context).apply { - setTitle("Wait what?") - setMessage("So this statement is false huh? I'll go with True!") - setPositiveButton("wut?") { dialog, _ -> dialog.dismiss() } - create() - showWithAccent() - } - - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - prefs.edit { putBoolean("statement", true) } - } - - fun installAlertBuilder(msg: String, fullMsg: String?, context: Context) { - MaterialAlertDialogBuilder(context).apply { - setTitle(context.getString(R.string.error)) - setMessage(msg) - when (msg) { - context.getString(R.string.installation_signature) -> { - setPositiveButton(context.getString(R.string.guide)) { _, _ -> - openUrl( - "https://lmgtfy.com/?q=andnixsh+apk+verification+disable", - R.color.Twitter, - context - ) - } - setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - if (fullMsg != null) - setNegativeButton(context.getString(R.string.advanced)) { _, _ -> - basicDialog( - context.getString(R.string.advanced), - fullMsg, - context - ) - } - } - context.getString(R.string.installation_miui) -> { - setPositiveButton(context.getString(R.string.guide)) { _, _ -> - openUrl( - "https://telegra.ph/How-to-install-v15-on-MIUI-02-11", - R.color.Telegram, - context - ) - } - setNeutralButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - if (fullMsg != null) - setNegativeButton(context.getString(R.string.advanced)) { _, _ -> - basicDialog( - context.getString(R.string.advanced), - fullMsg, - context - ) - } - } - else -> { - setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - if (fullMsg != null) - setNegativeButton(context.getString(R.string.advanced)) { _, _ -> - basicDialog( - context.getString(R.string.advanced), - fullMsg, - context - ) - } - } - } - create() - showWithAccent() - } - } - - fun basicDialog(title: String, msg: String, context: Context) { - MaterialAlertDialogBuilder(context).apply { - setTitle(title) - setMessage(msg) - setPositiveButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - create() - showWithAccent() - } - } - -} diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/InstallationFilesDetectedDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/InstallationFilesDetectedDialog.kt deleted file mode 100644 index 35292e7e7e..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/InstallationFilesDetectedDialog.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.R -import com.vanced.manager.core.downloader.MicrogDownloader.startMicrogInstall -import com.vanced.manager.core.downloader.MusicDownloader.startMusicInstall -import com.vanced.manager.core.downloader.VancedDownloader.startVancedInstall -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogInstallationFilesDetectedBinding -import com.vanced.manager.utils.defPrefs -import com.vanced.manager.utils.managerVariant - -class InstallationFilesDetectedDialog : - BindingBottomSheetDialogFragment() { - - companion object { - - private const val TAG_APP = "TAG_APP" - - fun newInstance( - app: String - ): InstallationFilesDetectedDialog = InstallationFilesDetectedDialog().apply { - arguments = Bundle().apply { - putString(TAG_APP, app) - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogInstallationFilesDetectedBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val app = - arguments?.getString(TAG_APP) ?: throw IllegalArgumentException("app name is null") - installationDetectedTitle.text = getString(R.string.app_install_files_detected, app) - installationDetectedSummary.text = - getString(R.string.app_install_files_detected_summary, app) - installationDetectedRedownload.setOnClickListener { - dismiss() - when (app) { - getString(R.string.vanced) -> showDialog(VancedPreferencesDialog()) - getString(R.string.music) -> showDialog(MusicPreferencesDialog()) - else -> showDialog(AppDownloadDialog.newInstance(app)) - } - } - installationDetectedInstall.setOnClickListener { - dismiss() - when (app) { - getString(R.string.vanced) -> startVancedInstall( - requireContext(), - context?.defPrefs?.managerVariant - ) - getString(R.string.music) -> startMusicInstall(requireContext()) - getString(R.string.microg) -> startMicrogInstall(requireContext()) - } - showDialog( - AppDownloadDialog.newInstance( - app = app, - installing = true - ) - ) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt deleted file mode 100644 index 44219a52e3..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt +++ /dev/null @@ -1,128 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.content.DialogInterface -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.TextView -import android.widget.Toast -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.madrapps.pikolo.listeners.OnColorSelectionListener -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogManagerAccentColorBinding -import com.vanced.manager.utils.* -import com.vanced.manager.utils.AppUtils.log - -class ManagerAccentColorDialog : BindingDialogFragment() { - - companion object { - fun newInstance(): ManagerAccentColorDialog = ManagerAccentColorDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerAccentColorBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - } - - override fun onCancel(dialog: DialogInterface) { - super.onCancel(dialog) - mutableAccentColor.value = prefs.getInt("manager_accent_color", defAccentColor) - } - - private fun bindData() { - with(binding) { - val accent = prefs.getInt("manager_accent_color", defAccentColor) - hexEdittext.apply { - setText(accent.toHex(), TextView.BufferType.EDITABLE) - addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged( - s: CharSequence?, - start: Int, - count: Int, - after: Int - ) { - } - - override fun onTextChanged( - s: CharSequence?, - start: Int, - before: Int, - count: Int - ) { - if (length() == 0) { - setText("#") - setSelection(1) - } - - if (accentColor.value?.toHex() != text.toString() && length() == 7) { - try { - val colorFromEditText = Color.parseColor(text.toString()) - accentPicker.setColor(colorFromEditText) - mutableAccentColor.value = colorFromEditText - } catch (e: IllegalArgumentException) { - } - } - } - - override fun afterTextChanged(s: Editable?) {} - - }) - } - accentPicker.apply { - setColor(accent) - setColorSelectionListener(object : OnColorSelectionListener { - override fun onColorSelected(color: Int) { - mutableAccentColor.value = color - hexEdittext.setText(color.toHex(), TextView.BufferType.EDITABLE) - } - - override fun onColorSelectionEnd(color: Int) {} - - override fun onColorSelectionStart(color: Int) {} - - }) - } - accentCancel.setOnClickListener { - mutableAccentColor.value = accent - dismiss() - } - accentSave.setOnClickListener { - try { - val colorFromEditText = Color.parseColor(hexEdittext.text.toString()) - mutableAccentColor.value = colorFromEditText - prefs.managerAccent = colorFromEditText - } catch (e: IllegalArgumentException) { - log("VMTheme", getString(R.string.failed_accent)) - Toast.makeText( - requireActivity(), - getString(R.string.failed_accent), - Toast.LENGTH_SHORT - ).show() - return@setOnClickListener - } - - dismiss() - } - accentReset.setOnClickListener { - prefs.managerAccent = defAccentColor - mutableAccentColor.value = defAccentColor - dismiss() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt deleted file mode 100644 index 73a8f108f3..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.databinding.DialogManagerLanguageBinding -import com.vanced.manager.ui.core.ThemedMaterialRadioButton -import com.vanced.manager.utils.checkedButtonTag -import com.vanced.manager.utils.getLanguageFormat -import com.vanced.manager.utils.managerLang - -class ManagerLanguageDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): ManagerLanguageDialog = ManagerLanguageDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerLanguageBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - addRadioButtons().forEach { mrb -> - languageRadiogroup.addView(mrb, MATCH_PARENT, WRAP_CONTENT) - } - val language = prefs.managerLang - root.findViewWithTag(language)?.isChecked = true - languageSave.setOnClickListener { - val newPref = binding.languageRadiogroup.checkedButtonTag - if (language != newPref) { - prefs.managerLang = newPref - dismiss() - requireActivity().recreate() - } else { - dismiss() - } - } - } - } - - private fun addRadioButtons() = - (arrayOf("System Default") + MANAGER_LANGUAGES).map { lang -> - ThemedMaterialRadioButton(requireActivity()).apply { - text = getLanguageFormat(requireActivity(), lang) - textSize = 18f - tag = lang - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerThemeDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerThemeDialog.kt deleted file mode 100644 index 8113a0edc5..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerThemeDialog.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.google.android.material.radiobutton.MaterialRadioButton -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.databinding.DialogManagerThemeBinding -import com.vanced.manager.utils.checkedButtonTag -import com.vanced.manager.utils.managerTheme - -class ManagerThemeDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): ManagerThemeDialog = ManagerThemeDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerThemeBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val theme = prefs.managerTheme - root.findViewWithTag(theme).isChecked = true - themeSave.setOnClickListener { - val newPref = themeRadiogroup.checkedButtonTag - if (theme != newPref) { - prefs.managerTheme = newPref - dismiss() - requireActivity().recreate() - } else { - dismiss() - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerUpdateDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerUpdateDialog.kt deleted file mode 100644 index e8636cfd53..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerUpdateDialog.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.annotation.SuppressLint -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.vanced.manager.BuildConfig.VERSION_CODE -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogManagerUpdateBinding -import com.vanced.manager.utils.DownloadHelper.downloadManager -import com.vanced.manager.utils.applyAccent -import com.vanced.manager.utils.currentDownload -import com.vanced.manager.utils.downloadProgress -import com.vanced.manager.utils.manager - -class ManagerUpdateDialog : BindingDialogFragment() { - - companion object { - - const val CLOSE_DIALOG = "CLOSE_DIALOG" - private const val TAG_FORCE_UPDATE = "TAG_FORCE_UPDATE" - - fun newInstance( - forceUpdate: Boolean - ): ManagerUpdateDialog = ManagerUpdateDialog().apply { - arguments = Bundle().apply { - putBoolean(TAG_FORCE_UPDATE, forceUpdate) - } - } - } - - private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } - - private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - when (intent.action) { - CLOSE_DIALOG -> dismiss() - } - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerUpdateBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - if (arguments?.getBoolean(TAG_FORCE_UPDATE) == true) { - binding.managerUpdatePatient.text = - requireActivity().getString(R.string.please_be_patient) - downloadManager(requireActivity()) - } else { - checkUpdates() - } - } - - private fun bindData() { - with(binding) { - isCancelable = false - managerUpdateProgressbar.applyAccent() - managerUpdateCancel.setOnClickListener { - downloadProgress.value = 0 - currentDownload?.cancel() - dismiss() - } - bindDownloadProgress() - } - } - - @SuppressLint("SetTextI18n") - private fun DialogManagerUpdateBinding.bindDownloadProgress() { - downloadProgress.observe(viewLifecycleOwner) { - managerUpdateProgressbar.progress = it - managerUpdateProgressbarContainer.isVisible = it != 0 - managerUpdateProgress.text = "$it%" - } - } - - override fun onResume() { - super.onResume() - registerReceiver() - } - - override fun onPause() { - super.onPause() - localBroadcastManager.unregisterReceiver(broadcastReceiver) - } - - private fun checkUpdates() { - if (manager.value?.int("versionCode") ?: 0 > VERSION_CODE) { - binding.managerUpdatePatient.text = - requireActivity().getString(R.string.please_be_patient) - downloadManager(requireActivity()) - } else { - binding.managerUpdatePatient.text = - requireActivity().getString(R.string.update_not_found) - } - } - - private fun registerReceiver() { - val intentFilter = IntentFilter() - intentFilter.addAction(CLOSE_DIALOG) - localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt deleted file mode 100644 index e837a043f2..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.google.android.material.radiobutton.MaterialRadioButton -import com.topjohnwu.superuser.Shell -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.databinding.DialogManagerVariantBinding -import com.vanced.manager.utils.checkedButtonTag -import com.vanced.manager.utils.managerVariant - -class ManagerVariantDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): ManagerVariantDialog = ManagerVariantDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogManagerVariantBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val variant = prefs.managerVariant - root.findViewWithTag(variant).isChecked = true - variantSave.setOnClickListener { - val newPref = variantRadiogroup.checkedButtonTag - if (variant != newPref) { - prefs.managerVariant = - if (newPref == "root" && Shell.rootAccess()) { - "root" - } else { - "nonroot" - } - dismiss() - requireActivity().recreate() - } else { - dismiss() - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/MusicPreferencesDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/MusicPreferencesDialog.kt deleted file mode 100644 index ab39146c8a..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/MusicPreferencesDialog.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogMusicPreferencesBinding -import com.vanced.manager.utils.* - -class MusicPreferencesDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): MusicPreferencesDialog = MusicPreferencesDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { requireActivity().defPrefs } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogMusicPreferencesBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val musicVersionsConv = musicVersions.value?.value?.convertToAppVersions() - musicInstallTitle.text = - getString(R.string.app_installation_preferences, getString(R.string.music)) - musicVersion.text = getString( - R.string.chosen_version, - prefs.musicVersion?.formatVersion(requireActivity()) - ) - openVersionSelectorLayout.setOnClickListener { - dismiss() - showDialog( - AppVersionSelectorDialog.newInstance( - versions = musicVersionsConv, - app = "music" - ) - ) - } - musicInstall.setOnClickListener { - dismiss() - showDialog( - AppDownloadDialog.newInstance( - app = getString(R.string.music) - ) - ) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/SelectAppsDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/SelectAppsDialog.kt deleted file mode 100644 index f02b93d6c2..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/SelectAppsDialog.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.content.edit -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import androidx.recyclerview.widget.LinearLayoutManager -import com.vanced.manager.R -import com.vanced.manager.adapter.SelectAppsAdapter -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.databinding.DialogSelectAppsBinding - -class SelectAppsDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): SelectAppsDialog = SelectAppsDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogSelectAppsBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val ad = SelectAppsAdapter(requireActivity()) - selectAppsRecycler.apply { - layoutManager = LinearLayoutManager(requireActivity()) - adapter = ad - setHasFixedSize(true) - } - selectAppsSave.setOnClickListener { - if (ad.apps.all { app -> !app.isChecked }) { - Toast.makeText( - requireActivity(), - R.string.select_at_least_one_app, - Toast.LENGTH_SHORT - ).show() - return@setOnClickListener - } - prefs.edit { - ad.apps.forEach { app -> - putBoolean("enable_${app.tag}", app.isChecked) - putBoolean("${app.tag}_notifs", app.isChecked) - } - } - dismiss() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ServiceDTimerDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ServiceDTimerDialog.kt deleted file mode 100644 index f78c08c9c7..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ServiceDTimerDialog.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.content.edit -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogServicedTimerBinding -import com.vanced.manager.utils.PackageHelper -import com.vanced.manager.utils.PackageHelper.getPackageDir -import com.vanced.manager.utils.PackageHelper.getPkgNameRoot -import com.vanced.manager.utils.PackageHelper.scriptExists -import com.vanced.manager.utils.defPrefs -import com.vanced.manager.utils.writeServiceDScript -import java.io.IOException -import java.util.* - -class ServiceDTimerDialog : BindingDialogFragment() { - - private val prefs by lazy { requireActivity().defPrefs } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): DialogServicedTimerBinding = DialogServicedTimerBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - servicedSlider.value = prefs.getInt("serviced_sleep_timer", 1).toFloat() - servicedCancel.setOnClickListener { - dismiss() - } - servicedSave.setOnClickListener { - try { - arrayOf("vanced", "music").forEach { app -> - if (scriptExists(app)) { - val apkFPath = - "${PackageHelper.apkInstallPath}/${app.capitalize(Locale.ROOT)}/base.apk" - getPackageDir( - requireActivity(), - getPkgNameRoot(app) - )?.let { it1 -> - requireActivity().writeServiceDScript( - apkFPath, - it1, - app - ) - } - } - } - } catch (e: IOException) { - Toast.makeText( - requireActivity(), - R.string.script_save_failed, - Toast.LENGTH_SHORT - ).show() - return@setOnClickListener - } - - prefs.edit { - putInt("serviced_sleep_timer", servicedSlider.value.toInt()) - } - dismiss() - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt deleted file mode 100644 index 779adc6d94..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.TextView -import androidx.lifecycle.lifecycleScope -import com.vanced.manager.core.ui.base.BindingDialogFragment -import com.vanced.manager.databinding.DialogCustomUrlBinding -import com.vanced.manager.utils.* -import kotlinx.coroutines.launch - -class URLChangeDialog : BindingDialogFragment() { - - private val prefs by lazy { requireActivity().defPrefs } - - companion object { - - fun newInstance(): URLChangeDialog = URLChangeDialog().apply { - arguments = Bundle() - } - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogCustomUrlBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - bindData() - } - - private fun bindData() { - with(binding) { - urlInput.setText( - if (arguments != null) { - arguments?.getString("url") - } else { - prefs.installUrl - }, - TextView.BufferType.EDITABLE - ) - urlSave.setOnClickListener { - val finalUrl = - if (urlInput.text?.startsWith("https://") == true || urlInput.text?.startsWith("http://") == true) { - urlInput.text?.removeSuffix("/").toString() - } else { - "https://${urlInput.text}".removeSuffix("/") - } - saveUrl(finalUrl) - } - urlReset.setOnClickListener { saveUrl(baseUrl) } - } - } - - private fun saveUrl(url: String) { - lifecycleScope.launch { - prefs.installUrl = url - baseInstallUrl = url - loadJson(requireActivity()) - dismiss() - } - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt deleted file mode 100644 index 412f1da756..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.content.DialogInterface -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import android.widget.LinearLayout -import android.widget.Toast -import com.google.android.material.checkbox.MaterialCheckBox -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogVancedLanguageSelectionBinding -import com.vanced.manager.ui.core.ThemedMaterialCheckbox -import com.vanced.manager.utils.installPrefs -import com.vanced.manager.utils.lang -import com.vanced.manager.utils.vanced -import java.util.* - -class VancedLanguageSelectionDialog : - BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): VancedLanguageSelectionDialog = VancedLanguageSelectionDialog().apply { - arguments = Bundle() - } - } - - private val langs = vanced.value?.array("langs")?.value - private val prefs by lazy { requireActivity().installPrefs } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogVancedLanguageSelectionBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - langButtonLl.loadBoxes() - vancedInstallFinish.setOnClickListener { - val chosenLangs = mutableListOf() - langs?.forEach { lang -> - if (root.findViewWithTag(lang).isChecked) { - chosenLangs.add(lang) - } - } - if (chosenLangs.isEmpty()) { - Toast.makeText( - requireActivity(), - R.string.select_at_least_one_lang, - Toast.LENGTH_SHORT - ).show() - return@setOnClickListener - } - prefs.lang = chosenLangs.joinToString() - dismiss() - } - } - } - - private fun LinearLayout.loadBoxes() { - val langPrefs = prefs.lang - langs?.forEach { lang -> - val loc = Locale(lang) - val box = ThemedMaterialCheckbox(requireActivity()).apply { - tag = lang - isChecked = langPrefs?.contains(lang) ?: false - text = loc.getDisplayLanguage(loc).capitalize(Locale.ROOT) - textSize = 18F - } - addView(box, MATCH_PARENT, WRAP_CONTENT) - } - } - - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - showDialog(VancedPreferencesDialog()) - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt deleted file mode 100644 index 73bd1a1678..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedPreferencesDialog.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogVancedPreferencesBinding -import com.vanced.manager.utils.* -import java.util.* - -class VancedPreferencesDialog : BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): VancedPreferencesDialog = VancedPreferencesDialog().apply { - arguments = Bundle() - } - } - - private val defPrefs by lazy { requireActivity().defPrefs } - private val installPrefs by lazy { requireActivity().installPrefs } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogVancedPreferencesBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - val showLang = mutableListOf() - installPrefs.lang?.split(", ")?.forEach { lang -> - val loc = Locale(lang) - showLang.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT)) - } - val vancedVersionsConv = vancedVersions.value?.value?.convertToAppVersions() - vancedInstallTitle.text = - getString(R.string.app_installation_preferences, getString(R.string.vanced)) - vancedTheme.text = getString( - R.string.chosen_theme, - installPrefs.theme?.convertToAppTheme(requireActivity()) - ) - vancedVersion.text = getString( - R.string.chosen_version, - defPrefs.vancedVersion?.formatVersion(requireActivity()) - ) - vancedLang.text = getString(R.string.chosen_lang, showLang) - openThemeSelectorLayout.setOnClickListener { - dismiss() - showDialog(VancedThemeSelectorDialog()) - } - openVersionSelectorLayout.setOnClickListener { - dismiss() - showDialog( - AppVersionSelectorDialog.newInstance( - versions = vancedVersionsConv, - app = "vanced" - ) - ) - } - openLanguageSelectorLayout.setOnClickListener { - dismiss() - showDialog(VancedLanguageSelectionDialog()) - } - vancedInstall.setOnClickListener { - if (showLang.isEmpty()) { - installPrefs.lang = "en" - } - dismiss() - showDialog( - AppDownloadDialog.newInstance( - app = getString(R.string.vanced) - ) - ) - } - } - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt deleted file mode 100644 index 5b097b1dfe..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt +++ /dev/null @@ -1,81 +0,0 @@ -package com.vanced.manager.ui.dialogs - -import android.content.Context -import android.content.DialogInterface -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.DialogBottomRadioButtonBinding -import com.vanced.manager.ui.core.ThemedMaterialRadioButton -import com.vanced.manager.utils.checkedButtonTag -import com.vanced.manager.utils.convertToAppTheme -import com.vanced.manager.utils.theme -import com.vanced.manager.utils.vanced - -class VancedThemeSelectorDialog : - BindingBottomSheetDialogFragment() { - - companion object { - - fun newInstance(): VancedThemeSelectorDialog = VancedThemeSelectorDialog().apply { - arguments = Bundle() - } - } - - private val prefs by lazy { - requireActivity().getSharedPreferences( - "installPrefs", - Context.MODE_PRIVATE - ) - } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = DialogBottomRadioButtonBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - loadButtons()?.forEach { mrb -> - dialogRadiogroup.addView( - mrb, - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) - } - dialogTitle.text = requireActivity().getString(R.string.theme) - val tag = root.findViewWithTag(prefs.theme) - if (tag != null) { - tag.isChecked = true - } - dialogSave.setOnClickListener { - val checkedTag = binding.dialogRadiogroup.checkedButtonTag - if (checkedTag != null) { - prefs.theme = checkedTag - } - dismiss() - } - } - } - - private fun loadButtons() = vanced.value?.array("themes")?.value?.map { theme -> - ThemedMaterialRadioButton(requireActivity()).apply { - text = theme.convertToAppTheme(requireActivity()) - tag = theme - textSize = 18f - } - } - - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - showDialog(VancedPreferencesDialog()) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/AboutFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/AboutFragment.kt deleted file mode 100644 index 97e83e08c9..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/AboutFragment.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.annotation.SuppressLint -import android.os.Bundle -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.content.edit -import androidx.fragment.app.viewModels -import androidx.preference.PreferenceManager -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.FragmentAboutBinding -import com.vanced.manager.ui.dialogs.AppInfoDialog -import com.vanced.manager.ui.viewmodels.AboutViewModel -import com.vanced.manager.utils.manager - -class AboutFragment : BindingFragment() { - - private val viewModel: AboutViewModel by viewModels() - private var count = 0 - private var startMillSec: Long = 0 - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentAboutBinding.inflate(inflater, container, false) - - override fun otherSetups() { - dataBind() - } - - @SuppressLint("ClickableViewAccessibility") - private fun dataBind() { - requireActivity().title = getString(R.string.title_about) - binding.aboutVersionCard.setOnClickListener { - showDialog( - AppInfoDialog.newInstance( - appName = getString(R.string.app_name), - appIcon = R.mipmap.ic_launcher, - changelog = manager.value?.string("changelog") - ) - ) - } - binding.root.setOnTouchListener { _, event: MotionEvent -> - val eventAction = event.action - if (eventAction == MotionEvent.ACTION_UP) { - val time = System.currentTimeMillis() - if (startMillSec == 0L || time - startMillSec > 3000) { - startMillSec = time - count = 1 - } else { - count++ - } - - if (count == 5) { - val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) - val devSettings = prefs.getBoolean("devSettings", false) - if (!devSettings) { - Toast.makeText( - requireContext(), - "Dev options unlocked!", - Toast.LENGTH_SHORT - ).show() - prefs.edit { putBoolean("devSettings", true) } - } else - Toast.makeText( - requireContext(), - "Dev options already unlocked", - Toast.LENGTH_SHORT - ).show() - - } - return@setOnTouchListener true - } - false - } - binding.aboutGithubButton.setOnClickListener { viewModel.openUrl("https://github.com/YTVanced/VancedInstaller") } - binding.aboutLicenseButton.setOnClickListener { viewModel.openUrl("https://raw.githubusercontent.com/YTVanced/VancedInstaller/dev/LICENSE") } - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/DevSettingsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/DevSettingsFragment.kt deleted file mode 100644 index ef271d6a83..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/DevSettingsFragment.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.content.Intent -import android.os.Build -import android.os.Bundle -import android.provider.Settings -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.annotation.RequiresApi -import androidx.core.content.edit -import androidx.core.net.toUri -import androidx.core.view.isVisible -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.crowdin.platform.Crowdin -import com.vanced.manager.BuildConfig -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentDevSettingsBinding -import com.vanced.manager.ui.WelcomeActivity -import com.vanced.manager.ui.dialogs.ManagerUpdateDialog -import com.vanced.manager.ui.dialogs.URLChangeDialog -import com.vanced.manager.utils.authCrowdin - -class DevSettingsFragment : BindingFragment() { - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentDevSettingsBinding.inflate(inflater, container, false) - - override fun otherSetups() { - setHasOptionsMenu(true) - bindData() - } - - private fun bindData() { - with(binding) { - bindWelcomeLauncher() - bindForceUpdate() - bindChannelURL() - bindCrowdin() - bindKernelArch() - bindAndroidVersion() - } - } - - private fun FragmentDevSettingsBinding.bindWelcomeLauncher() { - welcomeScreenLauncher.setOnClickListener { - prefs.edit { - putBoolean("firstLaunch", true) - putBoolean("show_changelog_tooltip", true) - } - startActivity(Intent(requireContext(), WelcomeActivity::class.java)) - requireActivity().finish() - } - } - - private fun FragmentDevSettingsBinding.bindForceUpdate() { - forceManagerUpdate.setOnClickListener { - ManagerUpdateDialog.newInstance(true).show( - requireActivity().supportFragmentManager, - "update_manager" - ) - } - } - - private fun FragmentDevSettingsBinding.bindChannelURL() { - channelUrl.setOnClickListener { - URLChangeDialog().show(childFragmentManager.beginTransaction(), null) - } - } - - private fun FragmentDevSettingsBinding.bindCrowdin() { - if (BuildConfig.ENABLE_CROWDIN_AUTH) { - val isAuthorized = Crowdin.isAuthorized() - crowdinCategory.isVisible = true - - crowdinAuth.isVisible = !isAuthorized - screenshotUploading.isVisible = isAuthorized - realTimeUpdates.isVisible = isAuthorized - - crowdinAuth.setOnClickListener { - requireActivity().authCrowdin() - @RequiresApi(Build.VERSION_CODES.M) - if (!Settings.canDrawOverlays(requireActivity())) { - val intent = Intent( - Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - ("package:" + requireActivity().packageName).toUri() - ) - startActivityForResult(intent, 69) - } - - Crowdin.authorize(requireActivity()) - } - } - } - - private fun FragmentDevSettingsBinding.bindKernelArch() { - val supportedAbis: Array = Build.SUPPORTED_ABIS - - kernelArch.setSummary( - if (supportedAbis.contains("arm64-v8a") || supportedAbis.contains("x86_64")) { - "64bit" - } else { - "32bit" - } - ) - } - - private fun FragmentDevSettingsBinding.bindAndroidVersion() { - androidVersion.setSummary("${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt deleted file mode 100644 index ddf732af8f..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/GrantRootFragment.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.content.Intent -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.content.edit -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.topjohnwu.superuser.Shell -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentGrantRootBinding -import com.vanced.manager.ui.MainActivity - -class GrantRootFragment : BindingFragment() { - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentGrantRootBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - grantRootFinishFab.setOnClickListener { navigateToFirstLaunch() } - grantRootFab.setOnClickListener { grantRoot() } - } - } - - private fun navigateToFirstLaunch() { - val intent = Intent(requireActivity(), MainActivity::class.java) - intent.putExtra("firstLaunch", true) - startActivity(intent) - requireActivity().finish() - } - - private fun grantRoot() { - if (Shell.rootAccess()) { - getDefaultSharedPreferences(requireActivity()).edit { - putString( - "vanced_variant", - "root" - ) - } - navigateToFirstLaunch() - } else { - Toast.makeText(requireActivity(), R.string.root_not_granted, Toast.LENGTH_SHORT).show() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt deleted file mode 100644 index f342f237bc..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt +++ /dev/null @@ -1,118 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.os.Bundle -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.ViewGroup -import androidx.fragment.app.viewModels -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import androidx.recyclerview.widget.LinearLayoutManager -import com.crowdin.platform.util.inflateWithCrowdin -import com.google.android.flexbox.FlexboxLayoutManager -import com.google.android.flexbox.JustifyContent -import com.vanced.manager.R -import com.vanced.manager.adapter.ExpandableAppListAdapter -import com.vanced.manager.adapter.LinkAdapter -import com.vanced.manager.adapter.SponsorAdapter -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentHomeBinding -import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder -import com.vanced.manager.ui.viewmodels.HomeViewModel -import com.vanced.manager.ui.viewmodels.HomeViewModelFactory -import com.vanced.manager.utils.isFetching - -class HomeFragment : BindingFragment() { - - companion object { - const val INSTALL_FAILED = "INSTALL_FAILED" - const val REFRESH_HOME = "REFRESH_HOME" - } - - private val viewModel: HomeViewModel by viewModels { - HomeViewModelFactory(requireActivity()) - } - - private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) } - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentHomeBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - requireActivity().title = getString(R.string.title_home) - setHasOptionsMenu(true) - with(binding) { - homeRefresh.setOnRefreshListener { viewModel.fetchData() } - isFetching.observe(viewLifecycleOwner) { homeRefresh.isRefreshing = it } - - recyclerAppList.apply { - layoutManager = LinearLayoutManager(requireActivity()) - adapter = ExpandableAppListAdapter(requireActivity(), viewModel /*, tooltip*/) - setHasFixedSize(true) - } - - recyclerSponsors.apply { - val lm = FlexboxLayoutManager(requireActivity()) - lm.justifyContent = JustifyContent.SPACE_EVENLY - layoutManager = lm - setHasFixedSize(true) - adapter = SponsorAdapter(requireActivity(), viewModel) - } - - recyclerLinks.apply { - val lm = FlexboxLayoutManager(requireActivity()) - lm.justifyContent = JustifyContent.SPACE_EVENLY - layoutManager = lm - setHasFixedSize(true) - adapter = LinkAdapter(requireActivity(), viewModel) - } - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflateWithCrowdin(R.menu.toolbar_menu, menu, resources) - super.onCreateOptionsMenu(menu, inflater) - } - - override fun onPause() { - super.onPause() - localBroadcastManager.unregisterReceiver(broadcastReceiver) - } - - override fun onResume() { - super.onResume() - registerReceivers() - } - - private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - when (intent.action) { - INSTALL_FAILED -> installAlertBuilder( - intent.getStringExtra("errorMsg").toString(), - intent.getStringExtra("fullErrorMsg"), - requireActivity() - ) - REFRESH_HOME -> viewModel.fetchData() - } - } - } - - private fun registerReceivers() { - val intentFilter = IntentFilter() - intentFilter.addAction(INSTALL_FAILED) - intentFilter.addAction(REFRESH_HOME) - localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) - } -} - diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt deleted file mode 100644 index 94a1affaa3..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/LogFragment.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.os.Bundle -import android.text.TextUtils -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import com.vanced.manager.R -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentLogBinding -import com.vanced.manager.utils.AppUtils.logs -import java.io.File -import java.io.FileWriter -import java.io.IOException -import java.util.* - -class LogFragment : BindingFragment() { - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentLogBinding.inflate(inflater, container, false) - - override fun otherSetups() { - binding.bindData() - } - - private fun FragmentLogBinding.bindData() { - val logs = TextUtils.concat(*logs.toTypedArray()) - logText.text = logs - logSave.setOnClickListener { - try { - val calendar = Calendar.getInstance() - val year = calendar.get(Calendar.YEAR) - val month = calendar.get(Calendar.MONTH) - val day = calendar.get(Calendar.DAY_OF_MONTH) - val hour = calendar.get(Calendar.HOUR_OF_DAY) - val minute = calendar.get(Calendar.MINUTE) - val second = calendar.get(Calendar.SECOND) - val log = - File(requireActivity().getExternalFilesDir("logs")?.path + "/$year$month${day}_$hour$minute$second.log") - FileWriter(log).apply { - append(logs) - flush() - close() - } - Toast.makeText(requireActivity(), R.string.logs_saved, Toast.LENGTH_SHORT).show() - } catch (e: IOException) { - Toast.makeText(requireActivity(), R.string.logs_not_saved, Toast.LENGTH_SHORT) - .show() - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt deleted file mode 100644 index 809f8d5b39..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SelectAppsFragment.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.content.edit -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import androidx.recyclerview.widget.LinearLayoutManager -import com.vanced.manager.R -import com.vanced.manager.adapter.SelectAppsAdapter -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentSelectAppsBinding -import com.vanced.manager.ui.WelcomeActivity - -class SelectAppsFragment : BindingFragment() { - - private lateinit var selectAdapter: SelectAppsAdapter - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentSelectAppsBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - with(binding) { - initRecycler() - selectAppsFab.setOnClickListener { actionOnClickAppsFab() } - } - } - - private fun FragmentSelectAppsBinding.initRecycler() { - selectAdapter = SelectAppsAdapter(requireActivity()) - selectAppsRecycler.apply { - layoutManager = LinearLayoutManager(requireActivity()) - setHasFixedSize(true) - adapter = selectAdapter - } - } - - private fun actionOnClickAppsFab() { - if (selectAdapter.apps.all { app -> !app.isChecked }) { - Toast.makeText(requireActivity(), R.string.select_at_least_one_app, Toast.LENGTH_SHORT) - .show() - return - } - val prefs = getDefaultSharedPreferences(requireActivity()) - selectAdapter.apps.forEach { app -> - prefs.edit { putBoolean("enable_${app.tag}", app.isChecked) } - } - (requireActivity() as WelcomeActivity).navigateTo(2) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt deleted file mode 100644 index 28afa7c4c9..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt +++ /dev/null @@ -1,154 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.core.view.isVisible -import androidx.fragment.app.FragmentActivity -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import androidx.recyclerview.widget.LinearLayoutManager -import com.google.firebase.analytics.FirebaseAnalytics -import com.google.firebase.crashlytics.FirebaseCrashlytics -import com.google.firebase.perf.FirebasePerformance -import com.vanced.manager.R -import com.vanced.manager.adapter.GetNotifAdapter -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.core.ui.ext.showDialog -import com.vanced.manager.databinding.FragmentSettingsBinding -import com.vanced.manager.ui.dialogs.* -import com.vanced.manager.utils.accentColor -import com.vanced.manager.utils.defAccentColor -import com.vanced.manager.utils.getLanguageFormat -import com.vanced.manager.utils.toHex -import java.io.File - -class SettingsFragment : BindingFragment() { - - private companion object { - const val LIGHT = "Light" - const val DARK = "Dark" - } - - private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - - private lateinit var variant: String - private lateinit var parentActivity: FragmentActivity - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentSettingsBinding.inflate(inflater, container, false) - - override fun otherSetups() { - setHasOptionsMenu(true) - parentActivity = requireActivity() - bindData() - } - - private fun bindData() { - with(binding) { - variant = prefs.getString("vanced_variant", "nonroot").toString() - bindRecycler() - bindFirebase() - bindManagerVariant() - bindServiceDTimer() - bindClearFiles() - bindManagerTheme() - bindManagerAccentColor() - bindManagerLanguage() - selectApps.setOnClickListener { showDialog(SelectAppsDialog()) } - } - } - - private fun FragmentSettingsBinding.bindRecycler() { - notificationsRecycler.apply { - layoutManager = LinearLayoutManager(parentActivity) - adapter = GetNotifAdapter(parentActivity) - } - } - - private fun FragmentSettingsBinding.bindFirebase() { - firebase.setOnCheckedListener { _, isChecked -> - FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isChecked) - FirebasePerformance.getInstance().isPerformanceCollectionEnabled = isChecked - FirebaseAnalytics.getInstance(parentActivity).setAnalyticsCollectionEnabled(isChecked) - } - } - - private fun FragmentSettingsBinding.bindManagerVariant() { - managerVariant.apply { - setSummary(variant) - setOnClickListener { showDialog(ManagerVariantDialog()) } - } - } - - private fun FragmentSettingsBinding.bindServiceDTimer() { - servicedTimer.apply { - if (variant == "root") this.isVisible = true - setOnClickListener { showDialog(ServiceDTimerDialog()) } - } - } - - private fun FragmentSettingsBinding.bindClearFiles() { - clearFiles.setOnClickListener { - with(requireActivity()) { - listOf( - "vanced/nonroot", - "vanced/root", - "music/nonroot", - "music/root", - "microg" - ).forEach { dir -> - File(getExternalFilesDir(dir)?.path.toString()).deleteRecursively() - } - Toast.makeText(this, getString(R.string.cleared_files), Toast.LENGTH_SHORT).show() - } - } - } - - private fun FragmentSettingsBinding.bindManagerTheme() { - val themePref = prefs.getString("manager_theme", "System Default") - managerTheme.apply { - setSummary( - when (themePref) { - LIGHT -> getString(R.string.theme_light) - DARK -> getString(R.string.theme_dark) - else -> getString(R.string.system_default) - } - ) - setOnClickListener { showDialog(ManagerThemeDialog()) } - } - } - - private fun FragmentSettingsBinding.bindManagerAccentColor() { - managerAccentColor.apply { - setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex()) - setOnClickListener { showDialog(ManagerAccentColorDialog()) } - accentColor.observe(viewLifecycleOwner) { - setSummary(it.toHex()) - } - } - } - - private fun FragmentSettingsBinding.bindManagerLanguage() { - val langPref = prefs.getString("manager_lang", "System Default") - managerLanguage.apply { - setSummary(getLanguageFormat(parentActivity, requireNotNull(langPref))) - setOnClickListener { showDialog(ManagerLanguageDialog()) } - } - - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - val devSettings = - getDefaultSharedPreferences(requireActivity()).getBoolean("devSettings", false) - if (devSettings) { - inflater.inflate(R.menu.dev_settings_menu, menu) - } - super.onCreateOptionsMenu(menu, inflater) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragmentCompose.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragmentCompose.kt deleted file mode 100644 index 401a92a34c..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragmentCompose.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.vanced.manager.ui.fragments - -//import android.os.Bundle -//import android.view.LayoutInflater -//import android.view.View -//import android.view.ViewGroup -//import androidx.compose.foundation.lazy.LazyColumn -//import androidx.compose.ui.platform.ComposeView -//import androidx.fragment.app.Fragment -//import com.vanced.manager.R -//import com.vanced.manager.ui.compose.Preference -//import com.vanced.manager.ui.compose.PreferenceCategory -//import com.vanced.manager.ui.compose.SwitchPreference -// -//class SettingsFragmentCompose : Fragment() { -// -// override fun onCreateView( -// inflater: LayoutInflater, -// container: ViewGroup?, -// savedInstanceState: Bundle? -// ): View { -// return ComposeView(requireActivity()).apply { -// setContent { -// LazyColumn { -// // use `item` for separate elements like headers -// // and `items` for lists of identical elements -// item { -// PreferenceCategory( -// categoryTitle = getString(R.string.category_behaviour) -// ) { -// SwitchPreference( -// preferenceTitle = getString(R.string.use_custom_tabs), -// preferenceDescription = getString(R.string.link_custom_tabs), -// preferenceKey = "use_custom_tabs" -// ) -// } -// } -// item { -// PreferenceCategory( -// categoryTitle = getString(R.string.category_appearance) -// ) { -// Preference( -// preferenceTitle = "test", -// preferenceDescription = "test", -// ) {} -// Preference( -// preferenceTitle = "test" -// ) {} -// } -// } -// } -// } -// } -// } -// -//} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt deleted file mode 100644 index 3b6f309b17..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/fragments/WelcomeFragment.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.vanced.manager.ui.fragments - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.databinding.FragmentWelcomeBinding -import com.vanced.manager.ui.WelcomeActivity - -class WelcomeFragment : BindingFragment() { - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentWelcomeBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData() - } - - private fun bindData() { - binding.welcomeGetStarted.setOnClickListener { - (requireActivity() as WelcomeActivity).navigateTo(1) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/resource/ManagerString.kt b/app/src/main/java/com/vanced/manager/ui/resource/ManagerString.kt new file mode 100644 index 0000000000..91201b1640 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/resource/ManagerString.kt @@ -0,0 +1,17 @@ +package com.vanced.manager.ui.resource + +import androidx.annotation.StringRes +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.vanced.manager.R + +@Composable +fun managerString( + @StringRes stringId: Int? +) = stringResource(id = stringId ?: R.string.dummy_placeholder_text) + +@Composable +fun managerString( + @StringRes stringId: Int?, + vararg formatArgs: Any +) = stringResource(id = stringId ?: R.string.dummy_placeholder_text, *formatArgs) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/screen/AboutScreen.kt b/app/src/main/java/com/vanced/manager/ui/screen/AboutScreen.kt new file mode 100644 index 0000000000..0ffa09fa98 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/screen/AboutScreen.kt @@ -0,0 +1,238 @@ +package com.vanced.manager.ui.screen + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowBackIosNew +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.unit.dp +import com.vanced.manager.BuildConfig +import com.vanced.manager.R +import com.vanced.manager.ui.component.* +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.theme.LargeShape +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.util.DefaultContentPaddingVertical +import com.vanced.manager.ui.util.Screen +import com.vanced.manager.ui.widget.LinkCard + +data class Person( + val name: String, + val contribution: String +) + +data class Source( + @StringRes val nameId: Int, + @DrawableRes val iconId: Int, + val link: String +) + +private val vancedTeam = listOf( + Person( + name = "xfileFIN", + contribution = "Mods, Theming, Support" + ), + Person( + name = "Laura", + contribution = "Theming, Support" + ), + Person( + name = "ZaneZam", + contribution = "Publishing, Support" + ), + Person( + name = "KevinX8", + contribution = "Overlord, Support" + ), + Person( + name = "Xinto", + contribution = "Vanced Manager" + ) +) + +private val otherContributors = listOf( + Person( + name = "bhatVikrant", + contribution = "Website" + ), + Person( + name = "bawm", + contribution = "Sponsorblock" + ), + Person( + name = "cane", + contribution = "Sponsorblock" + ), + Person( + name = "Koopah", + contribution = "Vanced Manager root installer" + ), + Person( + name = "Logan", + contribution = "Vanced Manager UI" + ), + Person( + name = "HaliksaR", + contribution = "Vanced Manager Refactoring, UI" + ), +) + +private val sources = listOf( + Source( + nameId = R.string.about_sources_source_code, + iconId = R.drawable.ic_github, + link = "https://github.com/YTVanced/VancedManager" + ), + Source( + nameId = R.string.about_sources_license, + iconId = R.drawable.ic_round_assignment_24, + link = "https://raw.githubusercontent.com/YTVanced/VancedManager/dev/LICENSE" + ) +) + +@ExperimentalMaterial3Api +@Composable +fun AboutScreen( + onToolbarBackButtonClick: () -> Unit +) { + ManagerScaffold( + topBar = { + ManagerSmallTopAppBar( + title = { + ManagerText(managerString(Screen.About.displayName)) + }, + navigationIcon = { + IconButton(onClick = onToolbarBackButtonClick) { + Icon( + imageVector = Icons.Rounded.ArrowBackIosNew, + contentDescription = "Back" + ) + } + } + ) + } + ) { paddingValues -> + ManagerLazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + ) { + item { + ManagerElevatedCard( + modifier = Modifier.fillMaxWidth(), + shape = LargeShape + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding( + vertical = DefaultContentPaddingVertical, + horizontal = DefaultContentPaddingHorizontal + ), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + ManagerText( + modifier = Modifier, + text = managerString(R.string.app_name), + textStyle = MaterialTheme.typography.headlineSmall + ) + ManagerText( + modifier = Modifier, + text = buildAnnotatedString { + append(BuildConfig.VERSION_NAME) + val compose = "@Compose" + val startIndex = BuildConfig.VERSION_NAME.indexOf(compose) + addStyle( + style = SpanStyle(Color(0xFFBBB529)), + start = startIndex, + end = startIndex + compose.length + ) + }, + textStyle = MaterialTheme.typography.titleSmall + ) + } + } + } + managerCategory(categoryName = { + managerString(R.string.about_category_credits_vanced_team) + }) { + items(vancedTeam) { person -> + CreditCard( + modifier = Modifier.fillMaxWidth(), + personName = person.name, + personContribution = person.contribution + ) + } + } + managerCategory(categoryName = { + managerString(R.string.about_category_credits_other) + }) { + items(otherContributors) { person -> + CreditCard( + modifier = Modifier.fillMaxWidth(), + personName = person.name, + personContribution = person.contribution + ) + } + } + managerCategory(categoryName = { + managerString(R.string.about_category_sources) + }) { + item { + ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { + items(sources) { source -> + LinkCard( + text = managerString(source.nameId), + icon = painterResource(source.iconId), + url = source.link + ) + } + } + } + } + } + } +} + +@Composable +private fun CreditCard( + personName: String, + personContribution: String, + modifier: Modifier = Modifier, +) { + ManagerElevatedCard( + modifier = modifier, + shape = LargeShape + ) { + ManagerListItem( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = DefaultContentPaddingHorizontal), + title = { + ManagerText( + text = personName, + textStyle = MaterialTheme.typography.titleSmall + ) + }, + description = { + ManagerText( + text = personContribution, + textStyle = MaterialTheme.typography.bodySmall + ) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/screen/ConfigurationScreen.kt b/app/src/main/java/com/vanced/manager/ui/screen/ConfigurationScreen.kt new file mode 100644 index 0000000000..7a388f6721 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/screen/ConfigurationScreen.kt @@ -0,0 +1,254 @@ +package com.vanced.manager.ui.screen + +import androidx.compose.animation.* +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowBackIosNew +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.vanced.manager.R +import com.vanced.manager.domain.model.InstallationOption +import com.vanced.manager.ui.component.* +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.theme.LargeShape +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.util.DefaultContentPaddingVertical +import com.vanced.manager.ui.viewmodel.ConfigurationViewModel +import org.koin.androidx.compose.getViewModel + +private const val enterDuration = 300 +private const val exitDuration = 250 + +@Composable +fun ConfigurationScreen( + installationOptions: List, + onToolbarBackButtonClick: () -> Unit, + onFinishClick: () -> Unit, +) { + val viewModel: ConfigurationViewModel = getViewModel() + Scaffold( + topBar = { + ManagerSmallTopAppBar( + title = { + ManagerText(managerString(R.string.toolbar_installation_preferences)) + }, + navigationIcon = { + IconButton( + onClick = { + onToolbarBackButtonClick() + viewModel.reset() + } + ) { + Icon( + imageVector = Icons.Rounded.ArrowBackIosNew, + contentDescription = "Back" + ) + } + } + ) + }, + bottomBar = { + ConfigurationBottomBar( + modifier = Modifier + .padding( + horizontal = DefaultContentPaddingHorizontal, + vertical = DefaultContentPaddingVertical + ), + lastIndex = installationOptions.lastIndex, + currentIndex = viewModel.currentIndex, + onBackClick = { + viewModel.back() + }, + onNextClick = { + viewModel.next() + }, + onFinishClick = { + onFinishClick() + viewModel.reset() + } + ) + } + ) { paddingValues -> + ConfigurationBody( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + currentIndex = viewModel.currentIndex, + installationOptions = installationOptions + ) + } +} + +@Composable +private fun ConfigurationBody( + currentIndex: Int, + installationOptions: List, + modifier: Modifier = Modifier +) { + AnimatedContent( + modifier = modifier, + targetState = currentIndex, + transitionSpec = { + slideAnimationSpec( + if (targetState > initialState) { + AnimatedContentScope.SlideDirection.Start + } else { + AnimatedContentScope.SlideDirection.End + } + ) + } + ) { optionIndex -> + val installationOption = installationOptions[optionIndex] + ManagerLazyColumn { + managerCategory(categoryName = { + managerString(installationOption.titleId) + }) { + when (installationOption) { + is InstallationOption.SingleSelect -> { + items(installationOption.items) { item -> + val preference = installationOption.getOption() + ConfigurationItem( + modifier = Modifier + .fillMaxWidth(), + text = item.displayText(item.key), + onClick = { + installationOption.setOption(item.key) + }, + trailing = { + RadioButton( + selected = preference == item.key, + onClick = null + ) + } + ) + } + } + is InstallationOption.MultiSelect -> { + items(installationOption.items) { item -> + val preference = installationOption.getOption() + ConfigurationItem( + modifier = Modifier + .fillMaxWidth(), + text = item.displayText(item.key), + onClick = { + if (preference.contains(item.key)) { + installationOption.removeOption(item.key) + } else { + installationOption.addOption(item.key) + } + }, + trailing = { + Checkbox( + checked = preference.contains(item.key), + onCheckedChange = null + ) + } + ) + } + } + } + } + } + } +} + +@Composable +private fun ConfigurationBottomBar( + currentIndex: Int, + lastIndex: Int, + onBackClick: () -> Unit, + onNextClick: () -> Unit, + onFinishClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Row(modifier = modifier) { + AnimatedVisibility( + modifier = Modifier + .wrapContentWidth(Alignment.Start) + .weight(1f), + visible = currentIndex > 0, + enter = fadeIn(tween(enterDuration)) + + expandHorizontally(tween(enterDuration)) + + scaleIn(tween(enterDuration)), + exit = fadeOut(tween(exitDuration)) + + shrinkHorizontally(tween(exitDuration)) + + scaleOut(tween(exitDuration)), + + ) { + TextButton(onClick = onBackClick) { + ManagerText(text = "Back") + } + } + AnimatedContent( + modifier = Modifier + .wrapContentWidth(Alignment.End) + .weight(1f), + targetState = currentIndex == lastIndex, + transitionSpec = { + slideAnimationSpec( + if (initialState && !targetState) { + AnimatedContentScope.SlideDirection.Up + } else { + AnimatedContentScope.SlideDirection.Down + } + ) + } + ) { isLastIndex -> + if (isLastIndex) { + ElevatedButton(onClick = onFinishClick) { + ManagerText(text = "Finish") + } + } else { + OutlinedButton(onClick = onNextClick) { + ManagerText(text = "Next") + } + } + } + } +} + +@Composable +private fun ConfigurationItem( + text: String, + onClick: () -> Unit, + trailing: @Composable () -> Unit, + modifier: Modifier = Modifier, +) { + ManagerElevatedCard( + modifier = modifier, + shape = LargeShape, + onClick = onClick + ) { + ManagerListItem( + modifier = Modifier.padding( + horizontal = DefaultContentPaddingHorizontal + ), + title = { + ManagerText( + text = text, + textStyle = MaterialTheme.typography.titleSmall + ) + }, + trailing = trailing, + ) + } +} + +@ExperimentalAnimationApi +private fun AnimatedContentScope.slideAnimationSpec( + slideDirection: AnimatedContentScope.SlideDirection +) = slideIntoContainer( + towards = slideDirection, + animationSpec = tween(enterDuration) +) + fadeIn( + animationSpec = tween(enterDuration) +) with slideOutOfContainer( + towards = slideDirection, + animationSpec = tween(exitDuration) +) + fadeOut( + animationSpec = tween(exitDuration) +) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/screen/HomeScreen.kt b/app/src/main/java/com/vanced/manager/ui/screen/HomeScreen.kt new file mode 100644 index 0000000000..369ef1d774 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/screen/HomeScreen.kt @@ -0,0 +1,322 @@ +package com.vanced.manager.ui.screen + +import androidx.annotation.DrawableRes +import androidx.compose.animation.* +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.MoreVert +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.TextButton +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.google.accompanist.swiperefresh.rememberSwipeRefreshState +import com.vanced.manager.R +import com.vanced.manager.domain.model.App +import com.vanced.manager.network.util.* +import com.vanced.manager.ui.component.* +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.util.Screen +import com.vanced.manager.ui.viewmodel.ManagerState +import com.vanced.manager.ui.widget.AppCard +import com.vanced.manager.ui.widget.AppCardPlaceholder +import com.vanced.manager.ui.widget.LinkCard + +@Composable +fun HomeScreen( + managerState: ManagerState, + onRefresh: () -> Unit, + onToolbarScreenSelected: (Screen) -> Unit, + onAppDownloadClick: (App) -> Unit, + onAppUninstallClick: (App) -> Unit, + onAppLaunchClick: (App) -> Unit, +) { + val refreshState = + rememberSwipeRefreshState(isRefreshing = managerState.isFetching) + var menuExpanded by remember { mutableStateOf(false) } + val dropdownScreens = remember { listOf(Screen.Settings, Screen.About) } + + ManagerScaffold( + topBar = { + HomeScreenTopBar( + modifier = Modifier, + menuExpanded = menuExpanded, + dropdownScreens = dropdownScreens, + onActionClick = { + menuExpanded = true + }, + onDropdownItemClick = onToolbarScreenSelected, + onDropdownDismissRequest = { + menuExpanded = false + }) + } + ) { paddingValues -> + ManagerSwipeRefresh( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + swipeRefreshState = refreshState, + onRefresh = onRefresh + ) { + AnimatedContent( + modifier = Modifier.fillMaxSize(), + targetState = managerState, + transitionSpec = { + scaleIn(initialScale = 0.9f) + fadeIn() with + scaleOut(targetScale = 0.9f) + fadeOut() + } + ) { animatedAppState -> + when (animatedAppState) { + is ManagerState.Fetching -> { + HomeScreenLoading( + modifier = Modifier.fillMaxSize(), + appsCount = animatedAppState.placeholderAppsCount + ) + } + is ManagerState.Success -> { + HomeScreenLoaded( + modifier = Modifier.fillMaxSize(), + apps = animatedAppState.apps, + onAppDownloadClick = onAppDownloadClick, + onAppUninstallClick = onAppUninstallClick, + onAppLaunchClick = onAppLaunchClick + ) + } + is ManagerState.Error -> { + //TODO + } + } + } + } + } +} + +@Composable +private fun HomeScreenTopBar( + menuExpanded: Boolean, + dropdownScreens: List, + onActionClick: () -> Unit, + onDropdownItemClick: (Screen) -> Unit, + onDropdownDismissRequest: () -> Unit, + modifier: Modifier = Modifier +) { + ManagerCenterAlignedTopAppBar( + modifier = modifier, + title = { + ManagerText(managerString(Screen.Home.displayName)) + }, + actions = { + IconButton(onClick = onActionClick) { + Icon( + Icons.Rounded.MoreVert, + contentDescription = "Navigation" + ) + } + + ManagerDropdownMenu( + expanded = menuExpanded, + onDismissRequest = onDropdownDismissRequest + ) { + for (dropdownScreen in dropdownScreens) { + ManagerDropdownMenuItem( + title = managerString(dropdownScreen.displayName), + onClick = { + onDropdownItemClick(dropdownScreen) + } + ) + } + } + } + ) +} + +@Composable +private fun HomeScreenLoaded( + modifier: Modifier = Modifier, + apps: List, + onAppDownloadClick: (App) -> Unit, + onAppUninstallClick: (App) -> Unit, + onAppLaunchClick: (App) -> Unit, +) { + HomeScreenBody(modifier = modifier) { + managerCategory(categoryName = { + managerString(R.string.home_category_apps) + }) { + items(apps) { app -> + val appIcon = painterResource(id = app.iconResId) + + var showAppInfoDialog by remember { mutableStateOf(false) } + + AppCard( + modifier = Modifier.fillMaxWidth(), + appName = app.name, + appIcon = appIcon, + appInstalledVersion = app.installedVersionName, + appRemoteVersion = app.remoteVersionName, + appState = app.state, + onAppDownloadClick = { + onAppDownloadClick(app) + }, + onAppUninstallClick = { + onAppUninstallClick(app) + }, + onAppLaunchClick = { + onAppLaunchClick(app) + }, + onAppInfoClick = { + showAppInfoDialog = true + } + ) + + if (showAppInfoDialog) { + ManagerDialog( + title = managerString( + R.string.app_info_title, + app.name + ), + onDismissRequest = { showAppInfoDialog = false }, + confirmButton = { + TextButton(onClick = { + showAppInfoDialog = false + }) { + ManagerText(text = managerString(R.string.dialog_button_close)) + } + }, + ) { + ManagerText( + modifier = Modifier.padding(top = 4.dp), + text = app.changelog, + ) + } + } + } + } + } +} + +@Composable +private fun HomeScreenLoading( + modifier: Modifier = Modifier, + appsCount: Int, +) { + HomeScreenBody(modifier = modifier) { + managerCategory(categoryName = { + managerString(R.string.home_category_apps) + }) { + items(appsCount) { + AppCardPlaceholder( + modifier = Modifier.fillMaxWidth() + ) + } + } + } +} + +@Composable +private inline fun HomeScreenBody( + modifier: Modifier = Modifier, + crossinline appsCategory: LazyListScope.() -> Unit, +) { + ManagerLazyColumn(modifier = modifier) { + appsCategory() + managerCategory(categoryName = { + managerString(R.string.home_category_support_us) + }) { + item { + ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { + items(sponsors) { sponsor -> + LinkCard( + text = sponsor.title, + icon = painterResource(sponsor.icon), + url = sponsor.link + ) + } + } + } + } + managerCategory(categoryName = { + managerString(R.string.home_category_social_media) + }) { + item { + ManagerLazyRow(modifier = Modifier.fillMaxWidth()) { + items(socialMedia) { socialMedia -> + LinkCard( + text = socialMedia.title, + icon = painterResource(socialMedia.icon), + url = socialMedia.link + ) + } + } + } + } + } +} + +data class Link( + val title: String, + val link: String, + @DrawableRes val icon: Int +) + + +val sponsors = listOf( + Link( + title = "Brave", + link = URL_SPONSOR_BRAVE, + icon = R.drawable.ic_brave + ), + Link( + title = "Adguard", + link = URL_SPONSOR_ADGUARD, + icon = R.drawable.ic_adguard + ) +) + +val socialMedia = listOf( + Link( + title = "Instagram", + link = URL_MEDIA_INSTAGRAM, + icon = R.drawable.ic_instagram + ), + Link( + title = "YouTube", + link = URL_MEDIA_YOUTUBE, + icon = R.drawable.ic_youtube + ), + Link( + title = "GitHub", + link = URL_MEDIA_GITHUB, + icon = R.drawable.ic_github + ), + Link( + title = "Website", + link = URL_MEDIA_WEBSITE, + icon = R.drawable.ic_website + ), + Link( + title = "Telegram", + link = URL_MEDIA_TELEGRAM, + icon = R.drawable.ic_telegram + ), + Link( + title = "Twitter", + link = URL_MEDIA_TWITTER, + icon = R.drawable.ic_twitter + ), + Link( + title = "Discord", + link = URL_MEDIA_DISCORD, + icon = R.drawable.ic_discord + ), + Link( + title = "Reddit", + link = URL_MEDIA_REDDIT, + icon = R.drawable.ic_reddit + ), +) diff --git a/app/src/main/java/com/vanced/manager/ui/screen/InstallScreen.kt b/app/src/main/java/com/vanced/manager/ui/screen/InstallScreen.kt new file mode 100644 index 0000000000..653a4cbf34 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/screen/InstallScreen.kt @@ -0,0 +1,166 @@ +package com.vanced.manager.ui.screen + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowDropDown +import androidx.compose.material.icons.rounded.Done +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.sp +import com.vanced.manager.R +import com.vanced.manager.ui.component.* +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.viewmodel.InstallViewModel + +@Composable +fun InstallScreen( + appName: String, + appVersions: List?, + viewModel: InstallViewModel, + onFinishClick: () -> Unit +) { + var startedProcess by rememberSaveable { mutableStateOf(false) } + + val logs = viewModel.logs + val status = viewModel.status + + // I don't know why, I don't know how, + // but it works as intended + LaunchedEffect(startedProcess) { + if (!startedProcess) { + startedProcess = true + viewModel.startAppProcess(appName, appVersions) + } + } + + ManagerScaffold( + topBar = { + Column { + ManagerSmallTopAppBar( + title = { + ManagerText(managerString(R.string.toolbar_install)) + }, + ) + when (status) { + is InstallViewModel.Status.Progress -> { + ManagerProgressIndicator(status.progress) + } + is InstallViewModel.Status.Installing -> { + ManagerProgressIndicator() + } + else -> {} + } + } + }, + floatingActionButton = { + if (status is InstallViewModel.Status.Installed) { + ExtendedFloatingActionButton( + text = { ManagerText("Finish") }, + icon = { + Icon(Icons.Rounded.Done, null) + }, + onClick = onFinishClick, + ) + } + } + ) { paddingValues -> + ManagerLazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + ) { + items(logs) { log -> + when (log) { + is InstallViewModel.Log.Success -> { + ManagerText( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = DefaultContentPaddingHorizontal), + text = log.successText, + textStyle = TextStyle( + fontWeight = FontWeight.Bold, + fontSize = 14.sp, + color = MaterialTheme.colorScheme.tertiary + ), + ) + } + is InstallViewModel.Log.Info -> { + ManagerText( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = DefaultContentPaddingHorizontal), + text = log.infoText, + textStyle = TextStyle( + fontWeight = FontWeight.SemiBold, + fontSize = 14.sp, + color = MaterialTheme.colorScheme.onSurface + ), + ) + } + is InstallViewModel.Log.Error -> { + var visible by remember { mutableStateOf(false) } + val iconRotation by animateFloatAsState(if (visible) -90f else 0f) + Column( + modifier = Modifier + .fillMaxWidth() + .clickable { + visible = !visible + } + .padding(horizontal = DefaultContentPaddingHorizontal), + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + ManagerText( + text = buildAnnotatedString { + withStyle(SpanStyle(color = MaterialTheme.colorScheme.error)) { + append(log.displayText) + } + }, + textStyle = TextStyle( + fontWeight = FontWeight.Bold, + fontSize = 14.sp, + ), + ) + Icon( + modifier = Modifier.rotate(iconRotation), + imageVector = Icons.Rounded.ArrowDropDown, + contentDescription = "expand", + tint = MaterialTheme.colorScheme.error + ) + } + AnimatedVisibility(visible) { + ManagerText( + text = log.stacktrace, + textStyle = TextStyle( + fontWeight = FontWeight.Bold, + fontSize = 14.sp, + color = MaterialTheme.colorScheme.error.copy(alpha = 0.7f) + ), + ) + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/screen/SettingsScreen.kt b/app/src/main/java/com/vanced/manager/ui/screen/SettingsScreen.kt new file mode 100644 index 0000000000..a9dd76a110 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/screen/SettingsScreen.kt @@ -0,0 +1,143 @@ +package com.vanced.manager.ui.screen + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowBackIosNew +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.vanced.manager.R +import com.vanced.manager.repository.ManagerMode +import com.vanced.manager.repository.ManagerTheme +import com.vanced.manager.ui.component.* +import com.vanced.manager.ui.resource.managerString +import com.vanced.manager.ui.util.Screen +import com.vanced.manager.ui.viewmodel.SettingsViewModel +import com.vanced.manager.util.isMagiskInstalled +import org.koin.androidx.compose.viewModel + +@ExperimentalMaterial3Api +@Composable +fun SettingsScreen( + onToolbarBackButtonClick: () -> Unit, + onThemeChange: (ManagerTheme) -> Unit, +) { + val viewModel: SettingsViewModel by viewModel() + ManagerScaffold( + modifier = Modifier.fillMaxSize(), + topBar = { + ManagerSmallTopAppBar( + title = { + ManagerText(managerString(Screen.Settings.displayName)) + }, + navigationIcon = { + IconButton(onClick = onToolbarBackButtonClick) { + Icon( + imageVector = Icons.Rounded.ArrowBackIosNew, + contentDescription = "Back" + ) + } + } + ) + } + ) { paddingValues -> + ManagerLazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + ) { + managerCategory(categoryName = { + managerString(R.string.settings_category_behaviour) + }) { + item { + ManagerSwitchPreference( + preferenceTitle = stringResource(id = R.string.settings_preference_use_custom_tabs_title), + preferenceDescription = stringResource(id = R.string.settings_preference_use_custom_tabs_summary), + isChecked = viewModel.managerUseCustomTabs, + onCheckedChange = { + viewModel.saveManagerUseCustomTabs(it) + } + ) + } + item { + var showDialog by remember { mutableStateOf(false) } + var selectedMode by remember { mutableStateOf(EntryValue(viewModel.managerMode.value)) } + ManagerSingleSelectDialogPreference( + preferenceTitle = managerString( + stringId = R.string.settings_preference_variant_title + ), + preferenceDescription = selectedMode.value, + showDialog = showDialog, + selected = selectedMode, + entries = mapOf( + EntryText("nonroot") to EntryValue("nonroot"), + EntryText("root") to EntryValue("root"), + ), + onClick = { + showDialog = true + }, + onDismissRequest = { + showDialog = false + selectedMode = EntryValue(viewModel.managerMode.value) + }, + onEntrySelect = { + if (it.value == "root" && !isMagiskInstalled) + return@ManagerSingleSelectDialogPreference + + selectedMode = it + }, + onSave = { + viewModel.saveManagerMode(ManagerMode.fromValue(selectedMode.value)) + showDialog = false + } + ) + } + } + managerCategory(categoryName = { + managerString(R.string.settings_category_appearance) + }) { + item { + var showDialog by remember { mutableStateOf(false) } + var selectedTheme by remember { mutableStateOf(EntryValue(viewModel.managerTheme.value)) } + ManagerSingleSelectDialogPreference( + preferenceTitle = managerString(stringId = R.string.settings_preference_theme_title), + preferenceDescription = managerString( + stringId = viewModel.getThemeStringId( + ManagerTheme.fromValue(selectedTheme.value) + ) + ), + showDialog = showDialog, + selected = selectedTheme, + entries = mapOf( + EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.LIGHT))) + to EntryValue(ManagerTheme.LIGHT.value), + EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.DARK))) + to EntryValue(ManagerTheme.DARK.value), + EntryText(managerString(viewModel.getThemeStringId(ManagerTheme.SYSTEM_DEFAULT))) + to EntryValue(ManagerTheme.SYSTEM_DEFAULT.value), + ), + onClick = { + showDialog = true + }, + onDismissRequest = { + showDialog = false + selectedTheme = EntryValue(viewModel.managerTheme.value) + }, + onEntrySelect = { + selectedTheme = it + }, + onSave = { + showDialog = false + viewModel.saveManagerTheme(ManagerTheme.fromValue(selectedTheme.value)) + onThemeChange(ManagerTheme.fromValue(selectedTheme.value)) + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/theme/Color.kt b/app/src/main/java/com/vanced/manager/ui/theme/Color.kt new file mode 100644 index 0000000000..922bd4452f --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/theme/Color.kt @@ -0,0 +1,67 @@ +package com.vanced.manager.ui.theme + +import androidx.compose.ui.graphics.Color + +val primaryColor = Color(defAccentColor) +val primaryColorVariant = primaryColor.copy(alpha = 0.25f) + +val darkSurface = Color.Black +val darkOnSurface = Color(0xFFD5D5D5) + +val lightSurface = Color.White +val lightOnSurface = Color.Black + +val md_theme_light_primary = Color(0xFF0054d9) +val md_theme_light_onPrimary = Color(0xFFffffff) +val md_theme_light_primaryContainer = Color(0xFFdae2ff) +val md_theme_light_onPrimaryContainer = Color(0xFF00174a) +val md_theme_light_secondary = Color(0xFFc00020) +val md_theme_light_onSecondary = Color(0xFFffffff) +val md_theme_light_secondaryContainer = Color(0xFFffdad6) +val md_theme_light_onSecondaryContainer = Color(0xFF410005) +val md_theme_light_tertiary = Color(0xFF943896) +val md_theme_light_onTertiary = Color(0xFFffffff) +val md_theme_light_tertiaryContainer = Color(0xFFffd6fa) +val md_theme_light_onTertiaryContainer = Color(0xFF37003c) +val md_theme_light_error = Color(0xFFba1b1b) +val md_theme_light_errorContainer = Color(0xFFffdad4) +val md_theme_light_onError = Color(0xFFffffff) +val md_theme_light_onErrorContainer = Color(0xFF410001) +val md_theme_light_background = Color(0xFFfefbff) +val md_theme_light_onBackground = Color(0xFF1b1b1e) +val md_theme_light_surface = Color(0xFFfefbff) +val md_theme_light_onSurface = Color(0xFF1b1b1e) +val md_theme_light_surfaceVariant = Color(0xFFe2e2ec) +val md_theme_light_onSurfaceVariant = Color(0xFF44464e) +val md_theme_light_outline = Color(0xFF75767f) +val md_theme_light_inverseOnSurface = Color(0xFFf2f0f5) +val md_theme_light_inverseSurface = Color(0xFF303033) + +val md_theme_dark_primary = Color(0xFFb1c5ff) +val md_theme_dark_onPrimary = Color(0xFF002a77) +val md_theme_dark_primaryContainer = Color(0xFF003ea6) +val md_theme_dark_onPrimaryContainer = Color(0xFFdae2ff) +val md_theme_dark_secondary = Color(0xFFffb3af) +val md_theme_dark_onSecondary = Color(0xFF69000c) +val md_theme_dark_secondaryContainer = Color(0xFF920016) +val md_theme_dark_onSecondaryContainer = Color(0xFFffdad6) +val md_theme_dark_tertiary = Color(0xFFffa9fc) +val md_theme_dark_onTertiary = Color(0xFF5a0061) +val md_theme_dark_tertiaryContainer = Color(0xFF781c7c) +val md_theme_dark_onTertiaryContainer = Color(0xFFffd6fa) +val md_theme_dark_error = Color(0xFFffb4a9) +val md_theme_dark_errorContainer = Color(0xFF930006) +val md_theme_dark_onError = Color(0xFF680003) +val md_theme_dark_onErrorContainer = Color(0xFFffdad4) +val md_theme_dark_background = Color(0xFF1b1b1e) +val md_theme_dark_onBackground = Color(0xFFe3e1e6) +val md_theme_dark_surface = Color(0xFF1b1b1e) +val md_theme_dark_onSurface = Color(0xFFe3e1e6) +val md_theme_dark_surfaceVariant = Color(0xFF44464e) +val md_theme_dark_onSurfaceVariant = Color(0xFFc6c6d0) +val md_theme_dark_outline = Color(0xFF8f909a) +val md_theme_dark_inverseOnSurface = Color(0xFF1b1b1e) +val md_theme_dark_inverseSurface = Color(0xFFe3e1e6) + +val seed = Color(0xFF2e73ff) +val error = Color(0xFFba1b1b) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/theme/Shape.kt b/app/src/main/java/com/vanced/manager/ui/theme/Shape.kt new file mode 100644 index 0000000000..70afbea6d0 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/theme/Shape.kt @@ -0,0 +1,9 @@ +package com.vanced.manager.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.ui.unit.dp + +//TODO M3 doesn't support Shapes yet +val SmallShape = RoundedCornerShape(8.dp) +val MediumShape = RoundedCornerShape(12.dp) +val LargeShape = RoundedCornerShape(16.dp) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/theme/Theme.kt b/app/src/main/java/com/vanced/manager/ui/theme/Theme.kt new file mode 100644 index 0000000000..26ded2916b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/theme/Theme.kt @@ -0,0 +1,111 @@ +package com.vanced.manager.ui.theme + +import android.os.Build +import androidx.compose.foundation.gestures.LocalOverScrollConfiguration +import androidx.compose.foundation.gestures.OverScrollConfiguration +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.platform.LocalContext + +const val defAccentColor = 0xFF0477E1 + +private val LightThemeColors = lightColorScheme( + primary = md_theme_light_primary, + onPrimary = md_theme_light_onPrimary, + primaryContainer = md_theme_light_primaryContainer, + onPrimaryContainer = md_theme_light_onPrimaryContainer, + secondary = md_theme_light_secondary, + onSecondary = md_theme_light_onSecondary, + secondaryContainer = md_theme_light_secondaryContainer, + onSecondaryContainer = md_theme_light_onSecondaryContainer, + tertiary = md_theme_light_tertiary, + onTertiary = md_theme_light_onTertiary, + tertiaryContainer = md_theme_light_tertiaryContainer, + onTertiaryContainer = md_theme_light_onTertiaryContainer, + error = md_theme_light_error, + errorContainer = md_theme_light_errorContainer, + onError = md_theme_light_onError, + onErrorContainer = md_theme_light_onErrorContainer, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + surfaceVariant = md_theme_light_surfaceVariant, + onSurfaceVariant = md_theme_light_onSurfaceVariant, + outline = md_theme_light_outline, + inverseOnSurface = md_theme_light_inverseOnSurface, + inverseSurface = md_theme_light_inverseSurface, +) +private val DarkThemeColors = darkColorScheme( + primary = md_theme_dark_primary, + onPrimary = md_theme_dark_onPrimary, + primaryContainer = md_theme_dark_primaryContainer, + onPrimaryContainer = md_theme_dark_onPrimaryContainer, + secondary = md_theme_dark_secondary, + onSecondary = md_theme_dark_onSecondary, + secondaryContainer = md_theme_dark_secondaryContainer, + onSecondaryContainer = md_theme_dark_onSecondaryContainer, + tertiary = md_theme_dark_tertiary, + onTertiary = md_theme_dark_onTertiary, + tertiaryContainer = md_theme_dark_tertiaryContainer, + onTertiaryContainer = md_theme_dark_onTertiaryContainer, + error = md_theme_dark_error, + errorContainer = md_theme_dark_errorContainer, + onError = md_theme_dark_onError, + onErrorContainer = md_theme_dark_onErrorContainer, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, + surfaceVariant = md_theme_dark_surfaceVariant, + onSurfaceVariant = md_theme_dark_onSurfaceVariant, + outline = md_theme_dark_outline, + inverseOnSurface = md_theme_dark_inverseOnSurface, + inverseSurface = md_theme_dark_inverseSurface, +) + +@Composable +inline fun apiDependantColorScheme( + dynamic: () -> ColorScheme, + static: () -> ColorScheme +): ColorScheme { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + dynamic() + } else { + static() + } +} + +@Composable +fun ManagerTheme( + darkMode: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + val context = LocalContext.current + val colorScheme = + if (darkMode) { + apiDependantColorScheme( + dynamic = { dynamicDarkColorScheme(context) }, + static = { DarkThemeColors } + ) + } else { + apiDependantColorScheme( + dynamic = { dynamicLightColorScheme(context) }, + static = { LightThemeColors } + ) + } + MaterialTheme( + colorScheme = colorScheme, + typography = ManagerTypography, + ) { + CompositionLocalProvider( + LocalOverScrollConfiguration provides OverScrollConfiguration( + forceShowAlways = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + ) + ) { + content() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/theme/Type.kt b/app/src/main/java/com/vanced/manager/ui/theme/Type.kt new file mode 100644 index 0000000000..6cf08c3399 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/theme/Type.kt @@ -0,0 +1,125 @@ +package com.vanced.manager.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import com.vanced.manager.R + +private val light = Font(R.font.inter_light, FontWeight.Light) +private val regular = Font(R.font.inter_regular, FontWeight.Normal) +private val medium = Font(R.font.inter_medium, FontWeight.Medium) +private val semibold = Font(R.font.inter_semibold, FontWeight.SemiBold) +private val bold = Font(R.font.inter_bold, FontWeight.Bold) + +private val InterFontFamily = FontFamily(light, regular, medium, semibold, bold) + +val ManagerTypography = Typography( + displayLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 57.sp, + lineHeight = 64.sp, + letterSpacing = (-0.25).sp, + ), + displayMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 45.sp, + lineHeight = 52.sp, + letterSpacing = 0.sp, + ), + displaySmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 36.sp, + lineHeight = 44.sp, + letterSpacing = 0.sp, + ), + headlineLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Bold, + fontSize = 32.sp, + lineHeight = 40.sp, + letterSpacing = 0.sp, + ), + headlineMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Bold, + fontSize = 28.sp, + lineHeight = 36.sp, + letterSpacing = 0.sp, + ), + headlineSmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 24.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp, + ), + titleLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp, + ), + titleMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 18.sp, + lineHeight = 24.sp, + letterSpacing = 0.1.sp, + ), + titleSmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 16.sp, + lineHeight = 20.sp, + letterSpacing = 0.1.sp, + ), + bodyLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ), + bodyMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp, + ), + bodySmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 12.sp, + lineHeight = 14.sp, + letterSpacing = 0.sp, + ), + labelLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.1.sp, + ), + labelMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Medium, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp, + ), + labelSmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp, + ), +) \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/util/Color.kt b/app/src/main/java/com/vanced/manager/ui/util/Color.kt new file mode 100644 index 0000000000..241453a5f7 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/util/Color.kt @@ -0,0 +1,10 @@ +package com.vanced.manager.ui.util + +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.tween +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color + +val Color.animated + @Composable + get() = animateColorAsState(this, animationSpec = tween(400)).value \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/util/Const.kt b/app/src/main/java/com/vanced/manager/ui/util/Const.kt new file mode 100644 index 0000000000..2b1432a73b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/util/Const.kt @@ -0,0 +1,8 @@ +package com.vanced.manager.ui.util + +import androidx.compose.ui.unit.dp + +val DefaultContentPaddingHorizontal = 16.dp +val DefaultContentPaddingVertical = 12.dp + +val EdgeToEdgeContentPadding = 8.dp \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/util/Screen.kt b/app/src/main/java/com/vanced/manager/ui/util/Screen.kt new file mode 100644 index 0000000000..0c193b14f2 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/util/Screen.kt @@ -0,0 +1,47 @@ +package com.vanced.manager.ui.util + +import androidx.annotation.StringRes +import com.vanced.manager.R +import com.vanced.manager.domain.model.InstallationOption + +sealed class Screen( + val route: String, + @StringRes val displayName: Int, +) { + object Home : Screen( + route = "home", + displayName = R.string.app_name + ) + + object Settings : Screen( + route = "settings", + displayName = R.string.toolbar_settings, + ) + + object About : Screen( + route = "about", + displayName = R.string.toolbar_about, + ) + + object Logs : Screen( + route = "logs", + displayName = R.string.toolbar_logs, + ) + + data class Configuration( + val appName: String, + val appVersions: List?, + val appInstallationOptions: List + ) : Screen( + route = "installpreferences", + displayName = R.string.toolbar_installation_preferences + ) + + data class Install( + val appName: String, + val appVersions: List? + ) : Screen( + route = "install", + displayName = R.string.toolbar_install + ) +} diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodel/ConfigurationViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodel/ConfigurationViewModel.kt new file mode 100644 index 0000000000..42052f6c57 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/viewmodel/ConfigurationViewModel.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.ui.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel + +class ConfigurationViewModel : ViewModel() { + + var currentIndex by mutableStateOf(0) + private set + + fun next() { + currentIndex++ + } + + fun back() { + currentIndex-- + } + + fun reset() { + currentIndex = 0 + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodel/InstallViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodel/InstallViewModel.kt new file mode 100644 index 0000000000..859a0513d8 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/viewmodel/InstallViewModel.kt @@ -0,0 +1,166 @@ +package com.vanced.manager.ui.viewmodel + +import android.content.pm.PackageInstaller +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.vanced.manager.downloader.base.AppDownloader +import com.vanced.manager.downloader.impl.MicrogDownloader +import com.vanced.manager.downloader.impl.MusicDownloader +import com.vanced.manager.downloader.impl.VancedDownloader +import com.vanced.manager.installer.impl.MicrogInstaller +import com.vanced.manager.installer.impl.MusicInstaller +import com.vanced.manager.installer.impl.VancedInstaller +import com.vanced.manager.network.util.MICROG_NAME +import com.vanced.manager.network.util.MUSIC_NAME +import com.vanced.manager.network.util.VANCED_NAME +import com.vanced.manager.preferences.holder.managerVariantPref +import com.vanced.manager.repository.manager.PackageManagerResult +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class InstallViewModel( + private val vancedDownloader: VancedDownloader, + private val musicDownloader: MusicDownloader, + private val microgDownloader: MicrogDownloader, + + private val vancedInstaller: VancedInstaller, + private val musicInstaller: MusicInstaller, + private val microgInstaller: MicrogInstaller, +) : ViewModel() { + + private val isRoot + get() = managerVariantPref == "root" + + sealed class Log { + data class Info(val infoText: String) : Log() + data class Success(val successText: String) : Log() + data class Error( + val displayText: String, + val stacktrace: String, + ) : Log() + } + + sealed class Status { + object Idle : Status() + object Installing : Status() + object Installed : Status() + object Failure : Status() + data class Progress(val progress: Float) : Status() + } + + val logs = mutableStateListOf() + + var status by mutableStateOf(Status.Idle) + private set + + //TODO Move to WorkManager + fun startAppProcess( + appName: String, + appVersions: List? + ) { + viewModelScope.launch(Dispatchers.IO) { + downloadApp(appName, appVersions) + } + } + + fun postInstallStatus(pmStatus: Int, extra: String) { + if (pmStatus == PackageInstaller.STATUS_SUCCESS) { + status = Status.Installed + log(Log.Success("Successfully installed")) + } else { + status = Status.Failure + log(Log.Error("Failed to install app", extra)) + } + } + + fun clear() { + logs.clear() + status = Status.Idle + } + + private suspend fun downloadApp( + appName: String, + appVersions: List?, + ) { + val downloader = getDownloader(appName) + + val onProgress: (Float) -> Unit = { progress -> + status = Status.Progress(progress / 100) + } + val onFile: (String) -> Unit = { file -> + log(Log.Info("Downloading $file")) + } + + val download = + if (isRoot) + downloader.downloadRoot(appVersions, onProgress, onFile) + else + downloader.download(appVersions, onProgress, onFile) + + when (download) { + is AppDownloader.DownloadStatus.Success -> { + log(Log.Success("Successfully downloaded $appName")) + installApp(appName, appVersions) + } + is AppDownloader.DownloadStatus.Error -> { + log( + Log.Error( + displayText = "Failed to download ${download.fileName}", + stacktrace = download.error + ) + ) + } + } + } + + private suspend fun installApp( + appName: String, + appVersions: List?, + ) { + val installer = getInstaller(appName) + + status = Status.Installing + + if (isRoot) { + when (val installStatus = installer.installRoot(appVersions)) { + is PackageManagerResult.Success -> { + status = Status.Installed + log(Log.Success("Successfully installed")) + } + is PackageManagerResult.Error -> { + status = Status.Failure + log(Log.Error("Failed to install app", installStatus.message)) + } + } + } else { + installer.install(appVersions) + } + } + + private fun getDownloader( + appName: String + ) = when (appName) { + VANCED_NAME -> vancedDownloader + MUSIC_NAME -> musicDownloader + MICROG_NAME -> microgDownloader + else -> throw IllegalArgumentException("$appName is not a valid app") + } + + private fun getInstaller( + appName: String + ) = when (appName) { + VANCED_NAME -> vancedInstaller + MUSIC_NAME -> musicInstaller + MICROG_NAME -> microgInstaller + else -> throw IllegalArgumentException("$appName is not a valid app") + } + + private fun log(data: Log) { + logs.add(data) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt new file mode 100644 index 0000000000..aaeba38af6 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/viewmodel/MainViewModel.kt @@ -0,0 +1,103 @@ +package com.vanced.manager.ui.viewmodel + +import android.app.Application +import android.content.ComponentName +import android.content.Intent +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.vanced.manager.domain.model.App +import com.vanced.manager.installer.util.PM +import com.vanced.manager.repository.AppRepository +import com.vanced.manager.repository.ManagerMode +import com.vanced.manager.repository.PreferenceRepository +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.launch +import kotlinx.coroutines.supervisorScope +import retrofit2.HttpException + +class MainViewModel( + private val appRepository: AppRepository, + private val preferenceRepository: PreferenceRepository, + private val app: Application, +) : AndroidViewModel(app) { + + var appMode by mutableStateOf(preferenceRepository.managerMode) + var appTheme by mutableStateOf(preferenceRepository.managerTheme) + + private val appCount + get() = when (appMode) { + ManagerMode.ROOT -> 2 + ManagerMode.NONROOT -> 3 + } + + var appState by mutableStateOf(ManagerState.Fetching(appCount)) + private set + + fun fetch() { + viewModelScope.launch { + try { + supervisorScope { + appState = ManagerState.Fetching(appCount) + + when (appMode) { + ManagerMode.ROOT -> { + appState = ManagerState.Success( + apps = listOf( + async { appRepository.getVancedYoutubeRoot() }, + async { appRepository.getVancedYoutubeMusicRoot() } + ).awaitAll() + ) + } + ManagerMode.NONROOT -> { + appState = ManagerState.Success( + apps = listOf( + async { appRepository.getVancedYoutubeNonroot() }, + async { appRepository.getVancedYoutubeMusicNonroot() }, + async { appRepository.getVancedMicrog() } + ).awaitAll() + ) + } + } + } + } catch (e: HttpException) { + appState = ManagerState.Error(e.message()) + } catch (e: Exception) { + appState = ManagerState.Error(e.toString()) + } + } + } + + fun launchApp( + packageName: String, + launchActivity: String + ) { + val component = ComponentName(packageName, launchActivity) + val intent = Intent().apply { + setComponent(component) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + app.startActivity(intent) + } + + //TODO implement root uninstallation + fun uninstallApp( + appPackage: String, + ) { + PM.uninstallPackage(appPackage, app) + } + +} + +sealed class ManagerState { + data class Fetching(val placeholderAppsCount: Int) : ManagerState() + data class Success(val apps: List) : ManagerState() + data class Error(val error: String) : ManagerState() + + val isFetching get() = this is Fetching + val isSuccess get() = this is Success + val isError get() = this is Error +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodel/SettingsViewModel.kt new file mode 100644 index 0000000000..9d2dd1c02f --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/viewmodel/SettingsViewModel.kt @@ -0,0 +1,45 @@ +package com.vanced.manager.ui.viewmodel + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import com.vanced.manager.R +import com.vanced.manager.repository.ManagerMode +import com.vanced.manager.repository.ManagerTheme +import com.vanced.manager.repository.PreferenceRepository + +class SettingsViewModel( + private val preferenceRepository: PreferenceRepository +) : ViewModel() { + + var managerUseCustomTabs by mutableStateOf(preferenceRepository.managerUseCustomTabs) + private set + var managerMode by mutableStateOf(preferenceRepository.managerMode) + private set + var managerTheme by mutableStateOf(preferenceRepository.managerTheme) + private set + + fun saveManagerUseCustomTabs(value: Boolean) { + managerUseCustomTabs = value + preferenceRepository.managerUseCustomTabs = value + } + + fun saveManagerMode(value: ManagerMode) { + managerMode = value + preferenceRepository.managerMode = value + } + + fun saveManagerTheme(value: ManagerTheme) { + managerTheme = value + preferenceRepository.managerTheme = value + } + + fun getThemeStringId(value: ManagerTheme): Int { + return when (value) { + ManagerTheme.DARK -> R.string.settings_preference_theme_dark + ManagerTheme.LIGHT -> R.string.settings_preference_theme_light + else -> R.string.settings_option_system_default + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodels/AboutViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodels/AboutViewModel.kt deleted file mode 100644 index 2926b3d1a7..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/AboutViewModel.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.vanced.manager.ui.viewmodels - -import android.app.Application -import androidx.lifecycle.AndroidViewModel -import com.vanced.manager.R -import com.vanced.manager.utils.openUrl - -class AboutViewModel(application: Application) : AndroidViewModel(application) { - - fun openUrl(url: String) { - openUrl(url, R.color.GitHub, getApplication()) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt deleted file mode 100644 index c880f707ba..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt +++ /dev/null @@ -1,229 +0,0 @@ -package com.vanced.manager.ui.viewmodels - -import android.annotation.SuppressLint -import android.content.ActivityNotFoundException -import android.content.ComponentName -import android.content.Intent -import android.widget.Toast -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.crowdin.platform.Crowdin -import com.vanced.manager.R -import com.vanced.manager.adapter.LinkAdapter.Companion.DISCORD -import com.vanced.manager.adapter.LinkAdapter.Companion.REDDIT -import com.vanced.manager.adapter.LinkAdapter.Companion.TELEGRAM -import com.vanced.manager.adapter.LinkAdapter.Companion.TWITTER -import com.vanced.manager.adapter.SponsorAdapter.Companion.BRAVE -import com.vanced.manager.model.ButtonTag -import com.vanced.manager.model.DataModel -import com.vanced.manager.model.RootDataModel -import com.vanced.manager.ui.dialogs.AppDownloadDialog -import com.vanced.manager.ui.dialogs.InstallationFilesDetectedDialog -import com.vanced.manager.ui.dialogs.MusicPreferencesDialog -import com.vanced.manager.ui.dialogs.VancedPreferencesDialog -import com.vanced.manager.utils.* -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.managerPkg -import com.vanced.manager.utils.AppUtils.microgPkg -import com.vanced.manager.utils.AppUtils.musicPkg -import com.vanced.manager.utils.AppUtils.musicRootPkg -import com.vanced.manager.utils.AppUtils.vancedPkg -import com.vanced.manager.utils.AppUtils.vancedRootPkg -import com.vanced.manager.utils.PackageHelper.apkExist -import com.vanced.manager.utils.PackageHelper.musicApkExists -import com.vanced.manager.utils.PackageHelper.uninstallApk -import com.vanced.manager.utils.PackageHelper.uninstallRootApk -import com.vanced.manager.utils.PackageHelper.vancedInstallFilesExist -import kotlinx.coroutines.launch - -//TODO fix leak -@SuppressLint("StaticFieldLeak") -class HomeViewModel(private val activity: FragmentActivity) : ViewModel() { - - private val prefs = getDefaultSharedPreferences(activity) - private val variant get() = prefs.getString("vanced_variant", "nonroot") - - val vancedModel = MutableLiveData() - val vancedRootModel = MutableLiveData() - val microgModel = MutableLiveData() - val musicModel = MutableLiveData() - val musicRootModel = MutableLiveData() - val managerModel = MutableLiveData() - - fun fetchData() { - viewModelScope.launch { - loadJson(activity) - Crowdin.forceUpdate(activity) - } - } - - private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG) - - fun openUrl(url: String) { - val color: Int = - when (url) { - DISCORD -> R.color.Discord - TELEGRAM -> R.color.Telegram - TWITTER -> R.color.Twitter - REDDIT -> R.color.Reddit - BRAVE -> R.color.Brave - else -> R.color.Vanced - } - - openUrl(url, color, activity) - } - - fun launchApp(app: String, isRoot: Boolean) { - val componentName = when (app) { - activity.getString(R.string.vanced) -> if (isRoot) ComponentName( - vancedRootPkg, - "$vancedRootPkg.HomeActivity" - ) else ComponentName(vancedPkg, "$vancedRootPkg.HomeActivity") - activity.getString(R.string.music) -> if (isRoot) ComponentName( - musicRootPkg, - "$musicRootPkg.activities.MusicActivity" - ) else ComponentName(musicPkg, "$musicRootPkg.activities.MusicActivity") - activity.getString(R.string.microg) -> ComponentName( - microgPkg, - "org.microg.gms.ui.SettingsActivity" - ) - else -> throw IllegalArgumentException("Can't open this app") - } - try { - activity.startActivity(Intent().setComponent(componentName)) - } catch (e: ActivityNotFoundException) { - log("VMHMV", e.toString()) - } - - } - - fun openInstallDialog(buttonTag: ButtonTag?, app: String) { - if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) { - microgToast.show() - return - } - - if (buttonTag == ButtonTag.UPDATE) { - when (app) { - activity.getString(R.string.vanced) -> VancedPreferencesDialog().show(activity) - activity.getString(R.string.music) -> MusicPreferencesDialog().show(activity) - else -> AppDownloadDialog.newInstance(app).show(activity) - } - return - } - - when (app) { - activity.getString(R.string.vanced) -> { - when (variant) { - "nonroot" -> { - if (vancedInstallFilesExist(activity)) { - InstallationFilesDetectedDialog.newInstance(app).show(activity) - } else { - VancedPreferencesDialog().show(activity) - } - } - "root" -> { - VancedPreferencesDialog().show(activity) - } - } - } - activity.getString(R.string.music) -> { - when (variant) { - "nonroot" -> { - if (musicApkExists(activity)) { - InstallationFilesDetectedDialog.newInstance(app).show(activity) - } else { - MusicPreferencesDialog().show(activity) - } - } - "root" -> { - MusicPreferencesDialog().show(activity) - } - } - } - activity.getString(R.string.microg) -> { - if (apkExist(activity, "microg.apk")) { - InstallationFilesDetectedDialog.newInstance(app).show(activity) - } else { - AppDownloadDialog.newInstance(app).show(activity) - } - } - } - - } - - fun uninstallPackage(pkg: String) { - if (variant == "root" && uninstallRootApk(pkg)) { - viewModelScope.launch { loadJson(activity) } - } else { - uninstallApk(pkg, activity) - } - } - - init { - with(activity) { - if (variant == "root") { - vancedRootModel.value = RootDataModel( - vanced, - this, - this, - vancedRootPkg, - this.getString(R.string.vanced), - activity.getString(R.string.description_vanced), - R.drawable.ic_vanced, - "vanced" - ) - musicRootModel.value = RootDataModel( - music, - this, - this, - musicRootPkg, - this.getString(R.string.music), - activity.getString(R.string.description_vanced_music), - R.drawable.ic_music, - "music" - ) - } else { - vancedModel.value = DataModel( - vanced, - this, - this, - vancedPkg, - this.getString(R.string.vanced), - 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), - "Just manager meh", - R.mipmap.ic_launcher - ) - } - } -} diff --git a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModelFactory.kt b/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModelFactory.kt deleted file mode 100644 index ef7e8d1668..0000000000 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModelFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.vanced.manager.ui.viewmodels - -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider - -class HomeViewModelFactory(private val activity: FragmentActivity) : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return HomeViewModel(activity) as T - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/widget/AppCard.kt b/app/src/main/java/com/vanced/manager/ui/widget/AppCard.kt new file mode 100644 index 0000000000..a38bc5f2a1 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/widget/AppCard.kt @@ -0,0 +1,277 @@ +package com.vanced.manager.ui.widget + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Info +import androidx.compose.material.icons.rounded.DeleteForever +import androidx.compose.material.icons.rounded.GetApp +import androidx.compose.material.icons.rounded.Launch +import androidx.compose.material.icons.rounded.Update +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.google.accompanist.placeholder.PlaceholderHighlight +import com.google.accompanist.placeholder.placeholder +import com.google.accompanist.placeholder.shimmer +import com.vanced.manager.R +import com.vanced.manager.domain.model.AppState +import com.vanced.manager.ui.component.ManagerElevatedCard +import com.vanced.manager.ui.component.ManagerListItem +import com.vanced.manager.ui.component.ManagerText +import com.vanced.manager.ui.theme.LargeShape +import com.vanced.manager.ui.theme.MediumShape +import com.vanced.manager.ui.theme.SmallShape +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.util.DefaultContentPaddingVertical + +@Composable +fun AppCard( + appName: String, + appIcon: Painter, + appInstalledVersion: String?, + appRemoteVersion: String?, + appState: AppState, + onAppDownloadClick: () -> Unit, + onAppUninstallClick: () -> Unit, + onAppLaunchClick: () -> Unit, + onAppInfoClick: () -> Unit, + modifier: Modifier = Modifier, +) { + BaseAppCard( + modifier = modifier, + appTitle = { + ManagerText( + modifier = Modifier.fillMaxSize(), + text = appName, + textStyle = MaterialTheme.typography.titleMedium + ) + }, + appIcon = { + Image( + modifier = Modifier.size(48.dp), + painter = appIcon, + contentDescription = "App Icon", + ) + }, + appTrailing = { + IconButton(onClick = onAppInfoClick) { + Icon( + imageVector = Icons.Outlined.Info, + contentDescription = "App Info" + ) + } + }, + appVersionsColumn = { + ManagerText( + text = stringResource( + id = R.string.app_version_latest, + appRemoteVersion ?: stringResource( + id = R.string.app_content_unavailable + ) + ) + ) + ManagerText( + text = stringResource( + id = R.string.app_version_installed, + appInstalledVersion ?: stringResource( + id = R.string.app_content_unavailable + ) + ) + ) + }, + appActionsRow = { + if (appInstalledVersion != null) { + IconButton(onClick = onAppUninstallClick) { + Icon( + imageVector = Icons.Rounded.DeleteForever, + contentDescription = "Uninstall" + ) + } + IconButton(onClick = onAppLaunchClick) { + Icon( + imageVector = Icons.Rounded.Launch, + contentDescription = "Launch", + ) + } + } + IconButton(onClick = onAppDownloadClick) { + when (appState) { + AppState.NOT_INSTALLED -> { + Icon( + imageVector = Icons.Rounded.GetApp, + contentDescription = "Install", + ) + } + AppState.INSTALLED -> { + Icon( + imageVector = Icons.Rounded.GetApp, + contentDescription = "Install", + ) + } + AppState.NEEDS_UPDATE -> { + Icon( + imageVector = Icons.Rounded.Update, + contentDescription = "Update", + ) + } + } + + } + } + ) +} + +@Composable +fun AppCardPlaceholder( + modifier: Modifier = Modifier +) { + BaseAppCard( + modifier = modifier, + appTitle = { + ManagerText( + modifier = Modifier + .managerPlaceholder( + visible = true, + shape = MediumShape + ), + text = " ".repeat(40), + textStyle = MaterialTheme.typography.titleMedium + ) + }, + appIcon = { + Box( + modifier = Modifier + .managerPlaceholder( + visible = true, + shape = RoundedCornerShape(24.dp) + ) + .size(48.dp) + ) + }, + appTrailing = { + Box( + modifier = Modifier + .managerPlaceholder( + visible = true, + shape = MediumShape + ) + .size(24.dp) + ) + }, + appVersionsColumn = { + ManagerText( + modifier = Modifier + .managerPlaceholder( + visible = true, + shape = SmallShape + ), + text = " ".repeat(30) + ) + ManagerText( + modifier = Modifier + .managerPlaceholder( + visible = true, + shape = SmallShape + ), + text = " ".repeat(30) + ) + }, + appActionsRow = { + Box( + modifier = Modifier + .fillMaxWidth(0.8f) + .height(36.dp) + .managerPlaceholder( + visible = true, + shape = MediumShape + ) + ) + } + ) +} + +@Composable +private fun BaseAppCard( + appTitle: @Composable () -> Unit, + appIcon: @Composable () -> Unit, + appTrailing: @Composable () -> Unit, + appVersionsColumn: @Composable ColumnScope.() -> Unit, + appActionsRow: @Composable RowScope.() -> Unit, + modifier: Modifier = Modifier +) { + ManagerElevatedCard( + modifier = modifier, + shape = LargeShape, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = DefaultContentPaddingHorizontal, + vertical = DefaultContentPaddingVertical + ), + verticalArrangement = Arrangement + .spacedBy(DefaultContentPaddingVertical) + ) { + ManagerListItem( + modifier = Modifier.fillMaxWidth(), + title = appTitle, + icon = appIcon, + trailing = appTrailing + ) + Divider( + modifier = Modifier + .fillMaxWidth() + .clip(LargeShape), + thickness = 2.dp, + ) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column( + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalAlignment = Alignment.Start + ) { + ManagerText( + text = stringResource(id = R.string.app_versions), + textStyle = MaterialTheme.typography.bodyMedium + ) + ProvideTextStyle(value = MaterialTheme.typography.bodySmall) { + appVersionsColumn() + } + } + Row( + modifier = Modifier.wrapContentWidth(), + content = appActionsRow, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.End + ) + } + } + } +} + +private fun Modifier.managerPlaceholder( + visible: Boolean, + shape: Shape +) = composed { + placeholder( + visible = visible, + shape = shape, + color = MaterialTheme.colorScheme.surfaceVariant, + highlight = PlaceholderHighlight.shimmer( + highlightColor = MaterialTheme.colorScheme.onSurfaceVariant + ) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/widget/LinkCard.kt b/app/src/main/java/com/vanced/manager/ui/widget/LinkCard.kt new file mode 100644 index 0000000000..7a97ff5a3b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/widget/LinkCard.kt @@ -0,0 +1,62 @@ +package com.vanced.manager.ui.widget + +import android.net.Uri +import androidx.browser.customtabs.CustomTabsIntent +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.vanced.manager.ui.component.ManagerElevatedCard +import com.vanced.manager.ui.component.ManagerText +import com.vanced.manager.ui.util.DefaultContentPaddingHorizontal +import com.vanced.manager.ui.util.DefaultContentPaddingVertical +import org.koin.androidx.compose.inject + +//TODO this composable should not handle opening links +@Composable +fun LinkCard( + text: String, + icon: Painter, + url: String, + modifier: Modifier = Modifier +) { + val context = LocalContext.current + val customTabs: CustomTabsIntent by inject() + val uri = remember { Uri.parse(url) } + ManagerElevatedCard( + modifier = modifier + .height(100.dp) + .widthIn(min = 100.dp), + onClick = { + customTabs.launchUrl(context, uri) + } + ) { + Box( + modifier = Modifier + .fillMaxSize() + .padding( + horizontal = DefaultContentPaddingHorizontal, + vertical = DefaultContentPaddingVertical + ), + ) { + Icon( + modifier = Modifier + .size(32.dp) + .align(Alignment.TopStart), + painter = icon, + contentDescription = null, + ) + ManagerText( + modifier = Modifier.align(Alignment.BottomStart), + text = text, + textStyle = MaterialTheme.typography.labelLarge + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/AppHelper.kt b/app/src/main/java/com/vanced/manager/util/AppHelper.kt new file mode 100644 index 0000000000..7d4369d5ea --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/AppHelper.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.util + +fun getLatestOrProvidedAppVersion( + version: String, + appVersions: List? +): String { + if (appVersions == null) + return version + + if (appVersions.contains(version)) + return version + + return appVersions.last() +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/Arch.kt b/app/src/main/java/com/vanced/manager/util/Arch.kt new file mode 100644 index 0000000000..df160cebf2 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/Arch.kt @@ -0,0 +1,10 @@ +package com.vanced.manager.util + +import android.os.Build + +val arch + get() = when { + Build.SUPPORTED_ABIS.contains("x86") -> "x86" + Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a" + else -> "armeabi_v7a" + } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/Coroutines.kt b/app/src/main/java/com/vanced/manager/util/Coroutines.kt new file mode 100644 index 0000000000..2ca647eec7 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/Coroutines.kt @@ -0,0 +1,14 @@ +package com.vanced.manager.util + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import java.util.concurrent.Executor +import kotlin.coroutines.CoroutineContext + +fun CoroutineContext.asExecutor(): Executor = object : Executor { + private val scope = CoroutineScope(this@asExecutor) + + override fun execute(command: Runnable) { + scope.launch { command.run() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/IO.kt b/app/src/main/java/com/vanced/manager/util/IO.kt new file mode 100644 index 0000000000..0271bce5fb --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/IO.kt @@ -0,0 +1,36 @@ +package com.vanced.manager.util + +import okhttp3.ResponseBody +import java.io.FileOutputStream +import java.io.InputStream +import java.io.OutputStream + +inline fun ResponseBody.writeFile( + filePath: String, + onProgress: (Float) -> Unit +) { + byteStream().use { inputStream -> + FileOutputStream(filePath).use { outputStream -> + val totalBytes = contentLength() + inputStream.copyTo(outputStream, 8192) { bytes -> + onProgress((bytes * 100 / totalBytes).toFloat()) + } + } + } +} + +inline fun InputStream.copyTo( + outputStream: OutputStream, + bufferSize: Int, + onProgress: (Long) -> Unit +) { + val buffer = ByteArray(bufferSize) + var bytesCopied: Long = 0 + var bytes = read(buffer) + while (bytes >= 0) { + outputStream.write(buffer, 0, bytes) + bytesCopied += bytes + bytes = read(buffer) + onProgress(bytesCopied) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/Safety.kt b/app/src/main/java/com/vanced/manager/util/Safety.kt new file mode 100644 index 0000000000..b629550b64 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/Safety.kt @@ -0,0 +1,32 @@ +package com.vanced.manager.util + +//Dear reader, welcome to HELL. +//We don't kink-shame here. + +inline fun doubleUnionTryCatch( + onCatch: (Exception) -> R, + onTry: () -> R +): R { + return try { + onTry() + } catch (e: Exception) { + when (e) { + is E1, is E2 -> onCatch(e) + else -> throw e + } + } +} + +inline fun tripleUnionTryCatch( + onCatch: (Exception) -> R, + onTry: () -> R +): R { + return try { + onTry() + } catch (e: Exception) { + when (e) { + is E1, is E2, is E3 -> onCatch(e) + else -> throw e + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/util/SuShell.kt b/app/src/main/java/com/vanced/manager/util/SuShell.kt new file mode 100644 index 0000000000..73b6f072bb --- /dev/null +++ b/app/src/main/java/com/vanced/manager/util/SuShell.kt @@ -0,0 +1,39 @@ +package com.vanced.manager.util + +import com.topjohnwu.superuser.Shell +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +val Shell.Result.outString + get() = out.joinToString("\n") + +val Shell.Result.errString + get() = err.joinToString("\n") + +val isMagiskInstalled + get() = Shell.rootAccess() && Shell.su("magisk", "-c").exec().isSuccess + +suspend fun Shell.Job.await(): Shell.Result { + return suspendCoroutine { continuation -> + submit { + continuation.resume(it) + } + } +} + +class SuException(val stderrOut: String) : Exception(stderrOut) + +@Throws(SuException::class) +suspend fun Shell.Job.awaitOutputOrThrow(): String { + return suspendCoroutine { continuation -> + submit { + if (it.isSuccess) { + continuation.resume(it.outString) + } else { + continuation.resumeWithException(SuException(it.errString)) + } + } + } +} + diff --git a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt deleted file mode 100644 index 53ef76e85d..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt +++ /dev/null @@ -1,143 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.graphics.Typeface -import android.text.Spannable -import android.text.SpannableString -import android.text.style.ForegroundColorSpan -import android.text.style.StyleSpan -import android.util.Log -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.vanced.manager.BuildConfig.APPLICATION_ID -import com.vanced.manager.R -import com.vanced.manager.ui.dialogs.AppDownloadDialog -import com.vanced.manager.ui.fragments.HomeFragment -import kotlinx.coroutines.* -import java.io.File -import java.io.IOException -import java.security.MessageDigest -import java.util.* - -object AppUtils : CoroutineScope by CoroutineScope(Dispatchers.IO) { - - const val vancedPkg = "com.vanced.android.youtube" - const val vancedRootPkg = "com.google.android.youtube" - const val musicPkg = "com.vanced.android.apps.youtube.music" - const val musicRootPkg = "com.google.android.apps.youtube.music" - const val microgPkg = "com.mgoogle.android.gms" - const val faqpkg = "com.vanced.faq" - const val managerPkg = APPLICATION_ID - const val playStorePkg = "com.android.vending" - - val logs = mutableListOf() - - var currentLocale: Locale? = null - - fun log(tag: String, message: String) { - logs.add( - SpannableString("$tag: $message\n").apply { - setSpan(ForegroundColorSpan(Color.parseColor("#2e73ff")), 0, tag.length + 1, 0) - setSpan(StyleSpan(Typeface.BOLD), 0, tag.length + 1, 0) - setSpan( - ForegroundColorSpan(Color.MAGENTA), - tag.length + 2, - tag.length + message.length + 2, - 0 - ) - } - ) - Log.d(tag, message) - } - - fun sendRefresh(context: Context): Job { - return launch { - delay(700) - LocalBroadcastManager.getInstance(context) - .sendBroadcast(Intent(HomeFragment.REFRESH_HOME)) - } - } - - fun sendCloseDialog(context: Context): Job { - return launch { - delay(700) - installing.postValue(false) - LocalBroadcastManager.getInstance(context) - .sendBroadcast(Intent(AppDownloadDialog.CLOSE_DIALOG)) - } - } - - fun sendFailure(error: MutableList, context: Context) { - sendFailure(error.joinToString(" "), context) - } - - fun sendFailure(error: String, context: Context): Job { - //Delay error broadcast until activity (and fragment) get back to the screen - return launch { - delay(700) - val intent = Intent(HomeFragment.INSTALL_FAILED) - intent.putExtra("errorMsg", getErrorMessage(error, context)) - intent.putExtra("fullErrorMsg", error) - LocalBroadcastManager.getInstance(context).sendBroadcast(intent) - } - } - - @Throws(IOException::class) - fun generateChecksum(data: ByteArray): String { - try { - val digest: MessageDigest = MessageDigest.getInstance("SHA-256") - val hash: ByteArray = digest.digest(data) - return printableHexString(hash) - } catch (e: Exception) { - e.printStackTrace() - } - - return "" - } - - private fun printableHexString(data: ByteArray): String { - // Create Hex String - val hexString: StringBuilder = StringBuilder() - for (aMessageDigest: Byte in data) { - var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt()) - while (h.length < 2) - h = "0$h" - hexString.append(h) - } - return hexString.toString() - } - - fun validateTheme( - downloadPath: String, - apk: String, - hashUrl: String, - context: Context, - ): Boolean { - val themeF = File(downloadPath, "$apk.apk") - return runBlocking { checkSHA256(getSha256(hashUrl, apk, context), themeF) } - } - - private fun getErrorMessage(status: String, context: Context): String { - log("VMInstall", status) - return when { - status.contains("INSTALL_FAILED_ABORTED") -> context.getString(R.string.installation_aborted) - status.contains("INSTALL_FAILED_ALREADY_EXISTS") -> context.getString(R.string.installation_conflict) - status.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE") -> context.getString(R.string.installation_incompatible) - status.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE") -> context.getString(R.string.installation_storage) - status.contains("INSTALL_FAILED_INVALID_APK") -> context.getString(R.string.installation_invalid) - status.contains("INSTALL_FAILED_VERSION_DOWNGRADE") -> context.getString(R.string.installation_downgrade) - status.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES") -> context.getString(R.string.installation_signature) - status.contains("Failed_Uninstall") -> context.getString(R.string.failed_uninstall) - status.contains("Chown_Fail") -> context.getString(R.string.chown_fail) - status.contains("IFile_Missing") -> context.getString(R.string.ifile_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("Path_Missing") -> context.getString(R.string.path_missing) - status.contains("INSTALL_FAILED_INTERNAL_ERROR: Permission Denied") -> context.getString( - R.string.installation_miui - ) - else -> context.getString(R.string.installation_failed) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt b/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt deleted file mode 100644 index 114f29a77e..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.vanced.manager.utils - -import android.os.Build - -fun getArch(): String = when { - Build.SUPPORTED_ABIS.contains("x86") -> "x86" - Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a" - else -> "armeabi_v7a" -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt b/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt deleted file mode 100644 index 4cc8f1f4f8..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt +++ /dev/null @@ -1,158 +0,0 @@ -package com.vanced.manager.utils - -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import androidx.core.content.FileProvider -import com.vanced.manager.R -import com.vanced.manager.library.network.providers.createService -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.sendCloseDialog -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import okhttp3.ResponseBody -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.http.GET -import retrofit2.http.Streaming -import retrofit2.http.Url -import java.io.* - -object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { - - interface DownloadHelper { - - @Streaming - @GET - fun download(@Url url: String): Call - - } - - fun download( - url: String, - baseUrl: String, - fileFolder: String, - fileName: String, - context: Context, - onDownloadComplete: () -> Unit = {}, - onError: (error: String) -> Unit = {} - ) { - downloadingFile.postValue(context.getString(R.string.downloading_file, fileName)) - val downloadInterface = createService(DownloadHelper::class, baseUrl) - val download = downloadInterface.download(url) - currentDownload = download - download.enqueue(object : Callback { - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful) { - launch { - if (response.body()?.let { - writeFile( - it, - context.getExternalFilesDir(fileFolder)?.path + "/" + fileName - ) - } == true) { - onDownloadComplete() - } else { - onError("Could not save file") - downloadProgress.postValue(0) - log( - "VMDownloader", - "Failed to save file: $url\n${response.errorBody()}" - ) - } - } - } else { - val errorBody = response.errorBody().toString() - onError(errorBody) - downloadProgress.postValue(0) - log("VMDownloader", "Failed to download file: $url\n$errorBody") - } - } - - override fun onFailure(call: Call, t: Throwable) { - if (call.isCanceled) { - log("VMDownloader", "Download canceled") - downloadProgress.postValue(0) - } else { - onError(t.stackTraceToString()) - downloadProgress.postValue(0) - log("VMDownloader", "Failed to download file: $url") - } - } - - }) - } - - fun writeFile(body: ResponseBody, filePath: String): Boolean { - return try { - val file = File(filePath) - val totalBytes = body.contentLength() - var inputStream: InputStream? = null - var outputStream: OutputStream? = null - try { - val fileReader = ByteArray(4096) - var downloadedBytes: Long = 0 - inputStream = body.byteStream() - outputStream = FileOutputStream(file) - var read: Int - while (inputStream.read(fileReader).also { read = it } != -1) { - outputStream.write(fileReader, 0, read) - downloadedBytes += read.toLong() - downloadProgress.postValue((downloadedBytes * 100 / totalBytes).toInt()) - } - outputStream.flush() - true - } catch (e: IOException) { - false - } finally { - inputStream?.close() - outputStream?.close() - } - } catch (e: IOException) { - false - } - } - - fun downloadManager(context: Context) { - val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk" - download( - url, - "https://github.com/YTVanced/VancedManager/", - "manager", - "manager.apk", - context, - onDownloadComplete = { - val apk = File("${context.getExternalFilesDir("manager")?.path}/manager.apk") - val uri = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - FileProvider.getUriForFile(context, "${context.packageName}.provider", apk) - else - Uri.fromFile(apk) - - val intent = Intent(Intent.ACTION_VIEW) - intent.setDataAndType(uri, "application/vnd.android.package-archive") - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - try { - context.startActivity(intent) - } catch (e: ActivityNotFoundException) { - log("VMDownloader", e.stackTraceToString()) - } finally { - sendCloseDialog(context) - } - }, - onError = { - downloadingFile.postValue( - context.getString( - R.string.error_downloading, - "manager.apk" - ) - ) - }) - } - -} diff --git a/app/src/main/java/com/vanced/manager/utils/Extensions.kt b/app/src/main/java/com/vanced/manager/utils/Extensions.kt deleted file mode 100644 index 4d46d33e21..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/Extensions.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.content.ContextWrapper -import android.content.DialogInterface -import android.widget.RadioGroup -import androidx.core.graphics.ColorUtils -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.LifecycleOwner -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.progressindicator.LinearProgressIndicator -import com.google.android.material.radiobutton.MaterialRadioButton -import com.topjohnwu.superuser.io.SuFile -import com.topjohnwu.superuser.io.SuFileOutputStream -import com.vanced.manager.R -import com.vanced.manager.utils.AppUtils.log -import java.util.* - -val RadioGroup.checkedButtonTag: String? - get() = findViewById( - checkedRadioButtonId - )?.tag?.toString() - -fun DialogFragment.show(activity: FragmentActivity) { - try { - show(activity.supportFragmentManager, "") - } catch (e: Exception) { - log("VMUI", e.stackTraceToString()) - } -} - -fun List.convertToAppVersions(): List = listOf("latest") + reversed() - -fun String.formatVersion(context: Context): String = - if (this == "latest") context.getString(R.string.install_latest) else this - -fun String.convertToAppTheme(context: Context): String = with(context) { - getString( - R.string.light_plus_other, - if (this@convertToAppTheme == "dark") getString(R.string.vanced_dark) else getString(R.string.vanced_black) - ) -} - -fun String.getLatestAppVersion(versions: List): String = - if (this == "latest") versions.reversed()[0] else this - -val Context.lifecycleOwner: LifecycleOwner? - get() = when (this) { - is LifecycleOwner -> this - !is LifecycleOwner -> (this as ContextWrapper).baseContext as LifecycleOwner - else -> null - } - -fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) - -//Material team decided to keep their LinearProgressIndicator final -//At least extension methods exist -fun LinearProgressIndicator.applyAccent() { - with(accentColor.value!!) { - setIndicatorColor(this) - trackColor = ColorUtils.setAlphaComponent(this, 70) - } -} - -fun MaterialAlertDialogBuilder.showWithAccent() { - with(accentColor.value!!) { - show().apply { - getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with) - getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with) - getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(this@with) - } - } -} - -fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) { - val shellFileZ = SuFile.open("/data/adb/service.d/$app.sh") - shellFileZ.createNewFile() - val script = """ - #!/system/bin/sh - while [ "$(getprop sys.boot_completed | tr -d '\r')" != "1" ]; do sleep 1; done - sleep ${defPrefs.serviceDSleepTimer} - chcon u:object_r:apk_data_file:s0 $apkFPath - mount -o bind $apkFPath $path - """.trimIndent() - SuFileOutputStream.open(shellFileZ).use { out -> out.write(script.toByteArray()) } -} diff --git a/app/src/main/java/com/vanced/manager/utils/InstallPrefs.kt b/app/src/main/java/com/vanced/manager/utils/InstallPrefs.kt deleted file mode 100644 index fbdb5b62ac..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/InstallPrefs.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.content.SharedPreferences -import androidx.core.content.edit - -val Context.installPrefs: SharedPreferences - get() = getSharedPreferences( - "installPrefs", - Context.MODE_PRIVATE - ) - -var SharedPreferences.lang - get() = getString("lang", getDefaultVancedLanguages()) - set(value) = edit { putString("lang", value) } - - -var SharedPreferences.theme - get() = getString("theme", "dark") - set(value) = edit { putString("theme", value) } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt b/app/src/main/java/com/vanced/manager/utils/InternetTools.kt deleted file mode 100644 index a8601c4213..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt +++ /dev/null @@ -1,147 +0,0 @@ -package com.vanced.manager.utils - -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.util.Log -import android.widget.Toast -import androidx.browser.customtabs.CustomTabColorSchemeParams -import androidx.browser.customtabs.CustomTabsIntent -import androidx.core.content.ContextCompat -import androidx.core.net.toUri -import androidx.lifecycle.MutableLiveData -import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.beust.klaxon.JsonArray -import com.beust.klaxon.JsonObject -import com.vanced.manager.R -import com.vanced.manager.utils.AppUtils.generateChecksum -import com.vanced.manager.utils.AppUtils.log -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import java.io.File -import java.io.IOException -import java.net.HttpURLConnection -import java.net.SocketTimeoutException -import java.net.URL -import java.util.* - -private const val TAG = "VMNetTools" - -val vanced = MutableLiveData() -val music = MutableLiveData() -val microg = MutableLiveData() -val manager = MutableLiveData() - -val vancedVersions = MutableLiveData>() -val musicVersions = MutableLiveData>() - -val isFetching = MutableLiveData() - -var isMicrogBroken: Boolean = false - -var baseInstallUrl = "" - -fun openUrl(url: String, color: Int, context: Context) { - try { - val customTabPrefs = - getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true) - if (customTabPrefs) { - val builder = CustomTabsIntent.Builder() - val params = CustomTabColorSchemeParams.Builder() - .setToolbarColor(ContextCompat.getColor(context, color)) - builder.setDefaultColorSchemeParams(params.build()) - val customTabsIntent = builder.build() - customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - customTabsIntent.launchUrl(context, url.toUri()) - } else - context.startActivity( - Intent( - Intent.ACTION_VIEW, - url.toUri() - ).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - ) - - } catch (e: ActivityNotFoundException) { - Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show() - } catch (e: SecurityException) { - Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show() - } -} - -fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length) - -//TODO: Use a better connection method that doesn't cause inappropriate blocks -@Suppress("BlockingMethodInNonBlockingContext") -suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { - isFetching.postValue(true) - val installUrl = context.defPrefs.installUrl - if (baseInstallUrl == "" && installUrl != null) { - baseInstallUrl = installUrl - } - - try { - val latestbaseUrl = "$baseInstallUrl/latest.json" - val connection = URL(latestbaseUrl).openConnection() as HttpURLConnection - connection.apply { - connectTimeout = 5000 - readTimeout = 5000 - connect() - } - if (connection.responseCode != 200) { - log(TAG, latestbaseUrl + ": " + connection.responseCode.toString()) - baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" - } - } catch (e: IOException) { - baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" - } catch (e: SocketTimeoutException) { - log(TAG, "connection timed out") - baseInstallUrl = "https://mirror.codebucket.de/vanced/api/v1" - } - - log(TAG, "Fetching using URL: $baseInstallUrl") - - val calendar = Calendar.getInstance() - val hour = calendar.get(Calendar.HOUR_OF_DAY) - val minute = calendar.get(Calendar.MINUTE) - val second = calendar.get(Calendar.SECOND) - val fetchTime = "fetchTime=$hour$minute$second" - - val latest = getJson("$baseInstallUrl/latest.json?$fetchTime") - val versions = getJson("$baseInstallUrl/versions.json?$fetchTime") - isMicrogBroken = latest?.boolean("is_microg_broken") ?: false - vanced.postValue(latest?.obj("vanced")) - vancedVersions.postValue(versions?.array("vanced")) - music.postValue(latest?.obj("music")) - musicVersions.postValue(versions?.array("music")) - microg.postValue(latest?.obj("microg")) - manager.postValue(latest?.obj("manager")) - isFetching.postValue(false) -} - -private suspend fun getJsonString(file: String, obj: String, context: Context): String { - return try { - getJson("$baseInstallUrl/$file")?.string(obj) ?: context.getString(R.string.unavailable) - } catch (e: Exception) { - Log.e(TAG, "Error: ", e) - context.getString(R.string.unavailable) - } -} - -suspend fun getSha256(hashUrl: String, obj: String, context: Context): String { - return getJsonString(hashUrl, obj, context) -} - -fun checkSHA256(sha256: String, updateFile: File): Boolean { - return try { - val dataBuffer = updateFile.readBytes() - // Generate the checksum - val sum = generateChecksum(dataBuffer) - - sum.equals(sha256, ignoreCase = true) - } catch (e: Exception) { - e.printStackTrace() - false - } -} - -const val baseUrl = "https://api.vancedapp.com/api/v1" \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/JsonHelper.kt b/app/src/main/java/com/vanced/manager/utils/JsonHelper.kt deleted file mode 100644 index d140f163b1..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/JsonHelper.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.vanced.manager.utils - -import com.beust.klaxon.JsonArray -import com.beust.klaxon.JsonObject -import com.beust.klaxon.Klaxon -import com.beust.klaxon.Parser -import com.github.kittinunf.fuel.coroutines.awaitString -import com.github.kittinunf.fuel.httpGet - -private var dataMap: HashMap = HashMap() - -suspend fun getJson(url: String): JsonObject? { - return try { - if (dataMap.containsKey(url)) { - dataMap[url] - } else { - dataMap[url] = getSuspendJson(url) - dataMap[url] - } - } catch (e: Exception) { - //This null is NEEDED, do NOT try to "fix" NPE here!!! - null - } -} - -private suspend fun getSuspendJson(url: String): JsonObject = - Parser.default().parse( - StringBuilder(url.httpGet().awaitString()) - ) as JsonObject - -suspend fun getJsonArray(url: String): JsonArray = - Klaxon().parseArray( - url.httpGet().awaitString() - ) as JsonArray diff --git a/app/src/main/java/com/vanced/manager/utils/LanguageContextWrapper.kt b/app/src/main/java/com/vanced/manager/utils/LanguageContextWrapper.kt deleted file mode 100644 index e079d5e6f4..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/LanguageContextWrapper.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.content.ContextWrapper -import android.content.res.Configuration -import android.content.res.Resources -import com.vanced.manager.utils.AppUtils.currentLocale -import java.util.* - -class LanguageContextWrapper(base: Context?) : ContextWrapper(base) { - - companion object { - - fun wrap(context: Context): ContextWrapper { - val config: Configuration = context.resources.configuration - context.createConfigurationContext(setLocale(config, context)) - return LanguageContextWrapper(context) - } - - @Suppress("DEPRECATION") - private fun setLocale(config: Configuration, context: Context): Configuration { - val pref = context.defPrefs.managerLang - val sysLocale = Resources.getSystem().configuration.locale - val locale = when { - pref == "System Default" -> Locale(sysLocale.language, sysLocale.country) - pref?.length!! > 2 -> Locale( - pref.substring(0, pref.length - 3), - pref.substring(pref.length - 2) - ) - else -> Locale(pref) - } - currentLocale = locale - Locale.setDefault(locale) - config.setLocale(locale) - return config - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt b/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt deleted file mode 100644 index 489f036af6..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt +++ /dev/null @@ -1,81 +0,0 @@ -package com.vanced.manager.utils - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.content.res.Resources -import android.net.Uri -import android.os.Build -import android.os.LocaleList -import android.provider.Settings -import androidx.annotation.RequiresApi -import com.crowdin.platform.Crowdin -import com.vanced.manager.R -import java.util.* - -fun getLanguageFormat(context: Context, language: String): String { - return when { - language == "System Default" -> context.getString(R.string.system_default) - language.contains("_") -> { - val loc = Locale( - language.substringBefore("_"), - language.substringAfter("_") - ) - loc.getDisplayName(loc).capitalize(Locale.ENGLISH) - } - else -> { - val loc = Locale(language) - loc.getDisplayName(loc).capitalize(Locale.ENGLISH) - } - } - -} - -@Suppress("DEPRECATION") -fun getDefaultVancedLanguages(): String { - val serverLangs = vanced.value?.array("langs") ?: mutableListOf("") - val sysLocales = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Resources.getSystem().configuration.locales.toLangTags() else arrayOf( - Resources.getSystem().configuration.locale.language - ) - val finalLangs = mutableListOf() - sysLocales.forEach { sysLocale -> - when { - sysLocale == "en" -> finalLangs.add(sysLocale) - serverLangs.contains(sysLocale) -> finalLangs.add(sysLocale) - } - } - - return finalLangs.distinct().sorted().joinToString(", ") -} - -@RequiresApi(Build.VERSION_CODES.N) -fun LocaleList.toLangTags(): Array { - val langTags: Array = this.toLanguageTags().split(",").toTypedArray() - for (i in 0 until this.size()) { - langTags[i] = langTags[i].substring(0, 2) - } - return langTags -} - -fun Activity.authCrowdin() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (!Settings.canDrawOverlays(this)) { - val intent = Intent( - Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:$packageName") - ) - startActivityForResult(intent, 69) - return - } - Crowdin.authorize(this) - } -} - -fun Activity.onActivityResult(requestCode: Int) { - if (requestCode == 69 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (Settings.canDrawOverlays(this)) { - Crowdin.authorize(this) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/MiuiHelper.kt b/app/src/main/java/com/vanced/manager/utils/MiuiHelper.kt deleted file mode 100644 index 3bf3ef1ab1..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/MiuiHelper.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.provider.Settings - -private const val MIUI_OPTIMIZATION = "miui_optimization" - -val Context.isMiuiOptimizationsEnabled: Boolean - get() = Settings.Secure.getString( - contentResolver, - MIUI_OPTIMIZATION - ) == "1" \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt deleted file mode 100644 index 9ae53c177c..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ /dev/null @@ -1,596 +0,0 @@ -package com.vanced.manager.utils - -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.content.pm.PackageInfo -import android.content.pm.PackageInstaller -import android.content.pm.PackageManager -import android.os.Build -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.io.SuFile -import com.vanced.manager.BuildConfig -import com.vanced.manager.core.installer.AppInstallerService -import com.vanced.manager.core.installer.AppUninstallerService -import com.vanced.manager.utils.AppUtils.log -import com.vanced.manager.utils.AppUtils.musicRootPkg -import com.vanced.manager.utils.AppUtils.playStorePkg -import com.vanced.manager.utils.AppUtils.sendCloseDialog -import com.vanced.manager.utils.AppUtils.sendFailure -import com.vanced.manager.utils.AppUtils.sendRefresh -import com.vanced.manager.utils.AppUtils.vancedRootPkg -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.io.File -import java.io.FileInputStream -import java.io.IOException -import java.io.InputStream -import java.util.* - -object PackageHelper { - - const val apkInstallPath = "/data/adb" - private const val INSTALLER_TAG = "VMInstall" - private val vancedThemes = - vanced.value?.array("themes")?.value ?: listOf("black", "dark", "pink", "blue") - - init { - Shell.enableVerboseLogging = BuildConfig.DEBUG - Shell.setDefaultBuilder( - Shell.Builder.create() - .setFlags(Shell.FLAG_REDIRECT_STDERR) - .setTimeout(10) - ) - } - - private fun getAppNameRoot(pkg: String): String { - return when (pkg) { - vancedRootPkg -> "vanced" - musicRootPkg -> "music" - else -> "" - } - } - - fun scriptExists(scriptName: String): Boolean { - val serviceDScript = SuFile.open("$apkInstallPath/service.d/$scriptName.sh") - val postFsDataScript = SuFile.open("$apkInstallPath/post-fs-data.d/$scriptName.sh") - if (serviceDScript.exists() && postFsDataScript.exists()) { - return true - } - return false - } - - fun getPkgNameRoot(app: String): String { - return when (app) { - "vanced" -> vancedRootPkg - "music" -> musicRootPkg - else -> "" - } - } - - fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean { - return try { - packageManager.getPackageInfo(packageName, 0) - true - } catch (e: PackageManager.NameNotFoundException) { - false - } - } - - fun getPackageVersionName(packageName: String, packageManager: PackageManager): String { - return if (isPackageInstalled(packageName, packageManager)) - packageManager.getPackageInfo(packageName, 0).versionName - else - "" - } - - @Suppress("DEPRECATION") - fun getPkgVerCode(pkg: String, pm: PackageManager): Int? { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt() - else - pm.getPackageInfo(pkg, 0)?.versionCode - - } - - fun downloadStockCheck(pkg: String, versionCode: Int, context: Context): Boolean { - return try { - getPkgVerCode(pkg, context.packageManager) != versionCode - } catch (e: Exception) { - true - } - } - - fun apkExist(context: Context, apk: String): Boolean { - val apkPath = File(context.getExternalFilesDir(apk.substring(0, apk.length - 4))?.path, apk) - if (apkPath.exists()) - return true - - return false - } - - fun musicApkExists(context: Context): Boolean { - val apkPath = File(context.getExternalFilesDir("music/nonroot")?.path, "nonroot.apk") - if (apkPath.exists()) { - return true - } - - return false - } - - fun vancedInstallFilesExist(context: Context): Boolean { - val apksPath = File(context.getExternalFilesDir("vanced/nonroot")?.path.toString()) - val splitFiles = mutableListOf() - if (apksPath.exists()) { - val files = apksPath.listFiles() - if (files?.isNotEmpty() == true) { - for (file in files) { - when { - vancedThemes.any { file.name == "$it.apk" } && !splitFiles.contains("base") -> splitFiles.add( - "base" - ) - file.name.matches(Regex("split_config\\.(..)\\.apk")) && !splitFiles.contains( - "lang" - ) -> splitFiles.add("lang") - (file.name.startsWith("split_config.arm") || file.name.startsWith("split_config.x86")) && !splitFiles.contains( - "arch" - ) -> splitFiles.add("arch") - } - - if (splitFiles.size == 3) { - return true - } - } - } - return false - } - return false - } - - fun uninstallRootApk(pkg: String): Boolean { - val app = getAppNameRoot(pkg) - Shell.su("rm -rf $apkInstallPath/${app.capitalize(Locale.ROOT)}").exec() - Shell.su("rm $apkInstallPath/post-fs-data.d/$app.sh").exec() - Shell.su("rm $apkInstallPath/service.d/$app.sh").exec() - return Shell.su("pm uninstall $pkg").exec().isSuccess - } - - fun uninstallApk(pkg: String, context: Context) { - val callbackIntent = Intent(context, AppUninstallerService::class.java) - callbackIntent.putExtra("pkg", pkg) - val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) - try { - context.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender) - } catch (e: Exception) { - e.printStackTrace() - } - } - - fun install(path: String, context: Context) { - val callbackIntent = Intent(context, AppInstallerService::class.java) - val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) - val packageInstaller = context.packageManager.packageInstaller - val params = - PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) - val sessionId: Int - var session: PackageInstaller.Session? = null - try { - sessionId = packageInstaller.createSession(params) - session = packageInstaller.openSession(sessionId) - val inputStream: InputStream = FileInputStream(path) - val outputStream = session.openWrite("install", 0, -1) - val buffer = ByteArray(65536) - var length: Int - while (inputStream.read(buffer).also { length = it } > 0) { - outputStream.write(buffer, 0, length) - } - session.fsync(outputStream) - inputStream.close() - outputStream.close() - session.commit(pendingIntent.intentSender) - } catch (e: Exception) { - log(INSTALLER_TAG, e.stackTraceToString()) - sendFailure(e.stackTraceToString(), context) - sendCloseDialog(context) - } finally { - session?.close() - } - } - - private fun installRootMusic(files: List, context: Context): Boolean { - files.forEach { apk -> - if (apk.name != "root.apk") { - val newPath = "/data/local/tmp/${apk.name}" - - //moving apk to tmp folder in order to avoid permission denials - Shell.su("mv ${apk.path} $newPath").exec() - val command = Shell.su("pm install -r $newPath").exec() - Shell.su("rm $newPath").exec() - if (command.isSuccess) { - return true - } else { - sendFailure(command.out, context) - sendCloseDialog(context) - } - - } - } - return false - } - - private fun installRootApp( - context: Context, - app: String, - appVerCode: Int?, - pkg: String, - modApkBool: (fileName: String) -> Boolean - ) = CoroutineScope(Dispatchers.IO).launch { - Shell.getShell { - val apkFilesPath = context.getExternalFilesDir("$app/root")?.path - val files = File(apkFilesPath.toString()).listFiles()?.toList() - if (files != null) { - val modApk: File? = files.lastOrNull { modApkBool(it.name) } - if (modApk != null) { - if (appVerCode != null) { - if (overwriteBase(modApk, files, appVerCode, pkg, app, context)) { - setInstallerPackage(context, pkg, playStorePkg) - log(INSTALLER_TAG, "Finished installation") - sendRefresh(context) - sendCloseDialog(context) - } - } else { - sendFailure(listOf("appVerCode is null").toMutableList(), context) - sendCloseDialog(context) - } - } else { - sendFailure(listOf("ModApk_Missing").toMutableList(), context) - sendCloseDialog(context) - } - } else { - sendFailure(listOf("Files_Missing_VA").toMutableList(), context) - sendCloseDialog(context) - } - - } - - } - - fun installMusicRoot(context: Context) { - installRootApp( - context, - "music", - music.value?.int("versionCode"), - musicRootPkg - ) { - it == "root.apk" - } - } - - fun installVancedRoot(context: Context) { - installRootApp( - context, - "vanced", - vanced.value?.int("versionCode"), - vancedRootPkg - ) { fileName -> - vancedThemes.any { fileName == "$it.apk" } - } - } - - fun installSplitApkFiles( - context: Context, - appName: String - ) { - val packageInstaller = context.packageManager.packageInstaller - val folder = File(context.getExternalFilesDir("$appName/nonroot")?.path.toString()) - var session: PackageInstaller.Session? = null - val sessionId: Int - val sessionParams = - PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) - val callbackIntent = Intent(context, AppInstallerService::class.java) - val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) - try { - sessionId = packageInstaller.createSession(sessionParams) - session = packageInstaller.openSession(sessionId) - folder.listFiles()?.forEach { apk -> - val inputStream = FileInputStream(apk) - val outputStream = session.openWrite(apk.name, 0, apk.length()) - val buffer = ByteArray(65536) - var length: Int - while (inputStream.read(buffer).also { length = it } > 0) { - outputStream.write(buffer, 0, length) - } - session.fsync(outputStream) - inputStream.close() - outputStream.close() - } - session.commit(pendingIntent.intentSender) - } catch (e: Exception) { - log(INSTALLER_TAG, e.stackTraceToString()) - sendFailure(e.stackTraceToString(), context) - sendCloseDialog(context) - } finally { - session?.close() - } - } - - private fun installSplitApkFilesRoot(apkFiles: List?, context: Context): Boolean { - val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json") - log(INSTALLER_TAG, "installing split apk files: ${apkFiles?.map { it.name }}") - val sessionId = - Shell.su("pm install-create -r").exec().out.joinToString(" ").filter { it.isDigit() } - .toIntOrNull() - - if (sessionId == null) { - sendFailure("Session ID is null", context) - sendCloseDialog(context) - return false - } - - apkFiles?.filter { !filenames.contains(it.name) }?.forEach { apkFile -> - val apkName = apkFile.name - log(INSTALLER_TAG, "installing APK: $apkName") - val newPath = "/data/local/tmp/$apkName" - // Moving apk to avoid permission denials - Shell.su("mv ${apkFile.path} $newPath").exec() - val command = Shell.su("pm install-write $sessionId $apkName $newPath").exec() - Shell.su("rm $newPath").exec() - if (!command.isSuccess) { - sendFailure(command.out, context) - sendCloseDialog(context) - return false - } - } - log(INSTALLER_TAG, "committing...") - val installResult = Shell.su("pm install-commit $sessionId").exec() - if (installResult.isSuccess) { - return true - } - sendFailure(installResult.out, context) - sendCloseDialog(context) - return false - } - - - //overwrite stock Vanced/Music - private fun overwriteBase( - apkFile: File, - baseApkFiles: List, - versionCode: Int, - pkg: String, - app: String, - context: Context - ): Boolean { - if (checkVersion(versionCode, baseApkFiles, pkg, context)) { - val path = getPackageDir(context, pkg) - val apath = apkFile.absolutePath - - setupFolder("$apkInstallPath/${app.capitalize(Locale.ROOT)}") - if (path != null) { - val apkFPath = "$apkInstallPath/${app.capitalize(Locale.ROOT)}/base.apk" - if (moveAPK(apath, apkFPath, pkg, context)) { - if (chConV(apkFPath, context)) { - if (setupScript(apkFPath, path, app, pkg, context)) { - return linkApp(apkFPath, pkg, path) - } - } - } - } - } - return false - } - - private fun setupScript( - apkFPath: String, - path: String, - app: String, - pkg: String, - context: Context - ): Boolean { - try { - log(INSTALLER_TAG, "Setting up script") - context.writeServiceDScript(apkFPath, path, app) - Shell.su("""echo "#!/system/bin/sh\nwhile read line; do echo \${"$"}{line} | grep $pkg | awk '{print \${'$'}2}' | xargs umount -l; done< /proc/mounts" > /data/adb/post-fs-data.d/$app.sh""") - .exec() - return Shell.su("chmod 744 /data/adb/service.d/$app.sh").exec().isSuccess - } catch (e: IOException) { - sendFailure(e.stackTraceToString(), context) - sendCloseDialog(context) - log(INSTALLER_TAG, e.stackTraceToString()) - } - return false - } - - private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean { - log(INSTALLER_TAG, "Linking app") - Shell.su("am force-stop $pkg").exec() - Shell.su("""for i in ${'$'}(ls /data/app/ | grep $pkg | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """) - .exec() - val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec() - Thread.sleep(500) - Shell.su("am force-stop $pkg").exec() - return response.isSuccess - } - - private fun setupFolder(apkInstallPath: String): Boolean { - return Shell.su("mkdir -p $apkInstallPath").exec().isSuccess - } - - //check version and perform action based on result - private fun checkVersion( - versionCode: Int, - baseApkFiles: List, - pkg: String, - context: Context - ): Boolean { - log(INSTALLER_TAG, "Checking stock version") - val path = getPackageDir(context, pkg) - if (path != null) { - if (path.contains("/data/app/")) { - when (getVersionNumber(pkg, context)?.let { compareVersion(it, versionCode) }) { - 1 -> return fixHigherVer(baseApkFiles, pkg, context) - -1 -> return installStock(baseApkFiles, pkg, context) - } - return true - } - return installStock(baseApkFiles, pkg, context) - } - return installStock(baseApkFiles, pkg, context) - } - - private fun getPkgInfo(pkg: String, context: Context): PackageInfo? { - return try { - context.packageManager.getPackageInfo(pkg, 0) - } catch (e: Exception) { - log(INSTALLER_TAG, "Unable to get package info") - null - } - } - - private fun compareVersion(pkgVerCode: Int, versionCode: Int): Int { - return when { - pkgVerCode > versionCode -> 1 - pkgVerCode < versionCode -> -1 - else -> 0 - } - } - - //uninstall current update and install base that works with patch - private fun fixHigherVer(apkFiles: List, pkg: String, context: Context): Boolean { - log(INSTALLER_TAG, "Downgrading stock") - if (uninstallRootApk(pkg)) { - return if (pkg == vancedRootPkg) installSplitApkFilesRoot( - apkFiles, - context - ) else installRootMusic(apkFiles, context) - } - sendFailure(listOf("Failed_Uninstall").toMutableList(), context) - sendCloseDialog(context) - return false - } - - //install stock youtube matching vanced version - private fun installStock(baseApkFiles: List, pkg: String, context: Context): Boolean { - log(INSTALLER_TAG, "Installing stock") - return if (pkg == vancedRootPkg) installSplitApkFilesRoot( - baseApkFiles, - context - ) else installRootMusic(baseApkFiles, context) - } - - //set chcon to apk_data_file - private fun chConV(apkFPath: String, context: Context): Boolean { - log(INSTALLER_TAG, "Running chcon") - val response = Shell.su("chcon u:object_r:apk_data_file:s0 $apkFPath").exec() - //val response = Shell.su("chcon -R u:object_r:system_file:s0 $path").exec() - return if (response.isSuccess) { - true - } else { - sendFailure(response.out, context) - sendCloseDialog(context) - false - } - } - - //move patch to data/app - private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context): Boolean { - log(INSTALLER_TAG, "Moving app") - val apkinF = SuFile.open(apkFile) - val apkoutF = SuFile.open(path) - - if (apkinF.exists()) { - try { - Shell.su("am force-stop $pkg").exec() - - //Shell.su("rm -r SuFile.open(path).parent") - - copy(apkinF, apkoutF) - Shell.su("chmod 644 $path").exec().isSuccess - return if (Shell.su("chown system:system $path").exec().isSuccess) { - true - } else { - sendFailure(listOf("Chown_Fail").toMutableList(), context) - sendCloseDialog(context) - false - } - - } catch (e: IOException) { - sendFailure(listOf("${e.message}").toMutableList(), context) - sendCloseDialog(context) - log(INSTALLER_TAG, e.stackTraceToString()) - return false - } - } - sendFailure(listOf("IFile_Missing").toMutableList(), context) - sendCloseDialog(context) - return false - } - - - @Throws(IOException::class) - fun copy(src: File, dst: File) { - val cmd = Shell.su("mv ${src.absolutePath} ${dst.absolutePath}").exec().isSuccess - log("ZLog", cmd.toString()) - } - - @Suppress("DEPRECATION") - private fun getVersionNumber(pkg: String, context: Context): Int? { - try { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and( - 0xFFFFFFFF - ).toInt() - else - context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode - } catch (e: Exception) { - val execRes = Shell.su("dumpsys package $pkg | grep versionCode").exec() - if (execRes.isSuccess) { - val result = execRes.out - var version = 0 - result - .asSequence() - .map { it.substringAfter("=") } - .map { it.substringBefore(" ") } - .filter { version < Integer.valueOf(it) } - .forEach { version = Integer.valueOf(it) } - return version - } - } - return null - } - - //get path of the installed youtube - fun getPackageDir(context: Context, pkg: String): String? { - val p = getPkgInfo(pkg, context) - return if (p != null) { - p.applicationInfo.sourceDir - } else { - val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec() - if (execRes.isSuccess) { - val result = execRes.out - for (line in result) { - if (line.contains("data/app")) "${line.substringAfter("=")}/base.apk" - } - } - null - } - } - - private fun setInstallerPackage(context: Context, target: String, installer: String) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return - try { - log(INSTALLER_TAG, "Setting installer package to $installer for $target") - val installerUid = context.packageManager.getPackageUid(installer, 0) - val res = - Shell.su("""su $installerUid -c 'pm set-installer $target $installer'""").exec() - if (res.out.any { line -> line.contains("Success") }) { - log(INSTALLER_TAG, "Installer package successfully set") - return - } - log(INSTALLER_TAG, "Failed setting installer package") - } catch (e: PackageManager.NameNotFoundException) { - log(INSTALLER_TAG, "Installer package $installer not found. Skipping setting installer") - } - } -} diff --git a/app/src/main/java/com/vanced/manager/utils/Preferences.kt b/app/src/main/java/com/vanced/manager/utils/Preferences.kt deleted file mode 100644 index 3a688fb42a..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/Preferences.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.vanced.manager.utils - -import android.content.Context -import android.content.SharedPreferences -import androidx.core.content.edit -import androidx.preference.PreferenceManager.getDefaultSharedPreferences - -val Context.defPrefs: SharedPreferences get() = getDefaultSharedPreferences(this) - -var SharedPreferences.managerTheme - get() = getString("manager_theme", "System Default") - set(value) = edit { putString("manager_theme", value) } - -var SharedPreferences.managerAccent - get() = getInt("manager_accent_color", defAccentColor) - set(value) = edit { putInt("manager_accent_color", value) } - -var SharedPreferences.managerVariant - get() = getString("vanced_variant", "nonroot") - set(value) = edit { putString("vanced_variant", value) } - -var SharedPreferences.managerLang - get() = getString("manager_lang", "System Default") - set(value) = edit { putString("manager_lang", value) } - -var SharedPreferences.installUrl - get() = getString("install_url", baseUrl) - set(value) = edit { putString("install_url", value) } - -var SharedPreferences.vancedVersion - get() = getString("vanced_version", "latest") - set(value) = edit { putString("vanced_version", value) } - -var SharedPreferences.musicVersion - get() = getString("music_version", "latest") - set(value) = edit { putString("music_version", value) } - -var SharedPreferences.serviceDSleepTimer - get() = getInt("serviced_sleep_timer", 1) - set(value) = edit { putInt("serviced_sleep_timer", value) } - -var SharedPreferences.enableVanced - get() = getBoolean("enable_vanced", true) - set(value) = edit { putBoolean("enable_vanced", value) } - -var SharedPreferences.enableMusic - get() = getBoolean("enable_music", true) - set(value) = edit { putBoolean("enable_music", value) } - diff --git a/app/src/main/java/com/vanced/manager/utils/ProgressHelper.kt b/app/src/main/java/com/vanced/manager/utils/ProgressHelper.kt deleted file mode 100644 index 341baf986f..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/ProgressHelper.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.vanced.manager.utils - -import androidx.lifecycle.MutableLiveData -import okhttp3.ResponseBody -import retrofit2.Call - -val downloadProgress = MutableLiveData(0) -val downloadingFile = MutableLiveData("") -val installing = MutableLiveData(false) - -var currentDownload: Call? = null - -fun reset() { - downloadProgress.value = 0 - downloadingFile.value = "" -} - -fun postReset() { - downloadProgress.postValue(0) - downloadingFile.postValue("") -} - diff --git a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt b/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt deleted file mode 100644 index 3713f6f9b6..0000000000 --- a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.vanced.manager.utils - -import android.app.Activity -import android.content.res.Configuration -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import com.vanced.manager.R - -const val defAccentColor: Int = -13732865 -const val LIGHT = "Light" -const val DARK = "Dark" -const val SYSTEM_DEFAULT = "System Default" - -val mutableAccentColor = MutableLiveData(defAccentColor) -val accentColor: LiveData = mutableAccentColor - -var currentTheme = "" - -fun Activity.setFinalTheme() { - when (defPrefs.managerTheme) { - LIGHT -> setTheme(R.style.LightTheme, LIGHT) - DARK -> setTheme(R.style.DarkTheme, DARK) - SYSTEM_DEFAULT -> { - when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { - Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme, DARK) - Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme, LIGHT) - } - } - else -> setTheme(R.style.LightTheme, LIGHT) - } -} - -fun Activity.setTheme(resId: Int, themeValue: String) { - setTheme(resId) - currentTheme = themeValue -} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_splash.png b/app/src/main/res/drawable-hdpi/ic_splash.png deleted file mode 100644 index b316b5cca4..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_splash.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_splash_logo.png b/app/src/main/res/drawable-hdpi/ic_splash_logo.png new file mode 100644 index 0000000000..bad8cb8167 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable-ldpi/ic_splash_logo.png b/app/src/main/res/drawable-ldpi/ic_splash_logo.png new file mode 100644 index 0000000000..30ba36ea71 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_splash.png b/app/src/main/res/drawable-mdpi/ic_splash.png deleted file mode 100644 index bf18b1efc1..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_splash.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_splash_logo.png b/app/src/main/res/drawable-mdpi/ic_splash_logo.png new file mode 100644 index 0000000000..36c3cf3ee6 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_splash.png b/app/src/main/res/drawable-xhdpi/ic_splash.png deleted file mode 100644 index 25f4b20c29..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_splash.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_splash_logo.png b/app/src/main/res/drawable-xhdpi/ic_splash_logo.png new file mode 100644 index 0000000000..54b52d0f5b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash.png b/app/src/main/res/drawable-xxhdpi/ic_splash.png deleted file mode 100644 index e69473a5f9..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_splash.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash_logo.png b/app/src/main/res/drawable-xxhdpi/ic_splash_logo.png new file mode 100644 index 0000000000..bf1b5df506 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_splash_logo.png b/app/src/main/res/drawable-xxxhdpi/ic_splash_logo.png new file mode 100644 index 0000000000..8473615db4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_splash_logo.png differ diff --git a/app/src/main/res/drawable/category_background.xml b/app/src/main/res/drawable/category_background.xml deleted file mode 100644 index aec7c85466..0000000000 --- a/app/src/main/res/drawable/category_background.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_adguard.xml b/app/src/main/res/drawable/ic_adguard.xml index ab9063622d..82500b4027 100644 --- a/app/src/main/res/drawable/ic_adguard.xml +++ b/app/src/main/res/drawable/ic_adguard.xml @@ -1,16 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - + android:fillColor="#FF000000" + android:pathData="M12,0C8.249,0 3.725,0.861 0,2.755 0,6.845 -0.051,17.037 12,24 24.051,17.037 24,6.845 24,2.755 20.275,0.861 15.751,0 12,0zM11.894,15.429L6.857,9.612c0.331,-0.239 1.75,-1.143 2.794,0.042l2.187,2.588c0.009,-0.001 5.801,-5.948 5.815,-5.938 0.246,-0.22 0.694,-0.503 1.204,-0.101l-6.963,9.226z"/> diff --git a/app/src/main/res/drawable/ic_android_black_24dp.xml b/app/src/main/res/drawable/ic_android_black_24dp.xml new file mode 100644 index 0000000000..0df8cff0dd --- /dev/null +++ b/app/src/main/res/drawable/ic_android_black_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_image_placeholder.xml b/app/src/main/res/drawable/ic_app_icon_placeholder.xml similarity index 50% rename from app/src/main/res/drawable/app_image_placeholder.xml rename to app/src/main/res/drawable/ic_app_icon_placeholder.xml index fb39a14ea3..15515d0036 100644 --- a/app/src/main/res/drawable/app_image_placeholder.xml +++ b/app/src/main/res/drawable/ic_app_icon_placeholder.xml @@ -3,14 +3,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - + - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_app_info.xml b/app/src/main/res/drawable/ic_app_info.xml deleted file mode 100644 index 35f7f5f611..0000000000 --- a/app/src/main/res/drawable/ic_app_info.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_app_reinstall.xml b/app/src/main/res/drawable/ic_app_reinstall.xml deleted file mode 100644 index 3c6d07f471..0000000000 --- a/app/src/main/res/drawable/ic_app_reinstall.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_app_uninstall.xml b/app/src/main/res/drawable/ic_app_uninstall.xml deleted file mode 100644 index b0b1d8d065..0000000000 --- a/app/src/main/res/drawable/ic_app_uninstall.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_app_update.xml b/app/src/main/res/drawable/ic_app_update.xml deleted file mode 100644 index f92d6eff53..0000000000 --- a/app/src/main/res/drawable/ic_app_update.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_close_24.xml b/app/src/main/res/drawable/ic_baseline_close_24.xml deleted file mode 100644 index 16d6d37dd9..0000000000 --- a/app/src/main/res/drawable/ic_baseline_close_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_launch_24.xml b/app/src/main/res/drawable/ic_baseline_launch_24.xml deleted file mode 100644 index 455b503a1f..0000000000 --- a/app/src/main/res/drawable/ic_baseline_launch_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_navigate_next_36.xml b/app/src/main/res/drawable/ic_baseline_navigate_next_36.xml deleted file mode 100644 index 1aa6018d40..0000000000 --- a/app/src/main/res/drawable/ic_baseline_navigate_next_36.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_navigate_next_48.xml b/app/src/main/res/drawable/ic_baseline_navigate_next_48.xml deleted file mode 100644 index 8afa9b2bc6..0000000000 --- a/app/src/main/res/drawable/ic_baseline_navigate_next_48.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_save_24.xml b/app/src/main/res/drawable/ic_baseline_save_24.xml deleted file mode 100644 index 999020dcfc..0000000000 --- a/app/src/main/res/drawable/ic_baseline_save_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_brave.xml b/app/src/main/res/drawable/ic_brave.xml index 5f2e6ad59a..32308d5525 100644 --- a/app/src/main/res/drawable/ic_brave.xml +++ b/app/src/main/res/drawable/ic_brave.xml @@ -1,14 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - + android:fillColor="#FF000000" + android:pathData="M15.68,0l2.096,2.38s1.84,-0.512 2.709,0.358c0.868,0.87 1.584,1.638 1.584,1.638l-0.562,1.381 0.715,2.047s-2.104,7.98 -2.35,8.955c-0.486,1.919 -0.818,2.66 -2.198,3.633 -1.38,0.972 -3.884,2.66 -4.293,2.916 -0.409,0.256 -0.92,0.692 -1.38,0.692 -0.46,0 -0.97,-0.436 -1.38,-0.692a185.796,185.796 0,0 1,-4.293 -2.916c-1.38,-0.973 -1.712,-1.714 -2.197,-3.633 -0.247,-0.975 -2.351,-8.955 -2.351,-8.955l0.715,-2.047 -0.562,-1.381s0.716,-0.768 1.585,-1.638c0.868,-0.87 2.708,-0.358 2.708,-0.358L8.321,0h7.36zM12.001,14.936c-0.14,0 -1.038,0.317 -1.758,0.69 -0.72,0.373 -1.242,0.637 -1.409,0.742 -0.167,0.104 -0.065,0.301 0.087,0.409 0.152,0.107 2.194,1.69 2.393,1.866 0.198,0.175 0.489,0.464 0.687,0.464 0.198,0 0.49,-0.29 0.688,-0.464 0.198,-0.175 2.24,-1.759 2.392,-1.866 0.152,-0.108 0.254,-0.305 0.087,-0.41 -0.167,-0.104 -0.689,-0.368 -1.41,-0.741 -0.72,-0.373 -1.617,-0.69 -1.757,-0.69zM12.001,3.658s-0.409,0.001 -1.022,0.206 -1.278,0.46 -1.584,0.46c-0.307,0 -2.581,-0.434 -2.581,-0.434S4.119,7.152 4.119,7.849c0,0.697 0.339,0.881 0.68,1.243l2.02,2.149c0.192,0.203 0.59,0.511 0.356,1.066 -0.235,0.555 -0.58,1.26 -0.196,1.977 0.384,0.716 1.042,1.194 1.464,1.115 0.421,-0.08 1.412,-0.598 1.776,-0.834 0.364,-0.237 1.518,-1.19 1.518,-1.554 0,-0.365 -1.193,-1.02 -1.413,-1.168 -0.22,-0.15 -1.226,-0.725 -1.247,-0.95 -0.02,-0.227 -0.012,-0.293 0.284,-0.851 0.297,-0.559 0.831,-1.304 0.742,-1.8 -0.089,-0.495 -0.95,-0.753 -1.565,-0.986 -0.615,-0.232 -1.799,-0.671 -1.947,-0.74 -0.148,-0.068 -0.11,-0.133 0.339,-0.175 0.448,-0.043 1.719,-0.212 2.292,-0.052 0.573,0.16 1.552,0.403 1.632,0.532 0.079,0.13 0.149,0.134 0.067,0.579 -0.081,0.445 -0.5,2.581 -0.541,2.96 -0.04,0.38 -0.12,0.63 0.288,0.724 0.409,0.094 1.097,0.256 1.333,0.256s0.924,-0.162 1.333,-0.256c0.408,-0.093 0.329,-0.344 0.288,-0.723 -0.04,-0.38 -0.46,-2.516 -0.541,-2.961 -0.082,-0.445 -0.012,-0.45 0.067,-0.579 0.08,-0.129 1.059,-0.372 1.632,-0.532 0.573,-0.16 1.845,0.009 2.292,0.052 0.449,0.042 0.487,0.107 0.339,0.175 -0.148,0.069 -1.332,0.508 -1.947,0.74 -0.615,0.233 -1.476,0.49 -1.565,0.986 -0.09,0.496 0.445,1.241 0.742,1.8 0.297,0.558 0.304,0.624 0.284,0.85 -0.02,0.226 -1.026,0.802 -1.247,0.95 -0.22,0.15 -1.413,0.804 -1.413,1.169 0,0.364 1.154,1.317 1.518,1.554 0.364,0.236 1.355,0.755 1.776,0.834 0.422,0.079 1.08,-0.4 1.464,-1.115 0.384,-0.716 0.039,-1.422 -0.195,-1.977 -0.235,-0.555 0.163,-0.863 0.355,-1.066l2.02,-2.149c0.341,-0.362 0.68,-0.546 0.68,-1.243 0,-0.697 -2.695,-3.96 -2.695,-3.96s-2.274,0.436 -2.58,0.436c-0.307,0 -0.972,-0.256 -1.585,-0.461 -0.613,-0.205 -1.022,-0.206 -1.022,-0.206z"/> diff --git a/app/src/main/res/drawable/ic_discord.xml b/app/src/main/res/drawable/ic_discord.xml index 38cec852fe..30f69d3645 100644 --- a/app/src/main/res/drawable/ic_discord.xml +++ b/app/src/main/res/drawable/ic_discord.xml @@ -1,18 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - - - + android:pathData="M20.317,4.3698a19.7913,19.7913 0,0 0,-4.8851 -1.5152,0.0741 0.0741,0 0,0 -0.0785,0.0371c-0.211,0.3753 -0.4447,0.8648 -0.6083,1.2495 -1.8447,-0.2762 -3.68,-0.2762 -5.4868,0 -0.1636,-0.3933 -0.4058,-0.8742 -0.6177,-1.2495a0.077,0.077 0,0 0,-0.0785 -0.037,19.7363 19.7363,0 0,0 -4.8852,1.515 0.0699,0.0699 0,0 0,-0.0321 0.0277C0.5334,9.0458 -0.319,13.5799 0.0992,18.0578a0.0824,0.0824 0,0 0,0.0312 0.0561c2.0528,1.5076 4.0413,2.4228 5.9929,3.0294a0.0777,0.0777 0,0 0,0.0842 -0.0276c0.4616,-0.6304 0.8731,-1.2952 1.226,-1.9942a0.076,0.076 0,0 0,-0.0416 -0.1057c-0.6528,-0.2476 -1.2743,-0.5495 -1.8722,-0.8923a0.077,0.077 0,0 1,-0.0076 -0.1277c0.1258,-0.0943 0.2517,-0.1923 0.3718,-0.2914a0.0743,0.0743 0,0 1,0.0776 -0.0105c3.9278,1.7933 8.18,1.7933 12.0614,0a0.0739,0.0739 0,0 1,0.0785 0.0095c0.1202,0.099 0.246,0.1981 0.3728,0.2924a0.077,0.077 0,0 1,-0.0066 0.1276,12.2986 12.2986,0 0,1 -1.873,0.8914 0.0766,0.0766 0,0 0,-0.0407 0.1067c0.3604,0.698 0.7719,1.3628 1.225,1.9932a0.076,0.076 0,0 0,0.0842 0.0286c1.961,-0.6067 3.9495,-1.5219 6.0023,-3.0294a0.077,0.077 0,0 0,0.0313 -0.0552c0.5004,-5.177 -0.8382,-9.6739 -3.5485,-13.6604a0.061,0.061 0,0 0,-0.0312 -0.0286zM8.02,15.3312c-1.1825,0 -2.1569,-1.0857 -2.1569,-2.419 0,-1.3332 0.9555,-2.4189 2.157,-2.4189 1.2108,0 2.1757,1.0952 2.1568,2.419 0,1.3332 -0.9555,2.4189 -2.1569,2.4189zM15.9948,15.3312c-1.1825,0 -2.1569,-1.0857 -2.1569,-2.419 0,-1.3332 0.9554,-2.4189 2.1569,-2.4189 1.2108,0 2.1757,1.0952 2.1568,2.419 0,1.3332 -0.946,2.4189 -2.1568,2.4189Z"/> diff --git a/app/src/main/res/drawable/ic_github.xml b/app/src/main/res/drawable/ic_github.xml index b9dc44f345..1305199291 100644 --- a/app/src/main/res/drawable/ic_github.xml +++ b/app/src/main/res/drawable/ic_github.xml @@ -1,6 +1,9 @@ - - + + diff --git a/app/src/main/res/drawable/ic_instagram.xml b/app/src/main/res/drawable/ic_instagram.xml index 92de5310c8..ffbca436ec 100644 --- a/app/src/main/res/drawable/ic_instagram.xml +++ b/app/src/main/res/drawable/ic_instagram.xml @@ -1,15 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - - + android:fillColor="#FF000000" + android:pathData="M12,0C8.74,0 8.333,0.015 7.053,0.072 5.775,0.132 4.905,0.333 4.14,0.63c-0.789,0.306 -1.459,0.717 -2.126,1.384S0.935,3.35 0.63,4.14C0.333,4.905 0.131,5.775 0.072,7.053 0.012,8.333 0,8.74 0,12s0.015,3.667 0.072,4.947c0.06,1.277 0.261,2.148 0.558,2.913 0.306,0.788 0.717,1.459 1.384,2.126 0.667,0.666 1.336,1.079 2.126,1.384 0.766,0.296 1.636,0.499 2.913,0.558C8.333,23.988 8.74,24 12,24s3.667,-0.015 4.947,-0.072c1.277,-0.06 2.148,-0.262 2.913,-0.558 0.788,-0.306 1.459,-0.718 2.126,-1.384 0.666,-0.667 1.079,-1.335 1.384,-2.126 0.296,-0.765 0.499,-1.636 0.558,-2.913 0.06,-1.28 0.072,-1.687 0.072,-4.947s-0.015,-3.667 -0.072,-4.947c-0.06,-1.277 -0.262,-2.149 -0.558,-2.913 -0.306,-0.789 -0.718,-1.459 -1.384,-2.126C21.319,1.347 20.651,0.935 19.86,0.63c-0.765,-0.297 -1.636,-0.499 -2.913,-0.558C15.667,0.012 15.26,0 12,0zM12,2.16c3.203,0 3.585,0.016 4.85,0.071 1.17,0.055 1.805,0.249 2.227,0.415 0.562,0.217 0.96,0.477 1.382,0.896 0.419,0.42 0.679,0.819 0.896,1.381 0.164,0.422 0.36,1.057 0.413,2.227 0.057,1.266 0.07,1.646 0.07,4.85s-0.015,3.585 -0.074,4.85c-0.061,1.17 -0.256,1.805 -0.421,2.227 -0.224,0.562 -0.479,0.96 -0.899,1.382 -0.419,0.419 -0.824,0.679 -1.38,0.896 -0.42,0.164 -1.065,0.36 -2.235,0.413 -1.274,0.057 -1.649,0.07 -4.859,0.07 -3.211,0 -3.586,-0.015 -4.859,-0.074 -1.171,-0.061 -1.816,-0.256 -2.236,-0.421 -0.569,-0.224 -0.96,-0.479 -1.379,-0.899 -0.421,-0.419 -0.69,-0.824 -0.9,-1.38 -0.165,-0.42 -0.359,-1.065 -0.42,-2.235 -0.045,-1.26 -0.061,-1.649 -0.061,-4.844 0,-3.196 0.016,-3.586 0.061,-4.861 0.061,-1.17 0.255,-1.814 0.42,-2.234 0.21,-0.57 0.479,-0.96 0.9,-1.381 0.419,-0.419 0.81,-0.689 1.379,-0.898 0.42,-0.166 1.051,-0.361 2.221,-0.421 1.275,-0.045 1.65,-0.06 4.859,-0.06l0.045,0.03zM12,5.838c-3.405,0 -6.162,2.76 -6.162,6.162 0,3.405 2.76,6.162 6.162,6.162 3.405,0 6.162,-2.76 6.162,-6.162 0,-3.405 -2.76,-6.162 -6.162,-6.162zM12,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM19.846,5.595c0,0.795 -0.646,1.44 -1.44,1.44 -0.795,0 -1.44,-0.646 -1.44,-1.44 0,-0.794 0.646,-1.439 1.44,-1.439 0.793,-0.001 1.44,0.645 1.44,1.439z"/> diff --git a/app/src/main/res/drawable/ic_keyboard_backspace_black_24dp.xml b/app/src/main/res/drawable/ic_keyboard_backspace_black_24dp.xml deleted file mode 100644 index a5d1965156..0000000000 --- a/app/src/main/res/drawable/ic_keyboard_backspace_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_manager.xml b/app/src/main/res/drawable/ic_manager.xml new file mode 100644 index 0000000000..04094e71f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_manager.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_manager_monet_icon.xml b/app/src/main/res/drawable/ic_manager_monet_icon.xml new file mode 100644 index 0000000000..d7b9b9db93 --- /dev/null +++ b/app/src/main/res/drawable/ic_manager_monet_icon.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_reddit.xml b/app/src/main/res/drawable/ic_reddit.xml old mode 100755 new mode 100644 index aeab636dc4..2d6d25f03d --- a/app/src/main/res/drawable/ic_reddit.xml +++ b/app/src/main/res/drawable/ic_reddit.xml @@ -1,21 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - - - - + android:pathData="M12,0A12,12 0,0 0,0 12a12,12 0,0 0,12 12,12 12,0 0,0 12,-12A12,12 0,0 0,12 0zM17.01,4.744c0.688,0 1.25,0.561 1.25,1.249a1.25,1.25 0,0 1,-2.498 0.056l-2.597,-0.547 -0.8,3.747c1.824,0.07 3.48,0.632 4.674,1.488 0.308,-0.309 0.73,-0.491 1.207,-0.491 0.968,0 1.754,0.786 1.754,1.754 0,0.716 -0.435,1.333 -1.01,1.614a3.111,3.111 0,0 1,0.042 0.52c0,2.694 -3.13,4.87 -7.004,4.87 -3.874,0 -7.004,-2.176 -7.004,-4.87 0,-0.183 0.015,-0.366 0.043,-0.534A1.748,1.748 0,0 1,4.028 12c0,-0.968 0.786,-1.754 1.754,-1.754 0.463,0 0.898,0.196 1.207,0.49 1.207,-0.883 2.878,-1.43 4.744,-1.487l0.885,-4.182a0.342,0.342 0,0 1,0.14 -0.197,0.35 0.35,0 0,1 0.238,-0.042l2.906,0.617a1.214,1.214 0,0 1,1.108 -0.701zM9.25,12C8.561,12 8,12.562 8,13.25c0,0.687 0.561,1.248 1.25,1.248 0.687,0 1.248,-0.561 1.248,-1.249 0,-0.688 -0.561,-1.249 -1.249,-1.249zM14.75,12c-0.687,0 -1.248,0.561 -1.248,1.25 0,0.687 0.561,1.248 1.249,1.248 0.688,0 1.249,-0.561 1.249,-1.249 0,-0.687 -0.562,-1.249 -1.25,-1.249zM9.284,15.99a0.327,0.327 0,0 0,-0.231 0.094,0.33 0.33,0 0,0 0,0.463c0.842,0.842 2.484,0.913 2.961,0.913 0.477,0 2.105,-0.056 2.961,-0.913a0.361,0.361 0,0 0,0.029 -0.463,0.33 0.33,0 0,0 -0.464,0c-0.547,0.533 -1.684,0.73 -2.512,0.73 -0.828,0 -1.979,-0.196 -2.512,-0.73a0.326,0.326 0,0 0,-0.232 -0.095z"/> diff --git a/app/src/main/res/drawable/ic_round_assignment_24.xml b/app/src/main/res/drawable/ic_round_assignment_24.xml new file mode 100644 index 0000000000..54fb9d7604 --- /dev/null +++ b/app/src/main/res/drawable/ic_round_assignment_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_round_close_24.xml b/app/src/main/res/drawable/ic_round_close_24.xml new file mode 100644 index 0000000000..a864ec280e --- /dev/null +++ b/app/src/main/res/drawable/ic_round_close_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_app_download.xml b/app/src/main/res/drawable/ic_round_done_24.xml similarity index 54% rename from app/src/main/res/drawable/ic_app_download.xml rename to app/src/main/res/drawable/ic_round_done_24.xml index 1f61509e84..8f3250db52 100644 --- a/app/src/main/res/drawable/ic_app_download.xml +++ b/app/src/main/res/drawable/ic_round_done_24.xml @@ -6,5 +6,5 @@ android:tint="?attr/colorControlNormal"> + android:pathData="M18,6.7l-8.48,8.48l-3.54,-3.54c-0.39,-0.39 -1.02,-0.39 -1.41,0l0,0c-0.39,0.39 -0.39,1.02 0,1.41l4.24,4.24c0.39,0.39 1.02,0.39 1.41,0l9.18,-9.18c0.39,-0.39 0.39,-1.03 -0.01,-1.42l0,0C19.02,6.31 18.39,6.31 18,6.7z"/> diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml deleted file mode 100644 index 661d05f8da..0000000000 --- a/app/src/main/res/drawable/ic_settings_black_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_shortcut_info.xml b/app/src/main/res/drawable/ic_shortcut_info.xml deleted file mode 100644 index 17d70fcf6e..0000000000 --- a/app/src/main/res/drawable/ic_shortcut_info.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_shortcut_settings.xml b/app/src/main/res/drawable/ic_shortcut_settings.xml deleted file mode 100644 index 48beb04173..0000000000 --- a/app/src/main/res/drawable/ic_shortcut_settings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_splash.xml b/app/src/main/res/drawable/ic_splash.xml new file mode 100644 index 0000000000..18456786db --- /dev/null +++ b/app/src/main/res/drawable/ic_splash.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_telegram.xml b/app/src/main/res/drawable/ic_telegram.xml index 44f6f4868e..8149719e25 100644 --- a/app/src/main/res/drawable/ic_telegram.xml +++ b/app/src/main/res/drawable/ic_telegram.xml @@ -1,11 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="#FF000000" + android:pathData="M11.944,0A12,12 0,0 0,0 12a12,12 0,0 0,12 12,12 12,0 0,0 12,-12A12,12 0,0 0,12 0a12,12 0,0 0,-0.056 0zM16.906,7.224c0.1,-0.002 0.321,0.023 0.465,0.14a0.506,0.506 0,0 1,0.171 0.325c0.016,0.093 0.036,0.306 0.02,0.472 -0.18,1.898 -0.962,6.502 -1.36,8.627 -0.168,0.9 -0.499,1.201 -0.82,1.23 -0.696,0.065 -1.225,-0.46 -1.9,-0.902 -1.056,-0.693 -1.653,-1.124 -2.678,-1.8 -1.185,-0.78 -0.417,-1.21 0.258,-1.91 0.177,-0.184 3.247,-2.977 3.307,-3.23 0.007,-0.032 0.014,-0.15 -0.056,-0.212s-0.174,-0.041 -0.249,-0.024c-0.106,0.024 -1.793,1.14 -5.061,3.345 -0.48,0.33 -0.913,0.49 -1.302,0.48 -0.428,-0.008 -1.252,-0.241 -1.865,-0.44 -0.752,-0.245 -1.349,-0.374 -1.297,-0.789 0.027,-0.216 0.325,-0.437 0.893,-0.663 3.498,-1.524 5.83,-2.529 6.998,-3.014 3.332,-1.386 4.025,-1.627 4.476,-1.635z"/> diff --git a/app/src/main/res/drawable/ic_twitter.xml b/app/src/main/res/drawable/ic_twitter.xml index 8f58f9167d..cd35270eef 100644 --- a/app/src/main/res/drawable/ic_twitter.xml +++ b/app/src/main/res/drawable/ic_twitter.xml @@ -1,11 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="#FF000000" + android:pathData="M23.953,4.57a10,10 0,0 1,-2.825 0.775,4.958 4.958,0 0,0 2.163,-2.723c-0.951,0.555 -2.005,0.959 -3.127,1.184a4.92,4.92 0,0 0,-8.384 4.482C7.69,8.095 4.067,6.13 1.64,3.162a4.822,4.822 0,0 0,-0.666 2.475c0,1.71 0.87,3.213 2.188,4.096a4.904,4.904 0,0 1,-2.228 -0.616v0.06a4.923,4.923 0,0 0,3.946 4.827,4.996 4.996,0 0,1 -2.212,0.085 4.936,4.936 0,0 0,4.604 3.417,9.867 9.867,0 0,1 -6.102,2.105c-0.39,0 -0.779,-0.023 -1.17,-0.067a13.995,13.995 0,0 0,7.557 2.209c9.053,0 13.998,-7.496 13.998,-13.985 0,-0.21 0,-0.42 -0.015,-0.63A9.935,9.935 0,0 0,24 4.59z"/> diff --git a/app/src/main/res/drawable/ic_website.xml b/app/src/main/res/drawable/ic_website.xml index 940a0fda4a..36ce05483b 100644 --- a/app/src/main/res/drawable/ic_website.xml +++ b/app/src/main/res/drawable/ic_website.xml @@ -1,16 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - + android:fillColor="#FF000000" + android:pathData="M12,0c-6.627,0 -12,5.373 -12,12s5.373,12 12,12 12,-5.373 12,-12 -5.373,-12 -12,-12zM13,16.057v-3.057h2.994c-0.059,1.143 -0.212,2.24 -0.456,3.279 -0.823,-0.12 -1.674,-0.188 -2.538,-0.222zM14.957,18.219c-0.499,1.33 -1.159,2.497 -1.957,3.456v-3.62c0.666,0.028 1.319,0.081 1.957,0.164zM13,11v-3.015c0.868,-0.034 1.721,-0.103 2.548,-0.224 0.238,1.027 0.389,2.111 0.446,3.239h-2.994zM13,5.986v-3.661c0.806,0.969 1.471,2.15 1.971,3.496 -0.642,0.084 -1.3,0.137 -1.971,0.165zM15.703,2.719c1.237,0.496 2.354,1.228 3.29,2.146 -0.642,0.234 -1.311,0.442 -2.019,0.607 -0.344,-0.992 -0.775,-1.91 -1.271,-2.753zM8.462,16.279c-0.244,-1.039 -0.398,-2.136 -0.456,-3.279h2.994v3.057c-0.865,0.034 -1.714,0.102 -2.538,0.222zM11,18.055v3.62c-0.798,-0.959 -1.458,-2.126 -1.957,-3.456 0.638,-0.083 1.291,-0.136 1.957,-0.164zM8.006,11c0.057,-1.128 0.207,-2.212 0.446,-3.239 0.827,0.121 1.68,0.19 2.548,0.224v3.015h-2.994zM9.03,5.821c0.5,-1.346 1.165,-2.527 1.97,-3.496v3.661c-0.671,-0.028 -1.329,-0.081 -1.97,-0.165zM7.025,5.471c-0.708,-0.165 -1.377,-0.373 -2.018,-0.607 0.937,-0.918 2.053,-1.65 3.29,-2.146 -0.496,0.844 -0.927,1.762 -1.272,2.753zM6.476,7.389c-0.264,1.151 -0.434,2.36 -0.492,3.611h-3.933c0.165,-1.658 0.739,-3.197 1.617,-4.518 0.88,0.361 1.816,0.67 2.808,0.907zM6.485,16.651c-0.988,0.236 -1.92,0.542 -2.797,0.9 -0.89,-1.328 -1.471,-2.879 -1.637,-4.551h3.934c0.058,1.265 0.231,2.488 0.5,3.651zM7.038,18.568c0.342,0.976 0.768,1.881 1.257,2.712 -1.223,-0.49 -2.326,-1.211 -3.256,-2.115 0.636,-0.229 1.299,-0.435 1.999,-0.597zM16.962,18.568c0.7,0.163 1.362,0.367 1.999,0.597 -0.931,0.903 -2.034,1.625 -3.257,2.116 0.489,-0.832 0.915,-1.737 1.258,-2.713zM17.515,16.651c0.27,-1.163 0.442,-2.386 0.501,-3.651h3.934c-0.167,1.672 -0.748,3.223 -1.638,4.551 -0.877,-0.358 -1.81,-0.664 -2.797,-0.9zM18.016,11c-0.058,-1.251 -0.229,-2.46 -0.492,-3.611 0.992,-0.237 1.929,-0.546 2.809,-0.907 0.877,1.321 1.451,2.86 1.616,4.518h-3.933z"/> diff --git a/app/src/main/res/drawable/ic_youtube.xml b/app/src/main/res/drawable/ic_youtube.xml index b10d0d5061..7f8a1a6bb4 100644 --- a/app/src/main/res/drawable/ic_youtube.xml +++ b/app/src/main/res/drawable/ic_youtube.xml @@ -1,16 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> - + android:fillColor="#FF000000" + android:pathData="M23.498,6.186a3.016,3.016 0,0 0,-2.122 -2.136C19.505,3.545 12,3.545 12,3.545s-7.505,0 -9.377,0.505A3.017,3.017 0,0 0,0.502 6.186C0,8.07 0,12 0,12s0,3.93 0.502,5.814a3.016,3.016 0,0 0,2.122 2.136c1.871,0.505 9.376,0.505 9.376,0.505s7.505,0 9.377,-0.505a3.015,3.015 0,0 0,2.122 -2.136C24,15.93 24,12 24,12s0,-3.93 -0.502,-5.814zM9.545,15.568V8.432L15.818,12l-6.273,3.568z"/> diff --git a/app/src/main/res/drawable/splash_logo.xml b/app/src/main/res/drawable/splash_logo.xml deleted file mode 100644 index f68ed4cd7c..0000000000 --- a/app/src/main/res/drawable/splash_logo.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/vanced_gradient.xml b/app/src/main/res/drawable/vanced_gradient.xml deleted file mode 100644 index 49074b1798..0000000000 --- a/app/src/main/res/drawable/vanced_gradient.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/font/inter_black.ttf b/app/src/main/res/font/inter_black.ttf new file mode 100644 index 0000000000..5653757735 Binary files /dev/null and b/app/src/main/res/font/inter_black.ttf differ diff --git a/app/src/main/res/font/inter_bold.ttf b/app/src/main/res/font/inter_bold.ttf new file mode 100644 index 0000000000..e98b84ce87 Binary files /dev/null and b/app/src/main/res/font/inter_bold.ttf differ diff --git a/app/src/main/res/font/inter_extralight.ttf b/app/src/main/res/font/inter_extralight.ttf new file mode 100644 index 0000000000..69426a3eb5 Binary files /dev/null and b/app/src/main/res/font/inter_extralight.ttf differ diff --git a/app/src/main/res/font/inter_extranold.ttf b/app/src/main/res/font/inter_extranold.ttf new file mode 100644 index 0000000000..7f16a0f0f5 Binary files /dev/null and b/app/src/main/res/font/inter_extranold.ttf differ diff --git a/app/src/main/res/font/inter_light.ttf b/app/src/main/res/font/inter_light.ttf new file mode 100644 index 0000000000..a5f073690d Binary files /dev/null and b/app/src/main/res/font/inter_light.ttf differ diff --git a/app/src/main/res/font/inter_medium.ttf b/app/src/main/res/font/inter_medium.ttf new file mode 100644 index 0000000000..721147d831 Binary files /dev/null and b/app/src/main/res/font/inter_medium.ttf differ diff --git a/app/src/main/res/font/inter_regular.ttf b/app/src/main/res/font/inter_regular.ttf new file mode 100644 index 0000000000..96fd6a12d0 Binary files /dev/null and b/app/src/main/res/font/inter_regular.ttf differ diff --git a/app/src/main/res/font/inter_semibold.ttf b/app/src/main/res/font/inter_semibold.ttf new file mode 100644 index 0000000000..ddb279290b Binary files /dev/null and b/app/src/main/res/font/inter_semibold.ttf differ diff --git a/app/src/main/res/font/inter_thin.ttf b/app/src/main/res/font/inter_thin.ttf new file mode 100644 index 0000000000..76be6252b9 Binary files /dev/null and b/app/src/main/res/font/inter_thin.ttf differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4612a1b1ac..0000000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml deleted file mode 100644 index c591147d1f..0000000000 --- a/app/src/main/res/layout/activity_welcome.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_app_download.xml b/app/src/main/res/layout/dialog_app_download.xml deleted file mode 100644 index 98ae464854..0000000000 --- a/app/src/main/res/layout/dialog_app_download.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_app_info.xml b/app/src/main/res/layout/dialog_app_info.xml deleted file mode 100644 index b4ecca4afc..0000000000 --- a/app/src/main/res/layout/dialog_app_info.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_app_uninstall.xml b/app/src/main/res/layout/dialog_app_uninstall.xml deleted file mode 100644 index 4f8e515755..0000000000 --- a/app/src/main/res/layout/dialog_app_uninstall.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_bottom_radio_button.xml b/app/src/main/res/layout/dialog_bottom_radio_button.xml deleted file mode 100644 index 9e6459d921..0000000000 --- a/app/src/main/res/layout/dialog_bottom_radio_button.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_custom_url.xml b/app/src/main/res/layout/dialog_custom_url.xml deleted file mode 100644 index 1bef148a54..0000000000 --- a/app/src/main/res/layout/dialog_custom_url.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_installation_files_detected.xml b/app/src/main/res/layout/dialog_installation_files_detected.xml deleted file mode 100644 index 0c13fd5007..0000000000 --- a/app/src/main/res/layout/dialog_installation_files_detected.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_manager_accent_color.xml b/app/src/main/res/layout/dialog_manager_accent_color.xml deleted file mode 100644 index 7b78e6e9f7..0000000000 --- a/app/src/main/res/layout/dialog_manager_accent_color.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_manager_language.xml b/app/src/main/res/layout/dialog_manager_language.xml deleted file mode 100644 index 7e2b515b6f..0000000000 --- a/app/src/main/res/layout/dialog_manager_language.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manager_theme.xml b/app/src/main/res/layout/dialog_manager_theme.xml deleted file mode 100644 index 0fe43d6a9d..0000000000 --- a/app/src/main/res/layout/dialog_manager_theme.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manager_update.xml b/app/src/main/res/layout/dialog_manager_update.xml deleted file mode 100644 index e26258b1fb..0000000000 --- a/app/src/main/res/layout/dialog_manager_update.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manager_variant.xml b/app/src/main/res/layout/dialog_manager_variant.xml deleted file mode 100644 index 11eaf95c24..0000000000 --- a/app/src/main/res/layout/dialog_manager_variant.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_music_preferences.xml b/app/src/main/res/layout/dialog_music_preferences.xml deleted file mode 100644 index 153f88b709..0000000000 --- a/app/src/main/res/layout/dialog_music_preferences.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_apps.xml b/app/src/main/res/layout/dialog_select_apps.xml deleted file mode 100644 index 16d5179662..0000000000 --- a/app/src/main/res/layout/dialog_select_apps.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_serviced_timer.xml b/app/src/main/res/layout/dialog_serviced_timer.xml deleted file mode 100644 index f08de4b37e..0000000000 --- a/app/src/main/res/layout/dialog_serviced_timer.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_vanced_language_selection.xml b/app/src/main/res/layout/dialog_vanced_language_selection.xml deleted file mode 100644 index 05e6343edb..0000000000 --- a/app/src/main/res/layout/dialog_vanced_language_selection.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_vanced_preferences.xml b/app/src/main/res/layout/dialog_vanced_preferences.xml deleted file mode 100644 index 60dcabe726..0000000000 --- a/app/src/main/res/layout/dialog_vanced_preferences.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml deleted file mode 100644 index 8d68910b26..0000000000 --- a/app/src/main/res/layout/fragment_about.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dev_settings.xml b/app/src/main/res/layout/fragment_dev_settings.xml deleted file mode 100644 index a4a4e3b4d8..0000000000 --- a/app/src/main/res/layout/fragment_dev_settings.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_grant_root.xml b/app/src/main/res/layout/fragment_grant_root.xml deleted file mode 100644 index 88d201debd..0000000000 --- a/app/src/main/res/layout/fragment_grant_root.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml deleted file mode 100644 index b5b57b63ea..0000000000 --- a/app/src/main/res/layout/fragment_home.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_log.xml b/app/src/main/res/layout/fragment_log.xml deleted file mode 100644 index 70c4f02cfe..0000000000 --- a/app/src/main/res/layout/fragment_log.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_select_apps.xml b/app/src/main/res/layout/fragment_select_apps.xml deleted file mode 100644 index 624835c1c0..0000000000 --- a/app/src/main/res/layout/fragment_select_apps.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml deleted file mode 100644 index ef49caa97e..0000000000 --- a/app/src/main/res/layout/fragment_settings.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_welcome.xml b/app/src/main/res/layout/fragment_welcome.xml deleted file mode 100644 index 1ee2b2fde2..0000000000 --- a/app/src/main/res/layout/fragment_welcome.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/view_app_checkbox.xml b/app/src/main/res/layout/view_app_checkbox.xml deleted file mode 100644 index f12a94536d..0000000000 --- a/app/src/main/res/layout/view_app_checkbox.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_app_expandable.xml b/app/src/main/res/layout/view_app_expandable.xml deleted file mode 100644 index 50242d3466..0000000000 --- a/app/src/main/res/layout/view_app_expandable.xml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/view_notification_setting.xml b/app/src/main/res/layout/view_notification_setting.xml deleted file mode 100644 index 9830c9cd76..0000000000 --- a/app/src/main/res/layout/view_notification_setting.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_preference.xml b/app/src/main/res/layout/view_preference.xml deleted file mode 100644 index 6c89a7e3e6..0000000000 --- a/app/src/main/res/layout/view_preference.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_preference_category.xml b/app/src/main/res/layout/view_preference_category.xml deleted file mode 100644 index 00f4ba52ee..0000000000 --- a/app/src/main/res/layout/view_preference_category.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/view_preference_switch.xml b/app/src/main/res/layout/view_preference_switch.xml deleted file mode 100644 index 0592cd635c..0000000000 --- a/app/src/main/res/layout/view_preference_switch.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_social_link.xml b/app/src/main/res/layout/view_social_link.xml deleted file mode 100644 index 7bd2f2984a..0000000000 --- a/app/src/main/res/layout/view_social_link.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_sponsor.xml b/app/src/main/res/layout/view_sponsor.xml deleted file mode 100644 index 3f8acca6c7..0000000000 --- a/app/src/main/res/layout/view_sponsor.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/dev_settings_menu.xml b/app/src/main/res/menu/dev_settings_menu.xml deleted file mode 100644 index 46fbeb5910..0000000000 --- a/app/src/main/res/menu/dev_settings_menu.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/toolbar_menu.xml b/app/src/main/res/menu/toolbar_menu.xml deleted file mode 100644 index 2ac9edf1ce..0000000000 --- a/app/src/main/res/menu/toolbar_menu.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 7353dbd1fd..48bb75f3d0 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 7353dbd1fd..48bb75f3d0 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml deleted file mode 100644 index 1a3ee43e8e..0000000000 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index 7aa9303bfc..caecfc4740 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -1,120 +1,120 @@ - What is your favourite song - Maak toe - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Herstel - Stoor - Select Your Apps + What is your favourite song + Maak toe + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Herstel + Stoor + Select Your Apps - Oor - Guide - Manager - Logs - Settings - Update Manager + Oor + Guide + Manager + Logs + Settings + Update Manager - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Select at least one app! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + Install Latest: - Install Vanced microG first + Install Vanced microG first Root access not granted - Social Media - Support us - Unavailable + Social Media + Support us + Unavailable Installed: - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Variant + Accent Color + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + Theme + Dark Theme + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - Error - Guide - Stop! + Error + Guide + Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Welcome + Welcome - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Sources - Vanced Team + Manager Devs + Other Contributors + Sources + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index b7ebc2ab20..847b879a7f 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -1,120 +1,120 @@ - إلغاء - إغلاق - نسخة خاصة من خدمات جوجل للجوال معدة خصيصا لتطبيق ڤانسد بناءً على مشروع microG. - تطبيق يوتيوب معدل مع العديد من الميزات المفيدة! - ڤانسد لموسيقى يوتيوب! يلبي احتياجاتك حتى وان كان يضم ميزات اقل من ڤانسد. - إعادة تعيين - حفظ - اختر تطبيقاتك + إلغاء + إغلاق + نسخة خاصة من خدمات جوجل للجوال معدة خصيصا لتطبيق ڤانسد بناءً على مشروع microG. + تطبيق يوتيوب معدل مع العديد من الميزات المفيدة! + ڤانسد لموسيقى يوتيوب! يلبي احتياجاتك حتى وان كان يضم ميزات اقل من ڤانسد. + إعادة تعيين + حفظ + اختر تطبيقاتك - حول - دليل الاستخدام - المدير - السجلات - الإعدادات - تحديث المدير + حول + دليل الاستخدام + المدير + السجلات + الإعدادات + تحديث المدير - هل جهازك مروت؟ - امنح صلاحيات الروت - فلنبدأ - اختر تطبيقاً واحداً على الأقل! - لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل! + هل جهازك مروت؟ + امنح صلاحيات الروت + فلنبدأ + اختر تطبيقاً واحداً على الأقل! + لا تعرف ما هذا أو لا تود استخدام نسخة الروت؟ اضغط على السهم الأزرق في الأسفل! - حول %1$s - تنزيل - المعلومات - تشغيل - أعد التثبيت - إلغاء التثبيت - تحديث - التطبيقات - سجل التغييرات - جارٍ تنزيل %1$s - تثبيت + حول %1$s + تنزيل + المعلومات + تشغيل + أعد التثبيت + إلغاء التثبيت + تحديث + التطبيقات + سجل التغييرات + جارٍ تنزيل %1$s + تثبيت الأحدث: - قم بتثبيت Vanced microG أولاً + قم بتثبيت Vanced microG أولاً لم يتم منح صلاحيات الروت - وسائل التواصل الإجتماعي - ادعمنا - غير متاح + وسائل التواصل الإجتماعي + ادعمنا + غير متاح مثبت: - الألوان - المظهر - السلوك - مسح الملفات التي تم تنزيلها - تم مسح الملفات بنجاح - هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال - تحليلات Firebase - اللغة - سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم - استخدم علامات تبويب مخصصة لمتصفح كروم - إشعارات %1$s - تلقي الإشعارات عند إصدار تحديث لـ %1$s - فشل في حفظ القيمة الزمنية الجديدة - Script sleep time للروت - ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب - الوضع الافتراضي - السمة - السمة الداكنة - السمة الفاتحة - مركز التحديث - لا توجد تحديثات جديدة - النوع + الألوان + المظهر + السلوك + مسح الملفات التي تم تنزيلها + تم مسح الملفات بنجاح + هذا يتيح لنا جمع المعلومات عن أداء التطبيق وسجلات الأعطال + تحليلات Firebase + اللغة + سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم + استخدم علامات تبويب مخصصة لمتصفح كروم + إشعارات %1$s + تلقي الإشعارات عند إصدار تحديث لـ %1$s + فشل في حفظ القيمة الزمنية الجديدة + Script sleep time للروت + ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب + الوضع الافتراضي + السمة + السمة الداكنة + السمة الفاتحة + مركز التحديث + لا توجد تحديثات جديدة + النوع - تعذر حفظ السجل - تم حفظ السجل بنجاح + تعذر حفظ السجل + تم حفظ السجل بنجاح التفاصيل - تم اكتشاف ملفات تثبيت %1$s! - اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟ + تم اكتشاف ملفات تثبيت %1$s! + اكتشف المدير أن جميع الملفات اللازمة لتثبيت %1$s موجودة. هل تريد التثبيت؟ تفضيلات تثبيت %1$s - جارٍ التحقق من وجود تحديثات… + جارٍ التحقق من وجود تحديثات… اللغة/اللغات: %1$s السمة: %1$s الإصدار: %1$s - خطأ - الدليل - إيقاف! + خطأ + الدليل + إيقاف! يبدو أنك تستخدم إصدار ماجيسك/TWRP من ڤانسد، الذي قد تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً من قائمة إضافات ماجيسك أو بإستخدام أداة إلغاء تثبيت ڤانسد من TWRP. - من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا) - تحسينات MIUI مفعلة! - الرجاء عدم الخروج من التطبيق أثناء هذه العملية! - إعادة التنزيل - تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub + من أجل تثبيت ڤانسد، عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذه الرسالة إذا كنت تستخدم نسخة رقم 20.2.20 أو أجدد تستند إلى نسخة نظام شاومي أوروبا) + تحسينات MIUI مفعلة! + الرجاء عدم الخروج من التطبيق أثناء هذه العملية! + إعادة التنزيل + تأكد من أنك قمت بتنزيل التطبيق من موقع vancedapp.com، أو خادم الديسكورد لڤانسد أو Vanced GitHub الإصدار - مرحباً بك + مرحباً بك - اختر لغتك(لغاتك) المفضلة لڤانسد - الأحدث + اختر لغتك(لغاتك) المفضلة لڤانسد + الأحدث فاتح + %1$s اختر لغة واحدة على الأقل! - أسود - داكن + أسود + داكن - مطوري المدير - مساهمين آخرين - المصادر - فريق ڤانسد + مطوري المدير + مساهمين آخرين + المصادر + فريق ڤانسد - فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى. - خطأ في تنزيل %1$s + فشل تغيير ملكية حزمة التثبيت الى مالك النظام، الرجاء المحاولة مرة أخرى. + خطأ في تنزيل %1$s فشل تطبيق لون النسق الجديد - فشل في الغاء تثبيت حزمة %1$s - فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى. - فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى. - فشل التثبيت لأن المستخدم ألغى التثبيت. - فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى. - فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى. - فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم. يرجى أيضاً إرفاق لقطة الشاشة من القائمة المتقدمة - فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى. - فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى. - فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى. - فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى. - فشل التثبيت، مساحة جهازك الخالية لا تكفي. - فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى. - فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة. + فشل في الغاء تثبيت حزمة %1$s + فشل العثور على الملفات المطلوبة للتثبيت. أعد تحميل ملفات التثبيت، ثم حاول مرة أخرى. + فشل العثور على حزمة تثبيت السمة السوداء/المظلمة من وحدة التخزين، الرجاء المحاولة مرة أخرى. + فشل التثبيت لأن المستخدم ألغى التثبيت. + فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى. + فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى. + فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم. يرجى أيضاً إرفاق لقطة الشاشة من القائمة المتقدمة + فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى. + فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى. + فشل التثبيت لأن تحسينات MIUI مفعلة. قم بتعطيل تحسينات MIUI ، ثم حاول مرة أخرى. + فشل التثبيت لأن التحقق من توقيع حزم التثبيت مفعل. الرجاء تعطيل التحقق من توقيع حزم التثبيت, ثم المحاولة مرة أخرى. + فشل التثبيت، مساحة جهازك الخالية لا تكفي. + فشل العثور على حزمة التثبيت للسمة السوداء/المظلمة من المثبت. امسح بيانات التطبيق لمدير ڤانسد، ثم حاول مرة أخرى. + فشل تحديد مسار تثبيت اليوتيوب الأصلي بعد تثبيت الحزم المنفصلة. diff --git a/app/src/main/res/values-az-rAZ/strings.xml b/app/src/main/res/values-az-rAZ/strings.xml index 58abdd25cc..3e2cdf985f 100644 --- a/app/src/main/res/values-az-rAZ/strings.xml +++ b/app/src/main/res/values-az-rAZ/strings.xml @@ -1,120 +1,120 @@ - İmtina - Bağla - microG Layihəsi əsasında Vanced üçün təkmilləşdirilmiş özəl bir GMS tətbiqi. - Çoxlu faydalı özəllikləri ilə modifikasiya edilmiş YouTube versiyası! - Yenə Vanced, ancaq YouTube Msuic üçün! Nisbətən daha az özəlliyi olsa da, ehtiyaclarınızı qarşılayacaq. - Sıfırla - Saxla - Tətbiqlərinizi Seçin + İmtina + Bağla + microG Layihəsi əsasında Vanced üçün təkmilləşdirilmiş özəl bir GMS tətbiqi. + Çoxlu faydalı özəllikləri ilə modifikasiya edilmiş YouTube versiyası! + Yenə Vanced, ancaq YouTube Msuic üçün! Nisbətən daha az özəlliyi olsa da, ehtiyaclarınızı qarşılayacaq. + Sıfırla + Saxla + Tətbiqlərinizi Seçin - Haqqında - Bələdçi - Menecer - Qeydlər - Tənzimləmələr - Yeniləmə Meneceri + Haqqında + Bələdçi + Menecer + Qeydlər + Tənzimləmələr + Yeniləmə Meneceri - Cihazınızda root varmı? - Root İcazəsi Ver - Gəlin başlayaq - Ən azı bir tətbiq seçin! - Root versiyasının nə olduğunu bilmirsiz ya da sadəcə istifadə etmək istəmirsiz? onda aşağıdakı göy oxa toxunun! + Cihazınızda root varmı? + Root İcazəsi Ver + Gəlin başlayaq + Ən azı bir tətbiq seçin! + Root versiyasının nə olduğunu bilmirsiz ya da sadəcə istifadə etmək istəmirsiz? onda aşağıdakı göy oxa toxunun! - %1$s Haqqında - Download - Info - Launch - Reinstall - Uninstall - Update - Tətbiqlər - Dəyişikliklər - %1$s endirilir - Quraşdır + %1$s Haqqında + Download + Info + Launch + Reinstall + Uninstall + Update + Tətbiqlər + Dəyişikliklər + %1$s endirilir + Quraşdır Ən son: - Əvvəlcə Vanced microG-ni quraşdırın + Əvvəlcə Vanced microG-ni quraşdırın Root icazəsi verilməyib - Sosial Media - Bizi dəstəklə - Əlçatmazdır + Sosial Media + Bizi dəstəklə + Əlçatmazdır Qurulan: - Tema rəngi - Görünüş - Davranış - Endirilmiş faylları təmizlə - Fayllar uğurla təmizləndi - Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir - Firebase Analitikləri - Dil - Bağlantılar Chrome Özəl Vərəqlərində açılacaq - Chrome Özəl Vərəqlərini istifadə et - %1$s Ani Bildirişlər - %1$s üçün yeni buraxılış olanda ani bildirişlər alın - Yeni vaxt qiymətini saxlamaq olmadı - Root Qoşma Gözləmə Müddəti - /data/adb/service.d/app.sh kodundakı yuxu vaxtı qiymətini nizamlayın, bu qoşma xətalarını aradan qaldırmağa kömək edəcək - İlkin Sistem - Mövzu - Tünd mövzu - Açıq mövzu - Menecer Yeniləmə Mərkəzi - Yeniləmə yoxdur - Variant + Tema rəngi + Görünüş + Davranış + Endirilmiş faylları təmizlə + Fayllar uğurla təmizləndi + Bu bizə tətbiq performansı və çökmə jurnalı haqqında məlumat yığmağa imkan verir + Firebase Analitikləri + Dil + Bağlantılar Chrome Özəl Vərəqlərində açılacaq + Chrome Özəl Vərəqlərini istifadə et + %1$s Ani Bildirişlər + %1$s üçün yeni buraxılış olanda ani bildirişlər alın + Yeni vaxt qiymətini saxlamaq olmadı + Root Qoşma Gözləmə Müddəti + /data/adb/service.d/app.sh kodundakı yuxu vaxtı qiymətini nizamlayın, bu qoşma xətalarını aradan qaldırmağa kömək edəcək + İlkin Sistem + Mövzu + Tünd mövzu + Açıq mövzu + Menecer Yeniləmə Mərkəzi + Yeniləmə yoxdur + Variant - Qeydləri saxlamaq olmadı - Qeydlər uğurla saxlandı + Qeydləri saxlamaq olmadı + Qeydlər uğurla saxlandı Təfsilatlar - %1$s quraşdırma faylı aşkarlandı! - Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz? + %1$s quraşdırma faylı aşkarlandı! + Menecer %1$s quraşdırması üçün lazımi bütün faylların tapıldığını aşkarladı. Quraşdırmaq istəyirsiniz? %1$s Qurma Seçimləri - Yeniləmələr yoxlanılır… + Yeniləmələr yoxlanılır… Dil(lər): %1$s Mövzu: %1$s Versiya: %1$s - Xəta - Bələdçi - Dayandır! + Xəta + Bələdçi + Dayandır! Buraxılışı dayandırılan və bu tətbiq istifadə edərək yenilənə bilməyən Vanced-in Magisk/TWRP versiyasını istifadə edirsiniz. Zəhmət olmasa magisk modulunu/TWRP Vanced silici istifadə edərək silin. - Vanced-i quraşdırmaq üçün tərtibatçı tənzimləmələrindən MIUI Optimallaşdırmasını sıradan çıxartmaq LAZIMDIR. (20.2.20 və ya yuxarı xiaomi.eu əsaslı ROM istifadə edirsinizsə bu xəbərdarlığı nəzərə almaya bilərsiniz) - MIUI Optimizasiyaları açıqdır! - Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN! - Yenidən endir - Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun + Vanced-i quraşdırmaq üçün tərtibatçı tənzimləmələrindən MIUI Optimallaşdırmasını sıradan çıxartmaq LAZIMDIR. (20.2.20 və ya yuxarı xiaomi.eu əsaslı ROM istifadə edirsinizsə bu xəbərdarlığı nəzərə almaya bilərsiniz) + MIUI Optimizasiyaları açıqdır! + Xahiş olunur iş gedərkən tətbiqi TƏRK ETMƏYİN! + Yenidən endir + Tətbiqi vancedapp.com, Vanced Discord server və ya Vanced GitHub\'dan endirdiyinizə əmin olun Versiya - Xoş gəlmisiniz + Xoş gəlmisiniz - Vanced üçün istədiyiniz dili seçin - Ən son + Vanced üçün istədiyiniz dili seçin + Ən son İşıqlı + %1$s Ən azı bir dil seçin! - Qara - Qaranlıq + Qara + Qaranlıq - Menecer Tərtibatçıları - Digər Dəstəkçilər - Mənbələr - Vanced Birliyi + Menecer Tərtibatçıları + Digər Dəstəkçilər + Mənbələr + Vanced Birliyi - Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın. - %1$s Yüklənərkən xəta + Apk, sistem sahibinə dəyişdirilmədi, yenidən sınayın. + %1$s Yüklənərkən xəta Yeni ikinci rəngi təyin etmək alınmadı - %1$s paketini silmək olmur - Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın. - Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın. - İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu. - Tətbiq əvvəlcədən quraşdırılmış bir tətbiqlə toqquşduğu üçün quraşdırılma uğursuz oldu. Vanced-in cari versiyasını silib yenidən sınayın. - İstifadəçi paketi alt versiyaya keçirməyə çalışdığı üçün quraşdırılma uğursuz oldu. Stok YouTube tətbiqindən yeniləmələri silib yenidən sınayın. - Bilinməyən səbəblərdən qurma alınmadı, əlavə yardım üçün Telegram və ya Discordumuza qoşulun. Xahiş olunur Qabaqcıl bölməsindən ekran görüntüsü də əlavə edin - Quraşdırma faylı cihazınıza uyğun gəlmədiyi üçün quraşdırılma uğursuz oldu. Tənzimləmələrdən endirilmiş faylları təmizləyib yenidən sınayın. - Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın. - MIUI Optimallaşdırma fəal olduğu üçün quraşdırılma uğursuz oldu. MIUI Optimallaşdırmanı sıradan çıxarıb yenidən sınayın. - Apk imza təsdiqləmə fəal olduğu üçün quraşdırılma uğursuz oldu. Apk imza təsdiqləməsini sıradan çıxarıb yenidən sınayın. - Cihazda yaddaş az olduğundan qurma alınmadı. - Quraşdırıcıda qara/tünd tema üçün apk faylı tapılmadı. Menecer-in tətbiq verilənlərini təmizləyib yenidən sınayın. - Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı. + %1$s paketini silmək olmur + Quraşdırmaq üçün lazımi fayllar tapılmadı. Quraşdırma fayllarını yenidən endirib təkrar sınayın. + Anbarda qara/tünd mövzu üçün apk faylı tapılmadı, yenidən sınayın. + İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu. + Tətbiq əvvəlcədən quraşdırılmış bir tətbiqlə toqquşduğu üçün quraşdırılma uğursuz oldu. Vanced-in cari versiyasını silib yenidən sınayın. + İstifadəçi paketi alt versiyaya keçirməyə çalışdığı üçün quraşdırılma uğursuz oldu. Stok YouTube tətbiqindən yeniləmələri silib yenidən sınayın. + Bilinməyən səbəblərdən qurma alınmadı, əlavə yardım üçün Telegram və ya Discordumuza qoşulun. Xahiş olunur Qabaqcıl bölməsindən ekran görüntüsü də əlavə edin + Quraşdırma faylı cihazınıza uyğun gəlmədiyi üçün quraşdırılma uğursuz oldu. Tənzimləmələrdən endirilmiş faylları təmizləyib yenidən sınayın. + Apk faylları zədəli olduğu üçün quraşdırılma uğursuz oldu, yenidən sınayın. + MIUI Optimallaşdırma fəal olduğu üçün quraşdırılma uğursuz oldu. MIUI Optimallaşdırmanı sıradan çıxarıb yenidən sınayın. + Apk imza təsdiqləmə fəal olduğu üçün quraşdırılma uğursuz oldu. Apk imza təsdiqləməsini sıradan çıxarıb yenidən sınayın. + Cihazda yaddaş az olduğundan qurma alınmadı. + Quraşdırıcıda qara/tünd tema üçün apk faylı tapılmadı. Menecer-in tətbiq verilənlərini təmizləyib yenidən sınayın. + Ayrılmış quraşdırmadan sonra stok YouTube quraşdırma yolu tapılmadı. diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index ce80bb6bf0..845aa7506e 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -1,120 +1,120 @@ - Отказ - Затвори - Персонализирано внедряване на GMS за Vanced въз основа на проекта microG. - Модифициран клиент за YouTube с много полезни функции! - Vanced, но за YouTube Music! Относително по-малко богат на функции, но ще отговори на вашите нужди. - Изчисти - Запази - Изберете приложения + Отказ + Затвори + Персонализирано внедряване на GMS за Vanced въз основа на проекта microG. + Модифициран клиент за YouTube с много полезни функции! + Vanced, но за YouTube Music! Относително по-малко богат на функции, но ще отговори на вашите нужди. + Изчисти + Запази + Изберете приложения - Относно - Ръководство - Мениджър - Логове - Настройки - Обнови Vanced Manager + Относно + Ръководство + Мениджър + Логове + Настройки + Обнови Vanced Manager - Имате ли Root достъп на устройството си? - Разрешете Root достъп - Да започваме - Изберете поне едно приложение! - Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу! + Имате ли Root достъп на устройството си? + Разрешете Root достъп + Да започваме + Изберете поне едно приложение! + Не знаете какво е това или не искате да ползвате Root версията? Просто натиснете синята стрелка по-долу! - Относно %1$s - Изтегляне - Информация - Стартиране - Reinstall - Деинсталиране - Актуализиране - Приложения - Списък с промени - Изтегляне на %1$s - Инсталиране + Относно %1$s + Изтегляне + Информация + Стартиране + Reinstall + Деинсталиране + Актуализиране + Приложения + Списък с промени + Изтегляне на %1$s + Инсталиране Най-нова: - Инсталирайте първо Vanced microG + Инсталирайте първо Vanced microG Root достъп не е разрешен - Социални медии - Подкрепете ни - Недостъпно + Социални медии + Подкрепете ни + Недостъпно Инсталиранa: - Акцентиращ цвят - Външен вид - Поведение - Изчисти изтеглените файлове - Файловете са изчистени успешно - Позволява ни да събираме информация за поведението на приложението и доклади за сривове - Firebase анализ - Език - Връзките ще се отварят в персонализирани раздели на Chrome - Ползвай персонализирани раздели на Chrome - %1$s насочени известия - Получаване на насочени известия, когато има нова версия на %1$s - Неуспешно запазване на новата стойност за времето - Време за заспиване на Root скрипта - Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране - По подразбиране за системата - Тема - Тъмна тема - Светла тема - Център за актуализации - Няма актуализации - Вариант + Акцентиращ цвят + Външен вид + Поведение + Изчисти изтеглените файлове + Файловете са изчистени успешно + Позволява ни да събираме информация за поведението на приложението и доклади за сривове + Firebase анализ + Език + Връзките ще се отварят в персонализирани раздели на Chrome + Ползвай персонализирани раздели на Chrome + %1$s насочени известия + Получаване на насочени известия, когато има нова версия на %1$s + Неуспешно запазване на новата стойност за времето + Време за заспиване на Root скрипта + Настройване на времето на заспиване в /data/adb/service.d/app.sh скрипта, полезно при поправка на проблеми при монтиране + По подразбиране за системата + Тема + Тъмна тема + Светла тема + Център за актуализации + Няма актуализации + Вариант - Не могат да се запазят логовете - Успешно запазени логове + Не могат да се запазят логовете + Успешно запазени логове Подробности - %1$s инсталационни файлове са открити! - Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате? + %1$s инсталационни файлове са открити! + Мениджърът откри всички необходими файлове за инсталацията на %1$s. Желаете ли да го инсталирате? Предпочитания за инсталация на %1$s - Проверка за актуализации… + Проверка за актуализации… Език(ци): %1$s Тема: %1$s Версия: %1$s - Грешка - Ръководство - Стоп! + Грешка + Ръководство + Стоп! Използвате Magisk/TWRP версията на Vanced, която е прекратена и не може да се актуализира с това приложение. Премахнете я като премахнете Magisk модула или чрез TWRP Vanced uninstaller. - За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu) - MIUI оптимизациите са включени! - Моля, НЕ излизайте от приложението по време на този процес! - Изтегли отново - Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub + За да инсталирате Vanced, ТРЯБВА да изключите MIUI оптимизациите в настройките за разработчици. (Това не е валидно ако ползвате 20.2.20 или по-нов ROM, базиран на xiaomi.eu) + MIUI оптимизациите са включени! + Моля, НЕ излизайте от приложението по време на този процес! + Изтегли отново + Уверете се, че сте изтеглили приложението от vancedapp.com, Vanced Discord сървъра или от Vanced GitHub Версия - Добре дошли + Добре дошли - Изберете предпочитан(и) език(ци) за Vanced - Най-нова + Изберете предпочитан(и) език(ци) за Vanced + Най-нова Светла + %1$s Изберете поне един език! - Черна - Тъмна + Черна + Тъмна - Разработчици - Други сътрудници - Източници - Екип на Vanced + Разработчици + Други сътрудници + Източници + Екип на Vanced - Неуспешно`chown` APK към собственика на системата, моля опитайте отново. - Грешка при изтегляне на %1$s + Неуспешно`chown` APK към собственика на системата, моля опитайте отново. + Грешка при изтегляне на %1$s Неуспешно задаване на акцентиращ цвят - Неуспешно деинсталиране на %1$s - Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак. - Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново. - Инсталацията е неуспешна, защото е прекратена от потребителя. - Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново. - Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново. - Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени - Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново. - Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново. - Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново. - Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново. - Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място. - Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново. - Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране. + Неуспешно деинсталиране на %1$s + Необходимите файлове за инсталация не са открити. Изтеглете ги отново и опитайте пак. + Не може да бъде открит apk файла за черна/тъмна тема, моля опитайте отново. + Инсталацията е неуспешна, защото е прекратена от потребителя. + Инсталацията е неуспешна, поради конфликт с вече инсталирано приложение. Деинсталирайте го и опитайте отново. + Инсталацията е неуспешна, защото потребителя се опитва да инсталира по-стара версия на пакета. Деинсталирайте актуализациите на оригиналното приложение и опитайте отново. + Инсталацията не бе успешна по неизвестни причини, присъединете се към нашия Telegram или Discord за допълнителна поддръжка. Моля, прикачете и екранна снимка от меню Разширени + Инсталацията е неуспешна, защото инсталационният файл не е съвместим с устройството ви. Изчистете изтеглените файлове от настройките и опитайте отново. + Инсталацията е неуспешна, защото apk файловете за повредени, моля опитайте отново. + Инсталацията е неуспешна, поради включени MIUI оптимизации. Изключете ги и опитайте отново. + Инсталацията е неуспешна, поради включена проверка на подписите на apk файловете. Изключете я и опитайте отново. + Инсталацията не бе успешна, тъй като устройството няма достатъчно свободно място. + Не е открит apk файл за черна/тъмна тема от инсталатора. Изчистете данните на мениджъра и опитайте отново. + Не е открит пътя на инсталацията на оригиналното YouTube приложение след разделното инсталиране. diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index c09b444297..14f6fb12dc 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -1,120 +1,120 @@ - বাতিল করুন - বন্ধ করুন - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - পুনরায় স্থির করুন - সংরক্ষণ করুন - আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন + বাতিল করুন + বন্ধ করুন + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + পুনরায় স্থির করুন + সংরক্ষণ করুন + আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন - সম্বন্ধে - Guide - ম্যানেজার - Logs - সেটিংস - ম্যানেজার আপডেট করুন + সম্বন্ধে + Guide + ম্যানেজার + Logs + সেটিংস + ম্যানেজার আপডেট করুন - আপনার ডিভাইস কি রুটেড? - রুটের অনুমতি দিন - চলুন শুরু করি - অন্তত একটি অ্যাপ নির্বাচন করুন! - এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন! + আপনার ডিভাইস কি রুটেড? + রুটের অনুমতি দিন + চলুন শুরু করি + অন্তত একটি অ্যাপ নির্বাচন করুন! + এটা কী জানেন না অথবা রুট ভার্সন ব্যবহার করতে চাচ্ছেন না? শুধু নিচের নীল তীর চিহ্নটিতে ক্লিক করুন! - সম্পর্কিত তথ্য %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - পরিবর্তন তালিকা - %1$s ডাউনলোড করা হচ্ছে - ইনস্টল করুন + সম্পর্কিত তথ্য %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + পরিবর্তন তালিকা + %1$s ডাউনলোড করা হচ্ছে + ইনস্টল করুন সর্বশেষ: - Install Vanced microG first + Install Vanced microG first রুট অনুমতি দেয়া হয়নি - Social Media - Support us - অনুপলব্ধ + Social Media + Support us + অনুপলব্ধ ইনস্টল করা আছে: - অ্যাকসেন্ট রঙ - চেহারা - আচরণ - ডাউনলোড করা ফাইলগুলি সাফ করুন - সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে - এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে। - ফায়ারবেস বিশ্লেষণ - ভাষা - লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে - ক্রোম কাস্টম ট্যাবস ব্যবহার করুন - %1$s পুশ বিজ্ঞপ্তি - %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - সিস্টেম দ্বারা নির্ধারিত - থিম - গাঢ় থিম - হালকা থিম - ম্যানেজার আপডেট কেন্দ্র - কোনো নতুন আপডেট নেই - রকমফের + অ্যাকসেন্ট রঙ + চেহারা + আচরণ + ডাউনলোড করা ফাইলগুলি সাফ করুন + সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে + এটি অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য আমাদের দিবে। + ফায়ারবেস বিশ্লেষণ + ভাষা + লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে + ক্রোম কাস্টম ট্যাবস ব্যবহার করুন + %1$s পুশ বিজ্ঞপ্তি + %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + সিস্টেম দ্বারা নির্ধারিত + থিম + গাঢ় থিম + হালকা থিম + ম্যানেজার আপডেট কেন্দ্র + কোনো নতুন আপডেট নেই + রকমফের - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে! - ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান? + %1$s ইন্সটল করার জন্য ফাইল পাওয়া গেছে! + ম্যানেজার সনাক্ত করেছে যে %1$s এর ইনস্টলেসনের জন্য সকল ফাইল পাওয়া গেছে। আপনি কি এটি ইনস্টল করতে চান? %1$s Installation Preferences - আপডেট আছে কিনা দেখা হচ্ছে… + আপডেট আছে কিনা দেখা হচ্ছে… ভাষা (গুলি):%1$s থিম: %1$s ভার্সন: %1$s - ত্রুটি - সহায়িকা - থামো! + ত্রুটি + সহায়িকা + থামো! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - স্বাগতম + স্বাগতম - ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন - Latest + ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - পরিচালক বিকাশকারী - Other Contributors - সূত্রসমূহ - ভান্সড দল + পরিচালক বিকাশকারী + Other Contributors + সূত্রসমূহ + ভান্সড দল - Failed to `chown` APK to system owner, please try again. - %1$s ডাউনলোড করার সময় ত্রুটি + Failed to `chown` APK to system owner, please try again. + %1$s ডাউনলোড করার সময় ত্রুটি Failed to apply new accent color - প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ - সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন. - স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।. - অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।. - ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।. - ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ. + প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ + সফটওয়্যার টি ইনস্টল এর জন্য প্রয়োজনী ফাইল সংগ্রহতে ব্যর্থ হয়েছে। পুনরায় ডাওনলোড এবং ইনস্টল করে চেষ্টা করুন. + স্টোরেজ থেকে কালো / অন্ধকান থিমের জন্য apk ফাইল সনাক্ত করতে ব্যর্থ হয়েছে, দয়া করে আবার চেষ্টা করুন।. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।. + অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।. + ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + ইনস্টলার থেকে কালো / অন্ধকার থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। আপনার অ্যাপ্লিকেশনের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন।. + ভিন্ন ভিন্ন ইনস্টলেশন পরে স্টক ইউটিউব ইনস্টলেশন পথ সনাক্ত করতে ব্যর্থ. diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 29bc5fda82..5e1e5e38b5 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -1,120 +1,120 @@ - বাতিল করুন - বন্ধ করুন - মাইক্রোজি প্রকল্পের ভিত্তিতে ভ্যান্সডের জন্য একটি কাস্টম জিএমএস বাস্তবায়ন।. - অনেক দরকারী বৈশিষ্ট্য সহ একটি পরিবর্তিত ইউটিউব ক্লায়েন্ট! - ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য! তুলনামূলকভাবে কম বৈশিষ্ট্য সমৃদ্ধ তবে আপনার চাহিদা পূরণ করবে।. - পুনরায় স্থির করুন - সংরক্ষণ করুন - আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন + বাতিল করুন + বন্ধ করুন + মাইক্রোজি প্রকল্পের ভিত্তিতে ভ্যান্সডের জন্য একটি কাস্টম জিএমএস বাস্তবায়ন।. + অনেক দরকারী বৈশিষ্ট্য সহ একটি পরিবর্তিত ইউটিউব ক্লায়েন্ট! + ভ্যান্সড, তবে ইউটিউব মিউজিকের জন্য! তুলনামূলকভাবে কম বৈশিষ্ট্য সমৃদ্ধ তবে আপনার চাহিদা পূরণ করবে।. + পুনরায় স্থির করুন + সংরক্ষণ করুন + আপনার পছন্দসই অ্যাপগুলি নির্বাচন করুন - সম্বন্ধে - গাইড - ম্যানেজার - লগস - সেটিংস - ম্যানেজার আপডেট করুন + সম্বন্ধে + গাইড + ম্যানেজার + লগস + সেটিংস + ম্যানেজার আপডেট করুন - আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে? - রুট অনুমতি মঞ্জুর করুন - শুরু করা যাক - অন্তত একটি অ্যাপ নির্বাচন করুন! - এটি কি তা জানেন না বা রুট ভার্সনটি ব্যবহার করতে চান না? কেবল নীচের নীল তীর চিহ্নটি ক্লিক করুন! + আপনার ডিভাইসটিতে আপনার রুট অ্যাক্সেস আছে? + রুট অনুমতি মঞ্জুর করুন + শুরু করা যাক + অন্তত একটি অ্যাপ নির্বাচন করুন! + এটি কি তা জানেন না বা রুট ভার্সনটি ব্যবহার করতে চান না? কেবল নীচের নীল তীর চিহ্নটি ক্লিক করুন! - %1$s এর সম্বন্ধে - ডাউনলোড - তথ্য - লঞ্চ করুন - Reinstall - আনইনস্টল - আপডেট - অ্যাপস - পরিবর্তন নথি - %1$s ডাউনলোড করা হচ্ছে - ইনস্টল করুন + %1$s এর সম্বন্ধে + ডাউনলোড + তথ্য + লঞ্চ করুন + Reinstall + আনইনস্টল + আপডেট + অ্যাপস + পরিবর্তন নথি + %1$s ডাউনলোড করা হচ্ছে + ইনস্টল করুন সর্বশেষ: - প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন + প্রথমে ভ্যান্সড মাইক্রোজি ইনস্টল করুন রুট অনুমতি দেয়া হয়নি - সোশ্যাল মিডিয়া - আমাদের সমর্থন করুন - অনুপলব্ধ + সোশ্যাল মিডিয়া + আমাদের সমর্থন করুন + অনুপলব্ধ ইনস্টল করা আছে: - অ্যাকসেন্ট রঙ - রূপ - আচরণ - ডাউনলোড করা ফাইলগুলি মুছে ফেলুন - সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে - এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয় - ফায়ারবেস তথ্য বিশ্লেষণ - ভাষা - লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে - ক্রোম কাস্টম ট্যাবস ব্যবহার করুন - %1$s পুশ বিজ্ঞপ্তিগুলি - %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান - নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ হয়েছে - রুট স্ক্রিপ্ট স্লিপ টাইম - মাউন্টিং ইস্যু ফিক্স করার জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত স্লিপ টাইম মানটি অ্যাডজাস্ট করুন - সিস্টেম দ্বারা র্নির্ধারিত - থিম - গাঢ় থিম - হালকা থিম - ম্যানেজার আপডেট কেন্দ্র - কোনো নতুন আপডেট নেই - বিকল্প + অ্যাকসেন্ট রঙ + রূপ + আচরণ + ডাউনলোড করা ফাইলগুলি মুছে ফেলুন + সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে + এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয় + ফায়ারবেস তথ্য বিশ্লেষণ + ভাষা + লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে + ক্রোম কাস্টম ট্যাবস ব্যবহার করুন + %1$s পুশ বিজ্ঞপ্তিগুলি + %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান + নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ হয়েছে + রুট স্ক্রিপ্ট স্লিপ টাইম + মাউন্টিং ইস্যু ফিক্স করার জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত স্লিপ টাইম মানটি অ্যাডজাস্ট করুন + সিস্টেম দ্বারা র্নির্ধারিত + থিম + গাঢ় থিম + হালকা থিম + ম্যানেজার আপডেট কেন্দ্র + কোনো নতুন আপডেট নেই + বিকল্প - লগগুলি সংরক্ষণ করা যায়নি - সফলভাবে লগ সংরক্ষণ করা হয়েছে + লগগুলি সংরক্ষণ করা যায়নি + সফলভাবে লগ সংরক্ষণ করা হয়েছে বিশদ - ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে! - %1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান? + ইনস্টল করার জন্য %1$s ফাইল খুঁজে পাওয়া গেছে! + %1$s ইনস্টল করার জন্য প্রয়োজনীয় সমস্ত ফাইলগুলি ম্যানেজার খুঁজে পেয়েছে। আপনি কি ইনস্টল করতে চান? %1$s ইনস্টল করার পছন্দগুলি - আপডেটের জন্য চেক করা হচ্ছে… + আপডেটের জন্য চেক করা হচ্ছে… ভাষা(গুলি): %1$s থিম: %1$s সংস্করণ: %1$s - ত্রুটি - সহায়িকা - থামুন! + ত্রুটি + সহায়িকা + থামুন! আপনি ভ্যান্সড ম্যাজিস্ক/TWRP সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং আপনি এটিকে আপডেট করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন। - ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন) - MIUI অপটিমাইজেশন সক্ষম করা আছে! - এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না! - পুনরায় ডাউনলোড করুন - নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন + ভ্যান্সড ইনস্টল করতে হলে, আপনাকে ডেভেলপার সেটিংসে MIUI অপটিমাইজেশন বন্ধ করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরবর্তী xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কবার্তাটি এড়িয়ে যেতে পারেন) + MIUI অপটিমাইজেশন সক্ষম করা আছে! + এই প্রক্রিয়া চলাকালীন দয়া করে অ্যাপ্লিকেশন থেকে কোনোমতেই প্রস্থান করবেন না! + পুনরায় ডাউনলোড করুন + নিশ্চিত করুন যে আপনি অ্যাপটি vancedapp.com, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন সংস্করণ - স্বাগত + স্বাগত - ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন - সর্বশেষ + ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন + সর্বশেষ হাল্কা + %1$s অন্তত একটি ভাষা নির্বাচন করুন! - কালো - অন্ধকার + কালো + অন্ধকার - ম্যানেজার বিকাশকারীরা - অন্যান্য অবদানকারী - উৎসগুলি - ভ্যান্সড টীম + ম্যানেজার বিকাশকারীরা + অন্যান্য অবদানকারী + উৎসগুলি + ভ্যান্সড টীম - System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। - %1$s ডাউনলোড করার সময় ত্রুটি + System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। + %1$s ডাউনলোড করার সময় ত্রুটি নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ হয়েছে - %1$s পেকেজ আন‌ইনস্টল করা যাইনি - ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন। - স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। - ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। - অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন - ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন। - ইনস্টলেশন ব্যর্থ হয়েছে কারণ ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা নেই। - ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন। - স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ। + %1$s পেকেজ আন‌ইনস্টল করা যাইনি + ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন। + স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। + ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করেছে। অ্যাপটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। + অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। অ্যাডভান্সড মেনু থেকে স্ক্রিনশটটিও সংযুক্ত করুন + ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন। + ইনস্টলেশন ব্যর্থ হয়েছে কারণ ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা নেই। + ইনস্টলার থেকে কালো/গাঢ় থিমের জন্য সফটওয়্যারের ফাইল খুঁজতে ব্যর্থ। ম্যানেজারের ডেটা সাফ করুন, তারপরে আবার চেষ্টা করুন। + স্পিল্ট ফাইলগুলি ইনস্টল করার পরে স্টক ইউটিউবের ইনস্টলেশন পাথ সনাক্ত করতে ব্যর্থ। diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index cff8c74674..9619762d97 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -1,120 +1,120 @@ - Cancel·lar - Tanca - Implementació modificada de GMS per a Cancer basada en el Projecte microG. - Una aplicació modificada de YouTube amb moltes característiques útils! - Vanced, però per a YouTube Music! Amb relativament menys característiques, però que assoleix les vostres necessitats. - Restableix - Desa - Seleccioneu les aplicacions + Cancel·lar + Tanca + Implementació modificada de GMS per a Cancer basada en el Projecte microG. + Una aplicació modificada de YouTube amb moltes característiques útils! + Vanced, però per a YouTube Music! Amb relativament menys característiques, però que assoleix les vostres necessitats. + Restableix + Desa + Seleccioneu les aplicacions - Quant a - Guia - Gestor - Registre - Configuració - Gestionador d\'actualitzacions + Quant a + Guia + Gestor + Registre + Configuració + Gestionador d\'actualitzacions - Té el vostre dispositiu accés de Superusuari (\'Root\')? - Concedir permís de Superusuari (\'Root\') - Comencem-hi - Selecciona com a mínim una aplicació! - No saps què és o no vols utilitzar la versió de Superusuari (\'Root\')? Simplement clica la fletxa blava de sota! + Té el vostre dispositiu accés de Superusuari (\'Root\')? + Concedir permís de Superusuari (\'Root\') + Comencem-hi + Selecciona com a mínim una aplicació! + No saps què és o no vols utilitzar la versió de Superusuari (\'Root\')? Simplement clica la fletxa blava de sota! - Sobre %1$s - Descarrega - Informació - Llança - Reinstall - Desinstal·la - Actualitza - Aplicacions - Registre de canvis - Descarregant %1$s - Instal·lar + Sobre %1$s + Descarrega + Informació + Llança + Reinstall + Desinstal·la + Actualitza + Aplicacions + Registre de canvis + Descarregant %1$s + Instal·lar Darrera: - Instal·la primer Vanced microG + Instal·la primer Vanced microG L\'accés arrel no s\'ha concedit - Xarxes socials - Dóna\'ns suport - No disponible + Xarxes socials + Dóna\'ns suport + No disponible Instal·lat: - Color d\'èmfasi - Aparença - Comportament - Esborrar fitxers descarregats - Fitxers netejats correctament - Permet-te\'ns recollir informació sobre el rendiment de l\'aplicació i els registres d\'error - Estadístiques de Firebase - Llengua - Els enllaços s\'obriran en pestanyes personalitzades del Chrome - Utilitza pestanyes personalitzades del Chrome - %1$s notificacions automàtiques - Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s - Error a l\'hora de guardar un nou valor de temps - Temps de repòs de la seqüència de comandes de Superusuari (\'Root\') - Ajusta el temps de repòs emprat a l\'script /data/adb/service.d/app.sh, útil per solventar problemes de muntatge - Per defecte del sistema - Tema - Tema fosc - Tema clar - Gestor d\'actualitzacions - Cap actualització - Variant + Color d\'èmfasi + Aparença + Comportament + Esborrar fitxers descarregats + Fitxers netejats correctament + Permet-te\'ns recollir informació sobre el rendiment de l\'aplicació i els registres d\'error + Estadístiques de Firebase + Llengua + Els enllaços s\'obriran en pestanyes personalitzades del Chrome + Utilitza pestanyes personalitzades del Chrome + %1$s notificacions automàtiques + Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s + Error a l\'hora de guardar un nou valor de temps + Temps de repòs de la seqüència de comandes de Superusuari (\'Root\') + Ajusta el temps de repòs emprat a l\'script /data/adb/service.d/app.sh, útil per solventar problemes de muntatge + Per defecte del sistema + Tema + Tema fosc + Tema clar + Gestor d\'actualitzacions + Cap actualització + Variant - No s\'han pogut desar els registres - Registres desats satisfactòriament + No s\'han pogut desar els registres + Registres desats satisfactòriament Detalls - Arxius d\'instal·lació de %1$s detectats! - El gestionador ha trobat tots els arxius necessaris per a l\'instal·lació de %1$s. Voleu instalar-ho? + Arxius d\'instal·lació de %1$s detectats! + El gestionador ha trobat tots els arxius necessaris per a l\'instal·lació de %1$s. Voleu instalar-ho? Preferències d\'instal·lació de %1$s - Cercant actualitzacions… + Cercant actualitzacions… Llengua(es): %1$s Tema: %1$s Versió: %1$s - Error - Guia - Atura\'t! + Error + Guia + Atura\'t! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Benvingut + Benvingut - Trieu els vostres idiomes preferits per a Vanced - Latest + Trieu els vostres idiomes preferits per a Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Gestor de desenvolupadors - Other Contributors - Fonts - Equip avançat + Gestor de desenvolupadors + Other Contributors + Fonts + Equip avançat - Failed to `chown` APK to system owner, please try again. - Error en descarregar %1$s + Failed to `chown` APK to system owner, please try again. + Error en descarregar %1$s Failed to apply new accent color - Error en instal·lar el paquet %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar. - La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar. - La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar. - La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Error en instal·lar el paquet %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar. + La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar. + La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar. + La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-ckb-rIR/strings.xml b/app/src/main/res/values-ckb-rIR/strings.xml index 6dae3363f4..2e8c19e443 100644 --- a/app/src/main/res/values-ckb-rIR/strings.xml +++ b/app/src/main/res/values-ckb-rIR/strings.xml @@ -1,120 +1,120 @@ - هەڵوەشاندنەوە - داخستن - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - ڕێکخستنەوە - پاراستن - بەرنامەکانت دیاریبکە + هەڵوەشاندنەوە + داخستن + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + ڕێکخستنەوە + پاراستن + بەرنامەکانت دیاریبکە - دەربارە - زانیاری - بەرێوەبردن - تۆماری نوێکاری - ڕێکخستنەکان - نوێکردنەوەی بەرنامە + دەربارە + زانیاری + بەرێوەبردن + تۆماری نوێکاری + ڕێکخستنەکان + نوێکردنەوەی بەرنامە - مۆبایلەکەت ڕۆت کراوە؟ - ڕێگەپێدانی ڕۆت Root - دەست پێکردن - لانیکەم دانەیەک دیاریبکە! - ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا! + مۆبایلەکەت ڕۆت کراوە؟ + ڕێگەپێدانی ڕۆت Root + دەست پێکردن + لانیکەم دانەیەک دیاریبکە! + ئەگەر نازانیت ئەمە چییە یان ناتەوێ بەشێوەی ڕۆت بەکاری بهێنیت، پەنجە بنێ بە دوگمە شینەکەدا! - دەربارەی %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - بەرنامەکان - گۆڕانکارییەکان - داگرتنی %1$s - دامەزراندن + دەربارەی %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + بەرنامەکان + گۆڕانکارییەکان + داگرتنی %1$s + دامەزراندن دوایین: - Install Vanced microG first + Install Vanced microG first ڕێگەپێدانی Root نەدراوە - تۆڕە کۆمەڵایەتییەکان - پشتگیریکردن - بەردەست نیە + تۆڕە کۆمەڵایەتییەکان + پشتگیریکردن + بەردەست نیە دامەزرێنراو: - ڕەنگی سەرەکی - ڕووکار - ڕێکخستن - سڕینەوەی فایلە داگیراوەکان - فایلەکان بەسەرکەتوویی سڕانەوە - کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا - Firebase شیکردنەوەی - زمان - بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە - بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم - %1$s وەرگرتنی ئاگادارکردنەوەکان - وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا - پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو - ماوەی وەستاندنی سکریپتی Root - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - سیستەم - ڕووکار - تاریک - ڕووناک - ناوەندی نوێکردنەوە - هیچ نوێکردنەوەیەک نیە - جۆر + ڕەنگی سەرەکی + ڕووکار + ڕێکخستن + سڕینەوەی فایلە داگیراوەکان + فایلەکان بەسەرکەتوویی سڕانەوە + کۆکردنەوەی زانیاری لەکاتی بوونی کێشەو تۆماری هەڵە لە بەرنامەکەدا + Firebase شیکردنەوەی + زمان + بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە + بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم + %1$s وەرگرتنی ئاگادارکردنەوەکان + وەرگرتنی ئاگادارکردنەوە کاتێ نوێکردنەوەی %1$s بەردەست کرا + پاشکەوتکردنی بیرخەرەوە سەرکەوتو نەبوو + ماوەی وەستاندنی سکریپتی Root + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + سیستەم + ڕووکار + تاریک + ڕووناک + ناوەندی نوێکردنەوە + هیچ نوێکردنەوەیەک نیە + جۆر - نەتوانرا تۆمارەکە بپارێزرێت - تۆمارەکە بەسەرکەوتوویی پارێزرا + نەتوانرا تۆمارەکە بپارێزرێت + تۆمارەکە بەسەرکەوتوویی پارێزرا Details - %1$s فایل دۆزرایەوە بۆ دابەزاندن! - بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟ + %1$s فایل دۆزرایەوە بۆ دابەزاندن! + بەرنامەکە هەموو ئەو فایلانەی دۆزیەوە %1$s کە پێویستن بۆ دابەزاندن، ئەتەوێ دایان مەزرێنیت؟ %1$s ڕێکخستنەکانی دامەزراندن - پشکنین بۆ نوێکردنەوە… + پشکنین بۆ نوێکردنەوە… زمان: %1$s ڕووکار: %1$s وەشان: %1$s - هەڵەیەک ڕوویدا - زانیاری - وەستاندن! + هەڵەیەک ڕوویدا + زانیاری + وەستاندن! تۆ وەشانی Magisk/TWRP ـی Vanced بەکاردێنیت، کە ناتوانرێت بە بەکارهێنانی ئەم بەرنامەیە نوێبکرێتەوە، تکایە لایبدە بە سڕینەوەی مۆدیولی ماگیسک/لەڕێی TWRP Vanced. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - باشترکردنی MIUI چالاککراوە! - Please do NOT exit the app during this process! - داگرتنەوە - دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + باشترکردنی MIUI چالاککراوە! + Please do NOT exit the app during this process! + داگرتنەوە + دڵنیابە کە بەرنامەکەت لە سایتی vancedapp.com، سێرڤەری دیسکۆرد یان Vanced GitHub داگرتووە وەشان - بەخێربێیت + بەخێربێیت - زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە - دوایین + زمانێک هەڵبژێرە بۆ بەکارهێنانی بەرنامەکە + دوایین ڕووناک + %1$s لانیکەم زمانێک دیاریبکە! - ڕەش - تاریک + ڕەش + تاریک - کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید) - وەرگێڕانی کوردی - گۆران غەریب - سەرچاوەکان - Vanced تیمی + کراوە بە کوردی لەلایەن: گۆران غەریب(کوردرۆید) + وەرگێڕانی کوردی - گۆران غەریب + سەرچاوەکان + Vanced تیمی - سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە. - کێشە ڕوویدا لە داگرتنی %1$s + سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە. + کێشە ڕوویدا لە داگرتنی %1$s گۆڕینی ڕەنگ سەرکەوتو نەبوو - سڕینەوەی %1$s سەرکەوتو نەبوو - سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە. - سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە. - دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە. - دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. - دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. - دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە. - دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە. - دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە. - Installation failed because the device doesn\'t have enough free space. - سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە. - سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان. + سڕینەوەی %1$s سەرکەوتو نەبوو + سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە. + سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە. + دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە. + دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی وەشانێکی تری بەرنامەکە پێشتر دامەزرێنراوە، وەشانی ئێستای Vanced بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. + دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. + دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە. + دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی باشکردنی ڕووکاری MIUI چالاککراوە، باشکردنی ڕووکاری MIUI ناچالاک بکە ودووبارە هەوڵبدەرەوە. + دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی سەلماندنەکانی apk چالاککراوە، سەلماندنی دووپاتکردنەوەی ئیمزای apk ناچالاک بکە و پاشان دووبارە هەوڵبدەرەوە. + Installation failed because the device doesn\'t have enough free space. + سەرکەوتو نەبوو لە دۆزینەوەی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە دامەزرێنەرەکەدا. داتای بەرنامەکە بسڕەوە لە ڕێکبەندیەکاندا و دووبارە هەوڵبدەرەوە. + سەرکەوتو نەبوو لە دۆزینەوەی بەرنامەی بنەڕەتی YouTube لەشوێنی دابەزاندن لەپاش دامەزراندنی پێکهاتەکان. diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 3107819f08..faa271f5a1 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -1,120 +1,120 @@ - Zrušit - Zavřít - Vlastní implementace GMS pro Vanced založená na projektu microG. - Upravený klient YouTube se spoustou užitečných funkcí! - Vanced, ale YouTube Music! Obsahuje o trochu méně funkcí, ale splní vaše potřeby. - Resetovat - Uložit - Vyberte své aplikace + Zrušit + Zavřít + Vlastní implementace GMS pro Vanced založená na projektu microG. + Upravený klient YouTube se spoustou užitečných funkcí! + Vanced, ale YouTube Music! Obsahuje o trochu méně funkcí, ale splní vaše potřeby. + Resetovat + Uložit + Vyberte své aplikace - O aplikaci - Průvodce - Manager - Záznamy - Nastavení - Aktualizovat Manager + O aplikaci + Průvodce + Manager + Záznamy + Nastavení + Aktualizovat Manager - Má vaše zařízení oprávnění root? - Udělit oprávnění root - Začínáme - Vyberte alespoň jednu aplikaci! - Nevíte, co to je, nebo nechcete používat verzi s přístupem root? V tom případě klikněte na modrou šipku níže! + Má vaše zařízení oprávnění root? + Udělit oprávnění root + Začínáme + Vyberte alespoň jednu aplikaci! + Nevíte, co to je, nebo nechcete používat verzi s přístupem root? V tom případě klikněte na modrou šipku níže! - O aplikaci %1$s - Stáhnout - Informace - Spustit - Přeinstalovat - Odinstalovat - Aktualizovat - Aplikace - Seznam změn - Stahování %1$s - Nainstalovat + O aplikaci %1$s + Stáhnout + Informace + Spustit + Přeinstalovat + Odinstalovat + Aktualizovat + Aplikace + Seznam změn + Stahování %1$s + Nainstalovat Nejnovější: - Nejprve nainstalujte Vanced microG + Nejprve nainstalujte Vanced microG Root přístup nebyl udělen - Sociální média - Podpořte nás - Není k dispozici + Sociální média + Podpořte nás + Není k dispozici Nainstalováno: - Doplňková barva - Vzhled - Chování - Vymazat stažené soubory - Vymazání souborů proběhlo úspěšně - Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání - Firebase analytika - Jazyk - Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome - Používat vlastní karty prohlížeče Chrome - %1$s vyskakovací oznámení - Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení - Nepodařilo se uložit novou hodnotu času - Doba nečinnosti kořenového skriptu - Upravte hodnotu doby nečinnosti použitou ve skriptu /data/adb/service.d/app.sh, která je užitečná pro opravu problémů s připojením - Výchozí systémové nastavení - Motiv - Tmavý motiv - Světlý motiv - Centrum aktualizací aplikace Manager - Žádné nové aktualizace - Varianta + Doplňková barva + Vzhled + Chování + Vymazat stažené soubory + Vymazání souborů proběhlo úspěšně + Toto nám umožňuje shromažďovat informace o výkonu aplikace a záznamy o selhání + Firebase analytika + Jazyk + Odkazy se budou otevírat na vlastních kartách prohlížeče Chrome + Používat vlastní karty prohlížeče Chrome + %1$s vyskakovací oznámení + Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení + Nepodařilo se uložit novou hodnotu času + Doba nečinnosti kořenového skriptu + Upravte hodnotu doby nečinnosti použitou ve skriptu /data/adb/service.d/app.sh, která je užitečná pro opravu problémů s připojením + Výchozí systémové nastavení + Motiv + Tmavý motiv + Světlý motiv + Centrum aktualizací aplikace Manager + Žádné nové aktualizace + Varianta - Záznamy nelze uložit - Záznamy byly úspěšně uloženy + Záznamy nelze uložit + Záznamy byly úspěšně uloženy Podrobnosti - Počet zjištěných instalačních souborů: %1$s - Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat? + Počet zjištěných instalačních souborů: %1$s + Manager nalezl všechny soubory potřebné pro instalaci aplikace %1$s. Chcete ji nyní nainstalovat? Předvolby instalace: %1$s - Kontrola aktualizací… + Kontrola aktualizací… Jazyk(y): %1$s Motiv: %1$s Verze: %1$s - Chyba - Průvodce - Zadržte! + Chyba + Průvodce + Zadržte! Používáte verzi Vanced pro Magisk/TWRP, jejíž vývoj byl ukončen a kterou nelze pomocí této aplikace aktualizovat. Odstraňte ji prosím odebráním modulu Magisk použitím Vanced odinstalátoru v TWRP. - Chcete‑li nainstalovat Vanced, MUSÍTE vypnout optimalizace MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM ze 20. 2. 2020 nebo novější založenou na xiaomi.eu) - Optimalizace MIUI jsou zapnuty! - Během tohoto procesu NEUKONČUJTE aplikaci! - Stáhnout znovu - Ujistěte se, že jste si aplikaci stáhli z našeho webu vancedapp.com, z našeho Vanced Discord serveru nebo z našeho GitHubu + Chcete‑li nainstalovat Vanced, MUSÍTE vypnout optimalizace MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM ze 20. 2. 2020 nebo novější založenou na xiaomi.eu) + Optimalizace MIUI jsou zapnuty! + Během tohoto procesu NEUKONČUJTE aplikaci! + Stáhnout znovu + Ujistěte se, že jste si aplikaci stáhli z našeho webu vancedapp.com, z našeho Vanced Discord serveru nebo z našeho GitHubu Verze - Vítejte + Vítejte - Vyberte si jeden nebo více preferovaných jazyků pro Vanced - Nejnovější + Vyberte si jeden nebo více preferovaných jazyků pro Vanced + Nejnovější Světlý + %1$s Vyberte alespoň jeden jazyk! - Černý - Tmavý + Černý + Tmavý - Vývojáři aplikace Manager - Další přispěvatelé - Zdrojové kódy - Tým Vanced + Vývojáři aplikace Manager + Další přispěvatelé + Zdrojové kódy + Tým Vanced - Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu. - Chyba při stahování %1$s + Nepodařilo se změnit vlastníka souboru APK na vlastníka systému, zkuste to prosím znovu. + Chyba při stahování %1$s Nepodařilo se nastavit novou doplňkovou barvu - Nepodařilo se odinstalovat balíček %1$s - Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu. - Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu. - Instalace se nezdařila, protože uživatel přerušil instalaci. - Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu. - Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu. - Instalace se z neznámých důvodů nezdařila. Pro další podporu se připojte k našemu Telegramu nebo Discordu. Připojte také snímek obrazovky z nabídky Pokročilé - Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte v Nastavení stažené soubory a poté to zkuste znovu. - Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu. - Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu. - Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu. - Instalace se nezdařila, protože v zařízení není dostatek volného místa. - Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu. - Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci. + Nepodařilo se odinstalovat balíček %1$s + Nepodařilo se najít požadované soubory pro instalaci. Stáhněte znovu instalační soubory a poté to zkuste znovu. + Ve vnitřním úložišti se nepodařilo najít soubor APK pro černý/tmavý motiv. Zkuste to prosím znovu. + Instalace se nezdařila, protože uživatel přerušil instalaci. + Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a poté to zkuste znovu. + Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace a poté to zkuste znovu. + Instalace se z neznámých důvodů nezdařila. Pro další podporu se připojte k našemu Telegramu nebo Discordu. Připojte také snímek obrazovky z nabídky Pokročilé + Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte v Nastavení stažené soubory a poté to zkuste znovu. + Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to prosím znovu. + Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a poté to zkuste znovu. + Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a poté to zkuste znovu. + Instalace se nezdařila, protože v zařízení není dostatek volného místa. + Nepodařilo se najít soubor APK pro černý/tmavý motiv z instalátoru. Vymažte data aplikace Manager a zkuste to znovu. + Nepodařilo se najít výchozí cestu instalace YouTube po rozdělené instalaci. diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 9ad00f2a38..df8cbe007d 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -1,120 +1,120 @@ - Annuller - Luk - En brugerdefineret GMS implementering for Vanced baseret på microG Project. - En modificeret YouTube klient med mange nyttige funktioner! - Vanced, men for YouTube Music! Relativt mindre funktionsrig men opfylder dine behov. - Nulstil - Gem - Vælg Dine Apps + Annuller + Luk + En brugerdefineret GMS implementering for Vanced baseret på microG Project. + En modificeret YouTube klient med mange nyttige funktioner! + Vanced, men for YouTube Music! Relativt mindre funktionsrig men opfylder dine behov. + Nulstil + Gem + Vælg Dine Apps - Om - Guide - Manager - Logfiler - Indstillinger - Opdaterings Manager + Om + Guide + Manager + Logfiler + Indstillinger + Opdaterings Manager - Er Din Enhed Rooted? - Tildel Root Tilladelse - Lad os komme igang - Vælg mindst én app! - Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor! + Er Din Enhed Rooted? + Tildel Root Tilladelse + Lad os komme igang + Vælg mindst én app! + Ved du ikke hvad dette er, eller ønsker du ikke at bruge root versionen? Bare klik på den blå pil nedenfor! - Om %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Ændringslog - Downloader %1$s - Installer + Om %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Ændringslog + Downloader %1$s + Installer Seneste: - Installer først Vanced microG + Installer først Vanced microG Root adgang ikke tildelt - Sociale medier - Støt os - Utilgængelig + Sociale medier + Støt os + Utilgængelig Installeret: - Sekundær farve - Udseende - Adfærd - Ryd hentede filer - Filer ryddet succesfuldt - Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs - Firebase analyse - Sprog - Links vil åbne i Chrome Custom Faner - Brug Chrome Custom Faner - %1$s Push Notifikationer - Modtag push meddelelser når der er en ny opdatering til %1$s - Kunne ikke gemme ny tidsværdi - Root script dvale tid - Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer - System Standard - Tema - Mørkt tema - Lyst tema - Manager opdaterings center - Ingen nye opdateringer - Variant + Sekundær farve + Udseende + Adfærd + Ryd hentede filer + Filer ryddet succesfuldt + Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs + Firebase analyse + Sprog + Links vil åbne i Chrome Custom Faner + Brug Chrome Custom Faner + %1$s Push Notifikationer + Modtag push meddelelser når der er en ny opdatering til %1$s + Kunne ikke gemme ny tidsværdi + Root script dvale tid + Justér dvale tid brugt i /data/adb/service.d/app.sh script, bruges til at rette monteringsproblemer + System Standard + Tema + Mørkt tema + Lyst tema + Manager opdaterings center + Ingen nye opdateringer + Variant - Kunne ikke gemme logfil - Logfiler gemt succesfuldt + Kunne ikke gemme logfil + Logfiler gemt succesfuldt Detaljer - %1$s installationsfiler fundet! - Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den? + %1$s installationsfiler fundet! + Manageren opdagede, at alle nødvendige filer til %1$s installationen blev fundet. Vil du installere den? %1$s Installationsindstillinger - Søger efter opdateringer… + Søger efter opdateringer… Sprog:%1$s Tema: %1$s Version: %1$s - Fejl - Vejledning - Stop! + Fejl + Vejledning + Stop! Det ser ud som om du bruger Magisk/TWRP versionen af Vanced. Den er ikke længere understøttet og kan derfor ikke opdateres igennem denne app. Vær venlig at fjerne magisk modulet/brug TWRP Vanced uninstaller. - For at installere Vanced er du NØDT til at slå MIUI optimering fra i udvikler indstillingerne. (Du kan ignorere denne advarsel hvis du bruger en 20.2.20 eller nyere xiaomi.eu baseret ROM) - MIUI Optimering er aktiveret! - Afslut venligst IKKE appen under denne proces! - Hent igen - Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden + For at installere Vanced er du NØDT til at slå MIUI optimering fra i udvikler indstillingerne. (Du kan ignorere denne advarsel hvis du bruger en 20.2.20 eller nyere xiaomi.eu baseret ROM) + MIUI Optimering er aktiveret! + Afslut venligst IKKE appen under denne proces! + Hent igen + Venligst sørg for kun at have downloaded appen fra vancedapp.com, Vanced Discord serveren eller Vanced GitHub siden Version - Velkommen + Velkommen - Vælg dit fortrukne sprog til Vanced - Seneste + Vælg dit fortrukne sprog til Vanced + Seneste Lys + %1$s Vælg mindst ét sprog! - Sort - Mørk + Sort + Mørk - Manager udviklere - Øvrige Bidragsydere - Kilder - Vanced holdet + Manager udviklere + Øvrige Bidragsydere + Kilder + Vanced holdet - Kunne ikke vælge Apk til systemejer, Prøv igen. - Fejl i download af %1$s + Kunne ikke vælge Apk til systemejer, Prøv igen. + Fejl i download af %1$s Kunne ikke anvende ny accentfarve - Fejlede i at fjerne pakke %1$s - Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen. - Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen. - Installationen fejlede fordi brugeren lukkede installationen. - Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen. - Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen. - Installation mislykkedes af ukendte årsager, kom på vores Telegram eller Discord for yderligere hjælp. Vedhæft venligst også et skærmbillede fra menuen Avanceret - Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen. - Installationen fejlede fordi apk filerne er beskadiget, prøv igen. - Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen. - Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen. - Installationen mislykkedes, fordi enheden ikke har nok ledig plads. - Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen. - Kunne ikke finde lageret YouTube-installationsstien efter split installation. + Fejlede i at fjerne pakke %1$s + Kunne ikke finde de påkrævede filer til installation. Download installationsfilerne igen, og prøv igen. + Kunne ikke finde apk-fil til sort/mørkt tema fra lager. Prøv venligst igen. + Installationen fejlede fordi brugeren lukkede installationen. + Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen. + Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen. + Installation mislykkedes af ukendte årsager, kom på vores Telegram eller Discord for yderligere hjælp. Vedhæft venligst også et skærmbillede fra menuen Avanceret + Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen. + Installationen fejlede fordi apk filerne er beskadiget, prøv igen. + Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen. + Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen. + Installationen mislykkedes, fordi enheden ikke har nok ledig plads. + Kunne ikke finde apk fil til sort/mørkt tema fra installationsprogrammet. Ryd app data fra Manager, og prøv derefter igen. + Kunne ikke finde lageret YouTube-installationsstien efter split installation. diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 94e23c7c33..6eac627fe8 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -1,120 +1,120 @@ - Abbrechen - Schließen - Eine eigene GMD-Implementation für Vanced, basierend auf dem MicroG-Projekt. - Ein modifizierter YouTube-Client mit vielen nützlichen Funktionen! - Vanced, aber für YouTube Music! Weniger Funktionen, stillt aber deine Bedürfnisse. - Zurücksetzen - Speichern - Wähle deine Apps + Abbrechen + Schließen + Eine eigene GMD-Implementation für Vanced, basierend auf dem MicroG-Projekt. + Ein modifizierter YouTube-Client mit vielen nützlichen Funktionen! + Vanced, aber für YouTube Music! Weniger Funktionen, stillt aber deine Bedürfnisse. + Zurücksetzen + Speichern + Wähle deine Apps - Über - Anleitung - Manager - Protokolle - Einstellungen - Update Manager + Über + Anleitung + Manager + Protokolle + Einstellungen + Update Manager - Ist dein Gerät gerootet? - Root-Berechtigung erteilen - Los geht\'s - Wähle mindestens eine App! - Du weißt nicht was das ist, oder willst die Root-Version nicht benutzen? klicke einfach den blauen Pfeil unten an! + Ist dein Gerät gerootet? + Root-Berechtigung erteilen + Los geht\'s + Wähle mindestens eine App! + Du weißt nicht was das ist, oder willst die Root-Version nicht benutzen? klicke einfach den blauen Pfeil unten an! - Über %1$s - Download - Info - Starten - Neu installieren - Deinstallieren - Aktualisieren - Anwendungen - Änderungen - %1$s wird heruntergeladen - Installieren + Über %1$s + Download + Info + Starten + Neu installieren + Deinstallieren + Aktualisieren + Anwendungen + Änderungen + %1$s wird heruntergeladen + Installieren Neueste: - Installiere zuerst Vanced MicroG + Installiere zuerst Vanced MicroG Root-Zugriff nicht erteilt - Soziale Medien - Unterstütze uns - Nicht verfügbar + Soziale Medien + Unterstütze uns + Nicht verfügbar Installiert: - Akzentfarbe - Darstellung - Verhalten - Heruntergeladene Dateien löschen - Daten erfolgreich gelöscht - Dadurch können wir Informationen über die Performance der App und Absturzprotokolle sammeln - Firebase-Analyse - Sprache - Links werden in Chrome Custom Tabs geöffnet - Verwende Chrome Custom Tabs - %1$s Push-Benachrichtigungen - Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird - Speichern des neuen Zeitwertes fehlgeschlagen - Wartezeit des Root-Skriptes - Anpassen des Wertes für die Ruhezeit, der im Skript /data/adb/service.d/app.sh verwendet wird, nützlich zur Behebung von Problemen beim Einbinden - Systemstandard - Theme - Dunkles Theme - Helles Theme - Update Center - Keine neuen Updates - Variante + Akzentfarbe + Darstellung + Verhalten + Heruntergeladene Dateien löschen + Daten erfolgreich gelöscht + Dadurch können wir Informationen über die Performance der App und Absturzprotokolle sammeln + Firebase-Analyse + Sprache + Links werden in Chrome Custom Tabs geöffnet + Verwende Chrome Custom Tabs + %1$s Push-Benachrichtigungen + Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird + Speichern des neuen Zeitwertes fehlgeschlagen + Wartezeit des Root-Skriptes + Anpassen des Wertes für die Ruhezeit, der im Skript /data/adb/service.d/app.sh verwendet wird, nützlich zur Behebung von Problemen beim Einbinden + Systemstandard + Theme + Dunkles Theme + Helles Theme + Update Center + Keine neuen Updates + Variante - Protokolle konnten nicht gespeichert werden - Protokolle erfolgreich gespeichert + Protokolle konnten nicht gespeichert werden + Protokolle erfolgreich gespeichert Details - %1$s Installationsdateien erkannt! - Manager hat festgestellt, dass alle notwendigen Dateien für die Installation von %1$s gefunden wurden. Möchtest Du sie installieren? + %1$s Installationsdateien erkannt! + Manager hat festgestellt, dass alle notwendigen Dateien für die Installation von %1$s gefunden wurden. Möchtest Du sie installieren? %1$s Installationsoptionen - Suche nach Updates… + Suche nach Updates… Sprache(n): %1$s Theme: %1$s Version: %1$s - Fehler - Erklärung - Stopp! + Fehler + Erklärung + Stopp! Du benutzt die Magisk/TWRP-Version von Vanced, die nicht mehr unterstützt wird und mit dieser App nicht aktualisiert werden kann. Bitte entferne siie indem du das Magisk-Modul mit dem TWRP Vanced Uninstaller entfernst. - Um Vanced installieren zu können, MÜSSEN Sie MIUI Optimierungen in den Entwickleroptionen deaktivieren. (Bitte ignorieren Sie diese Warnung, wenn Sie xiaomi.eu Roms mit der Version 20.2.20 oder höher verwenden.) - MIUI Optimierungen sind aktiviert! - Bitte schließen Sie die App NICHT während dieses Prozesses! - Erneut herunterladen - Stelle sicher, dass du die App von vancedapp.com, dem Vanced Discord Server oder dem Vanced GitHub heruntergeladen hast + Um Vanced installieren zu können, MÜSSEN Sie MIUI Optimierungen in den Entwickleroptionen deaktivieren. (Bitte ignorieren Sie diese Warnung, wenn Sie xiaomi.eu Roms mit der Version 20.2.20 oder höher verwenden.) + MIUI Optimierungen sind aktiviert! + Bitte schließen Sie die App NICHT während dieses Prozesses! + Erneut herunterladen + Stelle sicher, dass du die App von vancedapp.com, dem Vanced Discord Server oder dem Vanced GitHub heruntergeladen hast Version - Willkommen + Willkommen - Wählen Sie ihre bevorzugte Sprache(n) für Vanced - Neueste + Wählen Sie ihre bevorzugte Sprache(n) für Vanced + Neueste Hell + %1$s Wähle mindestens eine Sprache aus! - Schwarz - Dunkel + Schwarz + Dunkel - Manager-Entwickler - Weitere Mitwirkende - Quellen - Vanced Team + Manager-Entwickler + Weitere Mitwirkende + Quellen + Vanced Team - Fehler beim `chown` der APK zum Systembesitzer, bitte versuche es erneut. - Download von %1$s fehlgeschlagen + Fehler beim `chown` der APK zum Systembesitzer, bitte versuche es erneut. + Download von %1$s fehlgeschlagen Neue Akzentfarbe konnte nicht angewendet werden - Entfernen von %1$s fehlgeschlagen - Die benötigten Dateien für die Installation konnten nicht gefunden werden. Laden Sie die Installationsdateien erneut herunter und versuchen Sie es erneut. - Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden, bitte versuchen Sie es erneut. - Installation fehlgeschlagen, da der Benutzer die Installation abgebrochen hat. - Die Installation ist fehlgeschlagen, weil die App in Konflikt mit einer bereits installierten App steht. Deinstalliere die aktuell installierte Version der App und versuchen es dann erneut. - Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der YouTube App und versuchen Sie es erneut. - Die Installation ist aus unbekannten Gründen fehlgeschlagen. Betrete unser Telegram Chat oder Discord Server für weitere Unterstützung und halte bitte einen Screenshot aus dem erweiterten Menü bereit - Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut. - Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut. - Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut. - Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut. - Installation fehlgeschlagen, da das Gerät nicht genügend freien Speicherplatz hat. - Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut. - Fehler beim Auffinden des YouTube-Installationspfades nach der geteilten Installation. + Entfernen von %1$s fehlgeschlagen + Die benötigten Dateien für die Installation konnten nicht gefunden werden. Laden Sie die Installationsdateien erneut herunter und versuchen Sie es erneut. + Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden, bitte versuchen Sie es erneut. + Installation fehlgeschlagen, da der Benutzer die Installation abgebrochen hat. + Die Installation ist fehlgeschlagen, weil die App in Konflikt mit einer bereits installierten App steht. Deinstalliere die aktuell installierte Version der App und versuchen es dann erneut. + Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der YouTube App und versuchen Sie es erneut. + Die Installation ist aus unbekannten Gründen fehlgeschlagen. Betrete unser Telegram Chat oder Discord Server für weitere Unterstützung und halte bitte einen Screenshot aus dem erweiterten Menü bereit + Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut. + Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut. + Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut. + Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut. + Installation fehlgeschlagen, da das Gerät nicht genügend freien Speicherplatz hat. + Apk-Datei für schwarzes/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut. + Fehler beim Auffinden des YouTube-Installationspfades nach der geteilten Installation. diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index c01473c611..a6fe9b073d 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -1,120 +1,120 @@ - Ακύρωση - Κλείσιμο - Μια πειραγμένη εκδοχή των GMS (υπηρεσιών κινητής της Google) για το Vanced βασισμένη στο έργο του microG. - Μια πειραγμένη εφαρμογή του YouTube με πολλά χρήσιμα χαρακτηριστικά! - Vanced, αλλά για το YouTube Music! Λιγότερο πλούσιο σε χαρακτηριστικά αλλά καλύπτει τις ανάγκες σας. - Επαναφορά - Αποθήκευση - Επιλέξτε τις εφαρμογές σας + Ακύρωση + Κλείσιμο + Μια πειραγμένη εκδοχή των GMS (υπηρεσιών κινητής της Google) για το Vanced βασισμένη στο έργο του microG. + Μια πειραγμένη εφαρμογή του YouTube με πολλά χρήσιμα χαρακτηριστικά! + Vanced, αλλά για το YouTube Music! Λιγότερο πλούσιο σε χαρακτηριστικά αλλά καλύπτει τις ανάγκες σας. + Επαναφορά + Αποθήκευση + Επιλέξτε τις εφαρμογές σας - Πληροφορίες - Οδηγός για το Vanced - Διαχειριστής Vanced - Αρχείο καταγραφής σφαλμάτων - Ρυθμίσεις - Ενημέρωση Διαχειριστή Vanced + Πληροφορίες + Οδηγός για το Vanced + Διαχειριστής Vanced + Αρχείο καταγραφής σφαλμάτων + Ρυθμίσεις + Ενημέρωση Διαχειριστή Vanced - Έχετε πρόσβαση Root στη συσκευή σας; - Χορήγηση Άδειας Root - Ας ξεκινήσουμε - Επιλέξτε τουλάχιστον μια εφαρμογή! - Δεν ξέρετε τι είναι αυτό ή δεν θέλετε να χρησιμοποιήσετε την έκδοση root; Τότε απλώς πατήστε το μπλε βέλος παρακάτω! + Έχετε πρόσβαση Root στη συσκευή σας; + Χορήγηση Άδειας Root + Ας ξεκινήσουμε + Επιλέξτε τουλάχιστον μια εφαρμογή! + Δεν ξέρετε τι είναι αυτό ή δεν θέλετε να χρησιμοποιήσετε την έκδοση root; Τότε απλώς πατήστε το μπλε βέλος παρακάτω! - Σχετικά με το %1$s - Λήψη - Πληροφορίες - Εκκίνηση - Επανεγκατάσταση - Απεγκατάσταση - Ενημέρωση - Εφαρμογές - Αρχείο καταγραφής αλλαγών - Λήψη %1$s - Εγκατάσταση + Σχετικά με το %1$s + Λήψη + Πληροφορίες + Εκκίνηση + Επανεγκατάσταση + Απεγκατάσταση + Ενημέρωση + Εφαρμογές + Αρχείο καταγραφής αλλαγών + Λήψη %1$s + Εγκατάσταση Τελευταία έκδοση: - Εγκαταστήστε πρώτα το Vanced microG + Εγκαταστήστε πρώτα το Vanced microG Δεν επιτράπηκε η πρόσβαση Root - Μέσα Κοινωνικής Δικτύωσης - Υποστηρίξτε μας - Μη διαθέσιμο + Μέσα Κοινωνικής Δικτύωσης + Υποστηρίξτε μας + Μη διαθέσιμο Εγκατεστημένη έκδοση: - Χρώμα Διεπαφής - Εμφάνιση - Συμπεριφορά - Εκκαθάριση ληφθέντων αρχείων - Επιτυχής εκκαθάριση αρχείων - Αυτό μας επιτρέπει να συλλέγουμε πληροφορίες σχετικά με την επίδοση της εφαρμογής και σχετικά με καταγραφές σφαλμάτων λογισμικού - Firebase Analytics - Γλώσσα - Οι σύνδεσμοι θα ανοίγουν σε προσαρμοσμένες καρτέλες chrome - Χρήση προσαρμοσμένων καρτέλων Chrome - Ειδοποιήσεις Push για το %1$s - Λάβεται ειδοποιήσεις push όταν υπάρχουν διαθέσιμες ενημερώσεις για το %1$s - Αποτυχία αποθήκευσης νέας τιμής χρόνου - Σενάριο Χρόνου Αδράνειας Root - Ρυθμίστε στην τιμη του χρόνου αδράνειας που βρίσκετε στο αρχείο σενάριο /data/adb/service.d/app.sh, χρήσιμο για επιδιόρθωση προβλημάτων προσάρτησης - Προεπιλογή Συστήματος - Θέμα - Σκουρόχρωμο Θέμα - Ανοιχτόχρωμο Θέμα - Κέντρο ενημερώσεων - Δεν υπάρχουν νέες ενημερώσεις - Παραλλαγή + Χρώμα Διεπαφής + Εμφάνιση + Συμπεριφορά + Εκκαθάριση ληφθέντων αρχείων + Επιτυχής εκκαθάριση αρχείων + Αυτό μας επιτρέπει να συλλέγουμε πληροφορίες σχετικά με την επίδοση της εφαρμογής και σχετικά με καταγραφές σφαλμάτων λογισμικού + Firebase Analytics + Γλώσσα + Οι σύνδεσμοι θα ανοίγουν σε προσαρμοσμένες καρτέλες chrome + Χρήση προσαρμοσμένων καρτέλων Chrome + Ειδοποιήσεις Push για το %1$s + Λάβεται ειδοποιήσεις push όταν υπάρχουν διαθέσιμες ενημερώσεις για το %1$s + Αποτυχία αποθήκευσης νέας τιμής χρόνου + Σενάριο Χρόνου Αδράνειας Root + Ρυθμίστε στην τιμη του χρόνου αδράνειας που βρίσκετε στο αρχείο σενάριο /data/adb/service.d/app.sh, χρήσιμο για επιδιόρθωση προβλημάτων προσάρτησης + Προεπιλογή Συστήματος + Θέμα + Σκουρόχρωμο Θέμα + Ανοιχτόχρωμο Θέμα + Κέντρο ενημερώσεων + Δεν υπάρχουν νέες ενημερώσεις + Παραλλαγή - Αδυναμία αποθήκευσης αρχείου καταγραφής σφαλμάτων - Επιτυχής αποθήκευση αρχείου καταγραφής σφαλμάτων + Αδυναμία αποθήκευσης αρχείου καταγραφής σφαλμάτων + Επιτυχής αποθήκευση αρχείου καταγραφής σφαλμάτων Πληροφορίες - Ανιχνεύτηκαν τα αρχεία εγκατάστασης του %1$s! - Ο Διαχειριστής του Vanced ανίχνευσε ότι βρέθηκαν όλα τα απαραίτητα αρχεία για την εγκατάσταση του %1$s. Θέλετε να εγκατασταθεί; + Ανιχνεύτηκαν τα αρχεία εγκατάστασης του %1$s! + Ο Διαχειριστής του Vanced ανίχνευσε ότι βρέθηκαν όλα τα απαραίτητα αρχεία για την εγκατάσταση του %1$s. Θέλετε να εγκατασταθεί; Προτιμήσεις Εγκατάστασης του %1$s - Έλεγχος για ενημερώσεις… + Έλεγχος για ενημερώσεις… Γλώσσα(/ες): %1$s Θέμα: %1$s Έκδοση: %1$s - Σφάλμα - Οδηγίες - Σταματήστε! + Σφάλμα + Οδηγίες + Σταματήστε! Χρησιμοποιείτε την έκδοση Magisk/TWRP του Vanced, η οποία δεν υποστηρίζεται πλέον και δεν μπορεί να ενημερωθεί μέσω αυτής της εφαρμογής. Παρακαλούμε αφαιρέστε αυτή την έκδοση αφαιρώντας το Magisk Module/χρησιμοποιόντας το πρόγραμμα κατάργησης TWRP Vanced. - Για να εγκαταστήσετε το Vanced, ΠΡΕΠΕΙ να απενεργοποιήσετε τις Βελτιστοποιήσεις MIUI στις ρυθμίσεις για προγραμματιστές. (Μπορείτε να αγνοήσετε αυτή την προειδοποίηση αν χρησιμοποιείτε την έκδοση ROM 20.2.20 ή μεταγενέστερη, βάσει του xiaomi.eu) - Η βελτιστοποίηση MIUI είναι ενεργή! - Παρακαλώ ΜΗΝ βγείτε από την εφαρμογή κατά τη διάρκεια αυτής της διαδικασίας! - Επανάληψη λήψης - Βεβαιωθείτε ότι κάνατε λήψη της εφαρμογής από το vancedapp.com, τον διακομιστή Discord του Vanced ή το GitHub του Vanced + Για να εγκαταστήσετε το Vanced, ΠΡΕΠΕΙ να απενεργοποιήσετε τις Βελτιστοποιήσεις MIUI στις ρυθμίσεις για προγραμματιστές. (Μπορείτε να αγνοήσετε αυτή την προειδοποίηση αν χρησιμοποιείτε την έκδοση ROM 20.2.20 ή μεταγενέστερη, βάσει του xiaomi.eu) + Η βελτιστοποίηση MIUI είναι ενεργή! + Παρακαλώ ΜΗΝ βγείτε από την εφαρμογή κατά τη διάρκεια αυτής της διαδικασίας! + Επανάληψη λήψης + Βεβαιωθείτε ότι κάνατε λήψη της εφαρμογής από το vancedapp.com, τον διακομιστή Discord του Vanced ή το GitHub του Vanced Έκδοση - Καλώς ορίσατε + Καλώς ορίσατε - Επιλέξτε την(/ις) γλώσσα(/ες) που επιθυμείτε για το Vanced - Τελευταία + Επιλέξτε την(/ις) γλώσσα(/ες) που επιθυμείτε για το Vanced + Τελευταία Ανοιχτόχρωμο + %1$s Επιλέξτε τουλάχιστον μια γλώσσα! - Μαύρο - Σκουρόχρωμο + Μαύρο + Σκουρόχρωμο - Προγραμματιστές Διαχειριστή Vanced - Άλλοι Συνεισφέροντες - Πηγές - Η ομάδα του Vanced + Προγραμματιστές Διαχειριστή Vanced + Άλλοι Συνεισφέροντες + Πηγές + Η ομάδα του Vanced - Αποτυχία παραχώρησης ιδιοκτησίας του APK στον κάτοχο συστήματος, παρακαλούμε προσπαθείστε ξανά. - Σφάλμα λήψης του %1$s + Αποτυχία παραχώρησης ιδιοκτησίας του APK στον κάτοχο συστήματος, παρακαλούμε προσπαθείστε ξανά. + Σφάλμα λήψης του %1$s Αδυναμία εφαρμογής χρώματος διεπαφής - Αποτυχία απεγκατάστασης πακέτου %1$s - Αδυναμία εντοπισμού των απαιτούμενων αρχείων για την εγκατάσταση. Κατεβάστε τα αρχεία εγκατάστασης, και προσπαθήστε ξανά. - Αδυναμία εντοπισμού του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος στον αποθηκευτικό χώρο, παρακαλώ προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι ο χρήστης ακύρωσε την εγκατάσταση. - Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Κάντε απεγκατάσταση την τρέχουσα έκδοση της εφαρμογής, και μετά προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Απεγκαταστήστε τις ενημερώσεις της αρχικής εφαρμογής YouTube, στη συνέχεια προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε για άγνωστους λόγους, μπείτε στο Telegram ή στο Discord μας για περαιτέρω υποστήριξη. Παρακαλώ επισυνάψτε ένα στιγμιότυπο οθόνης από τις επιλογές για προχωρημένους - Η εγκατάσταση απέτυχε διότι το αρχείο εγκατάστασης είναι μη συμβατό με την συσκευή σας. Κάντε εκκαθάριση των ληφθέντων αρχείων στις ρυθμίσεις, στην συνέχεια προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι τα αρχεία apk έχουν διαφθαρεί, παρακαλώ προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι η βελτιστοποίηση MIUI είναι ενεργή. Απενεργοποιήστε την βελτιστοποίηση MIUI, και προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι η επαλήθευση υπογραφής των apk είναι ενεργή. Απενεργοποιήστε την επαλήθευση υπογραφής apk, στην συνέχεια προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή σας. - Αδυναμία εύρεσης του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος από το πρόγραμμα εγκατάστασης. Κάνετε εκκαθάριση των δεδομένων του διαχειριστή Vanced, στην συνέχεια προσπαθήστε ξανά. - Αδυναμία εύρεσης της διαδρομής εγκατάστασης της αρχικής εφαρμογής YouTube μετά από εγκατάσταση σε τεμάχια. + Αποτυχία απεγκατάστασης πακέτου %1$s + Αδυναμία εντοπισμού των απαιτούμενων αρχείων για την εγκατάσταση. Κατεβάστε τα αρχεία εγκατάστασης, και προσπαθήστε ξανά. + Αδυναμία εντοπισμού του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος στον αποθηκευτικό χώρο, παρακαλώ προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι ο χρήστης ακύρωσε την εγκατάσταση. + Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Κάντε απεγκατάσταση την τρέχουσα έκδοση της εφαρμογής, και μετά προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Απεγκαταστήστε τις ενημερώσεις της αρχικής εφαρμογής YouTube, στη συνέχεια προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε για άγνωστους λόγους, μπείτε στο Telegram ή στο Discord μας για περαιτέρω υποστήριξη. Παρακαλώ επισυνάψτε ένα στιγμιότυπο οθόνης από τις επιλογές για προχωρημένους + Η εγκατάσταση απέτυχε διότι το αρχείο εγκατάστασης είναι μη συμβατό με την συσκευή σας. Κάντε εκκαθάριση των ληφθέντων αρχείων στις ρυθμίσεις, στην συνέχεια προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι τα αρχεία apk έχουν διαφθαρεί, παρακαλώ προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι η βελτιστοποίηση MIUI είναι ενεργή. Απενεργοποιήστε την βελτιστοποίηση MIUI, και προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι η επαλήθευση υπογραφής των apk είναι ενεργή. Απενεργοποιήστε την επαλήθευση υπογραφής apk, στην συνέχεια προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή σας. + Αδυναμία εύρεσης του αρχείου apk σκουρόχρωμου/απολύτου μαύρου θέματος από το πρόγραμμα εγκατάστασης. Κάνετε εκκαθάριση των δεδομένων του διαχειριστή Vanced, στην συνέχεια προσπαθήστε ξανά. + Αδυναμία εύρεσης της διαδρομής εγκατάστασης της αρχικής εφαρμογής YouTube μετά από εγκατάσταση σε τεμάχια. diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index fccb8f5892..4b0800b3eb 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,120 +1,120 @@ - Cancelar - Cerrar - Una implementación de GMS personalizada para Vanced basada en el proyecto microG. - ¡Un cliente de YouTube modificado con muchas características útiles! - Vanced, pero para YouTube Music! Tiene relativamente menos características, pero satisface tus necesidades. - Restablecer - Guardar - Selecciona tus aplicaciones + Cancelar + Cerrar + Una implementación de GMS personalizada para Vanced basada en el proyecto microG. + ¡Un cliente de YouTube modificado con muchas características útiles! + Vanced, pero para YouTube Music! Tiene relativamente menos características, pero satisface tus necesidades. + Restablecer + Guardar + Selecciona tus aplicaciones - Información - Guía - Manager - Registros - Ajustes - Actualizar Manager + Información + Guía + Manager + Registros + Ajustes + Actualizar Manager - ¿Su dispositivo está rooteado? - Otorgar permiso root - Comencemos - ¡Seleccione al menos una aplicación! - ¿No sabes que es esto o no quieres usar la versión root? ¡Haz clic en la flecha azul de abajo! + ¿Su dispositivo está rooteado? + Otorgar permiso root + Comencemos + ¡Seleccione al menos una aplicación! + ¿No sabes que es esto o no quieres usar la versión root? ¡Haz clic en la flecha azul de abajo! - Acerca de %1$s - Descargar - Info - Iniciar - Reinstalar - Desinstalar - Actualizar - Apps - Historial de actualizaciones - Descargando %1$s - Instalar + Acerca de %1$s + Descargar + Info + Iniciar + Reinstalar + Desinstalar + Actualizar + Apps + Historial de actualizaciones + Descargando %1$s + Instalar Más reciente: - Primero, instala Vanced microG + Primero, instala Vanced microG Acceso root no concedido - Redes Sociales - Apóyanos - No Disponible + Redes Sociales + Apóyanos + No Disponible Instalado: - Color de Acento - Apariencia - Comportamiento - Limpiar archivos descargados - Archivos limpiados exitosamente - Esto nos permite recopilar información sobre el rendimiento de la aplicación y los registros de errores - Analíticas de Firebase - Idioma - Links serán abiertos en Chrome Custom Tabs - Usar Chrome Custom Tabs - Notificaciones push de %1$s - Recibir notificaciones push cuando una actualización para %1$s sea lanzada - Error al guardar el nuevo valor de tiempo - Tiempo de reposo de la secuencia de comandos de la raíz - Ajustar el valor de tiempo de reposo en el script /data/adb/service.d/app.sh, útil para arreglar problemas de montaje - Predeterminado del sistema - Tema - Tema Oscuro - Tema Claro - Centro de Actualizaciones - Sin actualizaciónes nuevas - Variante + Color de Acento + Apariencia + Comportamiento + Limpiar archivos descargados + Archivos limpiados exitosamente + Esto nos permite recopilar información sobre el rendimiento de la aplicación y los registros de errores + Analíticas de Firebase + Idioma + Links serán abiertos en Chrome Custom Tabs + Usar Chrome Custom Tabs + Notificaciones push de %1$s + Recibir notificaciones push cuando una actualización para %1$s sea lanzada + Error al guardar el nuevo valor de tiempo + Tiempo de reposo de la secuencia de comandos de la raíz + Ajustar el valor de tiempo de reposo en el script /data/adb/service.d/app.sh, útil para arreglar problemas de montaje + Predeterminado del sistema + Tema + Tema Oscuro + Tema Claro + Centro de Actualizaciones + Sin actualizaciónes nuevas + Variante - No se pudieron guardar los registros - Registros guardados con éxito + No se pudieron guardar los registros + Registros guardados con éxito Detalles - ¡%1$s archivos de instalación detectados! - El Manager detectó que todos los archivos necesarios para la instalación de %1$s se encontraron. ¿Quieres instalarlo? + ¡%1$s archivos de instalación detectados! + El Manager detectó que todos los archivos necesarios para la instalación de %1$s se encontraron. ¿Quieres instalarlo? %1$s Preferencias de instalación - Buscando actualizaciones… + Buscando actualizaciones… Idioma(s): %1$s Tema: %1$s Versión: %1$s - Error - Guía - ¡Detente! + Error + Guía + ¡Detente! Estás usando la versión Magisk/TWRP de Vanced, la cual está descontinuada y no puede ser actualizada usando esta aplicación. Por favor, remuevala eliminando el módulo Magisk o usando el desinstalador TWRP Vanced. - Para instalar Vanced, DEBES desabilitar las optimizaciones MIUI en las opciones de desarrollador. (Puedes ignorar esta advertencia si estás usando un ROM basado en xiaomi.eu 20.2.20 o posterior) - ¡Optimizaciones MIUI habilitadas! - ¡Por favor, NO salga de la aplicación durante este proceso! - Volver a descargar - Asegúrate de haber descargado la app desde vancedapp.com, el grupo de Discord de Vanced, o el GitHub de Vanced + Para instalar Vanced, DEBES desabilitar las optimizaciones MIUI en las opciones de desarrollador. (Puedes ignorar esta advertencia si estás usando un ROM basado en xiaomi.eu 20.2.20 o posterior) + ¡Optimizaciones MIUI habilitadas! + ¡Por favor, NO salga de la aplicación durante este proceso! + Volver a descargar + Asegúrate de haber descargado la app desde vancedapp.com, el grupo de Discord de Vanced, o el GitHub de Vanced Versión - Bienvenido + Bienvenido - Elige tu(s) idioma(s) preferido(s) para Vanced - Más reciente + Elige tu(s) idioma(s) preferido(s) para Vanced + Más reciente Claro + %1$s ¡Seleccione al menos un idioma! - Negro - Oscuro + Negro + Oscuro - Desarrolladores del Manager - Otros colaboradores - Fuentes - Equipo Vanced + Desarrolladores del Manager + Otros colaboradores + Fuentes + Equipo Vanced - Fallo al ejecutar `chown` al propietario del sistema, por favor inténtalo de nuevo. - Error al descargar %1$s + Fallo al ejecutar `chown` al propietario del sistema, por favor inténtalo de nuevo. + Error al descargar %1$s Falla al aplicar el nuevo color de acento - Falla al desinstalar paquete %1$s - Falla al localizar los archivos necesarios para la instalación. Vuelva a descargar los archivos de instalación y vuelva a intentarlo. - Falla al localizar en el almacenamiento el archivo apk para el tema negro/oscuro, por favor intente otra vez. - La instalación ha fallado debido a que el usuario ha abortado la instalación. - La instalación ha fallado porque la aplicación entra en conflicto con una aplicación ya instalada. Desinstala la versión actual de la aplicación y vuelve a intentarlo. - La instalación falló porque el usuario trató de degradar el paquete. Desinstala las actualizaciones de la aplicación original e intenta de nuevo. - La instalación ha fallado por razones desconocidas, únete a nuestro Telegram o Discord para más soporte. Por favor, también adjunta una captura de pantalla desde el menú Avanzado - La instalación ha fallado porque el archivo de instalación es incompatible con tu dispositivo. Limpia los archivos descargados en la ajustes y vuelve a intentarlo. - La instalación falló porque los archivos apk están corruptos, por favor inténtalo de nuevo. - La instalación ha fallado porque la Optimización MIUI está activada. Desactiva la optimización MIUI y vuelva a intentarlo. - La instalación ha fallado porque la verificación de firmas de apk está habilitada. Desactiva la verificación de la firmas de apk, y vuelve a intentarlo. - La instalación falló porque el dispositivo no tiene suficiente espacio libre. - Falla al encontrar en el instalador el archivo apk para el tema negro/oscuro. Limpia los datos del Manager y vuelva a intentarlo. - Falla al localizar la ruta de instalación de YouTube después de la instalación split. + Falla al desinstalar paquete %1$s + Falla al localizar los archivos necesarios para la instalación. Vuelva a descargar los archivos de instalación y vuelva a intentarlo. + Falla al localizar en el almacenamiento el archivo apk para el tema negro/oscuro, por favor intente otra vez. + La instalación ha fallado debido a que el usuario ha abortado la instalación. + La instalación ha fallado porque la aplicación entra en conflicto con una aplicación ya instalada. Desinstala la versión actual de la aplicación y vuelve a intentarlo. + La instalación falló porque el usuario trató de degradar el paquete. Desinstala las actualizaciones de la aplicación original e intenta de nuevo. + La instalación ha fallado por razones desconocidas, únete a nuestro Telegram o Discord para más soporte. Por favor, también adjunta una captura de pantalla desde el menú Avanzado + La instalación ha fallado porque el archivo de instalación es incompatible con tu dispositivo. Limpia los archivos descargados en la ajustes y vuelve a intentarlo. + La instalación falló porque los archivos apk están corruptos, por favor inténtalo de nuevo. + La instalación ha fallado porque la Optimización MIUI está activada. Desactiva la optimización MIUI y vuelva a intentarlo. + La instalación ha fallado porque la verificación de firmas de apk está habilitada. Desactiva la verificación de la firmas de apk, y vuelve a intentarlo. + La instalación falló porque el dispositivo no tiene suficiente espacio libre. + Falla al encontrar en el instalador el archivo apk para el tema negro/oscuro. Limpia los datos del Manager y vuelva a intentarlo. + Falla al localizar la ruta de instalación de YouTube después de la instalación split. diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index afb565464f..c43ffd82c6 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -1,120 +1,120 @@ - Katkesta - Sulge - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Lähtesta - Salvesta - Valige Oma Rakendused + Katkesta + Sulge + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Lähtesta + Salvesta + Valige Oma Rakendused - Teave - Juhend - Haldur - Logid - Seaded - Uuenduste Haldur + Teave + Juhend + Haldur + Logid + Seaded + Uuenduste Haldur - Kas teie seade on juuritud? - Anna juurluba - Alustame - Vali vähemalt üks rakendus! - Kas te ei tea mis see on, või ei soovi kasutada rooditud versiooni? vajutage allpool sinist noolt! + Kas teie seade on juuritud? + Anna juurluba + Alustame + Vali vähemalt üks rakendus! + Kas te ei tea mis see on, või ei soovi kasutada rooditud versiooni? vajutage allpool sinist noolt! - Umbes %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Rakendused - Muudatuste logi - Allalaadimine %1$s - Installi + Umbes %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Rakendused + Muudatuste logi + Allalaadimine %1$s + Installi Uusim: - Installi Vanced MicroG esimesena + Installi Vanced MicroG esimesena Administraatoriõigusi ei tagatud - Sotsiaalmeedia - Toetage meid - Pole saadaval + Sotsiaalmeedia + Toetage meid + Pole saadaval Installitud: - Rõhuvärv - Välimus - Käitumine - Tühjenda allalaaditud failid - Failid on edukalt puhastatud - See lubab meil koguda informatsiooni äpi jõudluse ja rikkelogi kohta - Firebase Analytics - Keel - Lingid avatakse Chrome kohandatud vahekaartides - Kasuta Chrome kohandatud vahekaarte - %1$s Hüpikteated - Saa hüpikteateid kui %1$s uuendus on saadaval - Aja uue väärtuse salvestamine ebaõnnestus - Uneaja skript - Reguleerige uneaja väärtust, mis on kasutatav /data/adb/service.d/app.sh skriptis, see on kasulik paigaldusprobleemide parandamiseks - Süsteemi vaikimisi - Kujundus - Tume Kujundus - Hele Kujundus - Halduri värskenduskeskus - Uusi uuendusi ei ole - Variant + Rõhuvärv + Välimus + Käitumine + Tühjenda allalaaditud failid + Failid on edukalt puhastatud + See lubab meil koguda informatsiooni äpi jõudluse ja rikkelogi kohta + Firebase Analytics + Keel + Lingid avatakse Chrome kohandatud vahekaartides + Kasuta Chrome kohandatud vahekaarte + %1$s Hüpikteated + Saa hüpikteateid kui %1$s uuendus on saadaval + Aja uue väärtuse salvestamine ebaõnnestus + Uneaja skript + Reguleerige uneaja väärtust, mis on kasutatav /data/adb/service.d/app.sh skriptis, see on kasulik paigaldusprobleemide parandamiseks + Süsteemi vaikimisi + Kujundus + Tume Kujundus + Hele Kujundus + Halduri värskenduskeskus + Uusi uuendusi ei ole + Variant - Ei suutnud salvestada logi - Edukalt salvestatud logid + Ei suutnud salvestada logi + Edukalt salvestatud logid Üksikasjad - %1$s paigaldusfailid on leitud! - Haldur tuvastas, et kõik failid paigaldamaks %1$s on leitud. Kas soovite seda paigaldada? + %1$s paigaldusfailid on leitud! + Haldur tuvastas, et kõik failid paigaldamaks %1$s on leitud. Kas soovite seda paigaldada? %1$s Paigalduseelistused - Uuenduste otsimine… + Uuenduste otsimine… Keel(ed): %1$s Kujundus: %1$s Versioon: %1$s - Viga - Juhend - Peata! + Viga + Juhend + Peata! Te kasutate Vanced Magisk/TWRP versiooni, mis on katkestatud, ning seda ei saa uuendada kasutades seda äppi. Palun eemaldage Magisk moodul kasutades TWRP Vanced eemaldajat. - Et paigaldada Vanced, PEAB keelama MIUI optimiseerimise arendaja valikute alt. (Võite seda igroneerida kui kasutate 20.2.20 või uuemat xiaomi.eu põhist ROMi) - MIUI optimiseerimine on lubatud! - Palun ärge väljuge rakendusest protsessi ajal! - Lae uuesti alla - Veenduge, et laadisite rakenduse alla vancedapp.com, Vanced Discordi serverist või Vanced GitHubist + Et paigaldada Vanced, PEAB keelama MIUI optimiseerimise arendaja valikute alt. (Võite seda igroneerida kui kasutate 20.2.20 või uuemat xiaomi.eu põhist ROMi) + MIUI optimiseerimine on lubatud! + Palun ärge väljuge rakendusest protsessi ajal! + Lae uuesti alla + Veenduge, et laadisite rakenduse alla vancedapp.com, Vanced Discordi serverist või Vanced GitHubist Versioon - Tere tulemast + Tere tulemast - Valige eelistatud keel(ed) Vanced jaoks - Uusim + Valige eelistatud keel(ed) Vanced jaoks + Uusim Hele + %1$s Vali vähemalt üks keel! - Must - Tume + Must + Tume - Halduri arendajad - Teised kaastöötajad - Allikad - Vanced Meeskond + Halduri arendajad + Teised kaastöötajad + Allikad + Vanced Meeskond - APK edastamine süsteemi omanikule ebaõnnestus, proovige uuesti. - Viga allalaadimisel %1$s + APK edastamine süsteemi omanikule ebaõnnestus, proovige uuesti. + Viga allalaadimisel %1$s Uue rõhuvärvi rakendamine ebaõnnestus - Paketi %1$s eemaldamine ebaõnnestus - Paigalduseks vajalike failide leidmine ebaõnnestus. Laadige paigaldusfailid uuesti alla ja proovige uuesti. - Apk faili musta/tumeda teema jaoks leidmine ebaõnnestus, proovige palun uuesti. - Paigaldamine ebaõnnestus kuna kasutaja katkestas selle. - Paigaldamine ebaõnnestus, kuna tekkis konflikt olemasoleva versiooniga. Eemaldage praegune rakenduse versioon, ning proovige uuesti. - Paigaldamine ebaõnnestus kuna kasutaja proovis paketti madalamale versioonile üle viia. Eemaldage värskendused originaalrakendusest ja proovige uuesti. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Paigaldamine ebaõnnestus, kuna paigaldusfail ei sobitu teie seadmega. Puhastage allalaaditud failid seadete alt, ning proovige uuesti. - Paigaldamine ebaõnnestus kuna apk failid on vigased, palun proovige uuesti. - Paigaldamine ebaõnnestus, kuna MIUI optimiseerimine on lubatud. Keelake MIUI optimiseerimine ja proovige uuesti. - Paigaldamine ebaõnnestus kuna apk-allkirja kontrollimine on lubatud. Keelake apk allkirja kinnitamine ja proovige uuesti. - Installimist ei saadud viia lõpule kuna seadmes pole piisvalt vaba ruumi. - Apk faili musta/tumeda teema jaoks leidmine paigaldajast ebaõnnestus. Puhastage halduri rakenduse andmed ja proovige uuesti. - Pärast jagatud paigaldamist ei õnnestunud leida originaal YouTube\'i paigaldus asukohta. + Paketi %1$s eemaldamine ebaõnnestus + Paigalduseks vajalike failide leidmine ebaõnnestus. Laadige paigaldusfailid uuesti alla ja proovige uuesti. + Apk faili musta/tumeda teema jaoks leidmine ebaõnnestus, proovige palun uuesti. + Paigaldamine ebaõnnestus kuna kasutaja katkestas selle. + Paigaldamine ebaõnnestus, kuna tekkis konflikt olemasoleva versiooniga. Eemaldage praegune rakenduse versioon, ning proovige uuesti. + Paigaldamine ebaõnnestus kuna kasutaja proovis paketti madalamale versioonile üle viia. Eemaldage värskendused originaalrakendusest ja proovige uuesti. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Paigaldamine ebaõnnestus, kuna paigaldusfail ei sobitu teie seadmega. Puhastage allalaaditud failid seadete alt, ning proovige uuesti. + Paigaldamine ebaõnnestus kuna apk failid on vigased, palun proovige uuesti. + Paigaldamine ebaõnnestus, kuna MIUI optimiseerimine on lubatud. Keelake MIUI optimiseerimine ja proovige uuesti. + Paigaldamine ebaõnnestus kuna apk-allkirja kontrollimine on lubatud. Keelake apk allkirja kinnitamine ja proovige uuesti. + Installimist ei saadud viia lõpule kuna seadmes pole piisvalt vaba ruumi. + Apk faili musta/tumeda teema jaoks leidmine paigaldajast ebaõnnestus. Puhastage halduri rakenduse andmed ja proovige uuesti. + Pärast jagatud paigaldamist ei õnnestunud leida originaal YouTube\'i paigaldus asukohta. diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 1a6fe81e30..1737f8c7ce 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -1,120 +1,120 @@ - Peruuta - Sulje - Mukautettu GMS-Toteutus Vancedille perustuen microG projektiin. - Muokattu YouTube-sovellus, jossa on monia hyödyllisiä ominaisuuksia! - Vanced, mutta YouTube Musicille! Suhteellisen vähemmän ominaisuuksia, mutta täyttää tarpeesi. - Palauta - Tallenna - Valitse Sovelluksesi + Peruuta + Sulje + Mukautettu GMS-Toteutus Vancedille perustuen microG projektiin. + Muokattu YouTube-sovellus, jossa on monia hyödyllisiä ominaisuuksia! + Vanced, mutta YouTube Musicille! Suhteellisen vähemmän ominaisuuksia, mutta täyttää tarpeesi. + Palauta + Tallenna + Valitse Sovelluksesi - Tietoja - Opas - Manager - Lokit - Asetukset - Päivitä hallintasovellus + Tietoja + Opas + Manager + Lokit + Asetukset + Päivitä hallintasovellus - Onko laitteesi rootattu? - Anna root-oikeudet - Aloitetaan - Valitse ainakin yksi sovellus! - Etkö tiedä mikä tämä on tai etkö halua käyttää rootattua versiota? Klikkaa alla olevaa sinistä nuolta! + Onko laitteesi rootattu? + Anna root-oikeudet + Aloitetaan + Valitse ainakin yksi sovellus! + Etkö tiedä mikä tämä on tai etkö halua käyttää rootattua versiota? Klikkaa alla olevaa sinistä nuolta! - %1$s-tietoja - Download - Info - Launch - Reinstall - Uninstall - Update - Sovellukset - Muutoshistoria - Ladataan %1$s - Asenna + %1$s-tietoja + Download + Info + Launch + Reinstall + Uninstall + Update + Sovellukset + Muutoshistoria + Ladataan %1$s + Asenna Uusin: - Asenna Vanced microG ensin + Asenna Vanced microG ensin Pääkäyttäjän oikeuksia ei ole annettu - Sosiaalinen media - Tue meitä - Ei saatavilla + Sosiaalinen media + Tue meitä + Ei saatavilla Asennettu: - Aksenttiväri - Ulkoasu - Käyttäytyminen - Tyhjennä ladatut tiedostot - Tiedostot tyhjennettiin onnistuneesti - Tämän avulla voimme kerätä tietoa sovelluksen suorituskyvystä ja kaatumislokeista - Firebase-analytiikka - Kieli - Linkit aukeavat Chromen mukautetuissa välilehdissä - Käytä Chromen mukautettuja välilehtiä - %1$s Push-ilmoitusta - Vastaanota push-ilmoituksia, kun %1$s:lle on julkaistu päivitys - Uuden ajan tallennus epäonnistui - Juuren Skriptin Nukkumisaika - Säädä lepoajan arvoa jota käytetään /data/adb/service.d/app.sh skriptissä, joka on hyödyllinen asennusongelmien korjaamisessa - Järjestelmän oletus - Teema - Tumma teema - Vaalea teema - Managerin päivityskeskus - Ei uusia päivityksiä - Variaatio + Aksenttiväri + Ulkoasu + Käyttäytyminen + Tyhjennä ladatut tiedostot + Tiedostot tyhjennettiin onnistuneesti + Tämän avulla voimme kerätä tietoa sovelluksen suorituskyvystä ja kaatumislokeista + Firebase-analytiikka + Kieli + Linkit aukeavat Chromen mukautetuissa välilehdissä + Käytä Chromen mukautettuja välilehtiä + %1$s Push-ilmoitusta + Vastaanota push-ilmoituksia, kun %1$s:lle on julkaistu päivitys + Uuden ajan tallennus epäonnistui + Juuren Skriptin Nukkumisaika + Säädä lepoajan arvoa jota käytetään /data/adb/service.d/app.sh skriptissä, joka on hyödyllinen asennusongelmien korjaamisessa + Järjestelmän oletus + Teema + Tumma teema + Vaalea teema + Managerin päivityskeskus + Ei uusia päivityksiä + Variaatio - Lokeja ei voitu tallentaa - Lokit tallennettiin onnistuneesti + Lokeja ei voitu tallentaa + Lokit tallennettiin onnistuneesti Lisätiedot - %1$s asennustiedostoa havaittu! - Hallitsija havaitsi, että kaikki tarvittavat tiedostot %1$s asennusta varten. Haluatko asentaa sen? + %1$s asennustiedostoa havaittu! + Hallitsija havaitsi, että kaikki tarvittavat tiedostot %1$s asennusta varten. Haluatko asentaa sen? %1$s asennusasetukset - Tarkistetaan päivityksiä… + Tarkistetaan päivityksiä… Kieli: %1$s Teema: %1$s Versio: %1$s - Virhe - Opas - Pysähdy! + Virhe + Opas + Pysähdy! Käytät Magisk / TWRP versio Vanced, joka on lopetettu ja ei voi päivittää käyttämällä tätä sovellusta. Poista se poistamalla Magisk moduuli / käyttämällä TWRP Vanced asennuksen. - Asentaaksesi Vancedin, sinun täytyy poistaa MIUI-optimisaatiot käytöstä kehittäjäasetuksista. (Voit ohittaa tämän varoituksen, jos käytät versiota 20.2.20 tai uudempaa xiaomi.eu-pohjaista ROM:ia) - MIUI-optimoinnit ovat käytössä! - ÄLÄ poistu sovelluksesta tämän prosessin aikana! - Uudelleenlataa - Varmista, että latasit sovelluksen osoitteesta vancedapp.com, Vanced Discord-palvelin tai Vanced GitHub + Asentaaksesi Vancedin, sinun täytyy poistaa MIUI-optimisaatiot käytöstä kehittäjäasetuksista. (Voit ohittaa tämän varoituksen, jos käytät versiota 20.2.20 tai uudempaa xiaomi.eu-pohjaista ROM:ia) + MIUI-optimoinnit ovat käytössä! + ÄLÄ poistu sovelluksesta tämän prosessin aikana! + Uudelleenlataa + Varmista, että latasit sovelluksen osoitteesta vancedapp.com, Vanced Discord-palvelin tai Vanced GitHub Versio - Tervetuloa + Tervetuloa - Valitse Vancedille haluamasi kieli tai kielet - Uusin + Valitse Vancedille haluamasi kieli tai kielet + Uusin Vaalea + %1$s Valitse ainakin yksi kieli! - Musta - Tumma + Musta + Tumma - Managerin kehittäjät - Muut avustajat - Lähdekoodi - Vanced kehitystiimi + Managerin kehittäjät + Muut avustajat + Lähdekoodi + Vanced kehitystiimi - Ei voitu `chown` APK järjestelmän omistajalle, yritä uudelleen. - %1$s lataus epäonnistui + Ei voitu `chown` APK järjestelmän omistajalle, yritä uudelleen. + %1$s lataus epäonnistui Uuden aksenttivärin käyttöönotto epäonnistui - Paketin %1$s asennus epäonnistui - Asennukseen vaadittavien tiedostojen paikannus epäonnistui. Yritä ladata asennustiedostot uudelleen. - APK-tiedostoa mustalle/tummalle teemalle ei voitu paikantaa tallennustilasta, yritä uudelleen. - Asennus epäonnistui, koska käyttäjä keskeytti asennuksen. - Asennus epäonnistui, koska sovellus on ristiriidassa jo asennetun sovelluksen kanssa. Poista sovelluksen nykyinen versio ja yritä uudelleen. - Asennus epäonnistui, koska käyttäjä yritti asentaa paketin vanhempaa versiota. Poista YouTube-sovelluksen päivitykset ja yritä sitten uudelleen. - Asennus epäonnistui tuntemattomasta syystä, liity Vancedin Telegramiin tai Discordiin saadaksesi tukea. Liitä myös kuvankaappaus Lisäasetukset valikosta - Asennus epäonnistui, koska asennustiedosto ei ole yhteensopiva laitteesi kanssa. Tyhjennä ladatut tiedostot asetuksista ja yritä uudelleen. - Asennus epäonnistui, koska APK-tiedostot ovat vioittuneet, yritä uudelleen. - Asennus epäonnistui, koska MIUI-optimointi on käytössä. Poista MIUI-optimointi käytöstä ja yritä uudelleen. - Asennus epäonnistui, koska APK-allekirjoituksen vahvistus on käytössä. Poista APK-allekirjoituksen vahvistus käytöstä, ja yritä uudelleen. - Asennus epäonnistui, koska laitteella ei ole tarpeeksi vapaata tilaa. - APK-tiedostoa mustalle/tummalle teemalle ei löytynyt asentajalta. Tyhjennä Managerin sovellustiedot ja yritä uudelleen. - Youtube-sovelluksen asennuspolkua ei voitu paikantaa jaetun asennuksen jälkeen. + Paketin %1$s asennus epäonnistui + Asennukseen vaadittavien tiedostojen paikannus epäonnistui. Yritä ladata asennustiedostot uudelleen. + APK-tiedostoa mustalle/tummalle teemalle ei voitu paikantaa tallennustilasta, yritä uudelleen. + Asennus epäonnistui, koska käyttäjä keskeytti asennuksen. + Asennus epäonnistui, koska sovellus on ristiriidassa jo asennetun sovelluksen kanssa. Poista sovelluksen nykyinen versio ja yritä uudelleen. + Asennus epäonnistui, koska käyttäjä yritti asentaa paketin vanhempaa versiota. Poista YouTube-sovelluksen päivitykset ja yritä sitten uudelleen. + Asennus epäonnistui tuntemattomasta syystä, liity Vancedin Telegramiin tai Discordiin saadaksesi tukea. Liitä myös kuvankaappaus Lisäasetukset valikosta + Asennus epäonnistui, koska asennustiedosto ei ole yhteensopiva laitteesi kanssa. Tyhjennä ladatut tiedostot asetuksista ja yritä uudelleen. + Asennus epäonnistui, koska APK-tiedostot ovat vioittuneet, yritä uudelleen. + Asennus epäonnistui, koska MIUI-optimointi on käytössä. Poista MIUI-optimointi käytöstä ja yritä uudelleen. + Asennus epäonnistui, koska APK-allekirjoituksen vahvistus on käytössä. Poista APK-allekirjoituksen vahvistus käytöstä, ja yritä uudelleen. + Asennus epäonnistui, koska laitteella ei ole tarpeeksi vapaata tilaa. + APK-tiedostoa mustalle/tummalle teemalle ei löytynyt asentajalta. Tyhjennä Managerin sovellustiedot ja yritä uudelleen. + Youtube-sovelluksen asennuspolkua ei voitu paikantaa jaetun asennuksen jälkeen. diff --git a/app/src/main/res/values-fil-rPH/strings.xml b/app/src/main/res/values-fil-rPH/strings.xml index 628d052cc4..fed16f97b6 100644 --- a/app/src/main/res/values-fil-rPH/strings.xml +++ b/app/src/main/res/values-fil-rPH/strings.xml @@ -1,120 +1,120 @@ - Kanselahin - Isara - Custom na Implementasyon sa GMS para sa Vanced nakabatay sa proyekto ng microG. - Binagong client ng Youtube na maraming nakatutulong na features! - Vanced, pero para sa Youtube Music! Hindi kasing dami ang mga features, pero natutupad ang iyong pangangailangan. - I-reset - I-save - Piliin ang mga app + Kanselahin + Isara + Custom na Implementasyon sa GMS para sa Vanced nakabatay sa proyekto ng microG. + Binagong client ng Youtube na maraming nakatutulong na features! + Vanced, pero para sa Youtube Music! Hindi kasing dami ang mga features, pero natutupad ang iyong pangangailangan. + I-reset + I-save + Piliin ang mga app - Tungkol sa app - Gabay - Manager - Mga Log - Settings - I-update ang Manager + Tungkol sa app + Gabay + Manager + Mga Log + Settings + I-update ang Manager - Naka-root ba ang device mo? - Pahintulutin ang Root - Magsimula na tayo - Mag-marka ka kahit isa lang na app! - Hindi mo alam ito o huwag gamitin ang root bersyon? I-click ang asul na arrow sa baba! + Naka-root ba ang device mo? + Pahintulutin ang Root + Magsimula na tayo + Mag-marka ka kahit isa lang na app! + Hindi mo alam ito o huwag gamitin ang root bersyon? I-click ang asul na arrow sa baba! - Tungkol sa %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Mga Apps - Changelog - Downloading %1$s - I-install + Tungkol sa %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Mga Apps + Changelog + Downloading %1$s + I-install Bago: - I-install muna ang Vanced microG + I-install muna ang Vanced microG Walang binigay na root access - Social Media - Suportahin kami - Di-makukuha + Social Media + Suportahin kami + Di-makukuha Naka-install: - Kulay ng font - Hitsura - Kilos - Tanggalin ang naka-download na files - Natagumpayan na tanggalin ang mga files - Ginagamit ito para sa pag-kolekta ng impormasyon tungkol sa pagganap at crash logs ng app - Firebase Analitiko - Wika - Mabubuksan ang mga links sa Chrome Custom Tabs - Gamitin ang Chrome Custom Tabs - %1$s Push Notifications - Tumanggap ng push notifications kapag ang update sa %1$s ay nailabas - Nabigo na i-save ang bagong time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - Sistemang Default - Tema - Itim na tema - Puti na tema - Manager Update Center - Walang bagong update - Klase + Kulay ng font + Hitsura + Kilos + Tanggalin ang naka-download na files + Natagumpayan na tanggalin ang mga files + Ginagamit ito para sa pag-kolekta ng impormasyon tungkol sa pagganap at crash logs ng app + Firebase Analitiko + Wika + Mabubuksan ang mga links sa Chrome Custom Tabs + Gamitin ang Chrome Custom Tabs + %1$s Push Notifications + Tumanggap ng push notifications kapag ang update sa %1$s ay nailabas + Nabigo na i-save ang bagong time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + Sistemang Default + Tema + Itim na tema + Puti na tema + Manager Update Center + Walang bagong update + Klase - Hindi ma-save ang logs - Natagumpay na i-save ang logs + Hindi ma-save ang logs + Natagumpay na i-save ang logs Mga Detalye - %1$s Nandito ang installation files! - Nakita ng Manager na lahat na kailangan para sa %1$s installation ay nahanap. Gusto mo bang i-install? + %1$s Nandito ang installation files! + Nakita ng Manager na lahat na kailangan para sa %1$s installation ay nahanap. Gusto mo bang i-install? %1$s Kagustuhan sa Pag-install - Naghahanap ng mga updates… + Naghahanap ng mga updates… (Mga) Wika: %1$s Tema: %1$s Bersyon: %1$s - May pagkamali - Gabay - Itigil! + May pagkamali + Gabay + Itigil! Gumagamit ka ng Magisk/TWRP na bersyon ng Vanced, dahil hindi iyon pinatuloy at hindi mai-uupdate gamit nitong app. Tanggalin po ang Magisk module sa pamamagitan ng TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - I-download ulit - Siguraduhin mo na nai-download mo ang app galing sa vancedapp.com, o sa Discord server ng Vanced, o sa Github ng Vanced + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + I-download ulit + Siguraduhin mo na nai-download mo ang app galing sa vancedapp.com, o sa Discord server ng Vanced, o sa Github ng Vanced Bersyon - Maligayang Pagdating + Maligayang Pagdating - Piliin ang ikinagugustong (mga) wika sa Vanced - Pinakabago + Piliin ang ikinagugustong (mga) wika sa Vanced + Pinakabago Puti + %1$s Kumuha ka kahit isang wika! - Itim - Madilim + Itim + Madilim - Manager Devs - Other Contributors - Pinagkukunan - Pangkat Vanced + Manager Devs + Other Contributors + Pinagkukunan + Pangkat Vanced - Nabigo sa `pag-chown` ng APK sa system owner, ulitin muli. - May pagkamali sa pag-download %1$s + Nabigo sa `pag-chown` ng APK sa system owner, ulitin muli. + May pagkamali sa pag-download %1$s Nabigo na gamitin ang bagong kulay aksento - Nabigo sa pag-uninstall ng pakete %1$s - Nabigo ang paghanap sa kailangan na files para sa installation. I-download ulit ang mga installation files, at ulitin muli. - Nabigo ang paghanap ng apk file para sa itim na tema galing sa storage, ulitin muli. - Nabigo ang pag-install dahil kinansela ito. - Nabigo ang pag-install dahil meron hidwaan sa naka-install na app. I-uninstall ang kasalukuyang bersyon ng Vanced, at ulitin muli. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Nabigo ang pag-install dahil ang installation file ay hindi tugma sa iyong device. Tanggalin ang mga downloaded files sa Settings, at ulitin muli. - Nabigo ang pag-install dahil ang mga apk files ay nasira, ulitin muli. - Nabigo ang pag-install dahil ang MIUI Optimization ay naka-on. Patayin ang MIUI Optimization, at ulitin muli. - Nabigo ang pag-install dahil ang apk signature verification ay naka-on. Patayin ang apk signature verification, at ulitin muli. - Installation failed because the device doesn\'t have enough free space. - Nabigong hanapin ang apk file para sa itim na tema galing sa installer. Tanggalin ang app data ng Manager, tapos ulitin. - Nabigong hanapin ang stock YouTube installation path pagkatapos ng split installation. + Nabigo sa pag-uninstall ng pakete %1$s + Nabigo ang paghanap sa kailangan na files para sa installation. I-download ulit ang mga installation files, at ulitin muli. + Nabigo ang paghanap ng apk file para sa itim na tema galing sa storage, ulitin muli. + Nabigo ang pag-install dahil kinansela ito. + Nabigo ang pag-install dahil meron hidwaan sa naka-install na app. I-uninstall ang kasalukuyang bersyon ng Vanced, at ulitin muli. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Nabigo ang pag-install dahil ang installation file ay hindi tugma sa iyong device. Tanggalin ang mga downloaded files sa Settings, at ulitin muli. + Nabigo ang pag-install dahil ang mga apk files ay nasira, ulitin muli. + Nabigo ang pag-install dahil ang MIUI Optimization ay naka-on. Patayin ang MIUI Optimization, at ulitin muli. + Nabigo ang pag-install dahil ang apk signature verification ay naka-on. Patayin ang apk signature verification, at ulitin muli. + Installation failed because the device doesn\'t have enough free space. + Nabigong hanapin ang apk file para sa itim na tema galing sa installer. Tanggalin ang app data ng Manager, tapos ulitin. + Nabigong hanapin ang stock YouTube installation path pagkatapos ng split installation. diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 7f66918f36..737c23fdb8 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -1,120 +1,120 @@ - Annuler - Fermer - Une implémentation GMS personnalisée pour Vanced basée sur le projet microG. - Un client YouTube modifié avec de nombreuses fonctionnalités utiles ! - Vanced, mais pour YouTube Music ! Relativement moins riche en fonctionnalités mais répond à vos besoins. - Réinitialiser - Sauvegarder - Sélectionnez vos applications + Annuler + Fermer + Une implémentation GMS personnalisée pour Vanced basée sur le projet microG. + Un client YouTube modifié avec de nombreuses fonctionnalités utiles ! + Vanced, mais pour YouTube Music ! Relativement moins riche en fonctionnalités mais répond à vos besoins. + Réinitialiser + Sauvegarder + Sélectionnez vos applications - À propos - Guide - Gestionnaire - Journaux - Paramètres - Gestionnaire de Mise à Jour + À propos + Guide + Gestionnaire + Journaux + Paramètres + Gestionnaire de Mise à Jour - Votre appareil est-il rooté ? - Accorder l’accès root - Commençons - Sélectionnez au moins une application ! - Vous ne savez pas ce que c\'est ou vous ne voulez pas utiliser la version « root » ? Cliquez simplement sur la flèche bleue ci-dessous ! + Votre appareil est-il rooté ? + Accorder l’accès root + Commençons + Sélectionnez au moins une application ! + Vous ne savez pas ce que c\'est ou vous ne voulez pas utiliser la version « root » ? Cliquez simplement sur la flèche bleue ci-dessous ! - À propos de %1$s - Télécharger - Informations - Lancer - Réinstaller - Désinstaller - Mettre à jour - Applications - Changelog - Téléchargement de %1$s - Installer + À propos de %1$s + Télécharger + Informations + Lancer + Réinstaller + Désinstaller + Mettre à jour + Applications + Changelog + Téléchargement de %1$s + Installer Dernière version: - Installez d\'abord Vanced microG + Installez d\'abord Vanced microG Accès root non autorisé - Réseaux sociaux - Soutenez-nous - Indisponible + Réseaux sociaux + Soutenez-nous + Indisponible Version installée: - Couleur d\'accentuation - Apparence - Comportement - Effacer les fichiers téléchargés - Données effacées avec succès - Cela nous permet de recueillir des informations sur les performances de l\'application et les journaux de bord - Analyses Firebase - Langue - Les liens s\'ouvriront dans les onglets personnalisés Chrome - Utiliser les onglets personnalisés Chrome - %1$s Notifications Push - Recevoir une notification push quand une nouvelle version pour %1$s est publiée - Impossible d\'enregistrer la nouvelle valeur de temps - Temps de veille du script root - Ajuster la valeur de l\'heure de veille utilisée dans le script /data/adb/service.d/app.sh, utile pour résoudre les problèmes de montage - Système par défaut - Thème - Thème sombre - Thème clair - Centre de mise à jour du Manager - Aucune nouvelle mise à jour - Variante + Couleur d\'accentuation + Apparence + Comportement + Effacer les fichiers téléchargés + Données effacées avec succès + Cela nous permet de recueillir des informations sur les performances de l\'application et les journaux de bord + Analyses Firebase + Langue + Les liens s\'ouvriront dans les onglets personnalisés Chrome + Utiliser les onglets personnalisés Chrome + %1$s Notifications Push + Recevoir une notification push quand une nouvelle version pour %1$s est publiée + Impossible d\'enregistrer la nouvelle valeur de temps + Temps de veille du script root + Ajuster la valeur de l\'heure de veille utilisée dans le script /data/adb/service.d/app.sh, utile pour résoudre les problèmes de montage + Système par défaut + Thème + Thème sombre + Thème clair + Centre de mise à jour du Manager + Aucune nouvelle mise à jour + Variante - Impossible d\'enregistrer les journaux - Journaux enregistrés avec succès + Impossible d\'enregistrer les journaux + Journaux enregistrés avec succès Détails - %1$s fichiers d\'installation détectés ! - Le gestionnaire a détecté que tous les fichiers nécessaires à l\'installation de %1$s ont été trouvés. Voulez-vous installer ? + %1$s fichiers d\'installation détectés ! + Le gestionnaire a détecté que tous les fichiers nécessaires à l\'installation de %1$s ont été trouvés. Voulez-vous installer ? %1$s Préférences d\'installation - Vérification des mises à jour… + Vérification des mises à jour… Langue(s) : %1$s Thème : %1$s Version : %1$s - Erreur - Guide - Stop! + Erreur + Guide + Stop! Vous utilisez la version Magisk/TWRP de Vanced, qui n\'est plus entretenu et ne peut pas être mise à jour à l\'aide de cette application. Veuillez la retirer en supprimant le module Magisk/en utilisant le désinstallateur TWRP pour Vanced. - Afin d\'installer Vanced, vous DEVEZ désactiver les optimisations MIUI dans les paramètres développeur (vous pouvez ignorer cet avertissement si vous utilisez une ROM basée sur 20.2.20 ou ultérieure de xiaomi.eu) - Les optimisations MIUI sont activées ! - Veuillez NE PAS quitter l\'application pendant que celle-ci est en cours de modification ! - Re-télécharger - Assurez-vous d\'avoir téléchargé l\'application depuis vancedapp.com, le serveur Discord Vanced ou sur le Github Vanced + Afin d\'installer Vanced, vous DEVEZ désactiver les optimisations MIUI dans les paramètres développeur (vous pouvez ignorer cet avertissement si vous utilisez une ROM basée sur 20.2.20 ou ultérieure de xiaomi.eu) + Les optimisations MIUI sont activées ! + Veuillez NE PAS quitter l\'application pendant que celle-ci est en cours de modification ! + Re-télécharger + Assurez-vous d\'avoir téléchargé l\'application depuis vancedapp.com, le serveur Discord Vanced ou sur le Github Vanced Version - Bienvenue + Bienvenue - Choisir votre langage(s) préféré(s) pour Vanced - Dernière version + Choisir votre langage(s) préféré(s) pour Vanced + Dernière version Lumière + %1$s Sélectionnez au moins une langue ! - Noir - Sombre + Noir + Sombre - Développeurs du Manager - Autres Contributeurs - Sources - Équipe Vanced + Développeurs du Manager + Autres Contributeurs + Sources + Équipe Vanced - Échec de la commande `chown` APK vers le propriétaire du système, veuillez réessayer. - Erreur en téléchargeant %1$s + Échec de la commande `chown` APK vers le propriétaire du système, veuillez réessayer. + Erreur en téléchargeant %1$s Impossible d\'appliquer la nouvelle couleur d\'accentuation - N\'a pas pu désinstaller le paquet %1$s - Impossible de localiser les fichiers nécessaires à l\'installation. Retéléchargez les fichiers d\'installation, puis réessayez. - Impossible de localiser le fichier apk pour le thème noir/foncé, veuillez réessayer. - L\'installation a échoué car l\'utilisateur a abandonné l\'installation. - L\'installation a échoué parce que l\'application est en conflit avec une application déjà installée. Désinstallez la version actuelle de Vanced, puis réessayez. - L\'installation a échoué parce que l\'utilisateur a essayé de downgrader le paquet. Désinstallez les mises à jour de l\'application d\'origine, puis réessayez. - L\'installation a échoué pour des raisons inconnues, rejoignez notre Telegram ou Discord pour plus de support. Veuillez également joindre une capture d\'écran dans le menu Avancé - L\'installation a échoué parce que le fichier d\'installation est incompatible avec votre appareil. Effacer les fichiers téléchargés dans les paramètres, puis réessayer. - L\'installation a échouée car les fichiers apk sont corrompus, veuillez réessayer. - L\'installation a échouée car l\'optimisation MIUI est activée. Désactivez l\'optimisation MIUI, puis réessayez. - L\'installation a échoué car la vérification de la signature apk est activée. Désactivez la vérification de la signature apk, puis réessayez. - L\'installation a échoué car l\'appareil n\'a pas assez d\'espace disponible. - Impossible de trouver le fichier apk pour le thème noir/foncé de l\'installateur. Effacez les données de l\'application de Manager, puis réessayez. - Impossible de localiser le chemin d\'installation du YouTube original après l\'installation fractionnée. + N\'a pas pu désinstaller le paquet %1$s + Impossible de localiser les fichiers nécessaires à l\'installation. Retéléchargez les fichiers d\'installation, puis réessayez. + Impossible de localiser le fichier apk pour le thème noir/foncé, veuillez réessayer. + L\'installation a échoué car l\'utilisateur a abandonné l\'installation. + L\'installation a échoué parce que l\'application est en conflit avec une application déjà installée. Désinstallez la version actuelle de Vanced, puis réessayez. + L\'installation a échoué parce que l\'utilisateur a essayé de downgrader le paquet. Désinstallez les mises à jour de l\'application d\'origine, puis réessayez. + L\'installation a échoué pour des raisons inconnues, rejoignez notre Telegram ou Discord pour plus de support. Veuillez également joindre une capture d\'écran dans le menu Avancé + L\'installation a échoué parce que le fichier d\'installation est incompatible avec votre appareil. Effacer les fichiers téléchargés dans les paramètres, puis réessayer. + L\'installation a échouée car les fichiers apk sont corrompus, veuillez réessayer. + L\'installation a échouée car l\'optimisation MIUI est activée. Désactivez l\'optimisation MIUI, puis réessayez. + L\'installation a échoué car la vérification de la signature apk est activée. Désactivez la vérification de la signature apk, puis réessayez. + L\'installation a échoué car l\'appareil n\'a pas assez d\'espace disponible. + Impossible de trouver le fichier apk pour le thème noir/foncé de l\'installateur. Effacez les données de l\'application de Manager, puis réessayez. + Impossible de localiser le chemin d\'installation du YouTube original après l\'installation fractionnée. diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d8f40eb42b..287ac63fb6 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -1,120 +1,120 @@ - रद्द करें - बंद करे - MicroG प्रोजेक्ट के आधार पर Vanced के लिए एक कस्टम GMS कार्यान्वयन। - कई उपयोगी सुविधाओं के साथ एक संशोधित यूट्यूब क्लाइंट! - Vanced, लेकिन यूट्यूब संगीत के लिए! तुलना में कम सुविधा संपन्न लेकिन आपकी आवश्यकताओं को पूरा करता है। - रिसेट - सहेजें - अपने ऐप्स चुनें + रद्द करें + बंद करे + MicroG प्रोजेक्ट के आधार पर Vanced के लिए एक कस्टम GMS कार्यान्वयन। + कई उपयोगी सुविधाओं के साथ एक संशोधित यूट्यूब क्लाइंट! + Vanced, लेकिन यूट्यूब संगीत के लिए! तुलना में कम सुविधा संपन्न लेकिन आपकी आवश्यकताओं को पूरा करता है। + रिसेट + सहेजें + अपने ऐप्स चुनें - हमारे बारे में - गाइड - मैनेजर - लॉग - सेटिंग्स - अपडेट प्रबंधक + हमारे बारे में + गाइड + मैनेजर + लॉग + सेटिंग्स + अपडेट प्रबंधक - क्या आपका डिवाइस रुट किया गया है? - रूट की अनुमति प्रदान करें - चलिए शुरू करते है - कम से कम एक ऐप चुनें! - नहीं जानते ये क्या है या रूट वर्जन इस्तेमाल नहीं करना चाहते? बस नीचे वाला बटन दबाइए! + क्या आपका डिवाइस रुट किया गया है? + रूट की अनुमति प्रदान करें + चलिए शुरू करते है + कम से कम एक ऐप चुनें! + नहीं जानते ये क्या है या रूट वर्जन इस्तेमाल नहीं करना चाहते? बस नीचे वाला बटन दबाइए! - %1$s के बारे में - Download - Info - Launch - Reinstall - Uninstall - Update - ऐप - परिवर्तन पत्र - डाउनलोड हो रहा है %1$s - इंस्टॉल + %1$s के बारे में + Download + Info + Launch + Reinstall + Uninstall + Update + ऐप + परिवर्तन पत्र + डाउनलोड हो रहा है %1$s + इंस्टॉल सबसे नया - सबसे पहले Vanced microG इंस्टॉल करें + सबसे पहले Vanced microG इंस्टॉल करें रूट एक्सेस प्रदान नहीं किया गया - सोशल मीडिया - हमें सहयोग दीजिये - अनुपलब्ध + सोशल मीडिया + हमें सहयोग दीजिये + अनुपलब्ध इंस्टॉल हुआ। - ऊपरी रंग - दिखावट - व्यवहार - डाउनलोड की गई फ़ाइलें साफ़ करें - फ़ाइलें सफलतापूर्वक साफ़ की गई - इससे हम एप्लिकेशन प्रदर्शन और क्रैश लॉग के बारे में जानकारी एकत्र कर सकते हैं - फायरबेस वैश्लेषिकी - भाषा - क्रोम कस्टम टैब में लिंक खुलेंगे - क्रोम कस्टम टैब का उपयोग करें - %1$s पुश सूचनाएँ - जब %1$s का अपडेट जारी किया जाता है, तो पुश सूचनाएँ प्राप्त करें - नया समय मान सहेजने में विफल - रूट स्क्रिप्ट स्लीप का समय - बढ़ते मुद्दों को ठीक करने के लिए उपयोगी /data/adb/service.d/app.sh स्क्रिप्ट में उपयोग की गई नींद के समय को समायोजित करें - सिस्टम डिफ़ॉल्ट - थीम - डार्क थीम - लाइट थीम - मैनेजर अपडेट केंद्र - कोई नया अपडेट नहीं - संस्करण + ऊपरी रंग + दिखावट + व्यवहार + डाउनलोड की गई फ़ाइलें साफ़ करें + फ़ाइलें सफलतापूर्वक साफ़ की गई + इससे हम एप्लिकेशन प्रदर्शन और क्रैश लॉग के बारे में जानकारी एकत्र कर सकते हैं + फायरबेस वैश्लेषिकी + भाषा + क्रोम कस्टम टैब में लिंक खुलेंगे + क्रोम कस्टम टैब का उपयोग करें + %1$s पुश सूचनाएँ + जब %1$s का अपडेट जारी किया जाता है, तो पुश सूचनाएँ प्राप्त करें + नया समय मान सहेजने में विफल + रूट स्क्रिप्ट स्लीप का समय + बढ़ते मुद्दों को ठीक करने के लिए उपयोगी /data/adb/service.d/app.sh स्क्रिप्ट में उपयोग की गई नींद के समय को समायोजित करें + सिस्टम डिफ़ॉल्ट + थीम + डार्क थीम + लाइट थीम + मैनेजर अपडेट केंद्र + कोई नया अपडेट नहीं + संस्करण - लॉग नहीं सहेजे गए - सफलतापूर्वक लॉग सहेजे गए + लॉग नहीं सहेजे गए + सफलतापूर्वक लॉग सहेजे गए विवरण - %1$s इंस्टालेशन फ़ाइलों का पता चला! - प्रबंधक ने पाया कि %1$s इंस्टॉलेशन के लिए सभी आवश्यक फाइलें मिलीं। क्या आप इंस्टॉल करना चाहते हैं? + %1$s इंस्टालेशन फ़ाइलों का पता चला! + प्रबंधक ने पाया कि %1$s इंस्टॉलेशन के लिए सभी आवश्यक फाइलें मिलीं। क्या आप इंस्टॉल करना चाहते हैं? %1$s इंस्टालेशन प्राथमिकताएँ - अपडेट्स के लिए जांच हो रही है… + अपडेट्स के लिए जांच हो रही है… भाषा (एं): %1$s थीम:%1$s संस्करण:%1$s - त्रुटि - गाइड - रुकें! + त्रुटि + गाइड + रुकें! आप Vanced के Magisk / TWRP संस्करण का उपयोग कर रहे हैं, जिसे बंद कर दिया गया है और इस ऐप का उपयोग करके अपडेट नहीं किया जा सकता है। कृपया इस Magisk मॉड्यूल को हटाकर / TWRP Vanced uninstaller का उपयोग करके हटा दें। - Vanced इनस्टॉल करने के लिए, आप डेवलपर सेटिंग में MIUI ऑप्टिमाइज़ेशन को निष्क्रिय करें। (यदि आप 20.2.20 या बाद में xiaomi.eu आधारित ROM का उपयोग कर रहे हैं तो आप इस चेतावनी को अनदेखा कर सकते हैं) - MIUI Optimizations सक्षम हैं! - कृपया इस प्रक्रिया के दौरान ऐप को बंद ना करें! - फिर से डाउनलोड करें - सुनिश्चित करें कि आपने vancedapp.com, Vanced Discord सर्वर, या Vanced GitHub से ऐप डाउनलोड किया है + Vanced इनस्टॉल करने के लिए, आप डेवलपर सेटिंग में MIUI ऑप्टिमाइज़ेशन को निष्क्रिय करें। (यदि आप 20.2.20 या बाद में xiaomi.eu आधारित ROM का उपयोग कर रहे हैं तो आप इस चेतावनी को अनदेखा कर सकते हैं) + MIUI Optimizations सक्षम हैं! + कृपया इस प्रक्रिया के दौरान ऐप को बंद ना करें! + फिर से डाउनलोड करें + सुनिश्चित करें कि आपने vancedapp.com, Vanced Discord सर्वर, या Vanced GitHub से ऐप डाउनलोड किया है संस्करण - स्वागत है! + स्वागत है! - Vanced के लिए अपनी पसंदीदा भाषा (ए) चुनें - नवीनतम + Vanced के लिए अपनी पसंदीदा भाषा (ए) चुनें + नवीनतम लाइट +%1$s कम से कम एक भाषा का चयन करें! - काला - डार्क + काला + डार्क - प्रबंधक डेवलपर्स - अन्य योगदानकर्ता - स्रोत - वांसड टीम + प्रबंधक डेवलपर्स + अन्य योगदानकर्ता + स्रोत + वांसड टीम - सिस्टम के मालिक को APK को Chown करने में विफल, फिर से प्रयास करें। - डाउनलोड करने में त्रुटि %1$s + सिस्टम के मालिक को APK को Chown करने में विफल, फिर से प्रयास करें। + डाउनलोड करने में त्रुटि %1$s नया ऊपरी रंग लागू करने में विफल - पैकेज की स्थापना रद्द करने में विफल %1$s - स्थापना के लिए आवश्यक फ़ाइलों का पता लगाने में विफल। स्थापना फ़ाइलों को फिर से डाउनलोड करें, फिर पुनः प्रयास करें। - भंडारण से काले / अंधेरे विषय के लिए apk फ़ाइल खोजने में विफल, कृपया पुनः प्रयास करें। - स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी। - इंस्टॉलेशन विफल रहा क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है। Vanced के वर्तमान संस्करण को अनइंस्टॉल करें, फिर पुनः प्रयास करें। - स्थापना विफल रही क्योंकि उपयोगकर्ता ने पैकेज को डाउनग्रेड करने का प्रयास किया। स्टॉक ऐप से अपडेट अनइंस्टॉल करें, फिर प्रयास करें। - अज्ञात कारणों से इंस्टॉलेशन विफल हो गया, आगे के समर्थन के लिए हमारे टेलीग्राम या डिस्कॉर्ड में शामिल हों। कृपया उन्नत मेनू से स्क्रीनशॉट भी संलग्न करें । - इंस्टॉलेशन विफल हो गया क्योंकि इंस्टॉलेशन फ़ाइल आपके डिवाइस के साथ असंगत है। सेटिंग्स में डाउनलोड की गई फ़ाइलों को साफ़ करें, फिर प्रयास करें। - स्थापना विफल रही क्योंकि एपीके फ़ाइलें दूषित हैं, कृपया पुनः प्रयास करें। - MIUI ऑप्टिमाइज़ेशन सक्षम होने के कारण स्थापना विफल रही। MIUI ऑप्टिमाइज़ेशन अक्षम करें, फिर प्रयास करें। - स्थापना विफल रही क्योंकि एपीके हस्ताक्षर सत्यापन सक्षम है। एपीके हस्ताक्षर सत्यापन अक्षम करें, फिर प्रयास करें। - इंस्टॉलेशन विफल हो गया क्योंकि डिवाइस में पर्याप्त खाली जगह नहीं है। - इंस्टॉलर से ब्लैक / डार्क थीम के लिए एपीके फ़ाइल खोजने में विफल। प्रबंधक का एप्लिकेशन डेटा साफ़ करें, फिर प्रयास करें। - विभाजन स्थापना के बाद स्टॉक YouTube इंस्टॉलेशन पथ का पता लगाने में विफल + पैकेज की स्थापना रद्द करने में विफल %1$s + स्थापना के लिए आवश्यक फ़ाइलों का पता लगाने में विफल। स्थापना फ़ाइलों को फिर से डाउनलोड करें, फिर पुनः प्रयास करें। + भंडारण से काले / अंधेरे विषय के लिए apk फ़ाइल खोजने में विफल, कृपया पुनः प्रयास करें। + स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी। + इंस्टॉलेशन विफल रहा क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है। Vanced के वर्तमान संस्करण को अनइंस्टॉल करें, फिर पुनः प्रयास करें। + स्थापना विफल रही क्योंकि उपयोगकर्ता ने पैकेज को डाउनग्रेड करने का प्रयास किया। स्टॉक ऐप से अपडेट अनइंस्टॉल करें, फिर प्रयास करें। + अज्ञात कारणों से इंस्टॉलेशन विफल हो गया, आगे के समर्थन के लिए हमारे टेलीग्राम या डिस्कॉर्ड में शामिल हों। कृपया उन्नत मेनू से स्क्रीनशॉट भी संलग्न करें । + इंस्टॉलेशन विफल हो गया क्योंकि इंस्टॉलेशन फ़ाइल आपके डिवाइस के साथ असंगत है। सेटिंग्स में डाउनलोड की गई फ़ाइलों को साफ़ करें, फिर प्रयास करें। + स्थापना विफल रही क्योंकि एपीके फ़ाइलें दूषित हैं, कृपया पुनः प्रयास करें। + MIUI ऑप्टिमाइज़ेशन सक्षम होने के कारण स्थापना विफल रही। MIUI ऑप्टिमाइज़ेशन अक्षम करें, फिर प्रयास करें। + स्थापना विफल रही क्योंकि एपीके हस्ताक्षर सत्यापन सक्षम है। एपीके हस्ताक्षर सत्यापन अक्षम करें, फिर प्रयास करें। + इंस्टॉलेशन विफल हो गया क्योंकि डिवाइस में पर्याप्त खाली जगह नहीं है। + इंस्टॉलर से ब्लैक / डार्क थीम के लिए एपीके फ़ाइल खोजने में विफल। प्रबंधक का एप्लिकेशन डेटा साफ़ करें, फिर प्रयास करें। + विभाजन स्थापना के बाद स्टॉक YouTube इंस्टॉलेशन पथ का पता लगाने में विफल diff --git a/app/src/main/res/values-hr-rHR/strings.xml b/app/src/main/res/values-hr-rHR/strings.xml index 61280abf28..7482d6370d 100644 --- a/app/src/main/res/values-hr-rHR/strings.xml +++ b/app/src/main/res/values-hr-rHR/strings.xml @@ -1,120 +1,120 @@ - Odustani - Zatvori - Prilagođena GMS implementacija za Vanced zasnovana na microG projektu. - Modificirani YouTube klijent sa mnogo korisnih značajki! - Vanced, ali za YouTube Music! S manje značajki ali ispunjava vaše potrebe. - Resetiraj - Spremi - Odaberite svoje aplikacije + Odustani + Zatvori + Prilagođena GMS implementacija za Vanced zasnovana na microG projektu. + Modificirani YouTube klijent sa mnogo korisnih značajki! + Vanced, ali za YouTube Music! S manje značajki ali ispunjava vaše potrebe. + Resetiraj + Spremi + Odaberite svoje aplikacije - O autorima - Vodič - Upravitelj - Zapisi - Postavke - Ažuriranje upravitelja + O autorima + Vodič + Upravitelj + Zapisi + Postavke + Ažuriranje upravitelja - Je li vaš uređaj rootan? - Dopusti root dozvolu - Započnite - Odaberite najmanje jednu aplikaciju! - Ne znate što je ovo ili ne želite koristiti root izdanje? Jednostavno kliknite na plavu strelicu ispod! + Je li vaš uređaj rootan? + Dopusti root dozvolu + Započnite + Odaberite najmanje jednu aplikaciju! + Ne znate što je ovo ili ne želite koristiti root izdanje? Jednostavno kliknite na plavu strelicu ispod! - O %1$s - Preuzmi - Informacije - Pokreni - Reinstaliraj - Deinstaliraj - Ažuriraj - Aplikacije - Zapis promjena - Preuzimam %1$s - Instaliraj + O %1$s + Preuzmi + Informacije + Pokreni + Reinstaliraj + Deinstaliraj + Ažuriraj + Aplikacije + Zapis promjena + Preuzimam %1$s + Instaliraj Dostupno: - Prvo instaliraj Vanced MicroG + Prvo instaliraj Vanced MicroG Root pristup nije dopušten - Društvene mreže - Podržite nas - Nedostupno + Društvene mreže + Podržite nas + Nedostupno Instalirano: - Boja naglašavanja - Izgled - Ponašanje - Ukloni preuzete datoteke - Datoteke su uspješno uklonjene - Ovo nam omogućuje prikupljanje informacija o performansama aplikacije i zapise rušenja - Firebase analitika - Jezik - Poveznice će se otvarati u prilagođenim karticama Chroma - Koristi prilagođene kartice Chroma - %1$s skočne obavijesti - Primite skočnu obavijest kada je ažuriranje za %1$s dostupno - Neuspjelo spremanje nove vrijednosti vremena - Vrijeme spavanja root skripte - Prilagodite vrijeme spavanja korišteno u /data/adb/service.d/app.sh skripti, korisno za ispravak problema s montiranjem - Zadano sustavom - Tema - Tamna tema - Svjetla tema - Središte ažuriranja upravitelja - Nema novih ažuriranja - Izdanje + Boja naglašavanja + Izgled + Ponašanje + Ukloni preuzete datoteke + Datoteke su uspješno uklonjene + Ovo nam omogućuje prikupljanje informacija o performansama aplikacije i zapise rušenja + Firebase analitika + Jezik + Poveznice će se otvarati u prilagođenim karticama Chroma + Koristi prilagođene kartice Chroma + %1$s skočne obavijesti + Primite skočnu obavijest kada je ažuriranje za %1$s dostupno + Neuspjelo spremanje nove vrijednosti vremena + Vrijeme spavanja root skripte + Prilagodite vrijeme spavanja korišteno u /data/adb/service.d/app.sh skripti, korisno za ispravak problema s montiranjem + Zadano sustavom + Tema + Tamna tema + Svjetla tema + Središte ažuriranja upravitelja + Nema novih ažuriranja + Izdanje - Nije moguće spremiti zapise - Uspješno spremljeni zapisi + Nije moguće spremiti zapise + Uspješno spremljeni zapisi Detalji - %1$s instalacijska datoteka je otkrivena! - Upravitelj je otkrio da su sve potrebne datoteke za %1$s instalaciju pronađene. Želite li nastaviti instalaciju? + %1$s instalacijska datoteka je otkrivena! + Upravitelj je otkrio da su sve potrebne datoteke za %1$s instalaciju pronađene. Želite li nastaviti instalaciju? %1$s postavke instalacije - Provjera ažuriranja… + Provjera ažuriranja… Jezik: %1$s Tema: %1$s Inačica: %1$s - Greška - Vodič - Zaustavi! + Greška + Vodič + Zaustavi! Koristite Magisk/TWRP inačicu Vanceda, koja više nije podržana i ne može se ažurirati ovom aplikacijom. Uklonite ju uklanjanjem Magisk modula/koristeći TWRP Vanced deinstalator. - Kako bi instalirali Vanced, MORATE onemogućiti MIUI optimizaciju u razvojnim mogućnostima. (Ovo upozorenje možete zanemariti ako koristite 20.2.20 ili noviji xiaomi.eu ROM) - MIUI optimizacija je omogućena! - NE zatvarajte aplikaciju tijekom ovog postupka! - Ponovno preuzmi - Aplikaciju obavezno preuzmite s vancedapp.com, Vanced Discord poslužitelja ili Vanced GitHuba + Kako bi instalirali Vanced, MORATE onemogućiti MIUI optimizaciju u razvojnim mogućnostima. (Ovo upozorenje možete zanemariti ako koristite 20.2.20 ili noviji xiaomi.eu ROM) + MIUI optimizacija je omogućena! + NE zatvarajte aplikaciju tijekom ovog postupka! + Ponovno preuzmi + Aplikaciju obavezno preuzmite s vancedapp.com, Vanced Discord poslužitelja ili Vanced GitHuba Inačica - Dobrodošli + Dobrodošli - Odaberite željeni jezika za Vanced - Najnovije + Odaberite željeni jezika za Vanced + Najnovije Svjetla + %1$s Odaberite najmanje jedan jezik! - Crna - Tamna + Crna + Tamna - Razvijatelji Vanced upravitelja - Ostali suradnici - Izvori - Vanced tim + Razvijatelji Vanced upravitelja + Ostali suradnici + Izvori + Vanced tim - Neuspjela promjena `chown` APK u vlasnika sustava, pokušajte ponovno. - Greška preuzimanja %1$s + Neuspjela promjena `chown` APK u vlasnika sustava, pokušajte ponovno. + Greška preuzimanja %1$s Neuspjelo primijenjivanje nove boje naglašavanja - Neuspjela deinstalacija %1$s paketa - Neuspjelo lociranje potrebnih datoteka za instalaciju. Ponovno preuzmite datoteke za instalaciju, zatim ponovno pokušajte. - Neuspjelo lociranje apk datoteke za crnu/tamnu temu iz pohrane, pokušajte ponovno. - Instalacija je prekinuta zato jer ju je korisnik prekinuo. - Instalacija nije uspjela jer je aplikacija u sukobu s već instaliranom aplikacijom. Deinstalirajte trenutnu inačicu aplikacije zatim pokušajte ponovno. - Instalacija nije uspjela jer je korisnik pokušao instalirati stariju inačicu paketa. Deinstalirajte ažuriranja izvorne YouTube aplikacije, zatim pokušajte ponovno. - Neuspjela instalacija, nepoznati razlog. Priključite se našem Telegramu ili Diskordu za našu pomoć. Molimo Vas da priključite sliku ekrana iz Proširenog Menua - Instalacija nije uspjela zato jer datoteka instalacije nije kompatibilna s vašim uređajem. Uklonite preuzete datoteke u postavkama, zatim pokušajte ponovno. - Instalacija nije uspjela zato jer je apk datoteka oštećena. - Instalacija nije uspjela zato jer je MIUI optimizacija uključena. Isključite MIUI optimizaciju, zatim pokušajte ponovno. - Instalacija nije uspjela zato jer je provjera potpisa omogućena. Onemogućite apk provjeru potpisa, zatim pokušajte ponovno. - Neuspješna instalacija jer na uređaju nema dovoljno slobodnog prostora. - Neuspjeli pronalazak apk datoteke za crnu/tamnu temu u programu instalacije. Uklonite podatke aplikacije upravitelja, zatim pokušajte ponovno. - Neuspjelo lociranje putanje izvorne YouTube instalacije nakon razdvojene instalacije. + Neuspjela deinstalacija %1$s paketa + Neuspjelo lociranje potrebnih datoteka za instalaciju. Ponovno preuzmite datoteke za instalaciju, zatim ponovno pokušajte. + Neuspjelo lociranje apk datoteke za crnu/tamnu temu iz pohrane, pokušajte ponovno. + Instalacija je prekinuta zato jer ju je korisnik prekinuo. + Instalacija nije uspjela jer je aplikacija u sukobu s već instaliranom aplikacijom. Deinstalirajte trenutnu inačicu aplikacije zatim pokušajte ponovno. + Instalacija nije uspjela jer je korisnik pokušao instalirati stariju inačicu paketa. Deinstalirajte ažuriranja izvorne YouTube aplikacije, zatim pokušajte ponovno. + Neuspjela instalacija, nepoznati razlog. Priključite se našem Telegramu ili Diskordu za našu pomoć. Molimo Vas da priključite sliku ekrana iz Proširenog Menua + Instalacija nije uspjela zato jer datoteka instalacije nije kompatibilna s vašim uređajem. Uklonite preuzete datoteke u postavkama, zatim pokušajte ponovno. + Instalacija nije uspjela zato jer je apk datoteka oštećena. + Instalacija nije uspjela zato jer je MIUI optimizacija uključena. Isključite MIUI optimizaciju, zatim pokušajte ponovno. + Instalacija nije uspjela zato jer je provjera potpisa omogućena. Onemogućite apk provjeru potpisa, zatim pokušajte ponovno. + Neuspješna instalacija jer na uređaju nema dovoljno slobodnog prostora. + Neuspjeli pronalazak apk datoteke za crnu/tamnu temu u programu instalacije. Uklonite podatke aplikacije upravitelja, zatim pokušajte ponovno. + Neuspjelo lociranje putanje izvorne YouTube instalacije nakon razdvojene instalacije. diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 9212751a93..f7f5a80f65 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -1,122 +1,122 @@ - Visszavonás - Bezárás - Egyedi GMS implementáció a Vanced számára a microG Projekt alapján. - Egy módosított YouTube kliens számos hasznos funkcióval! - Vanced, a YouTube Music-ra! Kevésbé funkciógazdag, de kielégíti az igényeidet. - Visszaállítás - Mentés - Válaszd ki az Appot + Visszavonás + Bezárás + Egyedi GMS implementáció a Vanced számára a microG Projekt alapján. + Egy módosított YouTube kliens számos hasznos funkcióval! + Vanced, a YouTube Music-ra! Kevésbé funkciógazdag, de kielégíti az igényeidet. + Visszaállítás + Mentés + Válaszd ki az Appot - Rólunk - Útmutató - Manager - Naplók - Beállítások - Manager frissitése + Rólunk + Útmutató + Manager + Naplók + Beállítások + Manager frissitése - Rootolt az eszközöd? - Root hozzáférés engedélyezése - Lássunk neki - Legalább egy appot válassz! - Nem tudod mi ez vagy csak nem akarod használni a root verziót? Csak kattins a lenti kék nyílra! + Rootolt az eszközöd? + Root hozzáférés engedélyezése + Lássunk neki + Legalább egy appot válassz! + Nem tudod mi ez vagy csak nem akarod használni a root verziót? Csak kattins a lenti kék nyílra! - %1$s- ról - Download - Info - Launch - Újratelepítés - Uninstall - Update - Alkalmazások - Változáslista - %1$s letöltése - Telepítés + %1$s- ról + Download + Info + Launch + Újratelepítés + Uninstall + Update + Alkalmazások + Változáslista + %1$s letöltése + Telepítés Legújabb: - Először telepítse a Vanced microG-t + Először telepítse a Vanced microG-t A root hozzáférés nincs megadva - Közösségi média - Támogasson bennünket - Nem elérhető + Közösségi média + Támogasson bennünket + Nem elérhető Telepítve: - Kiemelés színe - Megjelenítés - Viselkedés - Letöltött fájlok törlése - Sikeresen törölte a fájlokat - Ezzel megengedi hogy információkat gyűjtsünk az alkalmazás teljesítményéről és az összeomlási naplóról - Firebase Analytics - Nyelv - A linkek egyéni Chrome ablakban nyílnak meg - Egyéni Chrome lapok használata - %1$s Leküldéses (Push) Értesítések - Értesítések fogadása, amikor a %1$s számára frissítés érhető el - Nem sikerült az időzítő új értékének mentése - Root alvás idő script - Alvás idő beállítás a /data/adb/service.d/app.sh scriptben, hasznos a csatlakoztatási problémák javítására - Rendszer alapértelmezett - Kinézet - Sötét téma - Világos téma - Frissítő központ - Új frissítések nem elérhetőek - Változat + Kiemelés színe + Megjelenítés + Viselkedés + Letöltött fájlok törlése + Sikeresen törölte a fájlokat + Ezzel megengedi hogy információkat gyűjtsünk az alkalmazás teljesítményéről és az összeomlási naplóról + Firebase Analytics + Nyelv + A linkek egyéni Chrome ablakban nyílnak meg + Egyéni Chrome lapok használata + %1$s Leküldéses (Push) Értesítések + Értesítések fogadása, amikor a %1$s számára frissítés érhető el + Nem sikerült az időzítő új értékének mentése + Root alvás idő script + Alvás idő beállítás a /data/adb/service.d/app.sh scriptben, hasznos a csatlakoztatási problémák javítására + Rendszer alapértelmezett + Kinézet + Sötét téma + Világos téma + Frissítő központ + Új frissítések nem elérhetőek + Változat - A napló mentése nem sikerült - Napló sikeresen mentve + A napló mentése nem sikerült + Napló sikeresen mentve Részletek - %1$s telepítőfájlok észlelve! - A Manager észlelte a %1$s telepítéséhez szükséges fájlokat. + %1$s telepítőfájlok észlelve! + A Manager észlelte a %1$s telepítéséhez szükséges fájlokat. Akarod telepíteni? %1$s Telepítés személyreszabása - Frissítések ellenőrzése... + Frissítések ellenőrzése... Nyelv: %1$s Kinézet: %1$s Verzió: %1$s - Hiba - Útmutató - Állj! + Hiba + Útmutató + Állj! A Vanced Magisk/TWRP verzióját használja, ami már nem támogatott és nem frissíthető ezzel az alkalmazással. Távolítsa el a Magisk modul eltávolításával vagy TWRP Vanced eltávolítóval. - Hogy a Vanced-et telepítsd, ki KELL kapcsolnod a MIUI Optimalizációt a fejlesztői beállításokban. (Ezt figyelmen kívül hagyhatod ha 20.2.20 vagy későbbi xiaomi.eu alapú ROM-ot használsz) - MIUI optimalizálások engedélyezve! - Kérjük NE lépjen ki a telepítési folyamat alatt! - Újra letölt - Arra kérünk, győződjön meg róla, hogy ezt az alkalmazást a vancedapp.com oldalról, a Vanced Discord szerveréről vagy a Vanced GitHub-ról töltötte le + Hogy a Vanced-et telepítsd, ki KELL kapcsolnod a MIUI Optimalizációt a fejlesztői beállításokban. (Ezt figyelmen kívül hagyhatod ha 20.2.20 vagy későbbi xiaomi.eu alapú ROM-ot használsz) + MIUI optimalizálások engedélyezve! + Kérjük NE lépjen ki a telepítési folyamat alatt! + Újra letölt + Arra kérünk, győződjön meg róla, hogy ezt az alkalmazást a vancedapp.com oldalról, a Vanced Discord szerveréről vagy a Vanced GitHub-ról töltötte le Verzió - Üdvözöljük + Üdvözöljük - Vanced nyelvének kiválasztása - Legújabb + Vanced nyelvének kiválasztása + Legújabb Világos + %1$s Válasszon ki legalább egy nyelvet! - Fekete - Sötét + Fekete + Sötét - Fejlesztői Menedzser - Egyéb Közreműködők - Források - Vanced csapat + Fejlesztői Menedzser + Egyéb Közreműködők + Források + Vanced csapat - Nem sikerült az APK beállítása a rendszer tulajdonoshoz, kérjük próbálja újra. - %1$s letöltése nem sikerült + Nem sikerült az APK beállítása a rendszer tulajdonoshoz, kérjük próbálja újra. + %1$s letöltése nem sikerült Nem sikerült az új kiemelés szín beállítása - A %1$s-t nem sikerült eltávolítani - A telepítéshez szükséges file-ok megtalálása meghiúsult. Töltse le újra a telepítőfile-okat és próbálja újra. - Nem sikerült az apk file-t megtalálni a fekete/sötét kinézethez, kérjük próbálja újra. - A művelet végrehajtása nem sikerült, mert a felhasználó megszakította a telepítést. - A telepítés nem sikerült, mert az alkalmazás egy másik, már telepített alkalmazással ütközik. Távolítsd el a jelenlegi verziót és próbáld újra. - A telepítés nem sikerült, mert a felhasználó, régebbi verzióra próbált frissíteni. Távolítsa el az eredeti alkalmazás frissítéseit, majd próbálja újra. - A telepítés ismeretlen ok miatt meghiúsult, kérjük csatlakozzon a Telegram vagy a Discord csatornánkhoz további támogatásért. Kérjük egy képernyőképet is mellékeljen ami a Haladó menüben készült - A telepítés nem sikerült, mert a telepítő fájl nem kompatibilis az eszközöddel. Töröld ki a letöltött fájlokat a beállításokban és próbáld újra. - A telepítés nem sikerült, mert az apk fájlok korruptak, próbáld újra. - A telepítés nem sikerült, mert a MIUI Optimalizáció engedélyezve van. Kapcsold ki a MIUI Optimalizációt és próbáld újra. - A telepítés nem sikerült, mert az apk aláírás ellenőrzés engedélyezve van. + A %1$s-t nem sikerült eltávolítani + A telepítéshez szükséges file-ok megtalálása meghiúsult. Töltse le újra a telepítőfile-okat és próbálja újra. + Nem sikerült az apk file-t megtalálni a fekete/sötét kinézethez, kérjük próbálja újra. + A művelet végrehajtása nem sikerült, mert a felhasználó megszakította a telepítést. + A telepítés nem sikerült, mert az alkalmazás egy másik, már telepített alkalmazással ütközik. Távolítsd el a jelenlegi verziót és próbáld újra. + A telepítés nem sikerült, mert a felhasználó, régebbi verzióra próbált frissíteni. Távolítsa el az eredeti alkalmazás frissítéseit, majd próbálja újra. + A telepítés ismeretlen ok miatt meghiúsult, kérjük csatlakozzon a Telegram vagy a Discord csatornánkhoz további támogatásért. Kérjük egy képernyőképet is mellékeljen ami a Haladó menüben készült + A telepítés nem sikerült, mert a telepítő fájl nem kompatibilis az eszközöddel. Töröld ki a letöltött fájlokat a beállításokban és próbáld újra. + A telepítés nem sikerült, mert az apk fájlok korruptak, próbáld újra. + A telepítés nem sikerült, mert a MIUI Optimalizáció engedélyezve van. Kapcsold ki a MIUI Optimalizációt és próbáld újra. + A telepítés nem sikerült, mert az apk aláírás ellenőrzés engedélyezve van. Kapcsold ki az apk aláírás ellenőrzését és próbáld újra. - A telepítés nem sikerült, mert nincs elég szabad hely. - Nem sikerült megtalálni az apk file-t a fekete/sötét kinézethez a telepítőből. Törölje a Manager alkalmazás adatait, majd próbálja újra. - Nem sikerült megtalálni az alap YouTube telepítési útvonalat a(z) split telepítés után. + A telepítés nem sikerült, mert nincs elég szabad hely. + Nem sikerült megtalálni az apk file-t a fekete/sötét kinézethez a telepítőből. Törölje a Manager alkalmazás adatait, majd próbálja újra. + Nem sikerült megtalálni az alap YouTube telepítési útvonalat a(z) split telepítés után. diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index fdc7c431b3..115445e586 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -1,120 +1,120 @@ - Batal - Tutup - Penerapan GMS kustom untuk Vanced yang didasarkan pada proyek microG. - Klien YouTube termodifikasi dengan berbagai fitur berguna! - Vanced, tetapi untuk YouTube Musik! Relatif memiliki fitur yang kurang kaya tetapi memenuhi kebutuhan anda. - Atur ulang - Simpan - Pilih Aplikasi Anda + Batal + Tutup + Penerapan GMS kustom untuk Vanced yang didasarkan pada proyek microG. + Klien YouTube termodifikasi dengan berbagai fitur berguna! + Vanced, tetapi untuk YouTube Musik! Relatif memiliki fitur yang kurang kaya tetapi memenuhi kebutuhan anda. + Atur ulang + Simpan + Pilih Aplikasi Anda - Tentang - Petunjuk - Manager - Logs - Pengaturan - Perbarui Manager + Tentang + Petunjuk + Manager + Logs + Pengaturan + Perbarui Manager - Apakah Perangkat Anda Mempunyai Akses Root? - Berikan Izin Root - Mari memulai - Pilih setidaknya satu aplikasi! - Tidak tahu apa ini atau tidak ingin menggunakan versi root? cukup klik panah biru di bawah! + Apakah Perangkat Anda Mempunyai Akses Root? + Berikan Izin Root + Mari memulai + Pilih setidaknya satu aplikasi! + Tidak tahu apa ini atau tidak ingin menggunakan versi root? cukup klik panah biru di bawah! - Tentang %1$s - Unduh - Informasi - Buka - Pasang ulang - Copot pemasangan - Perbarui - Aplikasi - Catatan perubahan - Mengunduh %1$s - Pasang + Tentang %1$s + Unduh + Informasi + Buka + Pasang ulang + Copot pemasangan + Perbarui + Aplikasi + Catatan perubahan + Mengunduh %1$s + Pasang Terbaru: - Pasang Vanced microG terlebih dahulu + Pasang Vanced microG terlebih dahulu Akses Root tidak diberikan - Media Sosial - Dukung kami - Tidak tersedia + Media Sosial + Dukung kami + Tidak tersedia Terpasang: - Aksen Warna - Penampilan - Perilaku - Hapus file yang diunduh - Berhasil menghapus file - Analisis firebase mengizinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash - Analisis Firebase - Bahasa - Tautan akan terbuka di Chrome Custom Tabs - Gunakan Chrome Custom Tabs - Notifikasi Push %1$s - Terima notifikasi push saat pembaruan untuk %1$s dirilis - Gagal untuk menyimpan value waktu baru - Waktu Root Script Sleep - Sesuaikan value sleep time yang digunakan dalam skript /data/adb/service.d/app.sh, berguna untuk memperbaiki masalah pemasangan - Standar Sistem - Tema - Tema Gelap - Tema Terang - Pusat Pembaruan Manager - Tidak ada pembaruan - Varian + Aksen Warna + Penampilan + Perilaku + Hapus file yang diunduh + Berhasil menghapus file + Analisis firebase mengizinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash + Analisis Firebase + Bahasa + Tautan akan terbuka di Chrome Custom Tabs + Gunakan Chrome Custom Tabs + Notifikasi Push %1$s + Terima notifikasi push saat pembaruan untuk %1$s dirilis + Gagal untuk menyimpan value waktu baru + Waktu Root Script Sleep + Sesuaikan value sleep time yang digunakan dalam skript /data/adb/service.d/app.sh, berguna untuk memperbaiki masalah pemasangan + Standar Sistem + Tema + Tema Gelap + Tema Terang + Pusat Pembaruan Manager + Tidak ada pembaruan + Varian - Tidak bisa menyimpan log - Berhasil menyimpan log + Tidak bisa menyimpan log + Berhasil menyimpan log Rincian - File instalasi %1$s terdeteksi! - Manager mendeteksi bahwa semua file yang diperlukan untuk instalasi %1$s ditemukan. Apakah anda ingin memasangnya? + File instalasi %1$s terdeteksi! + Manager mendeteksi bahwa semua file yang diperlukan untuk instalasi %1$s ditemukan. Apakah anda ingin memasangnya? Preferensi Instalasi %1$s - Memeriksa pembaruan… + Memeriksa pembaruan… Bahasa: %1$s Tema: %1$s Versi: %1$s - Terjadi kesalahan - Petunjuk - Berhenti! + Terjadi kesalahan + Petunjuk + Berhenti! Anda memakai Vanced versi Magisk/TWRP, yang pengembangannya dihentikan dan tidak bisa diperbarui menggunakan aplikasi ini. Mohon untuk menghapusnya dengan menghapus modul Magisk/gunakan pencopot Vanced TWRP. - Untuk memasang Vanced, anda HARUS menonaktifkan Optimisasi MIUI pada pengaturan developer. (Anda dapat mengabaikan peringatan ini apabila anda menggunakan ROM versi 20.2.20 atau lebih yang berbasis xiaomi.eu) - Optimisasi MIUI diaktifkan! - Mohon untuk TIDAK keluar dari aplikasi saat proses ini! - Unduh ulang - Pastikan anda mengunduh aplikasi ini dari vancedapp.com, server Discord Vanced, atau Vanced Github + Untuk memasang Vanced, anda HARUS menonaktifkan Optimisasi MIUI pada pengaturan developer. (Anda dapat mengabaikan peringatan ini apabila anda menggunakan ROM versi 20.2.20 atau lebih yang berbasis xiaomi.eu) + Optimisasi MIUI diaktifkan! + Mohon untuk TIDAK keluar dari aplikasi saat proses ini! + Unduh ulang + Pastikan anda mengunduh aplikasi ini dari vancedapp.com, server Discord Vanced, atau Vanced Github Versi - Selamat datang + Selamat datang - Pilih bahasa yang anda inginkan untuk Vanced - Terbaru + Pilih bahasa yang anda inginkan untuk Vanced + Terbaru Terang + %1$s Pilih setidaknya satu bahasa! - Hitam - Gelap + Hitam + Gelap - Pengembang Manager - Kontributor Lain - Sumber - Tim Vanced + Pengembang Manager + Kontributor Lain + Sumber + Tim Vanced - Gagal untuk `chown` APK ke pemilik sistem, mohon coba lagi. - Gagal Mengunduh %1$s + Gagal untuk `chown` APK ke pemilik sistem, mohon coba lagi. + Gagal Mengunduh %1$s Gagal untuk menerapkan warna aksen baru - Gagal untuk mencopot pemasangan paket %1$s - Gagal untuk menemukan file yang diperlukan untuk instalasi. Unduh ulang file instalasi, lalu coba lagi. - Gagal untuk menemukan file apk untuk tema hitam/gelap dari penyimpanan, mohon coba lagi. - Pemasangan gagal dikarenakan pengguna membatalkan pemasangan. - Pemasangan gagal dikarenakan aplikasi konflik dengan aplikasi yang sudah terpasang. Copot pemasangan aplikasi versi saat ini, lalu coba lagi. - Pemasangan gagal dikarenakan pengguna mencoba menurunkan versi paket. Hapus pembaruan dari aplikasi bawaan, lalu coba lagi. - Pemasangan gagal untuk alasan yang tidak diketahui, gabung Telegram atau Discord kami untuk bantuan lebih lanjut. Mohon untuk melampirkan screenshot dari menu Tingkat Lanjut - Pemasangan gagal dikarenakan file pemasangan tidak kompatibel dengan perangkat anda. Hapus file yang diunduh di pengaturan, lalu coba lagi. - Pemasangan gagal dikarenakan file apk rusak, mohon coba lagi. - Pemasangan gagal dikarenakan Optimisasi MIUI diaktifkan. Nonaktifkan Optimisasi MIUI, lalu coba lagi. - Pemasangan gagal dikarenakan apk signature verification diaktifkan. Nonaktifkan apk signature verification, lalu coba lagi. - Pemasangan gagal dikarenakan perangkat tidak memiliki ruang penyimpanan yang cukup. - Gagal untuk menemukan file apk untuk tema hitam/gelap dari penginstal. Hapus data aplikasi Manager, lalu coba lagi. - Gagal untuk menemukan path instalasi YouTube setelah pemasangan split. + Gagal untuk mencopot pemasangan paket %1$s + Gagal untuk menemukan file yang diperlukan untuk instalasi. Unduh ulang file instalasi, lalu coba lagi. + Gagal untuk menemukan file apk untuk tema hitam/gelap dari penyimpanan, mohon coba lagi. + Pemasangan gagal dikarenakan pengguna membatalkan pemasangan. + Pemasangan gagal dikarenakan aplikasi konflik dengan aplikasi yang sudah terpasang. Copot pemasangan aplikasi versi saat ini, lalu coba lagi. + Pemasangan gagal dikarenakan pengguna mencoba menurunkan versi paket. Hapus pembaruan dari aplikasi bawaan, lalu coba lagi. + Pemasangan gagal untuk alasan yang tidak diketahui, gabung Telegram atau Discord kami untuk bantuan lebih lanjut. Mohon untuk melampirkan screenshot dari menu Tingkat Lanjut + Pemasangan gagal dikarenakan file pemasangan tidak kompatibel dengan perangkat anda. Hapus file yang diunduh di pengaturan, lalu coba lagi. + Pemasangan gagal dikarenakan file apk rusak, mohon coba lagi. + Pemasangan gagal dikarenakan Optimisasi MIUI diaktifkan. Nonaktifkan Optimisasi MIUI, lalu coba lagi. + Pemasangan gagal dikarenakan apk signature verification diaktifkan. Nonaktifkan apk signature verification, lalu coba lagi. + Pemasangan gagal dikarenakan perangkat tidak memiliki ruang penyimpanan yang cukup. + Gagal untuk menemukan file apk untuk tema hitam/gelap dari penginstal. Hapus data aplikasi Manager, lalu coba lagi. + Gagal untuk menemukan path instalasi YouTube setelah pemasangan split. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index fcb3855fdd..4177075a3c 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -1,120 +1,120 @@ - Annulla - Chiudi - Un\'implementazione GMS personalizzata per Vanced basata sul progetto microG. - Un client YouTube modificato con molte utili funzionalità! - Vanced, ma per YouTube Music! Relativamente meno ricco di funzionalità ma ugualmente adattabile alle tue esigenze. - Reimposta - Salva - Seleziona le Tue App + Annulla + Chiudi + Un\'implementazione GMS personalizzata per Vanced basata sul progetto microG. + Un client YouTube modificato con molte utili funzionalità! + Vanced, ma per YouTube Music! Relativamente meno ricco di funzionalità ma ugualmente adattabile alle tue esigenze. + Reimposta + Salva + Seleziona le Tue App - Informazioni - Guida - Manager - Registri - Impostazioni - Aggiorna Manager + Informazioni + Guida + Manager + Registri + Impostazioni + Aggiorna Manager - Il Tuo Dispositivo Ha i Permessi di Root? - Concedi i Permessi di Root - Iniziamo - Seleziona almeno un\'app! - Non sai cos\'è o non vuoi utilizzare la versione root? clicca sulla freccia blu qui in basso! + Il Tuo Dispositivo Ha i Permessi di Root? + Concedi i Permessi di Root + Iniziamo + Seleziona almeno un\'app! + Non sai cos\'è o non vuoi utilizzare la versione root? clicca sulla freccia blu qui in basso! - Informazioni su %1$s - Scarica - Informazioni - Avvia - Reinstalla - Disinstalla - Aggiorna - App - Novità - Download in corso di %1$s - Installa + Informazioni su %1$s + Scarica + Informazioni + Avvia + Reinstalla + Disinstalla + Aggiorna + App + Novità + Download in corso di %1$s + Installa Disponibile: - Installa prima Vanced microG + Installa prima Vanced microG Accesso root non consentito - Social Media - Sostienici - Non disponibile + Social Media + Sostienici + Non disponibile Installata: - Colore Evidenziazione - Aspetto - Comportamento - Cancella i file scaricati - Cancellazione file riuscita - Questo ci consente di raccogliere informazioni sulle prestazioni dell\'app ed i registri sui crash - Analisi Firebase - Lingua - I link verranno aperti nelle Schede Personalizzate di Chrome - Utilizza le Schede Personalizzate di Chrome - Notifiche Push di %1$s - Ricevi notifiche push quando un aggiornamento per %1$s è disponibile - Impossibile salvare il nuovo valore temporale - Tempo Di Sospensione Script Root - Regola il valore del tempo di sospensione utilizzato nello script /data/adb/service.d/app.sh, utile per risolvere i problemi di montaggio - Predefinito di Sistema - Tema - Tema Scuro - Tema Chiaro - Centro Aggiornamenti - Nessun nuovo aggiornamento - Variante + Colore Evidenziazione + Aspetto + Comportamento + Cancella i file scaricati + Cancellazione file riuscita + Questo ci consente di raccogliere informazioni sulle prestazioni dell\'app ed i registri sui crash + Analisi Firebase + Lingua + I link verranno aperti nelle Schede Personalizzate di Chrome + Utilizza le Schede Personalizzate di Chrome + Notifiche Push di %1$s + Ricevi notifiche push quando un aggiornamento per %1$s è disponibile + Impossibile salvare il nuovo valore temporale + Tempo Di Sospensione Script Root + Regola il valore del tempo di sospensione utilizzato nello script /data/adb/service.d/app.sh, utile per risolvere i problemi di montaggio + Predefinito di Sistema + Tema + Tema Scuro + Tema Chiaro + Centro Aggiornamenti + Nessun nuovo aggiornamento + Variante - Impossibile salvare i registri - Registri salvati correttamente + Impossibile salvare i registri + Registri salvati correttamente Dettagli - %1$s file di installazione rilevati! - Manager ha trovato tutti i file necessari per l\'installazione di %1$s. Vuoi installarli? + %1$s file di installazione rilevati! + Manager ha trovato tutti i file necessari per l\'installazione di %1$s. Vuoi installarli? Preferenze Installazione di %1$s - Verifica aggiornamenti… + Verifica aggiornamenti… Lingue: %1$s Tema: %1$s Versione: %1$s - Errore - Guida - Aspetta! + Errore + Guida + Aspetta! Stai utilizzando la versione Magisk/TWRP di Vanced, ormai obsoleta e non più aggiornabile tramite questa app. Per favore, rimuovila eliminando il modulo Magisk oppure utilizzando TWRP Vanced uninstaller. - Per installare Vanced, DEVI disabilitare le ottimizzazioni MIUI nelle opzioni sviluppatore. (Puoi ignorare questo avviso se stai usando la ROM 20.2.20 o successiva basata su xiaomi.eu) - Le ottimizzazioni MIUI sono abilitate! - Si prega di NON uscire dall\'app durante questo processo! - Scarica nuovamente - Assicurati di aver scaricato l\'app da vancedapp.com, dal server Discord di Vanced o dalla pagina GitHub di Vanced + Per installare Vanced, DEVI disabilitare le ottimizzazioni MIUI nelle opzioni sviluppatore. (Puoi ignorare questo avviso se stai usando la ROM 20.2.20 o successiva basata su xiaomi.eu) + Le ottimizzazioni MIUI sono abilitate! + Si prega di NON uscire dall\'app durante questo processo! + Scarica nuovamente + Assicurati di aver scaricato l\'app da vancedapp.com, dal server Discord di Vanced o dalla pagina GitHub di Vanced Versione - Benvenuto + Benvenuto - Scegli le tue lingue preferite per Vanced - Versione più recente + Scegli le tue lingue preferite per Vanced + Versione più recente Chiaro + %1$s Seleziona almeno una lingua! - Nero - Scuro + Nero + Scuro - Sviluppatori di Manager - Altri Collaboratori - Codice Sorgente - Il Team di Vanced + Sviluppatori di Manager + Altri Collaboratori + Codice Sorgente + Il Team di Vanced - Impossibile modificare il proprietario dell\'apk nel proprietario di sistema, per favore riprova. - Errore nel Download di %1$s + Impossibile modificare il proprietario dell\'apk nel proprietario di sistema, per favore riprova. + Errore nel Download di %1$s Impossibile applicare il nuovo colore di accento - Impossibile disinstallare il pacchetto %1$s - Impossibile individuare i file richiesti per l\'installazione. Scaricali nuovamente e riprova. - Impossibile individuare il file apk per il tema nero/scuro dalla memoria, per favore riprova. - Installazione non riuscita. L\'utente ha annullato l\'installazione. - Installazione fallita perché l\'applicazione è in conflitto con un\'app già installata. Disinstallare la versione corrente dell\'applicazione, quindi riprovare. - Installazione fallita. È stato effettuato un tentativo di downgrade del pacchetto. Disinstalla gli aggiornamenti dall\'app stock, quindi riprova. - Installazione non riuscita per motivi sconosciuti, unisciti al nostro Telegram o Discord per ulteriore supporto. Allega anche uno screenshot dal menu Avanzate - Installazione non riuscita, il file di installazione non è compatibile con il tuo dispositivo. Elimina i file scaricati nelle impostazioni, poi riprova. - Installazione non riuscita a causa di file apk corrotti, si prega di riprovare. - Installazione non riuscita, le ottimizzazioni di MIUI sono attivate. Disattiva le ottimizzazioni di MIUI, poi riprova. - Installazione non riuscita, la verifica della firma apk è attivata. Disattiva la verifica della firma apk, poi riprova. - Installazione non riuscita perché il dispositivo non dispone di sufficiente spazio libero. - Impossibile trovare il file apk per il tema nero/scuro dall\'installer. Cancella i dati dell\'app Manager, quindi riprova. - Impossibile individuare il percorso di installazione di YouTube stock dopo l\'installazione divisa. + Impossibile disinstallare il pacchetto %1$s + Impossibile individuare i file richiesti per l\'installazione. Scaricali nuovamente e riprova. + Impossibile individuare il file apk per il tema nero/scuro dalla memoria, per favore riprova. + Installazione non riuscita. L\'utente ha annullato l\'installazione. + Installazione fallita perché l\'applicazione è in conflitto con un\'app già installata. Disinstallare la versione corrente dell\'applicazione, quindi riprovare. + Installazione fallita. È stato effettuato un tentativo di downgrade del pacchetto. Disinstalla gli aggiornamenti dall\'app stock, quindi riprova. + Installazione non riuscita per motivi sconosciuti, unisciti al nostro Telegram o Discord per ulteriore supporto. Allega anche uno screenshot dal menu Avanzate + Installazione non riuscita, il file di installazione non è compatibile con il tuo dispositivo. Elimina i file scaricati nelle impostazioni, poi riprova. + Installazione non riuscita a causa di file apk corrotti, si prega di riprovare. + Installazione non riuscita, le ottimizzazioni di MIUI sono attivate. Disattiva le ottimizzazioni di MIUI, poi riprova. + Installazione non riuscita, la verifica della firma apk è attivata. Disattiva la verifica della firma apk, poi riprova. + Installazione non riuscita perché il dispositivo non dispone di sufficiente spazio libero. + Impossibile trovare il file apk per il tema nero/scuro dall\'installer. Cancella i dati dell\'app Manager, quindi riprova. + Impossibile individuare il percorso di installazione di YouTube stock dopo l\'installazione divisa. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 5f55082b82..eaa578fb28 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -1,120 +1,120 @@ - ביטול - סגור - שירותים מותאמים אישית של Google במיוחד ל־Vanced, מבוססים על פרויקט microG. - YouTube משופר עם תכונות שימושיות רבות! - Vacned, אבל של YouTube Music! יחסית פחות עשיר בתכונות, אבל ממלא אחר צרכיך. - איפוס - שמור - בחר את היישומים שלך + ביטול + סגור + שירותים מותאמים אישית של Google במיוחד ל־Vanced, מבוססים על פרויקט microG. + YouTube משופר עם תכונות שימושיות רבות! + Vacned, אבל של YouTube Music! יחסית פחות עשיר בתכונות, אבל ממלא אחר צרכיך. + איפוס + שמור + בחר את היישומים שלך - אודות - מדריך - מנהל - יומני רישום - הגדרות - מנהל העדכונים + אודות + מדריך + מנהל + יומני רישום + הגדרות + מנהל העדכונים - האם המכשיר שלך בעל הרשאות Root? - הענק הרשאות Root - בואו נתחיל - בחר לפחות יישום אחד! - לא יודעים מה זה או לא רוצים להשתמש בגרסת ה־Root? פשוט לחצו על החץ הכחול למטה! + האם המכשיר שלך בעל הרשאות Root? + הענק הרשאות Root + בואו נתחיל + בחר לפחות יישום אחד! + לא יודעים מה זה או לא רוצים להשתמש בגרסת ה־Root? פשוט לחצו על החץ הכחול למטה! - אודות %1$s - הורדה - מידע - הפעל - התקן מחדש - הסרת ההתקנה - עדכן - יישומים - היסטורית שינויים - מוריד את %1$s - התקן + אודות %1$s + הורדה + מידע + הפעל + התקן מחדש + הסרת ההתקנה + עדכן + יישומים + היסטורית שינויים + מוריד את %1$s + התקן החדש ביותר: - התקן את שירותי Google של Vanced תחילה + התקן את שירותי Google של Vanced תחילה לא הוענקו הרשאות Root - רשתות חברתיות - תמכו בנו - לא זמין + רשתות חברתיות + תמכו בנו + לא זמין מותקן: - צבע הדגשה - מראה - התנהגות - מחק קבצים שהורדו - מחיקת הקבצים הסתיימה בהצלחה - מאפשר לנו לאסוף מידע על ביצועי היישום וסיבות לקריסתו - ניתוח מידע משתמש - שפה - קישורים יפתחו בכרטיסיות מותאמות אישית של Chrome - השתמש בכרטיסייה מותאמת אישית של Chrome - %1$s התראות דחיפה - קבל התראות דחיפה כשעדכון ל־%1$s משתחרר - נכשל בשמירת ערך הזמן החדש - Root Script Sleep Time - תשנה את זמן השינה הנמצא ב /data/adb/service.d/app.sh, זה עוזר כדי לתקן בעיות אתחול - ברירת מחדל - ערכת נושא - ערכת נושא כהה - ערכת נושא בהירה - מרכז העדכונים - אין עדכונים חדשים - סוג + צבע הדגשה + מראה + התנהגות + מחק קבצים שהורדו + מחיקת הקבצים הסתיימה בהצלחה + מאפשר לנו לאסוף מידע על ביצועי היישום וסיבות לקריסתו + ניתוח מידע משתמש + שפה + קישורים יפתחו בכרטיסיות מותאמות אישית של Chrome + השתמש בכרטיסייה מותאמת אישית של Chrome + %1$s התראות דחיפה + קבל התראות דחיפה כשעדכון ל־%1$s משתחרר + נכשל בשמירת ערך הזמן החדש + Root Script Sleep Time + תשנה את זמן השינה הנמצא ב /data/adb/service.d/app.sh, זה עוזר כדי לתקן בעיות אתחול + ברירת מחדל + ערכת נושא + ערכת נושא כהה + ערכת נושא בהירה + מרכז העדכונים + אין עדכונים חדשים + סוג - לא ניתן היה לשמור יומני רישום - יומני הרישום נשמרו בהצלחה + לא ניתן היה לשמור יומני רישום + יומני הרישום נשמרו בהצלחה פרטים - %1$s קבצי התקנה נמצאו! - המנהל זיהה שכל הקבצים הנדרשים עבור התקנת %1$s נמצאו. האם ברצונך להתקינם? + %1$s קבצי התקנה נמצאו! + המנהל זיהה שכל הקבצים הנדרשים עבור התקנת %1$s נמצאו. האם ברצונך להתקינם? %1$s העדפות התקנה - בודק אחר עדכונים… + בודק אחר עדכונים… שפה: %1$s ערכת נושא: %1$s גרסה: %1$s - שגיאה - מדריך - עצור! + שגיאה + מדריך + עצור! נדמה שאתה משתמש בגרסת ה־Magisk/TWRP של Vanced, שהתמיכה בה הופסקה והיא לא יכולה להתעדכן להתעדכן בעזרת האפליקציה הזו. אנא מחק אותה על ידי מחיקת ה־Module ב־Magisk או בשימוש במסיר ההתקנה של TWRP Vanced. - על מנת להתקין את Vanced, עליך להשבית מיטוב ל־MIUI בהגדרות מפתחים. (אתה יכול להתעלם מאזהרה זו אם אתה משתמש בגרסה 20.2.2 של הרום הבין־לאומי של שיאומי או גרסה מאוחרת יותר) - מיטוב למערכת ההפעלה MIUI פועל! - נא לא לצאת מהיישום במהלך תהליך זה! - הורד מחדש - ודא שהורדת את האפליקציה מהאתר vancedapp.com, שרת הדיסקורד של Vanced או מהעמוד של Vanced ב־GitHub + על מנת להתקין את Vanced, עליך להשבית מיטוב ל־MIUI בהגדרות מפתחים. (אתה יכול להתעלם מאזהרה זו אם אתה משתמש בגרסה 20.2.2 של הרום הבין־לאומי של שיאומי או גרסה מאוחרת יותר) + מיטוב למערכת ההפעלה MIUI פועל! + נא לא לצאת מהיישום במהלך תהליך זה! + הורד מחדש + ודא שהורדת את האפליקציה מהאתר vancedapp.com, שרת הדיסקורד של Vanced או מהעמוד של Vanced ב־GitHub גרסא - ברוכים הבאים + ברוכים הבאים - בחר את השפה המועדפת עליך ל־Vanced - העדכנית ביותר + בחר את השפה המועדפת עליך ל־Vanced + העדכנית ביותר בהיר + %1$s בחר לפחות שפה אחת! - שחור - שחרחר + שחור + שחרחר - מנהל למפתחים - תורמים אחרים - מקורות - צוות Vanced + מנהל למפתחים + תורמים אחרים + מקורות + צוות Vanced - נכשל בהחלפת הבעלים של קובץ ה־APK, אנא נסה בשנית. - תקלה בהורדה של %1$s + נכשל בהחלפת הבעלים של קובץ ה־APK, אנא נסה בשנית. + תקלה בהורדה של %1$s נכשל בהחלת ערכת הנושא החדשה - נכשל במחיקת החבילה %1$s - איתור הקבצים הנדרשים להתקנה נכשל. הורד מחדש את קבצי ההתקנה ונסה שוב. - נכשל האיתור של קובץ APK לערכת נושא שחורה/כהה מהאחסון, אנא נסה שוב. - ההתקנה נכשלה כיוון שהמשתמש ביטל אותה. - ההתקנה נכשלה כיוון שהאפליקציה מתנגשת עם גרסה מותקנת שלה, מחק את הגרסה הנוכחית של Vanced ולאחר מכן נסה שוב. - ההתקנה נכשלה כיוון שהמשתמש ניסה לשנמך את גרסת היישום. מחק עדכונים מאפליקציית YouTube הרגילה, ולאחר מכן נסה שוב. - ההתקנה נכשלה מסיבות לא ידועות, הצטרף לטלגרם או לדיסקורד לקבלת תמיכה נוספת. אנא צרף גם צילום מסך מהתפריט המתקדם - ההתקנה נכשלה מכיוון שההתקנה או הקובץ לא תואמים עם מכשירך. נקה הורדות שהושלמו מתוך ההגדרות, ואז נסה שוב. - ההתקנה נכשלה מכיוון שקבצי הישום הרוסים, בבקשה נסה שוב. - ההתקנה נכשלה מכיוון שאופטימיזצית MIUI פעילה. השבת את אופטימיזצית MIUI, ואז נסה שוב. - ההתקנה נכשלה מכיוון שאימות החתימה בישום פעילה. השבת את אימות החתימה בישום, ואז נסה שוב. - ההתקנה נכשלה כיוון שאין מספיק מקום פנוי במכשיר. - נכשל במציאת קובץ APK של ערכת נושא שחורה/כהה. נקה את נתוני האפליקציה Vanced Manager, ולאחר מכן נסה שוב. - נכשל איתור נתיב ההתקנה של YouTube הרגיל לאחר התקנה מפוצלת. + נכשל במחיקת החבילה %1$s + איתור הקבצים הנדרשים להתקנה נכשל. הורד מחדש את קבצי ההתקנה ונסה שוב. + נכשל האיתור של קובץ APK לערכת נושא שחורה/כהה מהאחסון, אנא נסה שוב. + ההתקנה נכשלה כיוון שהמשתמש ביטל אותה. + ההתקנה נכשלה כיוון שהאפליקציה מתנגשת עם גרסה מותקנת שלה, מחק את הגרסה הנוכחית של Vanced ולאחר מכן נסה שוב. + ההתקנה נכשלה כיוון שהמשתמש ניסה לשנמך את גרסת היישום. מחק עדכונים מאפליקציית YouTube הרגילה, ולאחר מכן נסה שוב. + ההתקנה נכשלה מסיבות לא ידועות, הצטרף לטלגרם או לדיסקורד לקבלת תמיכה נוספת. אנא צרף גם צילום מסך מהתפריט המתקדם + ההתקנה נכשלה מכיוון שההתקנה או הקובץ לא תואמים עם מכשירך. נקה הורדות שהושלמו מתוך ההגדרות, ואז נסה שוב. + ההתקנה נכשלה מכיוון שקבצי הישום הרוסים, בבקשה נסה שוב. + ההתקנה נכשלה מכיוון שאופטימיזצית MIUI פעילה. השבת את אופטימיזצית MIUI, ואז נסה שוב. + ההתקנה נכשלה מכיוון שאימות החתימה בישום פעילה. השבת את אימות החתימה בישום, ואז נסה שוב. + ההתקנה נכשלה כיוון שאין מספיק מקום פנוי במכשיר. + נכשל במציאת קובץ APK של ערכת נושא שחורה/כהה. נקה את נתוני האפליקציה Vanced Manager, ולאחר מכן נסה שוב. + נכשל איתור נתיב ההתקנה של YouTube הרגיל לאחר התקנה מפוצלת. diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 3df8266cc1..17b1acdde4 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1,120 +1,120 @@ - キャンセル - 閉じる - microG Project をベースにした、Vanced のためのGMSのカスタム実装 - 多くの便利な機能を備えた、改造されたYouTubeアプリ! - YouTube Music のための Vanced! 比較的機能は少ないですが、あなたの欲望を満たします。 - リセット - 保存 - アプリの選択 + キャンセル + 閉じる + microG Project をベースにした、Vanced のためのGMSのカスタム実装 + 多くの便利な機能を備えた、改造されたYouTubeアプリ! + YouTube Music のための Vanced! 比較的機能は少ないですが、あなたの欲望を満たします。 + リセット + 保存 + アプリの選択 - このアプリについて - ガイド - Manager - ログ - 設定 - Manager を更新 + このアプリについて + ガイド + Manager + ログ + 設定 + Manager を更新 - 端末をルート化していますか? - root 権限を付与 - さあ、始めましょう - アプリを少なくとも一つ選択してください! - これが何であるか分からないか、またはRootバージョンを使用したくない場合は、下の青い矢印をタップしてください! + 端末をルート化していますか? + root 権限を付与 + さあ、始めましょう + アプリを少なくとも一つ選択してください! + これが何であるか分からないか、またはRootバージョンを使用したくない場合は、下の青い矢印をタップしてください! - %1$s について - Download - Info - Launch - Reinstall - Uninstall - Update - アプリ - 更新履歴 - %1$s をダウンロードしています - インストール + %1$s について + Download + Info + Launch + Reinstall + Uninstall + Update + アプリ + 更新履歴 + %1$s をダウンロードしています + インストール 最新版: - はじめに Vanced microG をインストールしてください + はじめに Vanced microG をインストールしてください Root アクセスは許可されていません - ソーシャルメディア - サポート - 利用不可 + ソーシャルメディア + サポート + 利用不可 インストール済み: - アクセントカラー - 表示設定 - 動作 - ダウンロード済みファイルを消去 - ファイルを消去しました - アプリのパフォーマンスとクラッシュログに関する情報を収集できます - Firebase アナリティクス - 言語 - Chrome カスタムタブでリンクを開く - Chrome カスタムタブを使用 - %1$s プッシュ通知 - %1$s のアップデートがリリースされたときにプッシュ通知を受け取る - 新しいタイマーの値の保存に失敗しました - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - システム設定 - テーマ - ダークテーマ - ライトテーマ - Manager アップデートセンター - アップデートはありません - 種類 + アクセントカラー + 表示設定 + 動作 + ダウンロード済みファイルを消去 + ファイルを消去しました + アプリのパフォーマンスとクラッシュログに関する情報を収集できます + Firebase アナリティクス + 言語 + Chrome カスタムタブでリンクを開く + Chrome カスタムタブを使用 + %1$s プッシュ通知 + %1$s のアップデートがリリースされたときにプッシュ通知を受け取る + 新しいタイマーの値の保存に失敗しました + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + システム設定 + テーマ + ダークテーマ + ライトテーマ + Manager アップデートセンター + アップデートはありません + 種類 - ログの保存に失敗しました - ログが正常に保存されました + ログの保存に失敗しました + ログが正常に保存されました 詳細 - %1$s のインストールに必要なファイルが見つかりました - %1$s のインストールに必要な全てのファイル準備が整いました。インストールしますか? + %1$s のインストールに必要なファイルが見つかりました + %1$s のインストールに必要な全てのファイル準備が整いました。インストールしますか? %1$s のインストール設定 - アップデートを確認中... + アップデートを確認中... 言語: %1$s テーマ: %1$s バージョン: %1$s - エラー - ガイド - ストップ! + エラー + ガイド + ストップ! Vanced の Magisk/TWRP バージョンを使用しているようです。このバージョンは廃止されており、このアプリでは更新できません。 まず Magisk モジュールを削除するか、TWRP で Vanced uninstaller を使用してください。 - Vanced をインストールするには、開発者設定から MIUI 最適化を無効にしなければなりません。 (20.2.20 以降の xiaomi.eu ベースの ROM の場合はこの警告は無視してください) - MIUI 最適化が有効です! - この処理中はアプリを終了しないでください! - 再ダウンロード - Vancedapp.com、Vanced の Discord サーバーまたは GitHub からアプリをダウンロードしたことを確認してください + Vanced をインストールするには、開発者設定から MIUI 最適化を無効にしなければなりません。 (20.2.20 以降の xiaomi.eu ベースの ROM の場合はこの警告は無視してください) + MIUI 最適化が有効です! + この処理中はアプリを終了しないでください! + 再ダウンロード + Vancedapp.com、Vanced の Discord サーバーまたは GitHub からアプリをダウンロードしたことを確認してください バージョン - ようこそ + ようこそ - Vanced で使用する言語を選択 - 最新版 + Vanced で使用する言語を選択 + 最新版 ライト + %1$s 少なくとも一つの言語を選択してください! - ブラック - ダーク + ブラック + ダーク - Manager 開発 - 他の貢献者 - ソースコード - Vanced チーム + Manager 開発 + 他の貢献者 + ソースコード + Vanced チーム - システム所有者への APK の Chown ができませんでした、もう一度やり直してください. - %1$s のダウンロード中にエラー + システム所有者への APK の Chown ができませんでした、もう一度やり直してください. + %1$s のダウンロード中にエラー 新しいアクセントカラーの適用に失敗しました - パッケージ %1$s のアンインストールに失敗しました - インストールに必要なファイルが見つかりませんでした。再ダウンロードし、もう一度お試しください。 - ストレージからブラック/ダークテーマの APK ファイルが見つかりませんでした。もう一度お試しください。 - ユーザーがインストールを中断したためインストールに失敗しました。 - 既にインストールされたアプリと競合したため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、もう一度やり直してください。 - アプリをダウングレードしようとしたため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、再度お試しください。 - 不明な理由でインストールに失敗しました。さらなるサポートのためには、Telegram か Discord に参加してください。詳細メニューからスクリーンショットを添付してください。 - インストールするファイルがお使いのデバイスと互換性がないためインストールに失敗しました。設定でダウンロードしたファイルを削除してから、もう一度やり直してください。 - APK ファイルが破損しているためインストールに失敗しました、もう一度やり直してください。 - MIUI の最適化が有効になっているためインストールに失敗しました。MIUI の最適化を無効化してから、もう一度やり直してください。 - APK の署名検証が有効化されているためインストールに失敗しました。APK の署名検証を無効化してから、もう一度やり直してください。 - デバイスに十分な空き容量がないため、インストールに失敗しました。 - インストーラーからブラック/ダークテーマの APK ファイルが見つかりませんでした。Manager のアプリデータを消去してから、もう一度お試しください。 - 分割インストール後にストックの YouTube アプリのインストールパスが見つかりませんでした。 + パッケージ %1$s のアンインストールに失敗しました + インストールに必要なファイルが見つかりませんでした。再ダウンロードし、もう一度お試しください。 + ストレージからブラック/ダークテーマの APK ファイルが見つかりませんでした。もう一度お試しください。 + ユーザーがインストールを中断したためインストールに失敗しました。 + 既にインストールされたアプリと競合したため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、もう一度やり直してください。 + アプリをダウングレードしようとしたため、インストールに失敗しました。インストールされたアプリをアンインストールしてから、再度お試しください。 + 不明な理由でインストールに失敗しました。さらなるサポートのためには、Telegram か Discord に参加してください。詳細メニューからスクリーンショットを添付してください。 + インストールするファイルがお使いのデバイスと互換性がないためインストールに失敗しました。設定でダウンロードしたファイルを削除してから、もう一度やり直してください。 + APK ファイルが破損しているためインストールに失敗しました、もう一度やり直してください。 + MIUI の最適化が有効になっているためインストールに失敗しました。MIUI の最適化を無効化してから、もう一度やり直してください。 + APK の署名検証が有効化されているためインストールに失敗しました。APK の署名検証を無効化してから、もう一度やり直してください。 + デバイスに十分な空き容量がないため、インストールに失敗しました。 + インストーラーからブラック/ダークテーマの APK ファイルが見つかりませんでした。Manager のアプリデータを消去してから、もう一度お試しください。 + 分割インストール後にストックの YouTube アプリのインストールパスが見つかりませんでした。 diff --git a/app/src/main/res/values-ka-rGE/strings.xml b/app/src/main/res/values-ka-rGE/strings.xml index 126bd1df82..e85739a3aa 100644 --- a/app/src/main/res/values-ka-rGE/strings.xml +++ b/app/src/main/res/values-ka-rGE/strings.xml @@ -1,120 +1,120 @@ - გაუქმება - დახურვა - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - განულება - შენახვა - აირჩიეთ თქვენი აპები + გაუქმება + დახურვა + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + განულება + შენახვა + აირჩიეთ თქვენი აპები - შესახებ - ინსტრუქცია - მენეჯერი - ჟურნალი - პარამეტრები - მენეჯერის განახლება + შესახებ + ინსტრუქცია + მენეჯერი + ჟურნალი + პარამეტრები + მენეჯერის განახლება - არის თქვენი მოწყობილობა დარუთული? - მიეცით root წვდომა - დავიწყოთ - ერთი აპი მაინც მონიშნეთ! - არ იცით ეს რა არის ან არ გინდათ root ვერსიით სარგებობა? უბრალოდ დააჭირეთ ქვემოთ მოცემულ ლურჯ ისარს! + არის თქვენი მოწყობილობა დარუთული? + მიეცით root წვდომა + დავიწყოთ + ერთი აპი მაინც მონიშნეთ! + არ იცით ეს რა არის ან არ გინდათ root ვერსიით სარგებობა? უბრალოდ დააჭირეთ ქვემოთ მოცემულ ლურჯ ისარს! - %1$s-ის შესახებ - გადმოწერა - ონფორმაცია - ჩართვა - რეინსტალაცია - დეინსტალაცია - განახლება - აპები - ცვლილებები - მიმდინარეობს %1$s-ის გადმოწერა - ინსტალაცია + %1$s-ის შესახებ + გადმოწერა + ონფორმაცია + ჩართვა + რეინსტალაცია + დეინსტალაცია + განახლება + აპები + ცვლილებები + მიმდინარეობს %1$s-ის გადმოწერა + ინსტალაცია უახლესი: - Install Vanced microG first + Install Vanced microG first Root წვდომა არ არის მინიჭებული - სოციალური მედია - დაგვიჭირეთ მხარი - ხელმიუწვდომელია + სოციალური მედია + დაგვიჭირეთ მხარი + ხელმიუწვდომელია დაინსტალირებული: - აქცენტის ფერი - შესახედაობა - ფუნქციები - გადმოწერილი ფაილების გაწმენდა - ფაილები წარმატებით გაიწმინდა - ეს გვაძლევს უფლებას მოვიპოვოთ ინფორმაცია აპის მუშაობის შესახებ - Firebase-ის ანალიტიკა - ენა - ლინკები გაიხსნება Chrome Custom Tabs-ში - გამოიყენეთ Chrome Custom Tabs - %1$s-ს შეტყობინებები - მიიღეთ შეტყობინებები როდესაც %1$s-ის განახლება იქნება ხელმისაწვდომი - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - სისტემის ნაგულისხმევი - თემა - მუქი თემა - ღია თემა - განახლებების ცენტრი - განახლება არ არის აღმოჩენილი - ვარიანტი + აქცენტის ფერი + შესახედაობა + ფუნქციები + გადმოწერილი ფაილების გაწმენდა + ფაილები წარმატებით გაიწმინდა + ეს გვაძლევს უფლებას მოვიპოვოთ ინფორმაცია აპის მუშაობის შესახებ + Firebase-ის ანალიტიკა + ენა + ლინკები გაიხსნება Chrome Custom Tabs-ში + გამოიყენეთ Chrome Custom Tabs + %1$s-ს შეტყობინებები + მიიღეთ შეტყობინებები როდესაც %1$s-ის განახლება იქნება ხელმისაწვდომი + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + სისტემის ნაგულისხმევი + თემა + მუქი თემა + ღია თემა + განახლებების ცენტრი + განახლება არ არის აღმოჩენილი + ვარიანტი - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs დეტალები - აღმოჩენილია %1$s -ის საინსტალაციო ფაილები! - მენეჯერმა აღმოაჩინა %1$s -ის ყველა საჭირო საინსტალაციო ფაილი. გინდათ დააინსტალიროთ? + აღმოჩენილია %1$s -ის საინსტალაციო ფაილები! + მენეჯერმა აღმოაჩინა %1$s -ის ყველა საჭირო საინსტალაციო ფაილი. გინდათ დააინსტალიროთ? %1$s-ის ინსტალაციის პარამეტრები - მიმდინარეობს განახლებების შემოწმება… + მიმდინარეობს განახლებების შემოწმება… ენა(ები): %1$s თემა: %1$s ვერსია: %1$s - შეცდომა - ინსტრუქცია - შეჩერდი! + შეცდომა + ინსტრუქცია + შეჩერდი! თქვენ იყენებთ Vanced-ის Magisk/TWRP ვერსიას, მაგრამ მისი მენეჯერიდან განახლება შეუძლებელია. გთხოვთ წაშალოთ იგი Magisk-იდან/TWRP-ს დეინსტალერიდან. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - თავიდან გადმოწერა - დარწმუნდით, რომ აპი გადმოწერეთ vancedapp.com-იდან, Vanced Discord სერვერიდან ან GitHub-იდან + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + თავიდან გადმოწერა + დარწმუნდით, რომ აპი გადმოწერეთ vancedapp.com-იდან, Vanced Discord სერვერიდან ან GitHub-იდან ვერსია - მოგესალმებით + მოგესალმებით - აირჩიეთ სასურველი ენა(ები) Vanced-ისთვის - უახლესი + აირჩიეთ სასურველი ენა(ები) Vanced-ისთვის + უახლესი ღია + %1$s ერთი ენა მაინც მონიშნეთ! - შავი - მუქი + შავი + მუქი - Manager-ის დეველოპერები - Other Contributors - წყაროები - Vanced-ის გუნდი + Manager-ის დეველოპერები + Other Contributors + წყაროები + Vanced-ის გუნდი - `chown`-ის დროს მოხდა შეცდომა, გთცოვთ სცადოთ თავიდან. - შეცდომა %1$s-ის გადმოწერის დროს + `chown`-ის დროს მოხდა შეცდომა, გთცოვთ სცადოთ თავიდან. + შეცდომა %1$s-ის გადმოწერის დროს შეცდომა აქცენტის ფერის მიღების დროს - პაკეტი %1$s ვერ დეინსტალირდა - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + პაკეტი %1$s ვერ დეინსტალირდა + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-kmr-rTR/strings.xml b/app/src/main/res/values-kmr-rTR/strings.xml index 8fa5ab03fa..5b9440f3aa 100644 --- a/app/src/main/res/values-kmr-rTR/strings.xml +++ b/app/src/main/res/values-kmr-rTR/strings.xml @@ -1,120 +1,120 @@ - Betal bike - Bigire - Ji bo Projeya microG ji bo Vanced tê tetbîqkirin. - Mişterîya YouTube bi gelek taybetmendiyên kêrhatî guherî! - Vanced, lê ji bo YouTube Music!. Ji bo hewcedariyên te, hinekî kêm-dewlemend e. - Nûsaz bike - Tomar bike - Sepanên xwe hilbijêre + Betal bike + Bigire + Ji bo Projeya microG ji bo Vanced tê tetbîqkirin. + Mişterîya YouTube bi gelek taybetmendiyên kêrhatî guherî! + Vanced, lê ji bo YouTube Music!. Ji bo hewcedariyên te, hinekî kêm-dewlemend e. + Nûsaz bike + Tomar bike + Sepanên xwe hilbijêre - Derbarê de - Rêber - Rêveber - Tomar - Sazkarî - Rêveberê Nûve bike + Derbarê de + Rêber + Rêveber + Tomar + Sazkarî + Rêveberê Nûve bike - Gelo cîhaza te Root e? - Destûra Root\'ê bide - Em dest pê bikin - Herî kêm sepanekê hilbijêre! - Gelo ev çi ye an naxwazî versiyona root bi kar bîne? tenê tîrê şîn ê jêrîn bitikînin! + Gelo cîhaza te Root e? + Destûra Root\'ê bide + Em dest pê bikin + Herî kêm sepanekê hilbijêre! + Gelo ev çi ye an naxwazî versiyona root bi kar bîne? tenê tîrê şîn ê jêrîn bitikînin! - Derbar %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Sepanan - Gurankarî - Dakêşe %1$s - Saz bike + Derbar %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Sepanan + Gurankarî + Dakêşe %1$s + Saz bike Dawîn: - Pêşîn Vanced microG saz bikin + Pêşîn Vanced microG saz bikin Destlênedanên kokê nayê dayîn - Medyaya Civakî - Piştgiriya me bikin - Neberdest + Medyaya Civakî + Piştgiriya me bikin + Neberdest Sazkirî: - Rengê devkî - Xuyang - Tevger - Pelên dakêşandî paqij bikin - Pelên bi serkeftî hatin paqijkirin - Ev dibe ku em di derbarê performansa sepan û tomarê têkçûyî de agahdariyan berhev bikin - Firebase Analytics - Ziman - Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin - Hilpekên Chrome\'ê yên taybet bi kar bîne - %1$s Danezanên Lezgîn - Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire - Barkirina nirxa dema nû bi ser neket - Dema Xewê ya Skrîpta Root - Nirxa dema xewê ya ku tê bikaranîn sererast bikin /data/adb/service.d/app.sh skrîpt, ji bo rastkirina pirsgirêkên pêvekirinê kêrhatî ye - Jixwebera Sîstemê - Rûkar - Rûkara tarî - Rûkara Ronî - Navenda Hildemandina Rêveberê - Nûvekirinên nû tune - Varyant + Rengê devkî + Xuyang + Tevger + Pelên dakêşandî paqij bikin + Pelên bi serkeftî hatin paqijkirin + Ev dibe ku em di derbarê performansa sepan û tomarê têkçûyî de agahdariyan berhev bikin + Firebase Analytics + Ziman + Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin + Hilpekên Chrome\'ê yên taybet bi kar bîne + %1$s Danezanên Lezgîn + Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire + Barkirina nirxa dema nû bi ser neket + Dema Xewê ya Skrîpta Root + Nirxa dema xewê ya ku tê bikaranîn sererast bikin /data/adb/service.d/app.sh skrîpt, ji bo rastkirina pirsgirêkên pêvekirinê kêrhatî ye + Jixwebera Sîstemê + Rûkar + Rûkara tarî + Rûkara Ronî + Navenda Hildemandina Rêveberê + Nûvekirinên nû tune + Varyant - Torkirina rojnivîsk bi ser neket - Rojnivîsk bi serkeftî torandin + Torkirina rojnivîsk bi ser neket + Rojnivîsk bi serkeftî torandin Kîtekît - Pelên sazkirinê %1$s hatin tespîtkirin! - Rêveberê diyar kir ku hemû pelên pêwîst ji bo sazkirina %1$s hatine dîtin. Tu dixwazî saz bikî? + Pelên sazkirinê %1$s hatin tespîtkirin! + Rêveberê diyar kir ku hemû pelên pêwîst ji bo sazkirina %1$s hatine dîtin. Tu dixwazî saz bikî? Vebijarkên Sazkirinê yên %1$s - Li nûvekirinan tê vekolîn… + Li nûvekirinan tê vekolîn… Ziman(ên): %1$s Rûkar: %1$s Guherto: %1$s - Çewtî - Rêber - Bisekine! + Çewtî + Rêber + Bisekine! Tu versiyona Magisk/TWRP ya Vanced ê ku hatiye jêbirin û bi bikaranîna vê sepanê nikare were nûjenkirin, bi kar tîne. Ji kerema xwe rake bi rakirina mobîla Magisk/bi karanîna TWRP Vanced rakirin. - Ji bo sazkirina Vanced, divê tu optimîzasyonên MIUI di mîhengên pêşdebiran de neçalak bikî. (Heke hûn 20.2.20 an jî paşê bi romê xiaomi.eu vê hişyariyê paşguh bikin) - Optimîzasyonên MIUI tên çalak kirin! - Ji kerema xwe di vê pêvajoyê de ji sepanê dernakeve! - Ji nû ve daxîne - Pê bawer bin ku te ev sepan ji vancedapp.com, servera Discord a Vanced an jî JiGitHub ya Vanced dakêşandine + Ji bo sazkirina Vanced, divê tu optimîzasyonên MIUI di mîhengên pêşdebiran de neçalak bikî. (Heke hûn 20.2.20 an jî paşê bi romê xiaomi.eu vê hişyariyê paşguh bikin) + Optimîzasyonên MIUI tên çalak kirin! + Ji kerema xwe di vê pêvajoyê de ji sepanê dernakeve! + Ji nû ve daxîne + Pê bawer bin ku te ev sepan ji vancedapp.com, servera Discord a Vanced an jî JiGitHub ya Vanced dakêşandine Versiyon - Bi xêr hatî + Bi xêr hatî - Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre - Herî dawî + Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre + Herî dawî Ronahî + %1$s Bi kêmanî zimanekî hilbijêre! - Reş - Tarî + Reş + Tarî - Pêşvebirên Rêveberê - Beşdarên din - Çavkanî - Koma Vanced\'ê + Pêşvebirên Rêveberê + Beşdarên din + Çavkanî + Koma Vanced\'ê - APK\'yê ji xwediyê pergalê re \'chown\' bi ser neket, ji kerema xwe re careke din biceribînin. - Di daxistina %1$s de çewtî + APK\'yê ji xwediyê pergalê re \'chown\' bi ser neket, ji kerema xwe re careke din biceribînin. + Di daxistina %1$s de çewtî Lêpirandina rengê nû yê zaravayê biserneket - Sazkirina pakêta %1$s bi ser neket - Sazkirina pelên pêwîst bi ser neket. Pelên sazkirinê ji nû ve dakêşin, piştre dîsa biceribînin. - Nekarî pelê apk ji bo dirba reş/tarî ji hilanînê bicîh bike, ji kerema xwe re dîsa biceribîne. - Sazkirin bi ser neket ji ber ku bikarhêner sazkirin bete betalkirin. - Sazkirin bi ser neket ji ber ku pêvek bi pêvek berê sazkirî re naqede. Vê versiyona heyî ya vê appê saz bike, paşê dîsa biceribîne. - Sazkirin bi ser neket ji ber ku bikarhêner hewl da pakêtê kêm bike. Nûvekirinên ji parsûyê rabike, paşê dîsa biceribîne. - Sazkirin ji ber sedemên nediyar têk çû, ji bo piştgiriya zêdetir tevlî Telegram an Jî Discordê me bibin. Ji kerema xwe dîmenek ekranê jî ji menuya Pêşkeftî ve girêdayî bikin - Sazkirin bi ser neket ji ber ku pelê sazkirinê bi cîhaza we re ne hevkar e. Mîhengên daxistinî paqij bike, paşê dîsa biceribîne. - Sazkirin bi ser neket ji ber ku pelên apk\'ê nebaş in, ji kerema xwe careke din biceribînin. - Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. - Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. - Sazkirin bi ser neket ji ber ku cîhaz têra xwe cihê belaş tune. - Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. - Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. + Sazkirina pakêta %1$s bi ser neket + Sazkirina pelên pêwîst bi ser neket. Pelên sazkirinê ji nû ve dakêşin, piştre dîsa biceribînin. + Nekarî pelê apk ji bo dirba reş/tarî ji hilanînê bicîh bike, ji kerema xwe re dîsa biceribîne. + Sazkirin bi ser neket ji ber ku bikarhêner sazkirin bete betalkirin. + Sazkirin bi ser neket ji ber ku pêvek bi pêvek berê sazkirî re naqede. Vê versiyona heyî ya vê appê saz bike, paşê dîsa biceribîne. + Sazkirin bi ser neket ji ber ku bikarhêner hewl da pakêtê kêm bike. Nûvekirinên ji parsûyê rabike, paşê dîsa biceribîne. + Sazkirin ji ber sedemên nediyar têk çû, ji bo piştgiriya zêdetir tevlî Telegram an Jî Discordê me bibin. Ji kerema xwe dîmenek ekranê jî ji menuya Pêşkeftî ve girêdayî bikin + Sazkirin bi ser neket ji ber ku pelê sazkirinê bi cîhaza we re ne hevkar e. Mîhengên daxistinî paqij bike, paşê dîsa biceribîne. + Sazkirin bi ser neket ji ber ku pelên apk\'ê nebaş in, ji kerema xwe careke din biceribînin. + Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. + Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. + Sazkirin bi ser neket ji ber ku cîhaz têra xwe cihê belaş tune. + Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. + Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index a5ac9a75db..21c57d4694 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -1,120 +1,120 @@ - 취소 - 닫기 - microG 프로젝트를 기반으로 커스텀한 Vanced용 Google 모바일 서비스입니다. - 다수의 유용한 기능을 가지는 YouTube 변경 클라이언트입니다! - YouTube Music의 Vanced 버전입니다. 추가된 기능이 그렇게 많지는 않지만 충분히 만족하실 거예요. - 초기화 - 저장 - 설치할 앱 선택하기 + 취소 + 닫기 + microG 프로젝트를 기반으로 커스텀한 Vanced용 Google 모바일 서비스입니다. + 다수의 유용한 기능을 가지는 YouTube 변경 클라이언트입니다! + YouTube Music의 Vanced 버전입니다. 추가된 기능이 그렇게 많지는 않지만 충분히 만족하실 거예요. + 초기화 + 저장 + 설치할 앱 선택하기 - 정보 - 가이드 - Manager - 로그 - 설정 - 매니저 업데이트 + 정보 + 가이드 + Manager + 로그 + 설정 + 매니저 업데이트 - 기기가 루팅되어 있나요? - 루트 권한 부여 - 시작하기 - 적어도 하나의 앱을 선택해주세요 - 이게 무슨 뜻인지 모르시거나 루트 버전을 사용하고 싶지 않으시다고요? 그냥 아래의 파란색 화살표를 클릭하세요! + 기기가 루팅되어 있나요? + 루트 권한 부여 + 시작하기 + 적어도 하나의 앱을 선택해주세요 + 이게 무슨 뜻인지 모르시거나 루트 버전을 사용하고 싶지 않으시다고요? 그냥 아래의 파란색 화살표를 클릭하세요! - %1$s 정보 - 다운로드 - 정보 - 실행 - 재설치 - 제거 - 업데이트 - - 변경 사항 - %1$s 다운로드 중 - 설치 + %1$s 정보 + 다운로드 + 정보 + 실행 + 재설치 + 제거 + 업데이트 + + 변경 사항 + %1$s 다운로드 중 + 설치 최신: - Vanced microG를 우선 설치하십시오 + Vanced microG를 우선 설치하십시오 루트 권한이 부여되지 않았습니다 - 소셜 미디어 - 지원하기 - 사용 불가 + 소셜 미디어 + 지원하기 + 사용 불가 설치됨: - 강조 색상 - 모양 - 동작 - 다운로드된 파일 모두 지우기 - 다운로드된 파일을 모두 삭제했습니다 - 앱 성능과 충돌 기록에 대한 정보를 수집할 수 있게 해줍니다 - Firebase 분석 - 언어 - 링크가 Chrome 커스텀 탭으로 열립니다 - Chrome 커스텀 탭으로 열기 - %1$s 푸시 알림 - 새로운 %1$s 업데이트가 출시되면 알림 받기 - 새 시간 값을 저장할 수 없습니다. - 루트 스크립트 대기 시간 - /data/adb/service.d/app.sh 스크립트에 쓰이는 대기 시간을 조정하십시오. 설치 문제 해결에 유용합니다. - 시스템 기본값 - 테마 - 다크 테마 - 라이트 테마 - 업데이트 센터 - 새로운 업데이트 없음 - 앱 종류 + 강조 색상 + 모양 + 동작 + 다운로드된 파일 모두 지우기 + 다운로드된 파일을 모두 삭제했습니다 + 앱 성능과 충돌 기록에 대한 정보를 수집할 수 있게 해줍니다 + Firebase 분석 + 언어 + 링크가 Chrome 커스텀 탭으로 열립니다 + Chrome 커스텀 탭으로 열기 + %1$s 푸시 알림 + 새로운 %1$s 업데이트가 출시되면 알림 받기 + 새 시간 값을 저장할 수 없습니다. + 루트 스크립트 대기 시간 + /data/adb/service.d/app.sh 스크립트에 쓰이는 대기 시간을 조정하십시오. 설치 문제 해결에 유용합니다. + 시스템 기본값 + 테마 + 다크 테마 + 라이트 테마 + 업데이트 센터 + 새로운 업데이트 없음 + 앱 종류 - 로그 저장 실패 - 로그 저장됨 + 로그 저장 실패 + 로그 저장됨 자세히 - %1$s 설치에 필요한 파일을 찾았습니다! - Manager 앱이 %1$s 설치에 필요한 모든 파일을 찾았습니다. 지금 설치하시겠어요? + %1$s 설치에 필요한 파일을 찾았습니다! + Manager 앱이 %1$s 설치에 필요한 모든 파일을 찾았습니다. 지금 설치하시겠어요? %1$s 설치 설정 - 업데이트 확인 중입니다... + 업데이트 확인 중입니다... 언어: %1$s 테마: %1$s 버전: %1$s - 오류 - 가이드 - 잠깐만요! + 오류 + 가이드 + 잠깐만요! 현재 설치되어 있는 Vanced의 Magisk/TWRP 버전은 더 이상 지원되지 않으며 이 앱으로 업데이트할 수 없습니다. 먼저 삭제 프로그램을 이용하여 Vanced의 TWRP/Magisk 모듈을 제거하여 주시기 바랍니다. - Vanced를 올바르게 설치하려면, 개발자 설정으로 들어가서 MIUI 최적화 기능을 반드시 끄셔야 합니다. (단, 버전이 20.2.20 이상인 xiaomi.eu 기반 ROM을 사용하는 경우 이 경고를 무시하셔도 좋습니다) - MIUI 최적화 기능이 켜져 있습니다! - 이 작업을 하는 동안 이 앱에서 나가지 마세요! - 다시 다운로드 - 항상 vancedapp.com, 공식 Vanced 디스코드 서버 또는 공식 GitHub 저장소에서 Vanced Manager 앱을 다운로드해주세요. + Vanced를 올바르게 설치하려면, 개발자 설정으로 들어가서 MIUI 최적화 기능을 반드시 끄셔야 합니다. (단, 버전이 20.2.20 이상인 xiaomi.eu 기반 ROM을 사용하는 경우 이 경고를 무시하셔도 좋습니다) + MIUI 최적화 기능이 켜져 있습니다! + 이 작업을 하는 동안 이 앱에서 나가지 마세요! + 다시 다운로드 + 항상 vancedapp.com, 공식 Vanced 디스코드 서버 또는 공식 GitHub 저장소에서 Vanced Manager 앱을 다운로드해주세요. 버전 - 환영합니다 + 환영합니다 - Vanced에서 선호하는 언어를 선택해주세요 - 최신 + Vanced에서 선호하는 언어를 선택해주세요 + 최신 라이트 + %1$s 적어도 하나의 언어를 선택해주세요! - 검정 - 다크 + 검정 + 다크 - Manager 개발자 - 기타 기여자 - 소스 코드 - Vanced 팀 + Manager 개발자 + 기타 기여자 + 소스 코드 + Vanced 팀 - APK의 소유권을 시스템 관리자로 변경하던 중에 오류가 발생하였습니다. 다시 시도하십시오. - %1$s 다운로드 중 오류 발생 + APK의 소유권을 시스템 관리자로 변경하던 중에 오류가 발생하였습니다. 다시 시도하십시오. + %1$s 다운로드 중 오류 발생 강조 색상을 적용하지 못했습니다 - %1$s 패키지 제거에 실패하였습니다 - 설치에 필요한 파일을 찾지 못했습니다. 설치 파일을 다시 다운로드한 다음 재시도하십시오. - 저장소에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. 다시 시도하십시오. - 사용자가 설치를 중단했기 때문에 앱을 설치하지 못했습니다. - 앱이 이미 설치된 앱과 충돌하여 설치하지 못했습니다. 현재 버전의 앱을 제거한 다음 다시 시도하십시오. - 사용자가 패키지를 이전 버전으로 변경하려고 하여 앱을 설치하지 못했습니다. 기본 앱의 업데이트를 제거한 후, 설치를 다시 시도해주세요. - 알 수 없는 이유로 인해 설치가 실패했습니다. 저희 텔레그램 또는 디스코드에 알려주시면 도와드리겠습니다. \'고급\' 메뉴의 스크린샷도 첨부하여 주십시오. - 설치 파일이 기기와 호환되지 않아 앱을 설치하지 못했습니다. Manager 설정에서 다운로드된 파일을 모두 삭제한 다음, 설치를 다시 진행해주세요. - APK 파일이 손상되어 앱을 설치하지 못했습니다. 설치를 다시 진행해주세요. - MIUI 최적화 기능이 켜져 있어 앱을 설치하지 못했습니다. MIUI 최적화 기능을 끄고, 설치를 다시 진행해주세요. - APK 서명 검증 기능이 활성화되어 있어 앱을 설치하지 못했습니다. 먼저 APK 서명 검증 기능을 비활성화한 다음, 설치를 다시 진행해주세요. - 기기에 충분한 여유 공간이 없어 설치하지 못했습니다. - 설치 관리자에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. Vanced Manager의 앱 데이터를 삭제 한 다음 다시 시도하십시오. - 분할 설치 완료 후 기본 YouTube 앱 설치 경로를 찾을 수 없습니다. + %1$s 패키지 제거에 실패하였습니다 + 설치에 필요한 파일을 찾지 못했습니다. 설치 파일을 다시 다운로드한 다음 재시도하십시오. + 저장소에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. 다시 시도하십시오. + 사용자가 설치를 중단했기 때문에 앱을 설치하지 못했습니다. + 앱이 이미 설치된 앱과 충돌하여 설치하지 못했습니다. 현재 버전의 앱을 제거한 다음 다시 시도하십시오. + 사용자가 패키지를 이전 버전으로 변경하려고 하여 앱을 설치하지 못했습니다. 기본 앱의 업데이트를 제거한 후, 설치를 다시 시도해주세요. + 알 수 없는 이유로 인해 설치가 실패했습니다. 저희 텔레그램 또는 디스코드에 알려주시면 도와드리겠습니다. \'고급\' 메뉴의 스크린샷도 첨부하여 주십시오. + 설치 파일이 기기와 호환되지 않아 앱을 설치하지 못했습니다. Manager 설정에서 다운로드된 파일을 모두 삭제한 다음, 설치를 다시 진행해주세요. + APK 파일이 손상되어 앱을 설치하지 못했습니다. 설치를 다시 진행해주세요. + MIUI 최적화 기능이 켜져 있어 앱을 설치하지 못했습니다. MIUI 최적화 기능을 끄고, 설치를 다시 진행해주세요. + APK 서명 검증 기능이 활성화되어 있어 앱을 설치하지 못했습니다. 먼저 APK 서명 검증 기능을 비활성화한 다음, 설치를 다시 진행해주세요. + 기기에 충분한 여유 공간이 없어 설치하지 못했습니다. + 설치 관리자에서 블랙/다크 테마에 대한 apk 파일을 찾지 못했습니다. Vanced Manager의 앱 데이터를 삭제 한 다음 다시 시도하십시오. + 분할 설치 완료 후 기본 YouTube 앱 설치 경로를 찾을 수 없습니다. diff --git a/app/src/main/res/values-ku-rTR/strings.xml b/app/src/main/res/values-ku-rTR/strings.xml index c07fd98bfa..fcbddb040d 100644 --- a/app/src/main/res/values-ku-rTR/strings.xml +++ b/app/src/main/res/values-ku-rTR/strings.xml @@ -1,120 +1,120 @@ - Betal bike - Bigire - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Nûsaz bike - Tomar bike - Sepanên xwe hilbijêre + Betal bike + Bigire + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Nûsaz bike + Tomar bike + Sepanên xwe hilbijêre - Derbar - Rêzan - Rêvebirin - Logs - Sazkarî - Rêveberê hildemîne + Derbar + Rêzan + Rêvebirin + Logs + Sazkarî + Rêveberê hildemîne - Gelo cîhaza te Root e? - Destûra Root\'ê bide - Dest pê kirin - Herî kêm sepanekê hilbijêre! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Gelo cîhaza te Root e? + Destûra Root\'ê bide + Dest pê kirin + Herî kêm sepanekê hilbijêre! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - Derbar %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Guherîn - Tê daxistin %1$s - Saz bike + Derbar %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Guherîn + Tê daxistin %1$s + Saz bike Dawîn: - Install Vanced microG first + Install Vanced microG first Rê li gihana Root nehate dayîn - Social Media - Piştgiriya me bike - Berdest nîne + Social Media + Piştgiriya me bike + Berdest nîne Saz bike: - Rengê devokê - Xuyang - Behavior - Dosiyayên daxistî paqij bike - Dosiya, biserketî paqij bûn - Ev yek dihêle ku em di bara performansa sepanê û tomarên hilweşiyayî de agahiyan berhev bikin - Analîza Firebase\'ê - Ziman - Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin - Hilpekên Chrome\'ê yên taybet bi kar bîne - %1$s danezanên lezgîn - Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - Jixwebera sîstemê - Rûkar - Rûkara tarî - Rûkara ronak - Navenda hildemandina rêveberê - Hildema nû nîne - Guharto + Rengê devokê + Xuyang + Behavior + Dosiyayên daxistî paqij bike + Dosiya, biserketî paqij bûn + Ev yek dihêle ku em di bara performansa sepanê û tomarên hilweşiyayî de agahiyan berhev bikin + Analîza Firebase\'ê + Ziman + Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin + Hilpekên Chrome\'ê yên taybet bi kar bîne + %1$s danezanên lezgîn + Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + Jixwebera sîstemê + Rûkar + Rûkara tarî + Rûkara ronak + Navenda hildemandina rêveberê + Hildema nû nîne + Guharto - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s dosiyên sazkirinê peyda bûn! - Rêveberê peydabûna hemû ew dosiyên pêwîst ên ji bo sazkirina %1$s tesbît kir. Gelo tu dixwazî saz bikî? + %1$s dosiyên sazkirinê peyda bûn! + Rêveberê peydabûna hemû ew dosiyên pêwîst ên ji bo sazkirina %1$s tesbît kir. Gelo tu dixwazî saz bikî? %1$s sazkariyên bijarde yên sazkirinê - Hildem tên kontrolkirin... + Hildem tên kontrolkirin... Ziman(ên):%1$s Rûkar: %1$s Guherto: %1$s - Çewtî - Rêzan - Rawestîne! + Çewtî + Rêzan + Rawestîne! Hûn niha guhertoya Magisk/TWRP ji Vanced\'ê bi kar tînin, ku qut bûye û bi saya vê sepanê naye hildemandin. Jkx magsik module/bi alîkariya TWRP Vanced uninstaller\'ê rakin. - Ji bo ku Vanced were sazkirin, DIVÊ hûn Optimîzasyonên MIUI-yê di sazkariyên pêşvebirinê de neçalak bikin. (Hûn dikarin vê hişyariyê paşguh bikin heke hûn ROM\'a li ser esasa xiaomi.eu 20.2.20 an jortir bi kar tînin) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Ji nû ve daxîne - Piştrast bin ku we sepan ji vancedapp.com\'ê, ji servera Vanced Discord\'ê an Vanced GitHub\'ê daxistiye + Ji bo ku Vanced were sazkirin, DIVÊ hûn Optimîzasyonên MIUI-yê di sazkariyên pêşvebirinê de neçalak bikin. (Hûn dikarin vê hişyariyê paşguh bikin heke hûn ROM\'a li ser esasa xiaomi.eu 20.2.20 an jortir bi kar tînin) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Ji nû ve daxîne + Piştrast bin ku we sepan ji vancedapp.com\'ê, ji servera Vanced Discord\'ê an Vanced GitHub\'ê daxistiye Guherto - Bi xêr hatî + Bi xêr hatî - Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre - Dawîn + Ziman(ên) xwe yën dilxwaz ji bo Vanced\'ê hilbijêre + Dawîn Ronak + %1$s Herî kêm zimanekê hilbijêre! - Reş - Tarî + Reş + Tarî - Pêşvebirên rêveberê - Other Contributors - Çavkanî - Koma Vanced\'ê + Pêşvebirên rêveberê + Other Contributors + Çavkanî + Koma Vanced\'ê - \'Chown\' apk ji xwediyê sîstemê re bi ser neket, jkx dîsa biceribîne. - Çewtiya daxistinê %1$s + \'Chown\' apk ji xwediyê sîstemê re bi ser neket, jkx dîsa biceribîne. + Çewtiya daxistinê %1$s Failed to apply new accent color - Rakirina pakêta %1$s bi ser neket - Dozîna dosiyên pêwîst ji bo sazkirinê bi ser neket. Dosiyên sazkirinê dîsa daxîne, paşê dubare biceribîne. - Dozîna dosiya apk ji bo rûkara reş/tarî ji bîrgehê bi ser neket, jkx dîsa biceribîne. - Sazkirin bi ser neket ji ber ku bikarîner dawî li pêvajoya sazkirinê anî. - Sazkirin bi ser neket ji ber ku ev bernameya ligel bernameyeke din ya sazkirî li hev nake. Guhertoya heyî ya Vanced\'ê rakin, paşê dîsa biceribînin. - Sazkirin bi ser neket ji ber ku bikarîner hewl dida derecebendiya pakêtê kêm bike. Hildeman ji bernameya YouTube\'ê ya heyî rakin, paşê dîsa biceribînin. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Sazkirin bi ser neket ji ber ku dosiya sazkirinê ligel cîhaza te hevaheng nîne. Dosiyên daxistî ji sazkariyan paqij bike, paşê dîsa biceribîne. - Sazkirin bi ser neket ji ber ku dosiyên apk\'ayê xirab in, jkx dîsa biceribîne. - Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. - Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. - Installation failed because the device doesn\'t have enough free space. - Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. - Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. + Rakirina pakêta %1$s bi ser neket + Dozîna dosiyên pêwîst ji bo sazkirinê bi ser neket. Dosiyên sazkirinê dîsa daxîne, paşê dubare biceribîne. + Dozîna dosiya apk ji bo rûkara reş/tarî ji bîrgehê bi ser neket, jkx dîsa biceribîne. + Sazkirin bi ser neket ji ber ku bikarîner dawî li pêvajoya sazkirinê anî. + Sazkirin bi ser neket ji ber ku ev bernameya ligel bernameyeke din ya sazkirî li hev nake. Guhertoya heyî ya Vanced\'ê rakin, paşê dîsa biceribînin. + Sazkirin bi ser neket ji ber ku bikarîner hewl dida derecebendiya pakêtê kêm bike. Hildeman ji bernameya YouTube\'ê ya heyî rakin, paşê dîsa biceribînin. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Sazkirin bi ser neket ji ber ku dosiya sazkirinê ligel cîhaza te hevaheng nîne. Dosiyên daxistî ji sazkariyan paqij bike, paşê dîsa biceribîne. + Sazkirin bi ser neket ji ber ku dosiyên apk\'ayê xirab in, jkx dîsa biceribîne. + Sazkirin bi ser neket ji ber ku MIUI Optimization çalak e. MIUI Optimization\'ê neçalak bikin, paşê dîsa biceribînin. + Sazkirin bi ser neket ji ber ku rastandina îmzeya apk\'ayê çalak e. Rastandina îmzeya apk\'ayê neçalak bikin, paşê dîsa biceribînin. + Installation failed because the device doesn\'t have enough free space. + Dozîna dosiya apk ji bo rûkara reş/tarî ji sazkirinê bi ser neket. Daneyên sepanê ji rêveberê paqij bikin, paşê dîsa biceribîne. + Piştî sazkirina dabeşkirî, dozîna rêka sazkirina YouTube stokê bi ser neket. diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index e5224e8f09..7d697f5571 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -1,120 +1,120 @@ - Cancel - Close - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Reset - Save - Select Your Apps + Cancel + Close + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Reset + Save + Select Your Apps - About - Guide - Manager - Logs - Settings - Update Manager + About + Guide + Manager + Logs + Settings + Update Manager - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Select at least one app! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + Install Latest: - Install Vanced microG first + Install Vanced microG first Root access not granted - Social Media - Support us - Unavailable + Social Media + Support us + Unavailable Installed: - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Variant + Accent Color + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + Theme + Dark Theme + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - Error - Guide - Stop! + Error + Guide + Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Welcome + Welcome - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Sources - Vanced Team + Manager Devs + Other Contributors + Sources + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-ml-rIN/strings.xml b/app/src/main/res/values-ml-rIN/strings.xml index d6f1d2f638..a1e2e9953c 100644 --- a/app/src/main/res/values-ml-rIN/strings.xml +++ b/app/src/main/res/values-ml-rIN/strings.xml @@ -1,120 +1,120 @@ - റദ്ദാക്കുക - അടക്കുക - മൈക്രോ ജി പ്രോജക്റ്റിനെ അടിസ്ഥാനമാക്കി വാൻസിനായി ഒരു ഇഷ്‌ടാനുസൃത ജിഎംഎസ് നടപ്പിലാക്കൽ. - ഉപയോഗപ്രദമായ നിരവധി സവിശേഷതകളുള്ള ഒരു പരിഷ്‌ക്കരിച്ച YouTube ക്ലയന്റ്! - വിജയിച്ചു, പക്ഷേ YouTube സംഗീതത്തിനായി! താരതമ്യേന സവിശേഷത കുറവാണെങ്കിലും നിങ്ങളുടെ ആവശ്യങ്ങൾ നിറവേറ്റുന്നു. - പുനഃക്രമീകരിക്കുക - സൂക്ഷിക്കുക - നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ തിരഞ്ഞെടുക്കുക + റദ്ദാക്കുക + അടക്കുക + മൈക്രോ ജി പ്രോജക്റ്റിനെ അടിസ്ഥാനമാക്കി വാൻസിനായി ഒരു ഇഷ്‌ടാനുസൃത ജിഎംഎസ് നടപ്പിലാക്കൽ. + ഉപയോഗപ്രദമായ നിരവധി സവിശേഷതകളുള്ള ഒരു പരിഷ്‌ക്കരിച്ച YouTube ക്ലയന്റ്! + വിജയിച്ചു, പക്ഷേ YouTube സംഗീതത്തിനായി! താരതമ്യേന സവിശേഷത കുറവാണെങ്കിലും നിങ്ങളുടെ ആവശ്യങ്ങൾ നിറവേറ്റുന്നു. + പുനഃക്രമീകരിക്കുക + സൂക്ഷിക്കുക + നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ തിരഞ്ഞെടുക്കുക - കുറിച്ച് - മാർഗരേഖ - മാനേജർ - ലോഗുകൾ - ക്രമീകരണങ്ങൾ - മാനേജർ പുതുക്കുക + കുറിച്ച് + മാർഗരേഖ + മാനേജർ + ലോഗുകൾ + ക്രമീകരണങ്ങൾ + മാനേജർ പുതുക്കുക - നിങ്ങളുടെ ഉപകരണം റൂട്ടു ചെയ്തതാണോ? - റൂട്ട് അനുമതി നൽകുക - നമുക്ക് തുടങ്ങാം - ഒരു അപ്ലിക്കേഷനെങ്കിലും തിരഞ്ഞെടുക്കുക! - ഇത് എന്താണെന്ന് അറിയില്ല അല്ലെങ്കിൽ റൂട്ട് പതിപ്പ് ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്നില്ലേ? ചുവടെയുള്ള നീല അമ്പടയാളത്തിൽ ക്ലിക്കുചെയ്യുക! + നിങ്ങളുടെ ഉപകരണം റൂട്ടു ചെയ്തതാണോ? + റൂട്ട് അനുമതി നൽകുക + നമുക്ക് തുടങ്ങാം + ഒരു അപ്ലിക്കേഷനെങ്കിലും തിരഞ്ഞെടുക്കുക! + ഇത് എന്താണെന്ന് അറിയില്ല അല്ലെങ്കിൽ റൂട്ട് പതിപ്പ് ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്നില്ലേ? ചുവടെയുള്ള നീല അമ്പടയാളത്തിൽ ക്ലിക്കുചെയ്യുക! - ഏകദേശം %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - അപ്ലിക്കേഷനുകൾ - ചേഞ്ച് ലോഗ് - %1$s ഡൗൺലോഡ് ചെയ്യുന്നു - ഇൻസ്റ്റാൾ ചെയ്യുക + ഏകദേശം %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + അപ്ലിക്കേഷനുകൾ + ചേഞ്ച് ലോഗ് + %1$s ഡൗൺലോഡ് ചെയ്യുന്നു + ഇൻസ്റ്റാൾ ചെയ്യുക ഏറ്റവും പുതിയത്: - ആധ്യം വാൻസ്ഡ് മൈക്രോ-ജി ഇൻസ്റ്റാൾ ചെയ്യുക്ക + ആധ്യം വാൻസ്ഡ് മൈക്രോ-ജി ഇൻസ്റ്റാൾ ചെയ്യുക്ക റൂട്ട് ആക്സസ് അനുവദിച്ചിട്ടില്ല - സോഷ്യൽ മീഡിയ - ഞങ്ങളെ പിന്തുണയ്ക്കുക - ലഭ്യമല്ല + സോഷ്യൽ മീഡിയ + ഞങ്ങളെ പിന്തുണയ്ക്കുക + ലഭ്യമല്ല ഇൻസ്റ്റാൾ ചെയ്തു: - ആക്‌സന്റ് വർണ്ണം - രൂപം - പെരുമാറ്റം - ഡൗൺലോഡുചെയ്‌ത ഫയലുകൾ മായ്‌ക്കുക - ഫയലുകൾ വിജയകരമായി മായ്ച്ചു - അപ്ലിക്കേഷൻ പ്രകടനത്തെയും ക്രാഷ് ലോഗുകളെയും കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കാൻ ഇത് ഞങ്ങളെ അനുവദിക്കുന്നു - ഫയർബേസ് അനലിറ്റിക്സ് - ഭാഷ - Chrome Custom ടാബുകളിൽ ലിങ്കുകൾ തുറക്കും - Chrome Custom ടാബുകൾ ഉപയോഗിക്കുക - %1$s പുഷ് അറിയിപ്പുകൾ - %1$s ഒരു അപ്‌ഡേറ്റ് പുറത്തിറങ്ങുമ്പോൾ പുഷ് അറിയിപ്പുകൾ സ്വീകരിക്കുക - പുതിയ സമയ മൂല്യം സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു - റൂട്ട് സ്ക്രിപ്റ്റ് ഉറക്ക സമയം - മ d ണ്ടിംഗ് പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നതിന് ഉപയോഗപ്രദമായ /data/adb/service.d/app.sh സ്ക്രിപ്റ്റിൽ ഉപയോഗിച്ചിരിക്കുന്ന ഉറക്ക സമയ മൂല്യം ക്രമീകരിക്കുക - സിസ്റ്റം സ്ഥിരസ്ഥിതി - തീം - ഡാർക്ക് തീം - ലൈറ്റ് തീം - മാനേജർ അപ്‌ഡേറ്റ് സെന്റർ - പുതിയ അപ്‌ഡേറ്റുകളൊന്നുമില്ല - വേരിയൻറ് + ആക്‌സന്റ് വർണ്ണം + രൂപം + പെരുമാറ്റം + ഡൗൺലോഡുചെയ്‌ത ഫയലുകൾ മായ്‌ക്കുക + ഫയലുകൾ വിജയകരമായി മായ്ച്ചു + അപ്ലിക്കേഷൻ പ്രകടനത്തെയും ക്രാഷ് ലോഗുകളെയും കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കാൻ ഇത് ഞങ്ങളെ അനുവദിക്കുന്നു + ഫയർബേസ് അനലിറ്റിക്സ് + ഭാഷ + Chrome Custom ടാബുകളിൽ ലിങ്കുകൾ തുറക്കും + Chrome Custom ടാബുകൾ ഉപയോഗിക്കുക + %1$s പുഷ് അറിയിപ്പുകൾ + %1$s ഒരു അപ്‌ഡേറ്റ് പുറത്തിറങ്ങുമ്പോൾ പുഷ് അറിയിപ്പുകൾ സ്വീകരിക്കുക + പുതിയ സമയ മൂല്യം സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു + റൂട്ട് സ്ക്രിപ്റ്റ് ഉറക്ക സമയം + മ d ണ്ടിംഗ് പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നതിന് ഉപയോഗപ്രദമായ /data/adb/service.d/app.sh സ്ക്രിപ്റ്റിൽ ഉപയോഗിച്ചിരിക്കുന്ന ഉറക്ക സമയ മൂല്യം ക്രമീകരിക്കുക + സിസ്റ്റം സ്ഥിരസ്ഥിതി + തീം + ഡാർക്ക് തീം + ലൈറ്റ് തീം + മാനേജർ അപ്‌ഡേറ്റ് സെന്റർ + പുതിയ അപ്‌ഡേറ്റുകളൊന്നുമില്ല + വേരിയൻറ് - ലോഗുകൾ സംരക്ഷിക്കാനായില്ല - ലോഗുകൾ വിജയകരമായി സംരക്ഷിച്ചു + ലോഗുകൾ സംരക്ഷിക്കാനായില്ല + ലോഗുകൾ വിജയകരമായി സംരക്ഷിച്ചു വിശദാംശങ്ങൾ - %1$s ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ കണ്ടെത്തി! - %1$s ഇൻസ്റ്റാളേഷന് ആവശ്യമായ എല്ലാ ഫയലുകൾ മാനേജർ കണ്ടെത്തി. ഇത് ഇൻസ്റ്റാൾ ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? + %1$s ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ കണ്ടെത്തി! + %1$s ഇൻസ്റ്റാളേഷന് ആവശ്യമായ എല്ലാ ഫയലുകൾ മാനേജർ കണ്ടെത്തി. ഇത് ഇൻസ്റ്റാൾ ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? %1$s ഇൻസ്റ്റാളേഷൻ മുൻഗണനകൾ - അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു… + അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു… ഭാഷ(കൾ):%1$s തീം: %1$s പതിപ്പ്:%1$s - തെറ്റ് - മാർഗരേഖ - നിർത്തുക! + തെറ്റ് + മാർഗരേഖ + നിർത്തുക! നിങ്ങൾ വാൻ‌സെഡിന്റെ മാജിസ്ക് / ടി‌ഡബ്ല്യുആർ‌പി പതിപ്പ് ഉപയോഗിക്കുന്നു, അത് നിർത്തലാക്കുകയും ഈ അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ചെയ്യാൻ കഴിയില്ല. മാജിസ്ക് മൊഡ്യൂൾ നീക്കംചെയ്ത് / ടി‌ഡബ്ല്യുആർ‌പി വാൻ‌സ്ഡ് അൺ‌ഇൻ‌സ്റ്റാളർ ഉപയോഗിച്ച് ഇത് നീക്കംചെയ്യുക. - വാൻ‌സ്ഡ് ഇൻ‌സ്റ്റാൾ‌ ചെയ്യുന്നതിന്, ഡവലപ്പർ‌ ക്രമീകരണങ്ങളിൽ‌ നിങ്ങൾ‌ MIUI ഒപ്റ്റിമൈസേഷനുകൾ‌ അപ്രാപ്‌തമാക്കണം. (നിങ്ങൾ 20.2.20 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള xiaomi.eu അടിസ്ഥാനമാക്കിയുള്ള റോം ഉപയോഗിക്കുകയാണെങ്കിൽ നിങ്ങൾക്ക് ഈ മുന്നറിയിപ്പ് അവഗണിക്കാം) - MIUI ഒപ്റ്റിമൈസേഷനുകൾ പ്രാപ്തമാക്കി! - പ്രോസസ്സ് സമയത്ത് അപ്ലിക്കേഷനിൽ നിന്ന് പുറത്തുകടക്കരുത്! - വീണ്ടും ഡൗൺലോഡുചെയ്യുക - നിങ്ങൾ vancedapp.com, Vanced Discord സെർവർ, അല്ലെങ്കിൽ Vanced GitHub എന്നിവയിൽ നിന്ന് അപ്ലിക്കേഷൻ download ൺലോഡ് ചെയ്തുവെന്ന് ഉറപ്പാക്കുക + വാൻ‌സ്ഡ് ഇൻ‌സ്റ്റാൾ‌ ചെയ്യുന്നതിന്, ഡവലപ്പർ‌ ക്രമീകരണങ്ങളിൽ‌ നിങ്ങൾ‌ MIUI ഒപ്റ്റിമൈസേഷനുകൾ‌ അപ്രാപ്‌തമാക്കണം. (നിങ്ങൾ 20.2.20 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള xiaomi.eu അടിസ്ഥാനമാക്കിയുള്ള റോം ഉപയോഗിക്കുകയാണെങ്കിൽ നിങ്ങൾക്ക് ഈ മുന്നറിയിപ്പ് അവഗണിക്കാം) + MIUI ഒപ്റ്റിമൈസേഷനുകൾ പ്രാപ്തമാക്കി! + പ്രോസസ്സ് സമയത്ത് അപ്ലിക്കേഷനിൽ നിന്ന് പുറത്തുകടക്കരുത്! + വീണ്ടും ഡൗൺലോഡുചെയ്യുക + നിങ്ങൾ vancedapp.com, Vanced Discord സെർവർ, അല്ലെങ്കിൽ Vanced GitHub എന്നിവയിൽ നിന്ന് അപ്ലിക്കേഷൻ download ൺലോഡ് ചെയ്തുവെന്ന് ഉറപ്പാക്കുക പതിപ്പ് - സ്വാഗതം + സ്വാഗതം - വാൻസിനായി നിങ്ങൾ ഭാഷ (കൾ) തിരഞ്ഞെടുക്കുക - ഏറ്റവും പുതിയ + വാൻസിനായി നിങ്ങൾ ഭാഷ (കൾ) തിരഞ്ഞെടുക്കുക + ഏറ്റവും പുതിയ പ്രകാശം +%1$s ഒരു ഭാഷയെങ്കിലും തിരഞ്ഞെടുക്കുക! - കറുപ്പ് - ഇരുണ്ടത് + കറുപ്പ് + ഇരുണ്ടത് - മാനേജർ ഡവലപ്പർമാർ - മറ്റ് സംഭാവകർ - ഉറവിടങ്ങൾ - വാൻ‌സ്ഡ് ടീം + മാനേജർ ഡവലപ്പർമാർ + മറ്റ് സംഭാവകർ + ഉറവിടങ്ങൾ + വാൻ‌സ്ഡ് ടീം - സിസ്റ്റം ഉടമയ്‌ക്ക് APK `chown` ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. - %1$s ഡൗൺലോഡുചെയ്യുന്നതിൽ പിശക് + സിസ്റ്റം ഉടമയ്‌ക്ക് APK `chown` ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. + %1$s ഡൗൺലോഡുചെയ്യുന്നതിൽ പിശക് പുതിയ ആക്‌സന്റ് വർണ്ണം പ്രയോഗിക്കുന്നതിൽ പരാജയപ്പെട്ടു - %1$s package അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു - ഇൻസ്റ്റാളേഷന് ആവശ്യമായ ഫയലുകൾ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ വീണ്ടും ഡ download ൺലോഡ് ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - സംഭരണത്തിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. - ഉപയോക്താവ് ഇൻസ്റ്റാളേഷൻ നിർത്തലാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. - ഇതിനകം ഇൻസ്റ്റാളുചെയ്‌ത അപ്ലിക്കേഷനുമായി അപ്ലിക്കേഷൻ പൊരുത്തപ്പെടുന്നതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. അപ്ലിക്കേഷന്റെ നിലവിലെ പതിപ്പ് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - ഉപയോക്താവ് പാക്കേജ് തരംതാഴ്ത്താൻ ശ്രമിച്ചതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. സ്റ്റോക്ക് അപ്ലിക്കേഷനിൽ നിന്ന് അപ്‌ഡേറ്റുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - അജ്ഞാതമായ കാരണങ്ങളാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു, കൂടുതൽ പിന്തുണയ്ക്കായി ഞങ്ങളുടെ ടെലിഗ്രാം അല്ലെങ്കിൽ ഡിസ്കോർഡിൽ ചേരുക. വിപുലമായ മെനുവിൽ നിന്ന് ഒരു സ്ക്രീൻഷോട്ട് അറ്റാച്ചുചെയ്യുക - ഇൻസ്റ്റാളേഷൻ ഫയൽ നിങ്ങളുടെ ഉപകരണവുമായി പൊരുത്തപ്പെടാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ക്രമീകരണങ്ങളിൽ ഡ download ൺലോഡ് ചെയ്ത ഫയലുകൾ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - Apk ഫയലുകൾ‌ കേടായതിനാൽ‌ ഇൻ‌സ്റ്റാളേഷൻ‌ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. - MIUI ഒപ്റ്റിമൈസേഷൻ പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. MIUI ഒപ്റ്റിമൈസേഷൻ അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - Apk സിഗ്നേച്ചർ പരിശോധന പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. Apk സിഗ്നേച്ചർ പരിശോധന അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - ഉപകരണത്തിന് മതിയായ ഇടമില്ലാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. - ഇൻസ്റ്റാളറിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. മാനേജറിന്റെ അപ്ലിക്കേഷൻ ഡാറ്റ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - വിഭജന ഇൻസ്റ്റാളേഷന് ശേഷം സ്റ്റോക്ക് YouTube ഇൻസ്റ്റാളേഷൻ പാത്ത് കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. + %1$s package അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു + ഇൻസ്റ്റാളേഷന് ആവശ്യമായ ഫയലുകൾ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. ഇൻസ്റ്റാളേഷൻ ഫയലുകൾ വീണ്ടും ഡ download ൺലോഡ് ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + സംഭരണത്തിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. + ഉപയോക്താവ് ഇൻസ്റ്റാളേഷൻ നിർത്തലാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. + ഇതിനകം ഇൻസ്റ്റാളുചെയ്‌ത അപ്ലിക്കേഷനുമായി അപ്ലിക്കേഷൻ പൊരുത്തപ്പെടുന്നതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. അപ്ലിക്കേഷന്റെ നിലവിലെ പതിപ്പ് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + ഉപയോക്താവ് പാക്കേജ് തരംതാഴ്ത്താൻ ശ്രമിച്ചതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. സ്റ്റോക്ക് അപ്ലിക്കേഷനിൽ നിന്ന് അപ്‌ഡേറ്റുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + അജ്ഞാതമായ കാരണങ്ങളാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു, കൂടുതൽ പിന്തുണയ്ക്കായി ഞങ്ങളുടെ ടെലിഗ്രാം അല്ലെങ്കിൽ ഡിസ്കോർഡിൽ ചേരുക. വിപുലമായ മെനുവിൽ നിന്ന് ഒരു സ്ക്രീൻഷോട്ട് അറ്റാച്ചുചെയ്യുക + ഇൻസ്റ്റാളേഷൻ ഫയൽ നിങ്ങളുടെ ഉപകരണവുമായി പൊരുത്തപ്പെടാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ക്രമീകരണങ്ങളിൽ ഡ download ൺലോഡ് ചെയ്ത ഫയലുകൾ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + Apk ഫയലുകൾ‌ കേടായതിനാൽ‌ ഇൻ‌സ്റ്റാളേഷൻ‌ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. + MIUI ഒപ്റ്റിമൈസേഷൻ പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. MIUI ഒപ്റ്റിമൈസേഷൻ അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + Apk സിഗ്നേച്ചർ പരിശോധന പ്രാപ്തമാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. Apk സിഗ്നേച്ചർ പരിശോധന അപ്രാപ്തമാക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + ഉപകരണത്തിന് മതിയായ ഇടമില്ലാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. + ഇൻസ്റ്റാളറിൽ നിന്ന് കറുപ്പ് / ഇരുണ്ട തീമിനായി Apk ഫയൽ കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. മാനേജറിന്റെ അപ്ലിക്കേഷൻ ഡാറ്റ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + വിഭജന ഇൻസ്റ്റാളേഷന് ശേഷം സ്റ്റോക്ക് YouTube ഇൻസ്റ്റാളേഷൻ പാത്ത് കണ്ടെത്തുന്നതിൽ പരാജയപ്പെട്ടു. diff --git a/app/src/main/res/values-mr-rIN/strings.xml b/app/src/main/res/values-mr-rIN/strings.xml index c23c4b428b..13a8602c7f 100644 --- a/app/src/main/res/values-mr-rIN/strings.xml +++ b/app/src/main/res/values-mr-rIN/strings.xml @@ -1,120 +1,120 @@ - रद्द करा - बंद करा - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - रीसेट करा - सेव करा - आपले अप्प्स निवडा + रद्द करा + बंद करा + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + रीसेट करा + सेव करा + आपले अप्प्स निवडा - अॅप बद्दल माहिती - Guide - मॅनेजर - Logs - सेटिंग - मॅनेजर ला अपडेट करा + अॅप बद्दल माहिती + Guide + मॅनेजर + Logs + सेटिंग + मॅनेजर ला अपडेट करा - आपला मोबाइल रूट आहे का? - रूट ची परवानगी द्या - Let\'s get started - कमीत कमी एक अॅप निवडा! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + आपला मोबाइल रूट आहे का? + रूट ची परवानगी द्या + Let\'s get started + कमीत कमी एक अॅप निवडा! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + Install Latest: - Install Vanced microG first + Install Vanced microG first Root access not granted - Social Media - Support us - Unavailable + Social Media + Support us + Unavailable Installed: - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Variant + Accent Color + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + Theme + Dark Theme + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - Error - Guide - Stop! + Error + Guide + Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Welcome + Welcome - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Sources - Vanced Team + Manager Devs + Other Contributors + Sources + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 1e2dd8d6db..af05fc302e 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -2,7 +2,7 @@ - #131317 + #131317 diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index efce05584c..e06ea290b6 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -1,120 +1,120 @@ - Annuleren - Sluiten - Een aangepaste GMS-implementatie voor Vanced gebaseerd op het microG-project. - Een aangepaste versie van YouTube met veel handige functies! - Vanced, maar voor YouTube Music!\nMinder functies maar voldoet aan al je wensen. - Herstellen - Bewaren - Apps selecteren + Annuleren + Sluiten + Een aangepaste GMS-implementatie voor Vanced gebaseerd op het microG-project. + Een aangepaste versie van YouTube met veel handige functies! + Vanced, maar voor YouTube Music!\nMinder functies maar voldoet aan al je wensen. + Herstellen + Bewaren + Apps selecteren - Over - Gids - Manager - Logs - Instellingen - Manager bijwerken + Over + Gids + Manager + Logs + Instellingen + Manager bijwerken - Is je apparaat geroot? - Root-machtiging toestaan - Aan de slag! - Selecteer minstens één app! - Weet je niet wat dit is of wil je de root-versie niet gebruiken? Klik dan op de blauwe pijl hieronder! + Is je apparaat geroot? + Root-machtiging toestaan + Aan de slag! + Selecteer minstens één app! + Weet je niet wat dit is of wil je de root-versie niet gebruiken? Klik dan op de blauwe pijl hieronder! - Over %1$s - Downloaden - Info - Starten - Herinstalleren - Verwijderen - Bijwerken - Apps - Wijzigingen - %1$s downloaden - Installeren + Over %1$s + Downloaden + Info + Starten + Herinstalleren + Verwijderen + Bijwerken + Apps + Wijzigingen + %1$s downloaden + Installeren Recentste: - Installeer eerst Vanced microG + Installeer eerst Vanced microG Root machtiging niet toegestaan - Sociale media - Steun ons - Niet beschikbaar + Sociale media + Steun ons + Niet beschikbaar Geïnstalleerd: - Accentkleur - Weergave - Gedrag - Gedownloade bestanden verwijderen - Bestanden succesvol verwijderd - Hiermee kunnen we informatie over app-prestaties en crashlogs verzamelen - Firebase-analytics - Taal - Links zullen openen in aangepaste Chrome-tabs - Aangepaste Chrome-tabs gebruiken - Pushmeldingen %1$s - Pushmeldingen ontvangen wanneer er een update voor %1$s beschikbaar is - Bewaren van nieuwe waarde voor slaaptimer mislukt - Slaaptimer root script - Aanpassen waarde voor slaaptimer gebruikt in /data/adb/service.d/app.sh script, nuttig bij mount-issues - Systeemstandaard - Thema - Donker thema - Licht thema - Manager bijwerken - Geen nieuwe updates - Versie + Accentkleur + Weergave + Gedrag + Gedownloade bestanden verwijderen + Bestanden succesvol verwijderd + Hiermee kunnen we informatie over app-prestaties en crashlogs verzamelen + Firebase-analytics + Taal + Links zullen openen in aangepaste Chrome-tabs + Aangepaste Chrome-tabs gebruiken + Pushmeldingen %1$s + Pushmeldingen ontvangen wanneer er een update voor %1$s beschikbaar is + Bewaren van nieuwe waarde voor slaaptimer mislukt + Slaaptimer root script + Aanpassen waarde voor slaaptimer gebruikt in /data/adb/service.d/app.sh script, nuttig bij mount-issues + Systeemstandaard + Thema + Donker thema + Licht thema + Manager bijwerken + Geen nieuwe updates + Versie - Logs niet opgeslagen - Logs succesvol opgeslagen + Logs niet opgeslagen + Logs succesvol opgeslagen Details - Installatiebestanden voor %1$s gedetecteerd! - Manager heeft alle nodige bestanden gedetecteerd voor het installeren van %1$s. Wil je ze installeren? + Installatiebestanden voor %1$s gedetecteerd! + Manager heeft alle nodige bestanden gedetecteerd voor het installeren van %1$s. Wil je ze installeren? Installatievoorkeuren voor %1$s - Controleren op updates… + Controleren op updates… Talen: %1$s Thema: %1$s Versie: %1$s - Fout - Handleiding - Stoppen! + Fout + Handleiding + Stoppen! Je gebruikt de Magisk/TWRP-versie van Vanced, die is stopgezet en niet met deze app kan worden bijgewerkt. Verwijder deze eerst door de Magisk-module te verwijderen of door de TWRP Vanced-uninstaller te gebruiken. - Om Vanced te installeren MOET je MIUI-optimalisaties uitschakelen in de ontwikkelaarsinstellingen (je kunt deze waarschuwing negeren als je de op xiaomi.eu gebaseerde ROM 20.2.20 of later gebruikt) - MIUI-optimalisaties zijn ingeschakeld! - Sluit de app NIET af tijdens dit proces! - Opnieuw downloaden - Zorg ervoor dat je de app hebt gedownload van vancedapp.com, de Vanced Discord-server of Vanced GitHub + Om Vanced te installeren MOET je MIUI-optimalisaties uitschakelen in de ontwikkelaarsinstellingen (je kunt deze waarschuwing negeren als je de op xiaomi.eu gebaseerde ROM 20.2.20 of later gebruikt) + MIUI-optimalisaties zijn ingeschakeld! + Sluit de app NIET af tijdens dit proces! + Opnieuw downloaden + Zorg ervoor dat je de app hebt gedownload van vancedapp.com, de Vanced Discord-server of Vanced GitHub Versie - Welkom + Welkom - Kies je gewenste taal/talen voor Vanced - Nieuwste versie + Kies je gewenste taal/talen voor Vanced + Nieuwste versie Licht + %1$s Selecteer minstens één taal! - Zwart - Donker + Zwart + Donker - Ontwikkelaars Manager - Andere bijdrages - Bronnen - Vanced Team + Ontwikkelaars Manager + Andere bijdrages + Bronnen + Vanced Team - Wijzigen van APK-eigenaar naar systeemeigenaar mislukt. Probeer het opnieuw. - Fout bij downloaden van %1$s + Wijzigen van APK-eigenaar naar systeemeigenaar mislukt. Probeer het opnieuw. + Fout bij downloaden van %1$s Nieuwe accentkleur toepassen mislukt - Deïnstalleren van pakket %1$s mislukt - Kan de vereiste bestanden voor de installatie niet vinden. Download de installatiebestanden opnieuw en probeer het opnieuw. - Kan het apk-bestand voor zwart/donker thema niet vinden in opslag. Probeer het opnieuw. - Installatie mislukt omdat de gebruiker de installatie heeft afgebroken. - Installatie mislukt omdat de app conflicten heeft met een reeds geïnstalleerde app. Verwijder de huidige versie van die app en probeer het opnieuw. - Installatie mislukt omdat de gebruiker het pakket probeerde te downgraden. Verwijder updates van de standaard app en probeer het daarna opnieuw. - Installatie is mislukt om onbekende redenen, ga naar Telegram of Discord voor verdere ondersteuning. Voeg een screenshot toe via het menu Geavanceerd. - Installatie mislukt omdat het installatiebestand niet compatibel is met jouw apparaat. Wis de gedownloade bestanden in de instellingen en probeer het opnieuw. - Installatie mislukt omdat de apk-bestanden beschadigd zijn. Probeer het opnieuw. - Installatie mislukt omdat MIUI-optimalisatie is ingeschakeld. Schakel MIUI-optimalisatie uit en probeer het opnieuw. - Installatie mislukt omdat apk-handtekeningverificatie is ingeschakeld. Schakel apk-handtekeningverificatie uit en probeer het opnieuw. - Installatie mislukt omdat het apparaat niet genoeg vrije ruimte heeft. - Kan het apk-bestand voor zwart/donker thema niet vinden in het installatiebestand. Verwijder de appdata van Vanced Manager en probeer het opnieuw. - Kan het standaard YouTube-installatiepad niet vinden na de gesplitste installatie. + Deïnstalleren van pakket %1$s mislukt + Kan de vereiste bestanden voor de installatie niet vinden. Download de installatiebestanden opnieuw en probeer het opnieuw. + Kan het apk-bestand voor zwart/donker thema niet vinden in opslag. Probeer het opnieuw. + Installatie mislukt omdat de gebruiker de installatie heeft afgebroken. + Installatie mislukt omdat de app conflicten heeft met een reeds geïnstalleerde app. Verwijder de huidige versie van die app en probeer het opnieuw. + Installatie mislukt omdat de gebruiker het pakket probeerde te downgraden. Verwijder updates van de standaard app en probeer het daarna opnieuw. + Installatie is mislukt om onbekende redenen, ga naar Telegram of Discord voor verdere ondersteuning. Voeg een screenshot toe via het menu Geavanceerd. + Installatie mislukt omdat het installatiebestand niet compatibel is met jouw apparaat. Wis de gedownloade bestanden in de instellingen en probeer het opnieuw. + Installatie mislukt omdat de apk-bestanden beschadigd zijn. Probeer het opnieuw. + Installatie mislukt omdat MIUI-optimalisatie is ingeschakeld. Schakel MIUI-optimalisatie uit en probeer het opnieuw. + Installatie mislukt omdat apk-handtekeningverificatie is ingeschakeld. Schakel apk-handtekeningverificatie uit en probeer het opnieuw. + Installatie mislukt omdat het apparaat niet genoeg vrije ruimte heeft. + Kan het apk-bestand voor zwart/donker thema niet vinden in het installatiebestand. Verwijder de appdata van Vanced Manager en probeer het opnieuw. + Kan het standaard YouTube-installatiepad niet vinden na de gesplitste installatie. diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index 1532d9a273..60239efb26 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -1,120 +1,120 @@ - Avbryt - Lukk - En tilpasset GMS-implementering for Vanced basert på microG-prosjektet. - En modifisert YouTube klient med mange nyttige funksjoner! - Vanced, med for YouTube Musikk! Relativt mindre funkjonsrik men dekker dine behov. - Tilbakestill - Lagre - Velg dine apper + Avbryt + Lukk + En tilpasset GMS-implementering for Vanced basert på microG-prosjektet. + En modifisert YouTube klient med mange nyttige funksjoner! + Vanced, med for YouTube Musikk! Relativt mindre funkjonsrik men dekker dine behov. + Tilbakestill + Lagre + Velg dine apper - Om - Guide - Leder - Logger - Innstillinger - Oppdater administrator + Om + Guide + Leder + Logger + Innstillinger + Oppdater administrator - Er enheten tilkoblet? - Gi root-tillatelse - La oss komme i gang - Velg minst en app! - Vet du ikke hva detter er eller ikke ønsker å bruke rot-versjonen? Bare klikk på den blå pilen nedenfor! + Er enheten tilkoblet? + Gi root-tillatelse + La oss komme i gang + Velg minst en app! + Vet du ikke hva detter er eller ikke ønsker å bruke rot-versjonen? Bare klikk på den blå pilen nedenfor! - Om %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apper - Endringslogg - Laster ned %1$s - Installer + Om %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apper + Endringslogg + Laster ned %1$s + Installer Siste: - Installer Vanced microG først + Installer Vanced microG først Root-tilgang ikke godkjent - Sosiale Medier - Støtt oss - Utilgjengelig + Sosiale Medier + Støtt oss + Utilgjengelig Installert: - Aksentfarge - Utseende - Oppførsel - Fjern nedlastede filer - Valgte filer er fjernet - Dette lar oss samle informasjon om app-ytelse og krasj-logger - Firebase analyser - Språk - Lenker vil åpne i Chrome Custom Tabs - Bruk Chrome Custom Tabs - %1$s Push varsler - Motta push varsler når en oppdatering for %1$s er utgitt - Kan ikke lagre ny tidsverdi - Hviletid for Root skript - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System standard - Tema - Mørkt tema - Lyst tema - Oppdateringssenter - Ingen nye oppdateringer - Variant + Aksentfarge + Utseende + Oppførsel + Fjern nedlastede filer + Valgte filer er fjernet + Dette lar oss samle informasjon om app-ytelse og krasj-logger + Firebase analyser + Språk + Lenker vil åpne i Chrome Custom Tabs + Bruk Chrome Custom Tabs + %1$s Push varsler + Motta push varsler når en oppdatering for %1$s er utgitt + Kan ikke lagre ny tidsverdi + Hviletid for Root skript + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System standard + Tema + Mørkt tema + Lyst tema + Oppdateringssenter + Ingen nye oppdateringer + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installasjonsfiler oppdaget! - Manager oppdaget at alle nødvendige filer for %1$s installasjonen ble funnet. Vil du installere den? + %1$s installasjonsfiler oppdaget! + Manager oppdaget at alle nødvendige filer for %1$s installasjonen ble funnet. Vil du installere den? %1$s Installasjonsinnstillinger - Sjekker etter oppdateringer… + Sjekker etter oppdateringer… Språk: %1$s Tema: %1$s Versjon: %1$s - Feil - Guide - Stopp! + Feil + Guide + Stopp! Du bruker Magisk/TWRP-versjonen av Vansert, som seponeres og som ikke kan oppdateres ved hjelp av denne appen. Vennligst fjern den ved å fjerne Magisk modul/bruke TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Last ned på nytt - Sørg for at du lastet ned appen fra vancedapp.com, Vanced Discord server, eller Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Last ned på nytt + Sørg for at du lastet ned appen fra vancedapp.com, Vanced Discord server, eller Vanced GitHub Versjon - Velkommen + Velkommen - Velg dine foretrukne språk for Vanced - Latest + Velg dine foretrukne språk for Vanced + Latest Lys + %1$s Velg minst ett språk! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Kilder - Vanced Team + Manager Devs + Other Contributors + Kilder + Vanced Team - Kan ikke `chown` APK til systemeieren, vennligst prøv igjen. - Feil ved nedlasting %1$s + Kan ikke `chown` APK til systemeieren, vennligst prøv igjen. + Feil ved nedlasting %1$s Failed to apply new accent color - Kunne ikke avinstallere pakken %1$s - Kunne ikke finne de nødvendige filene for installasjon. Last ned installasjonsfilene på nytt, og prøv på nytt. - Klarte ikke å finne apk-filen for svart/mørkt tema på enheten, vennligst prøv igjen. - Installasjonen mislyktes fordi brukeren avbrutt installasjonen. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installasjonen mislyktes på grunn av at installasjonsfilen er inkompatibel med enheten. Fjern nedlastede filer i innstillinger og prøv på nytt. - Installasjonen mislyktes fordi apk-filene er ødelagt, vennligst prøv på nytt. - Installasjonen mislyktes fordi MIUI-optimalisering er aktivert. Deaktiver MIUI-optimalisering og prøv på nytt. - Installasjon feilet fordi apk signaturverifikasjon er aktivert. Deaktiver apk signaturverifikasjon og prøv på nytt. - Installation failed because the device doesn\'t have enough free space. - Finner ikke apk-filen for svart/mørkt tema fra installatøren. Fjern data fra denne appen og prøv på nytt. - Klarte ikke å lokalisere YouTube installasjonsstien etter splittet installasjon. + Kunne ikke avinstallere pakken %1$s + Kunne ikke finne de nødvendige filene for installasjon. Last ned installasjonsfilene på nytt, og prøv på nytt. + Klarte ikke å finne apk-filen for svart/mørkt tema på enheten, vennligst prøv igjen. + Installasjonen mislyktes fordi brukeren avbrutt installasjonen. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installasjonen mislyktes på grunn av at installasjonsfilen er inkompatibel med enheten. Fjern nedlastede filer i innstillinger og prøv på nytt. + Installasjonen mislyktes fordi apk-filene er ødelagt, vennligst prøv på nytt. + Installasjonen mislyktes fordi MIUI-optimalisering er aktivert. Deaktiver MIUI-optimalisering og prøv på nytt. + Installasjon feilet fordi apk signaturverifikasjon er aktivert. Deaktiver apk signaturverifikasjon og prøv på nytt. + Installation failed because the device doesn\'t have enough free space. + Finner ikke apk-filen for svart/mørkt tema fra installatøren. Fjern data fra denne appen og prøv på nytt. + Klarte ikke å lokalisere YouTube installasjonsstien etter splittet installasjon. diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index bf5773a674..3c274c089b 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -1,120 +1,120 @@ - ਰੱਦ ਕਰੋ - ਬੰਦ ਕਰੋ - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - ਰੀਸੈੱਟ - ਸੁੱਰਖਿਅਤ ਕਰੋ - ਹੋਰ ਐਪ ਚੁਣੋ + ਰੱਦ ਕਰੋ + ਬੰਦ ਕਰੋ + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + ਰੀਸੈੱਟ + ਸੁੱਰਖਿਅਤ ਕਰੋ + ਹੋਰ ਐਪ ਚੁਣੋ - ਸਾਡੇ ਬਾਰੇ ਵਿੱਚ - Guide - ਮੈਨੇਜਰ - Logs - ਸੈਟਿੰਗਜ਼ - ਅਪਡੇਟ ਮੈਨੇਜਰ + ਸਾਡੇ ਬਾਰੇ ਵਿੱਚ + Guide + ਮੈਨੇਜਰ + Logs + ਸੈਟਿੰਗਜ਼ + ਅਪਡੇਟ ਮੈਨੇਜਰ - ਕੀ ਤੁਹਾਡੀ ਡਵਿਾਈਸ ਰੂਟ ਕੀਤਾ ਹੈ? - ਰੂਟ ਹਿਦਾਇਤਾਂ ਜਾਰੀ - ਆਓ ਸ਼ੁਰੂ ਕਰੀਏ - ਘੱਟੋ ਘੱਟ ਇੱਕ ਐਪ ਦੀ ਚੋਣ ਕਰੋ! - ਪਤਾ ਨਹੀਂ ਇਹ ਕੀ ਹੈ ਜਾਂ ਰੂਟ ਵਰਜ਼ਨ ਨਹੀਂ ਵਰਤਣਾ ਚਾਹੁੰਦੇ? ਹੇਠ ਦਿੱਤੇ ਨੀਲੇ ਤੀਰ ਤੇ ਕਲਿਕ ਕਰੋ! + ਕੀ ਤੁਹਾਡੀ ਡਵਿਾਈਸ ਰੂਟ ਕੀਤਾ ਹੈ? + ਰੂਟ ਹਿਦਾਇਤਾਂ ਜਾਰੀ + ਆਓ ਸ਼ੁਰੂ ਕਰੀਏ + ਘੱਟੋ ਘੱਟ ਇੱਕ ਐਪ ਦੀ ਚੋਣ ਕਰੋ! + ਪਤਾ ਨਹੀਂ ਇਹ ਕੀ ਹੈ ਜਾਂ ਰੂਟ ਵਰਜ਼ਨ ਨਹੀਂ ਵਰਤਣਾ ਚਾਹੁੰਦੇ? ਹੇਠ ਦਿੱਤੇ ਨੀਲੇ ਤੀਰ ਤੇ ਕਲਿਕ ਕਰੋ! - ਬਾਰੇ %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - ਤਬਦੀਲੀਆਂ - ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ %1$s - ਸਥਾਪਨਾ + ਬਾਰੇ %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + ਤਬਦੀਲੀਆਂ + ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ %1$s + ਸਥਾਪਨਾ ਨਵੀਨਤਮ: - Install Vanced microG first + Install Vanced microG first ਰੂਟ ਐਕਸੈਸ ਨਹੀਂ ਦਿੱਤੀ ਗਈ - ਸੋਸ਼ਲ ਮੀਡੀਆ - ਸਾਡਾ ਸਮਰਥਨ ਕਰੋ - ਮੋਜੂਦ ਨਹੀਂ ਹੈ + ਸੋਸ਼ਲ ਮੀਡੀਆ + ਸਾਡਾ ਸਮਰਥਨ ਕਰੋ + ਮੋਜੂਦ ਨਹੀਂ ਹੈ ਸਥਾਪਿਤ: - ਐੱਕਸੈਂਟ ਰੰਗ - ਦਿੱਖ - ਵਿਹਾਰ - ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਸਾਫ਼ ਕਰੋ - ਸਫਲਤਾਪੂਰਵਕ ਫਾਈਲਾਂ ਸਾਫ਼ ਕੀਤੀਆਂ - ਇਹ ਸਾਨੂੰ ਐਪ ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਕਰੈਸ਼ ਲੌਗਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰਨ ਦਿੰਦਾ ਹੈ - ਫਾਇਰਬੇਸ ਵਿਸ਼ਲੇਸ਼ਣ - ਭਾਸ਼ਾ - ਲਿੰਕ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਵਿੱਚ ਖੁੱਲ੍ਹਣਗੇ - ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਦੀ ਵਰਤੋਂ ਕਰੋ - %1$s ਪੁਸ਼ ਸੂਚਨਾਵਾਂ - ਜਦੋਂ %1$s ਦਾ ਅੱਪਡੇਟ ਜਾਰੀ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ - ਨਵਾਂ ਸਮਾਂ ਮੁੱਲ ਬਚਾਉਣ ਵਿੱਚ ਅਸਫਲ - ਰੂਟ ਸਕ੍ਰਿਪਟ ਨੀਂਦ ਦਾ ਸਮਾਂ - ਮਾdਟ ਕਰਨ ਵਾਲੇ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਲਾਭਦਾਇਕ, /data/adb/service.d/app.sh ਸਕ੍ਰਿਪਟ ਵਿੱਚ ਸੁੱਤਾ ਸਮਾਂ ਮੁੱਲ ਵਿਵਸਥਿਤ ਕਰੋ - ਸਿਸਟਮ ਡਿਫੌਲਟ - ਥੀਮ - ਡਾਰਕ ਥੀਮ - ਲਾਇਟ ਥੀਮ - ਮੈਨੇਜਰ ਅਪਡੇਟ ਕੇਂਦਰ - ਕੋਈ ਨਵੇਂ ਅਪਡੇਟਸ ਨਹੀਂ - ਕਿਸਮ + ਐੱਕਸੈਂਟ ਰੰਗ + ਦਿੱਖ + ਵਿਹਾਰ + ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਸਾਫ਼ ਕਰੋ + ਸਫਲਤਾਪੂਰਵਕ ਫਾਈਲਾਂ ਸਾਫ਼ ਕੀਤੀਆਂ + ਇਹ ਸਾਨੂੰ ਐਪ ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਕਰੈਸ਼ ਲੌਗਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਠੀ ਕਰਨ ਦਿੰਦਾ ਹੈ + ਫਾਇਰਬੇਸ ਵਿਸ਼ਲੇਸ਼ਣ + ਭਾਸ਼ਾ + ਲਿੰਕ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਵਿੱਚ ਖੁੱਲ੍ਹਣਗੇ + ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਦੀ ਵਰਤੋਂ ਕਰੋ + %1$s ਪੁਸ਼ ਸੂਚਨਾਵਾਂ + ਜਦੋਂ %1$s ਦਾ ਅੱਪਡੇਟ ਜਾਰੀ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ + ਨਵਾਂ ਸਮਾਂ ਮੁੱਲ ਬਚਾਉਣ ਵਿੱਚ ਅਸਫਲ + ਰੂਟ ਸਕ੍ਰਿਪਟ ਨੀਂਦ ਦਾ ਸਮਾਂ + ਮਾdਟ ਕਰਨ ਵਾਲੇ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਲਾਭਦਾਇਕ, /data/adb/service.d/app.sh ਸਕ੍ਰਿਪਟ ਵਿੱਚ ਸੁੱਤਾ ਸਮਾਂ ਮੁੱਲ ਵਿਵਸਥਿਤ ਕਰੋ + ਸਿਸਟਮ ਡਿਫੌਲਟ + ਥੀਮ + ਡਾਰਕ ਥੀਮ + ਲਾਇਟ ਥੀਮ + ਮੈਨੇਜਰ ਅਪਡੇਟ ਕੇਂਦਰ + ਕੋਈ ਨਵੇਂ ਅਪਡੇਟਸ ਨਹੀਂ + ਕਿਸਮ - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਲੱਭੀਆਂ! - ਮੈਨੇਜਰ ਨੇ ਖੋਜਿਆ ਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਇਲਾਂ %1$s ਮਿਲੀਆਂ ਹਨ. ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + %1$s ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਲੱਭੀਆਂ! + ਮੈਨੇਜਰ ਨੇ ਖੋਜਿਆ ਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਇਲਾਂ %1$s ਮਿਲੀਆਂ ਹਨ. ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? %1$s ਸਥਾਪਨਾ ਚੁਣੋ - ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ… + ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ… ਭਾਸ਼ਾ (ਇ): %1$s ਥੀਮ: %1$s ਵਰਜਨ %1$s - ਗਲਤੀ - ਗਾਇਡ - ਉਡੀਕੋ! + ਗਲਤੀ + ਗਾਇਡ + ਉਡੀਕੋ! ਤੁਸੀਂ Vanced ਦੇ Magisk / TWRP ਸੰਸਕਰਣ ਦਾ ਉਪਯੋਗ ਕਰ ਰਹੇ ਹੋ, ਜਿਸਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ ਅੱਤੇ ਇਸ ਐਪ ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ| ਕਿਰਪਾ ਇਸ Magisk ਮੋਡੂਅਲ ਨੂੰ / TWRP Vanced uninstaller ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਹੱਟਾ ਦੇਵੋਂ. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - ਮੁੜ ਡਾਉਨਲੋਡ - ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ vancedapp.com, Vanced Discord ਸਰਵਰ ਜਾਂ Vanced GitHub ਤੋਂ ਐਪ ਡਾਉਨਲੋਡ ਕੀਤਾ ਹੈ + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + ਮੁੜ ਡਾਉਨਲੋਡ + ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ vancedapp.com, Vanced Discord ਸਰਵਰ ਜਾਂ Vanced GitHub ਤੋਂ ਐਪ ਡਾਉਨਲੋਡ ਕੀਤਾ ਹੈ ਵਰਜਨ - ਜੀ ਆਇਆਂ ਨੂੰ + ਜੀ ਆਇਆਂ ਨੂੰ - Vanced ਦੇ ਲਈ ਆਪਣੀ ਪਸੰਦੀਦਾ ਭਾਸ਼ਾ (ਏ) ਚੁਣੋ - Latest + Vanced ਦੇ ਲਈ ਆਪਣੀ ਪਸੰਦੀਦਾ ਭਾਸ਼ਾ (ਏ) ਚੁਣੋ + Latest ਲਾਇਟ + %1$s ਘੱਟੋ-ਘੱਟ ਇੱਕ ਭਾਸ਼ਾ ਚੁਣੋ! - Black - Dark + Black + Dark - ਪ੍ਬੰਧਕ ਨਿਰਮਾਣਕਰਤਾ - Other Contributors - ਸਰੋਤ - Vanced ਟੋਲੀ + ਪ੍ਬੰਧਕ ਨਿਰਮਾਣਕਰਤਾ + Other Contributors + ਸਰੋਤ + Vanced ਟੋਲੀ - ਸਿਸਟਮ ਦੇ ਮਾਲਕ ਨੂੰ APK ਨੂੰ `chown` ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ, ਫਿਰ ਤੋਂ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਡਾਉਨਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ %1$s + ਸਿਸਟਮ ਦੇ ਮਾਲਕ ਨੂੰ APK ਨੂੰ `chown` ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ, ਫਿਰ ਤੋਂ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਡਾਉਨਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ %1$s ਨਵਾਂ ਲਹਿਜ਼ਾ ਰੰਗ ਲਾਗੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ - ਪੈਕਜ ਦੀ ਸਥਾਪਨਾ ਰੱਦ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ %1$s - ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਈਲਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਨੂੰ ਮੁੜ ਡਾਉਨਲੋਡ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਸਟੋਰੇਜ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਇੰਸਟਾਲ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਰੱਦ ਕਰ ਦਿੱਤੀ. - ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਐਪ ਪਹਿਲਾਂ ਤੋਂ ਸਥਾਪਤ ਐਪ ਨਾਲ ਟਕਰਾਉਂਦੀ ਹੈ. ਐਪ ਦੇ ਮੌਜੂਦਾ ਸੰਸਕਰਣ ਨੂੰ ਅਣਇੰਸਟੌਲ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ. ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਏਪੀਕੇ ਫਾਈਲਾਂ ਖ਼ਰਾਬ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - MIUI ਸਥਾਪਨਾ ਅਸਫਲ, ਕਿਉਂਕਿ Optimization ਯੋਗ ਕੀਤੀ ਗਈ ਸੀ. MIUI Optimization ਅਯੋਗ ਕਰੋ ਫਿਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਯੋਗ ਹੈ. ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਨੂੰ ਅਯੋਗ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - Installation failed because the device doesn\'t have enough free space. - ਇੰਸਟੌਲਰ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ. ਮੈਨੇਜਰ ਐਪ ਦਾ ਡਾਟਾ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - ਸਪਲਿਟ ਇੰਸਟਾਲੇਸ਼ਨ ਦੇ ਬਾਅਦ ਸਟਾਕ YouTube ਇੰਸਟਾਲੇਸ਼ਨ ਮਾਰਗ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. + ਪੈਕਜ ਦੀ ਸਥਾਪਨਾ ਰੱਦ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮ %1$s + ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਲੋੜੀਂਦੀਆਂ ਫਾਈਲਾਂ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲਾਂ ਨੂੰ ਮੁੜ ਡਾਉਨਲੋਡ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਸਟੋਰੇਜ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਇੰਸਟਾਲ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਰੱਦ ਕਰ ਦਿੱਤੀ. + ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਐਪ ਪਹਿਲਾਂ ਤੋਂ ਸਥਾਪਤ ਐਪ ਨਾਲ ਟਕਰਾਉਂਦੀ ਹੈ. ਐਪ ਦੇ ਮੌਜੂਦਾ ਸੰਸਕਰਣ ਨੂੰ ਅਣਇੰਸਟੌਲ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ. ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਏਪੀਕੇ ਫਾਈਲਾਂ ਖ਼ਰਾਬ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + MIUI ਸਥਾਪਨਾ ਅਸਫਲ, ਕਿਉਂਕਿ Optimization ਯੋਗ ਕੀਤੀ ਗਈ ਸੀ. MIUI Optimization ਅਯੋਗ ਕਰੋ ਫਿਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਯੋਗ ਹੈ. ਏਪੀਕੇ ਦਸਤਖਤ ਤਸਦੀਕ ਨੂੰ ਅਯੋਗ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + Installation failed because the device doesn\'t have enough free space. + ਇੰਸਟੌਲਰ ਤੋਂ ਕਾਲੇ / ਹਨੇਰੇ ਥੀਮ ਲਈ ਏਪੀਕੇ ਫਾਈਲ ਲੱਭਣ ਵਿੱਚ ਅਸਫਲ. ਮੈਨੇਜਰ ਐਪ ਦਾ ਡਾਟਾ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. + ਸਪਲਿਟ ਇੰਸਟਾਲੇਸ਼ਨ ਦੇ ਬਾਅਦ ਸਟਾਕ YouTube ਇੰਸਟਾਲੇਸ਼ਨ ਮਾਰਗ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵਿੱਚ ਅਸਫਲ. diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index e5224e8f09..7d697f5571 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -1,120 +1,120 @@ - Cancel - Close - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Reset - Save - Select Your Apps + Cancel + Close + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Reset + Save + Select Your Apps - About - Guide - Manager - Logs - Settings - Update Manager + About + Guide + Manager + Logs + Settings + Update Manager - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Select at least one app! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + Install Latest: - Install Vanced microG first + Install Vanced microG first Root access not granted - Social Media - Support us - Unavailable + Social Media + Support us + Unavailable Installed: - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Variant + Accent Color + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + Theme + Dark Theme + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - Error - Guide - Stop! + Error + Guide + Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Welcome + Welcome - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Sources - Vanced Team + Manager Devs + Other Contributors + Sources + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index c6d4b4e1d1..78472c42da 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -1,120 +1,120 @@ - Anuluj - Zamknij - Niestandardowa implementacja GMS dla Vanced w oparciu o projekt microG. - Zmodyfikowany klient YouTube z wieloma przydatnymi funkcjami! - Vanced, ale dla Muzyki YouTube! Stosunkowo mniej bogaty w funkcje, ale spełnia Twoje potrzeby. - Zresetuj - Zapisz - Wybierz swoje aplikacje + Anuluj + Zamknij + Niestandardowa implementacja GMS dla Vanced w oparciu o projekt microG. + Zmodyfikowany klient YouTube z wieloma przydatnymi funkcjami! + Vanced, ale dla Muzyki YouTube! Stosunkowo mniej bogaty w funkcje, ale spełnia Twoje potrzeby. + Zresetuj + Zapisz + Wybierz swoje aplikacje - O nas - Przewodnik - Menedżer - Dzienniki - Ustawienia - Zaktualizuj Menedżera + O nas + Przewodnik + Menedżer + Dzienniki + Ustawienia + Zaktualizuj Menedżera - Czy Twoje urządzenie jest zakorzenione (root)? - Przyznaj uprawnienie root - Zaczynajmy - Wybierz co najmniej jedną aplikację! - Nie wiesz, co to jest lub nie chcesz użyć wersji z rootem? Po prostu kliknij niebieską strzałkę poniżej! + Czy Twoje urządzenie jest zakorzenione (root)? + Przyznaj uprawnienie root + Zaczynajmy + Wybierz co najmniej jedną aplikację! + Nie wiesz, co to jest lub nie chcesz użyć wersji z rootem? Po prostu kliknij niebieską strzałkę poniżej! - O %1$s - Pobierz - Informacja - Uruchom - Przeinstaluj - Odinstaluj - Aktualizuj - Aplikacje - Lista zmian - Pobieranie %1$s - Zainstaluj + O %1$s + Pobierz + Informacja + Uruchom + Przeinstaluj + Odinstaluj + Aktualizuj + Aplikacje + Lista zmian + Pobieranie %1$s + Zainstaluj Najnowsza: - Najpierw zainstaluj Vanced microG + Najpierw zainstaluj Vanced microG Root nie został przyznany - Media Społecznościowe - Wesprzyj nas - Niedostępne + Media Społecznościowe + Wesprzyj nas + Niedostępne Zainstalowano: - Kolor Akcentu - Wygląd - Zachowanie - Wyczyść pobrane pliki - Pomyślnie wyczyszczono pliki - To pozwala nam zbierać informacje o wydajności aplikacji i dziennikach awarii - Analityka Firebase - Język - Linki zostaną otwarte w niestandardowych kartach Chrome - Używaj niestandardowych kart Chrome - %1$s Powiadomień Push - Otrzymuj powiadomienia push po wydaniu aktualizacji dla %1$s - Nie udało się zapisać nowej wartości czasu - Czas snu skryptu root - Dostosuj wartość czasu uśpienia w skrypcie /data/adb/service.d/app.sh, przydatne do naprawy problemów z montowaniem - Domyślny systemowy - Motyw - Ciemny Motyw - Jasny Motyw - Centrum aktualizacji - Brak nowych aktualizacji - Wariant + Kolor Akcentu + Wygląd + Zachowanie + Wyczyść pobrane pliki + Pomyślnie wyczyszczono pliki + To pozwala nam zbierać informacje o wydajności aplikacji i dziennikach awarii + Analityka Firebase + Język + Linki zostaną otwarte w niestandardowych kartach Chrome + Używaj niestandardowych kart Chrome + %1$s Powiadomień Push + Otrzymuj powiadomienia push po wydaniu aktualizacji dla %1$s + Nie udało się zapisać nowej wartości czasu + Czas snu skryptu root + Dostosuj wartość czasu uśpienia w skrypcie /data/adb/service.d/app.sh, przydatne do naprawy problemów z montowaniem + Domyślny systemowy + Motyw + Ciemny Motyw + Jasny Motyw + Centrum aktualizacji + Brak nowych aktualizacji + Wariant - Nie udało się zapisać dzienników - Pomyślnie zapisano dzienniki + Nie udało się zapisać dzienników + Pomyślnie zapisano dzienniki Szczegóły - Wykryto %1$s plików instalacyjnych! - Menedżer wykrył, że znaleziono wszystkie pliki niezbędne do instalacji %1$s. Czy chcesz zainstalować? + Wykryto %1$s plików instalacyjnych! + Menedżer wykrył, że znaleziono wszystkie pliki niezbędne do instalacji %1$s. Czy chcesz zainstalować? Preferencje instalacji %1$s - Sprawdzam aktualizacje… + Sprawdzam aktualizacje… Język(i): %1$s Motyw: %1$s Wersja: %1$s - Błąd - Przewodnik - Stop! + Błąd + Przewodnik + Stop! Używasz wersji Magisk/TWRP Vanced, która została przerwana i nie może zostać zaktualizowana za pomocą tej aplikacji. Proszę go usunąć usuwając moduł Magisk/używając TWRP Vanced deinstalatora. - Aby zainstalować Vanced, MUSISZ wyłączyć optymalizację MIUI w ustawieniach dewelopera. (Możesz zignorować to ostrzeżenie, jeśli korzystasz z ROM 20.2.20 lub późniejszego xiaomi.eu) - Optymalizacja MIUI jest włączona! - NIE wychodź z aplikacji podczas trwania tego procesu! - Pobierz ponownie - Upewnij się, że pobrałeś aplikację z vancedapp.com, serwera Vanced Discord lub Vanced GitHub + Aby zainstalować Vanced, MUSISZ wyłączyć optymalizację MIUI w ustawieniach dewelopera. (Możesz zignorować to ostrzeżenie, jeśli korzystasz z ROM 20.2.20 lub późniejszego xiaomi.eu) + Optymalizacja MIUI jest włączona! + NIE wychodź z aplikacji podczas trwania tego procesu! + Pobierz ponownie + Upewnij się, że pobrałeś aplikację z vancedapp.com, serwera Vanced Discord lub Vanced GitHub Wersja - Witaj + Witaj - Wybierz preferowany język(i) dla Vanced - Najnowsza + Wybierz preferowany język(i) dla Vanced + Najnowsza Jasny + %1$s Wybierz co najmniej jeden język! - Czarny - Ciemny + Czarny + Ciemny - Deweloperzy Menedżera - Inni współtwórcy - Źródła - Zespół Vanced + Deweloperzy Menedżera + Inni współtwórcy + Źródła + Zespół Vanced - Nie udało się `chown` APK dla właściciela systemu, spróbuj ponownie. - Błąd pobierania %1$s + Nie udało się `chown` APK dla właściciela systemu, spróbuj ponownie. + Błąd pobierania %1$s Nie udało się zastosować nowego koloru akcentu - Nie udało się odinstalować pakietu %1$s - Nie udało się zlokalizować wymaganych plików do instalacji. Pobierz ponownie pliki instalacyjne, a następnie spróbuj ponownie. - Nie udało się zlokalizować pliku apk dla czarnego/ciemnego motywu, spróbuj ponownie. - Instalacja nie powiodła się, ponieważ użytkownik przerwał instalację. - Instalacja nie powiodła się ponieważ aplikacja konfliktuje z już zainstalowaną aplikacją. Odinstaluj aktualną wersję aplikacji a następnie spróbuj ponownie. - Instalacja nie powiodła się, ponieważ użytkownik próbował obniżyć paczkę. Odinstaluj aktualizacje z domyślnej aplikacji YouTube, a następnie spróbuj ponownie. - Instalacja nie powiodła się z nieznanych powodów, dołącz do naszego Telegrama lub Discorda, aby uzyskać dalsze wsparcie. Proszę również dołączyć zrzut ekranu z zaawansowanego menu - Instalacja nie powiodła się, ponieważ plik instalacyjny jest niezgodny z Twoim urządzeniem. Wyczyść pobrane pliki w Ustawieniach, a następnie spróbuj ponownie. - Instalacja nie powiodła się, bo pliki apk są uszkodzone, spróbuj jeszcze raz. - Instalacja nie powiodła się, ponieważ optymalizacja MIUI jest włączona. Wyłącz optymalizację MIUI, a następnie spróbuj ponownie. - Instalacja nie powiodła się, ponieważ włączona jest weryfikacja podpisu apk. Wyłącz weryfikację podpisu apk, a następnie spróbuj ponownie. - Instalacja nie powiodła się, ponieważ urządzenie nie ma wystarczającej ilości wolnego miejsca. - Nie udało się znaleźć pliku apk dla czarnego/ciemnego motywu z instalatora. Wyczyść dane aplikacji Menedżera i spróbuj ponownie. - Nie udało się zlokalizować ścieżki instalacji YouTube po podzieleniu instalacji. + Nie udało się odinstalować pakietu %1$s + Nie udało się zlokalizować wymaganych plików do instalacji. Pobierz ponownie pliki instalacyjne, a następnie spróbuj ponownie. + Nie udało się zlokalizować pliku apk dla czarnego/ciemnego motywu, spróbuj ponownie. + Instalacja nie powiodła się, ponieważ użytkownik przerwał instalację. + Instalacja nie powiodła się ponieważ aplikacja konfliktuje z już zainstalowaną aplikacją. Odinstaluj aktualną wersję aplikacji a następnie spróbuj ponownie. + Instalacja nie powiodła się, ponieważ użytkownik próbował obniżyć paczkę. Odinstaluj aktualizacje z domyślnej aplikacji YouTube, a następnie spróbuj ponownie. + Instalacja nie powiodła się z nieznanych powodów, dołącz do naszego Telegrama lub Discorda, aby uzyskać dalsze wsparcie. Proszę również dołączyć zrzut ekranu z zaawansowanego menu + Instalacja nie powiodła się, ponieważ plik instalacyjny jest niezgodny z Twoim urządzeniem. Wyczyść pobrane pliki w Ustawieniach, a następnie spróbuj ponownie. + Instalacja nie powiodła się, bo pliki apk są uszkodzone, spróbuj jeszcze raz. + Instalacja nie powiodła się, ponieważ optymalizacja MIUI jest włączona. Wyłącz optymalizację MIUI, a następnie spróbuj ponownie. + Instalacja nie powiodła się, ponieważ włączona jest weryfikacja podpisu apk. Wyłącz weryfikację podpisu apk, a następnie spróbuj ponownie. + Instalacja nie powiodła się, ponieważ urządzenie nie ma wystarczającej ilości wolnego miejsca. + Nie udało się znaleźć pliku apk dla czarnego/ciemnego motywu z instalatora. Wyczyść dane aplikacji Menedżera i spróbuj ponownie. + Nie udało się zlokalizować ścieżki instalacji YouTube po podzieleniu instalacji. diff --git a/app/src/main/res/values-ps-rAF/strings.xml b/app/src/main/res/values-ps-rAF/strings.xml index e5224e8f09..7d697f5571 100644 --- a/app/src/main/res/values-ps-rAF/strings.xml +++ b/app/src/main/res/values-ps-rAF/strings.xml @@ -1,120 +1,120 @@ - Cancel - Close - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Reset - Save - Select Your Apps + Cancel + Close + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Reset + Save + Select Your Apps - About - Guide - Manager - Logs - Settings - Update Manager + About + Guide + Manager + Logs + Settings + Update Manager - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Select at least one app! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + Install Latest: - Install Vanced microG first + Install Vanced microG first Root access not granted - Social Media - Support us - Unavailable + Social Media + Support us + Unavailable Installed: - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Variant + Accent Color + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + Theme + Dark Theme + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - Error - Guide - Stop! + Error + Guide + Stop! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub Version - Welcome + Welcome - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - Sources - Vanced Team + Manager Devs + Other Contributors + Sources + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6f87f5c3dc..8b94184bff 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,120 +1,120 @@ - Cancelar - Fechar - Uma implementação personalizada de GMS para Vanced com base no projeto microG. - Um cliente modificado do YouTube com muitos recursos úteis! - Vanced, mas para o YouTube Music! Relativamente menos funções, mas satisfaz suas necessidades. - Resetar - Salvar - Selecione Seus Aplicativos + Cancelar + Fechar + Uma implementação personalizada de GMS para Vanced com base no projeto microG. + Um cliente modificado do YouTube com muitos recursos úteis! + Vanced, mas para o YouTube Music! Relativamente menos funções, mas satisfaz suas necessidades. + Resetar + Salvar + Selecione Seus Aplicativos - Sobre - Guia - Gerenciador - Registros - Configurações - Gerenciador de Atualização + Sobre + Guia + Gerenciador + Registros + Configurações + Gerenciador de Atualização - Seu Dispositivo Tem Root? - Conceder Permissão de Root - Vamos começar - Selecione pelo menos um aplicativo! - Não sabe o que isto é ou não quer usar a versão root? basta clicar na seta azul abaixo! + Seu Dispositivo Tem Root? + Conceder Permissão de Root + Vamos começar + Selecione pelo menos um aplicativo! + Não sabe o que isto é ou não quer usar a versão root? basta clicar na seta azul abaixo! - Sobre %1$s - Baixar - Informações - Iniciar - Reinstalar - Desinstalar - Atualizar - Aplicativos - Registro de mudanças - Baixando %1$s - Instalar + Sobre %1$s + Baixar + Informações + Iniciar + Reinstalar + Desinstalar + Atualizar + Aplicativos + Registro de mudanças + Baixando %1$s + Instalar Mais recente: - Instale o microG Vanced primeiro + Instale o microG Vanced primeiro Acesso root não concedido - Mídias Sociais - Apoie-nos - Indisponível + Mídias Sociais + Apoie-nos + Indisponível Instalado: - Cor de destaque - Aparência - Comportamento - Limpar arquivos baixados - Arquivos limpos com sucesso - Isto nos permite coletar informações sobre o desempenho do aplicativo e registros de falhas - Análises de Firebase - Idioma - Os links serão abertos nas abas personalizadas do Chrome - Usar abas personalizadas do Chrome - %1$s notificações push - Receber notificações quando uma atualização para o %1$s for lançado - Falha ao salvar o novo valor de tempo - Tempo de repouso do script root - Ajuste o valor do tempo de suspensão usado no script/data/adb/service.d/app.sh, útil para corrigir problemas de montagem - Padrão do sistema - Tema - Escuro - Claro - Centro de Atualizações - Não há novas atualizações - Variante + Cor de destaque + Aparência + Comportamento + Limpar arquivos baixados + Arquivos limpos com sucesso + Isto nos permite coletar informações sobre o desempenho do aplicativo e registros de falhas + Análises de Firebase + Idioma + Os links serão abertos nas abas personalizadas do Chrome + Usar abas personalizadas do Chrome + %1$s notificações push + Receber notificações quando uma atualização para o %1$s for lançado + Falha ao salvar o novo valor de tempo + Tempo de repouso do script root + Ajuste o valor do tempo de suspensão usado no script/data/adb/service.d/app.sh, útil para corrigir problemas de montagem + Padrão do sistema + Tema + Escuro + Claro + Centro de Atualizações + Não há novas atualizações + Variante - Não foi possível salvar os registros - Registros salvos com sucesso + Não foi possível salvar os registros + Registros salvos com sucesso Detalhes - %1$s arquivos de instalação detectados! - O gerenciador detectou que todos os arquivos necessários para a instalação de %1$s foram encontrados. Você quer instalar? + %1$s arquivos de instalação detectados! + O gerenciador detectou que todos os arquivos necessários para a instalação de %1$s foram encontrados. Você quer instalar? %1$s Preferências de Instalação - Verificando por atualizações… + Verificando por atualizações… Idioma(s): %1$s Tema: %1$s Versão: %1$s - Erro - Guia - Pare! + Erro + Guia + Pare! Você está usando a versão Magisk/TWRP do Vanced, que foi descontinuada e não pode ser atualizada com este aplicativo. Desinstale-o removendo o módulo em Magisk/usando o desinstalador TWRP Vanced. - Para instalar o Vanced, você PRECISA desligar as otimizações da MIUI nas opções de desenvolvedor. (Você pode ignorar esse aviso caso estiver usando uma ROM baseada na xiaomi.eu versão 20.2.20 ou superior) - Otimização MIUI está habilitada! - Por favor NÃO saia do aplicativo durante este processo! - Baixar novamente - Certifique-se de fazer o download do aplicativo em vancedapp.com, no servidor Vanced Discord ou no Vanced GitHub + Para instalar o Vanced, você PRECISA desligar as otimizações da MIUI nas opções de desenvolvedor. (Você pode ignorar esse aviso caso estiver usando uma ROM baseada na xiaomi.eu versão 20.2.20 ou superior) + Otimização MIUI está habilitada! + Por favor NÃO saia do aplicativo durante este processo! + Baixar novamente + Certifique-se de fazer o download do aplicativo em vancedapp.com, no servidor Vanced Discord ou no Vanced GitHub Versão - Bem-vindo + Bem-vindo - Escolha o seu idioma preferido para o Vanced - Mais recente + Escolha o seu idioma preferido para o Vanced + Mais recente Claro + %1$s Selecione pelo menos um idioma! - Preto - Escuro + Preto + Escuro - Desenvolvedores do Manager - Outros contribuidores - Fontes - Equipe Vanced + Desenvolvedores do Manager + Outros contribuidores + Fontes + Equipe Vanced - Falha ao enviar o Apk para o proprietário do sistema, Tente Novamente. - Erro ao baixar %1$s + Falha ao enviar o Apk para o proprietário do sistema, Tente Novamente. + Erro ao baixar %1$s Falha ao aplicar nova cor de destaque - Falha ao desinstalar o pacote %1$s - Falha ao localizar os arquivos necessários para instalação. Baixe novamente os arquivos de instalação e tente novamente. - Falha ao localizar o arquivo apk para o tema preto/escuro a partir do armazenamento, por favor tente novamente. - A instalação falhou porque o usuário abortou a instalação. - A instalação falhou porque o app está em conflito com um app já instalado. Desinstale a versão atual do aplicativo e tente novamente. - A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do aplicativo padrão e tente novamente. - A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para obter mais suporte. Por favor, anexe também uma captura de tela do menu Avançado - A instalação falhou porque o arquivo de instalação é incompatível com o seu dispositivo. Limpe os arquivos baixados nas configurações e tente novamente. - A instalação falhou porque os arquivos apk estão corrompidos, tente novamente. - A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. - A instalação falhou porque a verificação de assinatura do apk está ativado. Desative a verificação de assinatura do apk e tente novamente. - A instalação falhou porque o dispositivo não tem espaço livre suficiente. - Falha ao encontrar o arquivo apk para o tema preto/escuro a partir do instalador. Limpe os \"dados do app\" do Manager e tente novamente. - Falha ao localizar o caminho de instalação padrão do YouTube após a instalação dividida (split). + Falha ao desinstalar o pacote %1$s + Falha ao localizar os arquivos necessários para instalação. Baixe novamente os arquivos de instalação e tente novamente. + Falha ao localizar o arquivo apk para o tema preto/escuro a partir do armazenamento, por favor tente novamente. + A instalação falhou porque o usuário abortou a instalação. + A instalação falhou porque o app está em conflito com um app já instalado. Desinstale a versão atual do aplicativo e tente novamente. + A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do aplicativo padrão e tente novamente. + A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para obter mais suporte. Por favor, anexe também uma captura de tela do menu Avançado + A instalação falhou porque o arquivo de instalação é incompatível com o seu dispositivo. Limpe os arquivos baixados nas configurações e tente novamente. + A instalação falhou porque os arquivos apk estão corrompidos, tente novamente. + A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. + A instalação falhou porque a verificação de assinatura do apk está ativado. Desative a verificação de assinatura do apk e tente novamente. + A instalação falhou porque o dispositivo não tem espaço livre suficiente. + Falha ao encontrar o arquivo apk para o tema preto/escuro a partir do instalador. Limpe os \"dados do app\" do Manager e tente novamente. + Falha ao localizar o caminho de instalação padrão do YouTube após a instalação dividida (split). diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 68422acf26..f02897f556 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -1,120 +1,120 @@ - Cancelar - Fechar - Uma implementação personalizada de GMS para Vanced com base no projeto microG. - Um cliente modificado do YouTube com muitos recursos úteis! - Vanced, mas para o YouTube Music! Relativamente menos rico em recursos, mas atende às suas necessidades. - Resetar - Guardar - Selecione as suas aplicações + Cancelar + Fechar + Uma implementação personalizada de GMS para Vanced com base no projeto microG. + Um cliente modificado do YouTube com muitos recursos úteis! + Vanced, mas para o YouTube Music! Relativamente menos rico em recursos, mas atende às suas necessidades. + Resetar + Guardar + Selecione as suas aplicações - Sobre - Guia - Gestor - Registo de Eventos - Configurações - Gestor de Atualização + Sobre + Guia + Gestor + Registo de Eventos + Configurações + Gestor de Atualização - Seu Dispositivo Tem Root? - Conceder Permissão de Root - Vamos começar - Selecione pelo menos uma aplicação! - Não sabes o que é isto ou não queres utilizar a versão root? apenas clique a seta azul abaixo! + Seu Dispositivo Tem Root? + Conceder Permissão de Root + Vamos começar + Selecione pelo menos uma aplicação! + Não sabes o que é isto ou não queres utilizar a versão root? apenas clique a seta azul abaixo! - Acerca de %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Aplicações - Lista de alterações - Transferindo %1$s - Instalar + Acerca de %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Aplicações + Lista de alterações + Transferindo %1$s + Instalar Mais Recente: - Instale o microG Vanced primeiro + Instale o microG Vanced primeiro Acesso root negado. - Redes Sociais - Suporte-nos - Indisponível + Redes Sociais + Suporte-nos + Indisponível Instalado: - Cor de Destaque - Aparência - Comportamento - Limpar ficheiros descarregados - Arquivos limpos com sucesso - Isto permite-nos recolher informações sobre o desempenho da aplicação e registos de falhas - Análise do Firebase - Idioma - Os links serão abertos em abas personalizadas do Chrome - Usar abas personalizadas do Chrome - Notificações Push %1$s - Receber notificações Push quando uma actualização para %1$s estiver disponível - Falhou ao salvar novo valor de tempo - Tempo de suspensão do script Root - Ajuste o valor de tempo de suspensão usado no script /data/adb/service.d/app.sh, útil para a correção de problemas de montagem - Padrão do sistema - Tema - Tema Escuro - Tema Claro - Centro de Actualizações - Sem atualizações - Variante + Cor de Destaque + Aparência + Comportamento + Limpar ficheiros descarregados + Arquivos limpos com sucesso + Isto permite-nos recolher informações sobre o desempenho da aplicação e registos de falhas + Análise do Firebase + Idioma + Os links serão abertos em abas personalizadas do Chrome + Usar abas personalizadas do Chrome + Notificações Push %1$s + Receber notificações Push quando uma actualização para %1$s estiver disponível + Falhou ao salvar novo valor de tempo + Tempo de suspensão do script Root + Ajuste o valor de tempo de suspensão usado no script /data/adb/service.d/app.sh, útil para a correção de problemas de montagem + Padrão do sistema + Tema + Tema Escuro + Tema Claro + Centro de Actualizações + Sem atualizações + Variante - Não foi possível salvar os registos - Registos salvos com sucesso + Não foi possível salvar os registos + Registos salvos com sucesso Detalhes - %1$s arquivos de instalação detetados! - O gestor detectou que todos os arquivos necessários para a instalação %1$s foram encontrados. Você quer instalá-lo? + %1$s arquivos de instalação detetados! + O gestor detectou que todos os arquivos necessários para a instalação %1$s foram encontrados. Você quer instalá-lo? Preferências de instalação %1$s - A procurar por atualizações… + A procurar por atualizações… Língua(s): %1$s Tema: %1$s Versão: %1$s - Erro - Guia - Parar! + Erro + Guia + Parar! Você está usando a versão Magisk/TWRP do Vanced, que está descontinuada e não pode ser atualizada usando este aplicativo. Por favor, remova-o removendo o módulo Magisk/usando a desinstalação TWRP Vanced Uninstaler. - Para instalar o Vanced, você DEVE desativar as Otimizações MIUI nas configurações do desenvolvedor. (Você pode ignorar este aviso se você estiver usando ROM baseada em 20.2.20 ou mais tarde xiaomi.eu) - Optimizações MIUI estão habilitadas! - Por favor NÃO saia do aplicativo durante este processo! - Voltar a descarregar - Certifique-se de que você baixou o aplicativo do vancedapp.com, o servidor Vanced Discord ou o Vanced GitHub + Para instalar o Vanced, você DEVE desativar as Otimizações MIUI nas configurações do desenvolvedor. (Você pode ignorar este aviso se você estiver usando ROM baseada em 20.2.20 ou mais tarde xiaomi.eu) + Optimizações MIUI estão habilitadas! + Por favor NÃO saia do aplicativo durante este processo! + Voltar a descarregar + Certifique-se de que você baixou o aplicativo do vancedapp.com, o servidor Vanced Discord ou o Vanced GitHub Versão - Bem-Vindo + Bem-Vindo - Escolha a(s) sua(s) língua(s) de preferência para o Vanced - Mais Recente + Escolha a(s) sua(s) língua(s) de preferência para o Vanced + Mais Recente Claro + %1$s Selecione ao menos um idioma! - Preto - Escuro + Preto + Escuro - Desenvolvedores do Manager - Outros Colaboradores - Fontes - Equipa Vanced + Desenvolvedores do Manager + Outros Colaboradores + Fontes + Equipa Vanced - Falhou na mudança de dono do Apk para o proprietário do sistema, por favor, tente novamente. - Erro Transferindo %1$s + Falhou na mudança de dono do Apk para o proprietário do sistema, por favor, tente novamente. + Erro Transferindo %1$s Falha ao aplicar nova cor de destaque - Erro a desinstalar pacote %1$s - Falha ao localizar os arquivos necessários para instalação. Faça o download dos arquivos de instalação e tente novamente. - Falha ao localizar o apk para o tema preto/escuro no armazenamento, por favor, tente novamente. - A instalação falhou porque o usuário abortou a instalação. - A instalação falhou porque o app entra em conflito com um app já instalado. Desinstale a versão atual do app e tente novamente. - A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do app do YouTube e, em seguida, tente novamente. - A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para mais suporte. Por favor, anexe também uma captura de tela do menu Avançado - Falha na instalação porque o pacote de instalação é incompatível com o seu dispositivo. Limpe os pacotes transferidos nas Configurações e tente novamente. - A instalação falhou porque os pacotes apk estão corrompidos, por favor tente novamente. - A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. - A instalação falhou porque a verificação de assinatura apk está ativa. Desative a verificação de assinatura apk e tente novamente. - A instalação falhou porque o dispositivo não tem espaço livre suficiente. - Falha ao encontrar o arquivo apk para o tema preto/escuro no instalador. Limpe os dados do app do Gerenciador (Vanced Manager) e tente novamente. - Falha ao localizar o caminho de instalação padrão do YouTube após instalação dividida. + Erro a desinstalar pacote %1$s + Falha ao localizar os arquivos necessários para instalação. Faça o download dos arquivos de instalação e tente novamente. + Falha ao localizar o apk para o tema preto/escuro no armazenamento, por favor, tente novamente. + A instalação falhou porque o usuário abortou a instalação. + A instalação falhou porque o app entra em conflito com um app já instalado. Desinstale a versão atual do app e tente novamente. + A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do app do YouTube e, em seguida, tente novamente. + A instalação falhou por razões desconhecidas, junte-se ao nosso Telegram ou Discord para mais suporte. Por favor, anexe também uma captura de tela do menu Avançado + Falha na instalação porque o pacote de instalação é incompatível com o seu dispositivo. Limpe os pacotes transferidos nas Configurações e tente novamente. + A instalação falhou porque os pacotes apk estão corrompidos, por favor tente novamente. + A instalação falhou porque a Otimização MIUI está ativada. Desative a Otimização MIUI e tente novamente. + A instalação falhou porque a verificação de assinatura apk está ativa. Desative a verificação de assinatura apk e tente novamente. + A instalação falhou porque o dispositivo não tem espaço livre suficiente. + Falha ao encontrar o arquivo apk para o tema preto/escuro no instalador. Limpe os dados do app do Gerenciador (Vanced Manager) e tente novamente. + Falha ao localizar o caminho de instalação padrão do YouTube após instalação dividida. diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 636d4c07d6..5fa66bf3b0 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -1,120 +1,120 @@ - Anulaţi - Închide - O implementare personalizată a GMS pentru Vanced pe baza proiectului microG. - Un client YouTube modificat, cu multe caracteristici utile! - Vansat, dar pentru muzica YouTube! Relativ mai puțin bogat în caracteristici, dar îți îndeplinește nevoile. - Resetează - Salvează - Selectați aplicațiile + Anulaţi + Închide + O implementare personalizată a GMS pentru Vanced pe baza proiectului microG. + Un client YouTube modificat, cu multe caracteristici utile! + Vansat, dar pentru muzica YouTube! Relativ mai puțin bogat în caracteristici, dar îți îndeplinește nevoile. + Resetează + Salvează + Selectați aplicațiile - Despre - Ghid - Manager - Jurnale - Configurări - Actualizați Manager + Despre + Ghid + Manager + Jurnale + Configurări + Actualizați Manager - Dispozitivul tău este rootat? - Acordați permisiunea Root - Să începem - Selectaţi cel puţin o aplicație! - Nu știți ce este sau nu vreți să folosiți versiunea root? Apăsați săgeata albastră de mai jos! + Dispozitivul tău este rootat? + Acordați permisiunea Root + Să începem + Selectaţi cel puţin o aplicație! + Nu știți ce este sau nu vreți să folosiți versiunea root? Apăsați săgeata albastră de mai jos! - Despre %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Aplicații - Schimbări - Se descarcă %1$s - Instalează + Despre %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Aplicații + Schimbări + Se descarcă %1$s + Instalează Ultima: - Instalați Vanced microG mai întâi + Instalați Vanced microG mai întâi Accesul root nu este permis - Rețele sociale - Ajutați-ne - Indisponibil + Rețele sociale + Ajutați-ne + Indisponibil Instalat: - Nuanță culoare - Aspect - Comportament - Ştergeţi fişierele descărcate - Fişiere şterse cu succes - Acest lucru ne permite să colectăm informații despre performanța aplicației și jurnale de eroare - Statistici Firebase - Limbă - Link-uri se vor deschide în filele personalizate Chrome - Utilizează file personalizate Chrome - %1$s Notificari push - Primiți notificări push când o actualizare pentru %1$s este lansată - Salvarea noii valori de timp a eșuat - După cât timp se activează script-ul root - Reglați după cât timp este activat script-ul root folosit în /data/adb/service.d/app.sh script, util pentru remedierea problemelor de montare - Setarea implicită a sistemului - Temă - Temă întunecată - Temă deschisă - Actualizator - Nu există actualizări noi - Variantă + Nuanță culoare + Aspect + Comportament + Ştergeţi fişierele descărcate + Fişiere şterse cu succes + Acest lucru ne permite să colectăm informații despre performanța aplicației și jurnale de eroare + Statistici Firebase + Limbă + Link-uri se vor deschide în filele personalizate Chrome + Utilizează file personalizate Chrome + %1$s Notificari push + Primiți notificări push când o actualizare pentru %1$s este lansată + Salvarea noii valori de timp a eșuat + După cât timp se activează script-ul root + Reglați după cât timp este activat script-ul root folosit în /data/adb/service.d/app.sh script, util pentru remedierea problemelor de montare + Setarea implicită a sistemului + Temă + Temă întunecată + Temă deschisă + Actualizator + Nu există actualizări noi + Variantă - Jurnalele nu pot fi salvate - Jurnale salvate cu succes + Jurnalele nu pot fi salvate + Jurnale salvate cu succes Detalii - %1$s fișiere de instalare detectate! - Manager a detectat că au fost găsite toate fişierele necesare pentru instalarea %1$s . Doriţi să le instalaţi? + %1$s fișiere de instalare detectate! + Manager a detectat că au fost găsite toate fişierele necesare pentru instalarea %1$s . Doriţi să le instalaţi? %1$s Preferințe de instalare - Verificare actualizări… + Verificare actualizări… Limbă: %1$s Temă: %1$s Versiune: %1$s - Eroare - Ghid - Oprește! + Eroare + Ghid + Oprește! Folosiți versiunea Magisk/TWRP a Vanced, care nu mai este în uz și nu poate fi actualizată folosind această aplicație. Vă rugăm să o eliminați prin eliminarea modulului Magisk/folosind dezinstalatorul Vanced TWRP. - Pentru a instala Vanced, TREBUIE să dezactivați Optimizările MIUI în setările pentru dezvoltatori. (Puteți ignora această avertizare dacă utilizați un ROM bazat pe xiaomi.eu cu versiunea 20.2.20 sau mai recent) - Optimizările MIUI sunt activate! - Vă rugăm să NU ieșiți din aplicație în timpul acestui proces! - Redescărcare - Asigurați-vă că ați descărcat aplicația de pe vancedapp.com, de pe serverul Discord Vanced sau de pe GitHub Vanced + Pentru a instala Vanced, TREBUIE să dezactivați Optimizările MIUI în setările pentru dezvoltatori. (Puteți ignora această avertizare dacă utilizați un ROM bazat pe xiaomi.eu cu versiunea 20.2.20 sau mai recent) + Optimizările MIUI sunt activate! + Vă rugăm să NU ieșiți din aplicație în timpul acestui proces! + Redescărcare + Asigurați-vă că ați descărcat aplicația de pe vancedapp.com, de pe serverul Discord Vanced sau de pe GitHub Vanced Versiune - Bun venit + Bun venit - Alegeți limba preferată pentru Vanced - Cel mai recent + Alegeți limba preferată pentru Vanced + Cel mai recent Alb + %1$s Selectaţi cel puţin o limbă! - Negru - Întunecat + Negru + Întunecat - Dezvoltatori - Alți Contribuitori - Surse - Echipa Vanced + Dezvoltatori + Alți Contribuitori + Surse + Echipa Vanced - Nu s-a reușit comanda chown pentru APK la proprietarul sistemului. Încercați din nou. - Eroare la descărcarea %1$s + Nu s-a reușit comanda chown pentru APK la proprietarul sistemului. Încercați din nou. + Eroare la descărcarea %1$s Nu s-a putut aplica noua culoare de evidențiere - Dezinstalarea pachetului %1$s a eșuat - Nu s-a reușit localizarea fișierelor necesare pentru instalare. Redescărcați fișierele de instalare, apoi încercați din nou. - Nu s-a reuşit localizarea fişierului apk pentru tema neagră/întunecată din stocare, vă rugăm să încercaţi din nou. - Instalarea a eșuat deoarece utilizatorul a anulat instalarea. - Instalarea a eșuat deoarece aplicația intră în conflict cu o aplicație deja instalată. Dezinstalați versiunea curentă a aplicației, apoi încercați din nou. - Instalarea a eșuat deoarece utilizatorul a încercat să retrogradeze pachetul. Dezinstalați actualizările din aplicația stock YouTube, apoi încercați din nou. - Instalarea a eșuat din motive necunoscute. Pentru asistență, intră pe grupul nostru de Telegram sau Discord. Te rugăm să atașezi și o captură de ecran din meniul Avansat - Instalarea a eșuat deoarece fișierul de instalare este incompatibil cu dispozitivul dvs. Ștergeți fișierele descărcate din Setări, apoi încercați din nou. - Instalarea a eșuat deoarece fișierele apk sunt corupte, încercați din nou. - Instalarea a eșuat deoarece este activată optimizarea MIUI. Dezactivați optimizarea MIUI, apoi încercați din nou. - Instalarea a eșuat deoarece verificarea semnăturii apk este activată. Dezactivați verificarea semnăturii apk, apoi încercați din nou. - Instalarea a eșuat deoarece dispozitivul nu are suficient spațiu liber. - Nu s-a putut găsi fișierul apk pentru tema neagră/întunecată din instalator. Ștergeți datele aplicației Manager, apoi încercați din nou. - Localizarea instalarii YouTube-ului stock a eșuat dupa instalarea divizată. + Dezinstalarea pachetului %1$s a eșuat + Nu s-a reușit localizarea fișierelor necesare pentru instalare. Redescărcați fișierele de instalare, apoi încercați din nou. + Nu s-a reuşit localizarea fişierului apk pentru tema neagră/întunecată din stocare, vă rugăm să încercaţi din nou. + Instalarea a eșuat deoarece utilizatorul a anulat instalarea. + Instalarea a eșuat deoarece aplicația intră în conflict cu o aplicație deja instalată. Dezinstalați versiunea curentă a aplicației, apoi încercați din nou. + Instalarea a eșuat deoarece utilizatorul a încercat să retrogradeze pachetul. Dezinstalați actualizările din aplicația stock YouTube, apoi încercați din nou. + Instalarea a eșuat din motive necunoscute. Pentru asistență, intră pe grupul nostru de Telegram sau Discord. Te rugăm să atașezi și o captură de ecran din meniul Avansat + Instalarea a eșuat deoarece fișierul de instalare este incompatibil cu dispozitivul dvs. Ștergeți fișierele descărcate din Setări, apoi încercați din nou. + Instalarea a eșuat deoarece fișierele apk sunt corupte, încercați din nou. + Instalarea a eșuat deoarece este activată optimizarea MIUI. Dezactivați optimizarea MIUI, apoi încercați din nou. + Instalarea a eșuat deoarece verificarea semnăturii apk este activată. Dezactivați verificarea semnăturii apk, apoi încercați din nou. + Instalarea a eșuat deoarece dispozitivul nu are suficient spațiu liber. + Nu s-a putut găsi fișierul apk pentru tema neagră/întunecată din instalator. Ștergeți datele aplicației Manager, apoi încercați din nou. + Localizarea instalarii YouTube-ului stock a eșuat dupa instalarea divizată. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 93ac21a436..7eb74ee8d0 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -1,120 +1,120 @@ - Отмена - Закрыть - Пользовательская реализация GMS (сервисов Google) для Vanced создана на основе microG. - Модифицированный клиент YouTube с массой полезных функций! - Vanced, но для YouTube Music! Относительно меньше возможностей, но удовлетворит ваши потребности. - Сброс - Сохранить - Выберите ваши приложения + Отмена + Закрыть + Пользовательская реализация GMS (сервисов Google) для Vanced создана на основе microG. + Модифицированный клиент YouTube с массой полезных функций! + Vanced, но для YouTube Music! Относительно меньше возможностей, но удовлетворит ваши потребности. + Сброс + Сохранить + Выберите ваши приложения - О нас - Руководство - Менеджер - Логи - Настройки - Обновить Менеджер + О нас + Руководство + Менеджер + Логи + Настройки + Обновить Менеджер - На устройстве есть рут-права? - Предоставить root-права - Давайте приступим - Выберите хотя бы одно приложение! - Не знаете, что это, или не хотите использовать рут версию? Просто нажмите на синюю стрелку ниже! + На устройстве есть рут-права? + Предоставить root-права + Давайте приступим + Выберите хотя бы одно приложение! + Не знаете, что это, или не хотите использовать рут версию? Просто нажмите на синюю стрелку ниже! - О %1$s - Скачать - Информация - Запустить - Переустановить - Удалить - Обновить - Приложения - Список изменений - Загрузка %1$s - Установить + О %1$s + Скачать + Информация + Запустить + Переустановить + Удалить + Обновить + Приложения + Список изменений + Загрузка %1$s + Установить Последняя: - Сначала установите Vanced microG + Сначала установите Vanced microG Рут-доступ не предоставлен - Социальные сети - Поддержите нас - Недоступно + Социальные сети + Поддержите нас + Недоступно Установлена: - Второстепенный цвет - Оформление - Поведение - Удалить загруженные файлы - Файлы успешно удалены - Это позволяет нам собирать информацию о производительности приложения и журналы сбоев - Аналитика Firebase - Язык - Открывать ссылки в Chrome Custom Tabs - Использовать Chrome Custom Tabs - Push Уведомления для %1$s - Получать уведомления о выходе обновления для %1$s - Не удалось сохранить новое значение времени - Скрипт Таймера сна - Настройка значения времени сна, используемого в скрипте /data/adb/service.d/app.sh, полезно для решения проблем монтирования - Как в системе - Тема оформления - Тёмная тема - Светлая тема - Центр обновлений - Обновлений не найдено - Вариант + Второстепенный цвет + Оформление + Поведение + Удалить загруженные файлы + Файлы успешно удалены + Это позволяет нам собирать информацию о производительности приложения и журналы сбоев + Аналитика Firebase + Язык + Открывать ссылки в Chrome Custom Tabs + Использовать Chrome Custom Tabs + Push Уведомления для %1$s + Получать уведомления о выходе обновления для %1$s + Не удалось сохранить новое значение времени + Скрипт Таймера сна + Настройка значения времени сна, используемого в скрипте /data/adb/service.d/app.sh, полезно для решения проблем монтирования + Как в системе + Тема оформления + Тёмная тема + Светлая тема + Центр обновлений + Обновлений не найдено + Вариант - Не удалось сохранить логи - Логи успешно сохранены + Не удалось сохранить логи + Логи успешно сохранены Подробнее - Обнаружены установочные файлы для %1$s! - Менеджер обнаружил все необходимые файлы для установки %1$s. Продолжить установку? + Обнаружены установочные файлы для %1$s! + Менеджер обнаружил все необходимые файлы для установки %1$s. Продолжить установку? Параметры установки %1$s - Проверка обновлений… + Проверка обновлений… Язык(и): %1$s Тема: %1$s Версия: %1$s - Ошибка - Руководство - Стойте! + Ошибка + Руководство + Стойте! Похоже, вы используете Magisk/TWRP версию Vanced, которая больше не поддерживается и не может быть обновлена с помощью этого приложения. Пожалуйста, удалите модуль Vanced через Magisk или с помощью деинсталлятора Vanced для TWRP. - Чтобы установить Vanced, вы ДОЛЖНЫ отключить оптимизацию MIUI в настройках разработчика. (Вы можете проигнорировать это предупреждение, если вы используете прошивку на xiaomi.eu версии 20.2.20+) - Оптимизация MIUI включена! - Пожалуйста, НЕ выходите из приложения в течение этого процесса! - Скачать заново - Пожалуйста, убедитесь, что вы скачали это приложение с vancedapp.com, сервера Vanced в Discord или с официального GitHub + Чтобы установить Vanced, вы ДОЛЖНЫ отключить оптимизацию MIUI в настройках разработчика. (Вы можете проигнорировать это предупреждение, если вы используете прошивку на xiaomi.eu версии 20.2.20+) + Оптимизация MIUI включена! + Пожалуйста, НЕ выходите из приложения в течение этого процесса! + Скачать заново + Пожалуйста, убедитесь, что вы скачали это приложение с vancedapp.com, сервера Vanced в Discord или с официального GitHub Версия - Добро пожаловать + Добро пожаловать - Выберите предпочитаемый язык для Vanced - Последняя + Выберите предпочитаемый язык для Vanced + Последняя Светлая + %1$s Выберите хотя бы один язык! - Черный - Темный + Черный + Темный - Разработчики Менеджера - Другие участники - Исходники - Команда Vanced + Разработчики Менеджера + Другие участники + Исходники + Команда Vanced - Не удалось передать apk владельцу системы, попробуйте еще раз. - Ошибка загрузки %1$s + Не удалось передать apk владельцу системы, попробуйте еще раз. + Ошибка загрузки %1$s Не удалось применить новый второстепенный цвет - Ошибка установки пакета %1$s - Не удалось найти необходимые файлы для установки. Повторно загрузите установочные файлы и попробуйте еще раз. - Не удалось найти apk-файл для черной/темной темы в памяти устройства, повторите попытку. - Установка не была выполнена, поскольку пользователь прервал установку. - Установка не удалась, так как приложение конфликтует с уже установленным приложением. Удалите текущую версию приложения, затем повторите попытку. - Установка не удалась, так как пользователь попытался понизить версию приложения. Удалите обновления обычного приложения YouTube, затем повторите попытку. - Установка не удалась по неизвестным причинам, присоединитесь к нашим каналам Telegram или Discord для дальнейшей поддержки. Пожалуйста, также прикрепите скриншот из расширенного меню - Установка не удалась, так как установочный файл несовместим с вашим устройством. Очистите загруженные файлы в настройках, затем повторите попытку. - Установка не удалась, так как установочные файлы повреждены, попробуйте еще раз. - Установка не удалась, так как включена Оптимизация MIUI. Отключите Оптимизацию MIUI, затем повторите попытку. - Установка не удалась, так как включена проверка подписи apk. Отключите проверку подписи apk, а затем повторите попытку. - Установка не удалась из-за отсутствия на устройстве свободного места. - Не удалось найти apk-файл для черной/темной темы в программе установки. Удалите данные приложения из Менеджера и повторите попытку. - Не удалось найти стандартный путь установки YouTube после раздельной установки. + Ошибка установки пакета %1$s + Не удалось найти необходимые файлы для установки. Повторно загрузите установочные файлы и попробуйте еще раз. + Не удалось найти apk-файл для черной/темной темы в памяти устройства, повторите попытку. + Установка не была выполнена, поскольку пользователь прервал установку. + Установка не удалась, так как приложение конфликтует с уже установленным приложением. Удалите текущую версию приложения, затем повторите попытку. + Установка не удалась, так как пользователь попытался понизить версию приложения. Удалите обновления обычного приложения YouTube, затем повторите попытку. + Установка не удалась по неизвестным причинам, присоединитесь к нашим каналам Telegram или Discord для дальнейшей поддержки. Пожалуйста, также прикрепите скриншот из расширенного меню + Установка не удалась, так как установочный файл несовместим с вашим устройством. Очистите загруженные файлы в настройках, затем повторите попытку. + Установка не удалась, так как установочные файлы повреждены, попробуйте еще раз. + Установка не удалась, так как включена Оптимизация MIUI. Отключите Оптимизацию MIUI, затем повторите попытку. + Установка не удалась, так как включена проверка подписи apk. Отключите проверку подписи apk, а затем повторите попытку. + Установка не удалась из-за отсутствия на устройстве свободного места. + Не удалось найти apk-файл для черной/темной темы в программе установки. Удалите данные приложения из Менеджера и повторите попытку. + Не удалось найти стандартный путь установки YouTube после раздельной установки. diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml index 1a889ce6ef..743585c862 100644 --- a/app/src/main/res/values-si-rLK/strings.xml +++ b/app/src/main/res/values-si-rLK/strings.xml @@ -1,120 +1,120 @@ - අවලංගු කරන්න - වසන්න - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - ප්‍රතිස්ථාපනය කරන්න - සුරකින්න - ඔබගේ යෙදුම් තෝරන්න + අවලංගු කරන්න + වසන්න + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + ප්‍රතිස්ථාපනය කරන්න + සුරකින්න + ඔබගේ යෙදුම් තෝරන්න - මේ ගැන - Guide - Manager - Logs - සැකසුම් - Update Manager + මේ ගැන + Guide + Manager + Logs + සැකසුම් + Update Manager - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Select at least one app! + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - ස්ථාපනය + About %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Changelog + Downloading %1$s + ස්ථාපනය අලුත් - Install Vanced microG first + Install Vanced microG first මූල ප්‍රවේශය ලබා දී නොමැත - Social Media - Support us - නොමැත + Social Media + Support us + නොමැත ස්ථාපනය: - අනෙක් වර්ණය - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - භාෂාව - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - තේමාව - අඳුරු තේමාව - Light Theme - Manager Update Center - No new updates - Variant + අනෙක් වර්ණය + Appearance + Behavior + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + භාෂාව + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + %1$s Push Notifications + Receive push notifications when an update for %1$s is released + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + System Default + තේමාව + අඳුරු තේමාව + Light Theme + Manager Update Center + No new updates + Variant - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? %1$s Installation Preferences - Checking for updates… + Checking for updates… Language(s): %1$s Theme: %1$s Version: %1$s - දෝෂය - මාර්ගෝපදේශය - නවත්වන්න! + දෝෂය + මාර්ගෝපදේශය + නවත්වන්න! You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Redownload + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub අනුවාදය - ආයුබෝවන් + ආයුබෝවන් - Choose your preferred language(s) for Vanced - Latest + Choose your preferred language(s) for Vanced + Latest Light + %1$s Select at least one language! - Black - Dark + Black + Dark - Manager Devs - Other Contributors - මූලාශ්‍ර - Vanced Team + Manager Devs + Other Contributors + මූලාශ්‍ර + Vanced Team - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 536233c919..3a37fb064d 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -1,120 +1,120 @@ - Zrušiť - Zavrieť - Vlastná implementácia GMS pre Vanced založená na projekte microG. - Upravený YouTube klient s mnohými užitočnými funkciami! - Vanced, ale YouTube Music! Obsahuje o trochu menej funkcií, ale splní vaše potreby. - Resetovať - Uložiť - Vyberte svoje aplikácie + Zrušiť + Zavrieť + Vlastná implementácia GMS pre Vanced založená na projekte microG. + Upravený YouTube klient s mnohými užitočnými funkciami! + Vanced, ale YouTube Music! Obsahuje o trochu menej funkcií, ale splní vaše potreby. + Resetovať + Uložiť + Vyberte svoje aplikácie - O aplikácií - Sprievodca - Manažér - Logy - Nastavenia - Aktualizovať Manažéra + O aplikácií + Sprievodca + Manažér + Logy + Nastavenia + Aktualizovať Manažéra - Má vaše zariadenie oprávnenie root? - Udeliť oprávnenie root - Začnime - Vyberte aspoň jednu aplikáciu! - Neviete, čo to je alebo nechcete používať verziu s prístupom root? Stačí kliknúť na modrú šípku dole! + Má vaše zariadenie oprávnenie root? + Udeliť oprávnenie root + Začnime + Vyberte aspoň jednu aplikáciu! + Neviete, čo to je alebo nechcete používať verziu s prístupom root? Stačí kliknúť na modrú šípku dole! - O aplikácií %1$s - Stiahnuť - Informácie - Spustiť - Preinštalovať - Odinštalovať - Aktualizovať - Aplikácie - Zoznam zmien - Sťahovanie %1$s - Inštalovať + O aplikácií %1$s + Stiahnuť + Informácie + Spustiť + Preinštalovať + Odinštalovať + Aktualizovať + Aplikácie + Zoznam zmien + Sťahovanie %1$s + Inštalovať Najnovšie: - Najprv nainštalujte Vanced microG + Najprv nainštalujte Vanced microG Root prístup nebol udelený - Sociálne médiá - Podporte nás - Nedostupné + Sociálne médiá + Podporte nás + Nedostupné Nainštalované: - Sekundárna farba - Vzhľad - Správanie - Vymazať stiahnuté súbory - Súbory boli úspešne vymazané - Toto nám umožňuje zhromažďovať informácie o výkone aplikácie a logy o zlyhaní - Firebase Analytics - Jazyk - Odkazy sa otvoria na vlastných kartách prehliadača Chrome - Používať vlastné karty prehliadača Chrome - %1$s Vyskakovacie oznámenia - Dostávať upozornenia ak je dostupná aktualizácia pre %1$s - Nepodarilo sa uložiť novú hodnotu času - Doba nečinnosti root skriptu - Upravte hodnotu doby nečinnosti použitú v skripte /data/adb/service.d/app.sh, ktorá je užitočná na riešenie problémov s pripojením - Systémovo predvolené - Téma - Tmavá téma - Svetlá téma - Centrum aktualizácií - Žiadne nové aktualizácie - Varianta + Sekundárna farba + Vzhľad + Správanie + Vymazať stiahnuté súbory + Súbory boli úspešne vymazané + Toto nám umožňuje zhromažďovať informácie o výkone aplikácie a logy o zlyhaní + Firebase Analytics + Jazyk + Odkazy sa otvoria na vlastných kartách prehliadača Chrome + Používať vlastné karty prehliadača Chrome + %1$s Vyskakovacie oznámenia + Dostávať upozornenia ak je dostupná aktualizácia pre %1$s + Nepodarilo sa uložiť novú hodnotu času + Doba nečinnosti root skriptu + Upravte hodnotu doby nečinnosti použitú v skripte /data/adb/service.d/app.sh, ktorá je užitočná na riešenie problémov s pripojením + Systémovo predvolené + Téma + Tmavá téma + Svetlá téma + Centrum aktualizácií + Žiadne nové aktualizácie + Varianta - Logy nebolo možné uložiť - Logy boli úspešne uložené + Logy nebolo možné uložiť + Logy boli úspešne uložené Podrobnosti - Nájdených %1$s inštalačných súborov! - Manažér zistil, že všetky potrebné súbory na inštaláciu aplikácie %1$s boli nájdené. Prajete si spustiť inštaláciu? + Nájdených %1$s inštalačných súborov! + Manažér zistil, že všetky potrebné súbory na inštaláciu aplikácie %1$s boli nájdené. Prajete si spustiť inštaláciu? %1$s Predvoľby inštalácie - Kontrola aktualizácií… + Kontrola aktualizácií… Jazyk(y): %1$s Téma: %1$s Verzia: %1$s - Chyba - Sprievodca - Zadržte! + Chyba + Sprievodca + Zadržte! Používate verziu Vanced pre Magisk/TWRP, ktorej vývoj bol ukončený, a ktorú nie je možno pomocou tejto aplikácie aktualizovať. Odstráňte ju prosím odobraním modulu Magisk/použitím TWRP Vanced odinštalátora. - Ak chcete nainštalovať Vanced, MUSÍTE deaktivovať optimalizáciu MIUI v nastaveniach pre vývojárov. (Toto varovanie môžete ignorovať, ak používate ROM 20.2.20 alebo novšiu, založenú na xiaomi.eu) - Optimalizácie MIUI sú zapnuté! - Počas tohto procesu NEODCHÁDZAJTE z aplikácie! - Stiahnuť znova - Uistite sa, že ste si aplikáciu stiahli zo stránky vancedapp.com, servera Vanced Discord alebo Vanced GitHub + Ak chcete nainštalovať Vanced, MUSÍTE deaktivovať optimalizáciu MIUI v nastaveniach pre vývojárov. (Toto varovanie môžete ignorovať, ak používate ROM 20.2.20 alebo novšiu, založenú na xiaomi.eu) + Optimalizácie MIUI sú zapnuté! + Počas tohto procesu NEODCHÁDZAJTE z aplikácie! + Stiahnuť znova + Uistite sa, že ste si aplikáciu stiahli zo stránky vancedapp.com, servera Vanced Discord alebo Vanced GitHub Verzia - Vitajte + Vitajte - Vyberte si jeden alebo viac preferovaných jazykov pre Vanced - Najnovšie + Vyberte si jeden alebo viac preferovaných jazykov pre Vanced + Najnovšie Svetlý + %1$s Vyberte aspoň jeden jazyk! - Čierna - Tmavá + Čierna + Tmavá - Vývojári aplikácie - Ostatní prispievatelia - Zdrojové kódy - Tím Vanced + Vývojári aplikácie + Ostatní prispievatelia + Zdrojové kódy + Tím Vanced - Nepodarilo sa zmeniť vlastníka súboru APK na vlastníka systému. Skúste to znovu prosím. - Chyba pri sťahovaní %1$s + Nepodarilo sa zmeniť vlastníka súboru APK na vlastníka systému. Skúste to znovu prosím. + Chyba pri sťahovaní %1$s Nepodarilo sa nastaviť novú sekundárnu farbu - Nepodarilo sa odinštalovať balíček %1$s - Nepodarilo sa nájsť požadované súbory na inštaláciu. Opätovne stiahnite inštalačné súbory a skúste to znova. - V lokálnom úložisku sa nepodarilo nájsť APK súbor pre čiernu/tmavú tému. Skúste to znovu prosím. - Inštalácia zlyhala, kvôli zrušeniu užívateľom. - Inštalácia zlyhala, pretože aplikácia je v konflikte s už nainštalovanou aplikáciou. Odinštalujte aktuálnu verziu aplikácie a potom to skúste znova. - Inštalácia zlyhala, pretože užívateľ sa pokúsil downgradovať balík. Odinštalujte aktualizácie z pôvodnej aplikácie a potom to skúste znova. - Inštalácia zlyhala z neznámych dôvodov. Pre poskytnutie podpory sa pripojte sa k nášmu Telegramu alebo Discordu. Pripojte tiež snímky obrazovky z ponuky Pokročilé - Inštalácia zlyhala, pretože inštalačný súbor nie je kompatibilný s vaším zariadením. V Nastaveniach vymažte stiahnuté súbory a potom to skúste znova. - Inštalácia zlyhala, pretože súbory APK sú poškodené. Skúste to prosím znova. - Inštalácia zlyhala, pretože je povolená optimalizácia MIUI. Zakážte optimalizáciu MIUI a potom to skúste znova. - Inštalácia zlyhala, pretože overenie podpisu APK je povolené. Zakážte overenie podpisu APK a potom to skúste znova. - Inštalácia zlyhala, pretože v zariadení nie je dostatok voľného miesta. - Z inštalačného programu sa nepodarilo nájsť súbor APK pre čiernu/tmavú tému. Vymažte údaje aplikácie Vanced Manager a potom to skúste znova. - Po split inštalácii aplikácie sa nepodarilo nájsť cestu inštalácie originálnej YouTube aplikácie. + Nepodarilo sa odinštalovať balíček %1$s + Nepodarilo sa nájsť požadované súbory na inštaláciu. Opätovne stiahnite inštalačné súbory a skúste to znova. + V lokálnom úložisku sa nepodarilo nájsť APK súbor pre čiernu/tmavú tému. Skúste to znovu prosím. + Inštalácia zlyhala, kvôli zrušeniu užívateľom. + Inštalácia zlyhala, pretože aplikácia je v konflikte s už nainštalovanou aplikáciou. Odinštalujte aktuálnu verziu aplikácie a potom to skúste znova. + Inštalácia zlyhala, pretože užívateľ sa pokúsil downgradovať balík. Odinštalujte aktualizácie z pôvodnej aplikácie a potom to skúste znova. + Inštalácia zlyhala z neznámych dôvodov. Pre poskytnutie podpory sa pripojte sa k nášmu Telegramu alebo Discordu. Pripojte tiež snímky obrazovky z ponuky Pokročilé + Inštalácia zlyhala, pretože inštalačný súbor nie je kompatibilný s vaším zariadením. V Nastaveniach vymažte stiahnuté súbory a potom to skúste znova. + Inštalácia zlyhala, pretože súbory APK sú poškodené. Skúste to prosím znova. + Inštalácia zlyhala, pretože je povolená optimalizácia MIUI. Zakážte optimalizáciu MIUI a potom to skúste znova. + Inštalácia zlyhala, pretože overenie podpisu APK je povolené. Zakážte overenie podpisu APK a potom to skúste znova. + Inštalácia zlyhala, pretože v zariadení nie je dostatok voľného miesta. + Z inštalačného programu sa nepodarilo nájsť súbor APK pre čiernu/tmavú tému. Vymažte údaje aplikácie Vanced Manager a potom to skúste znova. + Po split inštalácii aplikácie sa nepodarilo nájsť cestu inštalácie originálnej YouTube aplikácie. diff --git a/app/src/main/res/values-so-rSO/strings.xml b/app/src/main/res/values-so-rSO/strings.xml index 1a4945b9b7..92d17a0c17 100644 --- a/app/src/main/res/values-so-rSO/strings.xml +++ b/app/src/main/res/values-so-rSO/strings.xml @@ -1,120 +1,120 @@ - Ka noqo - Xidh - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Dib uceli - Kaydi - Dooro apps-ka + Ka noqo + Xidh + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Dib uceli + Kaydi + Dooro apps-ka - Anaga - Guide - Maamule - Logs - Fadhiga - Cusboonaysii + Anaga + Guide + Maamule + Logs + Fadhiga + Cusboonaysii - Aaladaada miyay root-garaysan tahay? - U Ogolow Fasaxa Root-ka - Aan bilawno - Ugu yaraan hal app dooro! - Ma aqaano wuxuu kani yahay ama ma doonayo inaan isticmaalo midka root-ka ah? Aayar taabo falaadha buluuga ah ee hoose! + Aaladaada miyay root-garaysan tahay? + U Ogolow Fasaxa Root-ka + Aan bilawno + Ugu yaraan hal app dooro! + Ma aqaano wuxuu kani yahay ama ma doonayo inaan isticmaalo midka root-ka ah? Aayar taabo falaadha buluuga ah ee hoose! - Ku saabsan %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Waxa isbadalay - Dajinaya %1$s - Kushub + Ku saabsan %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Apps + Waxa isbadalay + Dajinaya %1$s + Kushub U dambeeyay: - Install Vanced microG first + Install Vanced microG first \'Root\' looma fasaxin - Baraha Bulshada - Na taageer - Lama heli karo + Baraha Bulshada + Na taageer + Lama heli karo Ka kujira: - Midabka - Muuqaalka - Dabeecada - Nadiifi waxyaabaha lasoo dajiyay - Waa la nadiifiyay - Tani waxay noo ogolaanaysaa inaan uruurino xog ku saabsan shaqaynta app-ka iyo kaydinta xogta khaladaadka dhaca - Falanqaynta Firebase - Luuqada - Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay - Isticmaal Daaqadaha Chrome - %1$s Ogaysiisyadiisa - Ha kuu soo dhacaan ogaysiisyo marka mid cusub oo %1$s ah lasoo saaro - Laguma guulaysan in cadadka wakhtiga la kaydiyo - Qormada Wakhtiga Jiifka ee Root-ka - Habee cadadka wakhtiga jiifka ee loo isticmaalay qormada /data/adb/service.d/app.s, waxay muhiim u tahay cilladaha galinta - Sida aaladu tahay - Nashqada - Nashqad Madow - Nashqad Cad - Xarunta Cusboonaysiinta Manager-ka - Majiro wax cusub - Nooca + Midabka + Muuqaalka + Dabeecada + Nadiifi waxyaabaha lasoo dajiyay + Waa la nadiifiyay + Tani waxay noo ogolaanaysaa inaan uruurino xog ku saabsan shaqaynta app-ka iyo kaydinta xogta khaladaadka dhaca + Falanqaynta Firebase + Luuqada + Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay + Isticmaal Daaqadaha Chrome + %1$s Ogaysiisyadiisa + Ha kuu soo dhacaan ogaysiisyo marka mid cusub oo %1$s ah lasoo saaro + Laguma guulaysan in cadadka wakhtiga la kaydiyo + Qormada Wakhtiga Jiifka ee Root-ka + Habee cadadka wakhtiga jiifka ee loo isticmaalay qormada /data/adb/service.d/app.s, waxay muhiim u tahay cilladaha galinta + Sida aaladu tahay + Nashqada + Nashqad Madow + Nashqad Cad + Xarunta Cusboonaysiinta Manager-ka + Majiro wax cusub + Nooca - Could not save logs - Successfully saved logs + Could not save logs + Successfully saved logs Details - %1$s faylashiisii kushubi lahaa ayaa la helay! - Manager-ku wuxuu helay dhamaan faylashii loo baahnaa %1$s inuu ku shubmo. Ma rabtaa inaad ku shubto? + %1$s faylashiisii kushubi lahaa ayaa la helay! + Manager-ku wuxuu helay dhamaan faylashii loo baahnaa %1$s inuu ku shubmo. Ma rabtaa inaad ku shubto? Fadhiga Kushubida %1$s - Hubinaya wax cusub… + Hubinaya wax cusub… Luuqada(ha): %1$s Nashqada: %1$s Tirsiga: %1$s - Khalad - Hagitaan - Jooji! + Khalad + Hagitaan + Jooji! Waxaad isticmaalaysaa version-ka Vanced ee loogu talagalay Magisk/TWRP, kaasoo aan hada la taageerin halkana lagama cusboonaysiin karo. Fadlan iska saar lifaaqa Magisk/adoo isticmaalaya kasaaraha Vanced ee TWRP-ga xagiisa. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Dib udaji - Iska hubi inaad app-ka kaso dajisatay vancedapp.com, xaga martigaliyaha Discord, ama meesha Vanced ee GitHub + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + Please do NOT exit the app during this process! + Dib udaji + Iska hubi inaad app-ka kaso dajisatay vancedapp.com, xaga martigaliyaha Discord, ama meesha Vanced ee GitHub Tirsiga - Soo dhawoow + Soo dhawoow - Dooro luuqada(ha) aad rabto ee app-ka Vanced - Latest + Dooro luuqada(ha) aad rabto ee app-ka Vanced + Latest Cadiin + %1$s Ugu yaraan hal luuqad dooro! - Black - Dark + Black + Dark - Sameeyaasha Manager-ka - Other Contributors - Tixraacyo - Kooxda Vanced + Sameeyaasha Manager-ka + Other Contributors + Tixraacyo + Kooxda Vanced - Laguma guulaysan in APK-ga `mulkiilihiisa loo badalo` barnaamijka aaladu kushaqayso, fadlan markale kuceli. - Khalad ayaa ka dhacay soo dajintii %1$s + Laguma guulaysan in APK-ga `mulkiilihiisa loo badalo` barnaamijka aaladu kushaqayso, fadlan markale kuceli. + Khalad ayaa ka dhacay soo dajintii %1$s Laguma guulaysanin in midabka cusub lagu fadhiisiyo - Laguma guulaysan in laga saaro %1$s - Laguma guulaysan in la helo faylashii ku shubi lahaa. Dib-usoodaji faylasha, kadibna isku day markale. - Laguma guulaysanin in faylka apk-ga ee nashqada madow/mugdiga laga helo kaydka aalaada, fadlan markale isku day. - Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay. - Ku shubidii way guuldaraysatay sababtoo ah app-ka waxay iskhilaafeen mid horay ugu jiray aalada. Ka saar nooca hadda ee kujira, kadib markale ku celi. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Ku shubidii way guuldaraysatay sababtoo ah faylka kuma shaqaynayo aaladaada. Xaga Fadhiga ka saar waxyaabaha lasoo dajiyay, kadib markale isku day. - Ku shubidii way guuldaraysatay sababtoo ah faylashii apk-ga ayaa khalkhalsan, markale isku day. - Ku shubidii way guuldaraysatay sababtoo ah waxaa furan MIUI Optimization. Xidh MIUI Optimization-ka, kadib markale ku celi. - Ku shubidii way guuldaraysatay sababtoo ah waxaa furan xaqiijinta saxiixa apk-ga. Xidh xaqiijinta saxiixa apk-ga, kadibna markale ku celi. - Installation failed because the device doesn\'t have enough free space. - Lama helin faylka apk-ga ee nashqada madow/mugdiga ah. Tirtir xogta Manager-ka, kadib markale ku celi. - Waa lagu guuldaraysatay in la helo wadadii ku shubida app-ka caadiga ah ee YouTube-ka ee kuxigtay ku shubida kala qaybsan. + Laguma guulaysan in laga saaro %1$s + Laguma guulaysan in la helo faylashii ku shubi lahaa. Dib-usoodaji faylasha, kadibna isku day markale. + Laguma guulaysanin in faylka apk-ga ee nashqada madow/mugdiga laga helo kaydka aalaada, fadlan markale isku day. + Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay. + Ku shubidii way guuldaraysatay sababtoo ah app-ka waxay iskhilaafeen mid horay ugu jiray aalada. Ka saar nooca hadda ee kujira, kadib markale ku celi. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Ku shubidii way guuldaraysatay sababtoo ah faylka kuma shaqaynayo aaladaada. Xaga Fadhiga ka saar waxyaabaha lasoo dajiyay, kadib markale isku day. + Ku shubidii way guuldaraysatay sababtoo ah faylashii apk-ga ayaa khalkhalsan, markale isku day. + Ku shubidii way guuldaraysatay sababtoo ah waxaa furan MIUI Optimization. Xidh MIUI Optimization-ka, kadib markale ku celi. + Ku shubidii way guuldaraysatay sababtoo ah waxaa furan xaqiijinta saxiixa apk-ga. Xidh xaqiijinta saxiixa apk-ga, kadibna markale ku celi. + Installation failed because the device doesn\'t have enough free space. + Lama helin faylka apk-ga ee nashqada madow/mugdiga ah. Tirtir xogta Manager-ka, kadib markale ku celi. + Waa lagu guuldaraysatay in la helo wadadii ku shubida app-ka caadiga ah ee YouTube-ka ee kuxigtay ku shubida kala qaybsan. diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index 61e47df224..d18bc535a4 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -1,120 +1,120 @@ - Откажи - Затвори - Независна GMS имплементација за Vanced заснована на microG пројекту. - Модификовани YouTube клијент са многим корисним функцијама! - Vanced, али за YouTube Music! Релативно са мање напредних карактеристикама, али ће задовољити ваше потребе. - Ресетуј - Сачувај - Одабери своје апликације + Откажи + Затвори + Независна GMS имплементација за Vanced заснована на microG пројекту. + Модификовани YouTube клијент са многим корисним функцијама! + Vanced, али за YouTube Music! Релативно са мање напредних карактеристикама, али ће задовољити ваше потребе. + Ресетуј + Сачувај + Одабери своје апликације - О апликацији - Водич - Менаџер - Дневници - Поставке - Освежи Менаџера + О апликацији + Водич + Менаџер + Дневници + Поставке + Освежи Менаџера - Да ли је ваш уређај рутован? - Омогућите дозволу за рут - Хајде да почнемо - Одабери барем једну апликацију! - Не знате шта је ово или не желите да користите роот верзију апликације? Само кликните на плаву стрелицу испод! + Да ли је ваш уређај рутован? + Омогућите дозволу за рут + Хајде да почнемо + Одабери барем једну апликацију! + Не знате шта је ово или не желите да користите роот верзију апликације? Само кликните на плаву стрелицу испод! - О %s - Преузми - Инфо - Покрени - Reinstall - Деинсталирај - Ажурирај - Апликације - Историја измена - Преузимање %1$s - Инсталација + О %s + Преузми + Инфо + Покрени + Reinstall + Деинсталирај + Ажурирај + Апликације + Историја измена + Преузимање %1$s + Инсталација Најновија: - Инсталирајте прво Vanced microG + Инсталирајте прво Vanced microG Root приступ није омогућен - Социјалне мреже - Подржите нас - Недоступно + Социјалне мреже + Подржите нас + Недоступно Инсталирана: - Боја наглашавања - Изглед - Понашање - Обриши преузете датотеке - Успешно брисање датотека - Ово нам омогућава да прикупљамо извештаје о перформансама и грешкама - Firebase Анализа - Језик - Линкови ће бити отворени у Chrome Custom Tabs - Користите Chrome Custom Tabs - %1$s слање обавештења - Примај обавештења када је достигнута верзија %1$s - Грешка при снимању вредности за ново време - Роот скрипта за Време спавања - Подесите време спавања путем у /data/adb/service.d/app.sh скрипти, ово је корисно код грешке при повезивању - Системски подразумевано - Тема - Тамна тема - Светла тема - Менаџер ажурирања - Нема нове верзије - Варијанта + Боја наглашавања + Изглед + Понашање + Обриши преузете датотеке + Успешно брисање датотека + Ово нам омогућава да прикупљамо извештаје о перформансама и грешкама + Firebase Анализа + Језик + Линкови ће бити отворени у Chrome Custom Tabs + Користите Chrome Custom Tabs + %1$s слање обавештења + Примај обавештења када је достигнута верзија %1$s + Грешка при снимању вредности за ново време + Роот скрипта за Време спавања + Подесите време спавања путем у /data/adb/service.d/app.sh скрипти, ово је корисно код грешке при повезивању + Системски подразумевано + Тема + Тамна тема + Светла тема + Менаџер ажурирања + Нема нове верзије + Варијанта - Није могуће снимити дневнике - Успешно сачувани дневници + Није могуће снимити дневнике + Успешно сачувани дневници Детаљи - %1$s верзија је пронађена! - Менаџер је пронашао све датотеке за %1$s верзију инсталације. Да ли желите да инсталирате? + %1$s верзија је пронађена! + Менаџер је пронашао све датотеке за %1$s верзију инсталације. Да ли желите да инсталирате? %1$s Инсталациона подешавања - Провера ажурирања… + Провера ажурирања… Језик (Језици):%1$s Тема: %1$s Верзија: %1$s - Грешка - Водич - Заустави! + Грешка + Водич + Заустави! Користите Magisk/TWRP верзију Vanced апликације, која више није подржана и чије коришћење није могуће. Молимо Вас да уклоните ову апликацију из Magisk/TWRP-а путем Vanced апликације за деинсталацију. - Да би апликација Vanced била исправно инсталирана морате да искључите оптимизацију за ову апликацију у MIUI подешавањима за програмере.( Ову напомену можете да занемарите у случају ако користите верзију 20.2.20 и новију xiaomi.eu ROM-а) - MIUI оптимизација је укључена! - Немојте излазити из апликације у току овога процеса! - Поново преузми - Преузмите апликацију само са официјелног Vanced сајта vancedapp.com, Vanced Discord сервера или Vanced GitHub-а + Да би апликација Vanced била исправно инсталирана морате да искључите оптимизацију за ову апликацију у MIUI подешавањима за програмере.( Ову напомену можете да занемарите у случају ако користите верзију 20.2.20 и новију xiaomi.eu ROM-а) + MIUI оптимизација је укључена! + Немојте излазити из апликације у току овога процеса! + Поново преузми + Преузмите апликацију само са официјелног Vanced сајта vancedapp.com, Vanced Discord сервера или Vanced GitHub-а Верзија - Добро дошли + Добро дошли - Одаберите језик за коришћење Vanced апликације - Најновија + Одаберите језик за коришћење Vanced апликације + Најновија Осветљење+%1$s Одаберите барем један језик! - Црно - Тамно + Црно + Тамно - Менаџер развоја - Други покровитељи - Извор - Vanced Тим + Менаџер развоја + Други покровитељи + Извор + Vanced Тим - Грешка при додели apk власнику система, покушајте поново. - Грешка приликом преузимања %1$s + Грешка при додели apk власнику система, покушајте поново. + Грешка приликом преузимања %1$s Неуспешно постављање нове носеће боје - Неуспешно деинсталирање пакета %1$s - Није могуће пронаћи датотеке за инсталацију. Преузмите их поново и поновите инсталацију. - Није могуће пронаћи apk датотеку за црно/тамну тему у меморијском простору, покушајте поново. - Инсталација није успешна, корисник је обуставио инсталацију. - Инсталација неуспешна, зато што је дошло до конфликта са већ инсталираном верзијом. Деинсталирајте тренутну верзију Vanced-а и затим покушајте поново. - Инсталација није успешна, корисник је покушао да инсталира старију верзију преко новије верзије апликације. Деинсталирајте све до предодређене инсталиране верзије YouTubе апликације, затим покушајте поново. - Неуспешна инсталација услед непознатих разлога, Прикључите се нашем Telegram или Discord каналима за помоћ. Молимо да прикључите снимак екрана из Проширеног Менија - Инсталација је неуспешна јер инсталациона датотека није компатибилна са вашим уређајем. Очистите преузете датотеке у Подешавањима и затим покушајте поново. - Инсталација није успеla јер је apk датотека оштећена, покушајте поново. - Инсталација неуспешна јер је укључена оптимизација за ову апликацију у MIUI систему. Искључите MIUI оптимизацију за ову апликацију и затим покушајте поново. - Инсталација неуспешна јер је укључена провера потписа преузете apk датотеке. Искључите apk проверу и затим покушајте поново. - Инсталација неуспешна јер на уређају нема довољно слободног простора. - Није могуће пронаћи apk датотеку за црно/тамну тему у инсталационим датотекама. Очистите податке у Менаџеру и покушајте поново. - Није могуће пронаћи подразумевану YouTube локацију за инсталацију после подељене инсталације. + Неуспешно деинсталирање пакета %1$s + Није могуће пронаћи датотеке за инсталацију. Преузмите их поново и поновите инсталацију. + Није могуће пронаћи apk датотеку за црно/тамну тему у меморијском простору, покушајте поново. + Инсталација није успешна, корисник је обуставио инсталацију. + Инсталација неуспешна, зато што је дошло до конфликта са већ инсталираном верзијом. Деинсталирајте тренутну верзију Vanced-а и затим покушајте поново. + Инсталација није успешна, корисник је покушао да инсталира старију верзију преко новије верзије апликације. Деинсталирајте све до предодређене инсталиране верзије YouTubе апликације, затим покушајте поново. + Неуспешна инсталација услед непознатих разлога, Прикључите се нашем Telegram или Discord каналима за помоћ. Молимо да прикључите снимак екрана из Проширеног Менија + Инсталација је неуспешна јер инсталациона датотека није компатибилна са вашим уређајем. Очистите преузете датотеке у Подешавањима и затим покушајте поново. + Инсталација није успеla јер је apk датотека оштећена, покушајте поново. + Инсталација неуспешна јер је укључена оптимизација за ову апликацију у MIUI систему. Искључите MIUI оптимизацију за ову апликацију и затим покушајте поново. + Инсталација неуспешна јер је укључена провера потписа преузете apk датотеке. Искључите apk проверу и затим покушајте поново. + Инсталација неуспешна јер на уређају нема довољно слободног простора. + Није могуће пронаћи apk датотеку за црно/тамну тему у инсталационим датотекама. Очистите податке у Менаџеру и покушајте поново. + Није могуће пронаћи подразумевану YouTube локацију за инсталацију после подељене инсталације. diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index edcd8e1646..9a1ddbfc8d 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -1,120 +1,120 @@ - Avbryt - Stäng - En anpassad GMS-implementering för Vanced baserad på microG-projektet. - En modifierad YouTube-klient med många användbara funktioner! - Vanced, men för YouTube Music! Relativt mindre funktionsrika men uppfyller dina behov. - Återställ - Spara - Välj dina appar + Avbryt + Stäng + En anpassad GMS-implementering för Vanced baserad på microG-projektet. + En modifierad YouTube-klient med många användbara funktioner! + Vanced, men för YouTube Music! Relativt mindre funktionsrika men uppfyller dina behov. + Återställ + Spara + Välj dina appar - Om - Guide - Hanterare - Loggar - Inställningar - Uppdatera hanteraren + Om + Guide + Hanterare + Loggar + Inställningar + Uppdatera hanteraren - Är din enhet rotad? - Ge Posting Permission - Nu sätter vi igång - Välj minst en zoomnivå! - Vet du inte vad detta är eller inte vill använda rotversionen? Klicka bara på den blå pilen nedan! + Är din enhet rotad? + Ge Posting Permission + Nu sätter vi igång + Välj minst en zoomnivå! + Vet du inte vad detta är eller inte vill använda rotversionen? Klicka bara på den blå pilen nedan! - Cirka %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Appar - Ändringslogg - Laddar ned %1$s - Install + Cirka %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + Appar + Ändringslogg + Laddar ned %1$s + Install Senaste: - Installera Vanced microG först + Installera Vanced microG först Root-åtkomst inte beviljat - Sociala medier - Stöd oss - Ej tillgänglig + Sociala medier + Stöd oss + Ej tillgänglig Installerad: - Accentfärg - Utseende - Beteende - Rensa nedladdade filer - Rensade data - Detta gör att vi kan samla in information om appens prestanda och kraschloggar - Firebase Analys - Språk - Länkar öppnas i Chrome Custom Tabs - Använd Chrome-anpassade flikar - %1$s push-meddelanden - Få push-meddelanden när en uppdatering för %1$s släpps - Det gick inte att spara nytt tidsvärde - Root-skript sömntid - Justera vilotidsvärde som används i /data/adb/service.d/app.sh skript, användbart för att fixa monteringsproblem - Systemstandard - Tema - Mörkt tema - Ljust tema - Ansvarig uppdateringscenter - Inga nya uppdateringar - Variant + Accentfärg + Utseende + Beteende + Rensa nedladdade filer + Rensade data + Detta gör att vi kan samla in information om appens prestanda och kraschloggar + Firebase Analys + Språk + Länkar öppnas i Chrome Custom Tabs + Använd Chrome-anpassade flikar + %1$s push-meddelanden + Få push-meddelanden när en uppdatering för %1$s släpps + Det gick inte att spara nytt tidsvärde + Root-skript sömntid + Justera vilotidsvärde som används i /data/adb/service.d/app.sh skript, användbart för att fixa monteringsproblem + Systemstandard + Tema + Mörkt tema + Ljust tema + Ansvarig uppdateringscenter + Inga nya uppdateringar + Variant - Kunde inte spara sida - Sparades + Kunde inte spara sida + Sparades Detaljer - %1$s installationsfiler upptäckt! - Manager upptäckte att alla nödvändiga filer för %1$s installation hittades. Vill du installera? + %1$s installationsfiler upptäckt! + Manager upptäckte att alla nödvändiga filer för %1$s installation hittades. Vill du installera? %1$s Valda installationsinställningar - Söker efter uppdateringar… + Söker efter uppdateringar… Språk: %1$s Tema: %1$s Version %1$s - Fel - Guide - Stopp! + Fel + Guide + Stopp! Ser ut som om du använder Magisk versionen av Vanced, som är avbruten och inte kan uppdateras med den här appen. Ta bort den först genom att ta bort magisk modulen. - För att installera Vanced, måste du inaktivera MIUI Optimisations i utvecklarinställningarna. (Du kan ignorera denna varning om du använder 20.2.20 eller senare xiaomi.eu-baserad ROM) - MIUI Optimeringar är aktiverade! - Vänligen avsluta INTE appen under denna process! - Ladda ner igen - Se till att du laddade ner appen från vancedapp.com, den Vanced Discord-servern eller den Vanced GitHub + För att installera Vanced, måste du inaktivera MIUI Optimisations i utvecklarinställningarna. (Du kan ignorera denna varning om du använder 20.2.20 eller senare xiaomi.eu-baserad ROM) + MIUI Optimeringar är aktiverade! + Vänligen avsluta INTE appen under denna process! + Ladda ner igen + Se till att du laddade ner appen från vancedapp.com, den Vanced Discord-servern eller den Vanced GitHub Version - Välkommen + Välkommen - Välj önskade språk för Vanced - Senaste + Välj önskade språk för Vanced + Senaste Ljus + %1$s Välj minst ett språk! - Svart - Mörk + Svart + Mörk - Hanteraren Dev - Andra bidragsgivare - Källor - Vanced Team + Hanteraren Dev + Andra bidragsgivare + Källor + Vanced Team - Misslyckades att Chown Apk till systemägare, Försök igen. - Laddar ned %1$s + Misslyckades att Chown Apk till systemägare, Försök igen. + Laddar ned %1$s Det gick inte att tillämpa ny accentfärg - Det gick inte att avinstallera paket %1$s - Det gick inte att hitta de nödvändiga filerna för installationen. Ladda ner installationsfilerna igen och försök igen. - Det gick inte att hitta apk-fil för svart/mörkt tema från lagring, försök igen. - Åtgärden misslyckades eftersom användaren avbröt installationen. - Installationen misslyckades eftersom appen står i konflikt med en redan installerad app. Avinstallera den aktuella versionen av Vanced, försök sedan igen. - Installationen misslyckades eftersom användaren försökte nedgradera paketet. Avinstallera uppdateringar från lagerappen YouTube, försök sedan igen. - Installationen misslyckades av okända skäl, gå med i vårt Telegram eller Discord för ytterligare stöd. Vänligen bifoga även en skärmdump från menyn Avancerat - Installationen misslyckades eftersom installationsfilen är inkompatibel med din enhet. Rensa nedladdade filer i Inställningarna och försök igen. - Installationen misslyckades eftersom apk-filerna är skadade, försök igen. - Installationen misslyckades eftersom MIUI-optimering är aktiverad. Inaktivera MIUI-optimering och försök igen. - Installationen misslyckades eftersom apk signaturverifiering är aktiverad. Inaktivera apk signaturverifiering och försök igen. - Installationen misslyckades eftersom enheten inte har tillräckligt med ledigt utrymme. - Det gick inte att hitta apk-fil för svart/mörkt tema från installationsprogrammet. Rensa appdata från Manager och försök igen. - Det gick inte att hitta sökvägen för lagerinstallationen på YouTube efter delad installation. + Det gick inte att avinstallera paket %1$s + Det gick inte att hitta de nödvändiga filerna för installationen. Ladda ner installationsfilerna igen och försök igen. + Det gick inte att hitta apk-fil för svart/mörkt tema från lagring, försök igen. + Åtgärden misslyckades eftersom användaren avbröt installationen. + Installationen misslyckades eftersom appen står i konflikt med en redan installerad app. Avinstallera den aktuella versionen av Vanced, försök sedan igen. + Installationen misslyckades eftersom användaren försökte nedgradera paketet. Avinstallera uppdateringar från lagerappen YouTube, försök sedan igen. + Installationen misslyckades av okända skäl, gå med i vårt Telegram eller Discord för ytterligare stöd. Vänligen bifoga även en skärmdump från menyn Avancerat + Installationen misslyckades eftersom installationsfilen är inkompatibel med din enhet. Rensa nedladdade filer i Inställningarna och försök igen. + Installationen misslyckades eftersom apk-filerna är skadade, försök igen. + Installationen misslyckades eftersom MIUI-optimering är aktiverad. Inaktivera MIUI-optimering och försök igen. + Installationen misslyckades eftersom apk signaturverifiering är aktiverad. Inaktivera apk signaturverifiering och försök igen. + Installationen misslyckades eftersom enheten inte har tillräckligt med ledigt utrymme. + Det gick inte att hitta apk-fil för svart/mörkt tema från installationsprogrammet. Rensa appdata från Manager och försök igen. + Det gick inte att hitta sökvägen för lagerinstallationen på YouTube efter delad installation. diff --git a/app/src/main/res/values-ta-rIN/strings.xml b/app/src/main/res/values-ta-rIN/strings.xml index c7f5f91cf5..7bd81c6b48 100644 --- a/app/src/main/res/values-ta-rIN/strings.xml +++ b/app/src/main/res/values-ta-rIN/strings.xml @@ -1,120 +1,120 @@ - ரத்துசெய் - மூடுக - மைக்ஜிக் திட்டத்தின் அடிப்படையில் ஒரு தனிபயன் GMS செயல்படுத்துதல். - பல பயனுள்ள அம்சங்களுடன் ஒரு திருத்தப்பட்ட YouTube வாடிக்கையாளர்! - Vanced, ஆனால் YouTube இசை! ஒப்பீட்டளவில் குறைவான அம்சம் நிறைந்த பணக்காரர்கள் ஆனால் உங்கள் தேவைகளை பூர்த்தி செய்கிறார்கள். - மீட்டமை - சேமிக்கவும் - உங்கள் பயன்பாடுகளைத் தேர்ந்தெடுக்கவும் + ரத்துசெய் + மூடுக + மைக்ஜிக் திட்டத்தின் அடிப்படையில் ஒரு தனிபயன் GMS செயல்படுத்துதல். + பல பயனுள்ள அம்சங்களுடன் ஒரு திருத்தப்பட்ட YouTube வாடிக்கையாளர்! + Vanced, ஆனால் YouTube இசை! ஒப்பீட்டளவில் குறைவான அம்சம் நிறைந்த பணக்காரர்கள் ஆனால் உங்கள் தேவைகளை பூர்த்தி செய்கிறார்கள். + மீட்டமை + சேமிக்கவும் + உங்கள் பயன்பாடுகளைத் தேர்ந்தெடுக்கவும் - பற்றி - வழிகாட்டி - மேலாளர் - பதிவுகள் - அமைப்புகள் - புதுப்பிப்பு மேலாளர் + பற்றி + வழிகாட்டி + மேலாளர் + பதிவுகள் + அமைப்புகள் + புதுப்பிப்பு மேலாளர் - உங்கள் சாதனம் வேரூன்றியதா? - கிராண்ட் ரூட் அனுமதி - தொடங்குவோம் - குறைந்தது ஒரு பயன்பாட்டையாவது தேர்ந்தெடுக்கவும்! - இது என்னவென்று தெரியவில்லையா அல்லது ரூட் பதிப்பைப் பயன்படுத்த விரும்பவில்லையா? கீழே உள்ள நீல அம்புக்குறியைக் கிளிக் செய்க! + உங்கள் சாதனம் வேரூன்றியதா? + கிராண்ட் ரூட் அனுமதி + தொடங்குவோம் + குறைந்தது ஒரு பயன்பாட்டையாவது தேர்ந்தெடுக்கவும்! + இது என்னவென்று தெரியவில்லையா அல்லது ரூட் பதிப்பைப் பயன்படுத்த விரும்பவில்லையா? கீழே உள்ள நீல அம்புக்குறியைக் கிளிக் செய்க! - பற்றி %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - பயன்பாடுகள் - சேஞ்ச்லாக் - %1$s ஐப் பதிவிறக்குகிறது - நிறுவு + பற்றி %1$s + Download + Info + Launch + Reinstall + Uninstall + Update + பயன்பாடுகள் + சேஞ்ச்லாக் + %1$s ஐப் பதிவிறக்குகிறது + நிறுவு சமீபத்தியது: - முதலில் Vanced Microg ஐ நிறுவவும் + முதலில் Vanced Microg ஐ நிறுவவும் ரூட் அக்சஸ் வழங்கப்படவில்லை - சமூக ஊடகம் - எங்களை ஆதரியுங்கள் - கிடைக்கவில்லை + சமூக ஊடகம் + எங்களை ஆதரியுங்கள் + கிடைக்கவில்லை நிறுவப்பட்டது: - கவனங்கவர் நிறம் - தோற்றம் - செயல்பாடு - பதிவிறக்கிய கோப்புகளை அழிக்கவும் - கோப்புகளை வெற்றிகரமாக அழித்துவிட்டது - பயன்பாட்டு செயல்திறன் மற்றும் செயலிழப்பு பதிவுகள் பற்றிய தகவல்களை சேகரிக்க இது எங்களுக்கு உதவுகிறது - ஃபயர்பேஸ் அனலிட்டிக்ஸ் - மொழி - Chrome தனிப்பயன் தாவல்களில் இணைப்புகள் திறக்கப்படும் - Chrome தனிப்பயன் தாவல்களைப் பயன்படுத்தவும் - %1$s புஷ் அறிவிப்புகள் - %1$s க்கான புதுப்பிப்பு வெளியிடப்படும் போது புஷ் அறிவிப்புகளைப் பெறுக - புதிய நேர மதிப்பைச் சேமிப்பதில் தோல்வி - ரூட் ஸ்கிரிப்ட் தூக்க நேரம் - பெருகிவரும் சிக்கல்களை சரிசெய்ய பயனுள்ளதாக இருக்கும் /data/adb/service.d/app.sh ஸ்கிரிப்டில் பயன்படுத்தப்படும் தூக்க நேர மதிப்பை சரிசெய்யவும் - கணினி இயல்புநிலை - தீம் - இருண்ட தீம் - ஒளி தீம் - மேலாளர் புதுப்பிப்பு மையம் - புதிய புதுப்பிப்புகள் இல்லை - மாறுபாடு + கவனங்கவர் நிறம் + தோற்றம் + செயல்பாடு + பதிவிறக்கிய கோப்புகளை அழிக்கவும் + கோப்புகளை வெற்றிகரமாக அழித்துவிட்டது + பயன்பாட்டு செயல்திறன் மற்றும் செயலிழப்பு பதிவுகள் பற்றிய தகவல்களை சேகரிக்க இது எங்களுக்கு உதவுகிறது + ஃபயர்பேஸ் அனலிட்டிக்ஸ் + மொழி + Chrome தனிப்பயன் தாவல்களில் இணைப்புகள் திறக்கப்படும் + Chrome தனிப்பயன் தாவல்களைப் பயன்படுத்தவும் + %1$s புஷ் அறிவிப்புகள் + %1$s க்கான புதுப்பிப்பு வெளியிடப்படும் போது புஷ் அறிவிப்புகளைப் பெறுக + புதிய நேர மதிப்பைச் சேமிப்பதில் தோல்வி + ரூட் ஸ்கிரிப்ட் தூக்க நேரம் + பெருகிவரும் சிக்கல்களை சரிசெய்ய பயனுள்ளதாக இருக்கும் /data/adb/service.d/app.sh ஸ்கிரிப்டில் பயன்படுத்தப்படும் தூக்க நேர மதிப்பை சரிசெய்யவும் + கணினி இயல்புநிலை + தீம் + இருண்ட தீம் + ஒளி தீம் + மேலாளர் புதுப்பிப்பு மையம் + புதிய புதுப்பிப்புகள் இல்லை + மாறுபாடு - பதிவுகளைச் சேமிக்க முடியவில்லை - பதிவுகள் வெற்றிகரமாக சேமிக்கப்பட்டன + பதிவுகளைச் சேமிக்க முடியவில்லை + பதிவுகள் வெற்றிகரமாக சேமிக்கப்பட்டன விவரங்கள் - %1$s நிறுவல் கோப்புகள் கண்டறியப்பட்டன! - %1$s நிறுவலுக்கு தேவையான அனைத்து கோப்புகளும் கண்டறியப்பட்டதை மேலாளர் கண்டறிந்தார். நீங்கள் அதை நிறுவ விரும்புகிறீர்களா? + %1$s நிறுவல் கோப்புகள் கண்டறியப்பட்டன! + %1$s நிறுவலுக்கு தேவையான அனைத்து கோப்புகளும் கண்டறியப்பட்டதை மேலாளர் கண்டறிந்தார். நீங்கள் அதை நிறுவ விரும்புகிறீர்களா? %1$s நிறுவல் விருப்பத்தேர்வுகள் - புதுப்பிப்புகளைச் சரிபார்க்கிறது… + புதுப்பிப்புகளைச் சரிபார்க்கிறது… மொழி: %1$s தீம் %1$s பதிப்பு: %1$s - பிழை - வழிகாட்டி - நிறுத்து! + பிழை + வழிகாட்டி + நிறுத்து! நீங்கள் வேன்ஸின் மேஜிஸ்க் / டி. டபிள்யூ. ஆர். பி பதிப்பைப் பயன்படுத்துகிறீர்கள், இது நிறுத்தப்பட்டது மற்றும் இந்த பயன்பாட்டைப் பயன்படுத்தி புதுப்பிக்க முடியாது. மேஜிஸ்க் தொகுதியை அகற்றி / TWRP Vanced uninstaller ஐப் பயன்படுத்தி அதை அகற்றவும். - Vanced நிறுவ, நீங்கள் டெவலப்பர் அமைப்புகளில் Miui மேம்படுத்தல்களை முடக்க வேண்டும். (நீங்கள் 20.2.20 அல்லது பின்னர் xiaomi.eu அடிப்படையிலான ROM ஐப் பயன்படுத்துகிறீர்களானால் இந்த எச்சரிக்கையை நீங்கள் புறக்கணிக்கலாம்) - MIUI மேம்படுத்தல்கள் இயக்கப்பட்டன! - இந்த செயல்முறையின் போது பயன்பாட்டை விட்டு வெளியேற வேண்டாம்! - மீண்டும் பதிவிறக்கு - பயன்பாட்டை vancedapp.com, Vanced Discord சேவையகம் அல்லது Vanced GitHub இலிருந்து பதிவிறக்கம் செய்துள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள் + Vanced நிறுவ, நீங்கள் டெவலப்பர் அமைப்புகளில் Miui மேம்படுத்தல்களை முடக்க வேண்டும். (நீங்கள் 20.2.20 அல்லது பின்னர் xiaomi.eu அடிப்படையிலான ROM ஐப் பயன்படுத்துகிறீர்களானால் இந்த எச்சரிக்கையை நீங்கள் புறக்கணிக்கலாம்) + MIUI மேம்படுத்தல்கள் இயக்கப்பட்டன! + இந்த செயல்முறையின் போது பயன்பாட்டை விட்டு வெளியேற வேண்டாம்! + மீண்டும் பதிவிறக்கு + பயன்பாட்டை vancedapp.com, Vanced Discord சேவையகம் அல்லது Vanced GitHub இலிருந்து பதிவிறக்கம் செய்துள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள் பதிப்பு - வரவேற்பு + வரவேற்பு - வேன்ஸ்டுக்காக உங்களுக்கு விருப்பமான மொழியைத் தேர்வுசெய்க - சமீபத்தியது + வேன்ஸ்டுக்காக உங்களுக்கு விருப்பமான மொழியைத் தேர்வுசெய்க + சமீபத்தியது ஒளி + %1$s குறைந்தது ஒரு மொழியையாவது தேர்ந்தெடுக்கவும்! - கருப்பு - இருள் + கருப்பு + இருள் - மேலாளர் டெவலப்பர்கள் - பிற பங்களிப்பாளர்கள் - மூலம் - Vanced கூட்டணி + மேலாளர் டெவலப்பர்கள் + பிற பங்களிப்பாளர்கள் + மூலம் + Vanced கூட்டணி - கணினி உரிமையாளருக்கு APK ஐத் தேடுவதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். - %1$s பதிவிறக்குவதில் தோழ்வி + கணினி உரிமையாளருக்கு APK ஐத் தேடுவதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். + %1$s பதிவிறக்குவதில் தோழ்வி புதிய உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துவதில் தோல்வி - %1$s நீக்குவதில் தோல்வி - நிறுவலுக்கு தேவையான கோப்புகளை கண்டுபிடிப்பதில் தோல்வி. நிறுவல் கோப்புகளை மீண்டும் பதிவிறக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். - சேமிப்பகத்திலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பை கண்டுபிடிப்பதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். - பயனர் நிறுவலை நிறுத்தியதால் நிறுவல் தோல்வியடைந்தது. - ஏற்கனவே நிறுவப்பட்ட பயன்பாட்டுடன் பயன்பாடு முரண்படுவதால் நிறுவல் தோல்வியடைந்தது. பயன்பாட்டின் தற்போதைய பதிப்பை நிறுவல் நீக்கி, பின்னர் மீண்டும் முயற்சிக்கவும். - பயனர் தொகுப்பை தரமிறக்க முயற்சித்ததால் நிறுவல் தோல்வியடைந்தது. பங்கு பயன்பாட்டிலிருந்து புதுப்பிப்புகளை நிறுவல் நீக்க, பின்னர் மீண்டும் முயற்சிக்கவும். - நிறுவல் அறியப்படாத காரணங்களுக்காக தோல்வியடைந்தது, எங்கள் டெலிகிராம் அல்லது மேலும் ஆதரவுக்கு இணக்கமாக இருக்கலாம். மேம்பட்ட மெனுவிலிருந்து ஒரு ஸ்கிரீன் ஷாட்டை இணைக்கவும் - நிறுவல் கோப்பு உங்கள் சாதனத்துடன் பொருந்தாததால் நிறுவல் தோல்வியடைந்தது. அமைப்புகளில் பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். - நிறுவல் தோல்வியுற்றது, ஏனெனில் Apk கோப்புகள் சிதைந்துள்ளன, தயவுசெய்து மீண்டும் முயற்சிக்கவும். - MIUI உகப்பாக்கம் இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. MIUI உகப்பாக்கத்தை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். - Apk கையொப்ப சரிபார்ப்பு இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. Apk கையொப்ப சரிபார்ப்பை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். - சாதனம் போதுமான இலவச இடம் இல்லை என்பதால் நிறுவல் தோல்வியடைந்தது. - நிறுவியிலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பைக் கண்டுபிடிப்பதில் தோல்வி. மேலாளரின் பயன்பாட்டுத் தரவை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். - பிளவு நிறுவலுக்குப் பிறகு பங்கு YouTube நிறுவல் பாதையை கண்டுபிடிப்பதில் தோல்வி. + %1$s நீக்குவதில் தோல்வி + நிறுவலுக்கு தேவையான கோப்புகளை கண்டுபிடிப்பதில் தோல்வி. நிறுவல் கோப்புகளை மீண்டும் பதிவிறக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். + சேமிப்பகத்திலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பை கண்டுபிடிப்பதில் தோல்வி, தயவுசெய்து மீண்டும் முயற்சிக்கவும். + பயனர் நிறுவலை நிறுத்தியதால் நிறுவல் தோல்வியடைந்தது. + ஏற்கனவே நிறுவப்பட்ட பயன்பாட்டுடன் பயன்பாடு முரண்படுவதால் நிறுவல் தோல்வியடைந்தது. பயன்பாட்டின் தற்போதைய பதிப்பை நிறுவல் நீக்கி, பின்னர் மீண்டும் முயற்சிக்கவும். + பயனர் தொகுப்பை தரமிறக்க முயற்சித்ததால் நிறுவல் தோல்வியடைந்தது. பங்கு பயன்பாட்டிலிருந்து புதுப்பிப்புகளை நிறுவல் நீக்க, பின்னர் மீண்டும் முயற்சிக்கவும். + நிறுவல் அறியப்படாத காரணங்களுக்காக தோல்வியடைந்தது, எங்கள் டெலிகிராம் அல்லது மேலும் ஆதரவுக்கு இணக்கமாக இருக்கலாம். மேம்பட்ட மெனுவிலிருந்து ஒரு ஸ்கிரீன் ஷாட்டை இணைக்கவும் + நிறுவல் கோப்பு உங்கள் சாதனத்துடன் பொருந்தாததால் நிறுவல் தோல்வியடைந்தது. அமைப்புகளில் பதிவிறக்கம் செய்யப்பட்ட கோப்புகளை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். + நிறுவல் தோல்வியுற்றது, ஏனெனில் Apk கோப்புகள் சிதைந்துள்ளன, தயவுசெய்து மீண்டும் முயற்சிக்கவும். + MIUI உகப்பாக்கம் இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. MIUI உகப்பாக்கத்தை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். + Apk கையொப்ப சரிபார்ப்பு இயக்கப்பட்டிருப்பதால் நிறுவல் தோல்வியடைந்தது. Apk கையொப்ப சரிபார்ப்பை முடக்கு, பின்னர் மீண்டும் முயற்சிக்கவும். + சாதனம் போதுமான இலவச இடம் இல்லை என்பதால் நிறுவல் தோல்வியடைந்தது. + நிறுவியிலிருந்து கருப்பு / இருண்ட கருப்பொருளுக்கான Apk கோப்பைக் கண்டுபிடிப்பதில் தோல்வி. மேலாளரின் பயன்பாட்டுத் தரவை அழிக்கவும், பின்னர் மீண்டும் முயற்சிக்கவும். + பிளவு நிறுவலுக்குப் பிறகு பங்கு YouTube நிறுவல் பாதையை கண்டுபிடிப்பதில் தோல்வி. diff --git a/app/src/main/res/values-th-rTH/strings.xml b/app/src/main/res/values-th-rTH/strings.xml index da23ef3b42..d608e6c37b 100644 --- a/app/src/main/res/values-th-rTH/strings.xml +++ b/app/src/main/res/values-th-rTH/strings.xml @@ -1,120 +1,120 @@ - ยกเลิก - ปิด - การปรับใช้ GMS แบบกำหนดเองสำหรับ Vanced ตามโครงการ microG - ไคลเอนต์ YouTube ที่ได้รับการแก้ไขพร้อมคุณสมบัติที่มีประโยชน์มากมาย! - Vanced สำหรับ YouTube Music! คุณสมบัติค่อนข้างน้อย แต่ตอบสนองความต้องการของคุณ - ล้างค่าเริ่มต้น - บันทึก - เลือกแอปพลิเคชันของคุณ + ยกเลิก + ปิด + การปรับใช้ GMS แบบกำหนดเองสำหรับ Vanced ตามโครงการ microG + ไคลเอนต์ YouTube ที่ได้รับการแก้ไขพร้อมคุณสมบัติที่มีประโยชน์มากมาย! + Vanced สำหรับ YouTube Music! คุณสมบัติค่อนข้างน้อย แต่ตอบสนองความต้องการของคุณ + ล้างค่าเริ่มต้น + บันทึก + เลือกแอปพลิเคชันของคุณ - ข้อมูลเกี่ยวกับทีมนักพัฒนา - แนะนำ - ตัวจัดการ - บันทึกข้อมูลระบบ - ตั้งค่า - อัพเดทตัวจัดการ + ข้อมูลเกี่ยวกับทีมนักพัฒนา + แนะนำ + ตัวจัดการ + บันทึกข้อมูลระบบ + ตั้งค่า + อัพเดทตัวจัดการ - อุปกรณ์ของคุณได้รูทหรือไม่? - ให้สิทธิ์การใช้งานของรูท - เริ่มกันเลย! - เลือกแอปพลิเคชั่นอย่างน้อยหนึ่งรายการ! - ไม่รู้/ไม่ต้องการใช้เวอร์ชั่นรูท? แค่คลิ๊กบนไอคอนธนูสีฟ้า! + อุปกรณ์ของคุณได้รูทหรือไม่? + ให้สิทธิ์การใช้งานของรูท + เริ่มกันเลย! + เลือกแอปพลิเคชั่นอย่างน้อยหนึ่งรายการ! + ไม่รู้/ไม่ต้องการใช้เวอร์ชั่นรูท? แค่คลิ๊กบนไอคอนธนูสีฟ้า! - เกี่ยวกับ %1$s - ดาวน์โหลด - ข้อมูล - เปิด - Reinstall - ถอนการติดตั้ง - อัพเดท - แอป - บันทึกการเปลี่ยนแปลง - กำลังดาวน์โหลด %1$s - ติดตั้ง + เกี่ยวกับ %1$s + ดาวน์โหลด + ข้อมูล + เปิด + Reinstall + ถอนการติดตั้ง + อัพเดท + แอป + บันทึกการเปลี่ยนแปลง + กำลังดาวน์โหลด %1$s + ติดตั้ง ล่าสุด: - ติดตั้ง Vanced microG ก่อน + ติดตั้ง Vanced microG ก่อน ไม่ได้รับสิทธิ์ของรูท - สื่อสังคม - สนับสนุนพวกเรา - ไม่สามารถใช้ได้ + สื่อสังคม + สนับสนุนพวกเรา + ไม่สามารถใช้ได้ ติดตั้งแล้ว: - สีหลัก - ลักษณะที่ปรากฏ - ลักษณะการทำงาน - ล้างไฟล์ที่ดาวน์โหลดไว้ - ล้างข้อมูลเรียบร้อยแล้ว - สำหรับ รวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของแอป และบันทึกข้อขัดข้อง - การวิเคราะห์ Firebase - ภาษา - ลิ้งค์จะเปิดไปยังแท็บที่กำหนดเองของ Chrome - ใช้แท็บที่กำหนดเองของ Chrome - %1$s การแจ้งเตือนแบบพุช - รับการแจ้งเตือนแบบพุช เมื่อมีการเผยแพร่อัปเดต %1$s ล่าสุด - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - ค่าเริ่มต้นของระบบ - ธีม - ธีมมืด - ธีมสว่าง - การจัดการอัพเดพหลัก - ไม่มีอัพเดตใหม่ - ตัวแปร + สีหลัก + ลักษณะที่ปรากฏ + ลักษณะการทำงาน + ล้างไฟล์ที่ดาวน์โหลดไว้ + ล้างข้อมูลเรียบร้อยแล้ว + สำหรับ รวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของแอป และบันทึกข้อขัดข้อง + การวิเคราะห์ Firebase + ภาษา + ลิ้งค์จะเปิดไปยังแท็บที่กำหนดเองของ Chrome + ใช้แท็บที่กำหนดเองของ Chrome + %1$s การแจ้งเตือนแบบพุช + รับการแจ้งเตือนแบบพุช เมื่อมีการเผยแพร่อัปเดต %1$s ล่าสุด + Failed to save new time value + Root Script Sleep Time + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + ค่าเริ่มต้นของระบบ + ธีม + ธีมมืด + ธีมสว่าง + การจัดการอัพเดพหลัก + ไม่มีอัพเดตใหม่ + ตัวแปร - ไม่สามารถบันทึกได้ - ดำเนินการบันทึกเรียบร้อยแล้ว + ไม่สามารถบันทึกได้ + ดำเนินการบันทึกเรียบร้อยแล้ว รายละเอียด - %1$s ตรวจพบไฟล์สำหรับการติดตั้ง! - ตรวจพบการอัพเดทไฟล์สำหรับติดตั้งใหม่ที่จำเป็น %1$s คุณต้องการติดตั้งหรือไม่? + %1$s ตรวจพบไฟล์สำหรับการติดตั้ง! + ตรวจพบการอัพเดทไฟล์สำหรับติดตั้งใหม่ที่จำเป็น %1$s คุณต้องการติดตั้งหรือไม่? %1$s กำหนดค่าการติดตั้ง - ตรวจหาการปรับปรุงใหม่ๆ… + ตรวจหาการปรับปรุงใหม่ๆ… ภาษา: %1$s ธีม: %1$s รุ่น: %1$s - ผิดพลาด - คู่มือ - หยุด! + ผิดพลาด + คู่มือ + หยุด! คุณกำลังใช้ Vanced เวอร์ชัน Magisk / TWRP ซึ่งถูกยกเลิกและไม่สามารถอัปเดตได้จากแอปนี้ กรุณาลบออกโดยการถอดโมดูล Magisk / ใช้โปรแกรมถอนการติดตั้ง TWRP Vanced - ในการติดตั้ง Vanced คุณต้องปิดใช้งาน การเพิ่มประสิทธิภาพ MIUI ในการตั้งค่าสำหรับนักพัฒนา (คุณสามารถเพิกเฉยต่อคำเตือนนี้ได้ หากคุณใช้ based ROM xiaomi.eu 20.2.20 หรือใหม่กว่า) - เปิดใช้งานการเพิ่มประสิทธิภาพ MIUI แล้ว! - โปรดอย่าออกจากแอปในระหว่างขั้นตอนนี้! - ดาวน์โหลดอีกครั้ง - ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดแอพจากช่องทางที่ถูกต้อง vancedapp.com, เซิร์ฟเวอร์ Vanced Discord หรือ Vanced GitHub + ในการติดตั้ง Vanced คุณต้องปิดใช้งาน การเพิ่มประสิทธิภาพ MIUI ในการตั้งค่าสำหรับนักพัฒนา (คุณสามารถเพิกเฉยต่อคำเตือนนี้ได้ หากคุณใช้ based ROM xiaomi.eu 20.2.20 หรือใหม่กว่า) + เปิดใช้งานการเพิ่มประสิทธิภาพ MIUI แล้ว! + โปรดอย่าออกจากแอปในระหว่างขั้นตอนนี้! + ดาวน์โหลดอีกครั้ง + ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดแอพจากช่องทางที่ถูกต้อง vancedapp.com, เซิร์ฟเวอร์ Vanced Discord หรือ Vanced GitHub รุ่น - ยินดีต้อนรับ + ยินดีต้อนรับ - เลือกภาษาที่คุณต้องการใช้สำหรับ Vanced - ล่าสุด + เลือกภาษาที่คุณต้องการใช้สำหรับ Vanced + ล่าสุด เบา + %1$s เลือกอย่างน้อยหนึ่งภาษา! - สีดำ - สีเข้ม + สีดำ + สีเข้ม - ตัวจัดการ Devs - ผู้ร่วมให้ข้อมูลอื่น ๆ - แหล่งที่มา - ทีมงาน Vanced + ตัวจัดการ Devs + ผู้ร่วมให้ข้อมูลอื่น ๆ + แหล่งที่มา + ทีมงาน Vanced - ไม่สามารถ `chown` APK ในระบบได้ โปรดลองอีกครั้ง - เกิดข้อผิดพลาดในการดาวน์โหลด %1$s + ไม่สามารถ `chown` APK ในระบบได้ โปรดลองอีกครั้ง + เกิดข้อผิดพลาดในการดาวน์โหลด %1$s การใช้สีที่เน้นใหม่มีความผิดพลาด - ถอนการติดตั้งแพ็กเกจไม่สำเร็จ %1$s - ไม่สามารถค้นหาไฟล์สำหรับการติดตั้งที่ต้องการได้. กรุณาดาวน์โหลดไฟล์สำหรับการติดตั้งใหม่แล้วลองอีกครั้ง - ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้ม จากที่เก็บข้อมูล โปรดลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากผู้ใช้ยกเลิกการติดตั้ง - การติดตั้งล้มเหลวเนื่องจากแอปขัดแย้งกับแอปที่ติดตั้งไว้ก่อนหน้า ถอนการติดตั้งแอปเวอร์ชันปัจจุบันแล้วลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากผู้ใช้พยายามดาวน์เกรดแพ็กเกจ ถอนการติดตั้งการอัปเดตจากแอปเดิมก่อน แล้วลองอีกครั้ง - การติดตั้งล้มเหลวโดยไม่ทราบสาเหตุเข้าร่วม Telegram หรือ Discord ของเราเพื่อรับการสนับสนุนเพิ่มเติม โปรดแนบภาพหน้าจอจากเมนู - การติดตั้งล้มเหลวเนื่องจากไฟล์การติดตั้งเข้ากันไม่ได้กับอุปกรณ์ของคุณ กรุณาล้างไฟล์ที่ดาวน์โหลดในการตั้งค่า แล้วลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากไฟล์ apk เสียหายโปรดลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากเปิดใช้งาน MIUI Optimization โปรดปิดการใช้งาน MIUI Optimization แล้วลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากเปิดใช้งานการตรวจสอบลายเซ็น apk กรุณาปิดใช้งานการตรวจสอบลายเซ็น apk แล้วลองอีกครั้ง - การติดตั้งล้มเหลวเนื่องจากอุปกรณ์มีพื้นที่ว่างไม่เพียงพอ - ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้มจากโปรแกรมติดตั้ง กรุณาล้างข้อมูลแอปVanced-Manager แล้วลองอีกครั้ง - ไม่พบเส้นทางการติดตั้งสต็อกของ YouTube หลังจากการติดตั้งแบบแยก + ถอนการติดตั้งแพ็กเกจไม่สำเร็จ %1$s + ไม่สามารถค้นหาไฟล์สำหรับการติดตั้งที่ต้องการได้. กรุณาดาวน์โหลดไฟล์สำหรับการติดตั้งใหม่แล้วลองอีกครั้ง + ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้ม จากที่เก็บข้อมูล โปรดลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากผู้ใช้ยกเลิกการติดตั้ง + การติดตั้งล้มเหลวเนื่องจากแอปขัดแย้งกับแอปที่ติดตั้งไว้ก่อนหน้า ถอนการติดตั้งแอปเวอร์ชันปัจจุบันแล้วลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากผู้ใช้พยายามดาวน์เกรดแพ็กเกจ ถอนการติดตั้งการอัปเดตจากแอปเดิมก่อน แล้วลองอีกครั้ง + การติดตั้งล้มเหลวโดยไม่ทราบสาเหตุเข้าร่วม Telegram หรือ Discord ของเราเพื่อรับการสนับสนุนเพิ่มเติม โปรดแนบภาพหน้าจอจากเมนู + การติดตั้งล้มเหลวเนื่องจากไฟล์การติดตั้งเข้ากันไม่ได้กับอุปกรณ์ของคุณ กรุณาล้างไฟล์ที่ดาวน์โหลดในการตั้งค่า แล้วลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากไฟล์ apk เสียหายโปรดลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากเปิดใช้งาน MIUI Optimization โปรดปิดการใช้งาน MIUI Optimization แล้วลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากเปิดใช้งานการตรวจสอบลายเซ็น apk กรุณาปิดใช้งานการตรวจสอบลายเซ็น apk แล้วลองอีกครั้ง + การติดตั้งล้มเหลวเนื่องจากอุปกรณ์มีพื้นที่ว่างไม่เพียงพอ + ไม่พบไฟล์ apk สำหรับธีมสีดำ / สีเข้มจากโปรแกรมติดตั้ง กรุณาล้างข้อมูลแอปVanced-Manager แล้วลองอีกครั้ง + ไม่พบเส้นทางการติดตั้งสต็อกของ YouTube หลังจากการติดตั้งแบบแยก diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 51572d4c07..ce42d3f0df 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -1,120 +1,120 @@ - İptal - Kapat - Vanced için geliştirilmiş microG Projesi tabanlı GMH sürümü. - İşe yarar birçok özellikle modifiye edilmiş YouTube sürümü! - Yine Vanced, ama YouTube Music için! Kıyasen daha az özelliğe sahip ama beklentilerini karşılayacaktır. - Sıfırla - Kaydet - Uygulamalarınızı Seçin + İptal + Kapat + Vanced için geliştirilmiş microG Projesi tabanlı GMH sürümü. + İşe yarar birçok özellikle modifiye edilmiş YouTube sürümü! + Yine Vanced, ama YouTube Music için! Kıyasen daha az özelliğe sahip ama beklentilerini karşılayacaktır. + Sıfırla + Kaydet + Uygulamalarınızı Seçin - Hakkında - Rehber - Manager - Geçmiş kayıtlar - Ayarlar - Manager\'ı güncelle + Hakkında + Rehber + Manager + Geçmiş kayıtlar + Ayarlar + Manager\'ı güncelle - Cihazın rootlu mu? - Root yetkisi ver - Haydi başlayalım - En az bir uygulama seçin! - Root\'un ne olduğunu bilmiyor veya root sürümünü kullanmak istemiyorsan, alttaki mavi oka tıklayabilirsin! + Cihazın rootlu mu? + Root yetkisi ver + Haydi başlayalım + En az bir uygulama seçin! + Root\'un ne olduğunu bilmiyor veya root sürümünü kullanmak istemiyorsan, alttaki mavi oka tıklayabilirsin! - %1$s hakkında - İndir - Bilgi - Başlat - Yeniden yükle - Kaldır - Güncelleştir - Uygulamalar - Sürüm Notları - %1$s indiriliyor - Yükle + %1$s hakkında + İndir + Bilgi + Başlat + Yeniden yükle + Kaldır + Güncelleştir + Uygulamalar + Sürüm Notları + %1$s indiriliyor + Yükle En son: - Vanced microG\'yi kurmalısın + Vanced microG\'yi kurmalısın Root erişimi verilmedi - Sosyal Medya - Tıkla, destek ol - Yüklenmemiş + Sosyal Medya + Tıkla, destek ol + Yüklenmemiş Yüklü: - Tema Rengi - Görünüm - Davranış - İndirilen dosyaları temizle - Dosyalar başarıyla temizlendi - Uygulama hakkında performans ve hata kayıtlarını toplamamıza izin verir - Firebase Analizi - Dil - Bağlantılar Chrome Özel Sekmelerinde açılacaktır - Chrome Özel Sekmelerini kullan - %1$s Anlık Bildirimleri - %1$s için bir güncelleme yayınlandığında anlık bildirimler alın - Yeni zaman değeri kaydedilemedi - Root kurulumu, bekletme süresi - [Gelişmiş] Kurulum sırasında çalıştırılan /data/adb/service.d/app.sh dosyasındaki uyku/bekletme süresinin değer ayarı. Kurulum sırasında oluşan hatalara çözüm olabilir - Sistem varsayılanı - Tema - Koyu Tema - Açık Tema - Manager Güncelleme Merkezi - Yeni güncelleme yok - Sürüm yapısı + Tema Rengi + Görünüm + Davranış + İndirilen dosyaları temizle + Dosyalar başarıyla temizlendi + Uygulama hakkında performans ve hata kayıtlarını toplamamıza izin verir + Firebase Analizi + Dil + Bağlantılar Chrome Özel Sekmelerinde açılacaktır + Chrome Özel Sekmelerini kullan + %1$s Anlık Bildirimleri + %1$s için bir güncelleme yayınlandığında anlık bildirimler alın + Yeni zaman değeri kaydedilemedi + Root kurulumu, bekletme süresi + [Gelişmiş] Kurulum sırasında çalıştırılan /data/adb/service.d/app.sh dosyasındaki uyku/bekletme süresinin değer ayarı. Kurulum sırasında oluşan hatalara çözüm olabilir + Sistem varsayılanı + Tema + Koyu Tema + Açık Tema + Manager Güncelleme Merkezi + Yeni güncelleme yok + Sürüm yapısı - Kayıtlar kaydedilemedi - Kayıtlar başarıyla kaydedildi + Kayıtlar kaydedilemedi + Kayıtlar başarıyla kaydedildi Ayrıntılar - %1$s için kurulum dosyaları bulundu! - Manager, %1$s kurulumu için gerekli olan dosyaları belirledi. Yüklemek ister misiniz? + %1$s için kurulum dosyaları bulundu! + Manager, %1$s kurulumu için gerekli olan dosyaları belirledi. Yüklemek ister misiniz? %1$s Kurulum Tercihleri - Güncellemeler kontrol ediliyor… + Güncellemeler kontrol ediliyor… Dil(ler): %1$s Tema: %1$s Sürüm: %1$s - Hata - Kılavuz - Durdur! + Hata + Kılavuz + Durdur! Geliştirilmesi durdurulan ve bu uygulama ile güncellenemeyen Vanced\'ın, Magisk/TWRP sürümünü kullanıyorsunuz. Lütfen Magisk/TWRP sürümünü cihazınızdan kaldırın. - Vanced\'ı yükleyebilmek için, geliştirici ayarlarından/seçeneklerinden MIUI optimizasyonunu devre dışı bırakmalısın. (xiaomi.eu tabanlı 20.2.20 sürüm veya üzeri ROM kullanıyorsan, bu uyarıyı göz ardı edebilirsin) - MIUI Optimizasyonu aktif gözüküyor! - İşlem süresince LÜTFEN uygulamadan çıkmayın! - Tekrar İndir - Uygulamayı vancedapp.com, Vanced Discord sunucusu, veya Vanced GitHub\'dan indirdiğinizden emin olun + Vanced\'ı yükleyebilmek için, geliştirici ayarlarından/seçeneklerinden MIUI optimizasyonunu devre dışı bırakmalısın. (xiaomi.eu tabanlı 20.2.20 sürüm veya üzeri ROM kullanıyorsan, bu uyarıyı göz ardı edebilirsin) + MIUI Optimizasyonu aktif gözüküyor! + İşlem süresince LÜTFEN uygulamadan çıkmayın! + Tekrar İndir + Uygulamayı vancedapp.com, Vanced Discord sunucusu, veya Vanced GitHub\'dan indirdiğinizden emin olun Sürüm - Hoş Geldiniz + Hoş Geldiniz - Vanced için tercih ettiğiniz dil(ler)i seçin - En yeni + Vanced için tercih ettiğiniz dil(ler)i seçin + En yeni Açık renk + %1$s En az bir dil seçmelisin! - Siyah (amoled) - Koyu renk + Siyah (amoled) + Koyu renk - Manager Geliştiricileri - Katkıda bulunan diğer kişiler - Kaynaklar - Vanced Ekibi + Manager Geliştiricileri + Katkıda bulunan diğer kişiler + Kaynaklar + Vanced Ekibi - APK dosyasına sistem yetkisi atanamadı, lütfen tekrar deneyin. - %1$s indirilirken hata oluştu + APK dosyasına sistem yetkisi atanamadı, lütfen tekrar deneyin. + %1$s indirilirken hata oluştu Yeni vurgu rengi uygulanamadı - %1$s kaldırılırken hata oluştu - Kurulum için gerekli olan dosyaları belirlerken bir hata oluştu. Kurulum dosyalarını tekrar indirip, yeniden deneyin. - Depolama alanında Siyah/Koyu temanın APK dosyasını belirlerken bir hata oluştu. Tekrar deneyin lütfen. - Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu. - Uygulama önceden yüklenmiş bir uygulamayla çakıştığından yükleme başarısız oldu. Uygulamanın mevcut sürümünü kaldırın ve ardından tekrar deneyin. - Kullanıcı eski sürümü yüklemeye çalıştığı için kurulum tamamlanamadı. Orijinal YouTube uygulamasının güncellemelerini kaldırdıktan sonra yeniden deneyin. - Kurulum, bilinmeyen sebeplerden dolayı başarısız oldu. Telegram grubu veya Discord sunucusundan destek alabilirsin. Ayrıca, detaylar ekranının bir ekran görüntüsünü alıp, yardım talebinle birlikte iletmeyi unutma lütfen. - Kurulum dosyası cihazınız ile uyumsuz olduğu için kurulum işlemi başarısız oldu. Ayarlar\'da indirilen dosyaları temizleyip, tekrar deneyin. - APK dosyaları çözümlenemediğinden, kurulum başarısız oldu. Lütfen yeniden deneyin. - MIUI Optimizasyonu etkin olduğundan, kurulum başarısız oldu. MIUI Optimizasyonunu devre dışı bırakıp, yeniden deneyin. - APK imza doğrulaması etkin olduğundan, kurulum başarısız oldu. APK imza doğrulamasını devre dışı bırakıp, yeniden deneyin. - Yetersiz depolama alanından dolayı kurulum başarısız oldu. - Yükleyicide Siyah/Koyu tema için APK dosyalarını ararken bir hata oluştu. Manager\'ın verilerini temizleyip, yeniden deneyin. - Ayrı kurulum işleminden sonra orijinal YouTube kurulum yolu belirlenemedi. + %1$s kaldırılırken hata oluştu + Kurulum için gerekli olan dosyaları belirlerken bir hata oluştu. Kurulum dosyalarını tekrar indirip, yeniden deneyin. + Depolama alanında Siyah/Koyu temanın APK dosyasını belirlerken bir hata oluştu. Tekrar deneyin lütfen. + Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu. + Uygulama önceden yüklenmiş bir uygulamayla çakıştığından yükleme başarısız oldu. Uygulamanın mevcut sürümünü kaldırın ve ardından tekrar deneyin. + Kullanıcı eski sürümü yüklemeye çalıştığı için kurulum tamamlanamadı. Orijinal YouTube uygulamasının güncellemelerini kaldırdıktan sonra yeniden deneyin. + Kurulum, bilinmeyen sebeplerden dolayı başarısız oldu. Telegram grubu veya Discord sunucusundan destek alabilirsin. Ayrıca, detaylar ekranının bir ekran görüntüsünü alıp, yardım talebinle birlikte iletmeyi unutma lütfen. + Kurulum dosyası cihazınız ile uyumsuz olduğu için kurulum işlemi başarısız oldu. Ayarlar\'da indirilen dosyaları temizleyip, tekrar deneyin. + APK dosyaları çözümlenemediğinden, kurulum başarısız oldu. Lütfen yeniden deneyin. + MIUI Optimizasyonu etkin olduğundan, kurulum başarısız oldu. MIUI Optimizasyonunu devre dışı bırakıp, yeniden deneyin. + APK imza doğrulaması etkin olduğundan, kurulum başarısız oldu. APK imza doğrulamasını devre dışı bırakıp, yeniden deneyin. + Yetersiz depolama alanından dolayı kurulum başarısız oldu. + Yükleyicide Siyah/Koyu tema için APK dosyalarını ararken bir hata oluştu. Manager\'ın verilerini temizleyip, yeniden deneyin. + Ayrı kurulum işleminden sonra orijinal YouTube kurulum yolu belirlenemedi. diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index ee64b4c47a..c06c467f3b 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -1,120 +1,120 @@ - Скасувати - Закрити - Модифікований GMS для Vanced на основі проекту microG. - Модифікований клієнт YouTube з безліччю корисних функцій! - Vanced, але для YouTube Music! Відносно менш функціональний, але задовольняє ваші потреби. - Скинути - Зберегти - Виберіть Ваші Додатки + Скасувати + Закрити + Модифікований GMS для Vanced на основі проекту microG. + Модифікований клієнт YouTube з безліччю корисних функцій! + Vanced, але для YouTube Music! Відносно менш функціональний, але задовольняє ваші потреби. + Скинути + Зберегти + Виберіть Ваші Додатки - Про нас - Посібник - Менеджер - Логи - Налаштування - Оновіть Менеджер + Про нас + Посібник + Менеджер + Логи + Налаштування + Оновіть Менеджер - На Пристрої Є Root Права? - Надати Root Права - Почнімо - Оберіть принаймні один додаток! - Не знаєте, що це або не хочете використовувати рутовану версію? Просто натисніть синю стрілку внизу! + На Пристрої Є Root Права? + Надати Root Права + Почнімо + Оберіть принаймні один додаток! + Не знаєте, що це або не хочете використовувати рутовану версію? Просто натисніть синю стрілку внизу! - Про %1$s - Download - Інформація - Відкрити - Reinstall - Видалити - Update - Додатки - Список змін - Завантаження %1$s - Встановити + Про %1$s + Download + Інформація + Відкрити + Reinstall + Видалити + Update + Додатки + Список змін + Завантаження %1$s + Встановити Найновіша: - Спочатку встановіть Vanced microG + Спочатку встановіть Vanced microG Права суперкористувача не були надані - Соціальні мережі - Підтримайте нас - Недоступно + Соціальні мережі + Підтримайте нас + Недоступно Встановлена: - Вторинний колір - Вигляд - Поведінка - Очистити завантажені файли - Файли було успішно очищено - Це дозволяє нам збирати інформацію про продуктивність додатка та журнали збоїв - Аналітика Firebase - Мова - Відкривати посилання в Chrome Custom Tabs - Використовувати Chrome Custom Tabs - %1$s Спливаючі Сповіщення - Отримувати спливаючі сповіщення, коли доступне оновлення для %1$s - Не вдалося зберегти нове значення часу - Скрипт Таймера сну - Налаштування значення часу сну, використовуваного в скрипті /data/adb/service.d/app.sh, корисно для вирішення проблем монтування - Системна - Тема - Темна тема - Світла тема - Центр Оновлень - Оновлень не знайдено - Варіант + Вторинний колір + Вигляд + Поведінка + Очистити завантажені файли + Файли було успішно очищено + Це дозволяє нам збирати інформацію про продуктивність додатка та журнали збоїв + Аналітика Firebase + Мова + Відкривати посилання в Chrome Custom Tabs + Використовувати Chrome Custom Tabs + %1$s Спливаючі Сповіщення + Отримувати спливаючі сповіщення, коли доступне оновлення для %1$s + Не вдалося зберегти нове значення часу + Скрипт Таймера сну + Налаштування значення часу сну, використовуваного в скрипті /data/adb/service.d/app.sh, корисно для вирішення проблем монтування + Системна + Тема + Темна тема + Світла тема + Центр Оновлень + Оновлень не знайдено + Варіант - Не вдалося зберегти логи - Логи успішно збережені + Не вдалося зберегти логи + Логи успішно збережені Детальніше - Знайдено %1$s файлів для встановлення! - Менеджер виявив, що всі необхідні файли для %1$s встановлення було знайдено. Бажаєте встановити їх? + Знайдено %1$s файлів для встановлення! + Менеджер виявив, що всі необхідні файли для %1$s встановлення було знайдено. Бажаєте встановити їх? Параметри встановлення %1$s - Перевірка оновлень… + Перевірка оновлень… Мова(и): %1$s Тема: %1$s Версія: %1$s - Помилка - Гайд - Зупинись! + Помилка + Гайд + Зупинись! Ви використовуєте Magisk/TWRP версію Vanced, яка припиняється і не може бути оновлена за допомогою цього застосунку. Будь ласка, видаліть його, видаливши модуль Magisk / з використання TWRP Vanced uninstaller. - Щоб встановити Vanced, ви ПОВИННІ вимкнути оптимізацію MIUI у налаштуваннях розробника. (Ви можете ігнорувати це попередження якщо ви використовуєте 20.2.20 або новіші xiaomi.eu ROM) - Оптимізацію MIUI увімкнено! - Будь ласка, НЕ завершуйте роботу додатку під час цього процесу! - Завантажити заново - Переконайтеся, що ви завантажили додаток з vancedapp.com, Vanced Discord сервер або Vanced GitHub + Щоб встановити Vanced, ви ПОВИННІ вимкнути оптимізацію MIUI у налаштуваннях розробника. (Ви можете ігнорувати це попередження якщо ви використовуєте 20.2.20 або новіші xiaomi.eu ROM) + Оптимізацію MIUI увімкнено! + Будь ласка, НЕ завершуйте роботу додатку під час цього процесу! + Завантажити заново + Переконайтеся, що ви завантажили додаток з vancedapp.com, Vanced Discord сервер або Vanced GitHub Версія - Привіт! + Привіт! - Виберіть бажану мову(и) для Vanced - Найновіша + Виберіть бажану мову(и) для Vanced + Найновіша Світла + %1$s Оберіть принаймні одну мову! - Чорний - Темний + Чорний + Темний - Розробники Менеджера - Інші учасники - Джерела - Команда Vanced + Розробники Менеджера + Інші учасники + Джерела + Команда Vanced - Не вдалося створити файл APK системного власника програми, будь ласка, повторіть спробу. - Помилка Завантаження %1$s + Не вдалося створити файл APK системного власника програми, будь ласка, повторіть спробу. + Помилка Завантаження %1$s Не вдалося застосувати новий другорядний колір - Не вдалося видалити пакет %1$s - Не вдалося знайти необхідні файли для встановлення. Повторно завантажте файли і спробуйте ще раз. - Не вдалося знайти apk-файл для чорної/темної теми зі сховища, спробуйте ще раз. - Встановлення не вдалося, оскільки користувач перервав встановлення. - Встановлення не вдалася, так як додаток конфліктує з уже встановленим додатком. Видаліть поточну версію додатку, і спробуйте ще раз. - Встановлення не вдалася, так як користувач спробував знизити версію програми. Видаліть поновлення звичайного додатку YouTube, спробуйте ще раз. - Не вдалося встановити з невідомих причин, підключіться до нашої Telegram групи або Discord сервера для подальшої підтримки. Будь ласка, додайте знімок екрану з розширеного меню - Помилка встановлення, оскільки файл несумісний з вашим пристроєм. Очистіть завантажені файли в Налаштуваннях, а потім спробуйте ще раз. - Встановлення неможливе, оскільки apk-файли пошкоджені, будь ласка, спробуйте ще раз. - Помилка встановлення, оскільки увімкнена оптимізація MIUI. Вимкніть оптимізацію MIUI і спробуйте ще раз. - Помилка встановлення, оскільки увімкнено перевірку підпису apk. Вимкніть перевірку підпису apk, а потім спробуйте ще раз. - Помилка встановлення, так як на пристрої недостатньо вільного місця. - Не вдалося знайти apk-файл для чорної/темної теми в програмі встановлення. Видаліть дані додатка з Менеджера і спробуйте ще раз. - Не вдалося знайти типовий шлях встановлення YouTube після роздільного встановлення. + Не вдалося видалити пакет %1$s + Не вдалося знайти необхідні файли для встановлення. Повторно завантажте файли і спробуйте ще раз. + Не вдалося знайти apk-файл для чорної/темної теми зі сховища, спробуйте ще раз. + Встановлення не вдалося, оскільки користувач перервав встановлення. + Встановлення не вдалася, так як додаток конфліктує з уже встановленим додатком. Видаліть поточну версію додатку, і спробуйте ще раз. + Встановлення не вдалася, так як користувач спробував знизити версію програми. Видаліть поновлення звичайного додатку YouTube, спробуйте ще раз. + Не вдалося встановити з невідомих причин, підключіться до нашої Telegram групи або Discord сервера для подальшої підтримки. Будь ласка, додайте знімок екрану з розширеного меню + Помилка встановлення, оскільки файл несумісний з вашим пристроєм. Очистіть завантажені файли в Налаштуваннях, а потім спробуйте ще раз. + Встановлення неможливе, оскільки apk-файли пошкоджені, будь ласка, спробуйте ще раз. + Помилка встановлення, оскільки увімкнена оптимізація MIUI. Вимкніть оптимізацію MIUI і спробуйте ще раз. + Помилка встановлення, оскільки увімкнено перевірку підпису apk. Вимкніть перевірку підпису apk, а потім спробуйте ще раз. + Помилка встановлення, так як на пристрої недостатньо вільного місця. + Не вдалося знайти apk-файл для чорної/темної теми в програмі встановлення. Видаліть дані додатка з Менеджера і спробуйте ще раз. + Не вдалося знайти типовий шлях встановлення YouTube після роздільного встановлення. diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml deleted file mode 100644 index cd627ed4a2..0000000000 --- a/app/src/main/res/values-v23/themes.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 7b02be3fce..a4bf461657 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -1,120 +1,120 @@ - Hủy - Đóng - GMS Nhúng đã được tuỳ chỉnh cho Vanced dựa trên Dự án microG. - Một ứng dụng YouTube đã được sửa đổi với nhiều tính năng hữu ích! - Vanced, nhưng cho YouTube Music! Khá ít tính năng nhưng đáp ứng được nhu cầu của bạn. - Đặt lại - Lưu - Chọn ứng dụng của bạn + Hủy + Đóng + GMS Nhúng đã được tuỳ chỉnh cho Vanced dựa trên Dự án microG. + Một ứng dụng YouTube đã được sửa đổi với nhiều tính năng hữu ích! + Vanced, nhưng cho YouTube Music! Khá ít tính năng nhưng đáp ứng được nhu cầu của bạn. + Đặt lại + Lưu + Chọn ứng dụng của bạn - Giới thiệu - Hướng dẫn - Manager - Nhật ký - Cài đặt - Cập nhật Manager + Giới thiệu + Hướng dẫn + Manager + Nhật ký + Cài đặt + Cập nhật Manager - Thiết Bị Của Bạn Đã Được Root? - Cấp quyền root - Bắt đầu - Chọn ít nhất một ứng dụng! - Bạn không biết đây là gì hoặc không muốn sử dụng phiên bản root? hãy nhấp vào dấu > bên dưới! + Thiết Bị Của Bạn Đã Được Root? + Cấp quyền root + Bắt đầu + Chọn ít nhất một ứng dụng! + Bạn không biết đây là gì hoặc không muốn sử dụng phiên bản root? hãy nhấp vào dấu > bên dưới! - Thông tin về %1$s - Tải xuống - Thông tin - Mở - Cài đặt lại - Gỡ cài đặt - Cập nhật - Các ứng dụng - Các thay đổi - Đang tải xuống %1$s - Cài đặt + Thông tin về %1$s + Tải xuống + Thông tin + Mở + Cài đặt lại + Gỡ cài đặt + Cập nhật + Các ứng dụng + Các thay đổi + Đang tải xuống %1$s + Cài đặt Mới nhất: - Bạn phải cài Vanced microG trước + Bạn phải cài Vanced microG trước Quyền root không được cấp - Mạng xã hội - Hỗ trợ chúng tôi - Chưa cài + Mạng xã hội + Hỗ trợ chúng tôi + Chưa cài Đã cài đặt: - Màu chủ đạo - Giao diện - Ứng dụng - Xóa các tệp tin đã tải về - Xóa các tệp tin thành công - Cho phép chúng tôi thu thập thông tin về hiệu suất và sự cố của ứng dụng - Firebase Analytics - Ngôn ngữ - Các liên kết sẽ mở trong Chrome Custom Tabs - Sử dụng Chrome Custom Tabs - Thông báo cho %1$s - Nhận thông báo khi một bản cập nhật của %1$s được phát hành - Lưu giá trị thời gian mới thất bại - Thời gian ngủ của tập lệnh root - Điều chỉnh giá trị thời gian ngủ được sử dụng trong tập lệnh /data/adb/service.d/app.sh, hữu ích khi khắc phục các vấn đề về mounting - Mặc định hệ thống - Nền - Nền tối - Nền sáng - Cập nhật Manager - Không có cập nhật mới - Phiên bản + Màu chủ đạo + Giao diện + Ứng dụng + Xóa các tệp tin đã tải về + Xóa các tệp tin thành công + Cho phép chúng tôi thu thập thông tin về hiệu suất và sự cố của ứng dụng + Firebase Analytics + Ngôn ngữ + Các liên kết sẽ mở trong Chrome Custom Tabs + Sử dụng Chrome Custom Tabs + Thông báo cho %1$s + Nhận thông báo khi một bản cập nhật của %1$s được phát hành + Lưu giá trị thời gian mới thất bại + Thời gian ngủ của tập lệnh root + Điều chỉnh giá trị thời gian ngủ được sử dụng trong tập lệnh /data/adb/service.d/app.sh, hữu ích khi khắc phục các vấn đề về mounting + Mặc định hệ thống + Nền + Nền tối + Nền sáng + Cập nhật Manager + Không có cập nhật mới + Phiên bản - Lưu nhật ký thất bại - Lưu nhật ký thành công + Lưu nhật ký thất bại + Lưu nhật ký thành công Chi tiết - Phát hiện tệp cài đặt của %1$s! - Manager đã tìm thấy tất cả các tệp cần thiết để cài đặt %1$s. Bạn có muốn cài đặt nó không? + Phát hiện tệp cài đặt của %1$s! + Manager đã tìm thấy tất cả các tệp cần thiết để cài đặt %1$s. Bạn có muốn cài đặt nó không? %1$s Tùy biến Cài đặt - Đang kiểm tra cập nhật… + Đang kiểm tra cập nhật… Ngôn ngữ: %1$s Nền: %1$s Phiên bản: %1$s - Lỗi - Hướng dẫn - Khoan đã! + Lỗi + Hướng dẫn + Khoan đã! Bạn đang sử dụng phiên bản Magisk/TWRP của Vanced, hiện đã bị ngừng phát triển và không thể được cập nhập bằng ứng dụng này. Hãy gỡ mô-đun Magisk/flash trình gỡ cài đặt TWRP. - Để cài Vanced, bạn PHẢI vô hiệu hóa Tối ưu hóa MIUI trong cài đặt nhà phát triển. (Bỏ qua cảnh báo này nếu bạn đang sử dụng ROM dựa trên xiaomi.eu phiên bản 20.2.20 hoặc mới hơn) - Tối ưu hoá MIUI đang được kích hoạt! - Vui lòng KHÔNG thoát khỏi ứng dụng trong tiến trình này! - Tải lại - Chắc chắn rằng bạn đã tải ứng dụng này từ vancedapp.com, server Discord của Vanced hoặc GitHub của Vanced + Để cài Vanced, bạn PHẢI vô hiệu hóa Tối ưu hóa MIUI trong cài đặt nhà phát triển. (Bỏ qua cảnh báo này nếu bạn đang sử dụng ROM dựa trên xiaomi.eu phiên bản 20.2.20 hoặc mới hơn) + Tối ưu hoá MIUI đang được kích hoạt! + Vui lòng KHÔNG thoát khỏi ứng dụng trong tiến trình này! + Tải lại + Chắc chắn rằng bạn đã tải ứng dụng này từ vancedapp.com, server Discord của Vanced hoặc GitHub của Vanced Phiên bản - Chào mừng + Chào mừng - Chọn ngôn ngữ mong muốn cho Vanced - Mới nhất + Chọn ngôn ngữ mong muốn cho Vanced + Mới nhất Sáng + %1$s Chọn ít nhất một ngôn ngữ! - Đen - Tối + Đen + Tối - Đội ngũ phát triển - Những người đóng góp khác - Nguồn - Đội ngũ Vanced + Đội ngũ phát triển + Những người đóng góp khác + Nguồn + Đội ngũ Vanced - Thay đổi quyền sở hữu APK cho chủ hệ thống thất bại, vui lòng thử lại. - Lỗi khi tải xuống %1$s + Thay đổi quyền sở hữu APK cho chủ hệ thống thất bại, vui lòng thử lại. + Lỗi khi tải xuống %1$s Áp dụng màu chủ đạo mới thất bại - Gỡ cài đặt %1$s thất bại - Không thể xác định các tệp tin cần thiết để cài đặt. Tải lại các tệp cài đặt rồi thử lại. - Xác định tệp tin apk cho nền đen/tối từ bộ nhớ thất bại, vui lòng thử lại. - Cài đặt thất bại do người dùng hủy. - Cài đặt thất bại do có xung đột với ứng dụng đã được cài đặt trước đó. Gỡ cài đặt phiên bản hiện tại của ứng dụng rồi thử lại. - Cài đặt thất bại do người dùng cố hạ cấp ứng dụng. Gỡ cài đặt các bản cập nhật khỏi ứng dụng gốc rồi thử lại. - Cài đặt thất bại do lí do không xác định, tham gia Telegram hoặc Discord để được hỗ trợ. Vui lòng kèm theo ảnh chụp màn hình từ phần Chi tiết - Cài đặt thất bại do tệp tin cài đặt không tương thích với thiết bị của bạn. Xóa các tệp tin đã tải về trong Cài đặt rồi thử lại. - Cài đặt thất bại do các tệp tin apk bị lỗi, xin hãy thử lại. - Cài đặt thất bại do Tối ưu hóa MIUI được kích hoạt. Vô hiệu hóa Tối ưu hóa MIUI rồi thử lại. - Cài đặt thất bại do xác minh chứng chỉ apk được kích hoạt. Vô hiệu hóa xác minh chứng chỉ apk rồi thử lại. - Cài đặt thất bại do thiết bị của bạn không có đủ bộ nhớ trống. - Tìm kiếm tệp tin apk cho nền đen/tối từ trình cài đặt thất bại. Xoá dữ liệu của Manager rồi thử lại. - Không thể xác định thư mục cài đặt của YouTube gốc sau khi tải split. + Gỡ cài đặt %1$s thất bại + Không thể xác định các tệp tin cần thiết để cài đặt. Tải lại các tệp cài đặt rồi thử lại. + Xác định tệp tin apk cho nền đen/tối từ bộ nhớ thất bại, vui lòng thử lại. + Cài đặt thất bại do người dùng hủy. + Cài đặt thất bại do có xung đột với ứng dụng đã được cài đặt trước đó. Gỡ cài đặt phiên bản hiện tại của ứng dụng rồi thử lại. + Cài đặt thất bại do người dùng cố hạ cấp ứng dụng. Gỡ cài đặt các bản cập nhật khỏi ứng dụng gốc rồi thử lại. + Cài đặt thất bại do lí do không xác định, tham gia Telegram hoặc Discord để được hỗ trợ. Vui lòng kèm theo ảnh chụp màn hình từ phần Chi tiết + Cài đặt thất bại do tệp tin cài đặt không tương thích với thiết bị của bạn. Xóa các tệp tin đã tải về trong Cài đặt rồi thử lại. + Cài đặt thất bại do các tệp tin apk bị lỗi, xin hãy thử lại. + Cài đặt thất bại do Tối ưu hóa MIUI được kích hoạt. Vô hiệu hóa Tối ưu hóa MIUI rồi thử lại. + Cài đặt thất bại do xác minh chứng chỉ apk được kích hoạt. Vô hiệu hóa xác minh chứng chỉ apk rồi thử lại. + Cài đặt thất bại do thiết bị của bạn không có đủ bộ nhớ trống. + Tìm kiếm tệp tin apk cho nền đen/tối từ trình cài đặt thất bại. Xoá dữ liệu của Manager rồi thử lại. + Không thể xác định thư mục cài đặt của YouTube gốc sau khi tải split. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 49ef31c7a5..a1953c5735 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,120 +1,120 @@ - 取消 - 关闭 - 以 microG 项目为基础並只用于 Vanced 的自定义 Google 移动服务。 - 经过修改的 YouTube 客户端,具有许多有用的功能! - Vanced ,不过是 YouTube Music !功能相对较少,但足以满足您的需求。 - 重置 - 保存 - 选择您的应用 + 取消 + 关闭 + 以 microG 项目为基础並只用于 Vanced 的自定义 Google 移动服务。 + 经过修改的 YouTube 客户端,具有许多有用的功能! + Vanced ,不过是 YouTube Music !功能相对较少,但足以满足您的需求。 + 重置 + 保存 + 选择您的应用 - 关于 - 指南 - Manager - 日志 - 设置 - 更新 Manager + 关于 + 指南 + Manager + 日志 + 设置 + 更新 Manager - 您的设备是否拥有 Root 权限? - 授予 Root 权限 - 让我们开始吧 - 选择至少一个应用! - 不知道这是什么或不想使用 Root 版本?只需点击下面的蓝色箭头! + 您的设备是否拥有 Root 权限? + 授予 Root 权限 + 让我们开始吧 + 选择至少一个应用! + 不知道这是什么或不想使用 Root 版本?只需点击下面的蓝色箭头! - 关于 %1$s - 下载 - 信息 - 打开 - Reinstall - 卸载 - 更新 - 应用 - 变更日志 - 正在下载 %1$s - 安装 + 关于 %1$s + 下载 + 信息 + 打开 + Reinstall + 卸载 + 更新 + 应用 + 变更日志 + 正在下载 %1$s + 安装 最新: - 请先安装 Vanced microG + 请先安装 Vanced microG 未授予 Root 权限 - 社交媒体 - 支持我们 - 不可用 + 社交媒体 + 支持我们 + 不可用 已安装: - 强调色 - 外观 - 行为 - 清除已下载文件 - 成功清除文件 - 这允许我们收集有关应用性能和崩溃日志的信息 - Firebase 分析 - 语言 - 链接会使用 Chrome Custom Tabs 打开 - 使用 Chrome Custom Tabs - %1$s 推送通知 - %1$s 有可用更新时接收推送通知 - 保存新定时器值失败 - Root 脚本睡眠定时器 - 调整 /data/adb/service.d/app.sh 脚本中的睡眠定时器值,有助于修复挂载问题。 - 系统默认 - 主题 - 深色主题 - 浅色主题 - Manager 更新中心 - 无可用更新 - 版本 + 强调色 + 外观 + 行为 + 清除已下载文件 + 成功清除文件 + 这允许我们收集有关应用性能和崩溃日志的信息 + Firebase 分析 + 语言 + 链接会使用 Chrome Custom Tabs 打开 + 使用 Chrome Custom Tabs + %1$s 推送通知 + %1$s 有可用更新时接收推送通知 + 保存新定时器值失败 + Root 脚本睡眠定时器 + 调整 /data/adb/service.d/app.sh 脚本中的睡眠定时器值,有助于修复挂载问题。 + 系统默认 + 主题 + 深色主题 + 浅色主题 + Manager 更新中心 + 无可用更新 + 版本 - 无法保存日志 - 日志保存成功 + 无法保存日志 + 日志保存成功 详细信息 - 检测到 %1$s 安装文件! - Manager 检测到 %1$s 所需要的安装文件。您想现在安装吗? + 检测到 %1$s 安装文件! + Manager 检测到 %1$s 所需要的安装文件。您想现在安装吗? %1$s 安装首选设定 - 正在检查更新… + 正在检查更新… 语言: %1$s 主题: %1$s 版本: %1$s - 错误 - 说明 - 警告! + 错误 + 说明 + 警告! 您正在使用 Magisk/TWRP 版的 Vanced,它已被停止支持且无法通过此应用更新。请通过移除 Magisk 模块 / 使用 TWRP Vanced 卸载器来移除它。 - 为了能够安装 Vanced,您必须在开发者设置中禁用 MIUI 优化。(如果您正在使用基于 xiaomi.eu 20.2.20 或更新的 ROM,您可以忽略此警告) - MIUI 优化已启用! - 请不要在此过程中退出应用! - 重新下载 - 请确保您是从 vancedapp.com 、 Vanced Discord 服务器或 Vanced Github 下载本应用 + 为了能够安装 Vanced,您必须在开发者设置中禁用 MIUI 优化。(如果您正在使用基于 xiaomi.eu 20.2.20 或更新的 ROM,您可以忽略此警告) + MIUI 优化已启用! + 请不要在此过程中退出应用! + 重新下载 + 请确保您是从 vancedapp.com 、 Vanced Discord 服务器或 Vanced Github 下载本应用 版本 - 欢迎 + 欢迎 - 为 Vanced 选择您的首选语言 - 最新 + 为 Vanced 选择您的首选语言 + 最新 浅色 + %1$s 选择至少一种语言! - 黑色 - 深色 + 黑色 + 深色 - Manager 开发人员 - 其它贡献者: - 源码 - Vanced 团队 + Manager 开发人员 + 其它贡献者: + 源码 + Vanced 团队 - 无法 `chown` apk 为系统拥有者,请重试。 - %1$s 下载错误 + 无法 `chown` apk 为系统拥有者,请重试。 + %1$s 下载错误 无法应用新的强调色 - %1$s 卸载失败 - 无法找到需要安装的文件。重新下载安装文件,然后重试。 - 无法从存储中找到黑色/深色主题的 apk 文件,请重试。 - 用户放弃安装导致安装失败。 - 应用与已安装的应用发生冲突导致安装失败。卸载当前的版本,然后重试。 - 用户试图降级应用导致安装失败。卸载官方应用的更新,然后重试。 - 未知原因导致安装失败,请加入我们的 Telegram 或 Discord 并附上高级设置中的截图以获得更多支援。 - 安装文件与您的设备不相容导致安装失败。请在设置中清除已下载的文件,然后重试。 - apk 文件已被损坏导致安装失败,请重试。 - MIUI 优化已被启用导致安装失败。禁用 MIUI 优化,然后重试。 - apk 签名验证已被启用导致安装失败。禁用apk 签名验证,然后重试。 - 设备的可用空间不足导致安装失败。 - 无法从安装程式中找到黑色/深色主题的 apk 文件。清除 Manager 的应用数据,然后重试。 - 分包安装后无法定位原生 YouTube 的安装路径。 + %1$s 卸载失败 + 无法找到需要安装的文件。重新下载安装文件,然后重试。 + 无法从存储中找到黑色/深色主题的 apk 文件,请重试。 + 用户放弃安装导致安装失败。 + 应用与已安装的应用发生冲突导致安装失败。卸载当前的版本,然后重试。 + 用户试图降级应用导致安装失败。卸载官方应用的更新,然后重试。 + 未知原因导致安装失败,请加入我们的 Telegram 或 Discord 并附上高级设置中的截图以获得更多支援。 + 安装文件与您的设备不相容导致安装失败。请在设置中清除已下载的文件,然后重试。 + apk 文件已被损坏导致安装失败,请重试。 + MIUI 优化已被启用导致安装失败。禁用 MIUI 优化,然后重试。 + apk 签名验证已被启用导致安装失败。禁用apk 签名验证,然后重试。 + 设备的可用空间不足导致安装失败。 + 无法从安装程式中找到黑色/深色主题的 apk 文件。清除 Manager 的应用数据,然后重试。 + 分包安装后无法定位原生 YouTube 的安装路径。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8acf799491..3a046b75d5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,120 +1,120 @@ - 取消 - 關閉 - 以 microG 項目為基礎並用於 Vanced 的 GMS 工具。 - 經過修改而具有許多有用功能的 YouTube 客戶端! - Vanced ,不過是 YouTube Music!功能相對較少但足以滿足您的需要。 - 重設 - 儲存 - 選擇您需要的應用程式 + 取消 + 關閉 + 以 microG 項目為基礎並用於 Vanced 的 GMS 工具。 + 經過修改而具有許多有用功能的 YouTube 客戶端! + Vanced ,不過是 YouTube Music!功能相對較少但足以滿足您的需要。 + 重設 + 儲存 + 選擇您需要的應用程式 - 關於 - 說明 - Manager - 日誌 - 設定 - 更新 Manager + 關於 + 說明 + Manager + 日誌 + 設定 + 更新 Manager - 您的裝置擁有 Root 權限嗎? - 授予 Root 權限 - 讓我們開始吧 - 請至少選擇一個應用程式! - 不知道這是什麼,或者不想使用 Root 版本?只需點選下面的藍色箭頭! + 您的裝置擁有 Root 權限嗎? + 授予 Root 權限 + 讓我們開始吧 + 請至少選擇一個應用程式! + 不知道這是什麼,或者不想使用 Root 版本?只需點選下面的藍色箭頭! - 關於 %1$s - 下載 - 關於 - 啟動 - 重新安裝 - 解除安裝 - 更新 - 應用程式 - 更新日誌 - 正在下載 %1$s - 安裝 + 關於 %1$s + 下載 + 關於 + 啟動 + 重新安裝 + 解除安裝 + 更新 + 應用程式 + 更新日誌 + 正在下載 %1$s + 安裝 最新: - 請先安裝 Vanced microG + 請先安裝 Vanced microG 未授予 Root 權限 - 社交媒體 - 支持我們 - 無法使用 + 社交媒體 + 支持我們 + 無法使用 已安裝: - 輔色 - 外觀 - 行為 - 清除已下載的檔案 - 成功清除檔案 - 這讓我們可以收集關於應用程式效能和崩潰日誌的資訊 - Firebase 分析 - 語言 - 連結會使用 Chrome Custom Tabs 開啟 - 使用 Chrome Custom Tabs - %1$s 推送通知 - 有可用更新時接收 %1$s 推送通知 - 儲存定時器時間失敗 - Root 腳本休眠時間 - 調整 /data/adb/service.d/app.sh 指令碼中的休眠時間值,對修復掛載問題很有用 - 系統預設 - 主題 - 深色主題 - 淺色主題 - Manager 更新中心 - 沒有更新 - 版本 + 輔色 + 外觀 + 行為 + 清除已下載的檔案 + 成功清除檔案 + 這讓我們可以收集關於應用程式效能和崩潰日誌的資訊 + Firebase 分析 + 語言 + 連結會使用 Chrome Custom Tabs 開啟 + 使用 Chrome Custom Tabs + %1$s 推送通知 + 有可用更新時接收 %1$s 推送通知 + 儲存定時器時間失敗 + Root 腳本休眠時間 + 調整 /data/adb/service.d/app.sh 指令碼中的休眠時間值,對修復掛載問題很有用 + 系統預設 + 主題 + 深色主題 + 淺色主題 + Manager 更新中心 + 沒有更新 + 版本 - 無法儲存日誌 - 日誌成功儲存 + 無法儲存日誌 + 日誌成功儲存 詳細資訊 - 偵測到 %1$s 的安裝檔案! - Manager 找到所有 %1$s 所需的安裝檔案。您打算安裝嗎? + 偵測到 %1$s 的安裝檔案! + Manager 找到所有 %1$s 所需的安裝檔案。您打算安裝嗎? %1$s 安裝偏好設定 - 正在檢查更新… + 正在檢查更新… 語言:%1$s 主題: %1$s 版本: %1$s - 錯誤 - 說明 - 警告! + 錯誤 + 說明 + 警告! 您正使用 Magisk/TWRP 版本的 Vanced ,它已停止支援並無法透過此程式更新。請透過移除 Magisk 模組/使用 TWRP Vanced 解除安裝程式來移除它。 - 欲安裝 Vanced,請先至開發人員選項停用 MIUI 優化。(若您正在使用 20.2.20 或更新版本且基於的 xiaomi.eu 的系統,請忽略此警告) - 已啟用 MIUI 優化! - 在此過程中請不要退出應用程式! - 重新下載 - 請確保您從 vancedapp.com、Vanced Discord 伺服器或 Vanced GitHub 下載本程式 + 欲安裝 Vanced,請先至開發人員選項停用 MIUI 優化。(若您正在使用 20.2.20 或更新版本且基於的 xiaomi.eu 的系統,請忽略此警告) + 已啟用 MIUI 優化! + 在此過程中請不要退出應用程式! + 重新下載 + 請確保您從 vancedapp.com、Vanced Discord 伺服器或 Vanced GitHub 下載本程式 版本 - 歡迎 + 歡迎 - 為 Vanced 選擇您偏好的語言 - 最新 + 為 Vanced 選擇您偏好的語言 + 最新 淺色 + %1$s 請至少選擇一種語言! - 黑色 - 深色 + 黑色 + 深色 - Manager 開發者 - 其他貢獻者: - 原始碼 - Vanced 團隊 + Manager 開發者 + 其他貢獻者: + 原始碼 + Vanced 團隊 - 無法 `chown` apk 為系統擁有者,請重試。 - %1$s 下載錯誤 + 無法 `chown` apk 為系統擁有者,請重試。 + %1$s 下載錯誤 無法套用新的輔色 - %1$s 解除安裝失敗 - 無法找到安裝所需的檔案。請重新下載安裝檔案,然後再試。 - 無法在儲存空間中找到深色/黑色主題的 apk 檔案,請再試。 - 使用者放棄安裝導致安裝失敗。 - 程式與已安裝的程式發生衝突導致安裝失敗。解除安裝當前的版本,然後重試。 - 使用者試圖降級導致安裝失敗。解除安裝原生應用程式的更新,然後重試。 - 未知原因導致安裝失敗,請附上進階設定的截圖至我們的 Telegram 或 Discord 取得更多支援 - 安裝檔案與您的裝置不相容導致安裝失敗。請在設定中清除已下載的檔案,然後重試。 - apk 檔案已被損毀導致安裝失敗,請重試。 - MIUI 優化已被啟用導致安裝失敗。停用 MIUI 優化,然後重試。 - apk 簽名驗證已被啟用導致安裝失敗。停用 apk 簽名驗證,然後重試。 - 裝置的可用空間不足導致安裝失敗。 - 在安裝程式中找不到深色/黑色主題的 apk 檔案。請清除 Manager 應用程式的資料,然後再試。 - 分割安裝後無法找到原生 YouTube 安裝路徑。 + %1$s 解除安裝失敗 + 無法找到安裝所需的檔案。請重新下載安裝檔案,然後再試。 + 無法在儲存空間中找到深色/黑色主題的 apk 檔案,請再試。 + 使用者放棄安裝導致安裝失敗。 + 程式與已安裝的程式發生衝突導致安裝失敗。解除安裝當前的版本,然後重試。 + 使用者試圖降級導致安裝失敗。解除安裝原生應用程式的更新,然後重試。 + 未知原因導致安裝失敗,請附上進階設定的截圖至我們的 Telegram 或 Discord 取得更多支援 + 安裝檔案與您的裝置不相容導致安裝失敗。請在設定中清除已下載的檔案,然後重試。 + apk 檔案已被損毀導致安裝失敗,請重試。 + MIUI 優化已被啟用導致安裝失敗。停用 MIUI 優化,然後重試。 + apk 簽名驗證已被啟用導致安裝失敗。停用 apk 簽名驗證,然後重試。 + 裝置的可用空間不足導致安裝失敗。 + 在安裝程式中找不到深色/黑色主題的 apk 檔案。請清除 Manager 應用程式的資料,然後再試。 + 分割安裝後無法找到原生 YouTube 安裝路徑。 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9a61311a23..90e84d1c38 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,10 +9,7 @@ #FF4500 #17191A - #5F5E5E - #ffffff - #000000 - #cfcfcf + #f7f7f7 diff --git a/app/src/main/res/values/resources.xml b/app/src/main/res/values/resources.xml index c651662380..39812c561e 100644 --- a/app/src/main/res/values/resources.xml +++ b/app/src/main/res/values/resources.xml @@ -2,18 +2,9 @@ Vanced Manager - YouTube Vanced - Vanced microG - YouTube Music Vanced - nonroot - - Xinto (Main stuff)\nKoopah (Shell God)\nAioiLight (GitHub)\nLogan (UI) - xfileFIN\nKevinX8\nZaneZam\nLaura Almeida - bhatVikrant (Website)\nbawm (Sponsorblock) - GPL - - - use_custom_tabs + YouTube Vanced + YouTube Music Vanced + Vanced microG diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml old mode 100755 new mode 100644 index e7130d408b..e95a8e7fd7 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,134 +1,166 @@ - - Cancel - Close - A custom GMS Implementation for Vanced based on the microG Project. - A modified YouTube client with many useful features! - Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. - Reset - Save - Select Your Apps - - - About - Guide - Manager - Logs - Settings - Update Manager + + DPT - Is Your Device Rooted? - Grant Root Permission - Let\'s get started - Select at least one app! - Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + A custom GMS Implementation for Vanced based on the microG Project. + A modified YouTube client with many useful features! + Vanced, but for YouTube Music! Relatively less feature-rich but fulfills your needs. + Is Your Device Rooted? + Grant Root Permission + Let\'s get started + Don\'t know what this is or don\'t want to use the root version? just click the blue arrow below! + Select Your Apps + Select at least one app! - About %1$s - Download - Info - Launch - Reinstall - Uninstall - Update - Apps - Changelog - Downloading %1$s - Install - Latest: - Install Vanced microG first + Apps + Social Media + Support us Root access not granted - Social Media - Support us - Unavailable - Installed: - - - Accent Color - Appearance - Behavior - Clear downloaded files - Successfully cleared files - This lets us collect information about app performance and crash logs - Firebase Analytics - Language - Links will open in Chrome Custom Tabs - Use Chrome Custom Tabs - %1$s Push Notifications - Receive push notifications when an update for %1$s is released - Failed to save new time value - Root Script Sleep Time - Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues - System Default - Theme - Dark Theme - Light Theme - Manager Update Center - No new updates - Channel URL - Variant - - - Could not save logs - Successfully saved logs - - - Details - %1$s installation files detected! - Manager detected that all necessary files for %1$s installation were found. Do you want to install it? - %1$s Installation Preferences - Checking for updates… - Language(s): %1$s - Theme: %1$s - Version: %1$s - Error - Guide - Stop! - You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the Magisk module/using TWRP Vanced uninstaller. - To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) - MIUI Optimizations are enabled! - Please do NOT exit the app during this process! - Are you sure you want to uninstall %1$s ? - Uninstall - Redownload - Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub - Version - Welcome - - - Choose your preferred language(s) for Vanced - Latest - Light + %1$s - Select at least one language! - Black - Dark + + + Appearance + Behaviour + System Default + Accent Color + Clear downloaded files + Successfully cleared files + This lets us collect information about app performance and crash logs + Firebase Analytics + Language + Receive push notifications when an update for %1$s is released + %1$s Push Notifications + Failed to save new time value + Adjust sleep time value used in /data/adb/service.d/app.sh script, useful for fixing mounting issues + Root Script Sleep Time + Dark Theme + Light Theme + Theme + Links will open in Chrome Custom Tabs + Use Chrome Custom Tabs + Variant + + + Base download URL - Manager Devs - Other Contributors - Sources - Vanced Team - - - Failed to `chown` APK to system owner, please try again. - Error Downloading %1$s - Failed to apply new accent color - Failed to uninstall package %1$s - Failed to locate the required files for installation. Re-download the installation files, then try again. - Failed to locate apk file for black/dark theme from storage, please try again. - Installation failed because the user aborted the installation. - Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. - Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. - Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu - Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. - Installation failed because the apk files are corrupted, please try again. - Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. - Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. - Installation failed because the device doesn\'t have enough free space. - Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. - Failed to locate the stock YouTube installation path after split installation. + Manager Devs + Other Contributors + Vanced Team + Sources + Source Code + License + + + Successfully saved logs + Could not save logs + + + Cancel + Close + Reset + Save + Stop! + + + About + Guide + Manager + Logs + Settings + Install + Configuration + Update Manager + + + Unavailable + Install Vanced microG first + Install + Installed: %1$s + Latest: %1$s + Versions + + + Language(s) + Theme + Version + + + Make sure that you downloaded the app from vancedapp.com, the Vanced Discord server, or the Vanced GitHub + Welcome + + + Guide + To install Vanced, you MUST disable MIUI Optimizations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM) + MIUI Optimizations are enabled! + + + Changelog + About %1$s + + + Install + Redownload + Manager detected that all necessary files for %1$s installation were found. Do you want to install it? + %1$s installation files detected! + + + Download + Downloading %1$s + Please do NOT exit the app during this process! + + + Uninstall + Are you sure you want to uninstall %1$s ? + + + Choose your preferred language(s) for %1$s + + + Black + Dark + Choose your preferred theme for %1$s + + + Latest + Choose your preferred version for %1$s + + + Checking for updates… + Manager Update Center + No new updates + + + Download + Info + Launch + Reinstall + Uninstall + Update + + + Details + Error + + + Failed to `chown` APK to system owner, please try again. + Error Downloading %1$s + Failed to uninstall package %1$s + Failed to locate the required files for installation. Re-download the installation files, then try again. + Failed to locate apk file for black/dark theme from storage, please try again. + Installation failed because the user aborted the installation. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the user tried to downgrade the package. Uninstall updates from the stock app, then try again. + Installation failed for unknown reasons, join our Telegram or Discord for further support. Please also attach a screenshot from the Advanced menu + Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again. + Installation failed because the apk files are corrupted, please try again. + Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again. + Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again. + Installation failed because the device doesn\'t have enough free space. + Failed to find apk file for black/dark theme from the installer. Clear app data of Manager, then try again. + Failed to locate the stock YouTube installation path after split installation. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index f5128c197e..0000000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 40d802a17a..6d9f7b7333 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,85 +1,10 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml deleted file mode 100644 index 5315fd6ae4..0000000000 --- a/app/src/main/res/xml-v25/shortcuts.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 3b8338f39e..90bbc909db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,29 +1,21 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { - val kotlinVersion by extra("1.4.32") repositories { google() - jcenter() + mavenCentral() } + val kotlinVersion = "1.6.10" dependencies { - classpath("com.android.tools.build:gradle:4.1.3") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - classpath("com.google.gms:google-services:4.3.5") - classpath("com.google.firebase:perf-plugin:1.3.5") - classpath("com.google.firebase:firebase-crashlytics-gradle:2.5.2") - classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5") - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle.kts files + classpath("com.android.tools.build:gradle:7.1.2") + classpath(kotlin("gradle-plugin", version = kotlinVersion)) + classpath(kotlin("serialization", version = kotlinVersion)) } } allprojects { repositories { google() - jcenter() + mavenCentral() maven(url = "https://jitpack.io") } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 051fc6281d..0000000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - google() - jcenter() - maven(url = "https://jitpack.io") -} \ No newline at end of file diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt deleted file mode 100644 index ce6e1f7ef5..0000000000 --- a/buildSrc/src/main/java/Config.kt +++ /dev/null @@ -1,5 +0,0 @@ -object Config { - - const val kotlinVersion = "1.4.21" - -} \ No newline at end of file diff --git a/core-mvi/.gitignore b/core-mvi/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/core-mvi/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core-mvi/build.gradle.kts b/core-mvi/build.gradle.kts deleted file mode 100644 index c359ea8f9d..0000000000 --- a/core-mvi/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - kotlin("jvm") -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -dependencies { - implementation(kotlin("stdlib")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1") - - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.1") - testImplementation("io.kotest:kotest-runner-junit5:4.3.2") - testImplementation("io.kotest:kotest-assertions-core:4.3.2") - testImplementation("io.kotest:kotest-property:4.3.2") - testImplementation("io.mockk:mockk:1.10.4") -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlow.kt b/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlow.kt deleted file mode 100644 index 2d583ca08d..0000000000 --- a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlow.kt +++ /dev/null @@ -1,98 +0,0 @@ -package com.vanced.manager.core.mvi - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock - -interface MviFlow { - - fun bindView( - view: MviRenderView, - scope: CoroutineScope, - actions: List = listOf() - ) - - fun bindSideEffects( - view: MviRenderView, - scope: CoroutineScope - ) -} - -private class MviFlowImpl( - initialState: State, - private val reducer: Reducer, - private val handler: Handler, - scope: CoroutineScope, -) : MviFlow, - CoroutineScope by scope, - Mutex by Mutex() { - - private val state = MutableStateFlow(initialState) - private val sideEffect = MutableSharedFlow() - - override fun bindSideEffects( - view: MviRenderView, - scope: CoroutineScope - ): Unit = with(scope) { - launch { - sideEffect.collect { view.sideEffects(it) } - } - } - - override fun bindView( - view: MviRenderView, - scope: CoroutineScope, - actions: List - ): Unit = with(scope) { - emitStateForRender(view) - handleActions(view, actions) - } - - private fun CoroutineScope.emitStateForRender( - view: MviRenderView - ) = launch { - state.collect { - view.render(it) - } - } - - private fun CoroutineScope.handleActions( - view: MviRenderView, - actions: List - ) = launch { - view.actionsFlow() - .onStart { emitAll(actions.asFlow()) } - .proceed() - } - - private suspend fun Flow.proceed() = - collect { action -> - handler.invoke( - MutableSharedFlow().subscribeState(), - state.value, action, sideEffect - ) - } - - private fun MutableSharedFlow.subscribeState(): MutableSharedFlow = - also { - onEach { modification -> - withLock { - reducer.invoke(state, state.value, modification) - } - }.launchIn(this@MviFlowImpl) - } -} - -fun MviFlow( - initialState: State, - reducer: Reducer, - handler: Handler, - scope: CoroutineScope -): MviFlow = MviFlowImpl( - initialState = initialState, - reducer = reducer, - handler = handler, - scope = scope -) \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlowStore.kt b/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlowStore.kt deleted file mode 100644 index 0eaa3fd74c..0000000000 --- a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviFlowStore.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.vanced.manager.core.mvi - -interface MviFlowStore { - - val store: MviFlow -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviRenderView.kt b/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviRenderView.kt deleted file mode 100644 index 31a9fb9c22..0000000000 --- a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/MviRenderView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.vanced.manager.core.mvi - -import kotlinx.coroutines.flow.Flow - -interface MviRenderView { - - fun render(state: State) - - fun actionsFlow(): Flow - - fun sideEffects(sideEffect: SideEffect) -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/Typealias.kt b/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/Typealias.kt deleted file mode 100644 index b108ef2a17..0000000000 --- a/core-mvi/src/main/kotlin/com/vanced/manager/core/mvi/Typealias.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.vanced.manager.core.mvi - -import kotlinx.coroutines.flow.MutableSharedFlow - -typealias Handler = - suspend MutableSharedFlow.( - state: State, - action: Action, - sideEffectsFlow: MutableSharedFlow, - ) -> Unit - -typealias Reducer = - suspend MutableSharedFlow.( - state: State, - modification: Modification - ) -> Unit \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/example/ExampleManyStoreFragment.kt b/core-mvi/src/main/kotlin/example/ExampleManyStoreFragment.kt deleted file mode 100644 index 18ae925a1b..0000000000 --- a/core-mvi/src/main/kotlin/example/ExampleManyStoreFragment.kt +++ /dev/null @@ -1,95 +0,0 @@ -package example - -import com.vanced.manager.core.mvi.* -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.launch - -class ExampleManyStoreFragment { - - val lifecycleScope = CoroutineScope(Job()) - - private val view1 = getView() - private val container1 = getStore() - - private val view2 = getView() - private val container2 = getStore() - - private fun onCreate() { - lifecycleScope.launch { // bind view for call render - container1.store.bindView(view = view1, scope = this) - } - lifecycleScope.launch { // bind side effects (single events) for catch on view - container1.store.bindSideEffects(view = view1, scope = this) - } - - lifecycleScope.launch { // bind view for call render - container2.store.bindView(view = view2, scope = this) - } - lifecycleScope.launch { // bind side effects (single events) for catch on view - container2.store.bindSideEffects(view = view2, scope = this) - } - } -} - -// handle actions, generate side effects (single events) and send changes (may be viewModel ane change) -private fun createHandler(): Handler = - { _: State, action: Action, sideEffect: MutableSharedFlow -> - when (action) { - Action.Click -> { - sideEffect.emit(SideEffect.ShowToast("")) - delay(10) - emit(Modification.ChangeText("")) - } - } - } - -// handle modifications and current state and generate new state for view\ -private fun createReducer(): Reducer = { _: State, modification: Modification -> - when (modification) { - is Modification.ChangeText -> { - State.Default - } - } -} - -private fun ExampleManyStoreFragment.getStore() = object : MviFlowStore { - - override val store: MviFlow - get() = MviFlow( - initialState = State.Default, - reducer = createReducer(), - handler = createHandler(), - scope = lifecycleScope - )// create "store" -} - -private fun getView() = - object : MviRenderView { - override fun render(state: State) { - when (state) { - State.Default -> { - // render view - } - } - } - - override fun actionsFlow(): Flow = callbackFlow { - //generate actions click and other - awaitClose() - } - - override fun sideEffects(sideEffect: SideEffect) { - when (sideEffect) { - is SideEffect.ShowToast -> { - // Toast.show - } - } - } - - } \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/example/ExampleStoreFragment.kt b/core-mvi/src/main/kotlin/example/ExampleStoreFragment.kt deleted file mode 100644 index 2f2b24eebb..0000000000 --- a/core-mvi/src/main/kotlin/example/ExampleStoreFragment.kt +++ /dev/null @@ -1,75 +0,0 @@ -package example - -import com.vanced.manager.core.mvi.* -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.callbackFlow - -class ExampleStoreFragment : - MviRenderView, - MviFlowStore { - - private val lifecycleScope = CoroutineScope(Job()) - - // handle actions, generate side effects (single events) and send changes (may be viewModel ane change) - private val handler: Handler = - { _: State, action: Action, sideEffectsFlow: MutableSharedFlow -> - when (action) { - Action.Click -> { - sideEffectsFlow.emit(SideEffect.ShowToast("")) - delay(10) - emit(Modification.ChangeText("")) - } - } - } - - // handle modifications and current state and generate new state for view - private val reducer: Reducer = { _: State, modification: Modification -> - when (modification) { - is Modification.ChangeText -> { - State.Default - } - } - } - - override val store: MviFlow = - MviFlow( - initialState = State.Default, - reducer = reducer, - handler = handler, - scope = lifecycleScope - )// create "store" - - private fun onCreate() { - lifecycleScope.launch { // bind view for call render - store.bindView(view = this@ExampleStoreFragment, scope = this) - } - lifecycleScope.launch { // bind side effects (single events) for catch on view - store.bindSideEffects(view = this@ExampleStoreFragment, scope = this) - } - } - - override fun render(state: State) { - when (state) { - State.Default -> { - // render view - } - } - } - - @ExperimentalCoroutinesApi - override fun actionsFlow(): Flow = callbackFlow { - //generate actions click and other - awaitClose() - } - - override fun sideEffects(sideEffect: SideEffect) { // single events - when (sideEffect) { - is SideEffect.ShowToast -> { - // Toast.show - } - } - } -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/example/ExampleViewModel.kt b/core-mvi/src/main/kotlin/example/ExampleViewModel.kt deleted file mode 100644 index 8666ba0d1d..0000000000 --- a/core-mvi/src/main/kotlin/example/ExampleViewModel.kt +++ /dev/null @@ -1,43 +0,0 @@ -package example - -import com.vanced.manager.core.mvi.Handler -import com.vanced.manager.core.mvi.MviFlow -import com.vanced.manager.core.mvi.MviFlowStore -import com.vanced.manager.core.mvi.Reducer -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableSharedFlow - -class ExampleViewModel : MviFlowStore { - - private val viewModelScope = CoroutineScope(Job()) - - // handle actions, generate side effects (single events) and send changes (may be viewModel ane change) - private val handler: Handler = - { _: State, action: Action, sideEffectsFlow: MutableSharedFlow -> - when (action) { - Action.Click -> { - sideEffectsFlow.emit(SideEffect.ShowToast("")) - delay(10) - emit(Modification.ChangeText("")) - } - } - } - - // handle modifications and current state and generate new state for view - private val reducer: Reducer = { _: State, modification: Modification -> - when (modification) { - is Modification.ChangeText -> { - State.Default - } - } - } - - override val store: MviFlow = MviFlow( - initialState = State.Default, - reducer = reducer, - handler = handler, - scope = viewModelScope - ) // create "store" -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/example/ExampleWithViewModelFragment.kt b/core-mvi/src/main/kotlin/example/ExampleWithViewModelFragment.kt deleted file mode 100644 index 30a70d9848..0000000000 --- a/core-mvi/src/main/kotlin/example/ExampleWithViewModelFragment.kt +++ /dev/null @@ -1,49 +0,0 @@ -package example - -import com.vanced.manager.core.mvi.MviRenderView -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.launch - - -class ExampleWithViewModelFragment : MviRenderView { - - private val lifecycleScope = CoroutineScope(Job()) - - private val viewModel = ExampleViewModel() - - private fun onCreate() { - lifecycleScope.launch { - viewModel.store.bindView(view = this@ExampleWithViewModelFragment, scope = this) - } - lifecycleScope.launch { - viewModel.store.bindSideEffects(view = this@ExampleWithViewModelFragment, scope = this) - } - } - - override fun render(state: State) { - when (state) { - State.Default -> { - // render view - } - } - } - - @ExperimentalCoroutinesApi - override fun actionsFlow(): Flow = callbackFlow { - //generate actions click and other - awaitClose() - } - - override fun sideEffects(sideEffect: SideEffect) { // single events - when (sideEffect) { - is SideEffect.ShowToast -> { - // Toast.show - } - } - } -} \ No newline at end of file diff --git a/core-mvi/src/main/kotlin/example/Mvi.kt b/core-mvi/src/main/kotlin/example/Mvi.kt deleted file mode 100644 index 81f236928f..0000000000 --- a/core-mvi/src/main/kotlin/example/Mvi.kt +++ /dev/null @@ -1,25 +0,0 @@ -package example - -// "single events" -sealed class SideEffect { - - data class ShowToast(val message: String) : SideEffect() -} - -// view state -sealed class State { - - object Default : State() -} - -// view actions -sealed class Action { - - object Click : Action() -} - -// Modification for view -sealed class Modification { - - data class ChangeText(val text: String) : Modification() -} \ No newline at end of file diff --git a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/MviFlowSpec.kt b/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/MviFlowSpec.kt deleted file mode 100644 index 854888c2b3..0000000000 --- a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/MviFlowSpec.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.vanced.manager.core.mvi - -import com.vanced.manager.core.mvi.subject.* -import io.kotest.core.spec.style.ShouldSpec -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.test.TestCoroutineScope - -@ExperimentalCoroutinesApi -class MviFlowSpec : ShouldSpec() { - - data class Test(val msg: String) - - init { - context("Various events") { - should("return Modifications") { - val testData = "testText" - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Tap) - emit(Action.Click) - } - ) - delay(600) - store.modifications shouldBe listOf( - Modification.ChangeDescription(testData), - Modification.ChangeTitle(testData), - Modification.ChangeDescription(testData), - ) - } - should("return States") { - val testData = 4545454545 - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - val view = SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Tap) - emit(Action.Click) - } - ) - delay(600) - view.states shouldBe listOf( - State.Default, - State.SetDescription(testData), - State.Default, - State.SetTitle(testData), - State.Default, - State.SetDescription(testData), - State.Default, - ) - } - should("return SideEffects") { - val testData = Test("test") - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - val view = SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Tap) - emit(Action.Click) - } - ) - delay(600) - view.sideEffects shouldBe listOf( - SideEffect.ShowToast(testData), - SideEffect.ShowToast(testData), - SideEffect.ShowToast(testData), - ) - } - } - - context("The same event") { - should("return Modifications") { - val testData = Test("test") - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Click) - emit(Action.Click) - } - ) - delay(600) - store.modifications shouldBe listOf( - Modification.ChangeDescription(testData), - Modification.ChangeDescription(testData), - Modification.ChangeDescription(testData), - ) - } - should("return States") { - val testData = Test("test") - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - val view = SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Click) - emit(Action.Click) - } - ) - delay(600) - view.states shouldBe listOf( - State.Default, - State.SetDescription(testData), - State.Default, - State.SetDescription(testData), - State.Default, - State.SetDescription(testData), - State.Default - ) - } - should("return SideEffects") { - val testData = Test("test") - val store = SubjectStore( - scope = TestCoroutineScope(), - defaultState = State.Default, - testData = testData - ) - val view = SubjectView( - scope = TestCoroutineScope(), - store = store, - actions = flow { - emit(Action.Click) - emit(Action.Click) - emit(Action.Click) - } - ) - delay(600) - view.sideEffects shouldBe listOf( - SideEffect.ShowToast(testData), - SideEffect.ShowToast(testData), - SideEffect.ShowToast(testData), - ) - } - } - } -} \ No newline at end of file diff --git a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/MviSubject.kt b/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/MviSubject.kt deleted file mode 100644 index aafab30cdd..0000000000 --- a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/MviSubject.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.vanced.manager.core.mvi.subject - -// "single events" -sealed class SideEffect { - - data class ShowToast(val message: testData) : SideEffect() -} - -// view state -sealed class State { - - object Default : State() - - data class SetTitle(val text: testData) : State() - - data class SetDescription(val text: testData) : State() -} - -// view actions -sealed class Action { - - object Click : Action() - - object Tap : Action() -} - -// Modification for view -sealed class Modification { - - data class ChangeTitle(val text: testData) : Modification() - - data class ChangeDescription(val text: testData) : Modification() -} \ No newline at end of file diff --git a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectStore.kt b/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectStore.kt deleted file mode 100644 index 7c0596f69e..0000000000 --- a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectStore.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.vanced.manager.core.mvi.subject - -import com.vanced.manager.core.mvi.Handler -import com.vanced.manager.core.mvi.MviFlow -import com.vanced.manager.core.mvi.MviFlowStore -import com.vanced.manager.core.mvi.Reducer -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.MutableSharedFlow - -class SubjectStore( - scope: CoroutineScope, - defaultState: State, - private val testData: TD -) : MviFlowStore { - - val modifications = mutableListOf() - - private val handler: Handler = - { state: State, action: Action, sideEffectsFlow: MutableSharedFlow -> - when (action) { - Action.Click -> { - emit(Modification.ChangeDescription(testData)) - sideEffectsFlow.emit(SideEffect.ShowToast(testData)) - } - Action.Tap -> { - emit(Modification.ChangeTitle(testData)) - sideEffectsFlow.emit(SideEffect.ShowToast(testData)) - } - } - } - - private val reducer: Reducer = - { state: State, modification: Modification -> - modifications.add(modification) - when (modification) { - is Modification.ChangeDescription<*> -> { - emit(State.SetDescription(modification.text)) - emit(State.Default) - } - is Modification.ChangeTitle<*> -> { - emit(State.SetTitle(modification.text)) - emit(State.Default) - } - } - } - - override val store: MviFlow = - MviFlow( - scope = scope, - initialState = defaultState, - handler = handler, - reducer = reducer - ) -} \ No newline at end of file diff --git a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectView.kt b/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectView.kt deleted file mode 100644 index 7a0dc1d750..0000000000 --- a/core-mvi/src/test/kotlin/com/vanced/manager/core/mvi/subject/SubjectView.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.vanced.manager.core.mvi.subject - -import com.vanced.manager.core.mvi.MviRenderView -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch - -class SubjectView( - scope: CoroutineScope, - private val actions: Flow, - store: SubjectStore -) : MviRenderView { - - val states = mutableListOf() - val sideEffects = mutableListOf() - - init { - scope.launch { - store.store.bindSideEffects( - view = this@SubjectView, - scope = this - ) - } - scope.launch { - store.store.bindView( - view = this@SubjectView, - scope = this - ) - } - } - - override fun render(state: State) { - states.add(state) - } - - @ExperimentalCoroutinesApi - override fun actionsFlow(): Flow = actions - - override fun sideEffects(sideEffect: SideEffect) { - sideEffects.add(sideEffect) - } -} \ No newline at end of file diff --git a/core-presentation/.gitignore b/core-presentation/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/core-presentation/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core-presentation/build.gradle.kts b/core-presentation/build.gradle.kts deleted file mode 100644 index 85d1b3ca34..0000000000 --- a/core-presentation/build.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id("com.android.library") - kotlin("android") -} - -android { - compileSdkVersion(30) - - defaultConfig { - minSdkVersion(16) - targetSdkVersion(30) - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - } - } - -} - -dependencies { - implementation(kotlin("stdlib")) - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.appcompat:appcompat:1.2.0") -} \ No newline at end of file diff --git a/core-presentation/src/main/AndroidManifest.xml b/core-presentation/src/main/AndroidManifest.xml deleted file mode 100644 index f9c138f6c6..0000000000 --- a/core-presentation/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-presentation/src/main/java/com/vanced/manager/core/presentation/BaseViewModel.kt b/core-presentation/src/main/java/com/vanced/manager/core/presentation/BaseViewModel.kt deleted file mode 100644 index 4236db913c..0000000000 --- a/core-presentation/src/main/java/com/vanced/manager/core/presentation/BaseViewModel.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.vanced.manager.core.presentation - -import androidx.lifecycle.ViewModel - -class BaseViewModel : ViewModel() { - //TODO -} \ No newline at end of file diff --git a/core-ui/.gitignore b/core-ui/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/core-ui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts deleted file mode 100644 index 641084e1cd..0000000000 --- a/core-ui/build.gradle.kts +++ /dev/null @@ -1,53 +0,0 @@ -plugins { - id("com.android.library") - kotlin("android") -} - -android { - compileSdkVersion(30) - - defaultConfig { - minSdkVersion(16) - targetSdkVersion(30) - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - - buildFeatures { - viewBinding = true - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - } - } -} - -dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("reflect")) - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.appcompat:appcompat:1.2.0") - implementation("androidx.activity:activity-ktx:1.2.2") - implementation("com.google.android.material:material:1.3.0") - - //https://developer.android.com/jetpack/androidx/releases/lifecycle - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1") -} \ No newline at end of file diff --git a/core-ui/src/main/AndroidManifest.xml b/core-ui/src/main/AndroidManifest.xml deleted file mode 100644 index 55b93fbfb4..0000000000 --- a/core-ui/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingBottomSheetDialogFragment.kt b/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingBottomSheetDialogFragment.kt deleted file mode 100644 index b3ea8d512e..0000000000 --- a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingBottomSheetDialogFragment.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.vanced.manager.core.ui.base - -import android.app.Dialog -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.FrameLayout -import androidx.viewbinding.ViewBinding -import com.google.android.material.bottomsheet.BottomSheetBehavior -import com.google.android.material.bottomsheet.BottomSheetDialog -import com.google.android.material.bottomsheet.BottomSheetDialogFragment - -abstract class BindingBottomSheetDialogFragment : BottomSheetDialogFragment() { - - private var _binding: VB? = null - protected val binding: VB get() = requireNotNull(_binding) - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = binding(inflater, container, savedInstanceState) - otherSetups() - return binding.root - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val dialog = super.onCreateDialog(savedInstanceState) - dialog.setOnShowListener { - val bottomSheetDialogFragment = (it as BottomSheetDialog).findViewById(com.google.android.material.R.id.design_bottom_sheet) - if (bottomSheetDialogFragment != null) { - BottomSheetBehavior.from(bottomSheetDialogFragment).apply { - state = BottomSheetBehavior.STATE_EXPANDED - } - } - } - return dialog - } - - protected abstract fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): VB - - protected open fun otherSetups() = Unit - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingDialogFragment.kt b/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingDialogFragment.kt deleted file mode 100644 index bc3ffa9b97..0000000000 --- a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingDialogFragment.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.vanced.manager.core.ui.base - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.app.AppCompatDialogFragment -import androidx.viewbinding.ViewBinding - -abstract class BindingDialogFragment : AppCompatDialogFragment() { - - private var _binding: VB? = null - protected val binding: VB get() = requireNotNull(_binding) - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = binding(inflater, container, savedInstanceState) - otherSetups() - return binding.root - } - - protected abstract fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): VB - - protected open fun otherSetups() = Unit - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingFragment.kt b/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingFragment.kt deleted file mode 100644 index 3462c79e67..0000000000 --- a/core-ui/src/main/java/com/vanced/manager/core/ui/base/BindingFragment.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.vanced.manager.core.ui.base - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.viewbinding.ViewBinding - -abstract class BindingFragment : Fragment() { - - private var _binding: VB? = null - protected val binding: VB get() = requireNotNull(_binding) - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = binding(inflater, container, savedInstanceState) - otherSetups() - return binding.root - } - - protected abstract fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): VB - - protected open fun otherSetups() = Unit - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt b/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt deleted file mode 100644 index 6dc5d24dd6..0000000000 --- a/core-ui/src/main/java/com/vanced/manager/core/ui/ext/FragmentExt.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.vanced.manager.core.ui.ext - -import android.util.Log -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.Fragment - -fun Fragment.requireSupportFM() = requireActivity().supportFragmentManager - -fun Fragment.showDialog(dialog: D) { - try { - dialog.show(requireSupportFM(), dialog::class.simpleName) - } catch (e: IllegalStateException) { - Log.d("VMUI", "Can not perform this action after onSaveInstanceState") - } - -} \ No newline at end of file diff --git a/feature-home/.gitignore b/feature-home/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/feature-home/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature-home/build.gradle.kts b/feature-home/build.gradle.kts deleted file mode 100644 index af97f019a2..0000000000 --- a/feature-home/build.gradle.kts +++ /dev/null @@ -1,87 +0,0 @@ -plugins { - id("com.android.library") - kotlin("android") -} - -android { - compileSdkVersion(30) - - defaultConfig { - minSdkVersion(16) - targetSdkVersion(30) - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - - buildFeatures { - viewBinding = true - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - } - } - -} - -android.testOptions { - unitTests.all { - it.useJUnitPlatform() - } -} - - -dependencies { - implementation(project(":core-ui")) - implementation(project(":core-presentation")) - implementation(project(":library-network")) - - implementation(kotlin("stdlib")) - implementation("androidx.appcompat:appcompat:1.2.0") - implementation("androidx.core:core-ktx:1.3.2") - implementation("androidx.fragment:fragment-ktx:1.3.3") - implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1") - implementation("com.google.android.material:material:1.3.0") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") - - implementation("com.squareup.retrofit2:retrofit:2.9.0") - - implementation("com.squareup.moshi:moshi-kotlin:1.11.0") - implementation("com.squareup.moshi:moshi-kotlin-codegen:1.11.0") - implementation("com.squareup.moshi:moshi-adapters:1.11.0") - - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - - implementation("org.koin:koin-android:2.2.1") - implementation("org.koin:koin-android-viewmodel:2.2.1") - implementation("org.koin:koin-android-ext:2.2.1") - - testImplementation("io.kotest:kotest-runner-junit5:4.4.3") - testImplementation("io.kotest:kotest-assertions-core:4.4.3") - testImplementation("io.kotest:kotest-property:4.4.3") - testImplementation("io.mockk:mockk:1.10.6") - - androidTestImplementation("io.mockk:mockk-android:1.10.6") - androidTestImplementation("androidx.test:core:1.3.0") - androidTestImplementation("androidx.test:runner:1.3.0") - androidTestImplementation("androidx.test:rules:1.3.0") -} \ No newline at end of file diff --git a/feature-home/src/main/AndroidManifest.xml b/feature-home/src/main/AndroidManifest.xml deleted file mode 100644 index 714a235e5a..0000000000 --- a/feature-home/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/api/AppsApi.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/api/AppsApi.kt deleted file mode 100644 index e483138cf9..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/api/AppsApi.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.vanced.manager.feature.home.data.api - -import com.vanced.manager.feature.home.data.dto.AppInfoDto -import okhttp3.ResponseBody -import retrofit2.http.GET -import retrofit2.http.Url - -interface AppsApi { - - @GET - suspend fun getAppsInfo(@Url url: String): List - - @GET - suspend fun getIcon(@Url url: String): ResponseBody -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppIconDataSource.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppIconDataSource.kt deleted file mode 100644 index 4b3645de64..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppIconDataSource.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.vanced.manager.feature.home.data.datasource - -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import com.vanced.manager.feature.home.data.api.AppsApi -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -interface AppIconDataSource { - - suspend fun getIcon(url: String): Bitmap -} - -class AppIconDataSourceImpl( - private val api: AppsApi -) : AppIconDataSource { - - override suspend fun getIcon(url: String): Bitmap = - withContext(Dispatchers.IO) { - val inputStream = api.getIcon(url).byteStream() - BitmapFactory.decodeStream(inputStream) - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppsInfoDataSource.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppsInfoDataSource.kt deleted file mode 100644 index 3db690cbc7..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/AppsInfoDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.vanced.manager.feature.home.data.datasource - -import com.vanced.manager.feature.home.data.api.AppsApi -import com.vanced.manager.feature.home.data.dto.AppInfoDto -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -interface AppsInfoDataSource { - - suspend fun getAppsInfo(channel: String): List -} - -class AppsInfoDataSourceImpl( - private val api: AppsApi -) : AppsInfoDataSource { - - override suspend fun getAppsInfo(channel: String): List = - withContext(Dispatchers.IO) { - api.getAppsInfo(channel) - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/PkgIngormationDataSource.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/PkgIngormationDataSource.kt deleted file mode 100644 index 6d42798a0c..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/datasource/PkgIngormationDataSource.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.vanced.manager.feature.home.data.datasource - -import android.content.pm.PackageManager -import com.vanced.manager.feature.home.data.pkg.PkgManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext - -interface PkgInformationDataSource { - - suspend fun getVersionCode(packageName: String): Int? - - suspend fun getVersionName(packageName: String): String? -} - -class PkgInformationDataSourceImpl( - private val pkgManager: PkgManager -) : PkgInformationDataSource { - - override suspend fun getVersionCode(packageName: String): Int? = - withContext(Dispatchers.IO) { - try { - pkgManager.getVersionCode(packageName) - } catch (exception: PackageManager.NameNotFoundException) { - null - } - } - - override suspend fun getVersionName(packageName: String): String? = - withContext(Dispatchers.IO) { - try { - pkgManager.getVersionName(packageName) - } catch (exception: PackageManager.NameNotFoundException) { - null - } - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/dto/AppInfoDto.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/dto/AppInfoDto.kt deleted file mode 100644 index 31721415c4..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/dto/AppInfoDto.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.vanced.manager.feature.home.data.dto - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class AppInfoDto( - @Json(name = "name") val name: String, - @Json(name = "iconUrl") val iconUrl: String, - @Json(name = "versionName") val versionName: String, - @Json(name = "versionCode") val versionCode: Int, - @Json(name = "pkgName") val pkgName: String, - @Json(name = "downloadUrl") val downloadUrl: String, - @Json(name = "changelog") val changelog: String, - @Json(name = "languages") val languages: List?, - @Json(name = "themes") val themes: List?, -) diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/pkg/PkgManager.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/pkg/PkgManager.kt deleted file mode 100644 index 4b1da006a0..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/pkg/PkgManager.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.vanced.manager.feature.home.data.pkg - -import android.content.pm.PackageManager -import android.os.Build - - -interface PkgManager { - - @Throws(PackageManager.NameNotFoundException::class) - suspend fun getVersionCode(packageName: String): Int - - @Throws(PackageManager.NameNotFoundException::class) - suspend fun getVersionName(packageName: String): String -} - -class PkgManagerImpl( - private val packageManager: PackageManager -) : PkgManager { - - private companion object { - const val PACKAGE_FLAG_ALL_OFF = 0 - const val MAJOR_IGNORE = 0xFFFFFFFF - } - - @Suppress("DEPRECATION") - @Throws(PackageManager.NameNotFoundException::class) - override suspend fun getVersionCode(packageName: String): Int { - return with(packageManager) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .longVersionCode - .and(MAJOR_IGNORE) - .toInt() - } else { - getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .versionCode - } - } - } - - @Throws(PackageManager.NameNotFoundException::class) - override suspend fun getVersionName(packageName: String): String = - packageManager.getPackageInfo(packageName, PACKAGE_FLAG_ALL_OFF) - .versionName -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/data/repository/AppsRepositoryImpl.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/data/repository/AppsRepositoryImpl.kt deleted file mode 100644 index a074982cb2..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/data/repository/AppsRepositoryImpl.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.vanced.manager.feature.home.data.repository - -import com.vanced.manager.feature.home.data.datasource.AppIconDataSource -import com.vanced.manager.feature.home.data.datasource.AppsInfoDataSource -import com.vanced.manager.feature.home.data.datasource.PkgInformationDataSource -import com.vanced.manager.feature.home.data.dto.AppInfoDto -import com.vanced.manager.feature.home.domain.entity.AppInfo -import com.vanced.manager.feature.home.domain.entity.AppState -import com.vanced.manager.feature.home.domain.repository.AppsRepository - - -class AppsRepositoryImpl( - private val appsInfoDataSource: AppsInfoDataSource, - private val appIconDataSource: AppIconDataSource, - private val pkgInformationDataSource: PkgInformationDataSource, - private val channel: String //TODO experiment -) : AppsRepository { - - // TODO switch content OR send toggles to build retrofit and change channel get json - override suspend fun getAppsInfo(): List = - appsInfoDataSource.getAppsInfo(channel) - .map { it.toEntity() } - - private suspend fun AppInfoDto.toEntity(): AppInfo { - val localVersionName = pkgInformationDataSource.getVersionName(pkgName) - val localVersionCode = pkgInformationDataSource.getVersionCode(pkgName) - return AppInfo( - name = name, - icon = appIconDataSource.getIcon(iconUrl), - versionName = versionName, - versionCode = versionCode, - pkgName = pkgName, - downloadUrl = downloadUrl, - changelog = changelog, - languages = languages, - themes = themes, - localVersionName = localVersionName, - localVersionCode = localVersionCode, - state = compareCode(versionCode, localVersionCode) - ) - } - - private fun compareCode(remote: Int, local: Int?): AppState = - if (local != null) { - when { - remote > local -> AppState.UPDATE - remote == local -> AppState.REINSTALL - remote < local -> AppState.REINSTALL - else -> throw IllegalArgumentException("Unknown versions") - } - } else { - AppState.INSTALL - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/di/FeatureHomeModules.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/di/FeatureHomeModules.kt deleted file mode 100644 index bda6df442d..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/di/FeatureHomeModules.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.vanced.manager.feature.home.di - -import com.vanced.manager.feature.home.data.api.AppsApi -import com.vanced.manager.feature.home.data.datasource.AppsInfoDataSource -import com.vanced.manager.feature.home.data.datasource.AppsInfoDataSourceImpl -import com.vanced.manager.feature.home.data.datasource.PkgInformationDataSource -import com.vanced.manager.feature.home.data.datasource.PkgInformationDataSourceImpl -import com.vanced.manager.feature.home.data.pkg.PkgManager -import com.vanced.manager.feature.home.data.pkg.PkgManagerImpl -import com.vanced.manager.feature.home.data.repository.AppsRepositoryImpl -import com.vanced.manager.feature.home.domain.repository.AppsRepository -import com.vanced.manager.feature.home.domain.usecase.GetAppsInfoUseCase -import com.vanced.manager.feature.home.presentation.HomeViewModel -import com.vanced.manager.library.network.service.createRetrofitService -import org.koin.android.ext.koin.androidContext -import org.koin.android.viewmodel.dsl.viewModel -import org.koin.core.qualifier.named -import org.koin.dsl.module - -internal val retrofitModule = module { - single { createRetrofitService(get()) } -} - -internal val pkgManagerModule = module { - single { PkgManagerImpl(androidContext().packageManager) } -} - -internal val dataSourceModule = module { - single { AppsInfoDataSourceImpl(api = get()) } - - single { PkgInformationDataSourceImpl(pkgManager = get()) } -} - -internal val channelModule = module { - factory(named("channel")) { - listOf( - "https://vancedapp.com/api/v1/latest.json", - "https://vancedapp.com/api/v1/latest_root.json", - "https://vancedapp.custom.com/api/v1/latest.json", - "https://vancedapp.custom.com/api/v1/latest_root.json" - ).random() - } -} - -internal val repositoryModule = module { - factory { - AppsRepositoryImpl( - appsInfoDataSource = get(), - appIconDataSource = get(), - pkgInformationDataSource = get(), - channel = get(named("channel")) //TODO experiment - ) - } -} - -internal val useCaseModule = module { - single { GetAppsInfoUseCase(repository = get()) } -} - -internal val viewModelModule = module { - viewModel { HomeViewModel(getAppsInfoUseCase = get()) } -} - -val FeatureHomeModules = listOf( - channelModule, //TODO experiment - retrofitModule, - pkgManagerModule, - dataSourceModule, - repositoryModule, - useCaseModule, - viewModelModule -) \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppInfo.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppInfo.kt deleted file mode 100644 index 89d6fb1f18..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppInfo.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.vanced.manager.feature.home.domain.entity - -import android.graphics.Bitmap - -data class AppInfo( - val name: String, - val icon: Bitmap, - val versionName: String, - val versionCode: Int, - val pkgName: String, - val downloadUrl: String, - val changelog: String, - val languages: List?, - val themes: List?, - val localVersionName: String?, - val localVersionCode: Int?, - val state: AppState, -) \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppState.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppState.kt deleted file mode 100644 index 9fd2e5c89e..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/AppState.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.vanced.manager.feature.home.domain.entity - -enum class AppState { - INSTALL, - UPDATE, - REINSTALL -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/example.json b/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/example.json deleted file mode 100644 index 0ebfe5aafb..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/entity/example.json +++ /dev/null @@ -1,60 +0,0 @@ -[ - { - "name": "manager", - "iconUrl": "https://github.com/YTVanced/VancedManager/icon.png", - "versionName": "2.0.1", - "versionCode": 201, - "pkgName": "com.vanced.manager", - "downloadUrl": "https://github.com/YTVanced/VancedManager/releases/latest/download", - "changelog": "- Fixed issues with Android 5 and 6\n- Fixed various crashes\n- Improved performance" - }, - { - "name": "vanced", - "iconUrl": "https://github.com/YTVanced/icon.png", - "versionName": "15.43.32", - "versionCode": 1515701696, - "pkgName": "com.vanced.android.youtube", - "downloadUrl": "https://github.com/YTVanced/releases/latest/download", - "changelog": "- Added toggle to revert to ExoPlayer V1\\r\\n- Added toggle to hide the new big Create button\\r\\n- A lot of fixes to old features", - "languages": [ - "af", - "am", - "ar", - "az", - "be", - "bg", - "bn", - "bs", - "ca", - "cs", - "da", - "de", - "el", - "en" - ], - // may be null, - "themes": [ - "dark", - "black" - ] - // may be null - }, - { - "name": "music", - "iconUrl": "https://github.com/YTMVanced/icon.png", - "versionName": "4.04.52", - "versionCode": 40452240, - "pkgName": "com.vanced.android.apps.youtube.music", - "downloadUrl": "https://github.com/YTMVanced/releases/latest/download", - "changelog": "- Added a toggle switch for outline icons\\n- Toolbar premium button has been removed" - }, - { - "name": "microg", - "iconUrl": "https://github.com/microg/icon.png", - "versionName": "0.2.14.204215", - "versionCode": 204215001, - "pkgName": "com.vanced.android.apps.youtube.music", - "downloadUrl": "https://github.com/microg/releases/latest/download", - "changelog": "- Updated to upstream sources\\n- Fixed video uploading" - } -] \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/repository/AppsRepository.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/domain/repository/AppsRepository.kt deleted file mode 100644 index eead2233b4..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/repository/AppsRepository.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.vanced.manager.feature.home.domain.repository - -import com.vanced.manager.feature.home.domain.entity.AppInfo - -interface AppsRepository { - - suspend fun getAppsInfo(): List -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/usecase/GetAppsInfoUseCase.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/domain/usecase/GetAppsInfoUseCase.kt deleted file mode 100644 index 451ad3e848..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/domain/usecase/GetAppsInfoUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.vanced.manager.feature.home.domain.usecase - -import com.vanced.manager.feature.home.domain.entity.AppInfo -import com.vanced.manager.feature.home.domain.repository.AppsRepository - -class GetAppsInfoUseCase( - private val repository: AppsRepository -) { - - suspend operator fun invoke(): List = - repository.getAppsInfo() -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/presentation/HomeViewModel.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/presentation/HomeViewModel.kt deleted file mode 100644 index c5140bbaef..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/presentation/HomeViewModel.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.vanced.manager.feature.home.presentation - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.vanced.manager.feature.home.domain.entity.AppInfo -import com.vanced.manager.feature.home.domain.usecase.GetAppsInfoUseCase -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.launch -import retrofit2.HttpException - -class HomeViewModel( - private val getAppsInfoUseCase: GetAppsInfoUseCase -) : ViewModel() { - - private val _appsList = MutableSharedFlow>() - val appsList: SharedFlow> = - _appsList.asSharedFlow() - - fun fetchAppsInfo() { - viewModelScope.launch { - try { - _appsList.emit(getAppsInfoUseCase()) - } catch (exception: HttpException) { - //TODO state - } - } - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/HomeFragment.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/ui/HomeFragment.kt deleted file mode 100644 index f6a56720d0..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/HomeFragment.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.vanced.manager.feature.home.ui - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import com.vanced.manager.core.ui.base.BindingFragment -import com.vanced.manager.feature.home.databinding.FragmentHomeBinding -import com.vanced.manager.feature.home.presentation.HomeViewModel -import com.vanced.manager.feature.home.ui.bind.bindData -import org.koin.android.viewmodel.ext.android.viewModel - -class HomeFragment : BindingFragment() { - - private val viewModel: HomeViewModel by viewModel() - - override fun binding( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = FragmentHomeBinding.inflate(inflater, container, false) - - override fun otherSetups() { - bindData(binding, viewModel) - } -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/bind/HomeFragmentBinder.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/ui/bind/HomeFragmentBinder.kt deleted file mode 100644 index e8460c2e1f..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/bind/HomeFragmentBinder.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.vanced.manager.feature.home.ui.bind - -import android.util.Log -import androidx.lifecycle.coroutineScope -import com.vanced.manager.feature.home.databinding.FragmentHomeBinding -import com.vanced.manager.feature.home.presentation.HomeViewModel -import com.vanced.manager.feature.home.ui.HomeFragment -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach - -internal fun HomeFragment.bindData( - binding: FragmentHomeBinding, - viewModel: HomeViewModel -) { - viewModel.appsList.onEach { - Log.d("apps", it.toString()) - }.launchIn(viewLifecycleOwner.lifecycle.coroutineScope) -} \ No newline at end of file diff --git a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/uistate/UiState.kt b/feature-home/src/main/java/com/vanced/manager/feature/home/ui/uistate/UiState.kt deleted file mode 100644 index 0b494068ca..0000000000 --- a/feature-home/src/main/java/com/vanced/manager/feature/home/ui/uistate/UiState.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.vanced.manager.feature.home.ui.uistate - -sealed class UiState \ No newline at end of file diff --git a/feature-home/src/main/res/layout/fragment_home.xml b/feature-home/src/main/res/layout/fragment_home.xml deleted file mode 100644 index fb847de6fc..0000000000 --- a/feature-home/src/main/res/layout/fragment_home.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/feature-home/src/main/res/values/links.xml b/feature-home/src/main/res/values/links.xml deleted file mode 100644 index 0e85d4bcfa..0000000000 --- a/feature-home/src/main/res/values/links.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - https://discord.gg/TUVd7rd - https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w - https://twitter.com/YTVanced - https://reddit.com/r/vanced - https://vanced.activity - https://brave.com/van874 - \ No newline at end of file diff --git a/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/AppInformationDataSourceImplTest.kt b/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/AppInformationDataSourceImplTest.kt deleted file mode 100644 index ed7290f2f7..0000000000 --- a/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/AppInformationDataSourceImplTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.vanced.manager.feature.home.data.datasource - -/* - -internal class AppInformationDataSourceImplTest : ShouldSpec() { - - private val api: GetAppInformationApi = mockk() - - private val dataSource = AppInformationDataSourceImpl(api) - - private val verifiable = VancedAppsDto( - VancedManagerDto("", 1, "", ""), - YouTubeVancedDto("", 1, "", "", listOf(), listOf()), - YouTubeMusicVancedDto("", 1, "", ""), - MicroGDto("", 1, "", "") - ) - - init { // https://kotest.io/styles/ - context("return information") { - should("VancedManagerInfo") { - coEvery { api.getAppInformation() } returns verifiable - dataSource - .getVancedManagerInformation() shouldBe - VancedManagerInfo( - version = "", - versionCode = 1, - baseUrl = "", - changeLog = "" - ) - } - should("YouTubeVancedInfo") { - coEvery { api.getAppInformation() } returns verifiable - dataSource - .getYouTubeVancedInformation() shouldBe - YouTubeVancedInfo( - version = "", - versionCode = 1, - baseUrl = "", - changeLog = "", - themes = listOf(), - langs = listOf() - ) - } - should("YouTubeMusicVancedInfo") { - coEvery { api.getAppInformation() } returns verifiable - dataSource - .getYouTubeMusicVancedInformation() shouldBe - YouTubeMusicVancedInfo( - version = "", - versionCode = 1, - baseUrl = "", - changeLog = "" - ) - } - should("MicroGInfo") { - coEvery { api.getAppInformation() } returns verifiable - dataSource - .getMicroGInformation() shouldBe - MicroGInfo( - version = "", - versionCode = 1, - baseUrl = "", - changeLog = "" - ) - } - } - } -}*/ diff --git a/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/PkgInformationDataSourceImplTest.kt b/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/PkgInformationDataSourceImplTest.kt deleted file mode 100644 index 7aa955827a..0000000000 --- a/feature-home/src/test/java/com/vanced/manager/feature/home/data/datasource/PkgInformationDataSourceImplTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.vanced.manager.feature.home.data.datasource - -/* -internal class PkgInformationDataSourceImplTest : ShouldSpec() { - - private val pkgManager: PkgManager = mockk() - - private val dataSource = PkgInformationDataSourceImpl(pkgManager) - - init { // https://kotest.io/styles/ - should("return version code") { - val testPackageName = "VancedManager" - val expectation = 4545 - coEvery { pkgManager.getVersionCode(testPackageName) } returns expectation - dataSource.getVersionCode(testPackageName) shouldBe expectation - } - should("return version name") { - val testPackageName = "VancedManager" - val expectation = "VancedManagerName" - coEvery { pkgManager.getVersionName(testPackageName) } returns expectation - dataSource.getVersionName(testPackageName) shouldBe expectation - } - } -}*/ \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 2cf4a482b2..fa797e8c60 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx1024m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit @@ -14,5 +14,3 @@ android.enableJetifier=true android.useAndroidX=true kotlin.code.style=official -org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1536M" -org.gradle.parallel=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a..e708b1c023 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6667917bd1..ffed3a254e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Apr 13 14:40:59 GET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 index cccdd3d517..4f906e0c81 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a2..107acd32c4 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,84 +1,89 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/library-network/.gitignore b/library-network/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/library-network/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/library-network/build.gradle.kts b/library-network/build.gradle.kts deleted file mode 100644 index 1c4c3b147a..0000000000 --- a/library-network/build.gradle.kts +++ /dev/null @@ -1,56 +0,0 @@ -plugins { - id("com.android.library") - kotlin("android") -} - -android { - compileSdkVersion(30) - - defaultConfig { - minSdkVersion(16) - targetSdkVersion(30) - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - tasks.withType { - kotlinOptions { - jvmTarget = "1.8" - } - } - -} - -dependencies { - implementation(kotlin("stdlib")) - implementation("androidx.core:core-ktx:1.3.2") - - implementation("com.squareup.retrofit2:retrofit:2.9.0") - implementation("com.squareup.retrofit2:converter-moshi:2.9.0") - - implementation("com.squareup.moshi:moshi-kotlin:1.11.0") - implementation("com.squareup.moshi:moshi-kotlin-codegen:1.11.0") - implementation("com.squareup.moshi:moshi-adapters:1.11.0") - - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - - implementation("org.koin:koin-android:2.2.1") - implementation("org.koin:koin-android-viewmodel:2.2.1") - implementation("org.koin:koin-android-ext:2.2.1") -} \ No newline at end of file diff --git a/library-network/src/main/AndroidManifest.xml b/library-network/src/main/AndroidManifest.xml deleted file mode 100644 index 53d91c7c6c..0000000000 --- a/library-network/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/di/NetworkModule.kt b/library-network/src/main/java/com/vanced/manager/library/network/di/NetworkModule.kt deleted file mode 100644 index c3d177c98d..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/di/NetworkModule.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.vanced.manager.library.network.di - -import com.vanced.manager.library.network.okhttp.interceptors.LOG_INTERCEPTOR -import com.vanced.manager.library.network.okhttp.interceptors.NO_CONNECT_INTERCEPTOR -import com.vanced.manager.library.network.okhttp.interceptors.loggingInterceptor -import com.vanced.manager.library.network.okhttp.interceptors.noConnectionInterceptor -import com.vanced.manager.library.network.providers.provideMoshi -import com.vanced.manager.library.network.providers.provideOkHttpClient -import com.vanced.manager.library.network.providers.provideRetrofit -import org.koin.android.BuildConfig -import org.koin.android.ext.koin.androidContext -import org.koin.core.qualifier.named -import org.koin.dsl.module - - -const val ORIGINAL = "ORIGINAL" - -val NetworkModule = module { - factory(named(LOG_INTERCEPTOR)) { loggingInterceptor() } - factory(named(NO_CONNECT_INTERCEPTOR)) { noConnectionInterceptor(androidContext()) } - - factory(named(ORIGINAL)) { - if (BuildConfig.DEBUG) { - provideOkHttpClient( - interceptors = listOf( - get(named(LOG_INTERCEPTOR)), - get(named(NO_CONNECT_INTERCEPTOR)) - ) - ) - } else { - provideOkHttpClient( - interceptors = listOf( - get(named(NO_CONNECT_INTERCEPTOR)) - ) - ) - } - } - - factory { provideMoshi() } - - factory(named(ORIGINAL)) { - provideRetrofit( - moshi = get(), - okHttpClient = get(named(ORIGINAL)), - url = "https://www.haliksar.fun" - ) - } -} \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/LoggingInterceptor.kt b/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/LoggingInterceptor.kt deleted file mode 100644 index adb21f390d..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/LoggingInterceptor.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.vanced.manager.library.network.okhttp.interceptors - -import okhttp3.Interceptor -import okhttp3.logging.HttpLoggingInterceptor -import okhttp3.logging.HttpLoggingInterceptor.Level - -const val LOG_INTERCEPTOR = "LOG_INTERCEPTOR" - -internal fun loggingInterceptor(): Interceptor = - HttpLoggingInterceptor().setLevel(Level.BODY) \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/NoConnectionInterceptor.kt b/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/NoConnectionInterceptor.kt deleted file mode 100644 index 125a445794..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/okhttp/interceptors/NoConnectionInterceptor.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.vanced.manager.library.network.okhttp.interceptors - -import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities -import android.os.Build -import okhttp3.Interceptor - -class NoConnectException : Exception() - -const val NO_CONNECT_INTERCEPTOR = "NO_CONNECT_INTERCEPTOR" - -internal fun noConnectionInterceptor(context: Context) = Interceptor { chain -> - if (!isInternetAvailable(context)) { - throw NoConnectException() - } else { - chain.proceed(chain.request()) - } -} - -@Suppress("DEPRECATION") -private fun isInternetAvailable(context: Context): Boolean { - with(context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager) { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val networkCapabilities = activeNetwork ?: return false - val actNw = getNetworkCapabilities(networkCapabilities) ?: return false - when { - actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true - actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true - actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true - else -> false - } - } else { - when (activeNetworkInfo?.type) { - ConnectivityManager.TYPE_WIFI -> true - ConnectivityManager.TYPE_MOBILE -> true - ConnectivityManager.TYPE_ETHERNET -> true - else -> false - } - } - } -} \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/providers/MoshiProvider.kt b/library-network/src/main/java/com/vanced/manager/library/network/providers/MoshiProvider.kt deleted file mode 100644 index 291b2d2597..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/providers/MoshiProvider.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.vanced.manager.library.network.providers - -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import java.util.* - -internal fun provideMoshi(): Moshi = Moshi.Builder() - .add(KotlinJsonAdapterFactory()) - .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe()) - .build() \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/providers/OkHttpClientProvider.kt b/library-network/src/main/java/com/vanced/manager/library/network/providers/OkHttpClientProvider.kt deleted file mode 100644 index 80e0b7ce1c..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/providers/OkHttpClientProvider.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.vanced.manager.library.network.providers - -import okhttp3.Authenticator -import okhttp3.Interceptor -import okhttp3.OkHttpClient -import java.util.concurrent.TimeUnit - -private const val WaitTime = 0L -private const val ConnTime = 0L - -fun provideOkHttpClient( - interceptors: List = emptyList(), - authenticators: List = emptyList() -): OkHttpClient = - OkHttpClient.Builder() - .callTimeout(WaitTime, TimeUnit.SECONDS) - .readTimeout(WaitTime, TimeUnit.MILLISECONDS) - .connectTimeout(ConnTime, TimeUnit.MILLISECONDS) - .writeTimeout(WaitTime, TimeUnit.MILLISECONDS) - .apply { - interceptors.forEach { addInterceptor(it) } - authenticators.forEach { authenticator(it) } - } - .build() \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/providers/RetrofitProvider.kt b/library-network/src/main/java/com/vanced/manager/library/network/providers/RetrofitProvider.kt deleted file mode 100644 index edafe26b2d..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/providers/RetrofitProvider.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.vanced.manager.library.network.providers - -import com.squareup.moshi.Moshi -import okhttp3.OkHttpClient -import retrofit2.Retrofit -import retrofit2.converter.moshi.MoshiConverterFactory -import kotlin.reflect.KClass - -fun provideRetrofit( - okHttpClient: OkHttpClient, - moshi: Moshi, - url: String -): Retrofit = Retrofit.Builder() - .addConverterFactory(MoshiConverterFactory.create(moshi)) - .client(okHttpClient) - .baseUrl(url) - .build() - -fun createService(service: KClass, baseurl: String): S { - return provideRetrofit( - provideOkHttpClient(), - provideMoshi(), - baseurl - ).create(service.java) -} \ No newline at end of file diff --git a/library-network/src/main/java/com/vanced/manager/library/network/service/RetrofitService.kt b/library-network/src/main/java/com/vanced/manager/library/network/service/RetrofitService.kt deleted file mode 100644 index 1dcb43ba98..0000000000 --- a/library-network/src/main/java/com/vanced/manager/library/network/service/RetrofitService.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.vanced.manager.library.network.service - -import retrofit2.Retrofit - -inline fun createRetrofitService(retrofit: Retrofit): T = - retrofit.create(T::class.java) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e7d18a0a03..7d945f68af 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,9 +1,3 @@ rootProject.name = "Vanced Manager" include(":app") - -include(":core-presentation", ":core-ui" , ":core-mvi") - -include(":feature-home") - -include(":library-network")