diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b86439dc..d6dcfc36 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,10 +56,22 @@ + + + + + + + + + + diff --git a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloadService.kt b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloadService.kt index dcca7d5e..e211cd23 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloadService.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/MicrogDownloadService.kt @@ -12,11 +12,13 @@ import com.downloader.OnDownloadListener import com.downloader.OnStartOrResumeListener import com.downloader.PRDownloader import com.vanced.manager.R +import com.vanced.manager.core.installer.AppInstaller import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.utils.InternetTools.getFileNameFromUrl import com.vanced.manager.utils.NotificationHelper import com.vanced.manager.utils.NotificationHelper.cancelNotif import com.vanced.manager.utils.NotificationHelper.createBasicNotif +import com.vanced.manager.utils.PackageHelper.installApp import java.lang.Exception import java.lang.IllegalStateException import java.lang.RuntimeException @@ -61,6 +63,10 @@ class MicrogDownloadService: Service() { override fun onDownloadComplete() { prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply() cancelNotif(channel, this@MicrogDownloadService) + val intent = Intent(this@MicrogDownloadService, AppInstaller::class.java) + intent.putExtra("path", "${filesDir.path}/microg.apk") + intent.putExtra("pkg", "com.mgoogle.android.gms") + startService(intent) } override fun onError(error: Error) { prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply() diff --git a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloadService.kt b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloadService.kt index 7e8a4c65..daf1a345 100644 --- a/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloadService.kt +++ b/app/src/main/java/com/vanced/manager/core/downloader/VancedDownloadService.kt @@ -108,7 +108,7 @@ class VancedDownloadService: Service() { if (variant == "root") startService(Intent(this, RootSplitInstallerService::class.java)) else - SplitInstaller.installSplitApk(this) + startService(Intent(this, SplitInstaller::class.java)) } override fun onBind(intent: Intent?): IBinder? { diff --git a/app/src/main/java/com/vanced/manager/core/installer/AppInstaller.kt b/app/src/main/java/com/vanced/manager/core/installer/AppInstaller.kt new file mode 100644 index 00000000..7c53e0dd --- /dev/null +++ b/app/src/main/java/com/vanced/manager/core/installer/AppInstaller.kt @@ -0,0 +1,38 @@ +package com.vanced.manager.core.installer + +import android.app.PendingIntent +import android.app.Service +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.IBinder +import java.io.FileInputStream +import java.io.InputStream + +class AppInstaller: Service() { + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + val callbackIntent = Intent(applicationContext, AppInstallerService::class.java) + val pendingIntent = PendingIntent.getService(applicationContext, 0, callbackIntent, 0) + val packageInstaller = packageManager.packageInstaller + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + params.setAppPackageName(intent?.getStringExtra("pkg")) + val sessionId = packageInstaller.createSession(params) + val session = packageInstaller.openSession(sessionId) + val inputStream: InputStream = FileInputStream(intent?.getStringExtra("path") as String) + val outputStream = session.openWrite("install", 0, -1) + val buffer = ByteArray(65536) + var c: Int + while (inputStream.read(buffer).also { c = it } != -1) { + outputStream.write(buffer, 0, c) + } + session.fsync(outputStream) + inputStream.close() + outputStream.close() + session.commit(pendingIntent.intentSender) + return START_STICKY + } + + override fun onBind(intent: Intent?): IBinder? { + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/core/installer/SplitInstaller.kt b/app/src/main/java/com/vanced/manager/core/installer/SplitInstaller.kt index 9bbcb7b3..6d76af4e 100644 --- a/app/src/main/java/com/vanced/manager/core/installer/SplitInstaller.kt +++ b/app/src/main/java/com/vanced/manager/core/installer/SplitInstaller.kt @@ -1,15 +1,26 @@ package com.vanced.manager.core.installer import android.app.PendingIntent +import android.app.Service import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller +import android.os.IBinder import android.util.Log import java.io.* -object SplitInstaller { +class SplitInstaller: Service() { - fun installSplitApk(context: Context): Int { + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + installSplitApk(this) + return START_STICKY + } + + override fun onBind(intent: Intent?): IBinder? { + return null + } + + private fun installSplitApk(context: Context): Int { val apkFolderPath = context.cacheDir.path + "/" val nameSizeMap = HashMap() var totalSize: Long = 0 diff --git a/app/src/main/java/com/vanced/manager/utils/NotificationHelper.kt b/app/src/main/java/com/vanced/manager/utils/NotificationHelper.kt index 4d76489d..e5541a91 100644 --- a/app/src/main/java/com/vanced/manager/utils/NotificationHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/NotificationHelper.kt @@ -17,7 +17,7 @@ object NotificationHelper { val notifChannel = NotificationChannel( "69420", context.getString(R.string.notif_channel_name), - NotificationManager.IMPORTANCE_DEFAULT + NotificationManager.IMPORTANCE_LOW ) val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(notifChannel) @@ -29,7 +29,7 @@ object NotificationHelper { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) Notification.Builder(context, channel.toString()).setChannelId("69420") else - Notification.Builder(context).setPriority(Notification.PRIORITY_DEFAULT) + Notification.Builder(context).setPriority(Notification.PRIORITY_LOW) val cancelDownload = Intent(context, DownloadBroadcastReceiver::class.java).apply { action = "cancel" diff --git a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt index 503ffb71..286034f8 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -2,6 +2,7 @@ package com.vanced.manager.utils import android.app.Activity import android.app.PendingIntent +import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller.SessionParams import android.content.pm.PackageManager @@ -24,13 +25,13 @@ object PackageHelper { @Throws(IOException::class) fun installApp( - activity: Activity, + context: Context, path: String, pkg: String? ) { - val callbackIntent = Intent(activity.applicationContext, AppInstallerService::class.java) - val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0) - val packageInstaller = activity.packageManager.packageInstaller + val callbackIntent = Intent(context.applicationContext, AppInstallerService::class.java) + val pendingIntent = PendingIntent.getService(context.applicationContext, 0, callbackIntent, 0) + val packageInstaller = context.packageManager.packageInstaller val params = SessionParams(SessionParams.MODE_FULL_INSTALL) params.setAppPackageName(pkg) val sessionId = packageInstaller.createSession(params)