chnages to download system

This commit is contained in:
X1nto 2020-08-05 15:52:09 +04:00
parent 8e65ae8d95
commit 1a9575cf65
13 changed files with 190 additions and 293 deletions

View File

@ -37,7 +37,7 @@
<activity <activity
android:name=".ui.MainActivity" android:name=".ui.MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.MaterialComponents"/> android:theme="@style/DarkTheme.Blue"/>
<meta-data <meta-data
android:name="preloaded_fonts" android:name="preloaded_fonts"

View File

@ -1,27 +1,27 @@
package com.vanced.manager.core.downloader package com.vanced.manager.core.downloader
import android.app.Service import android.app.Service
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.IBinder import android.os.IBinder
import android.widget.Toast
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.downloader.Error
import com.downloader.OnDownloadListener import com.downloader.OnDownloadListener
import com.downloader.OnStartOrResumeListener
import com.downloader.PRDownloader import com.downloader.PRDownloader
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.installer.AppInstaller import com.vanced.manager.core.installer.AppInstaller
import com.vanced.manager.ui.fragments.HomeFragment
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.getObjectFromJson import com.vanced.manager.utils.InternetTools.getObjectFromJson
import com.vanced.manager.utils.NotificationHelper
import com.vanced.manager.utils.NotificationHelper.cancelNotif
import com.vanced.manager.utils.NotificationHelper.createBasicNotif
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
class MicrogDownloadService: Service() { class MicrogDownloadService: Service() {
//private var downloadId: Long = 0 //private var downloadId: Long = 0
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) //registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
@ -34,7 +34,6 @@ class MicrogDownloadService: Service() {
val context = this val context = this
runBlocking { runBlocking {
launch { launch {
val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val url = getObjectFromJson( val url = getObjectFromJson(
"${PreferenceManager.getDefaultSharedPreferences(context) "${PreferenceManager.getDefaultSharedPreferences(context)
.getString("install_url", baseUrl)}/microg.json", "url" .getString("install_url", baseUrl)}/microg.json", "url"
@ -42,43 +41,23 @@ class MicrogDownloadService: Service() {
//downloadId = download(url, "apk", "microg.apk", this@MicrogDownloadService) //downloadId = download(url, "apk", "microg.apk", this@MicrogDownloadService)
val channel = 420
PRDownloader.download(url, getExternalFilesDir("apk")?.path, "microg.apk") PRDownloader.download(url, getExternalFilesDir("apk")?.path, "microg.apk")
.build() .build()
.setOnStartOrResumeListener {
OnStartOrResumeListener {
prefs?.edit()?.putBoolean("isMicrogDownloading", true)?.apply()
}
}
.setOnProgressListener { progress -> .setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes val mProgress = progress.currentBytes * 100 / progress.totalBytes
NotificationHelper.displayDownloadNotif( localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_DOWNLOADING).putExtra("progress", mProgress).putExtra("file", getFileNameFromUrl(url)))
channel,
mProgress.toInt(),
getFileNameFromUrl(url),
this@MicrogDownloadService
)
} }
.start(object : OnDownloadListener { .start(object : OnDownloadListener {
override fun onDownloadComplete() { override fun onDownloadComplete() {
prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply()
cancelNotif(channel, this@MicrogDownloadService)
val intent = Intent(this@MicrogDownloadService, AppInstaller::class.java) val intent = Intent(this@MicrogDownloadService, AppInstaller::class.java)
intent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk") intent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk")
intent.putExtra("pkg", "com.mgoogle.android.gms") intent.putExtra("pkg", "com.mgoogle.android.gms")
//val mIntent = Intent(HomeFragment.MICROG_DOWNLOADED) localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_INSTALLING))
//mIntent.action = HomeFragment.MICROG_DOWNLOADED
//LocalBroadcastManager.getInstance(this@MicrogDownloadService).sendBroadcast(mIntent)
startService(intent) startService(intent)
} }
override fun onError(error: com.downloader.Error?) { override fun onError(error: Error?) {
prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply() Toast.makeText(this@MicrogDownloadService, getString(R.string.error_downloading, "microG"), Toast.LENGTH_SHORT).show()
createBasicNotif(
getString(R.string.error_downloading, "Microg"),
channel,
this@MicrogDownloadService
)
} }
}) })
@ -102,11 +81,6 @@ class MicrogDownloadService: Service() {
} }
*/ */
override fun onDestroy() {
super.onDestroy()
cancelNotif(420, this)
//unregisterReceiver(receiver)
}
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null

View File

@ -5,6 +5,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.widget.Toast
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.Error
@ -17,9 +18,6 @@ import com.vanced.manager.ui.fragments.HomeFragment
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.getObjectFromJson import com.vanced.manager.utils.InternetTools.getObjectFromJson
import com.vanced.manager.utils.NotificationHelper.cancelNotif
import com.vanced.manager.utils.NotificationHelper.createBasicNotif
import com.vanced.manager.utils.NotificationHelper.displayDownloadNotif
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -28,6 +26,7 @@ class VancedDownloadService: Service() {
//private var downloadId: Long = 0 //private var downloadId: Long = 0
//private var apkType: String = "arch" //private var apkType: String = "arch"
private var count: Int = 0 private var count: Int = 0
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) //registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
@ -67,14 +66,12 @@ class VancedDownloadService: Service() {
//apkType = type //apkType = type
//downloadId = download(url, "apks", getFileNameFromUrl(url), this@VancedDownloadService) //downloadId = download(url, "apks", getFileNameFromUrl(url), this@VancedDownloadService)
val channel = 69
PRDownloader PRDownloader
.download(url, getExternalFilesDir("apks")?.path, getFileNameFromUrl(url)) .download(url, getExternalFilesDir("apks")?.path, getFileNameFromUrl(url))
.build() .build()
//.setOnStartOrResumeListener { OnStartOrResumeListener { prefs?.edit()?.putBoolean("isVancedDownloading", true)?.apply() } }
.setOnProgressListener { progress -> .setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes val mProgress = progress.currentBytes * 100 / progress.totalBytes
displayDownloadNotif(channel, mProgress.toInt(), getFileNameFromUrl(url), this@VancedDownloadService) localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_DOWNLOADING).putExtra("progress", mProgress).putExtra("file", getFileNameFromUrl(url)))
} }
.start(object : OnDownloadListener { .start(object : OnDownloadListener {
override fun onDownloadComplete() { override fun onDownloadComplete() {
@ -83,18 +80,16 @@ class VancedDownloadService: Service() {
"theme" -> downloadSplits("lang") "theme" -> downloadSplits("lang")
"lang" -> { "lang" -> {
count++ count++
if (count < lang?.count()!!) { if (count < lang?.count()!!)
downloadSplits("lang") downloadSplits("lang")
} else { else
prepareInstall(variant!!) prepareInstall(variant!!)
cancelNotif(channel, this@VancedDownloadService)
}
} }
} }
} }
override fun onError(error: Error?) { override fun onError(error: Error?) {
createBasicNotif(getString(R.string.error_downloading, "Vanced"), channel, this@VancedDownloadService) Toast.makeText(this@VancedDownloadService, getString(R.string.error_downloading, "Vanced"), Toast.LENGTH_SHORT).show()
} }
}) })
} }
@ -130,19 +125,13 @@ class VancedDownloadService: Service() {
*/ */
private fun prepareInstall(variant: String) { private fun prepareInstall(variant: String) {
//LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(HomeFragment.VANCED_DOWNLOADED)) localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_INSTALLING))
if (variant == "root") if (variant == "root")
startService(Intent(this, RootSplitInstallerService::class.java)) startService(Intent(this, RootSplitInstallerService::class.java))
else else
startService(Intent(this, SplitInstaller::class.java)) startService(Intent(this, SplitInstaller::class.java))
} }
override fun onDestroy() {
super.onDestroy()
cancelNotif(69, this)
//unregisterReceiver(receiver)
}
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null
} }

