new downloader library and various additions/fixes

This commit is contained in:
X1nto 2020-06-21 23:24:14 +04:00
parent c4eb9188b0
commit 77921e92fd
19 changed files with 214 additions and 227 deletions

File diff suppressed because one or more lines are too long

View File

@ -58,7 +58,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.3.0' implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.fragment:fragment-ktx:1.2.4' implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'
@ -67,8 +67,8 @@ dependencies {
implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' implementation 'androidx.navigation:navigation-ui-ktx:2.2.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.1.0' implementation 'com.google.android.material:material:1.1.0'
implementation 'com.github.ssseasonnn.RxDownload:rxdownload4:1.0.9'
implementation 'com.github.100rabhkr:GetJSON:1.0' implementation 'com.github.100rabhkr:GetJSON:1.0'
implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.8' implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.8'
implementation 'com.github.topjohnwu.libsu:core:2.5.1' implementation 'com.github.topjohnwu.libsu:core:2.5.1'
implementation 'com.mindorks.android:prdownloader:0.6.0'
} }

View File

@ -10,6 +10,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application <application
android:name=".core.App"
android:allowBackup="false" android:allowBackup="false"
android:fullBackupContent="false" android:fullBackupContent="false"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
@ -59,6 +60,7 @@
<service android:name=".core.installer.RootSplitInstallerService" /> <service android:name=".core.installer.RootSplitInstallerService" />
<service android:name=".core.installer.StubInstaller" /> <service android:name=".core.installer.StubInstaller" />
<service android:name=".core.installer.RootAppUninstaller" /> <service android:name=".core.installer.RootAppUninstaller" />
<service android:name=".core.installer.AppUninstallerService" />
<service android:name=".core.downloader.VancedDownloadService" /> <service android:name=".core.downloader.VancedDownloadService" />
<service android:name=".core.downloader.MicrogDownloadService" /> <service android:name=".core.downloader.MicrogDownloadService" />

View File

@ -0,0 +1,13 @@
package com.vanced.manager.core
import android.app.Application
import com.downloader.PRDownloader
class App: Application() {
override fun onCreate() {
super.onCreate()
PRDownloader.initialize(applicationContext)
}
}

View File

@ -1,19 +1,6 @@
package com.vanced.manager.core.base; package com.vanced.manager.core.base;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
public class DummyJava { public class DummyJava {
private final Activity activity;
public DummyJava(Activity activity) {
this.activity = activity;
}
private void SomeVoid() {
SharedPreferences bullshit = activity.getSharedPreferences("installPrefs", Context.MODE_PRIVATE);
}
} }

View File

