Magisk/app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt

88 lines
2.9 KiB
Kotlin
Raw Normal View History

2020-01-13 15:01:46 +01:00
package com.topjohnwu.magisk.core.download
import android.annotation.SuppressLint
import android.app.Notification
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
2020-08-21 16:36:59 +02:00
import androidx.core.net.toFile
import com.topjohnwu.magisk.core.download.Action.Flash
import com.topjohnwu.magisk.core.download.Subject.Manager
import com.topjohnwu.magisk.core.download.Subject.Module
2020-01-13 15:01:46 +01:00
import com.topjohnwu.magisk.core.intent
import com.topjohnwu.magisk.ui.flash.FlashFragment
import com.topjohnwu.magisk.utils.APKInstall
import kotlin.random.Random.Default.nextInt
@SuppressLint("Registered")
open class DownloadService : BaseDownloader() {
private val context get() = this
2020-08-21 15:27:13 +02:00
2020-08-21 15:45:40 +02:00
override suspend fun onFinish(subject: Subject, id: Int) = when (subject) {
2020-08-21 15:27:13 +02:00
is Module -> subject.onFinish(id)
is Manager -> subject.onFinish(id)
}
2020-08-21 15:45:40 +02:00
private fun Module.onFinish(id: Int) = when (action) {
Flash -> FlashFragment.install(file, id)
else -> Unit
}
private fun Manager.onFinish(id: Int) {
remove(id)
APKInstall.install(context, file.toFile())
}
2020-08-21 15:27:13 +02:00
// --- Customize finish notification
2020-08-21 15:45:40 +02:00
override fun Notification.Builder.setIntent(subject: Subject)
2019-08-22 21:05:41 +02:00
= when (subject) {
2020-08-21 15:27:13 +02:00
is Module -> setIntent(subject)
is Manager -> setIntent(subject)
}
2020-08-21 15:27:13 +02:00
private fun Notification.Builder.setIntent(subject: Module)
2020-08-21 15:45:40 +02:00
= when (subject.action) {
Flash -> setContentIntent(FlashFragment.installIntent(context, subject.file))
2020-08-21 15:27:13 +02:00
else -> setContentIntent(Intent())
}
2020-08-21 15:27:13 +02:00
private fun Notification.Builder.setIntent(subject: Manager)
2020-10-17 13:28:20 +02:00
= setContentIntent(APKInstall.installIntent(context, subject.file.toFile()))
private fun Notification.Builder.setContentIntent(intent: Intent) =
2020-01-12 14:52:32 +01:00
setContentIntent(
PendingIntent.getActivity(context, nextInt(), intent, PendingIntent.FLAG_ONE_SHOT)
)
// ---
companion object {
private fun intent(context: Context, subject: Subject) =
context.intent<DownloadService>().putExtra(ACTION_KEY, subject)
fun pendingIntent(context: Context, subject: Subject): PendingIntent {
return if (Build.VERSION.SDK_INT >= 26) {
PendingIntent.getForegroundService(context, nextInt(),
intent(context, subject), PendingIntent.FLAG_UPDATE_CURRENT)
} else {
PendingIntent.getService(context, nextInt(),
intent(context, subject), PendingIntent.FLAG_UPDATE_CURRENT)
}
}
2020-08-28 13:50:46 +02:00
fun start(context: Context, subject: Subject) {
val app = context.applicationContext
if (Build.VERSION.SDK_INT >= 26) {
app.startForegroundService(intent(app, subject))
} else {
app.startService(intent(app, subject))
}
}
}
}