mirror of
https://github.com/YTVanced/VancedManager
synced 2024-11-23 11:45:11 +00:00
improvements
This commit is contained in:
parent
f6345c2dd5
commit
c800383f30
10 changed files with 115 additions and 122 deletions
|
@ -5,6 +5,7 @@ apply plugin: 'kotlin-kapt'
|
|||
apply plugin: 'com.google.gms.google-services'
|
||||
apply plugin: 'com.google.firebase.firebase-perf'
|
||||
apply plugin: 'com.google.firebase.crashlytics'
|
||||
apply plugin: 'androidx.navigation.safeargs.kotlin'
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.vanced.manager.core.downloader
|
|||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.widget.Toast
|
||||
|
@ -32,7 +33,16 @@ import java.security.MessageDigest
|
|||
class VancedDownloadService: Service() {
|
||||
|
||||
private var sha256Val: String? = null
|
||||
private var vancedVersionCode: Int? = null
|
||||
|
||||
private lateinit var prefs: SharedPreferences
|
||||
private lateinit var defPrefs: SharedPreferences
|
||||
private lateinit var arch: String
|
||||
private var installUrl: String? = null
|
||||
private var variant: String? = null
|
||||
private var theme: String? = null
|
||||
private var lang: Array<String>? = null
|
||||
|
||||
private lateinit var themePath: String
|
||||
|
||||
//private var downloadId: Long = 0
|
||||
//private var apkType: String = "arch"
|
||||
|
@ -41,15 +51,26 @@ class VancedDownloadService: Service() {
|
|||
private var hashUrl = ""
|
||||
|
||||
private val yPkg = "com.google.android.youtube"
|
||||
|
||||
suspend fun getVer()
|
||||
{
|
||||
vancedVersionCode = InternetTools.getJsonInt("vanced.json", "versionCode", application)
|
||||
}
|
||||
private val vancedVersionCode: Int = runBlocking { InternetTools.getJsonInt("vanced.json", "versionCode", application) }
|
||||
private val vancedVersion = runBlocking { getObjectFromJson("$installUrl/vanced.json", "version") }
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
|
||||
runBlocking { getVer() }
|
||||
File(getExternalFilesDir("apks")?.path as String).deleteRecursively()
|
||||
defPrefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
installUrl = defPrefs.getString("install_url", baseUrl)
|
||||
prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
|
||||
variant = defPrefs.getString("vanced_variant", "nonroot")
|
||||
lang = prefs.getString("lang", "en")?.split(", ")?.toTypedArray()
|
||||
theme = prefs.getString("theme", "dark")
|
||||
themePath = "$installUrl/apks/v$vancedVersion/$variant/Theme"
|
||||
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
|
||||
arch =
|
||||
when {
|
||||
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
|
||||
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
|
||||
else -> "armeabi_v7a"
|
||||
}
|
||||
downloadSplits()
|
||||
stopSelf()
|
||||
return START_NOT_STICKY
|
||||
|
@ -59,30 +80,13 @@ class VancedDownloadService: Service() {
|
|||
type: String = "theme"
|
||||
) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
File(getExternalFilesDir("apk")?.path as String).deleteRecursively()
|
||||
val defPrefs = PreferenceManager.getDefaultSharedPreferences(this@VancedDownloadService)
|
||||
val installUrl = defPrefs.getString("install_url", baseUrl)
|
||||
val vancedVer = getObjectFromJson("$installUrl/vanced.json", "version")
|
||||
|
||||
val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
|
||||
val variant = defPrefs.getString("vanced_variant", "nonroot")
|
||||
val lang = prefs?.getString("lang", "en")?.split(", ")?.toTypedArray()
|
||||
val theme = prefs?.getString("theme", "dark")
|
||||
val arch =
|
||||
when {
|
||||
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
|
||||
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
|
||||
else -> "armeabi_v7a"
|
||||
}
|
||||
val themePath = "$installUrl/apks/v$vancedVer/$variant/Theme"
|
||||
hashUrl = "apks/v$vancedVer/$variant/Theme/hash.json"
|
||||
val url =
|
||||
when (type) {
|
||||
"arch" -> "$installUrl/apks/v$vancedVer/$variant/Arch/split_config.$arch.apk"
|
||||
"theme" -> "$themePath/$theme.apk"
|
||||
"arch" -> "$installUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk"
|
||||
"stock" -> "$themePath/stock.apk"
|
||||
"dpi" -> "$themePath/dpi.apk"
|
||||
"lang" -> "$installUrl/apks/v$vancedVer/$variant/Language/split_config.${lang?.get(count)}.apk"
|
||||
"lang" -> "$installUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang?.get(count)}.apk"
|
||||
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
|
||||
}
|
||||
|
||||
|
@ -100,10 +104,18 @@ class VancedDownloadService: Service() {
|
|||
.start(object : OnDownloadListener {
|
||||
override fun onDownloadComplete() {
|
||||
when (type) {
|
||||
"theme" -> if(variant=="root") {
|
||||
if(ValidateTheme()) {if(downloadStockCheck())downloadSplits("arch") else prepareInstall(variant)} else downloadSplits("theme")
|
||||
} else downloadSplits("arch")
|
||||
"arch" -> if(variant=="root") downloadSplits("stock") else downloadSplits("lang")
|
||||
"theme" ->
|
||||
if (variant == "root") {
|
||||
if (ValidateTheme()) {
|
||||
if(downloadStockCheck())
|
||||
downloadSplits("arch")
|
||||
else
|
||||
prepareInstall(variant!!)
|
||||
} else
|
||||
downloadSplits("theme")
|
||||
} else
|
||||
downloadSplits("arch")
|
||||
"arch" -> if (variant == "root") downloadSplits("stock") else downloadSplits("lang")
|
||||
"stock" -> downloadSplits("dpi")
|
||||
"dpi" -> downloadSplits("lang")
|
||||
"lang" -> {
|
||||
|
@ -116,7 +128,6 @@ class VancedDownloadService: Service() {
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(error: Error?) {
|
||||
installing = false
|
||||
Toast.makeText(this@VancedDownloadService, getString(R.string.error_downloading, "Vanced"), Toast.LENGTH_SHORT).show()
|
||||
|
@ -125,14 +136,18 @@ class VancedDownloadService: Service() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun downloadStockCheck():Boolean
|
||||
{
|
||||
|
||||
return try {getPkgVerCode(yPkg, packageManager) != vancedVersionCode}catch (e: Exception) {true}
|
||||
private fun downloadStockCheck():Boolean {
|
||||
return try {
|
||||
getPkgVerCode(yPkg, packageManager) != vancedVersionCode
|
||||
} catch (e: Exception) {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getSha256(obj: String) {
|
||||
sha256Val = InternetTools.getJsonString(hashUrl,obj,applicationContext)
|
||||
}
|
||||
|
||||
private fun ValidateTheme(): Boolean
|
||||
{
|
||||
val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
|
||||
|
|
|
@ -29,22 +29,14 @@ import java.util.*
|
|||
import java.util.regex.Pattern
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
|
||||
class RootSplitInstallerService: Service() {
|
||||
|
||||
private var vancedVersionCode: Int = 0
|
||||
private var vancedVersionCode: Int = runBlocking { getJsonInt("vanced.json","versionCode", application) }
|
||||
val yPkg = "com.google.android.youtube"
|
||||
|
||||
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
|
||||
|
||||
|
||||
suspend fun getVer()
|
||||
{
|
||||
vancedVersionCode = getJsonInt("vanced.json","versionCode", application)
|
||||
}
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
|
||||
Shell.enableVerboseLogging = BuildConfig.DEBUG
|
||||
Shell.setDefaultBuilder(
|
||||
Shell.Builder.create()
|
||||
|
@ -52,24 +44,19 @@ class RootSplitInstallerService: Service() {
|
|||
.setTimeout(10)
|
||||
)
|
||||
|
||||
runBlocking { getVer() }
|
||||
Shell.getShell {
|
||||
var job = CoroutineScope(Dispatchers.IO).launch{
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val apkFilesPath = getExternalFilesDir("apks")?.path
|
||||
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
|
||||
if (fileInfoList != null) {
|
||||
var modApk: FileInfo? = null
|
||||
for (fil in fileInfoList)
|
||||
{
|
||||
if(fil.name == "dark.apk" || fil.name == "black.apk")
|
||||
{
|
||||
modApk = fil
|
||||
for (file in fileInfoList) {
|
||||
if (file.name == "dark.apk" || file.name == "black.apk") {
|
||||
modApk = file
|
||||
}
|
||||
}
|
||||
if (modApk != null) {
|
||||
|
||||
if(overwriteBase(modApk, fileInfoList, vancedVersionCode))
|
||||
{
|
||||
if (overwriteBase(modApk, fileInfoList, vancedVersionCode)) {
|
||||
with(localBroadcastManager) {
|
||||
sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
|
||||
sendBroadcast(Intent(HomeFragment.VANCED_INSTALLED))
|
||||
|
@ -184,16 +171,13 @@ class RootSplitInstallerService: Service() {
|
|||
}
|
||||
|
||||
//install Vanced
|
||||
private fun overwriteBase(apkFile: FileInfo,baseApkFiles: ArrayList<FileInfo>, versionCode: Int): Boolean
|
||||
{
|
||||
if(checkVersion(versionCode,baseApkFiles))
|
||||
{
|
||||
private fun overwriteBase(apkFile: FileInfo,baseApkFiles: ArrayList<FileInfo>, versionCode: Int): Boolean {
|
||||
if (checkVersion(versionCode,baseApkFiles)) {
|
||||
val path = getVPath()
|
||||
apkFile.file?.let {
|
||||
val apath = it.absolutePath
|
||||
if(path?.let { it1 -> moveAPK(apath, it1) }!!)
|
||||
{
|
||||
val fpath = SuFile.open(path).parent!!
|
||||
if(path?.let { it1 -> moveAPK(apath, it1) }!!) {
|
||||
SuFile.open(path).parent!!
|
||||
return chConV(path)
|
||||
}
|
||||
|
||||
|
@ -223,35 +207,31 @@ class RootSplitInstallerService: Service() {
|
|||
return fixNoInstall(baseApkFiles)
|
||||
}
|
||||
|
||||
private fun getPkgInfo(pkg: String): PackageInfo?
|
||||
{
|
||||
private fun getPkgInfo(pkg: String): PackageInfo? {
|
||||
return try {
|
||||
val m = packageManager
|
||||
val info = m.getPackageInfo(pkg, 0)
|
||||
info
|
||||
packageManager.getPackageInfo(pkg, 0)
|
||||
} catch (e:Exception) {
|
||||
Log.d("VMpm", "Unable to get package info")
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
private fun compareVersion(pkgVerCode: Int, versionCode: Int): Int
|
||||
{
|
||||
return if(pkgVerCode > versionCode)
|
||||
1
|
||||
else if (pkgVerCode < versionCode)
|
||||
-1
|
||||
else
|
||||
0
|
||||
private fun compareVersion(pkgVerCode: Int, versionCode: Int): Int {
|
||||
return when {
|
||||
pkgVerCode > versionCode -> 1
|
||||
pkgVerCode < versionCode -> -1
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
|
||||
//uninstall current update and install base that works with patch
|
||||
private fun fixHigherVer(apkFiles: ArrayList<FileInfo>) : Boolean {
|
||||
|
||||
if(PackageHelper.uninstallApk(yPkg, applicationContext))
|
||||
{
|
||||
if(PackageHelper.uninstallApk(yPkg, applicationContext)) {
|
||||
return installSplitApkFiles(apkFiles)
|
||||
}
|
||||
with(localBroadcastManager) {sendFailure(listOf("Failed_Uninstall").toMutableList(), applicationContext)}
|
||||
with(localBroadcastManager) {
|
||||
sendFailure(listOf("Failed_Uninstall").toMutableList(), applicationContext)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -269,7 +249,7 @@ class RootSplitInstallerService: Service() {
|
|||
private fun chConV(path: String): Boolean {
|
||||
val response = Shell.su("chcon u:object_r:apk_data_file:s0 $path").exec()
|
||||
//val response = Shell.su("chcon -R u:object_r:system_file:s0 $path").exec()
|
||||
return if(response.isSuccess) {
|
||||
return if (response.isSuccess) {
|
||||
true
|
||||
} else {
|
||||
sendFailure(response.out, applicationContext)
|
||||
|
@ -283,8 +263,7 @@ class RootSplitInstallerService: Service() {
|
|||
val apkinF = SuFile.open(apkFile)
|
||||
val apkoutF = SuFile.open(path)
|
||||
|
||||
if(apkinF.exists())
|
||||
{
|
||||
if(apkinF.exists()) {
|
||||
try {
|
||||
Shell.su("am force-stop $yPkg").exec()
|
||||
|
||||
|
@ -330,6 +309,6 @@ class RootSplitInstallerService: Service() {
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ object PackageHelper {
|
|||
""
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
fun getPkgVerCode(pkg: String, pm:PackageManager): Int? {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
|
||||
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
|
||||
|
|
|
@ -36,10 +36,35 @@
|
|||
android:layout_marginEnd="2dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
<include
|
||||
layout="@layout/include_language_scrollview"
|
||||
<androidx.core.widget.NestedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
android:fillViewport="true"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/lang_button_ll"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
android:id="@+id/en"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:buttonTint="?colorDisabled"
|
||||
android:fontFamily="@font/exo_semibold"
|
||||
android:text="English"
|
||||
android:tag="en"
|
||||
android:textSize="18sp"
|
||||
android:checked="true"
|
||||
android:clickable="false"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:fillViewport="true"
|
||||
tools:ignore="HardcodedText">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/lang_button_ll"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.checkbox.MaterialCheckBox
|
||||
android:id="@+id/en"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:buttonTint="?colorDisabled"
|
||||
android:fontFamily="@font/exo_semibold"
|
||||
android:text="English (default)"
|
||||
android:tag="en"
|
||||
android:textSize="18sp"
|
||||
android:checked="true"
|
||||
android:clickable="false"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
|
@ -3,6 +3,7 @@
|
|||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/home"
|
||||
app:startDestination="@id/home_fragment">
|
||||
|
||||
<fragment
|
||||
|
|
|
@ -13,6 +13,7 @@ buildscript {
|
|||
classpath 'com.google.gms:google-services:4.3.3'
|
||||
classpath 'com.google.firebase:perf-plugin:1.3.1'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
|
||||
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
Loading…
Reference in a new issue