@ -6,22 +6,17 @@ import android.content.Intent
import android.os.IBinder import android.os.IBinder
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.dezlum.codelabs.getjson.GetJson import com.dezlum.codelabs.getjson.GetJson
import com.vanced.manager.core.installer.MicrogInstaller.installMicrog import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import io.reactivex.disposables.Disposable import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.schedulers.Schedulers
import zlc.season.rxdownload4.download
import zlc.season.rxdownload4.file
import zlc.season.rxdownload4.task.Task
import zlc.season.rxdownload4.utils.getFileNameFromUrl
class MicrogDownloadService: Service() { class MicrogDownloadService: Service() {
private var disposable: Disposable? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
downloadMicrog() downloadMicrog()
stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
@ -31,41 +26,30 @@ class MicrogDownloadService: Service() {
val apkUrl = GetJson().AsJSONObject("https://x1nto.github.io/VancedFiles/microg.json") val apkUrl = GetJson().AsJSONObject("https://x1nto.github.io/VancedFiles/microg.json")
val dwnldUrl = apkUrl.get("url").asString val dwnldUrl = apkUrl.get("url").asString
val task = filesDir?.path?.let { PRDownloader.download(dwnldUrl, filesDir.path, "microg.apk")
Task( .build()
url = dwnldUrl, .setOnProgressListener { progress ->
saveName = getFileNameFromUrl(dwnldUrl), val intent = Intent(HomeFragment.MICROG_DOWNLOADING)
savePath = it val mProgress = progress.currentBytes * 100 / progress.totalBytes
) intent.action = HomeFragment.MICROG_DOWNLOADING
} intent.putExtra("microgProgress", mProgress.toInt())
intent.putExtra("fileName", "Downloading ${getFileNameFromUrl(dwnldUrl)}...")
if (task?.file()?.exists()!!) LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
task.file().delete() }
.start(object : OnDownloadListener {
disposable = task override fun onDownloadComplete() {
.download()
.observeOn(Schedulers.newThread())
.subscribeBy(
onNext = { progress ->
val intent = Intent(HomeFragment.MICROG_DOWNLOADING)
intent.action = HomeFragment.MICROG_DOWNLOADING
intent.putExtra("microgProgress", progress.percent().toInt())
intent.putExtra("fileName", "Downloading ${getFileNameFromUrl(dwnldUrl)}...")
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
},
onComplete = {
val intent = Intent(HomeFragment.MICROG_DOWNLOADED) val intent = Intent(HomeFragment.MICROG_DOWNLOADED)
intent.action = HomeFragment.MICROG_DOWNLOADED intent.action = HomeFragment.MICROG_DOWNLOADED
LocalBroadcastManager.getInstance(this).sendBroadcast(intent) LocalBroadcastManager.getInstance(this@MicrogDownloadService).sendBroadcast(intent)
prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply() prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply()
}, }
onError = { throwable -> override fun onError(error: Error) {
val intent = Intent(HomeFragment.DOWNLOAD_ERROR) val intent = Intent(HomeFragment.DOWNLOAD_ERROR)
intent.action = HomeFragment.DOWNLOAD_ERROR intent.action = HomeFragment.DOWNLOAD_ERROR
intent.putExtra("DownloadError", throwable.toString()) intent.putExtra("DownloadError", error.toString())
LocalBroadcastManager.getInstance(this).sendBroadcast(intent) LocalBroadcastManager.getInstance(this@MicrogDownloadService).sendBroadcast(intent)
} }
) })
} }
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {

View File

@ -7,24 +7,19 @@ import android.os.Build
import android.os.IBinder import android.os.IBinder
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.core.installer.RootSplitInstallerService import com.vanced.manager.core.installer.RootSplitInstallerService
import com.vanced.manager.core.installer.SplitInstaller import com.vanced.manager.core.installer.SplitInstaller
import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import io.reactivex.disposables.Disposable import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.schedulers.Schedulers
import zlc.season.rxdownload4.delete
import zlc.season.rxdownload4.download
import zlc.season.rxdownload4.file
import zlc.season.rxdownload4.task.Task
import zlc.season.rxdownload4.utils.getFileNameFromUrl
class VancedDownloadService: Service() { class VancedDownloadService: Service() {
private var disposable: Disposable? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
downloadSplits() downloadSplits()
stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
@ -33,7 +28,8 @@ class VancedDownloadService: Service() {
) { ) {
val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE) val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
prefs?.edit()?.putBoolean("isVancedDownloading", true)?.apply() prefs?.edit()?.putBoolean("isVancedDownloading", true)?.apply()
val variant = PreferenceManager.getDefaultSharedPreferences(this).getString("vanced_variant", "nonroot") val variant = PreferenceManager.getDefaultSharedPreferences(this)
.getString("vanced_variant", "nonroot")
val lang = prefs?.getString("lang", "en") val lang = prefs?.getString("lang", "en")
val theme = prefs?.getString("theme", "dark") val theme = prefs?.getString("theme", "dark")
val arch = val arch =
@ -51,28 +47,21 @@ class VancedDownloadService: Service() {
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?") else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
} }
val task = cacheDir?.path?.let { PRDownloader.download(url, filesDir.path, getFileNameFromUrl(url))
Task( .build()
url = url, .setOnProgressListener { progress ->
saveName = getFileNameFromUrl(url), val intent = Intent(HomeFragment.VANCED_DOWNLOADING)
savePath = it val mProgress = progress.currentBytes * 100 / progress.totalBytes
) intent.action = HomeFragment.VANCED_DOWNLOADING
} intent.putExtra("vancedProgress", mProgress.toInt())
intent.putExtra(
if (task?.file()?.exists()!!) "fileName",
task.delete() "Downloading ${getFileNameFromUrl(url)}..."
)
disposable = task.download() LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
.observeOn(Schedulers.newThread()) }
.subscribeBy( .start(object : OnDownloadListener {
onNext = { progress -> override fun onDownloadComplete() {
val intent = Intent(HomeFragment.VANCED_DOWNLOADING)
intent.action = HomeFragment.VANCED_DOWNLOADING
intent.putExtra("vancedProgress", progress.percent().toInt())
intent.putExtra("fileName", "Downloading ${getFileNameFromUrl(url)}...")
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
},
onComplete = {
when (type) { when (type) {
"arch" -> downloadSplits("theme") "arch" -> downloadSplits("theme")
"theme" -> downloadSplits("lang") "theme" -> downloadSplits("lang")
@ -80,25 +69,26 @@ class VancedDownloadService: Service() {
if (lang == "en" || type == "enlang") { if (lang == "en" || type == "enlang") {
val intent = Intent(HomeFragment.VANCED_DOWNLOADED) val intent = Intent(HomeFragment.VANCED_DOWNLOADED)
intent.action = HomeFragment.VANCED_DOWNLOADED intent.action = HomeFragment.VANCED_DOWNLOADED
LocalBroadcastManager.getInstance(this).sendBroadcast(intent) LocalBroadcastManager.getInstance(this@VancedDownloadService).sendBroadcast(intent)
if (variant == "root") if (variant == "root")
launchRootInstaller() launchRootInstaller()
else else
launchInstaller() launchInstaller()
stopSelf()
} else { } else {
downloadSplits("enlang") downloadSplits("enlang")
} }
} }
} }
}, }
onError = { throwable ->
override fun onError(error: Error) {
val intent = Intent(HomeFragment.DOWNLOAD_ERROR) val intent = Intent(HomeFragment.DOWNLOAD_ERROR)
intent.action = HomeFragment.DOWNLOAD_ERROR intent.action = HomeFragment.DOWNLOAD_ERROR
intent.putExtra("DownloadError", throwable.toString()) intent.putExtra("DownloadError", error.toString())
LocalBroadcastManager.getInstance(this).sendBroadcast(intent) LocalBroadcastManager.getInstance(this@VancedDownloadService)
.sendBroadcast(intent)
} }
) })
} }
private fun launchInstaller() { private fun launchInstaller() {
SplitInstaller.installSplitApk(this) SplitInstaller.installSplitApk(this)

View File

@ -17,7 +17,7 @@ import com.vanced.manager.core.installer.StubInstaller
import com.vanced.manager.ui.dialogs.DialogContainer.rootModeDetected import com.vanced.manager.ui.dialogs.DialogContainer.rootModeDetected
import com.vanced.manager.ui.dialogs.DialogContainer.secondMiuiDialog import com.vanced.manager.ui.dialogs.DialogContainer.secondMiuiDialog
import com.vanced.manager.utils.MiuiHelper import com.vanced.manager.utils.MiuiHelper
import com.vanced.manager.utils.PackageHelper.uninstallApp import com.vanced.manager.utils.PackageHelper.uninstallApk
open class Home : BaseFragment(), View.OnClickListener { open class Home : BaseFragment(), View.OnClickListener {
@ -53,9 +53,9 @@ open class Home : BaseFragment(), View.OnClickListener {
val isVancedDownloading: Boolean? = prefs?.getBoolean("isVancedDownloading", false) val isVancedDownloading: Boolean? = prefs?.getBoolean("isVancedDownloading", false)
val isMicrogDownloading: Boolean? = prefs?.getBoolean("isMicrogDownloading", false) val isMicrogDownloading: Boolean? = prefs?.getBoolean("isMicrogDownloading", false)
val variant = getDefaultSharedPreferences(activity) val variant = getDefaultSharedPreferences(activity)
.getString("vanced_variant", "Nonroot") .getString("vanced_variant", "nonroot")
val vancedPkgName = val vancedPkgName =
if (variant == "Root") { if (variant == "root") {
"com.google.android.youtube" "com.google.android.youtube"
} else { } else {
"com.vanced.android.youtube" "com.vanced.android.youtube"
@ -64,7 +64,7 @@ open class Home : BaseFragment(), View.OnClickListener {
when (v?.id) { when (v?.id) {
R.id.vanced_installbtn -> { R.id.vanced_installbtn -> {
if (!isVancedDownloading!!) { if (!isVancedDownloading!!) {
if (variant == "Root") { if (variant == "root") {
if (MiuiHelper.isMiui()) { if (MiuiHelper.isMiui()) {
activity?.let { secondMiuiDialog(it) } activity?.let { secondMiuiDialog(it) }
} else } else
@ -106,9 +106,9 @@ open class Home : BaseFragment(), View.OnClickListener {
val intent = Intent(activity, StubInstaller::class.java) val intent = Intent(activity, StubInstaller::class.java)
activity?.startService(intent) activity?.startService(intent)
} }
R.id.microg_uninstallbtn -> activity?.let { uninstallApp("com.mgoogle.android.gms", it) R.id.microg_uninstallbtn -> activity?.let { uninstallApk("com.mgoogle.android.gms", it)
} }
R.id.vanced_uninstallbtn -> activity?.let { uninstallApp(vancedPkgName, it) } R.id.vanced_uninstallbtn -> activity?.let { uninstallApk(vancedPkgName, it) }
} }
} }

View File

@ -0,0 +1,36 @@
package com.vanced.manager.core.installer
import android.app.Service
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.ui.fragments.HomeFragment
class AppUninstallerService: Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
when (intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_SUCCESS -> {
sendBroadCast(HomeFragment.APP_UNINSTALLED)
}
PackageInstaller.STATUS_FAILURE -> {
sendBroadCast(HomeFragment.APP_NOT_UNINSTALLED)
}
}
return START_NOT_STICKY
}
private fun sendBroadCast(status: String) {
val mIntent = Intent(status)
mIntent.action = status
mIntent.putExtra("pkgName", PackageInstaller.EXTRA_PACKAGE_NAME)
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
}

View File

@ -9,6 +9,7 @@ import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.annotation.Nullable import androidx.annotation.Nullable
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.R
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
class SplitInstallerService: Service() { class SplitInstallerService: Service() {
@ -33,48 +34,29 @@ class SplitInstallerService: Service() {
mIntent.action = MainActivity.INSTALL_COMPLETED mIntent.action = MainActivity.INSTALL_COMPLETED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent) LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
} }
PackageInstaller.STATUS_FAILURE_ABORTED -> { else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_ABORTED)
mIntent.action = MainActivity.INSTALL_ABORTED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_INVALID -> {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_INVALID)
mIntent.action = MainActivity.INSTALL_INVALID
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_CONFLICT -> {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_CONFLICT)
mIntent.action = MainActivity.INSTALL_CONFLICT
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_STORAGE -> {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_STORAGE)
mIntent.action = MainActivity.INSTALL_STORAGE
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_BLOCKED -> {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_BLOCKED)
mIntent.action = MainActivity.INSTALL_BLOCKED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
else -> {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
Log.d(TAG, "Installation failed")
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_FAILED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
} }
stopSelf() stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
private fun sendFailure(status: Int) {
val msg = when (status) {
PackageInstaller.STATUS_FAILURE_ABORTED -> getString(R.string.installation_aborted)
PackageInstaller.STATUS_FAILURE_BLOCKED -> getString(R.string.installation_blocked)
PackageInstaller.STATUS_FAILURE_STORAGE -> getString(R.string.installation_storage)
PackageInstaller.STATUS_FAILURE_INVALID -> getString(R.string.installation_invalid)
PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> getString(R.string.installation_incompatible)
PackageInstaller.STATUS_FAILURE_CONFLICT -> getString(R.string.installation_conflict)
else -> getString(R.string.installation_failed)
}
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_FAILED
mIntent.putExtra("errorMsg", msg)
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
@Nullable @Nullable
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null

View File

@ -55,13 +55,9 @@ class MainActivity : Main() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
when (intent.action) { when (intent.action) {
INSTALL_COMPLETED -> launchVanced(this@MainActivity) INSTALL_COMPLETED -> launchVanced(this@MainActivity)
INSTALL_BLOCKED -> installAlertBuilder(getString(R.string.installation_blocked), this@MainActivity) INSTALL_FAILED -> {
INSTALL_FAILED -> installAlertBuilder(getString(R.string.installation_failed), this@MainActivity) installAlertBuilder(intent.getStringExtra("errorMsg") as String, this@MainActivity)
INSTALL_ABORTED -> installAlertBuilder(getString(R.string.installation_aborted), this@MainActivity) }
INSTALL_STORAGE -> installAlertBuilder(getString(R.string.installation_storage), this@MainActivity)
INSTALL_CONFLICT -> installAlertBuilder(getString(R.string.installation_conflict), this@MainActivity)
INSTALL_INVALID -> installAlertBuilder(getString(R.string.installation_invalid), this@MainActivity)
} }
} }
} }
@ -127,34 +123,14 @@ class MainActivity : Main() {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter( LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_COMPLETED INSTALL_COMPLETED
)) ))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_ABORTED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_BLOCKED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_STORAGE
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_CONFLICT
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter( LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_FAILED INSTALL_FAILED
)) ))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_INVALID
))
} }
companion object { companion object {
const val INSTALL_COMPLETED = "Installation completed" const val INSTALL_COMPLETED = "Installation completed"
const val INSTALL_ABORTED = "user aborted installation"
const val INSTALL_BLOCKED = "user blocked installation"
const val INSTALL_STORAGE = "there was an error with storage.\n Hold up how is that even possible?"
const val INSTALL_CONFLICT = "app conflicts with already installed app"
const val INSTALL_FAILED = "it just failed idk" const val INSTALL_FAILED = "it just failed idk"
const val INSTALL_INVALID = "apk files are invalid"
} }
} }

