diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000000..28cdfb4c06 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,142 @@ +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") +} + +android { + compileSdkVersion(30) + + defaultConfig { + applicationId = "com.vanced.manager" + minSdkVersion(21) + targetSdkVersion(30) + versionCode = 220 + versionName = "2.2.0 (RootedFirebase)" + + vectorDrawables.useSupportLibrary = true + + buildConfigField("String[]", "MANAGER_LANGUAGES", "{" + getLanguages() + "}") + 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) + } + + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + + buildFeatures { + dataBinding = true // ObservableField migrate to flow or liveData + viewBinding = true + } + + packagingOptions { + exclude("META-INF/DEPENDENCIES") + exclude("META-INF/*.kotlin_module") + } + +// To inline the bytecode built with JVM target 1.8 into +// bytecode that is being built with JVM target 1.6. (e.g. navArgs) + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + tasks.withType { + kotlinOptions { + jvmTarget = "1.8" + } + } + +} + +fun getLanguages(): String { + 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()?.forEach { dir -> + if (dir.name.startsWith("values-") && !dir.name.contains("v23")) { + val dirname = dir.name.substringAfter("-").substringBefore("-") + if (!exceptions.any { dirname == it }) { + langs.add(dirname) + } + } + } + return langs.joinToString(", ") { "\"$it\"" } +} + +dependencies { + + implementation(project(":core-presentation")) + implementation(project(":core-ui")) + + implementation(project(":library-network")) + +// Kotlin + implementation(kotlin("stdlib-jdk8")) + implementation(kotlin("reflect")) + +// 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.2.5") + implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0") + implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0") + implementation("androidx.navigation:navigation-fragment-ktx:2.3.2") + implementation("androidx.navigation:navigation-ui-ktx:2.3.2") + implementation("androidx.preference:preference-ktx:1.1.1") + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") + + //Appearance + implementation("com.github.madrapps:pikolo:2.0.1") + implementation("com.google.android.material:material:1.3.0-rc01") + + // JSON parser + implementation("com.beust:klaxon:5.4") + + // Crowdin + implementation("com.crowdin.platform:mobile-sdk:1.2.0") + + // Tips + implementation("com.github.florent37:viewtooltip:1.2.2") + + // HTTP networking + implementation("com.github.kittinunf.fuel:fuel:2.3.0") + implementation("com.github.kittinunf.fuel:fuel-coroutines:2.2.3") + implementation("com.github.kittinunf.fuel:fuel-json:2.2.3") + implementation("com.squareup.okhttp3:logging-interceptor:4.9.0") + + // Root permissions + implementation("com.github.topjohnwu.libsu:core:3.0.2") + implementation("com.github.topjohnwu.libsu:io:3.0.2") + + // Layout + implementation("com.google.android:flexbox:2.0.1") + + // Firebase + implementation("com.google.firebase:firebase-analytics-ktx:18.0.1") + implementation("com.google.firebase:firebase-crashlytics:17.3.0") + implementation("com.google.firebase:firebase-messaging:21.0.1") + implementation("com.google.firebase:firebase-perf:19.1.0") +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index cad0175a98..761aa4571d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts.kts.kts.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 62698b9342..620ade3fe0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,14 +31,12 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:largeHeap="true" tools:ignore="UnusedAttribute"> + android:theme="@style/SplashTheme"> @@ -52,16 +50,14 @@ + android:theme="@style/DarkTheme"/> + android:theme="@style/DarkTheme"> diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000..7004eaa534 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt b/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt index 65bd906792..29f241adc9 100644 --- a/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt +++ b/app/src/main/java/com/vanced/manager/adapter/AppListAdapter.kt @@ -11,6 +11,7 @@ import com.github.florent37.viewtooltip.ViewTooltip import com.vanced.manager.R import com.vanced.manager.databinding.ViewAppBinding import com.vanced.manager.model.DataModel +import com.vanced.manager.model.RootDataModel import com.vanced.manager.ui.dialogs.AppInfoDialog import com.vanced.manager.ui.viewmodels.HomeViewModel @@ -23,7 +24,7 @@ class AppListAdapter( val apps = mutableListOf() private val dataModels = mutableListOf() - private val rootDataModels = mutableListOf() + private val rootDataModels = mutableListOf() private val prefs = getDefaultSharedPreferences(context) private var itemCount = 0 @@ -45,9 +46,16 @@ class AppListAdapter( appUninstall.setOnClickListener { dataModel?.appPkg?.let { it1 -> viewModel.uninstallPackage(it1) } } - appUninstall.isVisible = dataModel?.isAppInstalled?.value == true + appLaunch.setOnClickListener { + viewModel.launchApp(apps[position], isRoot) + } + with(dataModel?.isAppInstalled?.value) { + appUninstall.isVisible = this == true + appLaunch.isVisible = this == true + } dataModel?.isAppInstalled?.observe(lifecycleOwner) { appUninstall.isVisible = it + appLaunch.isVisible = it } appRemoteVersion.text = dataModel?.versionName?.value dataModel?.versionName?.observe(lifecycleOwner) { @@ -84,21 +92,21 @@ class AppListAdapter( init { if (prefs.getBoolean("enable_vanced", true)) { - dataModels.add(viewModel.vanced.value) - rootDataModels.add(viewModel.vancedRoot.value) + dataModels.add(viewModel.vancedModel.value) + rootDataModels.add(viewModel.vancedRootModel.value) apps.add(context.getString(R.string.vanced)) itemCount++ } if (prefs.getBoolean("enable_music", true)) { - dataModels.add(viewModel.music.value) - rootDataModels.add(viewModel.musicRoot.value) + dataModels.add(viewModel.musicModel.value) + rootDataModels.add(viewModel.musicRootModel.value) apps.add(context.getString(R.string.music)) itemCount++ } if (!isRoot) { - dataModels.add(viewModel.microg.value) + dataModels.add(viewModel.microgModel.value) apps.add(context.getString(R.string.microg)) itemCount++ } diff --git a/app/src/main/java/com/vanced/manager/core/App.kt b/app/src/main/java/com/vanced/manager/core/App.kt index 7762fc4616..e20ca44d05 100644 --- a/app/src/main/java/com/vanced/manager/core/App.kt +++ b/app/src/main/java/com/vanced/manager/core/App.kt @@ -9,7 +9,7 @@ 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.InternetTools.loadJson +import com.vanced.manager.utils.loadJson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob 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 index 96365d42f7..eef1caff6e 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloader.kt @@ -2,10 +2,12 @@ package com.vanced.manager.core.downloader import android.content.Context import com.vanced.manager.R +import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.downloadProgress -import com.vanced.manager.utils.DownloadHelper.fuelDownload -import com.vanced.manager.utils.InternetTools.microg import com.vanced.manager.utils.PackageHelper.install +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.getInstallUrl +import com.vanced.manager.utils.microg object MicrogDownloader { @@ -14,11 +16,13 @@ object MicrogDownloader { fun downloadMicrog(context: Context) { val url = microg.value?.string("url") ?: "" - fuelDownload(url, folderName, fileName, context, onDownloadComplete = { - startMicrogInstall(context) - }, onError = { - downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, fileName)) - }) + context.getDefaultPrefs().getInstallUrl()?.let { + download(url, "$it/", folderName, fileName, context, onDownloadComplete = { + startMicrogInstall(context) + }, onError = { + downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, fileName)) + }) + } } 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 index c63217b963..4ce7393a00 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MusicDownloader.kt @@ -3,16 +3,11 @@ package com.vanced.manager.core.downloader import android.content.Context import androidx.preference.PreferenceManager.getDefaultSharedPreferences 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.DeviceUtils.getArch +import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.downloadProgress -import com.vanced.manager.utils.DownloadHelper.fuelDownload -import com.vanced.manager.utils.Extensions.getInstallUrl -import com.vanced.manager.utils.Extensions.getLatestAppVersion -import com.vanced.manager.utils.InternetTools.getFileNameFromUrl -import com.vanced.manager.utils.InternetTools.music -import com.vanced.manager.utils.InternetTools.musicVersions import com.vanced.manager.utils.PackageHelper.downloadStockCheck import com.vanced.manager.utils.PackageHelper.install import com.vanced.manager.utils.PackageHelper.installMusicRoot @@ -42,10 +37,10 @@ object MusicDownloader { private fun downloadApk(context: Context, apk: String = "music") { val url = if (apk == "stock") "$baseurl/stock/${getArch()}.apk" else "$baseurl/$variant.apk" - fuelDownload(url, folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = { + download(url, baseurl + "/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = { if (variant == "root" && apk != "stock") { downloadApk(context, "stock") - return@fuelDownload + return@download } when (apk) { 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 index a913cc3466..2661e7d4cf 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloader.kt @@ -6,17 +6,11 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences 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.validateTheme import com.vanced.manager.utils.AppUtils.vancedRootPkg -import com.vanced.manager.utils.DeviceUtils.getArch +import com.vanced.manager.utils.DownloadHelper.download import com.vanced.manager.utils.DownloadHelper.downloadProgress -import com.vanced.manager.utils.DownloadHelper.fuelDownload -import com.vanced.manager.utils.Extensions.getInstallUrl -import com.vanced.manager.utils.Extensions.getLatestAppVersion -import com.vanced.manager.utils.InternetTools.getFileNameFromUrl -import com.vanced.manager.utils.InternetTools.vanced -import com.vanced.manager.utils.InternetTools.vancedVersions -import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages import com.vanced.manager.utils.PackageHelper.downloadStockCheck import com.vanced.manager.utils.PackageHelper.installVanced import com.vanced.manager.utils.PackageHelper.installVancedRoot @@ -77,48 +71,50 @@ object VancedDownloader { else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?") } - fuelDownload(url, 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) + installUrl?.let { + download(url, "$it/", folderName!!, getFileNameFromUrl(url), context, onDownloadComplete = { + when (type) { + "theme" -> + if (variant == "root") { + if (validateTheme(downloadPath!!, theme!!, hashUrl, context)) { + if (downloadStockCheck(vancedRootPkg, vancedVersionCode, context)) + downloadSplits(context, "arch") + else + startVancedInstall(context) + } else + downloadSplits(context, "theme") } else - downloadSplits(context, "theme") - } else - downloadSplits(context, "arch") - "arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang") - "stock" -> downloadSplits(context, "dpi") - "dpi" -> downloadSplits(context, "lang") - "lang" -> { - count++ - succesfulLangCount++ - if (count < lang.size) - downloadSplits(context, "lang") - else - startVancedInstall(context) - } - - } - }, onError = { - if (type == "lang") { - count++ - when { - count < lang.size -> downloadSplits(context, "lang") - succesfulLangCount == 0 -> { - lang.add("en") - downloadSplits(context, "lang") + downloadSplits(context, "arch") + "arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang") + "stock" -> downloadSplits(context, "dpi") + "dpi" -> downloadSplits(context, "lang") + "lang" -> { + count++ + succesfulLangCount++ + if (count < lang.size) + downloadSplits(context, "lang") + else + startVancedInstall(context) } - else -> startVancedInstall(context) + } + }, onError = { + if (type == "lang") { + count++ + when { + count < lang.size -> downloadSplits(context, "lang") + succesfulLangCount == 0 -> { + lang.add("en") + downloadSplits(context, "lang") + } + else -> startVancedInstall(context) + } - } else { - downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url))) - } - }) + } else { + downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, getFileNameFromUrl(url))) + } + }) + } } fun startVancedInstall(context: Context, variant: String? = this.variant) { diff --git a/app/src/main/java/com/vanced/manager/model/DataModel.kt b/app/src/main/java/com/vanced/manager/model/DataModel.kt index d74f6e89b6..0d9b617afd 100644 --- a/app/src/main/java/com/vanced/manager/model/DataModel.kt +++ b/app/src/main/java/com/vanced/manager/model/DataModel.kt @@ -7,8 +7,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.beust.klaxon.JsonObject import com.vanced.manager.R -import com.vanced.manager.utils.Extensions.lifecycleOwner import com.vanced.manager.utils.PackageHelper.isPackageInstalled +import com.vanced.manager.utils.lifecycleOwner import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,9 +16,9 @@ import kotlinx.coroutines.launch open class DataModel( private val jsonObject: LiveData, private val context: Context, - val appPkg: String, - val appName: String, - val appIcon: Drawable?, + open val appPkg: String, + open val appName: String, + open val appIcon: Drawable?, ) { private val versionCode = MutableLiveData() @@ -64,7 +64,7 @@ open class DataModel( } } - private fun getPkgVersionName(pkg: String): String { + open fun getPkgVersionName(pkg: String): String { val pm = context.packageManager return if (isAppInstalled.value == true) { pm.getPackageInfo(pkg, 0).versionName.removeSuffix("-vanced") @@ -84,7 +84,7 @@ open class DataModel( } else 0 } - private fun compareInt(int1: Int?, int2: Int?): String { + open fun compareInt(int1: Int?, int2: Int?): String { if (int2 != null && int1 != null) { return when { int1 == 0 -> context.getString(R.string.install) diff --git a/app/src/main/java/com/vanced/manager/model/ProgressModel.kt b/app/src/main/java/com/vanced/manager/model/ProgressModel.kt index 990d96cc73..c0014803a3 100644 --- a/app/src/main/java/com/vanced/manager/model/ProgressModel.kt +++ b/app/src/main/java/com/vanced/manager/model/ProgressModel.kt @@ -1,7 +1,8 @@ package com.vanced.manager.model import androidx.lifecycle.MutableLiveData -import com.github.kittinunf.fuel.core.requests.CancellableRequest +import okhttp3.ResponseBody +import retrofit2.Call open class ProgressModel { @@ -9,7 +10,7 @@ open class ProgressModel { val downloadingFile = MutableLiveData() val installing = MutableLiveData() - var currentDownload: CancellableRequest? = null + var currentDownload: Call? = null fun reset() { downloadProgress.value = 0 diff --git a/app/src/main/java/com/vanced/manager/model/RootDataModel.kt b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt new file mode 100644 index 0000000000..2466772dd5 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/model/RootDataModel.kt @@ -0,0 +1,37 @@ +package com.vanced.manager.model + +import android.content.Context +import android.graphics.drawable.Drawable +import androidx.lifecycle.LiveData +import com.beust.klaxon.JsonObject +import com.vanced.manager.R +import com.vanced.manager.utils.PackageHelper + +open class RootDataModel( + jsonObject: LiveData, + private val context: Context, + override val appPkg: String, + override val appName: String, + override val appIcon: Drawable?, + private val scriptName: String +): DataModel( + jsonObject, context, appPkg, appName, appIcon +) { + + override fun getPkgVersionName(pkg: String): String { + return if (PackageHelper.scriptExists(scriptName)) { + super.getPkgVersionName(pkg) + } else { + context.getString(R.string.unavailable) + } + } + + override fun compareInt(int1: Int?, int2: Int?): String { + return if (PackageHelper.scriptExists(scriptName)) { + super.compareInt(int1, int2) + } else { + context.getString(R.string.install) + } + } + +} \ 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 0c2aa96a54..e1e2e06297 100644 --- a/app/src/main/java/com/vanced/manager/ui/MainActivity.kt +++ b/app/src/main/java/com/vanced/manager/ui/MainActivity.kt @@ -25,13 +25,7 @@ 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.Extensions.show -import com.vanced.manager.utils.InternetTools.manager -import com.vanced.manager.utils.LanguageContextWrapper -import com.vanced.manager.utils.LanguageHelper.authCrowdin -import com.vanced.manager.utils.LanguageHelper.onActivityResult -import com.vanced.manager.utils.PackageHelper -import com.vanced.manager.utils.ThemeHelper.setFinalTheme +import com.vanced.manager.utils.* class MainActivity : AppCompatActivity() { 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 index 0e4521c16c..4d498d2b33 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/EmptyPreference.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/EmptyPreference.kt @@ -7,28 +7,35 @@ import android.widget.FrameLayout import androidx.core.view.isGone import androidx.core.view.isVisible import com.vanced.manager.R -import kotlinx.android.synthetic.main.view_preference.view.* +import com.vanced.manager.databinding.ViewPreferenceBinding class EmptyPreference @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, - defStyleRes: Int = 0 + 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 { - LayoutInflater.from(context).inflate(R.layout.view_preference, this, true) + _binding = ViewPreferenceBinding.inflate(LayoutInflater.from(context), this, true) initAttrs(context, attrs) } fun setTitle(newTitle: String) { - preference_title.text = newTitle + binding.preferenceTitle.text = newTitle } fun setSummary(newSummary: String) { - preference_summary.text = newSummary - preference_summary.isVisible = true - preference_title.setPadding(0, 0, 0, 0) + with (binding) { + preferenceSummary.text = newSummary + preferenceSummary.isVisible = true + preferenceTitle.setPadding(0, 0, 0, 0) + } } private fun initAttrs(context: Context, attrs: AttributeSet?) { @@ -36,13 +43,15 @@ class EmptyPreference @JvmOverloads constructor( 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) - if (summary != null) { - preference_summary.text = summary - } else { - preference_summary.isGone = true - preference_title.setPadding(0, 12, 0, 12) + with (binding) { + if (summary != null) { + preferenceSummary.text = summary + } else { + preferenceSummary.isGone = true + preferenceTitle.setPadding(0, 12, 0, 12) + } + preferenceTitle.text = title } - preference_title.text = title typedArray.recycle() } 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 index ecc1dbd6fc..76b8296309 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/PreferenceCategory.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/PreferenceCategory.kt @@ -5,16 +5,21 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout import com.vanced.manager.R -import kotlinx.android.synthetic.main.view_preference_category.view.* +import com.vanced.manager.databinding.ViewPreferenceCategoryBinding class PreferenceCategory @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0, ) : LinearLayout(context, attrs, defStyle) { + private var _binding: ViewPreferenceCategoryBinding? = null + + val binding: ViewPreferenceCategoryBinding + get() = requireNotNull(_binding) + init { - LayoutInflater.from(context).inflate(R.layout.view_preference_category, this, true) + _binding = ViewPreferenceCategoryBinding.inflate(LayoutInflater.from(context), this, true) initAttrs(context, attrs) setPadding(0, 4, 0, 0) orientation = VERTICAL @@ -25,7 +30,7 @@ class PreferenceCategory @JvmOverloads constructor( val typedArray = context.obtainStyledAttributes(mAttrs, R.styleable.PreferenceCategory, 0, 0) val title = typedArray.getText(R.styleable.PreferenceCategory_category_title) - category_title.text = title + binding.categoryTitle.text = title typedArray.recycle() } } 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 index 8786701a4c..8f5c2bff3b 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/PreferenceSwitch.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/PreferenceSwitch.kt @@ -11,10 +11,10 @@ import com.vanced.manager.R import com.vanced.manager.databinding.ViewPreferenceSwitchBinding class PreferenceSwitch @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0, - defStyleRes: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0, + defStyleRes: Int = 0 ) : FrameLayout(context, attrs, defStyle, defStyleRes) { interface OnCheckedListener { @@ -43,8 +43,9 @@ class PreferenceSwitch @JvmOverloads constructor( val title = getText(R.styleable.PreferenceSwitch_switch_title) val summary = getText(R.styleable.PreferenceSwitch_switch_summary) val key = getText(R.styleable.PreferenceSwitch_switch_key) - setDefaultValue(getBoolean(R.styleable.PreferenceSwitch_switch_def_value, false)) + val defValue = getBoolean(R.styleable.PreferenceSwitch_switch_def_value, false) setKey(key) + setDefaultValue(defValue) setTitle(title) setSummary(summary) recycle() @@ -64,7 +65,7 @@ class PreferenceSwitch @JvmOverloads constructor( } fun setOnCheckedListener(method: (buttonView: CompoundButton, isChecked: Boolean) -> Unit) { - mListener = object : OnCheckedListener{ + mListener = object : OnCheckedListener { override fun onChecked(buttonView: CompoundButton, isChecked: Boolean) { method(buttonView, isChecked) } @@ -85,11 +86,11 @@ class PreferenceSwitch @JvmOverloads constructor( fun setKey(key: CharSequence?) { prefKey = key.toString() - binding.preferenceSwitch.isChecked = prefs.getBoolean(prefKey, defValue) + binding.preferenceSwitch.isChecked = prefs.getBoolean(key.toString(), defValue) } fun setDefaultValue(newVal: Boolean) { defValue = newVal - binding.preferenceSwitch.isChecked = prefs.getBoolean(prefKey, defValue) + binding.preferenceSwitch.isChecked = prefs.getBoolean(prefKey, newVal) } } \ 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 index cb42adbbb7..65010decf4 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt @@ -6,10 +6,10 @@ 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.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.lifecycleOwner class ThemedMaterialButton @JvmOverloads constructor( context: Context, @@ -18,7 +18,7 @@ class ThemedMaterialButton @JvmOverloads constructor( ) : MaterialButton(context, attributeSet, defStyleAttr) { init { - setBgColor(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + setBgColor(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) context.lifecycleOwner()?.let { owner -> accentColor.observe(owner) { color -> setBgColor(color.toInt()) 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 index 4f419cf520..a243abc823 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt @@ -5,21 +5,14 @@ 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.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs class ThemedMaterialCheckbox @JvmOverloads constructor( context: Context, attributeSet: AttributeSet? = null, ) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) { init { - buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) - context.lifecycleOwner()?.let { owner -> - accentColor.observe(owner) { color -> - buttonTintList = ColorStateList.valueOf(color.toInt()) - } - } + buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) } } \ 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 index fec702cb6f..fd0c302f0a 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt @@ -5,21 +5,14 @@ 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.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs class ThemedMaterialRadioButton @JvmOverloads constructor( context: Context, attributeSet: AttributeSet? = null, ) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) { init { - buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) - context.lifecycleOwner()?.let { owner -> - accentColor.observe(owner) { color -> - buttonTintList = ColorStateList.valueOf(color.toInt()) - } - } + buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) } } \ 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 new file mode 100644 index 0000000000..b3a63a1de1 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialSlider.kt @@ -0,0 +1,20 @@ +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.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs + +class ThemedMaterialSlider@JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttr: Int = 0 +) : Slider(context, attributeSet, defStyleAttr) { + + init { + thumbStrokeColor = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) + } + +} \ 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 index 17c346a9d6..99c83daa03 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt @@ -5,10 +5,10 @@ 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.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.lifecycleOwner class ThemedOutlinedMaterialButton @JvmOverloads constructor( @@ -17,7 +17,7 @@ class ThemedOutlinedMaterialButton @JvmOverloads constructor( defStyleAttr: Int = 0 ) : MaterialButton(context, attributeSet, defStyleAttr) { init { - applyAccent(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + applyAccent(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) context.lifecycleOwner()?.let { owner -> accentColor.observe(owner) { color -> applyAccent(color.toInt()) 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 new file mode 100644 index 0000000000..2e731349fb --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwipeRefreshlayout.kt @@ -0,0 +1,25 @@ +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.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs + +class ThemedSwipeRefreshlayout @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null +) : SwipeRefreshLayout(context, attributeSet) { + init { + setColorSchemeColors(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) + 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 index 1e15464da7..7ad3f77bcf 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt @@ -8,10 +8,10 @@ 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.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.lifecycleOwner class ThemedSwitchCompat @JvmOverloads constructor( context: Context, @@ -21,7 +21,7 @@ class ThemedSwitchCompat @JvmOverloads constructor( private val states = arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)) init { - setSwitchColors(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + setSwitchColors(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) context.lifecycleOwner()?.let { owner -> accentColor.observe(owner) { color -> setSwitchColors(color.toInt()) 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 index ddc3f28709..e79ab8515b 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt @@ -3,10 +3,10 @@ package com.vanced.manager.ui.core import android.content.Context import android.util.AttributeSet import androidx.appcompat.widget.AppCompatTextView -import com.vanced.manager.utils.Extensions.getDefaultPrefs -import com.vanced.manager.utils.Extensions.lifecycleOwner -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.lifecycleOwner class ThemedTextView @JvmOverloads constructor( context: Context, @@ -14,7 +14,7 @@ class ThemedTextView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : AppCompatTextView(context, attributeSet, defStyleAttr) { init { - setTextColor(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + setTextColor(context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) context.lifecycleOwner()?.let { owner -> accentColor.observe(owner) { color -> setTextColor(color.toInt()) 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 index f09861b58c..94a7734dcd 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/AppDownloadDialog.kt @@ -18,7 +18,7 @@ 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.DownloadHelper.downloadProgress -import com.vanced.manager.utils.Extensions.applyAccent +import com.vanced.manager.utils.applyAccent class AppDownloadDialog : BindingDialogFragment() { 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 index f1de4c2085..bc08491c63 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt @@ -11,8 +11,8 @@ 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.Extensions.getCheckedButtonTag -import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.getCheckedButtonTag +import com.vanced.manager.utils.getDefaultPrefs class AppVersionSelectorDialog : BindingBottomSheetDialogFragment() { 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 index 9c9d10ac82..ae8f76a552 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/DialogContainer.kt @@ -1,17 +1,13 @@ package com.vanced.manager.ui.dialogs -import android.app.Activity -import android.content.ComponentName import android.content.Context -import android.content.Intent -import androidx.core.content.ContextCompat.startActivity 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.Extensions.applyAccent -import com.vanced.manager.utils.InternetTools.openUrl -import com.vanced.manager.utils.MiuiHelper +import com.vanced.manager.utils.applyAccent +import com.vanced.manager.utils.isMiui +import com.vanced.manager.utils.openUrl object DialogContainer { @@ -23,12 +19,12 @@ object DialogContainer { dialog.dismiss() } setOnDismissListener { - if (MiuiHelper.isMiui()) { + if (isMiui()) { applyAccentMiuiDialog(context) } } setOnCancelListener { - if (MiuiHelper.isMiui()) { + if (isMiui()) { applyAccentMiuiDialog(context) } } @@ -112,39 +108,4 @@ object DialogContainer { } } - fun launchVanced(context: Context) { - val intent = Intent() - intent.component = - if (PreferenceManager.getDefaultSharedPreferences(context).getString("vanced_variant", "nonroot") == "root") - ComponentName("com.google.android.youtube", "com.google.android.youtube.HomeActivity") - else - ComponentName("com.vanced.android.youtube", "com.google.android.youtube.HomeActivity") - - MaterialAlertDialogBuilder(context).apply { - setTitle(context.getString(R.string.success)) - setMessage(context.getString(R.string.vanced_installed)) - setPositiveButton(context.getString(R.string.launch)) { _, _ -> - startActivity(context, intent, null) - } - setNegativeButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - create() - applyAccent() - } - } - - fun launchMusic(activity: Activity) { - val intent = Intent() - intent.component = ComponentName("com.vanced.android.youtube.music", "com.vanced.android.youtube.music.MusicActivity") - MaterialAlertDialogBuilder(activity).apply { - setTitle(activity.getString(R.string.success)) - setMessage(activity.getString(R.string.music_installed)) - setPositiveButton(activity.getString(R.string.launch)) { _, _ -> - startActivity(activity, intent, null) - } - setNegativeButton(activity.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } - create() - applyAccent() - } - } - } 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 index 2fd389d75a..46469c371b 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt @@ -16,10 +16,10 @@ 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.Extensions.toHex -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor -import com.vanced.manager.utils.ThemeHelper.mutableAccentColor +import com.vanced.manager.utils.accentColor +import com.vanced.manager.utils.defAccentColor +import com.vanced.manager.utils.mutableAccentColor +import com.vanced.manager.utils.toHex class ManagerAccentColorDialog : BindingDialogFragment() { @@ -43,12 +43,12 @@ class ManagerAccentColorDialog : BindingDialogFragment() { @@ -41,7 +41,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment(language).isChecked = true + root.findViewWithTag(language)?.isChecked = true languageSave.setOnClickListener { val newPref = binding.languageRadiogroup.getCheckedButtonTag() if (language != newPref) { 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 index 57cef02af4..75b3d548f8 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerThemeDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerThemeDialog.kt @@ -8,7 +8,7 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences import com.google.android.material.radiobutton.MaterialRadioButton import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.databinding.DialogManagerThemeBinding -import com.vanced.manager.utils.Extensions.getCheckedButtonTag +import com.vanced.manager.utils.getCheckedButtonTag class ManagerThemeDialog : BindingBottomSheetDialogFragment() { 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 index 78edb7d89b..d7127844ab 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerUpdateDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerUpdateDialog.kt @@ -17,8 +17,8 @@ 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.DownloadHelper.downloadProgress -import com.vanced.manager.utils.Extensions.applyAccent -import com.vanced.manager.utils.InternetTools.manager +import com.vanced.manager.utils.applyAccent +import com.vanced.manager.utils.manager class ManagerUpdateDialog : BindingDialogFragment() { 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 index 94849e142f..ecf26d3a79 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerVariantDialog.kt @@ -9,7 +9,7 @@ import com.google.android.material.radiobutton.MaterialRadioButton import com.topjohnwu.superuser.Shell import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.databinding.DialogManagerVariantBinding -import com.vanced.manager.utils.Extensions.getCheckedButtonTag +import com.vanced.manager.utils.getCheckedButtonTag class ManagerVariantDialog : BindingBottomSheetDialogFragment() { 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 index 5152c4cd87..dbb4b51a4d 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/MusicPreferencesDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/MusicPreferencesDialog.kt @@ -7,9 +7,9 @@ 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.Extensions.convertToAppVersions -import com.vanced.manager.utils.Extensions.getDefaultPrefs -import com.vanced.manager.utils.InternetTools.musicVersions +import com.vanced.manager.utils.convertToAppVersions +import com.vanced.manager.utils.getDefaultPrefs +import com.vanced.manager.utils.musicVersions class MusicPreferencesDialog : BindingBottomSheetDialogFragment() { 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 new file mode 100644 index 0000000000..3c45c9a03b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ServiceDTimerDialog.kt @@ -0,0 +1,61 @@ +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.getDefaultPrefs +import com.vanced.manager.utils.writeServiceDScript +import java.io.IOException +import java.util.* + +class ServiceDTimerDialog : BindingDialogFragment() { + + private val prefs by lazy { requireActivity().getDefaultPrefs() } + + 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 index 12d774b89b..f277d3f15a 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt @@ -11,8 +11,8 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager.getDefaultSharedPreferences import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.databinding.DialogCustomUrlBinding -import com.vanced.manager.utils.InternetTools.baseUrl -import com.vanced.manager.utils.InternetTools.loadJson +import com.vanced.manager.utils.baseUrl +import com.vanced.manager.utils.loadJson import kotlinx.coroutines.launch class URLChangeDialog : BindingDialogFragment() { 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 index f3318fc998..04ff5c1f1b 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt @@ -10,15 +10,14 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.LinearLayout import android.widget.Toast import androidx.core.content.edit -import androidx.core.content.res.ResourcesCompat 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.InternetTools.vanced -import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages +import com.vanced.manager.utils.getDefaultVancedLanguages +import com.vanced.manager.utils.vanced import java.util.* class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment() { @@ -72,7 +71,6 @@ class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment() { @@ -67,6 +64,11 @@ class VancedPreferencesDialog : BindingBottomSheetDialogFragment() { 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 index 9aeb90c2c7..23b9493e75 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/AboutFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/AboutFragment.kt @@ -16,7 +16,7 @@ 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.InternetTools.manager +import com.vanced.manager.utils.manager class AboutFragment : BindingFragment() { 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 index b65f3a911a..ef271d6a83 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/DevSettingsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/DevSettingsFragment.kt @@ -4,98 +4,112 @@ 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.appcompat.app.AlertDialog import androidx.core.content.edit import androidx.core.net.toUri -import androidx.preference.* +import androidx.core.view.isVisible +import androidx.preference.PreferenceManager.getDefaultSharedPreferences import com.crowdin.platform.Crowdin -import com.vanced.manager.BuildConfig.ENABLE_CROWDIN_AUTH -import com.vanced.manager.R +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.LanguageHelper.authCrowdin +import com.vanced.manager.utils.authCrowdin -class DevSettingsFragment: PreferenceFragmentCompat() { +class DevSettingsFragment : BindingFragment() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.dev_settings, rootKey) + private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } - val ftSwitch: Preference? = findPreference("firstlaunch_switch") + override fun binding( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ) = FragmentDevSettingsBinding.inflate(inflater, container, false) - val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) - ftSwitch?.setOnPreferenceClickListener { + override fun otherSetups() { + setHasOptionsMenu(true) + bindData() + } - AlertDialog.Builder(requireContext()) - .setTitle("FirstLaunch activated") - .setMessage("boolean will be activated on next app start") - .setPositiveButton("Restart") { _, _ -> - run { - startActivity(Intent(requireContext(), WelcomeActivity::class.java)) - activity?.finish() - } - } - .create() - .show() + 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) } - 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) } + } - if (ENABLE_CROWDIN_AUTH) { - findPreference("crowdin_pref_category")?.isVisible = true + private fun FragmentDevSettingsBinding.bindCrowdin() { + if (BuildConfig.ENABLE_CROWDIN_AUTH) { + val isAuthorized = Crowdin.isAuthorized() + crowdinCategory.isVisible = true - findPreference("crowdin_auth")?.isVisible = !Crowdin.isAuthorized() - findPreference("crowdin_upload_screenshot")?.isVisible = Crowdin.isAuthorized() - findPreference("crowdin_real_time")?.isVisible = Crowdin.isAuthorized() + crowdinAuth.isVisible = !isAuthorized + screenshotUploading.isVisible = isAuthorized + realTimeUpdates.isVisible = isAuthorized - findPreference("crowdin_auth")?.setOnPreferenceClickListener { + 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() + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + ("package:" + requireActivity().packageName).toUri() ) startActivityForResult(intent, 69) - return@setOnPreferenceClickListener true } Crowdin.authorize(requireActivity()) - true } } + } - findPreference("install_url")?.setOnPreferenceClickListener { - URLChangeDialog().show(childFragmentManager.beginTransaction(), "Install URL") - true - } - + private fun FragmentDevSettingsBinding.bindKernelArch() { val supportedAbis: Array = Build.SUPPORTED_ABIS - findPreference("device_arch")?.summary = + kernelArch.setSummary( if (supportedAbis.contains("arm64-v8a") || supportedAbis.contains("x86_64")) { "64bit" } else { "32bit" } - - findPreference("device_os")?.summary = "${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})" - - val forceUpdate: Preference? = findPreference("force_update") - forceUpdate?.setOnPreferenceClickListener { - ManagerUpdateDialog.newInstance(true).show( - requireActivity().supportFragmentManager, - "update_manager" - ) - true - } - + ) } + 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/HomeFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt index 2adc077693..88c9a54659 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/HomeFragment.kt @@ -28,7 +28,7 @@ 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.InternetTools.isFetching +import com.vanced.manager.utils.isFetching open class HomeFragment : BindingFragment() { 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 index f0cda94885..3f74ccd6b4 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt @@ -6,6 +6,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.ViewGroup import android.widget.Toast +import androidx.core.view.isVisible import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.recyclerview.widget.LinearLayoutManager import com.google.firebase.analytics.FirebaseAnalytics @@ -17,22 +18,23 @@ 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.Extensions.toHex -import com.vanced.manager.utils.LanguageHelper.getLanguageFormat -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor +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 + override fun binding( inflater: LayoutInflater, container: ViewGroup?, @@ -46,9 +48,11 @@ class SettingsFragment : BindingFragment() { private fun bindData() { with(binding) { + variant = prefs.getString("vanced_variant", "nonroot").toString() bindRecycler() bindFirebase() bindManagerVariant() + bindServiceDTimer() bindClearFiles() bindManagerTheme() bindManagerAccentColor() @@ -74,10 +78,18 @@ class SettingsFragment : BindingFragment() { private fun FragmentSettingsBinding.bindManagerVariant() { managerVariant.apply { - prefs.getString("vanced_variant", "nonroot")?.let { setSummary(it) } + 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()) { @@ -104,11 +116,11 @@ class SettingsFragment : BindingFragment() { } private fun FragmentSettingsBinding.bindManagerAccentColor() { - managerAccentColor.setSummary(prefs.getInt("manager_accent", defAccentColor).toHex()) - managerAccentColor.apply { + managerAccentColor.apply{ + setSummary(prefs.getInt("manager_accent_color", defAccentColor).toHex()) setOnClickListener { showDialog(ManagerAccentColorDialog()) } accentColor.observe(viewLifecycleOwner) { - managerAccentColor.setSummary(prefs.getInt("manager_accent", defAccentColor).toHex()) + setSummary(it.toHex()) } } } 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 index 072133b4fc..3ffa9b16ea 100644 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/AboutViewModel.kt +++ b/app/src/main/java/com/vanced/manager/ui/viewmodels/AboutViewModel.kt @@ -3,12 +3,12 @@ package com.vanced.manager.ui.viewmodels import android.app.Application import androidx.lifecycle.AndroidViewModel import com.vanced.manager.R -import com.vanced.manager.utils.InternetTools +import com.vanced.manager.utils.openUrl class AboutViewModel(application: Application): AndroidViewModel(application) { fun openUrl(url: String) { - InternetTools.openUrl(url, R.color.GitHub, getApplication()) + 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 index 2c8a4a471f..613a3c5e9a 100644 --- a/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/vanced/manager/ui/viewmodels/HomeViewModel.kt @@ -1,5 +1,9 @@ package com.vanced.manager.ui.viewmodels +import android.content.ActivityNotFoundException +import android.content.ComponentName +import android.content.Intent +import android.util.Log import android.view.View import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources @@ -17,19 +21,18 @@ 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.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.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.Extensions.show -import com.vanced.manager.utils.InternetTools -import com.vanced.manager.utils.InternetTools.loadJson import com.vanced.manager.utils.PackageHelper.apkExist import com.vanced.manager.utils.PackageHelper.musicApkExists import com.vanced.manager.utils.PackageHelper.uninstallApk @@ -41,12 +44,12 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { private val prefs = getDefaultSharedPreferences(activity) - val vanced = MutableLiveData() - val vancedRoot = MutableLiveData() - val microg = MutableLiveData() - val music = MutableLiveData() - val musicRoot = MutableLiveData() - val manager = MutableLiveData() + val vancedModel = MutableLiveData() + val vancedRootModel = MutableLiveData() + val microgModel = MutableLiveData() + val musicModel = MutableLiveData() + val musicRootModel = MutableLiveData() + val managerModel = MutableLiveData() fun fetchData() { viewModelScope.launch { @@ -68,12 +71,27 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { else -> R.color.Vanced } - InternetTools.openUrl(url, color, activity) + 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.d("VMHMV", e.toString()) + } + } fun openInstallDialog(view: View, app: String) { val variant = prefs.getString("vanced_variant", "nonroot") - if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microg.value?.isAppInstalled?.value!!) { + if (variant == "nonroot" && app != activity.getString(R.string.microg) && !microgModel.value?.isAppInstalled?.value!!) { microgToast.show() return } @@ -137,11 +155,11 @@ open class HomeViewModel(private val activity: FragmentActivity): ViewModel() { } init { - vanced.value = DataModel(InternetTools.vanced, activity, vancedPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced)) - vancedRoot.value = DataModel(InternetTools.vanced, activity, vancedRootPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced)) - music.value = DataModel(InternetTools.music, activity, musicPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music)) - musicRoot.value = DataModel(InternetTools.music, activity, musicRootPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music)) - microg.value = DataModel(InternetTools.microg, activity, microgPkg, activity.getString(R.string.microg), AppCompatResources.getDrawable(activity, R.drawable.ic_microg)) - manager.value = DataModel(InternetTools.manager, activity, managerPkg, activity.getString(R.string.app_name), AppCompatResources.getDrawable(activity, R.mipmap.ic_launcher)) + vancedModel.value = DataModel(vanced, activity, vancedPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced)) + vancedRootModel.value = RootDataModel(vanced, activity, vancedRootPkg, activity.getString(R.string.vanced), AppCompatResources.getDrawable(activity, R.drawable.ic_vanced), "vanced") + musicModel.value = DataModel(music, activity, musicPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music)) + musicRootModel.value = RootDataModel(music, activity, musicRootPkg, activity.getString(R.string.music), AppCompatResources.getDrawable(activity, R.drawable.ic_music), "music") + microgModel.value = DataModel(microg, activity, microgPkg, activity.getString(R.string.microg), AppCompatResources.getDrawable(activity, R.drawable.ic_microg)) + managerModel.value = DataModel(manager, activity, managerPkg, activity.getString(R.string.app_name), AppCompatResources.getDrawable(activity, R.mipmap.ic_launcher)) } } diff --git a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt index e59b9dfb2a..2ebbc562fc 100644 --- a/app/src/main/java/com/vanced/manager/utils/AppUtils.kt +++ b/app/src/main/java/com/vanced/manager/utils/AppUtils.kt @@ -9,7 +9,6 @@ import com.vanced.manager.R import com.vanced.manager.ui.dialogs.AppDownloadDialog import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.utils.DownloadHelper.downloadProgress -import com.vanced.manager.utils.InternetTools.getSha256 import kotlinx.coroutines.* import java.io.File import java.io.IOException @@ -92,7 +91,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) { context: Context, ): Boolean { val themeF = File(downloadPath, "$apk.apk") - return runBlocking { InternetTools.checkSHA256(getSha256(hashUrl, apk, context), themeF) } + return runBlocking { checkSHA256(getSha256(hashUrl, apk, context), themeF) } } private fun getErrorMessage(status: String, context: Context): String { @@ -111,7 +110,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) { status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va) status.contains("Path_Missing") -> context.getString(R.string.path_missing) else -> - if (MiuiHelper.isMiui()) + if (isMiui()) context.getString(R.string.installation_miui) else context.getString(R.string.installation_failed) @@ -127,7 +126,7 @@ object AppUtils: CoroutineScope by CoroutineScope(Dispatchers.IO) { PackageInstaller.STATUS_FAILURE_INVALID -> context.getString(R.string.installation_invalid) PackageInstaller.STATUS_FAILURE_STORAGE -> context.getString(R.string.installation_storage) else -> - if (MiuiHelper.isMiui()) + if (isMiui()) context.getString(R.string.installation_miui) else context.getString(R.string.installation_failed) diff --git a/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt b/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt index 0d8ad73d74..114f29a77e 100644 --- a/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt +++ b/app/src/main/java/com/vanced/manager/utils/DeviceUtils.kt @@ -2,12 +2,8 @@ package com.vanced.manager.utils import android.os.Build -object DeviceUtils { - - fun getArch(): String = when { - Build.SUPPORTED_ABIS.contains("x86") -> "x86" - Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a" - else -> "armeabi_v7a" - } - +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 index a761abb27d..10cd58a8b7 100644 --- a/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/DownloadHelper.kt @@ -7,36 +7,106 @@ import android.os.Build import android.util.Log import androidx.core.content.FileProvider import androidx.lifecycle.MutableLiveData -import com.github.kittinunf.fuel.Fuel import com.vanced.manager.R +import com.vanced.manager.library.network.providers.createService import com.vanced.manager.model.ProgressModel import com.vanced.manager.utils.AppUtils.sendCloseDialog import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.io.File +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) { - fun fuelDownload(url: String, fileFolder: String, fileName: String, context: Context, onDownloadComplete: () -> Unit, onError: (error: String) -> Unit) = launch { + 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 + ) { downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.downloading_file, fileName)) - downloadProgress.value?.currentDownload = Fuel.download(url) - .fileDestination { _, _ -> - File(context.getExternalFilesDir(fileFolder)?.path, fileName) - } - .progress { readBytes, totalBytes -> - downloadProgress.value?.downloadProgress?.postValue((readBytes * 100 / totalBytes).toInt()) + val downloadInterface = createService(DownloadHelper::class, baseUrl) + val download = downloadInterface.download(url) + downloadProgress.value?.currentDownload = download + download.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + CoroutineScope(Dispatchers.IO).launch { + if (response.body()?.let { writeFile(it, context.getExternalFilesDir(fileFolder)?.path + "/" + fileName) } == true) { + onDownloadComplete() + } else { + onError("Could not save file") + downloadProgress.value?.downloadProgress?.postValue(0) + Log.d("VMDownloader", "Failed to save file: $url") + } + } + } else { + onError(response.errorBody().toString()) + downloadProgress.value?.downloadProgress?.postValue(0) + Log.d("VMDownloader", "Failed to download file: $url") + } } - .responseString { _, _, result -> - result.fold(success = { + + override fun onFailure(call: Call, t: Throwable) { + if (call.isCanceled) { + Log.d("VMDownloader", "Download canceled") downloadProgress.value?.downloadProgress?.postValue(0) - onDownloadComplete() - }, failure = { error -> + } else { + onError(t.stackTraceToString()) downloadProgress.value?.downloadProgress?.postValue(0) - Log.d("VMDownloader", error.cause.toString()) - onError(error.errorData.toString()) - }) + Log.d("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.value?.downloadProgress?.postValue((downloadedBytes * 100 / totalBytes).toInt()) + } + outputStream.flush() + true + } catch (e: IOException) { + false + } finally { + inputStream?.close() + outputStream?.close() } + } catch (e: IOException) { + false + } } val downloadProgress = MutableLiveData() @@ -47,7 +117,7 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { fun downloadManager(context: Context) { val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk" - fuelDownload(url, "manager", "manager.apk", context, onDownloadComplete = { + 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) @@ -62,7 +132,12 @@ object DownloadHelper : CoroutineScope by CoroutineScope(Dispatchers.IO) { context.startActivity(intent) sendCloseDialog(context) }, onError = { - downloadProgress.value?.downloadingFile?.postValue(context.getString(R.string.error_downloading, "manager.apk")) + downloadProgress.value?.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 index a363ee9e7b..3df2bf6867 100644 --- a/app/src/main/java/com/vanced/manager/utils/Extensions.kt +++ b/app/src/main/java/com/vanced/manager/utils/Extensions.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.ContextWrapper import android.content.DialogInterface import android.content.SharedPreferences +import android.util.Log import android.widget.RadioGroup import androidx.core.graphics.ColorUtils import androidx.fragment.app.DialogFragment @@ -13,77 +14,84 @@ import androidx.preference.PreferenceManager.getDefaultSharedPreferences 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.InternetTools.baseUrl -import com.vanced.manager.utils.ThemeHelper.accentColor -import com.vanced.manager.utils.ThemeHelper.defAccentColor import java.util.* -object Extensions { +fun RadioGroup.getCheckedButtonTag(): String? { + return findViewById(checkedRadioButtonId)?.tag?.toString() +} - fun RadioGroup.getCheckedButtonTag(): String? { - return findViewById(checkedRadioButtonId)?.tag?.toString() - } - - fun DialogFragment.show(activity: FragmentActivity) { +fun DialogFragment.show(activity: FragmentActivity) { + try { show(activity.supportFragmentManager, "") + } catch (e: Exception) { + Log.d("VMUI", e.stackTraceToString()) } - fun Context.getDefaultPrefs(): SharedPreferences = getDefaultSharedPreferences(this) +} - //Not sure how much this can affect performance - //but if anyone can improve this even slightly, - //feel free to open a PR - fun List.convertToAppVersions(): List { - val versionsModel = arrayListOf("latest") - for (i in reversed().indices) { - versionsModel.add(this[i]) - } - return versionsModel - } +fun Context.getDefaultPrefs(): SharedPreferences = getDefaultSharedPreferences(this) - fun String.convertToAppTheme(context: Context): String { - return context.getString(R.string.light_plus_other, this.capitalize(Locale.ROOT)) +//Not sure how much this can affect performance +//but if anyone can improve this even slightly, +//feel free to open a PR +fun List.convertToAppVersions(): List { + val versionsModel = arrayListOf("latest") + for (i in reversed().indices) { + versionsModel.add(this[i]) } + return versionsModel +} - fun String.getLatestAppVersion(versions: List): String { - return if (this == "latest") versions.reversed()[0] else this - } +fun String.convertToAppTheme(context: Context): String { + return context.getString(R.string.light_plus_other, this.capitalize(Locale.ROOT)) +} - fun SharedPreferences.getInstallUrl() = getString("install_url", baseUrl) +fun String.getLatestAppVersion(versions: List): String { + return if (this == "latest") versions.reversed()[0] else this +} - fun Context.lifecycleOwner(): LifecycleOwner? { - var curContext = this - var maxDepth = 20 - while (maxDepth-- > 0 && curContext !is LifecycleOwner) { - curContext = (curContext as ContextWrapper).baseContext - } - return if (curContext is LifecycleOwner) { - curContext - } else { - null - } +fun SharedPreferences.getInstallUrl() = getString("install_url", baseUrl) + +fun Context.lifecycleOwner(): LifecycleOwner? { + var curContext = this + var maxDepth = 20 + while (maxDepth-- > 0 && curContext !is LifecycleOwner) { + curContext = (curContext as ContextWrapper).baseContext } + return if (curContext is LifecycleOwner) { + curContext + } else { + null + } +} - fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) +fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) - //Material team decided to keep their LinearProgressIndicator final - //At least extension methods exist - fun LinearProgressIndicator.applyAccent() { - with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) { - setIndicatorColor(this) - trackColor = ColorUtils.setAlphaComponent(this, 70) - } +//Material team decided to keep their LinearProgressIndicator final +//At least extension methods exist +fun LinearProgressIndicator.applyAccent() { + with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) { + setIndicatorColor(this) + trackColor = ColorUtils.setAlphaComponent(this, 70) } +} - fun MaterialAlertDialogBuilder.applyAccent() { - with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) { - show().apply { - getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with) - getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with) - getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(this@with) - } +fun MaterialAlertDialogBuilder.applyAccent() { + with(accentColor.value ?: context.getDefaultPrefs().getInt("manager_accent_color", defAccentColor)) { + show().apply { + getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(this@with) + getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(this@with) + getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(this@with) } } +} -} \ No newline at end of file +fun Context.writeServiceDScript(apkFPath: String, path: String, app: String) { + val shellFileZ = SuFile.open("/data/adb/service.d/$app.sh") + shellFileZ.createNewFile() + val code = """#!/system/bin/sh${"\n"}while [ "`getprop sys.boot_completed | tr -d '\r' `" != "1" ]; do sleep ${getDefaultPrefs().getInt("serviced_sleep_timer", 1)}; done${"\n"}chcon u:object_r:apk_data_file:s0 $apkFPath${"\n"}mount -o bind $apkFPath $path""" + SuFileOutputStream(shellFileZ).use { out -> out.write(code.toByteArray())} +} diff --git a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt b/app/src/main/java/com/vanced/manager/utils/InternetTools.kt index 1224c8c2e0..82d7d45e66 100644 --- a/app/src/main/java/com/vanced/manager/utils/InternetTools.kt +++ b/app/src/main/java/com/vanced/manager/utils/InternetTools.kt @@ -1,8 +1,10 @@ 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 @@ -13,29 +15,27 @@ 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.Extensions.getDefaultPrefs import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File import java.util.* -object InternetTools { +private const val TAG = "VMNetTools" - private const val TAG = "VMNetTools" +val vanced = MutableLiveData() +val music = MutableLiveData() +val microg = MutableLiveData() +val manager = MutableLiveData() - val vanced = MutableLiveData() - val music = MutableLiveData() - val microg = MutableLiveData() - val manager = MutableLiveData() +val vancedVersions = MutableLiveData>() +val musicVersions = MutableLiveData>() - val vancedVersions = MutableLiveData>() - val musicVersions = MutableLiveData>() +val isFetching = MutableLiveData() - val isFetching = MutableLiveData() +//var braveTiers = MutableLiveData() - //var braveTiers = MutableLiveData() - - fun openUrl(url: String, color: Int, context: Context) { +fun openUrl(url: String, color: Int, context: Context) { + try { val customTabPrefs = getDefaultSharedPreferences(context).getBoolean("use_custom_tabs", true) if (customTabPrefs) { val builder = CustomTabsIntent.Builder() @@ -46,61 +46,63 @@ object InternetTools { customTabsIntent.launchUrl(context, url.toUri()) } else context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) - } - fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length) - - suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { - isFetching.postValue(true) - val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) - 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 = JsonHelper.getJson("$installUrl/latest.json?$fetchTime") - val versions = JsonHelper.getJson("$installUrl/versions.json?$fetchTime") + } catch (e: ActivityNotFoundException) { + Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show() + } +} + +fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/') + 1, url.length) + +suspend fun loadJson(context: Context) = withContext(Dispatchers.IO) { + isFetching.postValue(true) + val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) + 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("$installUrl/latest.json?$fetchTime") + val versions = getJson("$installUrl/versions.json?$fetchTime") // braveTiers.apply { // set(getJson("$installUrl/sponsor.json")) // notifyChange() // } - 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) + 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 { + val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) + return try { + getJson("$installUrl/$file")?.string(obj) ?: context.getString(R.string.unavailable) + } catch (e: Exception) { + Log.e(TAG, "Error: ", e) + context.getString(R.string.unavailable) } - - private suspend fun getJsonString(file: String, obj: String, context: Context): String { - val installUrl = context.getDefaultPrefs().getString("install_url", baseUrl) - return try { - JsonHelper.getJson("$installUrl/$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 } +} - 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://vancedapp.com/api/v1" - -} \ No newline at end of file +const val baseUrl = "https://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 index 40db24d927..d140f163b1 100644 --- a/app/src/main/java/com/vanced/manager/utils/JsonHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/JsonHelper.kt @@ -7,32 +7,28 @@ import com.beust.klaxon.Parser import com.github.kittinunf.fuel.coroutines.awaitString import com.github.kittinunf.fuel.httpGet -object JsonHelper { +private var dataMap: HashMap = HashMap() - 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 +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 +private suspend fun getSuspendJson(url: String): JsonObject = + Parser.default().parse( + StringBuilder(url.httpGet().awaitString()) + ) as JsonObject -} \ No newline at end of file +suspend fun getJsonArray(url: String): JsonArray = + Klaxon().parseArray( + url.httpGet().awaitString() + ) as JsonArray diff --git a/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt b/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt index 08c1fd52c5..54c927e73c 100644 --- a/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/LanguageHelper.kt @@ -11,73 +11,68 @@ import android.provider.Settings import androidx.annotation.RequiresApi import com.crowdin.platform.Crowdin import com.vanced.manager.R -import com.vanced.manager.utils.InternetTools.vanced import java.util.* -object LanguageHelper { - - fun getLanguageFormat(context: Context, language: String): String { - return when { - language == "System Default" -> context.getString(R.string.system_default) - language.length > 2 -> { - val loc = Locale( - language.substring(0, language.length - 3), - language.substring(language.length - 2) - ) - loc.getDisplayName(loc).capitalize(Locale.ENGLISH) - } - else -> { - val loc = Locale(language) - loc.getDisplayName(loc).capitalize(Locale.ENGLISH) - } +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(", ") +@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) + } } - @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 + 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.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) - } +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 index 07fe962406..5b02ab4882 100644 --- a/app/src/main/java/com/vanced/manager/utils/MiuiHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/MiuiHelper.kt @@ -4,22 +4,19 @@ import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader -object MiuiHelper { +private const val MIUI_PROP_NAME = "ro.miui.ui.version.name" - private const val MIUI_PROP_NAME = "ro.miui.ui.version.name" +fun isMiui(): Boolean = !getSystemProps(MIUI_PROP_NAME).isNullOrEmpty() - fun isMiui(): Boolean = !getSystemProps(MIUI_PROP_NAME).isNullOrEmpty() - - private fun getSystemProps(propname: String): String? { - var input: BufferedReader? = null - return try { - val process = Runtime.getRuntime().exec("getprop $propname") - input = BufferedReader(InputStreamReader(process.inputStream), 1024) - input.readLine() - } catch (e: IOException) { - null - } finally { - input?.close() - } +private fun getSystemProps(propname: String): String? { + var input: BufferedReader? = null + return try { + val process = Runtime.getRuntime().exec("getprop $propname") + input = BufferedReader(InputStreamReader(process.inputStream), 1024) + input.readLine() + } catch (e: IOException) { + null + } finally { + input?.close() } } \ 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 index 2668e2c995..7315dc5f71 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -10,7 +10,6 @@ import android.os.Build import android.util.Log import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile -import com.topjohnwu.superuser.io.SuFileOutputStream import com.vanced.manager.BuildConfig import com.vanced.manager.core.installer.AppInstallerService import com.vanced.manager.core.installer.AppUninstallerService @@ -19,8 +18,6 @@ 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 com.vanced.manager.utils.InternetTools.music -import com.vanced.manager.utils.InternetTools.vanced import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -33,7 +30,8 @@ import kotlin.collections.HashMap object PackageHelper { - private const val apkInstallPath = "/data/adb" + const val apkInstallPath = "/data/adb" + private const val INSTALLER_TAG = "VMInstall" private val vancedThemes = arrayOf("black", "dark", "pink", "blue") init { @@ -45,7 +43,7 @@ object PackageHelper { ) } - private fun getAppName(pkg: String): String { + private fun getAppNameRoot(pkg: String): String { return when (pkg) { vancedRootPkg -> "vanced" musicRootPkg -> "music" @@ -53,6 +51,23 @@ object PackageHelper { } } + 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) @@ -127,7 +142,7 @@ object PackageHelper { } fun uninstallRootApk(pkg: String): Boolean { - val app = getAppName(pkg) + 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() @@ -188,6 +203,7 @@ object PackageHelper { val modApk: FileInfo? = fileInfoList.lastOrNull { modApkBool(it.name) } if (modApk != null) { if (overwriteBase(modApk, fileInfoList, appVerCode, pkg, app, context)) { + Log.d(INSTALLER_TAG, "Finished installation") sendRefresh(context) sendCloseDialog(context) } @@ -236,7 +252,7 @@ object PackageHelper { try { for (listOfFile in listOfFiles!!) { if (listOfFile.isFile) { - Log.d("AppLog", "installApk: " + listOfFile.name) + Log.d(INSTALLER_TAG, "installApk: " + listOfFile.name) nameSizeMap[listOfFile.name] = listOfFile.length() totalSize += listOfFile.length() } @@ -249,12 +265,12 @@ object PackageHelper { installParams.setSize(totalSize) try { sessionId = context.packageManager.packageInstaller.createSession(installParams) - Log.d("AppLog","Success: created install session [$sessionId]") + Log.d(INSTALLER_TAG,"Success: created install session [$sessionId]") for ((key, value) in nameSizeMap) { doWriteSession(sessionId, apkFolderPath + key, value, key, context) } doCommitSession(sessionId, context) - Log.d("AppLog","Success") + Log.d(INSTALLER_TAG,"Success") } catch (e: IOException) { e.printStackTrace() } @@ -291,10 +307,10 @@ object PackageHelper { out.write(buffer, 0, c) } session.fsync(out) - Log.d("AppLog", "Success: streamed $total bytes") + Log.d(INSTALLER_TAG, "Success: streamed $total bytes") return PackageInstaller.STATUS_SUCCESS } catch (e: IOException) { - Log.e("AppLog", "Error: failed to write; " + e.message) + Log.e(INSTALLER_TAG, "Error: failed to write; " + e.message) return PackageInstaller.STATUS_FAILURE } finally { try { @@ -316,9 +332,9 @@ object PackageHelper { val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0) session.commit(pendingIntent.intentSender) session.close() - Log.d("AppLog", "install request sent") - Log.d("AppLog", "doCommitSession: " + context.packageManager.packageInstaller.mySessions) - Log.d("AppLog", "doCommitSession: after session commit ") + Log.d(INSTALLER_TAG, "install request sent") + Log.d(INSTALLER_TAG, "doCommitSession: " + context.packageManager.packageInstaller.mySessions) + Log.d(INSTALLER_TAG, "doCommitSession: after session commit ") } catch (e: IOException) { e.printStackTrace() } @@ -331,7 +347,7 @@ object PackageHelper { private fun installSplitApkFiles(apkFiles: ArrayList, context: Context) : Boolean { var sessionId: Int? val filenames = arrayOf("black.apk", "dark.apk", "blue.apk", "pink.apk", "hash.json") - Log.d("AppLog", "installing split apk files: $apkFiles") + Log.d(INSTALLER_TAG, "installing split apk files: $apkFiles") run { val sessionIdResult = Shell.su("pm install-create -r -t").exec().out val sessionIdPattern = Pattern.compile("(\\d+)") @@ -341,7 +357,7 @@ object PackageHelper { } apkFiles.forEach { apkFile -> if (!filenames.any { apkFile.name == it }) { - Log.d("AppLog", "installing APK: ${apkFile.name} ${apkFile.fileSize}") + Log.d(INSTALLER_TAG, "installing APK: ${apkFile.name} ${apkFile.fileSize}") val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name) val process: Process = Runtime.getRuntime().exec(command) val inputPipe = apkFile.getInputStream() @@ -353,12 +369,13 @@ object PackageHelper { else process.destroy() - throw RuntimeException(e) + sendFailure(e.stackTrace.map { it.toString() }.toMutableList(), context) + sendCloseDialog(context) } process.waitFor() } } - Log.d("AppLog", "committing...") + Log.d(INSTALLER_TAG, "committing...") val installResult = Shell.su("pm install-commit $sessionId").exec() if (installResult.isSuccess) { return true @@ -432,7 +449,7 @@ object PackageHelper { 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)) { + if (setupScript(apkFPath, path, app, pkg, context)) { return linkApp(apkFPath, pkg, path) } } @@ -443,26 +460,21 @@ object PackageHelper { return false } - private fun setupScript(apkFPath: String, path: String, app: String, pkg: String): Boolean + private fun setupScript(apkFPath: String, path: String, app: String, pkg: String, context: Context): Boolean { - - val shellFileZ = SuFile.open("/data/adb/service.d/$app.sh") - shellFileZ.createNewFile() - - val code = """#!/system/bin/sh${"\n"}while [ "`getprop sys.boot_completed | tr -d '\r' `" != "1" ]; do sleep 1; done${"\n"}mount -o bind $apkFPath $path""" - if (shellFileZ.exists()) { - try { - SuFileOutputStream(shellFileZ).use { out -> out.write(code.toByteArray())} - 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) { - e.printStackTrace() - } + try { + Log.d(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) { + e.printStackTrace() } return false } - private fun linkApp(apkFPath: String, pkg:String, path: String): Boolean { + private fun linkApp(apkFPath: String, pkg: String, path: String): Boolean { + Log.d(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() @@ -477,6 +489,7 @@ object PackageHelper { //check version and perform action based on result private fun checkVersion(versionCode: Int, baseApkFiles: ArrayList, pkg: String, context: Context): Boolean { + Log.d(INSTALLER_TAG, "Checking stock version") val path = getPackageDir(context, pkg) if (path != null) { if (path.contains("/data/app/")) { @@ -495,7 +508,7 @@ object PackageHelper { return try { context.packageManager.getPackageInfo(pkg, 0) } catch (e:Exception) { - Log.d("VMpm", "Unable to get package info") + Log.d(INSTALLER_TAG, "Unable to get package info") null } } @@ -510,6 +523,7 @@ object PackageHelper { //uninstall current update and install base that works with patch private fun fixHigherVer(apkFiles: ArrayList, pkg: String, context: Context) : Boolean { + Log.d(INSTALLER_TAG, "Downgrading stock") if (uninstallRootApk(pkg)) { return if (pkg == vancedRootPkg) installSplitApkFiles(apkFiles, context) else installRootMusic(apkFiles, context) } @@ -520,12 +534,14 @@ object PackageHelper { //install stock youtube matching vanced version private fun installStock(baseApkFiles: ArrayList, pkg: String, context: Context): Boolean { + Log.d(INSTALLER_TAG, "Installing stock") return if (pkg == vancedRootPkg) installSplitApkFiles(baseApkFiles, context) else installRootMusic(baseApkFiles, context) } //set chcon to apk_data_file - private fun chConV(path: String, context: Context): Boolean { - val response = Shell.su("chcon u:object_r:apk_data_file:s0 $path").exec() + private fun chConV(apkFPath: String, context: Context): Boolean { + Log.d(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 @@ -538,6 +554,7 @@ object PackageHelper { //move patch to data/app private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context) : Boolean { + Log.d(INSTALLER_TAG, "Moving app") val apkinF = SuFile.open(apkFile) val apkoutF = SuFile.open(path) @@ -603,7 +620,7 @@ object PackageHelper { } //get path of the installed youtube - private fun getPackageDir(context: Context, pkg: String): String? + fun getPackageDir(context: Context, pkg: String): String? { val p = getPkgInfo(pkg, context) return if(p != null) diff --git a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt b/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt index e53b769e06..75b844bf88 100644 --- a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt @@ -5,27 +5,22 @@ import android.content.res.Configuration import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.vanced.manager.R -import com.vanced.manager.utils.Extensions.getDefaultPrefs -object ThemeHelper { +const val defAccentColor: Int = -13732865 - const val defAccentColor: Int = -13732865 +val mutableAccentColor = MutableLiveData() +val accentColor: LiveData = mutableAccentColor - val mutableAccentColor = MutableLiveData() - val accentColor: LiveData = mutableAccentColor - - fun Activity.setFinalTheme() { - when (getDefaultPrefs().getString("manager_theme", "System Default")) { - "Light" -> setTheme(R.style.LightTheme) - "Dark" -> setTheme(R.style.DarkTheme) - "System Default" -> { - when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { - Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme) - Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme) - } +fun Activity.setFinalTheme() { + when (getDefaultPrefs().getString("manager_theme", "System Default")) { + "Light" -> setTheme(R.style.LightTheme) + "Dark" -> setTheme(R.style.DarkTheme) + "System Default" -> { + when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { + Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme) + Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme) } - else -> setTheme(R.style.LightTheme) } + else -> setTheme(R.style.LightTheme) } - } \ 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 index c225b237dc..b316b5cca4 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_splash.png and b/app/src/main/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_splash.png b/app/src/main/res/drawable-mdpi/ic_splash.png index dc798b359e..bf18b1efc1 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_splash.png and b/app/src/main/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index b0fc01651e..02167e63f9 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -4,21 +4,21 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + + android:pathData="M147.4,131.8l-29.2,-16.9c-3.8,-2.2 -8.5,0.6 -8.5,4.9v33.7c0,4.4 4.8,7.1 8.5,4.9l29.2,-16.9C151.3,139.5 151.3,134 147.4,131.8z"> @@ -26,79 +26,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:pathData="M121.3,69.6c-2.3,-2.9 -2.8,-7 -0.8,-10.3l0.2,-0.4c2.5,-4.3 8,-5.8 12.4,-3.2l22.2,14.3c-15.7,-0.5 -29.3,-0.5 -29.3,-0.5S124.2,69.6 121.3,69.6zM232.5,120l-15.8,-10.3c0.5,6.7 0.7,13.4 1,18.5l1.3,0.8c6.2,3.7 6.1,12.7 -0.1,16.3l-1.3,0.7l-94.3,55.8c-1,0.6 -1.8,1.3 -2.5,2.2l0,0c-2.3,2.9 -2.8,6.8 -0.8,10.2l0.2,0.4c2.5,4.3 8,5.9 12.4,3.4l22.7,-14.4l61.6,-39l15.8,-10.1C245,146.4 245.1,128 232.5,120z"> + @@ -106,64 +40,36 @@ - - - - - - - - - - - - - - - + android:pathData="M145,134.6m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" + android:fillColor="#FFFFFF"/> + android:pathData="M207.2,101c-0.8,0 -1.6,-0.6 -1.8,-1.4c-0.1,-0.6 -0.2,-1.1 -0.4,-1.6c-1.4,-5.6 -5.3,-10.4 -10.4,-13.2c-1.4,-0.8 -3,-1.4 -4.6,-1.8c-0.8,-0.2 -1.7,-0.4 -2.5,-0.6c-0.7,-0.1 -2.3,-0.4 -3.8,-0.6c-1,-0.1 -1.7,-1.1 -1.6,-2s1.1,-1.7 2,-1.6c2,0.2 3.8,0.6 4,0.6l0,0c0.8,0.1 1.8,0.4 2.6,0.6l0,0c1.8,0.5 3.6,1.2 5.3,2.2c6,3.2 10.4,8.9 12.1,15.5c0.1,0.6 0.2,1.1 0.5,1.8c0.2,1 -0.4,1.9 -1.3,2.2C207.4,101 207.3,101 207.2,101z"> - + - + android:pathData="M208.4,105.1m-1.9,0a1.9,1.9 0,1 1,3.8 0a1.9,1.9 0,1 1,-3.8 0" + android:fillColor="#953A9A"/> + android:pathData="M45.6,171.8c0.8,0 1.6,0.6 1.8,1.4c0.1,0.6 0.2,1.1 0.4,1.7c1.4,5.6 5.3,10.4 10.4,13.2c1.4,0.7 3,1.3 4.6,1.8c0.8,0.2 1.7,0.4 2.5,0.6c0.7,0.1 2.2,0.4 3.8,0.6c1,0.1 1.7,1.1 1.6,2s-1.1,1.7 -2,1.6c-2,-0.2 -3.8,-0.6 -4,-0.6l0,0c-0.8,-0.1 -1.8,-0.4 -2.6,-0.6l0,0c-1.8,-0.5 -3.6,-1.2 -5.3,-2.2c-6,-3.2 -10.4,-8.9 -12.2,-15.5c-0.1,-0.6 -0.2,-1.1 -0.5,-1.8c-0.2,-1 0.4,-1.9 1.3,-2.2C45.3,171.8 45.4,171.8 45.6,171.8z"> @@ -171,7 +77,7 @@ + android:pathData="M44.148,169.66a1.9,1.9 46.907,1 0,0.126 -3.798a1.9,1.9 46.907,1 0,-0.126 3.798z" + android:fillColor="#FF0032"/> diff --git a/app/src/main/res/drawable-xhdpi/ic_splash.png b/app/src/main/res/drawable-xhdpi/ic_splash.png index e0a3f1ecda..25f4b20c29 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_splash.png and b/app/src/main/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash.png b/app/src/main/res/drawable-xxhdpi/ic_splash.png index 17e536d939..e69473a5f9 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_splash.png and b/app/src/main/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/main/res/drawable/category_background.xml b/app/src/main/res/drawable/category_background.xml index 0e76d18daa..aec7c85466 100644 --- a/app/src/main/res/drawable/category_background.xml +++ b/app/src/main/res/drawable/category_background.xml @@ -3,10 +3,10 @@ android:shape="rectangle"> + android:topRightRadius="12dp" + android:topLeftRadius="12dp" + android:bottomRightRadius="12dp" + android:bottomLeftRadius="12dp" /> diff --git a/app/src/main/res/drawable/ic_baseline_launch_24.xml b/app/src/main/res/drawable/ic_baseline_launch_24.xml new file mode 100644 index 0000000000..455b503a1f --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_launch_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_microg.xml b/app/src/main/res/drawable/ic_microg.xml index bd3f988beb..4dc2ba1eaf 100644 --- a/app/src/main/res/drawable/ic_microg.xml +++ b/app/src/main/res/drawable/ic_microg.xml @@ -1,22 +1,44 @@ - - + + + + + + + + + + + + + + + + + + + - - - + + + - + + - - - + + + diff --git a/app/src/main/res/layout/dialog_serviced_timer.xml b/app/src/main/res/layout/dialog_serviced_timer.xml new file mode 100644 index 0000000000..f08de4b37e --- /dev/null +++ b/app/src/main/res/layout/dialog_serviced_timer.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_dev_settings.xml b/app/src/main/res/layout/fragment_dev_settings.xml new file mode 100644 index 0000000000..a4a4e3b4d8 --- /dev/null +++ b/app/src/main/res/layout/fragment_dev_settings.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 index f048e32d51..d93370b6b4 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,9 +1,11 @@ - + android:layout_height="match_parent" + app:progressBackgroundColor="?colorSurface"> @@ -36,15 +37,13 @@ android:id="@+id/recycler_sponsors" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginEnd="8dp" - android:layout_marginStart="8dp" android:nestedScrollingEnabled="false" tools:itemCount="2" tools:listitem="@layout/view_sponsor" /> @@ -57,6 +56,9 @@ android:paddingBottom="8dp" tools:itemCount="6" tools:listitem="@layout/view_social_link" /> + + - + + diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index dcc47043f1..c919120efd 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -49,11 +49,20 @@ android:layout_height="wrap_content" app:preference_title="@string/variant" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_app.xml b/app/src/main/res/layout/view_app.xml index bde7a81c38..5a1813efde 100644 --- a/app/src/main/res/layout/view_app.xml +++ b/app/src/main/res/layout/view_app.xml @@ -7,11 +7,11 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" app:cardBackgroundColor="?colorLinkBG" - app:cardCornerRadius="16dp" + app:cardCornerRadius="12dp" app:cardElevation="0dp" app:contentPaddingBottom="4dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" + app:contentPaddingLeft="12dp" + app:contentPaddingRight="12dp" app:contentPaddingTop="8dp"> + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index cecfee8115..d8e1e247f2 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 2c5e10fa19..2939087278 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index d27bf07f83..2e0eab0941 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index e8f96b609d..664bad5a88 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index ab7d54d7ae..c8b4b43aa6 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index c5b1372b8a..44775905d5 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 565583e149..fc8a7449d1 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 5695bf3b3b..a8e772b462 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index e25c2f93a1..d80867cbc5 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 94a4d49c11..ee276aac2b 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index 7dddf534a4..b6562849dd 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -1,7 +1,7 @@ - Cancel + What is your favourite song Maak toe Herstel Stoor @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 190b879021..903c0c7063 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -51,10 +51,12 @@ استخدم علامات تبويب مخصصة لمتصفح كروم سيتم فتح الروابط في علامات تبويب مخصصة لمتصفح كروم الوضع الافتراضي + فشل حفظ قيمة الوقت الجديد + Script sleep time للروت + ضبط القيمة الزمنية للنوم المستخدمة في /data/adb/service.d/app.sh script، مفيد لإصلاح مشاكل التركيب السمة السمة الداكنة السمة الفاتحة - تحديث رابط القناة إشعارات %1$s تلقي الإشعارات عند إصدار تحديث لـ %1$s مركز التحديث @@ -102,7 +104,7 @@ فشل التثبيت لأن المستخدم ألغى التثبيت. فشل التثبيت لأن المستخدم قام بحظر التثبيت. فشل التثبيت لأن المستخدم حاول تثبيت إصدار قديم. قم بألغاء تثبيت التحديثات الخاصة باليوتيوب الأصلي، ثم حاول مرة أخرى. - فشل التثبيت لأن التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من ڤانسد، ثم حاول مرة أخرى. + فشل التثبيت، لأن هذا التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى. فشل التثبيت لأسباب غير معروفة، انضم إلى التيليجرام أو الديسكورد الخاص بنا لمزيد من الدعم. فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. امسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى. فشل التثبيت لأن حزم التثبيت تالفة، الرجاء المحاولة مرة أخرى. diff --git a/app/src/main/res/values-az-rAZ/strings.xml b/app/src/main/res/values-az-rAZ/strings.xml index 530fde020e..3fb7e5fd8f 100644 --- a/app/src/main/res/values-az-rAZ/strings.xml +++ b/app/src/main/res/values-az-rAZ/strings.xml @@ -36,7 +36,7 @@ Bizi dəstəklə Tema rəngi - Mavi + Göy Yaşıl Bənövşəyi Qırmızı @@ -51,10 +51,12 @@ Chrome Özəl Vərəqlərini istifadə et Bağlantılar Chrome Özəl Vərəqlərində açılacaq İlkin Sistem + 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 Tema Tünd mövzu Açıq mövzu - Yeniləmə Kanal URL-si %1$s Ani Bildirişlər %1$s üçün yeni buraxılış olanda ani bildirişlər alın Menecer Yeniləmə Mərkəzi @@ -102,7 +104,7 @@ İstifadəçi quraşdırmanı ləğv etdiyi üçün quraşdırılma uğursuz oldu. İstifadəçi quraşdırmanı əngəllədiyi üçün quraşdırılma uğursuz oldu. İ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. - 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. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Bilinməyən səbəblərə görə quraşdırılma uğursuz oldu. Dəstək üçün Telegram və ya Discord-a qoşulun. 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. diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index ac623399a5..22642aea3e 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -36,11 +36,11 @@ Support us অ্যাকসেন্ট রঙ - নীল - সবুজ - বেগুনী - লাল - হলুদ + Blue + Green + Purple + Red + Yellow চেহারা আচরণ ডাউনলোড করা ফাইলগুলি সাফ করুন @@ -51,10 +51,12 @@ ক্রোম কাস্টম ট্যাবস ব্যবহার করুন লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খোলা হবে সিস্টেম দ্বারা নির্ধারিত + 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 থিম গাঢ় থিম হালকা থিম - চ্যানেল URL আপডেট করুন %1$s পুশ বিজ্ঞপ্তি %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান ম্যানেজার আপডেট কেন্দ্র @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন।. ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।. অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।. diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 25eb5d8a46..54ec1014de 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -32,13 +32,13 @@ রুট অনুমতি দেয়া হয়নি অনুপলব্ধ আপডেট - Social Media - Support us + সামাজিক মাধ্যম + আমাদের সমর্থন অ্যাকসেন্ট রঙ নীল সবুজ - বেগুনী + বেগুনি লাল হলুদ রূপ @@ -51,10 +51,12 @@ ক্রোম কাস্টম ট্যাবস ব্যবহার করুন লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে সিস্টেম দ্বারা র্নির্ধারিত + নতুন সময়ের মান সংরক্ষণ করতে ব্যর্থ + রুট স্ক্রিপ্ট ঘুম সময় + মাউন্টিং ইস্যু সমাধানের জন্য দরকারী /data/adb/service.d/app.sh স্ক্রিপ্টে ব্যবহৃত ঘুমের মানটি সামঞ্জস্য করুন থিম গাঢ় থিম হালকা থিম - চ্যানেল URL আপডেট করুন %1$s পুশ বিজ্ঞপ্তিগুলি %1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তি পান ম্যানেজার আপডেট কেন্দ্র @@ -96,13 +98,13 @@ System owner কে APK `chown` করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। %1$s ডাউনলোড করার সময় ত্রুটি %1$s পেকেজ আন‌ইনস্টল করা যাইনি - Failed to apply new accent color + নতুন অ্যাকসেন্ট রঙ প্রয়োগ করতে ব্যর্থ ইনস্টলেশনের জন্য প্রয়োজনীয় ফাইলগুলি খুঁজে পাওয়া যায় নি। ইনস্টল করার জন্য ফাইলগুলি পুনরায় ডাউনলোড করুন, তারপরে আবার চেষ্টা করুন। স্টোরেজ থেকে কালো/গাঢ় থিমের জন্য এপিকে ফাইল সনাক্ত করতে ব্যর্থ, দয়া করে আবার চেষ্টা করুন। ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা বাতিল করে দিয়েছেন। ইনস্টল করা যায়নি কারণ ব্যবহারকারী ইনস্টল করা অবরুদ্ধ করেছেন। ইনস্টল করা যায়নি কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করছিলেন। স্টক ইউটিউব অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন। - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব রয়েছে ts অ্যাপ্লিকেশনটির বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।. অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন। ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন। diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index 3ac8a67cff..4218bcff1d 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -36,11 +36,11 @@ Support us Color d\'èmfasi - Blau - Verd - Porpra - Vermell - Groc + Blue + Green + Purple + Red + Yellow Appearance Behavior Esborrar fitxers descarregats @@ -51,10 +51,12 @@ Utilitza pestanyes personalitzades del Chrome Els enllaços s\'obriran en pestanyes personalitzades del Chrome System Default + 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 Tema Tema fosc Tema clar - Actualitza la URL del canal %1$s notificacions automàtiques Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s Gestor d\'actualitzacions @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. La instal·lació ha fallat per motius desconeguts. Uniu-vos al nostre Telegram o Discord per obtenir més assistència. 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. diff --git a/app/src/main/res/values-ckb-rIR/strings.xml b/app/src/main/res/values-ckb-rIR/strings.xml index 6348d3c45a..c7dee0ea3c 100644 --- a/app/src/main/res/values-ckb-rIR/strings.xml +++ b/app/src/main/res/values-ckb-rIR/strings.xml @@ -32,8 +32,8 @@ ڕێگەپێدانی Root نەدراوە بەردەست نیە نوێکردنەوە - Social Media - Support us + تۆڕە کۆمەڵایەتییەکان + پشتگیریکردن ڕەنگی سەرەکی شین @@ -51,10 +51,12 @@ بەکارهێنانی پەنجەرەی تایبەتی گۆگڵ کرۆم بەستەرەکان لە پەنجەرەی تایبەتی گۆگڵ کرۆمدا دەکرێنەوە سیستەم + 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 بەردەست کرا ناوەندی نوێکردنەوە @@ -96,13 +98,13 @@ سەرکەوتو نەبوو `chown` بۆ دانان وەک بەرنامەی سیستەم, تکایە دووبارە هەوڵبدەرەوە. کێشە ڕوویدا لە داگرتنی %1$s سڕینەوەی %1$s سەرکەوتو نەبوو - Failed to apply new accent color + گۆڕینی ڕەنگ سەرکەوتو نەبوو سەرکەوتو نەبوو لە دۆزینەوەی فایلە پێویستەکان بۆ دامەزراندن، فایلە پێویستیەکان دووبارە دابگرەوە بۆ جێگیرکردن، پاشان دووبارە هەوڵبدەرەوە. سەرکەوتوو نەبوو لەدۆزینەوەی شوێنی فایلی Apk بۆ ڕووکاری ڕەش/تاریک لە بیرگەدا، تکایە دووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر کۆتاییهێنا بە دابەزاندنەکە. دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر ڕێگریکرد لە دابەزاندنەکە. دامەزراندن سەرکەوتو نەبوو، لەبەر ئەوەی بەکارهێنەر هەوڵیدا بۆ نزمکردنەوەی وەشان، نوێکارییەکانی بەرنامەی بنەڕەتی YouTube بسڕەوە و دووبارە هەوڵبدەرەوە. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. دامەزراندن سەرکەوتو نەبوو لەبەر هۆکاری نادیار، پەیوەندی بکە بە تێلێگرامەکەمان یان Discord بۆ پشتگیری زیاتر. دامەزراندن سەرکەوتو نەبوو لەبەرئەوەی فایلی دابەزاندن گونجاو نییە لەگەڵ ئامێرەکەت، فایلە داگیراوەکان بسڕەوە و پاشان دووبارە هەوڵبدەرەوە. دامەزراندن سەرکەوتوو نەبوو لەبەرئەوەی فایلی apk تێکچووە، تکایە دووبارە هەوڵبدرەوە. diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 673e10b09b..82d2f4c23c 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -51,10 +51,12 @@ Používat vlastní karty prohlížeče Chrome Odkazy se otevřou na vlastních kartách prohlížeče Chrome Výchozí systémové nastavení + 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 Vzhled Tmavý vzhled Světlý vzhled - URL aktualizačního kanálu %1$s vyskakovací oznámení Po vydání aktualizace pro %1$s obdržíte vyskakovací oznámení Centrum aktualizací diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 5f834de2ab..02cdb118c6 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -51,10 +51,12 @@ Brug Chrome Custom Faner Links vil åbne i Chrome Custom Faner System Standard + 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 Tema Mørkt tema Lyst tema - Opdateringskanal URL %1$s Push Notifikationer Modtag push meddelelser når der er en ny opdatering til %1$s Manager opdaterings center @@ -102,7 +104,7 @@ Installationen fejlede fordi brugeren lukkede installationen. Installationen fejlede fordi brugeren blokerede installationen. Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen. - Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af Vanced og prøv igen. + Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af appen og prøv igen. Installationen fejlede af en ukendt årsag, join vores Telegram eller Discord for hjælp. 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. diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index d9ce59b62f..9fe7f7182f 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -22,7 +22,7 @@ Über %1$s Tippe auf die Karte, um den Changelog zu sehen. - Changelog + Änderungen %1$s wird heruntergeladen Installieren Neu installieren @@ -32,8 +32,8 @@ Root-Zugriff nicht erteilt Nicht verfügbar Aktualisieren - Social Media - Support us + Soziale Medien + Unterstütze uns Akzentfarbe Blau @@ -51,10 +51,12 @@ Verwende Chrome Custom Tabs Links werden in Chrome Custom Tabs geöffnet Systemstandard + Speichern des neuen Zeitwertes fehlgeschlagen + Haupt Skript Wartezeit + 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 Theme Dunkles Theme Helles Theme - Kanal-Url updaten %1$s Push-Benachrichtigungen Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird Update Center @@ -98,17 +100,17 @@ Entfernen von %1$s fehlgeschlagen Neue Akzentfarbe konnte nicht angewendet werden 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 schwarz/dunkles Theme konnte nicht gefunden werden, bitte 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. Installation fehlgeschlagen, da der Benutzer die Installation blockiert hat. Installation fehlgeschlagen, da der Benutzer versucht hat, das Paket herunterzustufen. Aktualisierungen von YouTube deinstallieren und dann erneut versuchen. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + 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 aus unbekannten Grund fehlgeschlagen. Treten Sie bitte unserem Telegram-Chat oder Discord-Server bei, um Support zu erhalten. 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 apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut. Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut. Die Installation ist aufgrund eines Speicherfehlers fehlgeschlagen. - Apk-Datei für schwarz/dunkles Theme konnte nicht gefunden werden. Löschen Sie die App-Daten des Managers und versuchen Sie es erneut. + 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 de80acd5ab..d7e4b16037 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -51,10 +51,12 @@ Χρήση προσαρμοσμένων καρτέλων Chrome Οι σύνδεσμοι θα ανοίγουν σε προσαρμοσμένες καρτέλες chrome Προεπιλογή Συστήματος + Αποτυχία αποθήκευσης νέας τιμής χρόνου + Σενάριο Χρόνου Αδράνειας Root + Ρυθμίστε στην τιμη του χρόνου αδράνειας που βρίσκετε στο αρχείο σενάριο /data/adb/service.d/app.sh, χρήσιμο για επιδιόρθωση προβλημάτων προσάρτησης Θέμα Σκουρόχρωμο Θέμα Ανοιχτόχρωμο Θέμα - Ενημερώστε το URL του καναλιού ενημέρωσης Ειδοποιήσεις Push για το %1$s Λάβεται ειδοποιήσεις push όταν υπάρχουν διαθέσιμες ενημερώσεις για το %1$s Κέντρο ενημερώσεων @@ -102,7 +104,7 @@ Η εγκατάσταση απέτυχε διότι ο χρήστης ακύρωσε την εγκατάσταση. Η εγκατάσταση απέτυχε διότι ο χρήστης απέκλεισε την εγκατάσταση. Η εγκατάσταση απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Απεγκαταστήστε τις ενημερώσεις της αρχικής εφαρμογής YouTube, στη συνέχεια προσπαθήστε ξανά. - Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Απεγκαταστήστε την τρέχουσα έκδοση της εφαρμογής, και μετά προσπαθήστε ξανά. + Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Κάντε απεγκατάσταση την τρέχουσα έκδοση της εφαρμογής, και μετά προσπαθήστε ξανά. Η εγκατάσταση απέτυχε για άγνωστους λόγους, παρακαλούμε μπείτε στο Telegram ή στο Discord μας για περαιτέρω βοήθεια. Η εγκατάσταση απέτυχε διότι το αρχείο εγκατάστασης είναι μη συμβατό με την συσκευή σας. Κάντε εκκαθάριση των ληφθέντων αρχείων στις ρυθμίσεις, στην συνέχεια προσπαθήστε ξανά. Η εγκατάσταση απέτυχε διότι τα αρχεία apk έχουν διαφθαρεί, παρακαλώ προσπαθήστε ξανά. diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index d13d88617e..6c7b88c8c8 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,7 +1,7 @@ - Cancelado + Cancelar Cerrar Restablecer Guardar @@ -32,13 +32,13 @@ Acceso root no concedido No Disponible Actualizar - Social Media - Support us + Redes Sociales + Apóyanos Color de Acento Azul Verde - Purpura + Morado Rojo Amarillo Apariencia @@ -51,10 +51,12 @@ Usar Chrome Custom Tabs Links serán abiertos en Chrome Custom Tabs Predeterminado del sistema + Error al guardar el nuevo valor de tiempo + Script Root de Tiempo para Dormir + Ajustar el valor de tiempo para dormir en el script /data/adb/service.d/app.sh, útil para arreglar problemas de montaje Tema Tema Oscuro Tema Claro - URL del canal de actualizacion Notificaciones push de %1$s Recibir notificaciones push cuando una actualización para %1$s sea lanzada Centro de Actualizaciones @@ -70,7 +72,7 @@ Versión: %1$s Guía ¡Detente! - Estás usando la versión Magisk/TWRP de Vanced, que está descontinuada y no se puede actualizar usando esta aplicación. Por favor, elimínelo eliminando el módulo Magisk o con el desinstalador TWRP Vanced. + 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. MIUI detectado! Para instalar Vanced, DEBES desactivar las optimizaciones de MIUI en las opciones de desarrollador. (Puedes omitir este paso si estás utilizando un ROM basado en xiaomi.eu 20.2.20 o posterior) Error @@ -96,13 +98,13 @@ Fallo al ejecutar `chown` al propietario del sistema, por favor inténtalo de nuevo. Error al descargar %1$s Falla al desinstalar paquete %1$s - No se pudo aplicar el nuevo color de acento + Falla al aplicar el nuevo color de acento 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 debido a que el usuario bloqueo la instalación. La instalación ha fallado debido a que el usuario intento degradar el paquete. Desinstale las actualizaciones de la app original de YouTube y vuelva a intentarlo. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + 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 ha fallado por razones desconocidas, únete a nuestro grupo de Telegram o Discord para brindarte soporte. 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. diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index 911b972b2a..2e9ce4f3ef 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -51,10 +51,12 @@ Kasuta Chrome kohandatud vahekaarte Lingid avatakse Chrome kohandatud vahekaartides Süsteemi vaikimisi + 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 Kujundus Tume Kujundus Hele Kujundus - Uuenduskanali link %1$s Hüpikteated Saa hüpikteateid kui %1$s uuendus on saadaval Halduri värskenduskeskus diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index c777a64dd1..dbed36a207 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -36,11 +36,11 @@ Support us Aksenttiväri - Sininen - Vihreä - Violetti - Punainen - Keltainen + Blue + Green + Purple + Red + Yellow Ulkoasu Käyttäytyminen Tyhjennä ladatut tiedostot @@ -51,10 +51,12 @@ Käytä Chromen mukautettuja välilehtiä Linkit aukeavat Chromen mukautetuissa välilehdissä Järjestelmän oletus + 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 Teema Tumma teema Vaalea teema - Päivityskanavan URL-osoite %1$s Push-ilmoitusta Vastaanota push-ilmoituksia, kun %1$s:lle on julkaistu päivitys Managerin päivityskeskus @@ -102,7 +104,7 @@ Asennus epäonnistui, koska käyttäjä keskeytti asennuksen. Asennus epäonnistui, koska käyttäjä on estänyt asennuksen. Asennus epäonnistui, koska käyttäjä yritti heikentää pakettia. Poista päivitykset YouTube-sovelluksesta ja yritä sitten uudelleen. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Asennus epäonnistui tuntemattomista syistä, liity Telegramiin tai Discordiin saadaksesi lisätukea. 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. diff --git a/app/src/main/res/values-fil-rPH/strings.xml b/app/src/main/res/values-fil-rPH/strings.xml index 487b6851a0..f6aee0c704 100644 --- a/app/src/main/res/values-fil-rPH/strings.xml +++ b/app/src/main/res/values-fil-rPH/strings.xml @@ -36,11 +36,11 @@ Support us Kulay ng font - Asul - Berde - Lila - Pula - Dilaw + Blue + Green + Purple + Red + Yellow Hitsura Kilos Tanggalin ang naka-download na files @@ -51,10 +51,12 @@ Gamitin ang Chrome Custom Tabs Mabubuksan ang mga links sa Chrome Custom Tabs Sistemang Default + 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 Tema Itim na tema Puti na tema - I-update ang Channel URL %1$s Push Notifications Tumanggap ng push notifications kapag ang update sa %1$s ay nailabas Manager Update Center @@ -102,7 +104,7 @@ Nabigo ang pag-install dahil kinansela ito. Nabigo ang pag-install dahil binlock ito. Nabigo ang pag-install dahil dinowngrade ng gumagamit ang pakete. I-uninstall ang mga updates galing sa stock Youtube app, at ulitin muli. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Nabigo ang pag-install dahil sa hindi tukoy na dahilan, makiisa sa aming Telegram o Discord para sa karagdagang suporta. 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. diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index ff01f20107..93e48a6e79 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -51,10 +51,12 @@ Utiliser les onglets personnalisés Chrome Les liens s\'ouvriront dans les onglets personnalisés Chrome Système par défaut + Impossible d\'enregistrer la nouvelle valeur de temps + Définir un arrêt programmé + 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 Thème Thème sombre Thème clair - URL du canal de mise à jour %1$s Notifications Push Recevoir une notification push quand une nouvelle version pour %1$s est publiée Centre de mise à jour du Manager diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index db2e013b61..b11fa709b9 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -32,8 +32,8 @@ रूट एक्सेस प्रदान नहीं किया गया अनुपलब्ध अपडेट करें - Social Media - Support us + सामाजिक नेटवर्क + हमें सहयोग दीजिये ऊपरी रंग नीला @@ -51,10 +51,12 @@ क्रोम कस्टम टैब का उपयोग करें क्रोम कस्टम टैब में लिंक खुलेंगे सिस्टम डिफ़ॉल्ट + नया समय मान सहेजने में विफल + रूट स्क्रिप्ट नींद का समय + बढ़ते मुद्दों को ठीक करने के लिए उपयोगी /data/adb/service.d/app.sh स्क्रिप्ट में उपयोग की गई नींद के समय को समायोजित करें थीम डार्क थीम लाइट थीम - चैनल URL अपडेट करें %1$s पुश सूचनाएँ जब %1$s का अपडेट जारी किया जाता है, तो पुश सूचनाएँ प्राप्त करें अपडेट केंद्र @@ -96,13 +98,13 @@ सिस्टम के मालिक को APK को Chown करने में विफल, फिर से प्रयास करें। डाउनलोड करने में त्रुटि %1$s पैकेज की स्थापना रद्द करने में विफल %1$s - Failed to apply new accent color + नया उच्चारण रंग लागू करने में विफल स्थापना के लिए आवश्यक फ़ाइलों का पता लगाने में विफल। स्थापना फ़ाइलों को फिर से डाउनलोड करें, फिर पुनः प्रयास करें। भंडारण से काले / अंधेरे विषय के लिए apk फ़ाइल खोजने में विफल, कृपया पुनः प्रयास करें। स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी। स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना को ब्लॉक कर दिया। स्थापना विफल रही क्योंकि उपयोगकर्ता ने पैकेज को डाउनग्रेड करने का प्रयास किया। असली YouTube ऐप से अपडेट अनइंस्टॉल करें, फिर प्रयास करें। - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + इंस्टॉलेशन विफल रहा क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है। एप्लिकेशन के वर्तमान संस्करण को अनइंस्टॉल करें, फिर प्रयास करें। अज्ञात कारणों से स्थापना विफल हो गई, आगे के समर्थन के लिए हमारे टेलीग्राम या डिसॉर्ड में शामिल हों। इंस्टॉलेशन विफल हो गया क्योंकि इंस्टॉलेशन फ़ाइल आपके डिवाइस के साथ असंगत है। सेटिंग्स में डाउनलोड की गई फ़ाइलों को साफ़ करें, फिर प्रयास करें। स्थापना विफल रही क्योंकि एपीके फ़ाइलें दूषित हैं, कृपया पुनः प्रयास करें। diff --git a/app/src/main/res/values-hr-rHR/strings.xml b/app/src/main/res/values-hr-rHR/strings.xml index f4d43c8185..4e3cc237db 100644 --- a/app/src/main/res/values-hr-rHR/strings.xml +++ b/app/src/main/res/values-hr-rHR/strings.xml @@ -10,7 +10,7 @@ O autorima Upravitelj Postavke - Ažuriraj upravitelja + Ažuriranje upravitelja Je li vaš uređaj rootan? Dopusti root dozvolu @@ -18,7 +18,7 @@ Vanced, ali za YouTube Glazbu!\nS manje značajki ali tako da ispunjava vaše potrebe. YouTube Vanced je izvorna Android YouTube aplikacija, ali mnogo bolja! Započnite - Ne znate što je ovo ili ne želite koristiti root inačicu? Jednostavno kliknite na plavu strelicu ispod! + Ne znate što je ovo ili ne želite koristiti root izdanje? Jednostavno kliknite na plavu strelicu ispod! O %1$s Dodirnite karticu kako bi vidjeli zapis promjena. @@ -32,8 +32,8 @@ Root pristup nije dopušten Nedostupno Ažuriraj - Social Media - Support us + Društvene mreže + Podržite nas Boja naglašavanja Plava @@ -50,16 +50,18 @@ Jezik Koristi prilagođene kartice Chroma Poveznice će se otvarati u prilagođenim karticama Chroma - Zadan sustavom + Zadano sustavom + 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 Tema Tamna tema Svjetla tema - Ažuriraj URL kanala - %1$s skočnih obavijesti + %1$s skočne obavijesti Primite skočnu obavijest kada je ažuriranje za %1$s dostupno Središte ažuriranja upravitelja Nema novih ažuriranja - Inačica + Izdanje Napredno %1$s instalacijska datoteka je otkrivena! @@ -89,7 +91,7 @@ Svjetla + %1$s Odaberite najmanje jedan jezik! - Manager razvijatelji + Razvijatelji Vanced upravitelja Izvori Vanced tim @@ -102,7 +104,7 @@ Instalacija je prekinuta zato jer ju je korisnik prekinuo. Instalacija nije uspjela jer je korisnik blokirao instalaciju. Instalacija nije uspjela jer je korisnik pokušao instalirati stariju inačicu paketa. Deinstalirajte ažuriranja izvorne YouTube aplikacije, zatim pokušajte ponovno. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Instalacija nije uspjela jer je aplikacija u sukobu s već instaliranom aplikacijom. Deinstalirajte trenutnu inačicu aplikacije zatim pokušajte ponovno. Instalacija nije uspjela iz nepoznatih razloga, pridružite nam se na Telegramu ili Discordu za daljnju podršku. 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. diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 01aed4d598..f56145356a 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -15,8 +15,8 @@ Rootolt az eszközöd? Root hozzáférés engedélyezése Legalább egy appot válassz! - Vanced a YouTube Music-ra!\nkevesebb funkciő, de minden ami kellhet. - A Youtube Vanced egy gyári Android YouTube alkalmazás, csak jobb! + Vanced, a YouTube Music-ra!\nKevésbé funkciógazdag, de kielégíti az igényeidet. + A Youtube Vanced a gyári Android YouTube alkalmazás, csak jobb nála! Lássunk neki Nem tudod mi ez vagy csak nem akarod használni a root verziót? Csak kattins a lenti kék nyílra! @@ -29,11 +29,11 @@ Telepítve: Legújabb: microG nincs telepítve - Nincs root jogosultság + A root hozzáférés nincs megadva Nem elérhető Frissítés - Social Media - Support us + Közösségi média + Támogass minket Kiemelés színe Kék @@ -51,10 +51,12 @@ Egyéni Chrome lapok használata A linkek egyéni Chrome ablakban nyílnak meg Rendszer alapértelmezett + Nem sikerült az időzítő új értékének mentése + Alvás idő script (Root) + 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 Kinézet Sötét téma Világos téma - Frissítési csatorna %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 Frissítő központ @@ -97,14 +99,14 @@ Akarod telepíteni? 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 A %1$s-t nem sikerült eltávolítani - Failed to apply new accent color + Nem sikerült az új kiemelés szín beállítása 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 a felhasználó megszakította azt. A telepítés nem sikerült, mert a felhasználó régebbi verziót próbált telepíteni. Távolítsd el a gyári YouTube app frissítéseit, majd próbáld újra. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + 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 ismeretlen okok miatt nem sikerült, támogatásért csatlakozz a Telegram vagy a Discord csoportunkhoz. 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. diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 8a8857746d..72bafd7f90 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -51,10 +51,12 @@ Gunakan Chrome Custom Tabs Tautan akan terbuka di Chrome Custom Tabs Standar Sistem + Gagal untuk menyimpan nilai waktu baru + Waktu Root Script Sleep + Sesuaikan nilai sleep time yang digunakan dalam skript /data/adb/service.d/app.sh, berguna untuk memperbaiki masalah pemasangan Tema Tema Gelap Tema Terang - Perbarui URL Channel Notifikasi Push %1$s Terima notifikasi push saat pembaruan untuk %1$s dirilis Pusat Pembaruan Manager @@ -62,7 +64,7 @@ Varian Tingkat Lanjut - %1$s file instalasi terdeteksi! + File instalasi %1$s terdeteksi! Manager mendeteksi bahwa semua file yang diperlukan untuk instalasi %1$s ditemukan. Apakah anda ingin memasangnya? Memeriksa pembaruan… Bahasa: %1$s @@ -102,7 +104,7 @@ Pemasangan gagal karena pengguna membatalkan pemasangan. Pemasangan gagal karena pengguna memblokir pemasangan. Pemasangan gagal karena pengguna mencoba untuk menurunkan versi paket. Hapus pembaruan dari aplikasi YouTube bawaan, lalu coba lagi. - Pemasangan gagal dikarenakan aplikasi konflik dengan aplikasi yang sudah terpasang. Hapus versi aplikasi yang sekarang, lalu coba lagi. + Pemasangan gagal karena aplikasi konflik dengan aplikasi yang sudah terpasang. Copot pemasangan aplikasi versi saat ini, lalu coba lagi. Pemasangan gagal untuk alasan yang tidak diketahui, gabung Telegram atau Discord kami untuk bantuan lebih lanjut. Pemasangan gagal karena file pemasangan tidak kompatibel dengan perangkat anda. Hapus file yang diunduh di pengaturan, lalu coba lagi. Pemasangan gagal karena file apk rusak, mohon coba lagi. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 3fa0d60a74..ef332a5916 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -51,10 +51,12 @@ Utilizza le Schede Personalizzate di Chrome I link verranno aperti nelle Schede Personalizzate di Chrome Predefinito di Sistema + 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 Tema Tema Scuro Tema Chiaro - Aggiorna l\'URL del Canale Notifiche Push di %1$s Ricevi notifiche push quando un aggiornamento per %1$s è disponibile Centro Aggiornamenti @@ -102,7 +104,7 @@ Installazione non riuscita. L\'utente ha annullato l\'installazione. Installazione non riuscita. L\'utente ha bloccato l\'installazione. Installazione non riuscita. L\'utente ha provato ad eseguire il downgrade del pacchetto. Disinstalla gli aggiornamenti dell\'app predefinita di YouTube, poi riprova. - Installazione fallita a causa di conflitti con un\'app già installata. Disinstalla la versione corrente dell\'app, quindi riprova. + Installazione fallita perché l\'applicazione è in conflitto con un\'app già installata. Disinstallare la versione corrente dell\'applicazione, quindi riprovare. Installazione non riuscita a causa di un errore sconosciuto, unisciti al nostro gruppo Telegram o al server di Discord per ricevere ulteriore assistenza. 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. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index 93260c6133..54500b8e02 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -51,10 +51,12 @@ השתמש בכרטיסייה מותאמת אישית של Chrome קישורים יפתחו בכרטיסיות מותאמות אישית של Chrome ברירת מחדל + נכשל בשמירת ערך הזמן החדש + 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 משתחרר מרכז העדכונים @@ -96,13 +98,13 @@ נכשל בהחלפת הבעלים של קובץ ה־APK, אנא נסה בשנית. תקלה בהורדה של %1$s נכשל במחיקת החבילה %1$s - Failed to apply new accent color + נכשל בהחלת ערכת הנושא החדשה איתור הקבצים הנדרשים להתקנה נכשל. הורד מחדש את קבצי ההתקנה ונסה שוב. נכשל האיתור של קובץ APK לערכת נושא שחורה/כהה מהאחסון, אנא נסה שוב. ההתקנה נכשלה כיוון שהמשתמש ביטל אותה. ההתקנה נכשלה כיוון שהמשתמש חסם אותה. ההתקנה נכשלה כיוון שהמשתמש ניסה לשנמך את גרסת האפליקציה. מחק עדכונים מאפליקציית YouTube הרגילה, ולאחר מכן נסה שוב. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + ההתקנה נכשלה כיוון שהאפליקציה מתנגשת עם גרסה מותקנת שלה, מחק את הגרסה הנוכחית של Vanced ולאחר מכן נסה שוב. הפעולה נכשלה בגלל סיבה אינה ידועה, בבקשה הצטרפו לטלגרם או דיסקורד שלנו בשביל עזרה. ההתקנה נכשלה מכיוון שההתקנה או הקובץ לא תואמים עם מכשירך. נקה הורדות שהושלמו מתוך ההגדרות, ואז נסה שוב. ההתקנה נכשלה מכיוון שקבצי הישום הרוסים, בבקשה נסה שוב. diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 8a0f2fce28..5d17213999 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -32,15 +32,15 @@ Root アクセスは許可されていません 利用不可 更新 - Social Media - Support us + ソーシャルメディア + サポート アクセントカラー - - - - - + ブルー + グリーン + パープル + レッド + イエロー 表示設定 動作 ダウンロード済みファイルを消去 @@ -51,10 +51,12 @@ Chrome カスタムタブを使用する Chrome カスタムタブでリンクを開く システム標準 + 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 テーマ ダークテーマ ライトテーマ - アップデート チャンネル URL %1$s プッシュ通知 %1$s のアップデートがリリースされたときにプッシュ通知を受け取る アップデート センター @@ -96,13 +98,13 @@ システム所有者への APK の Chown ができませんでした、もう一度やり直してください. %1$s のダウンロード中にエラー パッケージ %1$s のアンインストールに失敗しました - Failed to apply new accent color + 新しいアクセントカラーの適用に失敗しました インストールに必要なファイルが見つかりませんでした。再ダウンロードし、もう一度お試しください。 ストレージからブラック/ダークテーマの APK ファイルが見つかりませんでした。もう一度お試しください。 ユーザーがインストールを中断したためインストールに失敗しました。 ユーザーがインストールをブロックしたためインストールに失敗しました。 ユーザーがパッケージをダウングレードしようとしたためインストールに失敗しました。標準の YouTube アプリのアップデートをアンインストールしてから、もう一度やり直してください。 - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. 何らかの理由によりインストールに失敗しました、サポートのために Telegram または Discord に参加してください。 インストールするファイルがお使いのデバイスと互換性がないためインストールに失敗しました。設定でダウンロードしたファイルを削除してから、もう一度やり直してください。 APK ファイルが破損しているためインストールに失敗しました、もう一度やり直してください。 diff --git a/app/src/main/res/values-ka-rGE/strings.xml b/app/src/main/res/values-ka-rGE/strings.xml index fc616d04be..182c7727e3 100644 --- a/app/src/main/res/values-ka-rGE/strings.xml +++ b/app/src/main/res/values-ka-rGE/strings.xml @@ -36,11 +36,11 @@ დაგვიჭირეთ მხარი აქცენტის ფერი - ლურჯი - მწვანე - იისფერი - წითელი - ყვითელი + Blue + Green + Purple + Red + Yellow შესახედაობა ფუნქციები გადმოწერილი ფაილების გაწმენდა @@ -51,10 +51,12 @@ გამოიყენეთ Chrome Custom Tabs ლინკები გაიხსნება Chrome Custom Tabs-ში სისტემის ნაგულისხმევი + 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 თემა მუქი თემა ღია თემა - განახლების არხის URL %1$s-ს შეტყობინებები მიიღეთ შეტყობინებები როდესაც %1$s-ის განახლება იქნება ხელმისაწვდომი განახლებების ცენტრი @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-kmr-rTR/strings.xml b/app/src/main/res/values-kmr-rTR/strings.xml index f98a0354af..d45d10c68b 100644 --- a/app/src/main/res/values-kmr-rTR/strings.xml +++ b/app/src/main/res/values-kmr-rTR/strings.xml @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 3a46d4ad73..e18a4d5481 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -5,12 +5,12 @@ 닫기 초기화 저장 - 앱을 선택하세요 + 설치할 앱 선택하기 정보 Manager 설정 - 업데이트 관리 + 매니저 업데이트 기기가 루팅되어 있나요? 루트 권한 부여 @@ -32,8 +32,8 @@ 루트 권한이 부여되지 않았습니다 사용 불가 업데이트 - Social Media - Support us + 소셜 미디어 + 지원하기 강조 색상 파란색 @@ -51,10 +51,12 @@ Chrome 커스텀 탭으로 열기 링크가 Chrome 커스텀 탭으로 열립니다 시스템 기본값 + 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 테마 다크 테마 라이트 테마 - 업데이트 채널 URL %1$s 푸시 알림 새로운 %1$s 업데이트가 출시되면 알림 받기 업데이트 센터 @@ -90,7 +92,7 @@ 적어도 하나의 언어를 선택해주세요! Manager 개발자 - 소스 + 소스 코드 Vanced 팀 APK의 소유권을 시스템 관리자로 변경하던 중에 오류가 발생하였습니다. 다시 시도하십시오. @@ -102,7 +104,7 @@ 사용자가 설치를 중단했기 때문에 앱을 설치하지 못했습니다. 사용자가 설치를 차단했기 때문에 앱을 설치하지 못했습니다. 사용자가 패키지를 이전 버전으로 변경하려고 하여 앱을 설치하지 못했습니다. 기본 YouTube 앱을 초기 버전으로 변경한 다음, 설치를 다시 진행해주세요. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. 알 수 없는 이유가 발생하여 앱을 설치하지 못했습니다. 저희 텔레그램 또는 디스코드에 문제를 제보해주시면 도와드리겠습니다. 설치 파일이 기기와 호환되지 않아 앱을 설치하지 못했습니다. Manager 설정에서 다운로드된 파일을 모두 삭제한 다음, 설치를 다시 진행해주세요. APK 파일이 손상되어 앱을 설치하지 못했습니다. 설치를 다시 진행해주세요. diff --git a/app/src/main/res/values-ku-rTR/strings.xml b/app/src/main/res/values-ku-rTR/strings.xml index 5dedcc3622..9c564fb6ee 100644 --- a/app/src/main/res/values-ku-rTR/strings.xml +++ b/app/src/main/res/values-ku-rTR/strings.xml @@ -36,11 +36,11 @@ Support us Rengê devokê - Şîn - Kesk - Mor - Sor - Zer + Blue + Green + Purple + Red + Yellow Xuyang Behavior Dosiyayên daxistî paqij bike @@ -51,10 +51,12 @@ Hilpekên Chrome\'ê yên taybet bi kar bîne Girêdan dê di hilpekên taybet ên Chrome\'ê de vebin Jixwebera sîstemê + 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 Rûkar Rûkara tarî Rûkara ronak - URL\'a kanalê hildemîne %1$s danezanên lezgîn Dema ku hildemînek ji bo %1$s belav bû, danezanên lezgîn werbigire Navenda hildemandina rêveberê @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Sazkirin ji ber sedemên nenas bi ser neket, ji bo piştgiriya zêdetir tevlî Telegram an Discord\'ê bibin. 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. diff --git a/app/src/main/res/values-ml-rIN/strings.xml b/app/src/main/res/values-ml-rIN/strings.xml index 355245b552..063bbc6ee1 100644 --- a/app/src/main/res/values-ml-rIN/strings.xml +++ b/app/src/main/res/values-ml-rIN/strings.xml @@ -51,10 +51,12 @@ Chrome Custom ടാബുകൾ ഉപയോഗിക്കുക Chrome Custom ടാബുകളിൽ ലിങ്കുകൾ തുറക്കും സിസ്റ്റം സ്ഥിരസ്ഥിതി + പുതിയ സമയ മൂല്യം സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു + റൂട്ട് സ്ക്രിപ്റ്റ് ഉറക്ക സമയം + മ d ണ്ടിംഗ് പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നതിന് ഉപയോഗപ്രദമായ /data/adb/service.d/app.sh സ്ക്രിപ്റ്റിൽ ഉപയോഗിച്ചിരിക്കുന്ന ഉറക്ക സമയ മൂല്യം ക്രമീകരിക്കുക തീം ഡാർക്ക് തീം ലൈറ്റ് തീം - ചാനൽ URL അപ്‌ഡേറ്റുചെയ്യുക %1$s പുഷ് അറിയിപ്പുകൾ %1$s ഒരു അപ്‌ഡേറ്റ് പുറത്തിറങ്ങുമ്പോൾ പുഷ് അറിയിപ്പുകൾ സ്വീകരിക്കുക മാനേജർ അപ്‌ഡേറ്റ് സെന്റർ @@ -102,7 +104,7 @@ ഉപയോക്താവ് ഇൻസ്റ്റാളേഷൻ നിർത്തലാക്കിയതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ഉപയോക്താവ് ഇൻസ്റ്റാളേഷൻ തടഞ്ഞതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ഉപയോക്താവ് പാക്കേജ് തരംതാഴ്ത്താൻ ശ്രമിച്ചതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. സ്റ്റോക്ക് YouTube അപ്ലിക്കേഷനിൽ നിന്ന് അപ്‌ഡേറ്റുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. - ഇതിനകം ഇൻസ്റ്റാളുചെയ്‌ത അപ്ലിക്കേഷനുമായി അപ്ലിക്കേഷൻ പൊരുത്തക്കേടുകൾ ഉള്ളതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. അപ്ലിക്കേഷന്റെ നിലവിലെ പതിപ്പ് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. + ഇതിനകം ഇൻസ്റ്റാളുചെയ്‌ത അപ്ലിക്കേഷനുമായി അപ്ലിക്കേഷൻ പൊരുത്തപ്പെടുന്നതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. അപ്ലിക്കേഷന്റെ നിലവിലെ പതിപ്പ് അൺ‌ഇൻസ്റ്റാൾ ചെയ്യുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. അജ്ഞാതമായ കാരണങ്ങളാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു, കൂടുതൽ പിന്തുണയ്ക്കായി ഞങ്ങളുടെ ടെലിഗ്രാം അല്ലെങ്കിൽ ഡിസ്കോർഡിൽ ചേരുക. ഇൻസ്റ്റാളേഷൻ ഫയൽ നിങ്ങളുടെ ഉപകരണവുമായി പൊരുത്തപ്പെടാത്തതിനാൽ ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു. ക്രമീകരണങ്ങളിൽ ഡ download ൺലോഡ് ചെയ്ത ഫയലുകൾ മായ്‌ക്കുക, തുടർന്ന് വീണ്ടും ശ്രമിക്കുക. Apk ഫയലുകൾ‌ കേടായതിനാൽ‌ ഇൻ‌സ്റ്റാളേഷൻ‌ പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക. diff --git a/app/src/main/res/values-mr-rIN/strings.xml b/app/src/main/res/values-mr-rIN/strings.xml index a009fe95cd..c52ae27443 100644 --- a/app/src/main/res/values-mr-rIN/strings.xml +++ b/app/src/main/res/values-mr-rIN/strings.xml @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 26a53d582a..015999a827 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -51,10 +51,12 @@ Aangepaste Chrome-tabs gebruiken Links zullen openen in aangepaste Chrome-tabs Systeemstandaard + 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 Thema Donker thema Licht thema - URL update kanaal %1$s push meldingen Push meldingen ontvangen wanneer er een update voor %1$s beschikbaar is Manager Update Center diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index 864684909e..9f418f2427 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -36,11 +36,11 @@ Support us Aksentfarge - Blå - Grønn - Lilla - Rød - Gul + Blue + Green + Purple + Red + Yellow Utseende Oppførsel Fjern nedlastede filer @@ -51,10 +51,12 @@ Bruk Chrome Custom Tabs Lenker vil åpne i Chrome Custom Tabs System standard + 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 Tema Mørkt tema Lyst tema - URL for oppdateringskanal %1$s Push varsler Motta push varsler når en oppdatering for %1$s er utgitt Oppdateringssenter @@ -102,7 +104,7 @@ Installasjonen mislyktes fordi brukeren avbrutt installasjonen. Installasjonen mislyktes på grunn av at brukeren blokkerte installasjonen. Installasjonen mislyktes fordi brukeren prøvde å nedgradere pakken. Avinstaller oppdateringer fra standard YouTube app, og prøv på nytt. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installasjonen mislyktes av ukjente årsaker, bli med i vår Telegram eller Discord gruppe for videre støtte. 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. diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 1808f72381..863a0fc066 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -32,13 +32,13 @@ ਰੂਟ ਐਕਸੈਸ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਮੋਜੂਦ ਨਹੀਂ ਹੈ ਅੱਪਡੇਟ - Social Media - Support us + ਸੋਸ਼ਲ ਮੀਡੀਆ + ਸਾਡਾ ਸਮਰਥਨ ਕਰੋ ਐੱਕਸੈਂਟ ਰੰਗ ਨੀਲਾ ਹਰਾ - ਬੈਂਗਣੀ + ਜਾਮਨੀ ਲਾਲ ਪੀਲਾ ਦਿੱਖ @@ -51,10 +51,12 @@ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਦੀ ਵਰਤੋਂ ਕਰੋ ਲਿੰਕ ਕਰੋਮ ਕਸਟਮ ਟੈਬਸ ਵਿੱਚ ਖੁੱਲ੍ਹਣਗੇ ਸਿਸਟਮ ਡਿਫੌਲਟ + ਨਵਾਂ ਸਮਾਂ ਮੁੱਲ ਬਚਾਉਣ ਵਿੱਚ ਅਸਫਲ + ਰੂਟ ਸਕ੍ਰਿਪਟ ਨੀਂਦ ਦਾ ਸਮਾਂ + ਮਾdਟ ਕਰਨ ਵਾਲੇ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਲਾਭਦਾਇਕ, /data/adb/service.d/app.sh ਸਕ੍ਰਿਪਟ ਵਿੱਚ ਸੁੱਤਾ ਸਮਾਂ ਮੁੱਲ ਵਿਵਸਥਿਤ ਕਰੋ ਥੀਮ ਡਾਰਕ ਥੀਮ ਲਾਇਟ ਥੀਮ - ਚੈਨਲ URL ਅੱਪਡੇਟ %1$s ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਜਦੋਂ %1$s ਦਾ ਅੱਪਡੇਟ ਜਾਰੀ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ ਮੈਨੇਜਰ ਅਪਡੇਟ ਕੇਂਦਰ @@ -102,7 +104,7 @@ ਇੰਸਟਾਲ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਰੱਦ ਕਰ ਦਿੱਤੀ. ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਇੰਸਟਾਲੇਸ਼ਨ ਬਲਾਕ ਕਰ ਦਿੱਤੀ. ਇੰਸਟਾਲੇਸ਼ਨ ਨਾਕਾਮ ਰਹੀ ਕਿਓਂਕਿ ਉਪਯੋਗਕਰਤਾ ਨੇ ਪੈਕਜ ਨੂੰ ਡਾਉਣਗਰੇਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ. ਅਸਲ YouTube ਐਪ ਤੋਂ ਅਪਡੇਟ ਅਨਇੰਸਟਾਲ ਕਰੋ, ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + ਸਥਾਪਨਾ ਅਸਫਲ ਕਿਉਂਕਿ ਐਪ ਪਹਿਲਾਂ ਤੋਂ ਸਥਾਪਤ ਐਪ ਨਾਲ ਟਕਰਾਉਂਦੀ ਹੈ. ਐਪ ਦੇ ਮੌਜੂਦਾ ਸੰਸਕਰਣ ਨੂੰ ਅਣਇੰਸਟੌਲ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਅਣਜਾਣ ਕਾਰਨਾਂ ਕਰਕੇ ਸਥਾਪਨਾ ਅਸਫਲ ਹੋ ਗਈ, ਹੋਰ ਸਹਾਇਤਾ ਲਈ ਸਾਡੇ ਟੈਲੀਗ੍ਰਾਮ ਜਾਂ ਡਿਸਕੋਰਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ. ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਇੰਸਟਾਲੇਸ਼ਨ ਫਾਈਲ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ. ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਸਾਫ਼ ਕਰੋ, ਫਿਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. ਸਥਾਪਨਾ ਅਸਫਲ ਹੋਈ ਕਿਉਂਕਿ ਏਪੀਕੇ ਫਾਈਲਾਂ ਖ਼ਰਾਬ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ. diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index f98a0354af..d45d10c68b 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 8240c48bd1..7290d98dfe 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -32,7 +32,7 @@ Root nie został przyznany Niedostępne Aktualizuj - Social Media + Media Społecznościowe Wesprzyj nas Kolor Akcentu @@ -51,10 +51,12 @@ Używaj niestandardowych kart Chrome Linki zostaną otwarte w niestandardowych kartach Chrome Domyślny systemowy + 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 Motyw Ciemny Motyw Jasny Motyw - Zaktualizuj URL kanału %1$s Powiadomień Push Otrzymuj powiadomienia push po wydaniu aktualizacji dla %1$s Centrum aktualizacji @@ -102,7 +104,7 @@ Instalacja nie powiodła się, ponieważ użytkownik przerwał instalację. Instalacja nie powiodła się, ponieważ użytkownik zablokował instalację. Instalacja nie powiodła się, ponieważ użytkownik próbował obniżyć paczkę. Odinstaluj aktualizacje z aplikacji YouTube, a następnie spróbuj ponownie. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Instalacja nie powiodła się ponieważ aplikacja konfliktuje z już zainstalowaną aplikacją. Odinstaluj aktualną wersję aplikacji a następnie spróbuj ponownie. Operacja nie powiodła się z nieznanego powodu. Aby uzyskać wsparcie, dołącz do naszego Telegram\'u lub Discord\'a. 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. diff --git a/app/src/main/res/values-ps-rAF/strings.xml b/app/src/main/res/values-ps-rAF/strings.xml index f98a0354af..d45d10c68b 100644 --- a/app/src/main/res/values-ps-rAF/strings.xml +++ b/app/src/main/res/values-ps-rAF/strings.xml @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2ebe74eeb8..21f7606804 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -5,15 +5,15 @@ Fechar Resetar Salvar - Selecione seus aplicativos + Selecione Seus Aplicativos Sobre Gerenciador Configurações - Gerenciador de atualização + Gerenciador de Atualização - Seu dispositivo tem root? - Conceder permissão de root + Seu Dispositivo Tem Root? + Conceder Permissão de Root Selecione pelo menos um aplicativo! Vanced, mas para o YouTube Music!\nrelativamente menos funções, mas satisfaz suas necessidades. YouTube Vanced é o aplicativo nativo de Android YouTube, mas melhor! @@ -51,10 +51,12 @@ Usar abas personalizadas do Chrome Os links serão abertos nas abas personalizadas do Chrome Padrão do sistema + Falha ao salvar o novo valor de tempo + Tempo de repouso do script raiz + Ajuste o valor do tempo de suspensão usado no script /data/adb/service.d/app.sh, útil para corrigir problemas de montagem Tema Escuro Claro - Atualizar URL do canal %1$s notificações push Receber notificações quando uma atualização para o %1$s for lançado Centro de Atualizações @@ -102,7 +104,7 @@ A instalação falhou porque o usuário abortou a instalação. A instalação falhou porque o usuário bloqueou a instalação. A instalação falhou porque o usuário tentou fazer o downgrade do pacote. Desinstale as atualizações do aplicativo YouTube stock e tente novamente. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + A instalação falhou porque o aplicativo está em conflito com um aplicativo já instalado. Desinstale a versão atual do aplicativo e tente novamente. A instalação falhou por um motivo desconhecido, junte-se ao nosso grupo no Telegram ou Discord para obter suporte. 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. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index de39042c1f..2095b1263e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -32,8 +32,8 @@ Acesso root negado. Indisponível Atualizar - Social Media - Support us + Redes Sociais + Suporte-nos Cor de Destaque Azul @@ -51,10 +51,12 @@ Usar abas personalizadas do Chrome Os links serão abertos em abas personalizadas do Chrome Padrão do sistema + 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 Tema Tema Escuro Tema Claro - Atualizar Canal URL Notificações Push %1$s Receber notificações Push quando uma actualização para %1$s estiver disponível Centro de Actualizações @@ -96,13 +98,13 @@ Falhou na mudança de dono do Apk para o proprietário do sistema, por favor, tente novamente. Erro Transferindo %1$s Erro a desinstalar pacote %1$s - Failed to apply new accent color + Falha ao aplicar nova cor de destaque 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 usuário bloqueou a instalação. 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. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. A instalação falhou por razões desconhecidas, por favor entre no nosso Telegram ou Discord para suporte. 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. diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index d081d6e600..a154ec0a94 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -38,8 +38,8 @@ Nuanță culoare Albastru Verde - Violet - Roşu + Mov + Roșu Galben Aspect Comportament @@ -51,10 +51,12 @@ Utilizează file personalizate Chrome Link-uri se vor deschide în filele personalizate Chrome Setarea implicită a sistemului + Salvarea noii valori de timp a eșuat + Dupa cât timp se activează script-ul root + Reglaţi dupa cât timp este activat script-ul root folosit în /data/adb/service.d/app.sh script, util pentru remedierea problemelor de montare Temă Temă întunecată Temă deschisă - URL canal de actualizare %1$s Notificari push Primiți notificări push când o actualizare pentru %1$s este lansată Actualizator @@ -102,7 +104,7 @@ Instalarea a eșuat deoarece utilizatorul a anulat instalarea. Instalarea a eșuat deoarece utilizatorul a blocat instalarea. 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 deoarece aplicația intră în conflict cu o aplicație deja instalată. Dezinstalați versiunea curentă Vanced, apoi încercați din nou. + 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 din motive necunoscute, alătură-te Telegramului nostru sau Discord pentru mai multă asistență. 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. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index c811e52ece..6f3a4f5db4 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -32,13 +32,13 @@ Рут-доступ не предоставлен Недоступно Обновить - Social Media - Support us + Социальные сети + Поддержите нас Второстепенный цвет Синий Зелёный - Пурпурный + Фиолетовый Красный Жёлтый Оформление @@ -51,10 +51,12 @@ Использовать Chrome Custom Tabs Открывать ссылки в Chrome Custom Tabs Как в системе + Не удалось сохранить новое значение времени + Скрипт Таймера сна + Настройка значения времени сна, используемого в скрипте /data/adb/service.d/app.sh, полезно для решения проблем монтирования Тема оформления Тёмная тема Светлая тема - Ссылка на канал обновлений Push Уведомления для %1$s Получать уведомления о выходе обновления для %1$s Центр обновлений diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml index 563b01cd79..8fc71f61ee 100644 --- a/app/src/main/res/values-si-rLK/strings.xml +++ b/app/src/main/res/values-si-rLK/strings.xml @@ -36,11 +36,11 @@ Support us අනෙක් වර්ණය - නිල් - කොළ - දම් - රතු - කහ + Blue + Green + Purple + Red + Yellow Appearance Behavior Clear downloaded files @@ -51,10 +51,12 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 තේමාව අඳුරු තේමාව Light Theme - Update Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -102,7 +104,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/values-so-rSO/strings.xml b/app/src/main/res/values-so-rSO/strings.xml index 46421163b0..97bc92b51a 100644 --- a/app/src/main/res/values-so-rSO/strings.xml +++ b/app/src/main/res/values-so-rSO/strings.xml @@ -8,14 +8,14 @@ Dooro apps-ka Anaga - Manager + Maamule Fadhiga - Cusboonaysii Manager-ka + Cusboonaysii Aaladaada miyay root-garaysan tahay? U Ogolow Fasaxa Root-ka Ugu yaraan hal app dooro! - Vanced, laakiin loogu talagalay YouTube Music!\nwuu ka yara wax qabad yaryahay Vanced-ka laakiin baahiyahaaga wuu fulin. + Waa Vanced, laakiin loogu talagalay YouTube Music!\nwuu ka yara wax qabad yaryahay Vanced-ka laakiin baahiyahaaga wuu fulin. YouTube Vanced waa YouTube-kii android ka caadiga ahaa, laakiin wuu ka fiican yahay! Aan bilawno Ma aqaano wuxuu kani yahay ama ma doonayo inaan isticmaalo midka root-ka ah? Aayar taabo falaadha buluuga ah ee hoose! @@ -32,8 +32,8 @@ \'Root\' looma fasaxin Lama heli karo Cusboonaysii - Social Media - Support us + Baraha Bulshada + Na taageer Midabka Buluug @@ -48,15 +48,17 @@ Falanqaynta Firebase Tani waxay noo ogolaanaysaa inaan uruurino xog ku saabsan shaqaynta app-ka iyo kaydinta xogta khaladaadka dhaca Luuqada - Isticmaal Taababka Chrome - Linkiyadu waxay ku furmi doonaan Taababka Chrome-ka ee loogu talagalay + Isticmaal Daaqadaha Chrome + Linkiyadu waxay ku furmi doonaan daaqadaha Chrome-ka ee loogu talagalay Sida aaladu tahay + 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 Nashqada Nashqad Madow Nashqad Cad - Cusboonaysii Ciwaanka Kanaanlka - %1$s Ogaysiisyada soodhaca - Ha kuu soo dhacaan ogaysiisyada marka wax cusub %1$s lasoo galiyo + %1$s Ogaysiisyadisa soodhaca + Ha kuu soo dhacaan ogaysiisyo marka mid cusub oo %1$s ah lasoo saaro Xarunta Cusboonaysiinta Manager-ka Majiro wax cusub Nooca @@ -77,7 +79,7 @@ Dib udaji Iska hubi inaad app-ka kaso dajisatay vancedapp.com, xaga martigaliyaha Discord, ama meesha Vanced ee GitHub Waa la fuliyay! - %1$s Kushubida Fadhigeeda + Fadhiga Kushubida %1$s Vanced waa lagu shubay! Fur hadda? Tirsiga Vanced Music waa lagu shubay! Fur hadda? @@ -102,7 +104,7 @@ Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa joojiyay. Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa xanibay. Ku shubidii way guuldaraysatay sababtoo ah qofka aalada isticmaalaya ayaa isku dayay inuu nooc hore ku shubo. Ka saar cusboonaysiinta xaga app-ka YouTube-ka caadiga ah, kadibna markale isku day. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Ku shubidii way guuldaraysatay sababo aan la garanaynin awgood, kusoo biir Telegram-kanaga ama Discord-ka si aad caawin dheerad ah u hesho. 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. diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index 641d8864b2..48dadba21c 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -36,11 +36,11 @@ Support us Боја наглашавања - Плава - Зелена - Љубичаста - Црвена - Жута + Blue + Green + Purple + Red + Yellow Изглед Понашање Обриши преузете датотеке @@ -51,10 +51,12 @@ Користите Chrome Custom Tabs Линкови ће бити отворени у Chrome Custom Tabs Системски подразумевано + 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 Менаџер ажурирања @@ -102,7 +104,7 @@ Инсталација није успешна, корисник је обуставио инсталацију. Инсталација није успешна, корисник је блокирао инсталацију. Инсталација није успешна, корисник је покушао да инсталира старију верзију преко новије верзије апликације. Деинсталирајте све до предодређене инсталиране верзије YouTubе апликације, затим покушајте поново. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Инсталација није успеla, услед непознатог разлога, прикључите нам се на Telegram и Discord апликацијама за даљу подршку. Инсталација је неуспешна јер инсталациона датотека није компатибилна са вашим уређајем. Очистите преузете датотеке у Подешавањима и затим покушајте поново. Инсталација није успеla јер је apk датотека оштећена, покушајте поново. diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 01364110e4..e6f22b77d7 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -36,11 +36,11 @@ Support us Accentfärg - Blå - Grön - Lila - Röd - Gul + Blue + Green + Purple + Red + Yellow Utseende Beteende Rensa nedladdade filer @@ -51,10 +51,12 @@ Använd Chrome-anpassade flikar Länkar öppnas i Chrome Custom Tabs Systemstandard + 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 Tema Mörkt tema Ljust tema - Uppdatera källa %1$s push-meddelanden Få push-meddelanden när en uppdatering för %1$s släpps Ansvarig uppdateringscenter @@ -102,7 +104,7 @@ Åtgärden misslyckades eftersom användaren avbröt installationen. Åtgärden misslyckades eftersom användaren avbröt installationen. Installationen misslyckades eftersom användaren försökte nedgradera paketet. Avinstallera uppdateringar från lagerappen YouTube, försök sedan igen. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Operation misslyckades av okänd anledning, vänligen gå med i vårt Telegram eller Discord för support. 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. diff --git a/app/src/main/res/values-ta-rIN/strings.xml b/app/src/main/res/values-ta-rIN/strings.xml index 4f0d0c18f4..c20d3e4eae 100644 --- a/app/src/main/res/values-ta-rIN/strings.xml +++ b/app/src/main/res/values-ta-rIN/strings.xml @@ -51,10 +51,12 @@ Chrome தனிப்பயன் தாவல்களைப் பயன்படுத்தவும் Chrome தனிப்பயன் தாவல்களில் இணைப்புகள் திறக்கப்படும் கணினி இயல்புநிலை + புதிய நேர மதிப்பைச் சேமிப்பதில் தோல்வி + ரூட் ஸ்கிரிப்ட் தூக்க நேரம் + பெருகிவரும் சிக்கல்களை சரிசெய்ய பயனுள்ளதாக இருக்கும் /data/adb/service.d/app.sh ஸ்கிரிப்டில் பயன்படுத்தப்படும் தூக்க நேர மதிப்பை சரிசெய்யவும் தீம் இருண்ட தீம் ஒளி தீம் - சேனல் URL ஐப் புதுப்பிக்கவும் %1$s புஷ் அறிவிப்புகள் %1$s க்கான புதுப்பிப்பு வெளியிடப்படும் போது புஷ் அறிவிப்புகளைப் பெறுக மேலாளர் புதுப்பிப்பு மையம் diff --git a/app/src/main/res/values-th-rTH/strings.xml b/app/src/main/res/values-th-rTH/strings.xml index 342a107f41..42090e741c 100644 --- a/app/src/main/res/values-th-rTH/strings.xml +++ b/app/src/main/res/values-th-rTH/strings.xml @@ -32,8 +32,8 @@ ไม่ได้รับสิทธิ์ของรูท ไม่สามารถใช้ได้ อัพเดท - Social Media - Support us + เหมาะสมกับโซเชียลมีเดีย + สนับสนุนพวกเรา สีหลัก สีน้ำเงิน @@ -51,10 +51,12 @@ ใช้แท็บที่กำหนดเองของ Chrome ลิ้งค์จะเปิดไปยังแท็บที่กำหนดเองของ Chrome ค่าเริ่มต้นของระบบ + 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 ธีม ธีมมืด ธีมสว่าง - ช่องทางอัพเดต URL %1$s การแจ้งเตือนแบบพุช รับการแจ้งเตือนแบบพุช เมื่อมีการเผยแพร่อัปเดต %1$s ล่าสุด การจัดการอัพเดพหลัก @@ -102,7 +104,7 @@ การติดตั้งล้มเหลวเนื่องจากผู้ใช้ยกเลิกการติดตั้ง การติดตั้งล้มเหลวเนื่องจากผู้ใช้บล็อกการติดตั้ง การติดตั้งล้มเหลว เนื่องจากผู้ใช้พยายามดาวน์เกรดแพ็กเกจ. กรุณาถอนการติดตั้งการอัปเดตจากแอป YouTube แล้วลองติดตั้งใหม่อีกครั้ง - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. การติดตั้งล้มเหลวโดยไม่ทราบสาเหตุ ลองเข้าร่วม Telegram หรือ Discord ของเรา เพื่อรับการสนับสนุนเพิ่มเติม การติดตั้งล้มเหลวเนื่องจากไฟล์การติดตั้งเข้ากันไม่ได้กับอุปกรณ์ของคุณ กรุณาล้างไฟล์ที่ดาวน์โหลดในการตั้งค่า แล้วลองอีกครั้ง การติดตั้งล้มเหลวเนื่องจากไฟล์ apk เสียหายโปรดลองอีกครั้ง diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 317157b120..c311a6f2d6 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -24,7 +24,7 @@ Uygulama alanına dokunarak değişiklikleri görebilirsin. Sürüm Notları %1$s indiriliyor - Yükleme + Yükle Yeniden yükle Yüklü: En son: @@ -51,10 +51,12 @@ Chrome Özel Sekmelerini kullan Bağlantılar Chrome Özel Sekmelerinde açılacaktır Sistem varsayılanı + 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 Tema Koyu Tema Açık Tema - Güncelleme kaynağı (URL) %1$s Anlık Bildirimleri %1$s için bir güncelleme yayınlandığında anlık bildirimler alın Manager Güncelleme Merkezi @@ -69,7 +71,7 @@ Tema: %1$s Sürüm: %1$s Kılavuz - Dur! + 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. MIUI tespit edildi! Vanced\'i yüklemek için geliştirici ayarlarından MIUI Optimizasyonları, devre dışı bırakılmalıdır. (xiaomi.eu tabanlı 20.2.20 veya üzeri bir ROM kullanıyorsanız, bu uyarıyı göz ardı edebilirsiniz) @@ -102,7 +104,7 @@ Kullanıcı kurulumu iptal ettiği için kurulum başarısız oldu. Kullanıcı kurulumu engellediği için kurulum başarısız oldu. 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. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Kurulum bilinmeyen nedenlerden dolayı başarısız oldu. Telegram veya Discord\'a katılarak destek alabilirsin. 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. diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index af2b20fec5..814e796e43 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -15,7 +15,7 @@ На Пристрої Є Root Права? Надати Root Права Оберіть принаймні один додаток! - Vanced, але для YouTube Music!\nвідносно не багата на можливості, але задовольняє ваші потреби. + Vanced, але для YouTube Music!\nВідносно не багата на можливості, але задовольняє ваші потреби. YouTube Vanced - це стандартний Android YouTube додаток, але краще! Почнімо Не знаєте, що це або не хочете використовувати рутовану версію? Просто натисніть синю стрілку внизу! @@ -32,8 +32,8 @@ Права суперкористувача не були надані Недоступно Оновити - Social Media - Support us + Соціальні мережі + Підтримайте нас Вторинний колір Синій @@ -51,10 +51,12 @@ Використовувати Chrome Custom Tabs Відкривати посилання в Chrome Custom Tabs Системна + Неможливо зберегти нове значення часу + Скрипт Таймера сну + Налаштування значення часу сну, використовуваного в скрипті /data/adb/service.d/app.sh, корисно для вирішення проблем монтування Тема Темна тема Світла тема - URL-адреса до каналу з оновленнями %1$s Спливаючі Сповіщення Отримувати спливаючі сповіщення, коли доступне оновлення для %1$s Центр Оновлень @@ -102,7 +104,7 @@ Встановлення не вдалося, оскільки користувач перервав встановлення. Встановлення не вдалося, оскільки користувач заблокував встановлення. Помилка встановлення, оскільки користувач намагався знизити пакет. Видаліть оновлення з програми YouTube на складі, а потім спробуйте ще раз. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Встановлення не вдалася, так як додаток конфліктує з уже встановленим додатком. Видаліть поточну версію додатку, і спробуйте ще раз. Інсталяція була провалена з невідомих причин. Приєднуйтесь до нашої групи в Telegram або Discord для подальшої підтримки. Помилка встановлення, оскільки файл несумісний з вашим пристроєм. Очистіть завантажені файли в Налаштуваннях, а потім спробуйте ще раз. Встановлення неможливе, оскільки apk-файли пошкоджені, будь ласка, спробуйте ще раз. diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index d96c1bd562..5d00d099b0 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -10,7 +10,7 @@ Giới thiệu Manager Cài đặt - Cật nhật Manager + Cập nhật Manager Thiết Bị Của Bạn Đã Được Root? Cấp quyền root @@ -18,7 +18,7 @@ Vanced, nhưng cho YouTube Music!\ntương đối ít tính năng nhưng đáp ứng những gì bạn cần. YouTube Vanced cũng là ứng dụng YouTube gốc nhưng tốt hơn! Bắt đầu nào - Bạn không biết đây là gì hoặc không muốn sử dụng phiên bản root? chỉ cần nhấp vào mũi tên màu xanh bên dưới! + Bạn không biết đây là gì hoặc không muốn sử dụng phiên bản root? chỉ cần nhấp vào mũi tên màu xanh bên dưới! Thông tin về %1$s Nhấn vào thẻ để xem các thay đổi. @@ -32,8 +32,8 @@ Quyền root không được cấp Không tồn tại Cập nhật - Social Media - Support us + Mạng xã hội + Hỗ trợ chúng tôi Màu chủ đạo Xanh dương @@ -51,10 +51,12 @@ Sử dụng Chrome Custom Tabs Các liên kết sẽ mở trong Chrome Custom Tabs Mặc định hệ thống + 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 Nền Nền tối Nền sáng - URL kênh cập nhật 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 Trung tâm cập nhật @@ -72,7 +74,7 @@ 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. Phát hiện MIUI! - Để cài đặt 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ạn có thể bỏ qua cảnh báo này nếu bạn đang sử dụng ROM dựa trên xiaomi.eu 20.2.20 trở lên) + Để cài đặt Vanced, bạn BẮT BUỘC 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) Lỗi 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 @@ -101,8 +103,8 @@ Không thể xác định tệp tin apk cho chủ đề đen/tối từ bộ nhớ, vui lòng thử lại. Cài đặt không thành công vì người dùng đã hủy cài đặt. Cài đặt không thành công vì người dùng đã chặn cài đặt. - Cài đặt không thành công do người dùng đã cố gắng giáng cấp ứng dụng. Gỡ cài đặt các bản cập nhật khỏi ứng dụng YouTube gốc thử lại. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Cài đặt không thành công do người dùng đã cố gắng hạ cấp gói. Gỡ cài đặt các bản cập nhật khỏi ứng dụng YouTube có sẵn, sau đó thử lại. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Cài đặt thất bại do lỗi không xác định, tham gia Telegram hoặc Discord của chúng tôi để được hỗ trợ thêm. 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. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index cdc7068365..ff339d1f87 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -51,10 +51,12 @@ 使用 Chrome Custom Tabs 链接会使用 Chrome Custom Tabs 打开 系统默认 + 保存新定时器值失败 + Root 脚本睡眠定时器 + 调整 /data/adb/service.d/app.sh 脚本中的睡眠定时器值,有助于修复挂载问题。 主题 深色主题 浅色主题 - 更新通道链接 %1$s 推送通知 %1$s 有可用更新时接收推送通知 Manager 更新中心 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 89a8c4ca48..30f2ecf23c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -51,10 +51,12 @@ 使用 Chrome Custom Tabs 連結會使用 Chrome Custom Tabs 開啟 系統預設 + 儲存定時器時間失敗 + Root 腳本休眠時間 + 調整 /data/adb/service.d/app.sh 指令碼中的休眠時間值,對修復掛載問題很有用 主題 深色主題 淺色主題 - 更新管道 %1$s 推送通知 有可用更新時接收 %1$s 推送通知 Manager 更新中心 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 7d352f1c8d..903f4a4947 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -32,4 +32,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c3cd83ba48..25d66ded6c 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,10 +56,13 @@ Use Chrome Custom Tabs Links will open in Chrome Custom Tabs System Default + 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 Theme Dark Theme Light Theme - Update Channel URL + Channel URL %1$s Push Notifications Receive push notifications when an update for %1$s is released Manager Update Center @@ -111,7 +114,7 @@ Installation failed because the user aborted the installation. Installation failed because the user blocked the installation. Installation failed because the user tried to downgrade the package. Uninstall updates from the stock YouTube app, then try again. - Installation failed because of the app conflicts with an already installed app. Uninstall the current version of the app, then try again. + Installation failed because the app conflicts with an already installed app. Uninstall the current version of the app, then try again. Installation failed for unknown reasons, join our Telegram or Discord for further support. 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. diff --git a/app/src/main/res/xml/dev_settings.xml b/app/src/main/res/xml/dev_settings.xml deleted file mode 100644 index 081b27e077..0000000000 --- a/app/src/main/res/xml/dev_settings.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b759335555..0000000000 --- a/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.4.21' - repositories { - google() - jcenter() - - } - dependencies { - classpath 'com.android.tools.build:gradle:4.1.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.4' - classpath 'com.google.firebase:perf-plugin:1.3.4' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' - classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - jcenter() - maven { - url "https://jitpack.io" - } - - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000..1bbdcef682 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,32 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath("com.android.tools.build:gradle:4.1.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21") + classpath("com.google.gms:google-services:4.3.4") + classpath("com.google.firebase:perf-plugin:1.3.4") + classpath("com.google.firebase:firebase-crashlytics-gradle:2.4.1") + classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2") + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle.kts files + } +} + +allprojects { + repositories { + google() + jcenter() + maven(url = "https://jitpack.io") + } +} + +task("clean") { + delete(rootProject.buildDir) +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000000..051fc6281d --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000000..ce6e1f7ef5 --- /dev/null +++ b/buildSrc/src/main/java/Config.kt @@ -0,0 +1,5 @@ +object Config { + + const val kotlinVersion = "1.4.21" + +} \ No newline at end of file diff --git a/core-mvi/build.gradle b/core-mvi/build.gradle deleted file mode 100644 index 3beb9d8a56..0000000000 --- a/core-mvi/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -test { - useJUnitPlatform() -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - 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.1' - testImplementation 'io.kotest:kotest-assertions-core:4.3.1' - testImplementation 'io.kotest:kotest-property:4.3.1' - testImplementation "io.mockk:mockk:1.10.2" -} \ No newline at end of file diff --git a/core-mvi/build.gradle.kts b/core-mvi/build.gradle.kts new file mode 100644 index 0000000000..c359ea8f9d --- /dev/null +++ b/core-mvi/build.gradle.kts @@ -0,0 +1,19 @@ +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-presentation/build.gradle b/core-presentation/build.gradle deleted file mode 100644 index ddc8a57175..0000000000 --- a/core-presentation/build.gradle +++ /dev/null @@ -1,39 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.2" - - defaultConfig { - minSdkVersion 16 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - 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/build.gradle.kts b/core-presentation/build.gradle.kts new file mode 100644 index 0000000000..85d1b3ca34 --- /dev/null +++ b/core-presentation/build.gradle.kts @@ -0,0 +1,42 @@ +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-ui/build.gradle.kts b/core-ui/build.gradle.kts new file mode 100644 index 0000000000..0fa3dcd987 --- /dev/null +++ b/core-ui/build.gradle.kts @@ -0,0 +1,52 @@ +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("com.google.android.material:material:1.3.0-rc01") + + //https://developer.android.com/jetpack/androidx/releases/lifecycle + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.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 index d632edefff..fd19e8c399 100644 --- 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 @@ -1,10 +1,14 @@ 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() { @@ -22,6 +26,20 @@ abstract class BindingBottomSheetDialogFragment : BottomSheetD 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 + peekHeight = 0 + } + } + } + return dialog + } + protected abstract fun binding( inflater: LayoutInflater, container: ViewGroup?, diff --git a/feature-home/build.gradle.kts b/feature-home/build.gradle.kts new file mode 100644 index 0000000000..759b853225 --- /dev/null +++ b/feature-home/build.gradle.kts @@ -0,0 +1,87 @@ +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.2.5") + implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0") + implementation("com.google.android.material:material:1.3.0-rc01") + 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.0") + + 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.0.RC1") + testImplementation("io.kotest:kotest-assertions-core:4.4.0.RC1") + testImplementation("io.kotest:kotest-property:4.4.0.RC1") + testImplementation("io.mockk:mockk:1.10.5") + + androidTestImplementation("io.mockk:mockk-android:1.10.5") + 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/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ebbfb8e92f..cef5a4c745 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Nov 19 13:31:11 GET 2020 +#Sat Jan 09 23:28:33 GET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip diff --git a/library-network/build.gradle b/library-network/build.gradle deleted file mode 100644 index a211381489..0000000000 --- a/library-network/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' -} - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.2" - - defaultConfig { - minSdkVersion 16 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - 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.0" - - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" - - 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/build.gradle.kts b/library-network/build.gradle.kts new file mode 100644 index 0000000000..2f9140be24 --- /dev/null +++ b/library-network/build.gradle.kts @@ -0,0 +1,56 @@ +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.0") + + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1") + + 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/java/com/vanced/manager/library/network/providers/RetrofitProvider.kt b/library-network/src/main/java/com/vanced/manager/library/network/providers/RetrofitProvider.kt index 6ecccda467..edafe26b2d 100644 --- 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 @@ -4,6 +4,7 @@ import com.squareup.moshi.Moshi import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory +import kotlin.reflect.KClass fun provideRetrofit( okHttpClient: OkHttpClient, @@ -13,4 +14,12 @@ fun provideRetrofit( .addConverterFactory(MoshiConverterFactory.create(moshi)) .client(okHttpClient) .baseUrl(url) - .build() \ No newline at end of file + .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/settings.gradle b/settings.gradle deleted file mode 100644 index d264cef545..0000000000 --- a/settings.gradle +++ /dev/null @@ -1,8 +0,0 @@ -rootProject.name='Vanced Manager' -include ':app' - -include ':core-presentation', ':core-ui' , ':core-mvi' - -include ':feature-home' - -include ':library-network' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000000..e7d18a0a03 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,9 @@ +rootProject.name = "Vanced Manager" + +include(":app") + +include(":core-presentation", ":core-ui" , ":core-mvi") + +include(":feature-home") + +include(":library-network")