commit
7d7c6f2e6e
|
@ -20,8 +20,8 @@ android {
|
|||
applicationId "com.vanced.manager"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 13
|
||||
versionName "1.3.0b (Arcturus)"
|
||||
versionCode 131
|
||||
versionName "1.3.1 (Arcturus)"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
||||
|
@ -88,11 +88,9 @@ def getLanguageNames() {
|
|||
for (int i = 0; i < langs.size(); i++) {
|
||||
if (langs[i].length() > 2) {
|
||||
Locale loc = new Locale(langs[i].substring(0, langs[i].length() - 3), langs[i].substring(langs[i].length() - 2))
|
||||
project.logger.lifecycle(loc.getDisplayLanguage(loc).capitalize() + " (" + loc.getDisplayCountry(loc).capitalize() + ")")
|
||||
langnames.add(loc.getDisplayLanguage(loc).capitalize() + " (" + loc.getDisplayCountry(loc).capitalize() + ")")
|
||||
} else {
|
||||
Locale loc = new Locale(langs[i])
|
||||
project.logger.lifecycle(loc.getDisplayLanguage(loc).capitalize())
|
||||
langnames.add(loc.getDisplayLanguage(loc).capitalize())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
|
||||
<queries>
|
||||
<package android:name="com.vanced.android.youtube" />
|
||||
|
@ -45,6 +46,7 @@
|
|||
android:name=".ui.MainActivity"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/DarkTheme.Blue"
|
||||
android:configChanges="layoutDirection|locale"
|
||||
android:exported="true"/>
|
||||
|
||||
<meta-data
|
||||
|
|
|
@ -7,15 +7,12 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.animation.AccelerateDecelerateInterpolator
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.Toast
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.databinding.ViewHomeBinding
|
||||
import com.vanced.manager.ui.viewmodels.HomeViewModel
|
||||
import kotlinx.android.synthetic.main.include_changelogs.view.*
|
||||
|
||||
class VariantAdapter(private val viewModel: HomeViewModel, private val context: Context) : RecyclerView.Adapter<VariantAdapter.VariantAdapterHolder>() {
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.vanced.manager.core
|
|||
|
||||
import android.app.Application
|
||||
import android.content.res.Configuration
|
||||
import androidx.databinding.ObservableField
|
||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||
import com.beust.klaxon.JsonObject
|
||||
import com.crowdin.platform.Crowdin
|
||||
|
@ -10,14 +11,14 @@ import com.crowdin.platform.data.remote.NetworkType
|
|||
import com.downloader.PRDownloader
|
||||
import com.vanced.manager.utils.InternetTools.baseUrl
|
||||
import com.vanced.manager.utils.JsonHelper.getJson
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
open class App: Application() {
|
||||
|
||||
var vanced: JsonObject? = null
|
||||
var music: JsonObject? = null
|
||||
var microg: JsonObject? = null
|
||||
var manager: JsonObject? = null
|
||||
var vanced = ObservableField<JsonObject?>()
|
||||
var music = ObservableField<JsonObject?>()
|
||||
var microg = ObservableField<JsonObject?>()
|
||||
var manager = ObservableField<JsonObject?>()
|
||||
|
||||
override fun onCreate() {
|
||||
loadJsonAsync()
|
||||
|
@ -33,12 +34,13 @@ open class App: Application() {
|
|||
|
||||
}
|
||||
|
||||
fun loadJsonAsync() {
|
||||
val latest = runBlocking { getJson("${getDefaultSharedPreferences(this@App).getString("update_url", baseUrl)}/latest.json") }
|
||||
vanced = latest.obj("vanced")
|
||||
music = latest.obj("music")
|
||||
microg = latest.obj("microg")
|
||||
manager = latest.obj("manager")
|
||||
open fun loadJsonAsync() {
|
||||
val latest = runBlocking { getJson("${getDefaultSharedPreferences(this@App).getString("install_url", baseUrl)}/latest.json") }
|
||||
|
||||
vanced.set(latest?.obj("vanced"))
|
||||
music.set(latest?.obj("music"))
|
||||
microg.set(latest?.obj("microg"))
|
||||
manager.set(latest?.obj("manager"))
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
|
@ -46,4 +48,5 @@ open class App: Application() {
|
|||
Crowdin.onConfigurationChanged()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -6,10 +6,10 @@ import com.downloader.Error
|
|||
import com.downloader.OnDownloadListener
|
||||
import com.downloader.PRDownloader
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.core.App
|
||||
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.microgProgress
|
||||
import com.vanced.manager.utils.AppUtils.mutableInstall
|
||||
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
|
||||
import com.vanced.manager.utils.InternetTools.getJsonString
|
||||
import com.vanced.manager.utils.PackageHelper.install
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
|
@ -17,18 +17,15 @@ import kotlinx.coroutines.launch
|
|||
|
||||
object MicrogDownloader {
|
||||
|
||||
//private var downloadId: Long = 0
|
||||
|
||||
fun downloadMicrog(context: Context) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val url = getJsonString("microg.json", "url", context)
|
||||
//downloadId = download(url, "apk", "microg.apk", this@MicrogDownloadService)
|
||||
val url = (context.applicationContext as App).microg.get()?.string("url")
|
||||
|
||||
microgProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("apk")?.path, "microg.apk")
|
||||
.build()
|
||||
.setOnStartOrResumeListener {
|
||||
mutableInstall.value = true
|
||||
microgProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, getFileNameFromUrl(url)))
|
||||
microgProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, url?.let { getFileNameFromUrl(it) }))
|
||||
microgProgress.get()?.showDownloadBar?.set(true)
|
||||
}
|
||||
.setOnCancelListener {
|
||||
|
@ -55,19 +52,4 @@ object MicrogDownloader {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
private val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
|
||||
//prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply()
|
||||
//cancelNotif(channel, this@MicrogDownloadService)
|
||||
val bIntent = Intent(this@MicrogDownloadService, AppInstaller::class.java)
|
||||
bIntent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk")
|
||||
bIntent.putExtra("pkg", "com.mgoogle.android.gms")
|
||||
startService(bIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
@ -6,10 +6,10 @@ import com.downloader.Error
|
|||
import com.downloader.OnDownloadListener
|
||||
import com.downloader.PRDownloader
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.core.App
|
||||
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.musicProgress
|
||||
import com.vanced.manager.utils.AppUtils.mutableInstall
|
||||
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
|
||||
import com.vanced.manager.utils.InternetTools.getJsonString
|
||||
import com.vanced.manager.utils.PackageHelper.install
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
|
@ -17,14 +17,9 @@ import kotlinx.coroutines.launch
|
|||
|
||||
object MusicDownloader {
|
||||
|
||||
//private var downloadId: Long = 0
|
||||
|
||||
fun downloadMusic(context: Context){
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val version = getJsonString("music.json", "version", context)
|
||||
val url = "https://vanced.app/api/v1/music/v$version.apk"
|
||||
|
||||
//downloadId = download(url, "apk", "music.apk", this@MusicDownloadService)
|
||||
val url = "https://vanced.app/api/v1/music/v${(context.applicationContext as App).music.get()?.string("version")}.apk"
|
||||
|
||||
musicProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("apk")?.path, "music.apk")
|
||||
.build()
|
||||
|
@ -58,19 +53,4 @@ object MusicDownloader {
|
|||
|
||||
}
|
||||
|
||||
/*
|
||||
private val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
|
||||
//prefs?.edit()?.putBoolean("isMusicDownloading", false)?.apply()
|
||||
//cancelNotif(channel, this@MusicDownloadService)
|
||||
val bIntent = Intent(this@MusicDownloadService, AppInstaller::class.java)
|
||||
bIntent.putExtra("path", "${getExternalFilesDir("apk")}/music.apk")
|
||||
bIntent.putExtra("pkg", "com.mgoogle.android.gms")
|
||||
startService(bIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
@ -14,10 +14,10 @@ import com.vanced.manager.R
|
|||
import com.vanced.manager.core.App
|
||||
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.vancedProgress
|
||||
import com.vanced.manager.utils.AppUtils.mutableInstall
|
||||
import com.vanced.manager.utils.AppUtils.vancedRootPkg
|
||||
import com.vanced.manager.utils.InternetTools
|
||||
import com.vanced.manager.utils.InternetTools.baseUrl
|
||||
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
|
||||
import com.vanced.manager.utils.InternetTools.getObjectFromJson
|
||||
import com.vanced.manager.utils.PackageHelper.getPkgVerCode
|
||||
import com.vanced.manager.utils.PackageHelper.installVanced
|
||||
import com.vanced.manager.utils.PackageHelper.installVancedRoot
|
||||
|
@ -28,6 +28,7 @@ import kotlinx.coroutines.runBlocking
|
|||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.security.MessageDigest
|
||||
import java.util.*
|
||||
|
||||
object VancedDownloader {
|
||||
|
||||
|
@ -42,18 +43,15 @@ object VancedDownloader {
|
|||
private var lang: Array<String>? = null
|
||||
|
||||
private lateinit var themePath: String
|
||||
|
||||
//private var downloadId: Long = 0
|
||||
//private var apkType: String = "arch"
|
||||
|
||||
private var count: Int = 0
|
||||
private var hashUrl = ""
|
||||
|
||||
private const val yPkg = "com.google.android.youtube"
|
||||
private var vancedVersionCode = 0
|
||||
private val vancedVersion by lazy { runBlocking { getObjectFromJson("$installUrl/vanced.json", "version") }}
|
||||
private var vancedVersion: String? = null
|
||||
|
||||
fun downloadVanced(context: Context){
|
||||
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
|
||||
val app = context.applicationContext as App
|
||||
File(context.getExternalFilesDir("apks")?.path as String).deleteRecursively()
|
||||
defPrefs = getDefaultSharedPreferences(context)
|
||||
installUrl = defPrefs.getString("install_url", baseUrl)
|
||||
|
@ -61,6 +59,7 @@ object VancedDownloader {
|
|||
variant = defPrefs.getString("vanced_variant", "nonroot")
|
||||
lang = prefs.getString("lang", "en")?.split(", ")?.toTypedArray()
|
||||
theme = prefs.getString("theme", "dark")
|
||||
vancedVersion = app.vanced.get()?.string("version")
|
||||
themePath = "$installUrl/apks/v$vancedVersion/$variant/Theme"
|
||||
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
|
||||
//newInstaller = defPrefs.getBoolean("new_installer", false)
|
||||
|
@ -70,8 +69,8 @@ object VancedDownloader {
|
|||
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
|
||||
else -> "armeabi_v7a"
|
||||
}
|
||||
val app = context.applicationContext as App
|
||||
vancedVersionCode = app.vanced?.int("versionCode") ?: 0
|
||||
|
||||
vancedVersionCode = app.vanced.get()?.int("versionCode") ?: 0
|
||||
downloadSplits(context)
|
||||
}
|
||||
|
||||
|
@ -90,11 +89,7 @@ object VancedDownloader {
|
|||
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
|
||||
}
|
||||
|
||||
//apkType = type
|
||||
//downloadId = download(url, "apks", getFileNameFromUrl(url), this@VancedDownloadService)
|
||||
|
||||
vancedProgress.get()?.currentDownload = PRDownloader
|
||||
.download(url, context.getExternalFilesDir("apks")?.path, getFileNameFromUrl(url))
|
||||
vancedProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("apks")?.path, getFileNameFromUrl(url))
|
||||
.build()
|
||||
.setOnStartOrResumeListener {
|
||||
mutableInstall.value = true
|
||||
|
@ -114,7 +109,7 @@ object VancedDownloader {
|
|||
"theme" ->
|
||||
if (variant == "root") {
|
||||
if (validateTheme(context)) {
|
||||
if(downloadStockCheck(context))
|
||||
if (downloadStockCheck(context))
|
||||
downloadSplits(context, "arch")
|
||||
else
|
||||
prepareInstall(variant!!, context)
|
||||
|
@ -143,6 +138,7 @@ object VancedDownloader {
|
|||
else
|
||||
prepareInstall(variant!!, context)
|
||||
} else {
|
||||
count = 0
|
||||
mutableInstall.value = false
|
||||
vancedProgress.get()?.showDownloadBar?.set(false)
|
||||
Toast.makeText(context, context.getString(R.string.error_downloading, getFileNameFromUrl(url)), Toast.LENGTH_SHORT).show()
|
||||
|
@ -154,7 +150,7 @@ object VancedDownloader {
|
|||
|
||||
private fun downloadStockCheck(context: Context) :Boolean {
|
||||
return try {
|
||||
getPkgVerCode(yPkg,context.packageManager) != vancedVersionCode
|
||||
getPkgVerCode(vancedRootPkg, context.packageManager) != vancedVersionCode
|
||||
} catch (e: Exception) {
|
||||
true
|
||||
}
|
||||
|
@ -171,40 +167,13 @@ object VancedDownloader {
|
|||
return checkSHA256(sha256Val!!,themeF)
|
||||
}
|
||||
|
||||
/*
|
||||
private val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
val prefs = context?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
|
||||
val variant = PreferenceManager.getDefaultSharedPreferences(this@VancedDownloadService).getString("vanced_variant", "nonroot")
|
||||
val lang = prefs?.getString("lang", "en")
|
||||
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
|
||||
when (apkType) {
|
||||
"arch" -> downloadSplits(context, "theme")
|
||||
"theme" -> downloadSplits(context, "lang")
|
||||
"lang" -> {
|
||||
if (lang == "en") {
|
||||
prepareInstall(variant!!)
|
||||
//cancelNotif(channel, this@VancedDownloadService)
|
||||
} else {
|
||||
downloadSplits(context, "enlang")
|
||||
}
|
||||
}
|
||||
"enlang" -> {
|
||||
prepareInstall(variant!!)
|
||||
//cancelNotif(channel, this@VancedDownloadService)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
private fun prepareInstall(variant: String, context: Context) {
|
||||
count = 0
|
||||
vancedProgress.get()?.showDownloadBar?.set(false)
|
||||
vancedProgress.get()?.showInstallCircle?.set(true)
|
||||
FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
|
||||
param("Vanced Variant", variant)
|
||||
theme?.let { param("Vanced Theme", it) }
|
||||
param("vanced_variant", variant)
|
||||
theme?.let { param("vanced_theme", it) }
|
||||
}
|
||||
if (variant == "root")
|
||||
installVancedRoot(context)
|
||||
|
@ -218,7 +187,7 @@ object VancedDownloader {
|
|||
// Generate the checksum
|
||||
val sum = generateChecksum(dataBuffer)
|
||||
|
||||
sum == sha256
|
||||
sum.toLowerCase(Locale.ENGLISH) == sha256.toLowerCase(Locale.ENGLISH)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
false
|
||||
|
|
|
@ -3,7 +3,7 @@ package com.vanced.manager.core.firebase
|
|||
import android.util.Log
|
||||
import com.google.firebase.messaging.FirebaseMessagingService
|
||||
|
||||
class CloudMessaging: FirebaseMessagingService() {
|
||||
class CloudMessaging : FirebaseMessagingService() {
|
||||
|
||||
override fun onNewToken(p0: String) {
|
||||
super.onNewToken(p0)
|
||||
|
|
|
@ -15,18 +15,10 @@ import kotlinx.coroutines.Dispatchers
|
|||
import kotlinx.coroutines.launch
|
||||
|
||||
open class DataModel(
|
||||
private val jsonObject: JsonObject?,
|
||||
app: String,
|
||||
private val jsonObject: ObservableField<JsonObject?>,
|
||||
private val appPkg: String,
|
||||
private val context: Context
|
||||
) {
|
||||
|
||||
private val appPkg =
|
||||
when (app) {
|
||||
"vanced" -> "com.vanced.android.youtube"
|
||||
"vancedRoot" -> "com.google.android.youtube"
|
||||
"microg" -> "com.mgoogle.android.gms"
|
||||
else -> "com.vanced.android.apps.youtube.music"
|
||||
}
|
||||
|
||||
private val versionCode = ObservableInt()
|
||||
private val installedVersionCode = ObservableInt()
|
||||
|
@ -40,13 +32,13 @@ open class DataModel(
|
|||
|
||||
fun fetch() = CoroutineScope(Dispatchers.IO).launch {
|
||||
isAppInstalled.set(isPackageInstalled(appPkg, context.packageManager))
|
||||
versionName.set(jsonObject?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable))
|
||||
versionName.set(jsonObject.get()?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable))
|
||||
installedVersionName.set(getPkgVersionName(isAppInstalled.get(), appPkg))
|
||||
versionCode.set(jsonObject?.int("versionCode") ?: 0)
|
||||
versionCode.set(jsonObject.get()?.int("versionCode") ?: 0)
|
||||
installedVersionCode.set(getPkgVersionCode(isAppInstalled.get(), appPkg))
|
||||
buttonTxt.set(compareInt(installedVersionCode.get(), versionCode.get()))
|
||||
buttonIcon.set(compareIntDrawable(installedVersionCode.get(), versionCode.get()))
|
||||
changelog.set(jsonObject?.string("changelog") ?: context.getString(R.string.unavailable))
|
||||
changelog.set(jsonObject.get()?.string("changelog") ?: context.getString(R.string.unavailable))
|
||||
}
|
||||
|
||||
init {
|
||||
|
@ -54,8 +46,9 @@ open class DataModel(
|
|||
}
|
||||
|
||||
private fun getPkgVersionName(toCheck: Boolean, pkg: String): String {
|
||||
val pm = context.packageManager
|
||||
return if (toCheck) {
|
||||
context.packageManager.getPackageInfo(pkg, 0).versionName.removeSuffix("-vanced")
|
||||
pm.getPackageInfo(pkg, 0).versionName.removeSuffix("-vanced")
|
||||
} else {
|
||||
context.getString(R.string.unavailable)
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.vanced.manager.ui
|
|||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.MenuItem
|
||||
|
@ -27,9 +28,6 @@ import com.vanced.manager.utils.InternetTools
|
|||
import com.vanced.manager.utils.LanguageContextWrapper
|
||||
import com.vanced.manager.utils.PackageHelper
|
||||
import com.vanced.manager.utils.ThemeHelper.setFinalTheme
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
|
@ -117,6 +115,17 @@ class MainActivity : AppCompatActivity() {
|
|||
super.attachBaseContext(LanguageContextWrapper.wrap(newBase))
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
recreate() //restarting activity to recreate viewmodels, otherwise some text won't update
|
||||
}
|
||||
|
||||
override fun recreate() {
|
||||
//needed for setting language smh
|
||||
startActivity(Intent(this, this::class.java))
|
||||
finish()
|
||||
}
|
||||
|
||||
private fun initDialogs() {
|
||||
val prefs = getDefaultSharedPreferences(this)
|
||||
val variant = prefs.getString("vanced_variant", "nonroot")
|
||||
|
@ -148,10 +157,8 @@ class MainActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
private fun checkUpdates() {
|
||||
CoroutineScope(Dispatchers.Main).launch {
|
||||
if (InternetTools.isUpdateAvailable()) {
|
||||
UpdateCheckFragment().show(supportFragmentManager, "UpdateCheck")
|
||||
}
|
||||
if (InternetTools.isUpdateAvailable(this)) {
|
||||
UpdateCheckFragment().show(supportFragmentManager, "UpdateCheck")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -73,7 +73,6 @@ object DialogContainer {
|
|||
}
|
||||
}
|
||||
|
||||
//Easter Egg
|
||||
fun statementFalse(context: Context) {
|
||||
MaterialAlertDialogBuilder(context).apply {
|
||||
setTitle("Wait what?")
|
||||
|
|
|
@ -1,23 +1,15 @@
|
|||
package com.vanced.manager.ui.fragments
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.downloader.OnDownloadListener
|
||||
import com.downloader.PRDownloader
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.ui.MainActivity
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import java.io.File
|
||||
import com.vanced.manager.utils.DownloadHelper.downloadManager
|
||||
|
||||
class DevSettingsFragment: PreferenceFragmentCompat() {
|
||||
|
||||
|
@ -45,6 +37,12 @@ class DevSettingsFragment: PreferenceFragmentCompat() {
|
|||
true
|
||||
|
||||
}
|
||||
|
||||
findPreference<Preference>("install_url")?.setOnPreferenceClickListener {
|
||||
URLChangeFragment().show(childFragmentManager.beginTransaction(), "Install URL")
|
||||
true
|
||||
}
|
||||
|
||||
val supportedAbis: Array<String> = Build.SUPPORTED_ABIS
|
||||
|
||||
findPreference<Preference>("device_arch")?.summary =
|
||||
|
@ -58,38 +56,7 @@ class DevSettingsFragment: PreferenceFragmentCompat() {
|
|||
|
||||
val forceUpdate: Preference? = findPreference("force_update")
|
||||
forceUpdate?.setOnPreferenceClickListener {
|
||||
runBlocking {
|
||||
launch {
|
||||
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
|
||||
//downloadId = activity?.let { download(url, "apk", "manager.apk", it) }!!
|
||||
PRDownloader.download(url, activity?.getExternalFilesDir("apk")?.path, "manager.apk")
|
||||
.build()
|
||||
.start(object : OnDownloadListener {
|
||||
override fun onDownloadComplete() {
|
||||
activity?.let {
|
||||
val apk = File("${activity?.getExternalFilesDir("apk")?.path}/manager.apk")
|
||||
val uri =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
FileProvider.getUriForFile(activity!!, "${activity?.packageName}.provider", apk)
|
||||
else
|
||||
Uri.fromFile(apk)
|
||||
|
||||
val intent = Intent(Intent.ACTION_VIEW)
|
||||
intent.setDataAndType(uri, "application/vnd.android.package-archive")
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(error: com.downloader.Error?) {
|
||||
Toast.makeText(activity, error.toString(), Toast.LENGTH_SHORT).show()
|
||||
Log.e("VMUpgrade", error.toString())
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
downloadManager(true, requireActivity())
|
||||
true
|
||||
}
|
||||
|
||||
|
|
|
@ -22,12 +22,15 @@ import com.vanced.manager.adapter.VariantAdapter
|
|||
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.utils.AppUtils
|
||||
import com.vanced.manager.ui.viewmodels.HomeViewModelFactory
|
||||
import com.vanced.manager.utils.AppUtils.installing
|
||||
|
||||
open class HomeFragment : Fragment() {
|
||||
|
||||
private lateinit var binding: FragmentHomeBinding
|
||||
private val viewModel: HomeViewModel by viewModels()
|
||||
private val viewModel: HomeViewModel by viewModels {
|
||||
HomeViewModelFactory(requireActivity())
|
||||
}
|
||||
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
|
||||
|
||||
private val tabListener = object : TabLayout.OnTabSelectedListener {
|
||||
|
@ -78,7 +81,7 @@ open class HomeFragment : Fragment() {
|
|||
mainTablayout.getTabAt(if (getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot") == "root") 1 else 0)?.select()
|
||||
}
|
||||
|
||||
AppUtils.installing.observe(viewLifecycleOwner, { value ->
|
||||
installing.observe(viewLifecycleOwner, { value ->
|
||||
if (value) hideTab() else showTab()
|
||||
})
|
||||
|
||||
|
|
|
@ -115,11 +115,6 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
|||
true
|
||||
}
|
||||
|
||||
findPreference<Preference>("install_url")?.setOnPreferenceClickListener {
|
||||
URLChangeFragment().show(childFragmentManager.beginTransaction(), "Install URL")
|
||||
true
|
||||
}
|
||||
|
||||
findPreference<Preference>("clear_files")?.setOnPreferenceClickListener {
|
||||
with(requireActivity()) {
|
||||
listOf("apk", "apks").forEach { dir ->
|
||||
|
|
|
@ -9,7 +9,7 @@ import android.view.ViewGroup
|
|||
import android.widget.EditText
|
||||
import android.widget.TextView
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.utils.InternetTools.baseUrl
|
||||
|
@ -29,8 +29,7 @@ class URLChangeFragment : DialogFragment() {
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
val urlField = view.findViewById<EditText>(R.id.url_input)
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||
urlField.setText(prefs.getString("install_url", baseUrl), TextView.BufferType.EDITABLE)
|
||||
urlField.setText(getDefaultSharedPreferences(requireActivity()).getString("install_url", baseUrl), TextView.BufferType.EDITABLE)
|
||||
view.findViewById<MaterialButton>(R.id.url_save).setOnClickListener {
|
||||
val finalUrl =
|
||||
if (urlField.text.startsWith("https://") || urlField.text.startsWith("http://"))
|
||||
|
@ -38,14 +37,14 @@ class URLChangeFragment : DialogFragment() {
|
|||
else
|
||||
"https://${urlField.text}".removeSuffix("/")
|
||||
|
||||
saveUrl(finalUrl)
|
||||
}
|
||||
view.findViewById<MaterialButton>(R.id.url_reset).setOnClickListener {saveUrl(baseUrl)}
|
||||
}
|
||||
|
||||
prefs.edit().putString("install_url", finalUrl).apply()
|
||||
dismiss()
|
||||
}
|
||||
view.findViewById<MaterialButton>(R.id.url_reset).setOnClickListener {
|
||||
prefs.edit().putString("install_url", baseUrl).apply()
|
||||
dismiss()
|
||||
}
|
||||
private fun saveUrl(url: String) {
|
||||
getDefaultSharedPreferences(requireActivity()).edit().putString("install_url", url).apply()
|
||||
dismiss()
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,34 +1,21 @@
|
|||
package com.vanced.manager.ui.fragments
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Button
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import com.downloader.OnDownloadListener
|
||||
import com.downloader.PRDownloader
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.utils.DownloadHelper.downloadManager
|
||||
import com.vanced.manager.utils.InternetTools.isUpdateAvailable
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import java.io.File
|
||||
|
||||
class UpdateCheckFragment : DialogFragment() {
|
||||
|
||||
//private var downloadId: Long = 0
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
|
@ -41,7 +28,6 @@ class UpdateCheckFragment : DialogFragment() {
|
|||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
//activity?.registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
|
||||
checkUpdates()
|
||||
view.findViewById<Button>(R.id.update_center_dismiss).setOnClickListener { dismiss() }
|
||||
view.findViewById<MaterialButton>(R.id.update_center_recheck).setOnClickListener{ checkUpdates() }
|
||||
|
@ -49,71 +35,21 @@ class UpdateCheckFragment : DialogFragment() {
|
|||
downLoadingState(false)
|
||||
}
|
||||
|
||||
/*
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
activity?.unregisterReceiver(receiver)
|
||||
}
|
||||
*/
|
||||
|
||||
private fun checkUpdates() {
|
||||
val updatebtn = view?.findViewById<Button>(R.id.update_center_update)
|
||||
val checkingTxt = view?.findViewById<TextView>(R.id.update_center_checking)
|
||||
|
||||
runBlocking {
|
||||
if (isUpdateAvailable()) {
|
||||
view?.findViewById<Button>(R.id.update_center_recheck)?.visibility = View.GONE
|
||||
checkingTxt?.text = getString(R.string.update_found)
|
||||
|
||||
updatebtn?.setOnClickListener { upgradeManager() }
|
||||
} else
|
||||
checkingTxt?.text = getString(R.string.update_notfound)
|
||||
}
|
||||
}
|
||||
|
||||
private fun upgradeManager() {
|
||||
runBlocking {
|
||||
launch {
|
||||
val loadBar = view?.findViewById<ProgressBar>(R.id.update_center_progressbar)
|
||||
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
|
||||
if (isUpdateAvailable(requireActivity())) {
|
||||
view?.findViewById<Button>(R.id.update_center_recheck)?.visibility = View.GONE
|
||||
checkingTxt?.text = getString(R.string.update_found)
|
||||
|
||||
updatebtn?.setOnClickListener {
|
||||
downLoadingState(true)
|
||||
|
||||
//downloadId = activity?.let { download(url, "apk", "manager.apk", it) }!!
|
||||
PRDownloader.download(url, activity?.getExternalFilesDir("apk")?.path, "manager.apk")
|
||||
.build()
|
||||
.setOnProgressListener { progress ->
|
||||
val mProgress = progress.currentBytes * 100 / progress.totalBytes
|
||||
loadBar?.visibility = View.VISIBLE
|
||||
loadBar?.progress = mProgress.toInt()
|
||||
}
|
||||
.start(object : OnDownloadListener {
|
||||
override fun onDownloadComplete() {
|
||||
activity?.let {
|
||||
val apk = File("${activity?.getExternalFilesDir("apk")?.path}/manager.apk")
|
||||
val uri =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
FileProvider.getUriForFile(activity!!, "${activity?.packageName}.provider", apk)
|
||||
else
|
||||
Uri.fromFile(apk)
|
||||
|
||||
val intent = Intent(Intent.ACTION_VIEW)
|
||||
intent.setDataAndType(uri, "application/vnd.android.package-archive")
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(error: com.downloader.Error?) {
|
||||
Toast.makeText(activity, error.toString(), Toast.LENGTH_SHORT).show()
|
||||
downLoadingState(false)
|
||||
Log.e("VMUpgrade", error.toString())
|
||||
}
|
||||
|
||||
})
|
||||
downloadManager(false, requireActivity(), view?.findViewById(R.id.update_center_progressbar))
|
||||
downLoadingState(false)
|
||||
}
|
||||
}
|
||||
} else
|
||||
checkingTxt?.text = getString(R.string.update_notfound)
|
||||
}
|
||||
|
||||
private fun downLoadingState(isDownloading: Boolean) {
|
||||
|
@ -127,31 +63,4 @@ class UpdateCheckFragment : DialogFragment() {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
private val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
|
||||
activity?.let {
|
||||
val apk = File("${activity?.getExternalFilesDir("apk")}/manager.apk")
|
||||
val uri =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
FileProvider.getUriForFile(activity!!, "${activity?.packageName}.provider", apk)
|
||||
else
|
||||
Uri.fromFile(apk)
|
||||
|
||||
val mIntent = Intent(Intent.ACTION_VIEW)
|
||||
mIntent.setDataAndType(uri, "application/vnd.android.package-archive")
|
||||
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
mIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
startActivity(mIntent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ class VancedLanguageSelectionFragment : Fragment() {
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
val app = activity?.application as App
|
||||
langs = app.vanced?.array<String>("langs")?.value ?: mutableListOf("null")
|
||||
langs = app.vanced.get()?.array<String>("langs")?.value ?: mutableListOf("null")
|
||||
loadBoxes(view.findViewById(R.id.lang_button_ll))
|
||||
view.findViewById<MaterialButton>(R.id.vanced_install_finish).setOnClickListener {
|
||||
val chosenLangs = mutableListOf("en")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package com.vanced.manager.ui.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import android.app.Activity
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
|
@ -9,12 +9,13 @@ import android.widget.Toast
|
|||
import androidx.core.content.ContextCompat.startActivity
|
||||
import androidx.databinding.ObservableBoolean
|
||||
import androidx.databinding.ObservableField
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.crowdin.platform.Crowdin
|
||||
import com.downloader.PRDownloader
|
||||
import com.downloader.Status
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.core.App
|
||||
import com.vanced.manager.core.downloader.MicrogDownloader.downloadMicrog
|
||||
|
@ -24,15 +25,19 @@ import com.vanced.manager.model.DataModel
|
|||
import com.vanced.manager.model.ProgressModel
|
||||
import com.vanced.manager.ui.events.Event
|
||||
import com.vanced.manager.utils.AppUtils.installing
|
||||
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.vancedPkg
|
||||
import com.vanced.manager.utils.AppUtils.vancedRootPkg
|
||||
import com.vanced.manager.utils.InternetTools
|
||||
import com.vanced.manager.utils.PackageHelper.uninstallApk
|
||||
|
||||
open class HomeViewModel(application: Application): AndroidViewModel(application) {
|
||||
open class HomeViewModel(private val activity: Activity): ViewModel() {
|
||||
|
||||
private val app = activity.application as App
|
||||
|
||||
val app = application
|
||||
private val managerApp = application as App
|
||||
|
||||
//val variant = getDefaultSharedPreferences(application).getString("vanced_variant", "nonroot")
|
||||
//val variant = getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot")
|
||||
|
||||
val vanced = ObservableField<DataModel>()
|
||||
val vancedRoot = ObservableField<DataModel>()
|
||||
|
@ -47,18 +52,18 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
|
|||
|
||||
fun fetchData() {
|
||||
fetching.set(true)
|
||||
managerApp.loadJsonAsync()
|
||||
app.loadJsonAsync()
|
||||
vanced.get()?.fetch()
|
||||
vancedRoot.get()?.fetch()
|
||||
music.get()?.fetch()
|
||||
microg.get()?.fetch()
|
||||
manager.get()?.fetch()
|
||||
Crowdin.forceUpdate(getApplication())
|
||||
Crowdin.forceUpdate(activity)
|
||||
fetching.set(false)
|
||||
}
|
||||
|
||||
//private val microgSnackbar = Snackbar.make(, R.string.no_microg, Snackbar.LENGTH_LONG).setAction(R.string.install) { downloadMicrog(getApplication()) }
|
||||
private val microgToast = Toast.makeText(app, R.string.no_microg, Toast.LENGTH_LONG)
|
||||
//private val microgSnackbar = Snackbar.make(, R.string.no_microg, Snackbar.LENGTH_LONG).setAction(R.string.install) { downloadMicrog(activity) }
|
||||
private val microgToast = Toast.makeText(activity, R.string.no_microg, Toast.LENGTH_LONG)
|
||||
|
||||
fun openMicrogSettings() {
|
||||
try {
|
||||
|
@ -68,9 +73,9 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
|
|||
"org.microg.gms.ui.SettingsActivity"
|
||||
)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
startActivity(getApplication(), intent, null)
|
||||
startActivity(activity, intent, null)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
Toast.makeText(getApplication(), "Error", Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(activity, "Error", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,29 +86,31 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
|
|||
"https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w" -> R.color.Telegram
|
||||
"https://twitter.com/YTVanced" -> R.color.Twitter
|
||||
"https://reddit.com/r/vanced" -> R.color.Reddit
|
||||
"https://vanced.app" -> R.color.Vanced
|
||||
"https://vanced.activity" -> R.color.Vanced
|
||||
"https://brave.com/van874" -> R.color.Brave
|
||||
else -> R.color.Vanced
|
||||
}
|
||||
|
||||
InternetTools.openUrl(url, color, getApplication())
|
||||
InternetTools.openUrl(url, color, activity)
|
||||
}
|
||||
|
||||
fun installVanced(variant: String) {
|
||||
if (!installing.value!!) {
|
||||
if (!fetching.get()) {
|
||||
if (variant == "nonroot" && !microg.get()?.isAppInstalled?.get()!!) {
|
||||
microgToast.show()
|
||||
} else {
|
||||
if (app.getSharedPreferences("installPrefs", Context.MODE_PRIVATE).getBoolean("valuesModified", false)) {
|
||||
downloadVanced(app)
|
||||
} else {
|
||||
_navigateDestination.value = Event(R.id.toInstallThemeFragment)
|
||||
when {
|
||||
variant == "nonroot" && !microg.get()?.isAppInstalled?.get()!! -> microgToast.show()
|
||||
variant == "root" && !Shell.rootAccess() -> Toast.makeText(activity, R.string.root_not_granted, Toast.LENGTH_SHORT).show()
|
||||
else -> {
|
||||
if (activity.getSharedPreferences("installPrefs", Context.MODE_PRIVATE).getBoolean("valuesModified", false)) {
|
||||
downloadVanced(activity)
|
||||
} else {
|
||||
_navigateDestination.value = Event(R.id.toInstallThemeFragment)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(activity, R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
fun installMusic() {
|
||||
|
@ -112,23 +119,23 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
|
|||
if (!microg.get()?.isAppInstalled?.get()!!) {
|
||||
microgToast.show()
|
||||
} else {
|
||||
downloadMusic(getApplication())
|
||||
downloadMusic(activity)
|
||||
}
|
||||
}
|
||||
} else
|
||||
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(activity, R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
fun installMicrog() {
|
||||
if (!installing.value!!)
|
||||
downloadMicrog(getApplication())
|
||||
downloadMicrog(activity)
|
||||
else
|
||||
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(activity, R.string.installation_wait, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
fun uninstallVanced(variant: String) = uninstallApk(if (variant == "root") "com.google.android.youtube" else "com.vanced.android.youtube", app)
|
||||
fun uninstallMusic() = uninstallApk("com.vanced.android.apps.youtube.music", app)
|
||||
fun uninstallMicrog() = uninstallApk("com.mgoogle.android.gms", app)
|
||||
fun uninstallVanced(variant: String) = uninstallApk(if (variant == "root") vancedRootPkg else vancedPkg, activity)
|
||||
fun uninstallMusic() = uninstallApk(musicPkg, activity)
|
||||
fun uninstallMicrog() = uninstallApk(microgPkg, activity)
|
||||
|
||||
fun cancelDownload(downloadId: Int) {
|
||||
PRDownloader.cancel(downloadId)
|
||||
|
@ -149,11 +156,11 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
|
|||
|
||||
init {
|
||||
fetching.set(true)
|
||||
vanced.set(DataModel(managerApp.vanced, "vanced", app))
|
||||
vancedRoot.set(DataModel(managerApp.vanced, "vancedRoot", app))
|
||||
music.set(DataModel(managerApp.music, "music", app))
|
||||
microg.set(DataModel(managerApp.microg, "microg", app))
|
||||
manager.set(DataModel(managerApp.manager, "manager", app))
|
||||
vanced.set(DataModel(app.vanced, vancedPkg, activity))
|
||||
vancedRoot.set(DataModel(app.vanced, vancedRootPkg, activity))
|
||||
music.set(DataModel(app.music, musicPkg, activity))
|
||||
microg.set(DataModel(app.microg, microgPkg, activity))
|
||||
manager.set(DataModel(app.manager, managerPkg, activity))
|
||||
vancedProgress.set(ProgressModel())
|
||||
musicProgress.set(ProgressModel())
|
||||
microgProgress.set(ProgressModel())
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
package com.vanced.manager.ui.viewmodels
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
class HomeViewModelFactory(private val activity: Activity) : ViewModelProvider.Factory {
|
||||
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
return HomeViewModel(activity) as T
|
||||
}
|
||||
|
||||
}
|
|
@ -6,6 +6,7 @@ import android.content.pm.PackageInstaller
|
|||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||
import com.vanced.manager.BuildConfig.APPLICATION_ID
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.ui.fragments.HomeFragment
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
|
@ -18,6 +19,12 @@ object AppUtils {
|
|||
val mutableInstall = MutableLiveData<Boolean>()
|
||||
val installing: LiveData<Boolean> = mutableInstall
|
||||
|
||||
const val vancedPkg = "com.vanced.android.youtube"
|
||||
const val vancedRootPkg = "com.google.android.youtube"
|
||||
const val musicPkg = "com.vanced.android.apps.youtube.music"
|
||||
const val microgPkg = "com.mgoogle.android.gms"
|
||||
const val managerPkg = APPLICATION_ID
|
||||
|
||||
init {
|
||||
mutableInstall.value = false
|
||||
}
|
||||
|
|
|
@ -2,8 +2,21 @@ package com.vanced.manager.utils
|
|||
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.Toast
|
||||
import androidx.core.content.FileProvider
|
||||
import com.downloader.OnDownloadListener
|
||||
import com.downloader.PRDownloader
|
||||
import com.vanced.manager.R
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.io.File
|
||||
|
||||
object DownloadHelper {
|
||||
|
||||
|
@ -19,4 +32,48 @@ object DownloadHelper {
|
|||
return downloadManager.enqueue(request)
|
||||
}
|
||||
|
||||
fun downloadManager(forceUpdate: Boolean, context: Context, loadBar: ProgressBar? = null) {
|
||||
CoroutineScope(if (forceUpdate) Dispatchers.IO else Dispatchers.Main).launch {
|
||||
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
|
||||
//downloadId = activity?.let { download(url, "apk", "manager.apk", it) }!!
|
||||
PRDownloader.download(url, context.getExternalFilesDir("apk")?.path, "manager.apk")
|
||||
.build().apply{
|
||||
if (!forceUpdate) setOnProgressListener {progress ->
|
||||
val mProgress = progress.currentBytes * 100 / progress.totalBytes
|
||||
loadBar?.visibility = View.VISIBLE
|
||||
loadBar?.progress = mProgress.toInt()
|
||||
}
|
||||
start(object : OnDownloadListener {
|
||||
override fun onDownloadComplete() {
|
||||
context.let {
|
||||
val apk =
|
||||
File("${context.getExternalFilesDir("apk")?.path}/manager.apk")
|
||||
val uri =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
||||
FileProvider.getUriForFile(
|
||||
context,
|
||||
"${context.packageName}.provider",
|
||||
apk
|
||||
)
|
||||
else
|
||||
Uri.fromFile(apk)
|
||||
|
||||
val intent = Intent(Intent.ACTION_VIEW)
|
||||
intent.setDataAndType(uri, "application/vnd.android.package-archive")
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(error: com.downloader.Error?) {
|
||||
Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show()
|
||||
Log.e("VMUpgrade", error.toString())
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import androidx.core.content.ContextCompat
|
|||
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
|
||||
import com.vanced.manager.BuildConfig
|
||||
import com.vanced.manager.R
|
||||
import com.vanced.manager.core.App
|
||||
|
||||
object InternetTools {
|
||||
|
||||
|
@ -30,7 +31,7 @@ object InternetTools {
|
|||
|
||||
suspend fun getObjectFromJson(url: String, obj: String): String {
|
||||
return try {
|
||||
JsonHelper.getJson(url).string(obj) ?: ""
|
||||
JsonHelper.getJson(url)?.string(obj) ?: ""
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error: ", e)
|
||||
""
|
||||
|
@ -39,7 +40,7 @@ object InternetTools {
|
|||
|
||||
suspend fun getArrayFromJson(url: String, array: String): MutableList<String> {
|
||||
return try {
|
||||
JsonHelper.getJson(url).array<String>(array)?.value ?: mutableListOf("null")
|
||||
JsonHelper.getJson(url)?.array<String>(array)?.value ?: mutableListOf("null")
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error: ", e)
|
||||
mutableListOf("null")
|
||||
|
@ -49,7 +50,7 @@ object InternetTools {
|
|||
suspend fun getJsonInt(file: String, obj: String, context: Context): Int {
|
||||
val installUrl = getDefaultSharedPreferences(context).getString("install_url", baseUrl)
|
||||
return try {
|
||||
JsonHelper.getJson("$installUrl/$file").int(obj) ?: 0
|
||||
JsonHelper.getJson("$installUrl/$file")?.int(obj) ?: 0
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error: ", e)
|
||||
0
|
||||
|
@ -59,23 +60,19 @@ object InternetTools {
|
|||
suspend fun getJsonString(file: String, obj: String, context: Context): String {
|
||||
val installUrl = getDefaultSharedPreferences(context).getString("install_url", baseUrl)
|
||||
return try {
|
||||
JsonHelper.getJson("$installUrl/$file").string(obj) ?: context.getString(R.string.unavailable)
|
||||
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 isUpdateAvailable(): Boolean {
|
||||
val result = try {
|
||||
JsonHelper.getJson("https://ytvanced.github.io/VancedBackend/manager.json").int("versionCode") ?: 0
|
||||
} catch (e: Exception) {
|
||||
0
|
||||
}
|
||||
fun isUpdateAvailable(context: Context): Boolean {
|
||||
val result = (context.applicationContext as App).manager.get()?.int("versionCode") ?: 0
|
||||
|
||||
return result > BuildConfig.VERSION_CODE
|
||||
}
|
||||
|
||||
const val baseUrl = "https://vanced.app/api/v1"
|
||||
const val baseUrl = "https://vancedapp.com/api/v1"
|
||||
|
||||
}
|
|
@ -11,13 +11,16 @@ object JsonHelper {
|
|||
|
||||
var dataMap: HashMap<String, JsonObject> = HashMap()
|
||||
|
||||
suspend fun getJson(url: String): JsonObject
|
||||
{
|
||||
return if(dataMap.containsKey(url)) {
|
||||
dataMap[url]!!
|
||||
} else {
|
||||
dataMap[url] = getSuspendJson(url)
|
||||
dataMap[url]!!
|
||||
suspend fun getJson(url: String): JsonObject? {
|
||||
return try {
|
||||
if(dataMap.containsKey(url)) {
|
||||
dataMap[url]!!
|
||||
} else {
|
||||
dataMap[url] = getSuspendJson(url)
|
||||
dataMap[url]!!
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.vanced.manager.utils
|
|||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.content.res.Configuration
|
||||
import android.content.res.Resources
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.crowdin.platform.Crowdin
|
||||
import java.util.*
|
||||
|
@ -13,18 +14,22 @@ class LanguageContextWrapper(base: Context?) : ContextWrapper(base) {
|
|||
|
||||
fun wrap(context: Context): ContextWrapper {
|
||||
val config: Configuration = context.resources.configuration
|
||||
context.createConfigurationContext(setLocale(config, context))
|
||||
Crowdin.wrapContext(context)
|
||||
return LanguageContextWrapper(context)
|
||||
}
|
||||
|
||||
private fun setLocale(config: Configuration, context: Context): Configuration {
|
||||
val pref = PreferenceManager.getDefaultSharedPreferences(context).getString("manager_lang", "System Default")
|
||||
val locale =
|
||||
when {
|
||||
pref == "System Default" -> Locale(config.locale.displayLanguage)
|
||||
pref == "System Default" -> Locale(Resources.getSystem().configuration.locale.language)
|
||||
pref?.length!! > 2 -> Locale(pref.substring(0, pref.length - 3), pref.substring(pref.length - 2))
|
||||
else -> Locale(pref)
|
||||
}
|
||||
Locale.setDefault(locale)
|
||||
config.setLocale(locale)
|
||||
context.createConfigurationContext(config)
|
||||
Crowdin.wrapContext(context)
|
||||
return LanguageContextWrapper(context)
|
||||
return config
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.vancedProgress
|
|||
import com.vanced.manager.utils.AppUtils.mutableInstall
|
||||
import com.vanced.manager.utils.AppUtils.sendFailure
|
||||
import com.vanced.manager.utils.AppUtils.sendRefresh
|
||||
import com.vanced.manager.utils.AppUtils.vancedRootPkg
|
||||
import java.io.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
@ -28,7 +29,6 @@ import kotlin.collections.HashMap
|
|||
|
||||
object PackageHelper {
|
||||
|
||||
private const val yPkg = "com.google.android.youtube"
|
||||
private const val apkInstallPath = "/data/adb/Vanced/"
|
||||
|
||||
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
|
||||
|
@ -202,7 +202,7 @@ object PackageHelper {
|
|||
|
||||
Shell.getShell {
|
||||
val application = context.applicationContext as App
|
||||
val vancedApplication = application.vanced?.int("versionCode")
|
||||
val vancedApplication = application.vanced.get()?.int("versionCode")
|
||||
val vancedVersionCode = if (vancedApplication != null) vancedApplication else { application.loadJsonAsync(); vancedApplication }
|
||||
val apkFilesPath = context.getExternalFilesDir("apks")?.path
|
||||
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
|
||||
|
@ -347,12 +347,12 @@ object PackageHelper {
|
|||
}
|
||||
|
||||
private fun linkVanced(apkFPath: String, path: String): Boolean {
|
||||
Shell.su("am force-stop $yPkg").exec()
|
||||
Shell.su("am force-stop $vancedRootPkg").exec()
|
||||
val umountv = Shell.su("""for i in ${'$'}(ls /data/app/ | grep com.google.android.youtube | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """).exec()
|
||||
//Log.d("umountTest", Shell.su("grep com.google.android.youtube").exec().out.joinToString(" "))
|
||||
val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec()
|
||||
Thread.sleep(500)
|
||||
Shell.su("am force-stop $yPkg").exec()
|
||||
Shell.su("am force-stop $vancedRootPkg").exec()
|
||||
return response.isSuccess
|
||||
}
|
||||
|
||||
|
@ -397,7 +397,7 @@ object PackageHelper {
|
|||
|
||||
//uninstall current update and install base that works with patch
|
||||
private fun fixHigherVer(apkFiles: ArrayList<FileInfo>, context: Context) : Boolean {
|
||||
if (uninstallApk(yPkg, context)) {
|
||||
if (uninstallApk(vancedRootPkg, context)) {
|
||||
return installSplitApkFiles(apkFiles, context)
|
||||
}
|
||||
sendFailure(listOf("Failed_Uninstall").toMutableList(), context)
|
||||
|
@ -433,7 +433,7 @@ object PackageHelper {
|
|||
|
||||
if(apkinF.exists()) {
|
||||
try {
|
||||
Shell.su("am force-stop $yPkg").exec()
|
||||
Shell.su("am force-stop $vancedRootPkg").exec()
|
||||
|
||||
//Shell.su("rm -r SuFile.open(path).parent")
|
||||
|
||||
|
@ -470,9 +470,9 @@ object PackageHelper {
|
|||
private fun getVersionNumber(context: Context): Int? {
|
||||
try {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
||||
context.packageManager.getPackageInfo(yPkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
|
||||
context.packageManager.getPackageInfo(vancedRootPkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
|
||||
else
|
||||
context.packageManager.getPackageInfo(yPkg, 0).versionCode
|
||||
context.packageManager.getPackageInfo(vancedRootPkg, 0).versionCode
|
||||
}
|
||||
catch (e : Exception) {
|
||||
val execRes = Shell.su("dumpsys package com.google.android.youtube | grep versionCode").exec()
|
||||
|
@ -497,7 +497,7 @@ object PackageHelper {
|
|||
private fun getPackageDir(context: Context): String?
|
||||
{
|
||||
return try {
|
||||
val p = getPkgInfo(yPkg, context)
|
||||
val p = getPkgInfo(vancedRootPkg, context)
|
||||
p!!.applicationInfo.sourceDir
|
||||
} catch (e: Exception) {
|
||||
val execRes = Shell.su("dumpsys package com.google.android.youtube | grep codePath").exec()
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
android:id="@+id/dev_settings"
|
||||
android:title="Dev Settings"
|
||||
app:showAsAction="always"
|
||||
android:icon="@drawable/ic_secret_settings_black_24dp"
|
||||
android:icon="@drawable/ic_settings_black_24dp"
|
||||
tools:ignore="HardcodedText"/>
|
||||
|
||||
</menu>
|
|
@ -39,15 +39,15 @@
|
|||
<string name="chosen_theme">المظهر: %1$s</string>
|
||||
<string name="clear_files">مسح الملفات التي تم تنزيلها</string>
|
||||
<string name="cleared_files">تم مسح الملفات بنجاح</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_title">تحليلات الشراء</string>
|
||||
<string name="firebase_summary">هذا يتيح لنا جمع معلومات عن أداء التطبيق وسجلات الأعطال</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="language_title">اللغة</string>
|
||||
<string name="link_title">إستخدم علامات التبويب المخصصة لمتصفح كروم</string>
|
||||
<string name="link_custom_tabs">سيتم فتح الروابط في علامات التبويب المخصصة لمتصفح كروم</string>
|
||||
<string name="link_external_browser">سيتم فتح الروابط في متصفح خارجي</string>
|
||||
<string name="new_installer_title">استخدم مثبت الروت الجديد (تجريبي)</string>
|
||||
<string name="new_installer_summary">لا تعتمد أداة التثبيت هذه على حالة التحقق من صحة التوقيع. تحذير: قد يختفي Vanced بعد إعادة التشغيل إذا قمت بتثبيته باستخدام هذا</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="system_default">الوضع الافتراضي للنظام</string>
|
||||
<string name="theme">موضوع اللون</string>
|
||||
<string name="theme_follow">اتبع النظام</string>
|
||||
<string name="theme_dark">الموضوع الاسود</string>
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<resources>
|
||||
<!-- Global Strings -->
|
||||
<string name="close">Qapat</string>
|
||||
<string name="reset">Təzələ</string>
|
||||
<string name="save">Saxıa</string>
|
||||
<!-- Main Activity -->
|
||||
<string name="title_about">Haqqında</string>
|
||||
<string name="title_home">Ev</string>
|
||||
<string name="title_settings">Tənzimləmələr</string>
|
||||
<!-- Home Page -->
|
||||
<string name="changelogs">Yeniliklər</string>
|
||||
<string name="downloading_file">%1$s yüklənir</string>
|
||||
<string name="install">Qur</string>
|
||||
<string name="installation_wait">Qurma bitənə qədər gözləyin.</string>
|
||||
<string name="button_reinstall">Yenidən qur</string>
|
||||
<string name="version_installed">Quruldu:</string>
|
||||
<string name="latest">Ən son:</string>
|
||||
<string name="no_microg">microG qurulmayıb</string>
|
||||
<string name="root_not_granted">Root icazəsi verilməyib</string>
|
||||
<string name="unavailable">Yoxdur</string>
|
||||
<string name="update">Təzələ</string>
|
||||
<string name="useful_links">Lazımı keçidlər</string>
|
||||
<string name="website_text">Veb-sayt</string>
|
||||
<string name="support_us">Bizi dəstəklə!</string>
|
||||
<string name="version_toast">%1$s versiya nömrəsi köçürüldü!</string>
|
||||
<!-- Settings -->
|
||||
<string name="accent_color">İkinci Rəng</string>
|
||||
<string name="accent_blue">Mavi</string>
|
||||
<string name="accent_green">Yaşıl</string>
|
||||
<string name="accent_purple">Bənövşəyi</string>
|
||||
<string name="accent_red">Qırmızı</string>
|
||||
<string name="accent_yellow">Sarı</string>
|
||||
<string name="category_interface">Araüz</string>
|
||||
<string name="category_manager">Menecer</string>
|
||||
<string name="check_updates">Yeniləmələri yoxla</string>
|
||||
<string name="chosen_install_values">Seçilmiş qurma tənzimləmələri</string>
|
||||
<string name="chosen_lang">Dil(lər): %1$s</string>
|
||||
<string name="chosen_theme">Mövzu: %1$s</string>
|
||||
<string name="clear_files">Yüklənmiş faylları təmizlə</string>
|
||||
<string name="cleared_files">Fayllar uğurla təmizləndi</string>
|
||||
<string name="firebase_title">Analitiklər</string>
|
||||
<string name="firebase_summary">Bu bizə tətbiq performansı və çökmə loqları haqda məlumat toplamağa imkan verir</string>
|
||||
<string name="language_title">Dil</string>
|
||||
<string name="link_title">Chrome Özəl Tablarını işlət</string>
|
||||
<string name="link_custom_tabs">Keçidlər Chrome Özəl Tablarında açılacaq</string>
|
||||
<string name="link_external_browser">Linklər Xarici Brauzerdə açılacaq</string>
|
||||
<string name="new_installer_title">Yeni root qurmanı yoxla (Yoxlama)</string>
|
||||
<string name="new_installer_summary">Bu qurucu İmza Təsdiqləmə vəziyyətindən asılı deyil. XƏBƏRDARLIQ: Vanced bu cür qurulmadan sonra yenidən başlatmada itə bilər</string>
|
||||
<string name="system_default">Sistem Tənzimləsin</string>
|
||||
<string name="theme">Mövzu</string>
|
||||
<string name="theme_follow">Sistemə Görə</string>
|
||||
<string name="theme_dark">Qaranlıq Mövzu</string>
|
||||
<string name="theme_light">İşıqlı Mövzu</string>
|
||||
<string name="update_url">Yeniləmə Kanal URL\'\ı</string>
|
||||
<string name="push_notifications">%1$s Bildirişləri</string>
|
||||
<string name="push_notifications_summary">%1$s üçün yeniləmə gəldikdə bildiriş al</string>
|
||||
<string name="re_check">Yenidən yoxla</string>
|
||||
<string name="update_center">Menecer Yeniləmə</string>
|
||||
<string name="update_found">Yeniləmə var!</string>
|
||||
<string name="update_notfound">Yeniləmə yoxdur</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="guide">Bələdçi</string>
|
||||
<string name="hold_on">Dayan!</string>
|
||||
<string name="magisk_vanced">Vanced\'\ın atılmış və bu tətbiqlə yenilənməyən Magisk/TWRP versiyasından istifadə edirsiniz. Xahiş edirik onu magisk əlavəsindən yaxud TWRP Vanced silicidən istifadə edərək silin.</string>
|
||||
<string name="miui_one_title">MIUI təyin edildi!</string>
|
||||
<string name="miui_one">Vanced\'\ı yükləmək üçün, təkmilləşdirmə tənzimləmələridən MIUI Optimizasiyanı mütləq qapatmalısınz. (20.2.20 və ya sonrasından xiaomi.eu xımlı ROM istifadə edirsinizsə, bu mesajı keçə bilərsiniz)</string>
|
||||
<string name="error">Xəta</string>
|
||||
<string name="security_context">Tətbiqləri Vanced App, Vanced Discord server və Vanced GitHub səhifəsindən yüklədiyinizdən əmin olun</string>
|
||||
<string name="success">Uğur!</string>
|
||||
<string name="vanced_installed">Vanced uğurla quruldu! İndi açılsın?</string>
|
||||
<string name="music_installed">Vanced Music uğurla quruldu! İndi açılsın?</string>
|
||||
<string name="launch">Aç</string>
|
||||
<string name="welcome">Xoş gəlmisiniz</string>
|
||||
<!-- Install Page -->
|
||||
<string name="choose_preferred_language">Vanced üçün istədiyiniz dili seçin</string>
|
||||
<string name="choose_preferred_language_note">Qeyd: İngiliscə həmişə əlavə dil olaraq yüklənəcək.</string>
|
||||
<string name="choose_preferred_theme">Vanced üçün istədiyiniz mövzunu seçin</string>
|
||||
<string name="finish">Son</string>
|
||||
<string name="install_light_black">İşıqlı + Qara</string>
|
||||
<string name="install_light_dark">İşıqlı + Qaranlıq</string>
|
||||
<string name="next">Sonrakı</string>
|
||||
<!-- About Page -->
|
||||
<string name="manager_dev">Menecer Təkmilcilər</string>
|
||||
<string name="sources">Mənbələr</string>
|
||||
<string name="vanced_team">Vanced Birliyi</string>
|
||||
<!-- Error messages -->
|
||||
<string name="chown_fail">Apk\'nı sistemə yedirə bilmədik, Bir də yoxlayın</string>
|
||||
<string name="error_downloading">%1$s Yüklənərkən xəta</string>
|
||||
<string name="failed_uninstall">%1$s paketini silmək olmur</string>
|
||||
<string name="files_missing_va">Fayllar yoxdur, Bəlkə yükləmə uğursuz olub?</string>
|
||||
<string name="ifile_missing">Qaranlıq/Qara.apk Oxunmur (Yaddaşmə Əngəlləndi?) yoxsa Fayl Yoxdur?</string>
|
||||
<string name="installation_aborted">Istifadəçi qurmanı ləğv etdiyi üçün qurma alınmadı.</string>
|
||||
<string name="installation_blocked">İstifadəçi qurmanı əngəllədiyi üçün qurma alınmadı.</string>
|
||||
<string name="installation_downgrade">İstifadəçi mövcud olandan köhnə versiya qurmağa çalışdığı üçün qurma alınmadı. YouTube tətbiqinin yeniləmələrini silin, və bir də yoxlayın.</string>
|
||||
<string name="installation_conflict">Tətbiq hazırda yüklü olan başqa tətbiqlə çaxışdığı üçün qurma alınmadı. Vanced\'\ın hazırkı versiyasını silin və bir də yoxlayın.</string>
|
||||
<string name="installation_failed">Qurma bilinməyən səbəbdən alınmadı, əlavə dəstək üçün Telegram və ya Discordumuza qoşulun.</string>
|
||||
<string name="installation_incompatible">Fayl cihazınıza uyğun olmadığı üçün qurma alınmadı. Yüklənən faylları təmizləyin və bir də yoxlayın.</string>
|
||||
<string name="installation_invalid">APK faylları xarab olduğu üçün qurma alınmadı, xahiş olunur bir də yoxlayın.</string>
|
||||
<string name="installation_signature">APK imza təsdiqləmə açıq olduğu üçün qurma alınmadı. APK imza təsdiqləməni qapadıb bir də yoxlayın.</string>
|
||||
<string name="installation_miui">MIUI Optimizasiya açıq olduğu üçün qurma alınmadı. MIUI Optimizasiyanı qapadıb bir də yoxlayın.</string>
|
||||
<string name="installation_storage">Yaddaş xətası üzündən qurma alınmadı.</string>
|
||||
<string name="modapk_missing">Qara/Qaranlıq apk qurmada yoxdur, bunun olmağı düzgün deyil, xahiş edirik menecerin tətbiq məlumatını təmizləyin</string>
|
||||
<string name="path_missing">Standart YouTube Qurma Yolu Ya Əlçatan Deyil Ya Da Bölməli Qurmadan Sonra Yoxa Çıxıb</string>
|
||||
</resources>
|
|
@ -1,22 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<resources>
|
||||
<!-- Global Strings -->
|
||||
<string name="close">বন্ধ</string>
|
||||
<string name="close">বন্ধ করুন</string>
|
||||
<string name="reset">আবার শুরু করো</string>
|
||||
<string name="save">সংরক্ষণ করো</string>
|
||||
<string name="save">সংরক্ষণ করুন</string>
|
||||
<!-- Main Activity -->
|
||||
<string name="title_about">সম্পর্কে</string>
|
||||
<string name="title_about">সম্বন্ধে</string>
|
||||
<string name="title_home">মূল পাতা</string>
|
||||
<string name="title_settings">সেটিংস</string>
|
||||
<!-- Home Page -->
|
||||
<string name="changelogs">পরিবর্তন নথি</string>
|
||||
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
||||
<string name="install">ইনস্টল</string>
|
||||
<string name="installation_wait">ইনস্টলেশন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।.</string>
|
||||
<string name="button_reinstall">পুনঃইনস্টল</string>
|
||||
<string name="version_installed">ইনস্টলকৃত:</string>
|
||||
<string name="install">ইনস্টল করুন</string>
|
||||
<string name="installation_wait">ইনস্টলেশন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।</string>
|
||||
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
|
||||
<string name="version_installed">ইনস্টল হয়েছে:</string>
|
||||
<string name="latest">সর্বশেষ:</string>
|
||||
<string name="no_microg">মাইক্রোজি ইনস্টল করা হয়নি</string>
|
||||
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string>
|
||||
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
|
||||
<string name="unavailable">অনুপলব্ধ</string>
|
||||
<string name="update">হালনাগাদ</string>
|
||||
|
@ -41,13 +41,13 @@
|
|||
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="language_title">ভাষা</string>
|
||||
<string name="link_title">Chrome কাস্টম ট্যাব ব্যবহার করুন</string>
|
||||
<string name="link_custom_tabs">লিঙ্কগুলি Chrome কাস্টম ট্যাবগুলিতে খোলা হবে</string>
|
||||
<string name="link_external_browser">লিঙ্কগুলি একটি বাহ্যিক ব্রাউজারে খুলবে</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="new_installer_title">নতুন রুট ইনস্টলার ব্যবহার করুন (পরীক্ষামূলক)</string>
|
||||
<string name="new_installer_summary">এই ইনস্টলারটি এপিকে স্বাক্ষর যাচাইকরণের স্থিতির উপর নির্ভর করে না। সতর্কতা: এটি ব্যবহার করে ভ্যান্সড ইনস্টল করা হলে, রিবুটের পর ভ্যান্সড মুছে যেতে পারে</string>
|
||||
<string name="system_default">সিস্টেম দ্বারা নির্ধারিত</string>
|
||||
<string name="theme">থিম</string>
|
||||
<string name="theme_follow">সিস্টেমকে অনুসরণ করো</string>
|
||||
<string name="theme_dark">অন্ধকার থিম</string>
|
||||
|
|
|
@ -3,15 +3,15 @@
|
|||
<!-- Global Strings -->
|
||||
<string name="close">বন্ধ করুন</string>
|
||||
<string name="reset">রিসেট করুন</string>
|
||||
<string name="save">সেভ করুন</string>
|
||||
<string name="save">সংরক্ষণ করুন</string>
|
||||
<!-- Main Activity -->
|
||||
<string name="title_about">সম্পর্কে</string>
|
||||
<string name="title_home">হোম</string>
|
||||
<string name="title_about">সম্বন্ধে</string>
|
||||
<string name="title_home">মূল পাতা</string>
|
||||
<string name="title_settings">সেটিংস</string>
|
||||
<!-- Home Page -->
|
||||
<string name="changelogs">পরিবর্তন নথি</string>
|
||||
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
|
||||
<string name="install">ইনস্টল</string>
|
||||
<string name="install">ইনস্টল করুন</string>
|
||||
<string name="installation_wait">ইনস্টলেশন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।</string>
|
||||
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
|
||||
<string name="version_installed">ইনস্টল হয়েছে:</string>
|
||||
|
@ -39,7 +39,7 @@
|
|||
<string name="chosen_theme">থিম: %1$s</string>
|
||||
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
|
||||
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
|
||||
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
|
||||
<string name="firebase_title">ফায়ারবেস তথ্য বিশ্লেষণ</string>
|
||||
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
|
||||
<string name="language_title">ভাষা</string>
|
||||
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
|
||||
|
@ -47,7 +47,7 @@
|
|||
<string name="link_external_browser">লিঙ্কগুলি একটি বাহ্যিক ব্রাউজারে খুলবে</string>
|
||||
<string name="new_installer_title">নতুন রুট ইনস্টলার ব্যবহার করুন (পরীক্ষামূলক)</string>
|
||||
<string name="new_installer_summary">এই ইনস্টলারটি এপিকে স্বাক্ষর যাচাইকরণের স্থিতির উপর নির্ভর করে না। সতর্কতা: এটি ব্যবহার করে ভ্যান্সড ইনস্টল করা হলে, রিবুটের পর ভ্যান্সড মুছে যেতে পারে</string>
|
||||
<string name="system_default">সিস্টেমের ডিফল্ট</string>
|
||||
<string name="system_default">সিস্টেম দ্বারা র্নির্ধারিত</string>
|
||||
<string name="theme">থিম</string>
|
||||
<string name="theme_follow">সিস্টেমকে অনুসরণ করুন</string>
|
||||
<string name="theme_dark">অন্ধকার থিম</string>
|
||||
|
|
|
@ -39,15 +39,15 @@
|
|||
<string name="chosen_theme">Theme: %1$s</string>
|
||||
<string name="clear_files">Heruntergeladene Dateien löschen</string>
|
||||
<string name="cleared_files">Daten erfolgreich gelöscht</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="firebase_title">Firebase-Analyse</string>
|
||||
<string name="firebase_summary">So können wir Informationen über die Performance der App und Absturzprotokolle sammeln</string>
|
||||
<string name="language_title">Sprache</string>
|
||||
<string name="link_title">Verwende Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Links werden in Chrome Custom Tabs geöffnet</string>
|
||||
<string name="link_external_browser">Links werden in einem externen Browser geöffnet</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="new_installer_title">Neuen Root-Installer verwenden (Experimentell)</string>
|
||||
<string name="new_installer_summary">Dieser Installer ist unabhängig vom Status der Signaturverifizierung. ACHTUNG: Vanced könnte nach dem Neustart verschwinden, wenn Sie es mit dem Installer installieren</string>
|
||||
<string name="system_default">Standardeinstellung</string>
|
||||
<string name="theme">Theme</string>
|
||||
<string name="theme_follow">Folge Systemeinstellung</string>
|
||||
<string name="theme_dark">Dunkles Theme</string>
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<string name="choose_preferred_language_note">Σημείωση: Τα αγγλικά θα εγκατασταθούν ως δεύτερη γλώσσα ούτως ή άλλως.</string>
|
||||
<string name="choose_preferred_theme">Επιλέξτε το θέμα που επιθυμείτε για το Vanced</string>
|
||||
<string name="finish">Τέλος</string>
|
||||
<string name="install_light_black">Ανοιχτόχρωμο + Μαύρο</string>
|
||||
<string name="install_light_black">Ανοιχτόχρωμο + Απόλυτο μαύρο</string>
|
||||
<string name="install_light_dark">Ανοιχτόχρωμο + Σκούροχρωμο</string>
|
||||
<string name="next">Επόμενο</string>
|
||||
<!-- About Page -->
|
||||
|
|
|
@ -39,15 +39,15 @@
|
|||
<string name="chosen_theme">Teema: %1$s</string>
|
||||
<string name="clear_files">Tyhjennä ladatut tiedostot</string>
|
||||
<string name="cleared_files">Tiedostot tyhjennettiin onnistuneesti</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="firebase_title">Firebase-analytiikka</string>
|
||||
<string name="firebase_summary">Tämän avulla voimme kerätä tietoa sovelluksen suorituskyvystä ja kaatumislokeista</string>
|
||||
<string name="language_title">Kieli</string>
|
||||
<string name="link_title">Käytä Chromen mukautettuja välilehtiä</string>
|
||||
<string name="link_custom_tabs">Linkit aukeavat Chromen mukautetuissa välilehdissä</string>
|
||||
<string name="link_external_browser">Linkit aukeavat ulkoisessa selaimessa</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="new_installer_title">Käytä uutta juuriasenninta (kokeellinen)</string>
|
||||
<string name="new_installer_summary">Tämä asennusohjelma ei ole riippuvainen allekirjoituksen vahvistuksen tilasta. VAROITUS: Vanced saattaa kadota uudelleenkäynnistyksen jälkeen, jos asennat sen tällä tavalla</string>
|
||||
<string name="system_default">Järjestelmän oletus</string>
|
||||
<string name="theme">Teema</string>
|
||||
<string name="theme_follow">Järjestelmän teema</string>
|
||||
<string name="theme_dark">Tumma teema</string>
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
<string name="chosen_theme">Thème: %1$s</string>
|
||||
<string name="clear_files">Effacer les fichiers téléchargés</string>
|
||||
<string name="cleared_files">Données effacées avec succès</string>
|
||||
<string name="firebase_title">Analytiques Firebase</string>
|
||||
<string name="firebase_summary">Cela nous permet de collecter des informations sur les performances de l\'application et des journaux de plantage</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">Cela nous permet de recueillir des informations sur les performances de l\'application et les journaux de bord</string>
|
||||
<string name="language_title">Langue</string>
|
||||
<string name="link_title">Utiliser les onglets personnalisés Chrome</string>
|
||||
<string name="link_custom_tabs">Les liens s\'ouvriront dans les onglets personnalisés Chrome</string>
|
||||
|
@ -69,7 +69,7 @@
|
|||
<string name="security_context">Assurez-vous d\'avoir téléchargé l\'application sur vanced.app, le serveur Discord Vanced ou sur le Github Vanced</string>
|
||||
<string name="success">Succès!</string>
|
||||
<string name="vanced_installed">Vanced a été installé avec succès ! Ouvrir maintenant ?</string>
|
||||
<string name="music_installed">Vanced Music a été installé avec succès ! Voulez-vous l\'ouvrir maintenant ?</string>
|
||||
<string name="music_installed">Vanced Music a été installé avec succès ! Ouvrir maintenant ?</string>
|
||||
<string name="launch">Ouvrir</string>
|
||||
<string name="welcome">Bienvenue</string>
|
||||
<!-- Install Page -->
|
||||
|
|
|
@ -41,14 +41,14 @@
|
|||
<string name="cleared_files">फ़ाइलें सफलतापूर्वक साफ़ की गई</string>
|
||||
<string name="firebase_title">फायरबेस वैश्लेषिकी</string>
|
||||
<string name="firebase_summary">इससे हम एप्लिकेशन प्रदर्शन और क्रैश लॉग के बारे में जानकारी एकत्र कर सकते हैं</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="language_title">भाषा</string>
|
||||
<string name="link_title">क्रोम कस्टम टैब का उपयोग करें</string>
|
||||
<string name="link_custom_tabs">क्रोम कस्टम टैब में लिंक खुलेंगे</string>
|
||||
<string name="link_external_browser">लिंक एक बाहरी ब्राउज़र में खुलेंगे</string>
|
||||
<string name="new_installer_title">नए रूट इंस्टॉलर (प्रायोगिक) का उपयोग करें</string>
|
||||
<string name="new_installer_summary">यह इंस्टॉलर हस्ताक्षर सत्यापन की स्थिति पर निर्भर नहीं करता है।
|
||||
चेतावनी: यदि आप इसका उपयोग करके इसे स्थापित करते हैं तो रिबूट के बाद Vanced गायब हो सकता है</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="system_default">सिस्टम डिफ़ॉल्ट</string>
|
||||
<string name="theme">थीम</string>
|
||||
<string name="theme_follow">सिस्टम का पालन करें</string>
|
||||
<string name="theme_dark">डार्क थीम</string>
|
||||
|
|
|
@ -40,14 +40,14 @@
|
|||
<string name="clear_files">Hapus file yang diunduh</string>
|
||||
<string name="cleared_files">Berhasil menghapus file</string>
|
||||
<string name="firebase_title">Analisis Firebase</string>
|
||||
<string name="firebase_summary">Ini menginjinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash</string>
|
||||
<string name="firebase_summary">Ini mengijinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash</string>
|
||||
<string name="language_title">Bahasa</string>
|
||||
<string name="link_title">Gunakan Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Tautan akan terbuka di Chrome Custom Tabs</string>
|
||||
<string name="link_external_browser">Tautan akan terbuka di Browser Eksternal</string>
|
||||
<string name="new_installer_title">Gunakan pemasang root yang baru (Eksperimental)</string>
|
||||
<string name="new_installer_summary">Pemasang ini tidak bergantung pada status Signature Verification. PERINGATAN: Vanced mungkin menghilang setelah reboot jika Anda memasangnya menggunakan ini</string>
|
||||
<string name="system_default">Default Sistem</string>
|
||||
<string name="system_default">Standar Sistem</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="theme_follow">Ikuti Sistem</string>
|
||||
<string name="theme_dark">Tema Gelap</string>
|
||||
|
|
|
@ -45,8 +45,8 @@
|
|||
<string name="link_title">Chrome カスタムタブを使用する</string>
|
||||
<string name="link_custom_tabs">Chrome カスタムタブでリンクを開く</string>
|
||||
<string name="link_external_browser">外部ブラウザでリンクを開く</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="new_installer_title">新しい root インストーラーを使用する (実験的)</string>
|
||||
<string name="new_installer_summary">このインストーラは、署名検証ステータスに依存しません。 警告:これを使用してインストールした場合、再起動後に Vanced が表示されなくなる可能性があります</string>
|
||||
<string name="system_default">システム標準</string>
|
||||
<string name="theme">テーマ</string>
|
||||
<string name="theme_follow">システムに従う</string>
|
||||
|
@ -101,5 +101,5 @@
|
|||
<string name="installation_miui">MIUI の最適化が有効になっているためインストールに失敗しました。MIUI の最適化を無効化してから、もう一度やり直してください。</string>
|
||||
<string name="installation_storage">ストレージのエラーによりインストールに失敗しました。</string>
|
||||
<string name="modapk_missing">Dark/Black の APK がインストーラーから見つかりません、想定外のことです、Manager のアプリのデータを削除してください</string>
|
||||
<string name="path_missing">株式分割インストール後、株式のYouTubeインストールパスにアクセスできない、またはインストールされない</string>
|
||||
<string name="path_missing">ストック版 YouTube のインスオール先にアクセスできないか、ストック版の分割インストール後に欠落しています</string>
|
||||
</resources>
|
||||
|
|
|
@ -89,7 +89,7 @@
|
|||
<string name="error_downloading">%1$s 다운로드 중 오류 발생</string>
|
||||
<string name="failed_uninstall">%1$s 패키지 제거에 실패하였습니다</string>
|
||||
<string name="files_missing_va">파일이 없습니다. 다운로드에 실패했나요?</string>
|
||||
<string name="ifile_missing">Dark/Black.apk를 읽을 수 없거나(저장장치 접근이 차단됐나요?) 파일이 없습니다</string>
|
||||
<string name="ifile_missing">Dark/Black.apk를 읽을 수 없거나(저장소 접근이 차단됐나요?) 파일이 없습니다</string>
|
||||
<string name="installation_aborted">사용자가 설치를 중단했기 때문에 앱을 설치하지 못했습니다.</string>
|
||||
<string name="installation_blocked">사용자가 설치를 차단했기 때문에 앱을 설치하지 못했습니다.</string>
|
||||
<string name="installation_downgrade">사용자가 패키지를 이전 버전으로 변경하려고 하여 앱을 설치하지 못했습니다. 기본 YouTube 앱을 초기 버전으로 변경한 다음, 설치를 다시 진행해주세요.</string>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<string name="root_not_granted">Root access not granted</string>
|
||||
<string name="unavailable">Utilgjengelig</string>
|
||||
<string name="update">Oppdater</string>
|
||||
<string name="useful_links">Useful Links</string>
|
||||
<string name="useful_links">Nyttige lenker</string>
|
||||
<string name="website_text">Nettside</string>
|
||||
<string name="support_us">Støtt oss!</string>
|
||||
<string name="version_toast">%1$s version number was copied!</string>
|
||||
|
@ -31,55 +31,55 @@
|
|||
<string name="accent_purple">Lilla</string>
|
||||
<string name="accent_red">Rød</string>
|
||||
<string name="accent_yellow">Gul</string>
|
||||
<string name="category_interface">Interface</string>
|
||||
<string name="category_interface">Grensesnitt</string>
|
||||
<string name="category_manager">Manager</string>
|
||||
<string name="check_updates">Se etter oppdateringer</string>
|
||||
<string name="chosen_install_values">Chosen installation preferences</string>
|
||||
<string name="chosen_lang">Language(s): %1$s</string>
|
||||
<string name="chosen_theme">Theme: %1$s</string>
|
||||
<string name="clear_files">Clear downloaded files</string>
|
||||
<string name="chosen_lang">Språk: %1$s</string>
|
||||
<string name="chosen_theme">Tema: %1$s</string>
|
||||
<string name="clear_files">Fjern nedlastede filer</string>
|
||||
<string name="cleared_files">Successfully cleared files</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="link_title">Use Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
|
||||
<string name="link_external_browser">Links will open in an External Browser</string>
|
||||
<string name="language_title">Språk</string>
|
||||
<string name="link_title">Bruk Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Lenker vil åpne i Chrome Custom Tabs</string>
|
||||
<string name="link_external_browser">Lenker vil åpnes i en ekstern nettleser</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="theme">Theme</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="theme_follow">Follow System</string>
|
||||
<string name="theme_dark">Dark Theme</string>
|
||||
<string name="theme_light">Light Theme</string>
|
||||
<string name="theme_dark">Mørkt tema</string>
|
||||
<string name="theme_light">Lyst tema</string>
|
||||
<string name="update_url">Update Channel URL</string>
|
||||
<string name="push_notifications">%1$s Push Notifications</string>
|
||||
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
|
||||
<string name="re_check">Re-check</string>
|
||||
<string name="update_center">Manager Update Center</string>
|
||||
<string name="update_found">Update found!</string>
|
||||
<string name="update_notfound">No new updates</string>
|
||||
<string name="update_found">Oppdatering funnet!</string>
|
||||
<string name="update_notfound">Ingen nye oppdateringer</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="guide">Guide</string>
|
||||
<string name="hold_on">Stop!</string>
|
||||
<string name="hold_on">Stopp!</string>
|
||||
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the magisk module/using TWRP Vanced uninstaller.</string>
|
||||
<string name="miui_one_title">MIUI detected!</string>
|
||||
<string name="miui_one">In order to install Vanced, you MUST disable MIUI Optimisations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
|
||||
<string name="error">Error</string>
|
||||
<string name="error">Feil</string>
|
||||
<string name="security_context">Make sure that you downloaded the app from vanced.app, the Vanced Discord server or the Vanced GitHub</string>
|
||||
<string name="success">Success!</string>
|
||||
<string name="vanced_installed">Vanced has successfully been installed! Open now?</string>
|
||||
<string name="music_installed">Vanced Music has successfully been installed! Open now?</string>
|
||||
<string name="launch">Open</string>
|
||||
<string name="welcome">Welcome</string>
|
||||
<string name="success">Suksess!</string>
|
||||
<string name="vanced_installed">Vanced har blitt installert! Åpne nå?</string>
|
||||
<string name="music_installed">Vanced Music har blitt installert! Åpne nå?</string>
|
||||
<string name="launch">Åpne</string>
|
||||
<string name="welcome">Velkommen</string>
|
||||
<!-- Install Page -->
|
||||
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
|
||||
<string name="choose_preferred_language_note">Note: English will always be installed as an additional language as well.</string>
|
||||
<string name="choose_preferred_language">Velg dine foretrukne språk for Vanced</string>
|
||||
<string name="choose_preferred_language_note">Merk: Engelsk vil alltid bli installert som et ekstra språk.</string>
|
||||
<string name="choose_preferred_theme">Choose your preferred theme for Vanced</string>
|
||||
<string name="finish">Finish</string>
|
||||
<string name="finish">Fullfør</string>
|
||||
<string name="install_light_black">Light + Black</string>
|
||||
<string name="install_light_dark">Light + Dark</string>
|
||||
<string name="next">Next</string>
|
||||
<string name="next">Neste</string>
|
||||
<!-- About Page -->
|
||||
<string name="manager_dev">Manager Devs</string>
|
||||
<string name="sources">Sources</string>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<string name="useful_links">ਉਪਯੋਗੀ ਲਿੰਕ</string>
|
||||
<string name="website_text">ਵੇਬਸਾਇਟ</string>
|
||||
<string name="support_us">ਸਾਨੂੰ ਸਹਿਯੋਗ ਕਰੋ!</string>
|
||||
<string name="version_toast">%1$s ਸੰਸਕਰਣ ਸੰਖਿਆ ਕਾਪੀ ਕੀਤੀ ਗਈ ਸੀ!</string>
|
||||
<string name="version_toast">%1$s ਵਰਜਨ ਸੰਖਿਆ ਕਾਪੀ ਕੀਤੀ ਗਈ ਸੀ!</string>
|
||||
<!-- Settings -->
|
||||
<string name="accent_color">ਐੱਕਸੈਂਟ ਰੰਗ</string>
|
||||
<string name="accent_blue">ਨੀਲਾ</string>
|
||||
|
|
|
@ -41,13 +41,13 @@
|
|||
<string name="cleared_files">Pomyślnie wyczyszczono pliki</string>
|
||||
<string name="firebase_title">Analityka Firebase</string>
|
||||
<string name="firebase_summary">To pozwala nam zbierać informacje o wydajności aplikacji i dziennikach awarii</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="language_title">Język</string>
|
||||
<string name="link_title">Używaj niestandardowych kart Chrome</string>
|
||||
<string name="link_custom_tabs">Linki zostaną otwarte w niestandardowych kartach Chrome</string>
|
||||
<string name="link_external_browser">Linki zostaną otwarte w zewnętrznej przeglądarce</string>
|
||||
<string name="new_installer_title">Użyj nowego instalatora root (Eksperymentalnego)</string>
|
||||
<string name="new_installer_summary">Ten instalator nie zależy od statusu weryfikacji podpisu. UWAGA: Vanced może zniknąć po ponownym uruchomieniu telefonu, jeśli zainstalujesz go za pomocą tego sposobu</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="system_default">Domyślny systemowy</string>
|
||||
<string name="theme">Motyw</string>
|
||||
<string name="theme_follow">Śledź system</string>
|
||||
<string name="theme_dark">Ciemny Motyw</string>
|
||||
|
|
|
@ -46,8 +46,8 @@
|
|||
<string name="link_custom_tabs">Os links serão abertos nas abas personalizadas do Chrome</string>
|
||||
<string name="link_external_browser">Os links serão abertos em um navegador externo</string>
|
||||
<string name="new_installer_title">Usar o novo instalador root (Experimental)</string>
|
||||
<string name="new_installer_summary">Este instalador não depende do status de Verificação de Assinatura. AVISO: Vanced pode desaparecer após reiniciar se você instalá-lo usando isto</string>
|
||||
<string name="system_default">Padrão do Sistema</string>
|
||||
<string name="new_installer_summary">Este instalador não depende do status de verificação de assinatura. AVISO: Vanced pode desaparecer após reiniciar se você instalá-lo usando isto</string>
|
||||
<string name="system_default">Padrão do sistema</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="theme_follow">Padrão do sistema</string>
|
||||
<string name="theme_dark">Escuro</string>
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<string name="link_external_browser">Ссылки откроются во внешнем браузере</string>
|
||||
<string name="new_installer_title">Использовать новый root установщик (экспериментальный)</string>
|
||||
<string name="new_installer_summary">Этот установщик не зависит от статуса проверки подписи. ВНИМАНИЕ: Vanced может пропасть после перезагрузки, если вы установите его с помощью этого установщика</string>
|
||||
<string name="system_default">Системный по-умолчанию</string>
|
||||
<string name="system_default">Системный по умолчанию</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="theme_follow">Как в системе</string>
|
||||
<string name="theme_dark">Тёмная тема</string>
|
||||
|
|
|
@ -41,13 +41,13 @@
|
|||
<string name="cleared_files">Успешно брисање датотека</string>
|
||||
<string name="firebase_title">Firebase Анализа</string>
|
||||
<string name="firebase_summary">Ово нам омогућава да прикупљамо извештаје о перформансама и грешкама</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="language_title">Језик</string>
|
||||
<string name="link_title">Користите Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Линкови ће бити отворени у Chrome Custom Tabs</string>
|
||||
<string name="link_external_browser">Линкови ће бити отвотрни у екстерном претраживачу</string>
|
||||
<string name="new_installer_title">Користи нову root installer апликацију ( Експериментално)</string>
|
||||
<string name="new_installer_summary">Installer апликација не зависи од статуса верификационог потписа. УПОЗОРЕЊЕ: Ако користите ову опцију може да се деси да Vanced апликација се обрише после рестарта</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="system_default">Системски подразумевано</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="theme_follow">Као у систему</string>
|
||||
<string name="theme_dark">Тамна Тема</string>
|
||||
|
|
|
@ -39,15 +39,15 @@
|
|||
<string name="chosen_theme">Тема: %1$s</string>
|
||||
<string name="clear_files">Очистити завантажені файли</string>
|
||||
<string name="cleared_files">Файли було успішно очищено</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="firebase_title">Аналітика Firebase</string>
|
||||
<string name="firebase_summary">Це дозволяє нам збирати інформацію про продуктивність додатка й журнали збоїв</string>
|
||||
<string name="language_title">Мова</string>
|
||||
<string name="link_title">Використовувати Chrome Custom Tabs</string>
|
||||
<string name="link_custom_tabs">Відкривати посилання в Chrome Custom Tabs</string>
|
||||
<string name="link_external_browser">Відкривати посилання у зовнішньому браузері</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="new_installer_title">Використовувати новий root інсталятор (експериментальний)</string>
|
||||
<string name="new_installer_summary">Цей інсталятор не залежить від статусу перевірки підпису. УВАГА: Vanced може пропасти після перезавантаження, якщо ви встановите його за допомогою цього інсталятора</string>
|
||||
<string name="system_default">Системний за замовчуванням</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="theme_follow">Слідувати системі</string>
|
||||
<string name="theme_dark">Темна тема</string>
|
||||
|
|
|
@ -39,15 +39,15 @@
|
|||
<string name="chosen_theme">Nền: %1$s</string>
|
||||
<string name="clear_files">Xóa các tệp tin đã tải về</string>
|
||||
<string name="cleared_files">Xóa các tệp tin thành công</string>
|
||||
<string name="firebase_title">Firebase Analytics</string>
|
||||
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
|
||||
<string name="language_title">Language</string>
|
||||
<string name="firebase_title">Phân tích Firebase</string>
|
||||
<string name="firebase_summary">Điều này cho phép chúng tôi thu thập thông tin về hiệu suất ứng dụng và nhật ký sự cố</string>
|
||||
<string name="language_title">Ngôn ngữ</string>
|
||||
<string name="link_title">Sử dụng Custom Tabs của Chrome</string>
|
||||
<string name="link_custom_tabs">Các đường link sẽ mở trong Custom Tabs của Chrome</string>
|
||||
<string name="link_external_browser">Các đường link sẽ mở trong một trình duyệt ngoài</string>
|
||||
<string name="new_installer_title">Use the new root installer (Experimental)</string>
|
||||
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="new_installer_title">Sử dụng trình cài đặt root mới (Thử nghiệm)</string>
|
||||
<string name="new_installer_summary">Trình cài đặt này không phụ thuộc vào trạng thái Xác minh Chữ ký. CẢNH BÁO: Vanced có thể biến mất sau khi khởi động lại nếu bạn cài đặt nó bằng cách này</string>
|
||||
<string name="system_default">Mặc định hệ thống</string>
|
||||
<string name="theme">Nền</string>
|
||||
<string name="theme_follow">Theo Hệ Thống</string>
|
||||
<string name="theme_dark">Nền Tối</string>
|
||||
|
|
|
@ -5,13 +5,17 @@
|
|||
<Preference
|
||||
android:key="firststart_switch"
|
||||
android:title="First start switcher"
|
||||
android:summary="Dev only please"/>
|
||||
android:summary="No reason to touch this, seriously"/>
|
||||
|
||||
<Preference
|
||||
android:key="force_update"
|
||||
android:title="Force Manager Update"
|
||||
android:summary="Update manager without comparing versionCode"/>
|
||||
|
||||
<Preference
|
||||
android:title="@string/update_url"
|
||||
android:key="install_url" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="Device info">
|
||||
|
||||
|
|
|
@ -76,10 +76,6 @@
|
|||
android:title="@string/chosen_install_values"
|
||||
android:key="vanced_chosen_modes" />
|
||||
|
||||
<Preference
|
||||
android:title="@string/update_url"
|
||||
android:key="install_url" />
|
||||
|
||||
<Preference
|
||||
android:title="@string/clear_files"
|
||||
android:key="clear_files"/>
|
||||
|
|
|
@ -10,7 +10,7 @@ buildscript {
|
|||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.1.0-rc03'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'com.google.gms:google-services:4.3.3'
|
||||
classpath 'com.google.gms:google-services:4.3.4'
|
||||
classpath 'com.google.firebase:perf-plugin:1.3.1'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0'
|
||||
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0'
|
||||
|
|
Loading…
Reference in New Issue