View File

@ -184,7 +184,12 @@ class HomeFragment : Home() {
} }
if (variant == "root" && viewModel.signatureStatusTxt.value != getString(R.string.signature_disabled)) { if (variant == "root" && viewModel.signatureStatusTxt.value != getString(R.string.signature_disabled)) {
disableVancedButton(getString(R.string.signature_not_checked)) when (viewModel.signatureStatusTxt.value) {
getString(R.string.unavailable) -> disableVancedButton(getString(R.string.signature_not_checked))
getString(R.string.signature_enabled) -> disableVancedButton(getString(R.string.signature_disable))
else -> throw NotImplementedError("Error handling status")
}
} }
val oa2 = ObjectAnimator.ofFloat(networkErrorLayout, "yFraction", 0f, 0.3f) val oa2 = ObjectAnimator.ofFloat(networkErrorLayout, "yFraction", 0f, 0.3f)
@ -291,6 +296,15 @@ class HomeFragment : Home() {
Toast.makeText(activity, error, Toast.LENGTH_SHORT).show() Toast.makeText(activity, error, Toast.LENGTH_SHORT).show()
Log.d("VMDwnld", error) Log.d("VMDwnld", error)
} }
APP_UNINSTALLED -> {
val pkgName = intent.getStringExtra("pkgName")
restartActivity()
Log.d(tag, "successfully uninstalled $pkgName")
}
APP_NOT_UNINSTALLED -> {
val pkgName = intent.getStringExtra("pkgName")
Log.d(tag, "Failed to uninstall $pkgName")
}
} }
} }
} }
@ -337,6 +351,18 @@ class HomeFragment : Home() {
) )
) )
} }
activity?.let {
LocalBroadcastManager.getInstance(it).registerReceiver(broadcastReceiver, IntentFilter(
APP_UNINSTALLED
)
)
}
activity?.let {
LocalBroadcastManager.getInstance(it).registerReceiver(broadcastReceiver, IntentFilter(
APP_NOT_UNINSTALLED
)
)
}
} }
@ -396,6 +422,9 @@ class HomeFragment : Home() {
const val VANCED_DOWNLOADED = "Vanced downloaded" const val VANCED_DOWNLOADED = "Vanced downloaded"
const val MICROG_DOWNLOADED = "MicroG downloaded" const val MICROG_DOWNLOADED = "MicroG downloaded"
const val DOWNLOAD_ERROR = "Error occurred" const val DOWNLOAD_ERROR = "Error occurred"
const val APP_UNINSTALLED = "App uninstalled"
const val APP_NOT_UNINSTALLED = "App not uninstalled"
} }
} }

