mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-25 10:17:38 +00:00
Directly download to target location
This commit is contained in:
parent
a8932706d8
commit
55aaa421e8
@ -6,13 +6,10 @@ import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.webkit.MimeTypeMap
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresPermission
|
||||
import androidx.core.app.NotificationCompat
|
||||
import com.topjohnwu.magisk.ClassMap
|
||||
import com.topjohnwu.magisk.Config
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.model.entity.internal.Configuration.*
|
||||
import com.topjohnwu.magisk.model.entity.internal.Configuration.Flash.Secondary
|
||||
@ -20,7 +17,6 @@ import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk
|
||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Module
|
||||
import com.topjohnwu.magisk.ui.flash.FlashActivity
|
||||
import com.topjohnwu.magisk.utils.Utils
|
||||
import com.topjohnwu.magisk.utils.chooser
|
||||
import com.topjohnwu.magisk.utils.provide
|
||||
import java.io.File
|
||||
@ -31,7 +27,6 @@ import kotlin.random.Random.Default.nextInt
|
||||
open class DownloadService : RemoteFileService() {
|
||||
|
||||
private val context get() = this
|
||||
private val String.downloadsFile get() = File(Config.downloadDirectory, this)
|
||||
private val File.type
|
||||
get() = MimeTypeMap.getSingleton()
|
||||
.getMimeTypeFromExtension(extension)
|
||||
@ -46,17 +41,16 @@ open class DownloadService : RemoteFileService() {
|
||||
file: File,
|
||||
subject: Magisk
|
||||
) = when (val conf = subject.configuration) {
|
||||
Download -> moveToDownloads(file)
|
||||
Uninstall -> FlashActivity.uninstall(this, file)
|
||||
is Patch -> FlashActivity.patch(this, file, conf.fileUri)
|
||||
is Flash -> FlashActivity.flash(this, file, conf is Secondary)
|
||||
else -> Unit
|
||||
}
|
||||
|
||||
private fun onFinishedInternal(
|
||||
file: File,
|
||||
subject: Module
|
||||
) = when (subject.configuration) {
|
||||
Download -> moveToDownloads(file)
|
||||
is Flash -> FlashActivity.install(this, file)
|
||||
else -> Unit
|
||||
}
|
||||
@ -75,8 +69,8 @@ open class DownloadService : RemoteFileService() {
|
||||
file: File,
|
||||
subject: Magisk
|
||||
) = when (val conf = subject.configuration) {
|
||||
Download -> addAction(0, R.string.download_open_parent, fileParentIntent(subject.fileName))
|
||||
.addAction(0, R.string.download_open_self, fileIntent(subject.fileName))
|
||||
Download -> addAction(0, R.string.download_open_parent, fileIntent(subject.file.parentFile!!))
|
||||
.addAction(0, R.string.download_open_self, fileIntent(subject.file))
|
||||
Uninstall -> setContentIntent(FlashActivity.uninstallIntent(context, file))
|
||||
is Flash -> setContentIntent(FlashActivity.flashIntent(context, file, conf is Secondary))
|
||||
is Patch -> setContentIntent(FlashActivity.patchIntent(context, file, conf.fileUri))
|
||||
@ -87,8 +81,8 @@ open class DownloadService : RemoteFileService() {
|
||||
file: File,
|
||||
subject: Module
|
||||
) = when (subject.configuration) {
|
||||
Download -> addAction(0, R.string.download_open_parent, fileParentIntent(subject.fileName))
|
||||
.addAction(0, R.string.download_open_self, fileIntent(subject.fileName))
|
||||
Download -> addAction(0, R.string.download_open_parent, fileIntent(subject.file.parentFile!!))
|
||||
.addAction(0, R.string.download_open_self, fileIntent(subject.file))
|
||||
is Flash -> setContentIntent(FlashActivity.installIntent(context, file))
|
||||
else -> this
|
||||
}
|
||||
@ -105,31 +99,6 @@ open class DownloadService : RemoteFileService() {
|
||||
|
||||
// ---
|
||||
|
||||
private fun moveToDownloads(file: File) {
|
||||
val destination = file.name.downloadsFile
|
||||
|
||||
if (file != destination) {
|
||||
destination.deleteRecursively()
|
||||
file.copyTo(destination)
|
||||
}
|
||||
|
||||
Utils.toast(
|
||||
getString(
|
||||
R.string.internal_storage,
|
||||
"/" + destination.toRelativeString(Environment.getExternalStorageDirectory())
|
||||
),
|
||||
Toast.LENGTH_LONG
|
||||
)
|
||||
}
|
||||
|
||||
private fun fileIntent(fileName: String): Intent {
|
||||
return fileIntent(fileName.downloadsFile)
|
||||
}
|
||||
|
||||
private fun fileParentIntent(fileName: String): Intent {
|
||||
return fileIntent(fileName.downloadsFile.parentFile!!)
|
||||
}
|
||||
|
||||
private fun fileIntent(file: File): Intent {
|
||||
return Intent(Intent.ACTION_VIEW)
|
||||
.setDataAndType(file.provide(this), file.type)
|
||||
|
@ -11,7 +11,6 @@ import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Magisk
|
||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Module
|
||||
import com.topjohnwu.magisk.utils.ProgInputStream
|
||||
import com.topjohnwu.magisk.utils.cachedFile
|
||||
import com.topjohnwu.magisk.utils.firstMap
|
||||
import com.topjohnwu.magisk.utils.writeTo
|
||||
import com.topjohnwu.magisk.view.Notifications
|
||||
@ -48,7 +47,7 @@ abstract class RemoteFileService : NotificationService() {
|
||||
|
||||
private fun start(subject: DownloadSubject) = search(subject)
|
||||
.onErrorResumeNext(download(subject))
|
||||
.doOnSubscribe { update(subject.hashCode()) { it.setContentTitle(subject.fileName) } }
|
||||
.doOnSubscribe { update(subject.hashCode()) { it.setContentTitle(subject.title) } }
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doOnSuccess {
|
||||
runCatching { onFinished(it, subject) }.onFailure { Timber.e(it) }
|
||||
@ -60,7 +59,7 @@ abstract class RemoteFileService : NotificationService() {
|
||||
throw IllegalStateException("The download cache is disabled")
|
||||
}
|
||||
|
||||
supportedFolders.firstMap { it.find(subject.fileName) }.also {
|
||||
supportedFolders.firstMap { it.find(subject.file.name) }.also {
|
||||
if (subject is Magisk) {
|
||||
if (!ShellUtils.checkSum("MD5", it, subject.magisk.hash)) {
|
||||
throw IllegalStateException("The given file doesn't match the hash")
|
||||
@ -72,7 +71,7 @@ abstract class RemoteFileService : NotificationService() {
|
||||
private fun download(subject: DownloadSubject) = repo.downloadFile(subject.url)
|
||||
.map { it.toStream(subject.hashCode()) }
|
||||
.map {
|
||||
cachedFile(subject.fileName).apply {
|
||||
subject.file.apply {
|
||||
when (subject) {
|
||||
is Module -> it.toModule(this,
|
||||
repo.downloadFile(Const.Url.MODULE_INSTALLER).blockingGet().byteStream())
|
||||
|
@ -1,15 +1,22 @@
|
||||
package com.topjohnwu.magisk.model.entity.internal
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Parcelable
|
||||
import com.topjohnwu.magisk.Config
|
||||
import com.topjohnwu.magisk.Info
|
||||
import com.topjohnwu.magisk.model.entity.MagiskJson
|
||||
import com.topjohnwu.magisk.model.entity.Repo
|
||||
import com.topjohnwu.magisk.utils.cachedFile
|
||||
import com.topjohnwu.magisk.utils.get
|
||||
import kotlinx.android.parcel.IgnoredOnParcel
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import java.io.File
|
||||
|
||||
sealed class DownloadSubject : Parcelable {
|
||||
|
||||
abstract val fileName: String
|
||||
abstract val url: String
|
||||
abstract val file: File
|
||||
open val title: String get() = file.name
|
||||
|
||||
@Parcelize
|
||||
data class Module(
|
||||
@ -17,7 +24,11 @@ sealed class DownloadSubject : Parcelable {
|
||||
val configuration: Configuration
|
||||
) : DownloadSubject() {
|
||||
override val url: String get() = module.zipUrl
|
||||
override val fileName: String get() = "${module.name}-v${module.version}(${module.versionCode}).zip"
|
||||
|
||||
@IgnoredOnParcel
|
||||
override val file by lazy {
|
||||
File(Config.downloadDirectory, "${module.name}-v${module.version}(${module.versionCode}).zip")
|
||||
}
|
||||
}
|
||||
|
||||
sealed class Magisk : DownloadSubject() {
|
||||
@ -30,19 +41,28 @@ sealed class DownloadSubject : Parcelable {
|
||||
override val configuration: Configuration
|
||||
) : Magisk() {
|
||||
override val url: String get() = magisk.link
|
||||
override val fileName get() = "magisk.zip"
|
||||
override val title: String get() = "Magisk-v${magisk.version}(${magisk.versionCode})"
|
||||
|
||||
@IgnoredOnParcel
|
||||
override val file by lazy {
|
||||
get<Context>().cachedFile("magisk.zip")
|
||||
}
|
||||
}
|
||||
|
||||
@Parcelize
|
||||
protected object Download : Magisk() {
|
||||
protected class Download : Magisk() {
|
||||
override val configuration: Configuration get() = Configuration.Download
|
||||
override val url: String get() = magisk.link
|
||||
override val fileName get() = "Magisk-v${magisk.version}(${magisk.versionCode}).zip"
|
||||
|
||||
@IgnoredOnParcel
|
||||
override val file by lazy {
|
||||
File(Config.downloadDirectory, "Magisk-v${magisk.version}(${magisk.versionCode}).zip")
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
operator fun invoke(configuration: Configuration) = when (configuration) {
|
||||
Configuration.Download -> Download
|
||||
Configuration.Download -> Download()
|
||||
else -> Flash(configuration)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user