Merge pull request #182 from YTVanced/dev

1.3.1 update
This commit is contained in:
KevinX8 2020-10-03 16:20:55 +01:00 committed by GitHub
commit 7d7c6f2e6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 451 additions and 454 deletions

View File

@ -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())
}
}

View File

@ -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

View File

@ -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>() {

View File

@ -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()
}
}

View File

@ -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)
}
}
}
*/
}

View File

@ -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)
}
}
}
*/
}

View File

@ -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

View File

@ -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)

View File

@ -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)
}

View File

@ -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")
}
}

View File

@ -73,7 +73,6 @@ object DialogContainer {
}
}
//Easter Egg
fun statementFalse(context: Context) {
MaterialAlertDialogBuilder(context).apply {
setTitle("Wait what?")

View File

@ -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
}

View File

@ -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()
})

View File

@ -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 ->

View File

@ -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()
}
}

View File

@ -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)
}
}
}
}
*/
}

View File

@ -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")

View File

@ -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())

View File

@ -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
}
}

View File

@ -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
}

View File

@ -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())
}
})
}
}
}
}

View File

@ -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"
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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()

View File

@ -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>

View File

@ -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>

View File

@ -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"></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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 -->

View File

@ -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>

View File

@ -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 -->

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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"/>

View File

@ -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'