View File

@ -8,9 +8,11 @@ import androidx.preference.*
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
import java.util.*
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : PreferenceFragmentCompat() {
@ExperimentalStdlibApi
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey) setPreferencesFromResource(R.xml.preferences, rootKey)
@ -40,7 +42,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
} }
val installMode: DropDownPreference? = findPreference("vanced_variant") val installMode: DropDownPreference? = findPreference("vanced_variant")
installMode?.summary = preferenceScreen.sharedPreferences.getString("vanced_variant", "nonroot") installMode?.summary = preferenceScreen.sharedPreferences.getString("vanced_variant",
"nonroot"
)?.capitalize(Locale.ROOT)
installMode?.setOnPreferenceChangeListener{ _, _ -> installMode?.setOnPreferenceChangeListener{ _, _ ->
when (installMode.value) { when (installMode.value) {
"nonroot" -> { "nonroot" -> {

View File

@ -1,6 +1,5 @@
package com.vanced.manager.ui.fragments package com.vanced.manager.ui.fragments
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
@ -19,21 +18,17 @@ import androidx.fragment.app.DialogFragment
import com.dezlum.codelabs.getjson.GetJson import com.dezlum.codelabs.getjson.GetJson
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.BuildConfig import com.vanced.manager.BuildConfig
import com.vanced.manager.R import com.vanced.manager.R
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.subscribeBy import java.io.File
import zlc.season.rxdownload4.download
import zlc.season.rxdownload4.file
import zlc.season.rxdownload4.task.Task
import zlc.season.rxdownload4.utils.getFileNameFromUrl
class UpdateCheckFragment : DialogFragment() { class UpdateCheckFragment : DialogFragment() {
private var disposable: Disposable? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@ -44,7 +39,6 @@ class UpdateCheckFragment : DialogFragment() {
return inflater.inflate(R.layout.fragment_update_check, container, false) return inflater.inflate(R.layout.fragment_update_check, container, false)
} }
@SuppressLint("SetTextI18n")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -63,18 +57,18 @@ class UpdateCheckFragment : DialogFragment() {
if (remoteVersion > BuildConfig.VERSION_CODE) { if (remoteVersion > BuildConfig.VERSION_CODE) {
recheckbtn.visibility = View.GONE recheckbtn.visibility = View.GONE
checkingTxt.text = "Update Found!" checkingTxt.text = getString(R.string.update_found)
updatebtn.setOnClickListener { updatebtn.setOnClickListener {
upgradeManager(loadBar) upgradeManager(loadBar)
} }
} else { } else {
checkingTxt.text = "No updates found" checkingTxt.text = getString(R.string.update_notfound)
} }
} else { } else {
checkingTxt.text = "No connection" checkingTxt.text = getString(R.string.network_error)
} }
} }
@ -83,32 +77,22 @@ class UpdateCheckFragment : DialogFragment() {
val apkUrl = GetJson().AsJSONObject("https://vanced.app/api/v1/manager.json") val apkUrl = GetJson().AsJSONObject("https://vanced.app/api/v1/manager.json")
val dwnldUrl = apkUrl.get("url").asString val dwnldUrl = apkUrl.get("url").asString
val task = activity?.filesDir?.path?.let { PRDownloader.download(dwnldUrl, activity?.filesDir?.path, "manager.apk")
Task( .build()
url = dwnldUrl, .setOnProgressListener { progress ->
saveName = getFileNameFromUrl(dwnldUrl), val mProgress = progress.currentBytes * 100 / progress.totalBytes
savePath = it loadBar.visibility = View.VISIBLE
) loadBar.progress = mProgress.toInt()
}
if (task?.file()?.exists()!!) }
task.file().delete() .start(object : OnDownloadListener{
override fun onDownloadComplete() {
disposable = task
.download()
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onNext = { progress ->
loadBar.visibility = View.VISIBLE
loadBar.progress = progress.percent().toInt()
},
onComplete = {
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext()) val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
prefs.getBoolean("isUpgrading", false) prefs.getBoolean("isUpgrading", false)
prefs.edit().putBoolean("isUpgrading", true).apply() prefs.edit().putBoolean("isUpgrading", true).apply()
val pn = activity?.packageName val pn = activity?.packageName
val apk = task.file() val apk = File(activity?.filesDir?.path, "manager.apk")
val uri = val uri =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(requireContext(), "$pn.provider", apk) FileProvider.getUriForFile(requireContext(), "$pn.provider", apk)
@ -119,12 +103,14 @@ class UpdateCheckFragment : DialogFragment() {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent) startActivity(intent)
},
onError = { throwable ->
Toast.makeText(activity, throwable.toString(), Toast.LENGTH_SHORT).show()
Log.e("VMUpgrade", throwable.toString())
} }
)
override fun onError(error: Error?) {
Toast.makeText(activity, error.toString(), Toast.LENGTH_SHORT).show()
Log.e("VMUpgrade", error.toString())
}
})
} }

View File

@ -26,7 +26,6 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
} else { } else {
"com.vanced.android.youtube" "com.vanced.android.youtube"
} }
//private val signaturePref = getDefaultSharedPreferences(application).getString("signature_status", "unavailable")
val microgInstalled: Boolean = isPackageInstalled("com.mgoogle.android.gms", application.packageManager) val microgInstalled: Boolean = isPackageInstalled("com.mgoogle.android.gms", application.packageManager)
val vancedInstalled: Boolean = isPackageInstalled(vancedPkgName, application.packageManager) val vancedInstalled: Boolean = isPackageInstalled(vancedPkgName, application.packageManager)