View File

@ -1,27 +1,23 @@
package com.vanced.manager.core.installer package com.vanced.manager.core.installer
import android.app.Service import android.app.Service
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
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.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.AppUtils.getErrorMessage import com.vanced.manager.utils.AppUtils.sendFailure
//import com.vanced.manager.utils.AppUtils.sendRefreshHome
import com.vanced.manager.utils.NotificationHelper.createBasicNotif
class AppInstallerService: Service() { class AppInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
val notifId = 42
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> { PackageInstaller.STATUS_PENDING_USER_ACTION -> {
Log.d(TAG, "Requesting user confirmation for installation") Log.d(TAG, "Requesting user confirmation for installation")
createBasicNotif(getString(R.string.installing_app, "MicroG"), notifId, this) localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_INSTALLING))
val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT) val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try { try {
@ -32,32 +28,14 @@ class AppInstallerService: Service() {
} }
PackageInstaller.STATUS_SUCCESS -> { PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed") Log.d(TAG, "Installation succeed")
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(HomeFragment.REFRESH_HOME)) localBroadcastManager.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
createBasicNotif(getString(
R.string.successfully_installed,
"Microg"
), notifId, this)
}
else -> {
sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
createBasicNotif(
getErrorMessage(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this),
notifId,
this
)
} }
else -> sendFailure(this, intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
} }
stopSelf() stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
private fun sendFailure(status: Int) {
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_FAILED
mIntent.putExtra("errorMsg", getErrorMessage(status, this))
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null
} }

