46 lines
1.5 KiB
Kotlin
46 lines
1.5 KiB
Kotlin
package dev.beefers.vendetta.manager.installer.util
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.app.PendingIntent
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.content.pm.PackageInstaller.SessionParams
|
|
import android.content.pm.PackageManager
|
|
import android.os.Build
|
|
import dev.beefers.vendetta.manager.installer.service.InstallService
|
|
import java.io.File
|
|
|
|
fun Context.installApks(silent: Boolean = false, vararg apks: File) {
|
|
val packageInstaller = packageManager.packageInstaller
|
|
val params = SessionParams(SessionParams.MODE_FULL_INSTALL).apply {
|
|
if (Build.VERSION.SDK_INT >= 31) {
|
|
setInstallScenario(PackageManager.INSTALL_SCENARIO_FAST)
|
|
|
|
if (silent) {
|
|
setRequireUserAction(SessionParams.USER_ACTION_NOT_REQUIRED)
|
|
}
|
|
}
|
|
}
|
|
|
|
val sessionId = packageInstaller.createSession(params)
|
|
val session = packageInstaller.openSession(sessionId)
|
|
|
|
apks.forEach { apk ->
|
|
session.openWrite(apk.name, 0, apk.length()).use {
|
|
it.write(apk.readBytes())
|
|
session.fsync(it)
|
|
}
|
|
}
|
|
|
|
val callbackIntent = Intent(this, InstallService::class.java)
|
|
|
|
@SuppressLint("UnspecifiedImmutableFlag")
|
|
val contentIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
PendingIntent.getService(this, 0, callbackIntent, PendingIntent.FLAG_MUTABLE)
|
|
} else {
|
|
PendingIntent.getService(this, 0, callbackIntent, 0)
|
|
}
|
|
|
|
session.commit(contentIntent.intentSender)
|
|
session.close()
|
|
} |