Magisk/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt

123 lines
4.1 KiB
Kotlin
Raw Normal View History

2019-04-24 20:28:41 +02:00
package com.topjohnwu.magisk.ui.flash
import android.net.Uri
import android.view.MenuItem
2020-07-12 12:17:50 +02:00
import androidx.databinding.Bindable
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
2020-07-07 07:30:21 +02:00
import androidx.lifecycle.viewModelScope
2020-07-12 12:17:50 +02:00
import com.topjohnwu.magisk.BR
import com.topjohnwu.magisk.R
2020-08-18 15:31:15 +02:00
import com.topjohnwu.magisk.arch.BaseViewModel
import com.topjohnwu.magisk.arch.diffListOf
import com.topjohnwu.magisk.arch.itemBindingOf
import com.topjohnwu.magisk.core.Const
2021-01-18 22:32:10 +01:00
import com.topjohnwu.magisk.core.Info
2020-07-07 07:30:21 +02:00
import com.topjohnwu.magisk.core.tasks.FlashZip
import com.topjohnwu.magisk.core.tasks.MagiskInstaller
2020-12-20 07:25:44 +01:00
import com.topjohnwu.magisk.core.utils.MediaStoreUtils
import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream
2020-08-18 15:31:15 +02:00
import com.topjohnwu.magisk.databinding.RvBindingAdapter
import com.topjohnwu.magisk.events.SnackbarEvent
2020-07-11 14:36:31 +02:00
import com.topjohnwu.magisk.ktx.*
2020-07-15 10:21:57 +02:00
import com.topjohnwu.magisk.utils.set
2020-08-18 15:31:15 +02:00
import com.topjohnwu.magisk.view.Notifications
import com.topjohnwu.superuser.CallbackList
import com.topjohnwu.superuser.Shell
2020-07-09 13:49:14 +02:00
import kotlinx.coroutines.Dispatchers
2020-07-07 07:30:21 +02:00
import kotlinx.coroutines.launch
2019-04-24 20:28:41 +02:00
class FlashViewModel(args: FlashFragmentArgs) : BaseViewModel() {
2020-07-12 12:17:50 +02:00
@get:Bindable
2020-07-15 10:21:57 +02:00
var showReboot = Shell.rootAccess()
set(value) = set(value, field, { field = it }, BR.showReboot)
private val _subtitle = MutableLiveData(R.string.flashing)
val subtitle get() = _subtitle as LiveData<Int>
2020-08-18 15:31:15 +02:00
val adapter = RvBindingAdapter<ConsoleItem>()
val items = diffListOf<ConsoleItem>()
val itemBinding = itemBindingOf<ConsoleItem>()
private val logItems = mutableListOf<String>().synchronized()
private val outItems = object : CallbackList<String>() {
override fun onAddElement(e: String?) {
e ?: return
items.add(ConsoleItem(e))
logItems.add(e)
}
}
init {
val (action, uri, id) = args
if (id != -1)
Notifications.mgr.cancel(id)
startFlashing(action, uri)
}
private fun startFlashing(action: String, uri: Uri?) {
2020-07-07 07:30:21 +02:00
viewModelScope.launch {
val result = when (action) {
Const.Value.FLASH_ZIP -> {
FlashZip(uri!!, outItems, logItems).exec()
2020-07-07 07:30:21 +02:00
}
Const.Value.UNINSTALL -> {
2020-07-12 12:17:50 +02:00
showReboot = false
MagiskInstaller.Uninstall(outItems, logItems).exec()
2020-07-07 07:30:21 +02:00
}
Const.Value.FLASH_MAGISK -> {
2021-01-18 22:32:10 +01:00
if (Info.isEmulator)
MagiskInstaller.Emulator(outItems, logItems).exec()
2021-01-18 22:32:10 +01:00
else
MagiskInstaller.Direct(outItems, logItems).exec()
2020-07-07 07:30:21 +02:00
}
Const.Value.FLASH_INACTIVE_SLOT -> {
MagiskInstaller.SecondSlot(outItems, logItems).exec()
2020-07-07 07:30:21 +02:00
}
Const.Value.PATCH_FILE -> {
uri ?: return@launch
2020-07-12 12:17:50 +02:00
showReboot = false
MagiskInstaller.Patch(uri, outItems, logItems).exec()
2020-07-07 07:30:21 +02:00
}
else -> {
back()
return@launch
}
2020-07-07 06:05:43 +02:00
}
2020-07-07 07:30:21 +02:00
onResult(result)
}
}
2020-07-07 07:30:21 +02:00
private fun onResult(success: Boolean) {
state = if (success) State.LOADED else State.LOADING_FAILED
when {
success -> _subtitle.postValue(R.string.done)
else -> _subtitle.postValue(R.string.failure)
}
}
fun onMenuItemClicked(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_save -> savePressed()
}
return true
}
2020-07-09 13:49:14 +02:00
private fun savePressed() = withExternalRW {
2020-12-20 07:25:44 +01:00
viewModelScope.launch(Dispatchers.IO) {
val name = "magisk_install_log_%s.log".format(now.toTime(timeFormatStandard))
val file = MediaStoreUtils.getFile(name, true)
2020-12-20 07:25:44 +01:00
file.uri.outputStream().bufferedWriter().use { writer ->
logItems.forEach {
writer.write(it)
writer.newLine()
}
}
2020-12-20 07:25:44 +01:00
SnackbarEvent(file.toString()).publish()
}
2020-07-09 13:49:14 +02:00
}
fun restartPressed() = reboot()
2020-07-07 06:05:43 +02:00
}