View File

@ -11,10 +11,8 @@ import androidx.annotation.WorkerThread
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
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.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.FileInfo import com.vanced.manager.utils.FileInfo
import com.vanced.manager.utils.NotificationHelper.createBasicNotif
import java.io.File import java.io.File
import java.nio.charset.Charset import java.nio.charset.Charset
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -24,10 +22,10 @@ import kotlin.collections.ArrayList
class RootSplitInstallerService: Service() { class RootSplitInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Shell.getShell { Shell.getShell {
val isRoot = it.isRoot
Log.d("AppLog", "isRoot ?$isRoot ")
AsyncTask.execute { AsyncTask.execute {
val apkFilesPath = getExternalFilesDir("apks")?.path val apkFilesPath = getExternalFilesDir("apks")?.path
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) } val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
@ -42,9 +40,7 @@ class RootSplitInstallerService: Service() {
@WorkerThread @WorkerThread
private fun installSplitApkFiles(apkFiles: ArrayList<FileInfo>) { private fun installSplitApkFiles(apkFiles: ArrayList<FileInfo>) {
val broadcast = LocalBroadcastManager.getInstance(this)
var sessionId: Int? var sessionId: Int?
val notifId = 666
Log.d("AppLog", "installing split apk files:$apkFiles") Log.d("AppLog", "installing split apk files:$apkFiles")
run { run {
val sessionIdResult = Shell.su("pm install-create -r -t").exec().out val sessionIdResult = Shell.su("pm install-create -r -t").exec().out
@ -55,7 +51,6 @@ class RootSplitInstallerService: Service() {
} }
for (apkFile in apkFiles) { for (apkFile in apkFiles) {
Log.d("AppLog", "installing APK : ${apkFile.name} ${apkFile.fileSize} ") Log.d("AppLog", "installing APK : ${apkFile.name} ${apkFile.fileSize} ")
createBasicNotif(getString(R.string.installing_app, "Vanced"), notifId, this)
val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name) val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name)
val process: Process = Runtime.getRuntime().exec(command) val process: Process = Runtime.getRuntime().exec(command)
val inputPipe = apkFile.getInputStream() val inputPipe = apkFile.getInputStream()
@ -78,14 +73,12 @@ class RootSplitInstallerService: Service() {
Log.d("AppLog", "committing...") Log.d("AppLog", "committing...")
val installResult = Shell.su("pm install-commit $sessionId").exec() val installResult = Shell.su("pm install-commit $sessionId").exec()
if (installResult.isSuccess) { if (installResult.isSuccess) {
broadcast.sendBroadcast(Intent(HomeFragment.REFRESH_HOME)) localBroadcastManager.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
broadcast.sendBroadcast(Intent(MainActivity.INSTALL_COMPLETED).putExtra("pkg", "vanced")) localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_INSTALLED).putExtra("pkg", "vanced"))
createBasicNotif(getString(R.string.successfully_installed, "Vanced"), notifId, this)
} else { } else {
val mIntent = Intent(MainActivity.INSTALL_FAILED) val mIntent = Intent(HomeFragment.INSTALL_FAILED)
mIntent.putExtra("errorMsg", getString(R.string.installation_signature)) mIntent.putExtra("errorMsg", getString(R.string.installation_signature))
broadcast.sendBroadcast(mIntent) localBroadcastManager.sendBroadcast(mIntent)
createBasicNotif(getString(R.string.installation_signature), notifId, this)
} }
} }

View File

@ -1,26 +1,22 @@
package com.vanced.manager.core.installer package com.vanced.manager.core.installer
import android.app.Service import android.app.Service
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
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.fragments.HomeFragment import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.AppUtils.getErrorMessage import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefreshHome
import com.vanced.manager.utils.NotificationHelper.createBasicNotif
class SplitInstallerService: Service() { class SplitInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
val notifId = 666
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> { PackageInstaller.STATUS_PENDING_USER_ACTION -> {
createBasicNotif(getString(R.string.installing_app, "Vanced"), notifId, this) localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_INSTALLING))
Log.d(TAG, "Requesting user confirmation for installation") Log.d(TAG, "Requesting user confirmation for installation")
val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT) val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
@ -31,32 +27,15 @@ class SplitInstallerService: Service() {
} }
PackageInstaller.STATUS_SUCCESS -> { PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed") Log.d(TAG, "Installation succeed")
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(HomeFragment.REFRESH_HOME)) localBroadcastManager.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
createBasicNotif(
getString(R.string.successfully_installed, "Vanced"),
notifId,
this
)
}
else -> {
sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
createBasicNotif(
getErrorMessage(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this),
notifId,
this
)
} }
else -> sendFailure(this, intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
} }
stopSelf() stopSelf()
return START_NOT_STICKY return START_NOT_STICKY
} }
private fun sendFailure(status: Int) {
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.putExtra("errorMsg", getErrorMessage(status, this))
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null
} }

