diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt new file mode 100644 index 000000000..660d9c9b3 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/events/dialog/EnvFixDialog.kt @@ -0,0 +1,77 @@ +package com.topjohnwu.magisk.model.events.dialog + +import android.content.Context +import android.content.DialogInterface +import android.widget.Toast +import androidx.core.net.toUri +import com.topjohnwu.magisk.Info +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.extensions.cachedFile +import com.topjohnwu.magisk.extensions.reboot +import com.topjohnwu.magisk.net.Networking +import com.topjohnwu.magisk.tasks.MagiskInstaller +import com.topjohnwu.magisk.utils.Utils +import com.topjohnwu.magisk.view.MagiskDialog +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.internal.UiThreadHandler +import com.topjohnwu.superuser.io.SuFile +import org.koin.core.KoinComponent +import org.koin.core.get +import java.io.File + +class EnvFixDialog : DialogEvent() { + + override fun build(dialog: MagiskDialog) = dialog + .applyTitle(R.string.env_fix_title) + .applyMessage(R.string.env_fix_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = R.string.yes + preventDismiss = true + onClick { + dialog.applyTitle(R.string.setup_title) + .applyMessage(R.string.setup_msg) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + title = "" + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + title = "" + } + .cancellable(false) + fixEnv(it) + } + } + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = R.string.no_thanks + } + .let { Unit } + + private fun fixEnv(dialog: DialogInterface) { + object : MagiskInstaller(), KoinComponent { + override fun operations(): Boolean { + val context = get() + val zip: File = context.cachedFile("magisk.zip") + + installDir = SuFile("/data/adb/magisk") + Shell.su("rm -rf /data/adb/magisk/*").exec() + + if (!ShellUtils.checkSum("MD5", zip, Info.remote.magisk.md5)) + Networking.get(Info.remote.magisk.link).execForFile(zip) + + zipUri = zip.toUri() + return extractZip() && Shell.su("fix_env").exec().isSuccess + } + + override fun onResult(success: Boolean) { + dialog.dismiss() + Utils.toast( + if (success) R.string.reboot_delay_toast else R.string.setup_fail, + Toast.LENGTH_LONG + ) + if (success) + UiThreadHandler.handler.postDelayed({ reboot() }, 5000) + } + }.exec() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt index 4c939240e..20ca3e50b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/home/HomeViewModel.kt @@ -5,21 +5,20 @@ import com.topjohnwu.magisk.Info import com.topjohnwu.magisk.R import com.topjohnwu.magisk.data.repository.MagiskRepository import com.topjohnwu.magisk.databinding.ComparableRvItem -import com.topjohnwu.magisk.extensions.packageName -import com.topjohnwu.magisk.extensions.replaceRandomWithSpecial -import com.topjohnwu.magisk.extensions.res -import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.extensions.* import com.topjohnwu.magisk.model.entity.MagiskJson import com.topjohnwu.magisk.model.entity.ManagerJson import com.topjohnwu.magisk.model.entity.UpdateInfo import com.topjohnwu.magisk.model.entity.recycler.HomeItem import com.topjohnwu.magisk.model.events.OpenInappLinkEvent +import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog import com.topjohnwu.magisk.model.events.dialog.MagiskInstallDialog import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.observer.Observer import com.topjohnwu.magisk.redesign.compat.CompatViewModel import com.topjohnwu.magisk.ui.home.MagiskState import com.topjohnwu.magisk.utils.KObservableField +import com.topjohnwu.superuser.Shell import me.tatarka.bindingcollectionadapter2.BR import me.tatarka.bindingcollectionadapter2.ItemBinding import me.tatarka.bindingcollectionadapter2.OnItemBind @@ -69,6 +68,8 @@ class HomeViewModel( it.bindExtra(BR.viewModel, this) } + private var shownDialog = false + override fun refresh() = repoMagisk.fetchUpdate() .onErrorReturn { Info.remote } .subscribeK { updateBy(it) } @@ -101,6 +102,8 @@ class HomeViewModel( ) else -> "" } + + ensureEnv() } fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() @@ -111,6 +114,27 @@ class HomeViewModel( fun onMagiskPressed() = MagiskInstallDialog().publish() + private fun ensureEnv() { + val invalidStates = listOf( + MagiskState.NOT_INSTALLED, + MagiskState.LOADING + ) + + // Don't bother checking env when magisk is not installed, loading or already has been shown + if (invalidStates.any { it == stateMagisk.value } || shownDialog) { + return + } + + Shell.su("env_check") + .toSingle() + .map { it.exec() } + .filter { !it.isSuccess } + .subscribeK { + shownDialog = true + EnvFixDialog().publish() + } + } + } @Suppress("unused")