View File

@ -5,6 +5,7 @@ import java.io.FileInputStream
import java.io.InputStream import java.io.InputStream
open class FileInfo(val name: String, val fileSize: Long, val file: File? = null) { open class FileInfo(val name: String, val fileSize: Long, val file: File? = null) {
open fun getInputStream(): InputStream = open fun getInputStream(): InputStream =
if (file!= null) if (file!= null)
FileInputStream(file) FileInputStream(file)

View File

@ -14,5 +14,7 @@ object InternetTools {
customTabsIntent.launchUrl(context, Uri.parse(Url)) customTabsIntent.launchUrl(context, Uri.parse(Url))
} }
fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/')+1, url.length)
} }

View File

@ -1,13 +1,10 @@
package com.vanced.manager.utils package com.vanced.manager.utils
import android.app.Activity import android.app.Activity
import android.content.ActivityNotFoundException import android.app.PendingIntent
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import com.vanced.manager.core.installer.SplitInstallerService
import android.widget.Toast
import com.vanced.manager.core.base.BaseFragment
object PackageHelper { object PackageHelper {
@ -20,15 +17,9 @@ object PackageHelper {
} }
} }
fun uninstallApp(pkgName: String, activity: Activity) { fun uninstallApk(pkg: String, activity: Activity) {
try { val callbackIntent = Intent(activity.applicationContext, SplitInstallerService::class.java)
val uri = Uri.parse("package:$pkgName") val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0)
val uninstall = Intent(Intent.ACTION_DELETE, uri) activity.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender)
uninstall.flags = Intent.FLAG_ACTIVITY_NEW_TASK
uninstall.putExtra(Intent.EXTRA_RETURN_RESULT, true)
activity.startActivityForResult(uninstall, BaseFragment.APP_UNINSTALL)
} catch (e: ActivityNotFoundException) {
Toast.makeText(activity, "Failed to uninstall", Toast.LENGTH_SHORT).show()
}
} }
} }

