kinda added a root music installer

This commit is contained in:
Xinto 2020-11-08 17:30:12 +04:00
parent 63c11b3474
commit 831fd3e8ad
4 changed files with 93 additions and 23 deletions

View File

@ -6,11 +6,13 @@ import com.downloader.Error
import com.downloader.OnDownloadListener import com.downloader.OnDownloadListener
import com.downloader.PRDownloader import com.downloader.PRDownloader
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.DeviceUtils.getArch
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.InternetTools.baseUrl import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.music import com.vanced.manager.utils.InternetTools.music
import com.vanced.manager.utils.PackageHelper.install import com.vanced.manager.utils.PackageHelper.install
import com.vanced.manager.utils.PackageHelper.installMusicRoot
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -18,12 +20,23 @@ import kotlinx.coroutines.launch
object MusicDownloader { object MusicDownloader {
private var variant: String? = null private var variant: String? = null
private var version: String? = null
private var baseurl = ""
fun downloadMusic(context: Context){ fun downloadMusic(context: Context) {
val prefs = getDefaultSharedPreferences(context)
version = prefs.getString("music_version", music.get()?.string("version"))
variant = prefs.getString("vanced_variant", "nonroot")
baseurl = "${prefs.getString("install_url", baseUrl)}/music/"
}
fun downloadMusic(context: Context, apk: String = "music") {
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
val prefs = getDefaultSharedPreferences(context) val url =
variant = prefs.getString("vanced_variant", "nonroot") if (apk == "stock")
val url = "${prefs.getString("install_url", baseUrl)}/music/v${music.get()?.string("version")}.apk" "$baseurl/stock/v${version}/${getArch()}.apk"
else
"$baseurl/$variant/v${version}.apk"
downloadProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("music/$variant")?.path, "music.apk") downloadProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("music/$variant")?.path, "music.apk")
.build() .build()
@ -35,6 +48,11 @@ object MusicDownloader {
} }
.start(object : OnDownloadListener { .start(object : OnDownloadListener {
override fun onDownloadComplete() { override fun onDownloadComplete() {
if (variant == "root" && apk != "stock") {
downloadMusic(context, "stock")
return
}
startMusicInstall(context) startMusicInstall(context)
} }
@ -50,7 +68,10 @@ object MusicDownloader {
fun startMusicInstall(context: Context) { fun startMusicInstall(context: Context) {
downloadProgress.get()?.installing?.set(true) downloadProgress.get()?.installing?.set(true)
downloadProgress.get()?.reset() downloadProgress.get()?.reset()
install("${context.getExternalFilesDir("music/$variant")}/music.apk", context) if (variant == "root")
installMusicRoot(context)
else
install("${context.getExternalFilesDir("music/$variant")}/music.apk", context)
} }
} }

View File

@ -11,6 +11,7 @@ import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.logEvent import com.google.firebase.analytics.ktx.logEvent
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.AppUtils.vancedRootPkg import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.DeviceUtils.getArch
import com.vanced.manager.utils.DownloadHelper.downloadProgress import com.vanced.manager.utils.DownloadHelper.downloadProgress
import com.vanced.manager.utils.Extensions.convertToAppVersions import com.vanced.manager.utils.Extensions.convertToAppVersions
import com.vanced.manager.utils.InternetTools import com.vanced.manager.utils.InternetTools
@ -67,12 +68,7 @@ object VancedDownloader {
themePath = "$installUrl/apks/v$vancedVersion/$variant/Theme" themePath = "$installUrl/apks/v$vancedVersion/$variant/Theme"
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json" hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
//newInstaller = defPrefs.getBoolean("new_installer", false) //newInstaller = defPrefs.getBoolean("new_installer", false)
arch = arch = getArch()
when {
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
else -> "armeabi_v7a"
}
count = 0 count = 0
vancedVersionCode = vanced.get()?.int("versionCode") ?: 0 vancedVersionCode = vanced.get()?.int("versionCode") ?: 0

View File

@ -0,0 +1,14 @@
package com.vanced.manager.utils
import android.os.Build
object DeviceUtils {
fun getArch(): String = when {
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
else -> "armeabi_v7a"
}
}

View File

@ -13,10 +13,12 @@ import com.topjohnwu.superuser.io.SuFile
import com.vanced.manager.BuildConfig import com.vanced.manager.BuildConfig
import com.vanced.manager.core.installer.AppInstallerService import com.vanced.manager.core.installer.AppInstallerService
import com.vanced.manager.core.installer.AppUninstallerService import com.vanced.manager.core.installer.AppUninstallerService
import com.vanced.manager.utils.AppUtils.musicRootPkg
import com.vanced.manager.utils.AppUtils.sendCloseDialog import com.vanced.manager.utils.AppUtils.sendCloseDialog
import com.vanced.manager.utils.AppUtils.sendFailure import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh import com.vanced.manager.utils.AppUtils.sendRefresh
import com.vanced.manager.utils.AppUtils.vancedRootPkg import com.vanced.manager.utils.AppUtils.vancedRootPkg
import com.vanced.manager.utils.InternetTools.music
import com.vanced.manager.utils.InternetTools.vanced import com.vanced.manager.utils.InternetTools.vanced
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -137,6 +139,43 @@ object PackageHelper {
session.commit(pendingIntent.intentSender) session.commit(pendingIntent.intentSender)
} }
fun installMusicRoot(context: Context) {
CoroutineScope(Dispatchers.IO).launch {
Shell.enableVerboseLogging = BuildConfig.DEBUG
Shell.setDefaultBuilder(
Shell.Builder.create()
.setFlags(Shell.FLAG_REDIRECT_STDERR)
.setTimeout(10)
)
Shell.getShell {
val musicVersion = music.get()?.int("version")
val musicVersionCode = music.get()?.int("versionCode")
val apkFilesPath = context.getExternalFilesDir("music/root")?.path
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
if (fileInfoList != null) {
val modApk: FileInfo? = fileInfoList.lastOrNull { it.name == "v$musicVersion.apk" }
if (modApk != null) {
if (overwriteBase(modApk, fileInfoList, musicVersionCode!!, musicRootPkg, context)) {
sendRefresh(context)
sendCloseDialog(context)
}
}
else {
sendFailure(listOf("ModApk_Missing").toMutableList(), context)
sendCloseDialog(context)
}
}
else {
sendFailure(listOf("Files_Missing_VA").toMutableList(), context)
sendCloseDialog(context)
}
}
}
}
fun installVanced(context: Context): Int { fun installVanced(context: Context): Int {
val apkFolderPath = context.getExternalFilesDir("vanced/nonroot")?.path.toString() + "/" val apkFolderPath = context.getExternalFilesDir("vanced/nonroot")?.path.toString() + "/"
val nameSizeMap = HashMap<String, Long>() val nameSizeMap = HashMap<String, Long>()
@ -257,7 +296,7 @@ object PackageHelper {
it.name == "dark.apk" || it.name == "black.apk" it.name == "dark.apk" || it.name == "black.apk"
} }
if (modApk != null) { if (modApk != null) {
if (overwriteBase(modApk, fileInfoList, vancedVersionCode!!, context)) { if (overwriteBase(modApk, fileInfoList, vancedVersionCode!!, vancedRootPkg, context)) {
sendRefresh(context) sendRefresh(context)
sendCloseDialog(context) sendCloseDialog(context)
} }
@ -363,16 +402,16 @@ object PackageHelper {
} }
//install Vanced //install Vanced
private fun overwriteBase(apkFile: FileInfo,baseApkFiles: ArrayList<FileInfo>, versionCode: Int, context: Context): Boolean { private fun overwriteBase(apkFile: FileInfo, baseApkFiles: ArrayList<FileInfo>, versionCode: Int, pkg: String, context: Context): Boolean {
if (checkVersion(versionCode, baseApkFiles, context)) { if (checkVersion(versionCode, baseApkFiles, pkg, context)) {
val path = getPackageDir(context) val path = getPackageDir(context, pkg)
apkFile.file?.let { apkFile.file?.let {
val apath = it.absolutePath val apath = it.absolutePath
setupFolder(apkInstallPath) setupFolder(apkInstallPath)
if (path != null) { if (path != null) {
val apkFPath = apkInstallPath + "base.apk" val apkFPath = apkInstallPath + "base.apk"
if (moveAPK(apath, apkFPath, context)) { if (moveAPK(apath, apkFPath, pkg, context)) {
if (chConV(apkFPath, context)) { if (chConV(apkFPath, context)) {
if (setupScript(apkFPath,path)) { if (setupScript(apkFPath,path)) {
return linkVanced(apkFPath,path) return linkVanced(apkFPath,path)
@ -412,8 +451,8 @@ object PackageHelper {
} }
//check version and perform action based on result //check version and perform action based on result
private fun checkVersion(versionCode: Int, baseApkFiles: ArrayList<FileInfo>, context: Context): Boolean { private fun checkVersion(versionCode: Int, baseApkFiles: ArrayList<FileInfo>, pkg: String, context: Context): Boolean {
val path = getPackageDir(context) val path = getPackageDir(context, pkg)
if (path != null) { if (path != null) {
if (path.contains("/data/app/")) { if (path.contains("/data/app/")) {
when (getVersionNumber(context)?.let { compareVersion(it,versionCode) } ) { when (getVersionNumber(context)?.let { compareVersion(it,versionCode) } ) {
@ -477,13 +516,13 @@ object PackageHelper {
} }
//move patch to data/app //move patch to data/app
private fun moveAPK(apkFile: String, path: String, context: Context) : Boolean { private fun moveAPK(apkFile: String, path: String, pkg: String, context: Context) : Boolean {
val apkinF = SuFile.open(apkFile) val apkinF = SuFile.open(apkFile)
val apkoutF = SuFile.open(path) val apkoutF = SuFile.open(path)
if(apkinF.exists()) { if(apkinF.exists()) {
try { try {
Shell.su("am force-stop $vancedRootPkg").exec() Shell.su("am force-stop $pkg").exec()
//Shell.su("rm -r SuFile.open(path).parent") //Shell.su("rm -r SuFile.open(path).parent")
@ -540,16 +579,16 @@ object PackageHelper {
} }
//get path of the installed youtube //get path of the installed youtube
private fun getPackageDir(context: Context): String? private fun getPackageDir(context: Context, pkg: String): String?
{ {
val p = getPkgInfo(vancedRootPkg, context) val p = getPkgInfo(pkg, context)
return if(p != null) return if(p != null)
{ {
p.applicationInfo.sourceDir p.applicationInfo.sourceDir
} }
else else
{ {
val execRes = Shell.su("dumpsys package com.google.android.youtube | grep codePath").exec() val execRes = Shell.su("dumpsys package $pkg | grep codePath").exec()
if(execRes.isSuccess) if(execRes.isSuccess)
{ {
val result = execRes.out val result = execRes.out