View File

@ -21,6 +21,7 @@ import com.vanced.manager.R
import com.vanced.manager.databinding.ActivityMainBinding import com.vanced.manager.databinding.ActivityMainBinding
import com.vanced.manager.ui.dialogs.DialogContainer import com.vanced.manager.ui.dialogs.DialogContainer
import com.vanced.manager.ui.fragments.UpdateCheckFragment import com.vanced.manager.ui.fragments.UpdateCheckFragment
import com.vanced.manager.utils.AppUtils.isInstallationRunning
import com.vanced.manager.utils.InternetTools import com.vanced.manager.utils.InternetTools
import com.vanced.manager.utils.PackageHelper import com.vanced.manager.utils.PackageHelper
import com.vanced.manager.utils.ThemeHelper.setFinalTheme import com.vanced.manager.utils.ThemeHelper.setFinalTheme
@ -36,13 +37,6 @@ class MainActivity : AppCompatActivity() {
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
when (intent.action) { when (intent.action) {
INSTALL_COMPLETED -> {
if (intent.getStringExtra("package") == "split")
DialogContainer.launchVanced(this@MainActivity)
else
DialogContainer.regularPackageInstalled(getString(R.string.successfully_installed, "MicroG"), this@MainActivity)
}
INSTALL_FAILED -> DialogContainer.installAlertBuilder(intent.getStringExtra("errorMsg") as String, this@MainActivity)
} }
} }
} }
@ -94,25 +88,26 @@ class MainActivity : AppCompatActivity() {
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navHost = findNavController(R.id.bottom_nav_host) if (!isInstallationRunning(this)) {
when (item.itemId) { when (item.itemId) {
android.R.id.home -> { android.R.id.home -> {
onBackPressed() onBackPressed()
return true return true
}
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
return true
}
R.id.toolbar_settings -> {
navHost.navigate(R.id.action_settingsFragment)
return true
}
R.id.dev_settings -> {
navHost.navigate(R.id.toDevSettingsFragment)
return true
}
else -> super.onOptionsItemSelected(item)
} }
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
return true
}
R.id.toolbar_settings -> {
navHost.navigate(R.id.action_settingsFragment)
return true
}
R.id.dev_settings -> {
navHost.navigate(R.id.toDevSettingsFragment)
return true
}
else -> super.onOptionsItemSelected(item)
} }
return false return false
} }
@ -127,8 +122,6 @@ class MainActivity : AppCompatActivity() {
private fun registerReceivers() { private fun registerReceivers() {
val intentFilter = IntentFilter() val intentFilter = IntentFilter()
intentFilter.addAction(INSTALL_COMPLETED)
intentFilter.addAction(INSTALL_FAILED)
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter)
} }
@ -178,7 +171,5 @@ class MainActivity : AppCompatActivity() {
} }
companion object { companion object {
const val INSTALL_COMPLETED = "install_completed"
const val INSTALL_FAILED = "install_failed"
} }
} }