View File

@ -20,6 +20,7 @@
<string name="installation_blocked">Operation failed because user blocked installation</string> <string name="installation_blocked">Operation failed because user blocked installation</string>
<string name="installation_conflict">Operation failed because app conflicts with already installed app</string> <string name="installation_conflict">Operation failed because app conflicts with already installed app</string>
<string name="installation_failed">Operation failed because it just failed idk</string> <string name="installation_failed">Operation failed because it just failed idk</string>
<string name="installation_incompatible">Operation failed because app is incompatible with your device</string>
<string name="installation_invalid">Operation failed because apk files are invalid</string> <string name="installation_invalid">Operation failed because apk files are invalid</string>
<string name="installation_storage">Operation failed because there was an error with storage. Hold up how is that even possible?</string> <string name="installation_storage">Operation failed because there was an error with storage. Hold up how is that even possible?</string>
<string name="button_installed">Installed</string> <string name="button_installed">Installed</string>
@ -33,11 +34,12 @@
<string name="useful_links">Useful Links</string> <string name="useful_links">Useful Links</string>
<string name="vanced_medias">Vanced on Social Media</string> <string name="vanced_medias">Vanced on Social Media</string>
<string name="website_text">The official website of Vanced</string> <string name="website_text">The official website of Vanced</string>
<string name="signature_disable">Disable Sig.</string>
<string name="signature_disabled">Disabled</string> <string name="signature_disabled">Disabled</string>
<string name="signature_enabled">Enabled</string> <string name="signature_enabled">Enabled</string>
<string name="signature_status">status:</string> <string name="signature_status">status:</string>
<string name="signature_verification">Signature Verification</string> <string name="signature_verification">Sig. Verification</string>
<string name="signature_not_checked">Signature not checked</string> <string name="signature_not_checked">Check signature</string>
<string name="support_us">Support us by downloading Brave</string> <string name="support_us">Support us by downloading Brave</string>
<!-- Settings --> <!-- Settings -->
@ -60,6 +62,8 @@
<string name="push_notifications_summary">Receive push notifications when update is released</string> <string name="push_notifications_summary">Receive push notifications when update is released</string>
<string name="re_check">Re-check</string> <string name="re_check">Re-check</string>
<string name="update_center">Update Center</string> <string name="update_center">Update Center</string>
<string name="update_found">Update found!</string>
<string name="update_notfound">No new updates</string>>
<!-- Install Page --> <!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language for Vanced</string> <string name="choose_preferred_language">Choose your preferred language for Vanced</string>