View File

@ -8,7 +8,6 @@ import androidx.core.content.ContextCompat.startActivity
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.ui.MainActivity
import com.vanced.manager.utils.InternetTools.openUrl import com.vanced.manager.utils.InternetTools.openUrl
import com.vanced.manager.utils.MiuiHelper import com.vanced.manager.utils.MiuiHelper
@ -97,16 +96,6 @@ object DialogContainer {
} }
} }
fun regularPackageInstalled(msg: String, activity: MainActivity) {
MaterialAlertDialogBuilder(activity)
.setTitle(activity.getString(R.string.success))
.setMessage(msg)
.setPositiveButton(activity.getString(R.string.close)) { _, _ -> activity.restartActivity() }
.setCancelable(false)
.create()
.show()
}
fun basicDialog(title: String, msg: String, activity: Activity) { fun basicDialog(title: String, msg: String, activity: Activity) {
MaterialAlertDialogBuilder(activity) MaterialAlertDialogBuilder(activity)
.setTitle(title) .setTitle(title)
@ -116,7 +105,7 @@ object DialogContainer {
.show() .show()
} }
fun launchVanced(activity: MainActivity) { fun launchVanced(activity: Activity) {
val intent = Intent() val intent = Intent()
intent.component = intent.component =
if (PreferenceManager.getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot") == "root") if (PreferenceManager.getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot") == "root")
@ -133,10 +122,6 @@ object DialogContainer {
} }
} }
.setNegativeButton(activity.getString(R.string.close)) { dialog, _ -> dialog.dismiss() } .setNegativeButton(activity.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
.setOnDismissListener {
activity.restartActivity()
}
.setCancelable(false)
.create() .create()
.show() .show()
} }

View File

@ -21,7 +21,10 @@ import com.vanced.manager.core.downloader.MicrogDownloadService
import com.vanced.manager.core.downloader.VancedDownloadService import com.vanced.manager.core.downloader.VancedDownloadService
import com.vanced.manager.databinding.FragmentHomeBinding import com.vanced.manager.databinding.FragmentHomeBinding
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder
import com.vanced.manager.ui.dialogs.DialogContainer.launchVanced
import com.vanced.manager.ui.viewmodels.HomeViewModel import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.utils.AppUtils.isInstallationRunning
import com.vanced.manager.utils.PackageHelper import com.vanced.manager.utils.PackageHelper
class HomeFragment : Fragment(), View.OnClickListener { class HomeFragment : Fragment(), View.OnClickListener {
@ -45,7 +48,7 @@ class HomeFragment : Fragment(), View.OnClickListener {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.viewModel = viewModel binding.viewModel = viewModel
val variantPref = getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot") val variantPref = getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot")
with(binding) { with(binding) {
rootSwitch.setOnClickListener(this@HomeFragment) rootSwitch.setOnClickListener(this@HomeFragment)
@ -92,8 +95,8 @@ class HomeFragment : Fragment(), View.OnClickListener {
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
val prefs = activity?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE) val prefs = requireActivity().getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val variant = getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot") val variant = getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot")
val vancedPkgName = val vancedPkgName =
if (variant == "root") { if (variant == "root") {
"com.google.android.youtube" "com.google.android.youtube"
@ -103,46 +106,44 @@ class HomeFragment : Fragment(), View.OnClickListener {
when (v?.id) { when (v?.id) {
R.id.vanced_installbtn -> { R.id.vanced_installbtn -> {
if (viewModel.microgInstalled.get()!!) { if (!isInstallationRunning(requireActivity())) {
if (prefs?.getBoolean("valuesModified", false)!!) { if (viewModel.microgInstalled.get()!!) {
activity?.startService( if (prefs?.getBoolean("valuesModified", false)!!) {
Intent( requireActivity().startService(
activity, Intent(
VancedDownloadService::class.java requireActivity(),
VancedDownloadService::class.java
)
) )
) } else {
} else { view?.findNavController()?.navigate(R.id.toInstallThemeFragment)
view?.findNavController()?.navigate(R.id.toInstallThemeFragment) }
} } else
} else Snackbar.make(binding.homeRefresh, R.string.no_microg, Snackbar.LENGTH_LONG)
Snackbar.make(binding.homeRefresh, R.string.no_microg, Snackbar.LENGTH_LONG) .setAction(R.string.install) {
.setAction(R.string.install) { requireActivity().startService(
activity?.startService(Intent(activity, MicrogDownloadService::class.java)) Intent(
}.show() requireActivity(),
MicrogDownloadService::class.java
)
)
}.show()
}
} }
R.id.microg_installbtn -> { R.id.microg_installbtn -> {
activity?.startService(Intent(activity, MicrogDownloadService::class.java)) if (!isInstallationRunning(requireActivity()))
} requireActivity().startService(Intent(requireActivity(), MicrogDownloadService::class.java))
R.id.microg_uninstallbtn -> activity?.let {
PackageHelper.uninstallApk(
"com.mgoogle.android.gms",
it
)
}
R.id.vanced_uninstallbtn -> activity?.let {
PackageHelper.uninstallApk(
vancedPkgName,
it
)
} }
R.id.microg_uninstallbtn -> PackageHelper.uninstallApk("com.mgoogle.android.gms", requireActivity())
R.id.vanced_uninstallbtn -> PackageHelper.uninstallApk(vancedPkgName, requireActivity())
R.id.nonroot_switch -> writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right) R.id.nonroot_switch -> writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right)
R.id.root_switch -> R.id.root_switch ->
if (Shell.rootAccess()) { if (Shell.rootAccess()) {
writeToVariantPref("root", R.anim.slide_in_right, R.anim.slide_out_left) writeToVariantPref("root", R.anim.slide_in_right, R.anim.slide_out_left)
} else { } else {
writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right) writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right)
Toast.makeText(activity, activity?.getString(R.string.root_not_granted), Toast.LENGTH_SHORT).show() Toast.makeText(requireActivity(), activity?.getString(R.string.root_not_granted), Toast.LENGTH_SHORT).show()
} }
} }
} }
@ -189,8 +190,42 @@ class HomeFragment : Fragment(), View.OnClickListener {
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
when (intent.action) { when (intent.action) {
MICROG_DOWNLOADED -> binding.includeMicrogLayout.microgInstalling.visibility = View.VISIBLE VANCED_DOWNLOADING -> {
VANCED_DOWNLOADED -> binding.includeVancedLayout.vancedInstalling.visibility = View.VISIBLE with(binding.includeVancedLayout) {
vancedDownloading.visibility = View.VISIBLE
vancedDownloading.progress = intent.getIntExtra("progress", 0)
vancedDownloadingTxt.visibility = View.VISIBLE
vancedDownloadingTxt.text = requireActivity().getString(R.string.downloading_file, intent.getStringExtra("file"))
}
}
MICROG_DOWNLOADING -> {
with(binding.includeMicrogLayout) {
microgDownloading.visibility = View.VISIBLE
microgDownloading.progress = intent.getIntExtra("progress", 0)
microgDownloadingTxt.visibility = View.VISIBLE
microgDownloadingTxt.text = requireActivity().getString(R.string.downloading_file, "microg.apk")
}
}
MICROG_INSTALLING -> {
with (binding.includeMicrogLayout) {
microgDownloading.visibility = View.GONE
microgDownloadingTxt.visibility = View.GONE
microgInstalling.visibility = View.VISIBLE
}
}
VANCED_INSTALLING -> {
with (binding.includeVancedLayout) {
vancedDownloading.visibility = View.GONE
vancedDownloadingTxt.visibility = View.GONE
vancedInstalling.visibility = View.VISIBLE
}
}
VANCED_INSTALLED -> {
binding.includeVancedLayout.vancedInstalling.visibility = View.GONE
launchVanced(requireActivity())
}
MICROG_INSTALLED -> binding.includeMicrogLayout.microgInstalling.visibility = View.GONE
INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg") as String, requireActivity())
REFRESH_HOME -> { REFRESH_HOME -> {
Log.d("VMRefresh", "Refreshing home page") Log.d("VMRefresh", "Refreshing home page")
viewModel.fetchData() viewModel.fetchData()
@ -201,8 +236,12 @@ class HomeFragment : Fragment(), View.OnClickListener {
private fun registerReceivers() { private fun registerReceivers() {
val intentFilter = IntentFilter() val intentFilter = IntentFilter()
//intentFilter.addAction(VANCED_DOWNLOADED) intentFilter.addAction(VANCED_DOWNLOADING)
//intentFilter.addAction(MICROG_DOWNLOADED) intentFilter.addAction(MICROG_DOWNLOADING)
intentFilter.addAction(VANCED_INSTALLING)
intentFilter.addAction(MICROG_INSTALLING)
intentFilter.addAction(VANCED_INSTALLED)
intentFilter.addAction(MICROG_INSTALLED)
intentFilter.addAction(REFRESH_HOME) intentFilter.addAction(REFRESH_HOME)
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter) localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter)
} }
@ -212,20 +251,14 @@ class HomeFragment : Fragment(), View.OnClickListener {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
} }
/*
private fun disableVancedButton() {
binding.includeVancedLayout.vancedInstallbtn.apply {
icon = null
isEnabled = false
backgroundTintList = ColorStateList.valueOf(Color.DKGRAY)
setTextColor(ColorStateList.valueOf(Color.GRAY))
}
}
*/
companion object { companion object {
const val VANCED_DOWNLOADED = "vanced_downloaded" const val VANCED_DOWNLOADING = "vanced_downloading"
const val MICROG_DOWNLOADED = "microg_downloaded" const val MICROG_DOWNLOADING = "microg_downloading"
const val VANCED_INSTALLING = "vanced_installing"
const val MICROG_INSTALLING = "microg_installing"
const val VANCED_INSTALLED = "vanced_installed"
const val MICROG_INSTALLED = "microg_installed"
const val INSTALL_FAILED = "install_failed"
const val REFRESH_HOME = "refresh_home" const val REFRESH_HOME = "refresh_home"
} }
} }

View File

@ -1,5 +1,6 @@
package com.vanced.manager.utils package com.vanced.manager.utils
import android.app.ActivityManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
@ -9,10 +10,26 @@ import com.vanced.manager.ui.fragments.HomeFragment
object AppUtils { object AppUtils {
fun sendRefreshHome(context: Context) { @Suppress("DEPRECATION")
val intent = Intent() fun isInstallationRunning(context: Context): Boolean {
intent.action = HomeFragment.REFRESH_HOME val services = arrayOf("VancedDownloadService", "MicrogDownloadService", "AppInstaller", "SplitInstaller", "RootSplitInstallerService")
LocalBroadcastManager.getInstance(context).sendBroadcast(intent) val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningServices = activityManager.getRunningServices(Int.MAX_VALUE)
services.forEach { name ->
runningServices.forEach { info ->
if (info.service.className == name) {
return true
}
}
}
return false
}
fun sendFailure(context: Context, status: Int) {
val mIntent = Intent(HomeFragment.INSTALL_FAILED)
mIntent.putExtra("errorMsg", getErrorMessage(status, context))
LocalBroadcastManager.getInstance(context).sendBroadcast(mIntent)
} }
fun getErrorMessage(status: Int, context: Context): String { fun getErrorMessage(status: Int, context: Context): String {

View File

@ -1,72 +0,0 @@
package com.vanced.manager.utils
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import com.vanced.manager.R
object NotificationHelper {
fun createNotifChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notifChannel = NotificationChannel(
"69420",
context.getString(R.string.notif_channel_name),
NotificationManager.IMPORTANCE_HIGH
)
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notifChannel)
}
}
fun displayDownloadNotif(channel: Int, progress:Int, filename: String, context: Context) {
val notifBuilder =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
Notification.Builder(context, channel.toString()).setChannelId("69420")
else
Notification.Builder(context).setPriority(Notification.PRIORITY_HIGH)
notifBuilder.apply {
setContentTitle(context.getString(R.string.app_name))
setContentText(context.getString(R.string.downloading_file, filename))
setSmallIcon(R.drawable.ic_stat_name)
setOnlyAlertOnce(true)
setOngoing(true)
}
val notif = notifBuilder.build()
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.apply {
notifBuilder.setProgress(100, progress, false)
notify(channel, notif)
}
}
fun createBasicNotif(text: String, channel: Int, context: Context) {
val notifBuilder =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
Notification.Builder(context, channel.toString()).setChannelId("69420")
else
Notification.Builder(context).setPriority(Notification.PRIORITY_DEFAULT)
notifBuilder.apply {
setContentTitle(context.getString(R.string.app_name))
setContentText(text)
style = Notification.BigTextStyle().bigText(text)
setSmallIcon(R.drawable.ic_stat_name)
}
val notif = notifBuilder.build()
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(channel, notif)
}
fun cancelNotif(id: Int, context: Context) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancel(id)
}
}

View File

@ -120,6 +120,21 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/microg_downloading_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
<ProgressBar
android:id="@+id/microg_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
<ProgressBar <ProgressBar
android:id="@+id/microg_installing" android:id="@+id/microg_installing"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -110,6 +110,21 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/vanced_downloading_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
<ProgressBar
android:id="@+id/vanced_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
<ProgressBar <ProgressBar
android:id="@+id/vanced_installing" android:id="@+id/vanced_installing"
android:layout_width="match_parent" android:layout_width="match_parent"