diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt index ef09975d1..647742d27 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt @@ -6,7 +6,6 @@ import com.topjohnwu.magisk.core.model.UpdateInfo import com.topjohnwu.magisk.core.utils.net.NetworkObserver import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.ktx.getProperty -import com.topjohnwu.magisk.utils.CachedValue import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils.fastCmd import com.topjohnwu.superuser.internal.UiThreadHandler @@ -18,10 +17,6 @@ val isRunningAsStub get() = Info.stub != null object Info { - val envRef = CachedValue { loadState() } - - @JvmStatic val env by envRef - var stub: DynAPK.Data? = null val stubChk: DynAPK.Data get() = stub as DynAPK.Data @@ -29,15 +24,16 @@ object Info { var remote = UpdateInfo() // Device state - var crypto = "" + @JvmStatic val env by lazy { loadState() } @JvmField var isSAR = false @JvmField var isAB = false @JvmStatic val isFDE get() = crypto == "block" @JvmField var ramdisk = false @JvmField var hasGMS = true @JvmField var isPixel = false - @JvmStatic val cryptoText get()= crypto.capitalize(Locale.US) + @JvmStatic val cryptoText get() = crypto.capitalize(Locale.US) @JvmField val isEmulator = getProperty("ro.kernel.qemu", "0") == "1" + var crypto = "" val isConnected by lazy { ObservableBoolean(false).also { field -> diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt index 99317268f..64f949af8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt @@ -26,14 +26,14 @@ class HomeFragment : BaseUIFragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { super.onCreateView(inflater, container, savedInstanceState) // Set barrier reference IDs in code, since resource IDs will be stripped in release mode binding.homeMagiskWrapper.homeMagiskTitleBarrier.referencedIds = intArrayOf(R.id.home_magisk_button, R.id.home_magisk_title, R.id.home_magisk_icon) binding.homeMagiskWrapper.homeMagiskBarrier.referencedIds = - intArrayOf(R.id.home_magisk_latest_version, R.id.home_magisk_installed_version) + intArrayOf(R.id.home_magisk_installed_version, R.id.home_device_details_ramdisk) binding.homeManagerWrapper.homeManagerTitleBarrier.referencedIds = intArrayOf(R.id.home_manager_button, R.id.home_manager_title, R.id.home_manager_icon) @@ -46,11 +46,14 @@ class HomeFragment : BaseUIFragment() { menu.removeItem(R.id.action_reboot) } - override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { - R.id.action_settings -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment() - .navigate() - R.id.action_reboot -> RebootEvent.inflateMenu(activity).show() - else -> null - }?.let { true } ?: super.onOptionsItemSelected(item) + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_settings -> + HomeFragmentDirections.actionHomeFragmentToSettingsFragment().navigate() + R.id.action_reboot -> RebootEvent.inflateMenu(activity).show() + else -> return super.onOptionsItemSelected(item) + } + return true + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index 7432b013b..bed2423f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -9,8 +9,6 @@ import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.download.Subject import com.topjohnwu.magisk.core.download.Subject.Manager -import com.topjohnwu.magisk.core.model.MagiskJson -import com.topjohnwu.magisk.core.model.ManagerJson import com.topjohnwu.magisk.data.repository.NetworkService import com.topjohnwu.magisk.events.OpenInappLinkEvent import com.topjohnwu.magisk.events.SnackbarEvent @@ -18,8 +16,7 @@ import com.topjohnwu.magisk.events.dialog.EnvFixDialog import com.topjohnwu.magisk.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.events.dialog.UninstallDialog import com.topjohnwu.magisk.ktx.await -import com.topjohnwu.magisk.ktx.packageName -import com.topjohnwu.magisk.ktx.res +import com.topjohnwu.magisk.utils.asTransitive import com.topjohnwu.magisk.utils.set import com.topjohnwu.superuser.Shell import kotlinx.coroutines.launch @@ -38,37 +35,35 @@ class HomeViewModel( var isNoticeVisible = Config.safetyNotice set(value) = set(value, field, { field = it }, BR.noticeVisible) - @get:Bindable - var stateMagisk = MagiskState.LOADING - set(value) = set(value, field, { field = it }, BR.stateMagisk, BR.showUninstall) + val stateMagisk = when { + !Info.env.isActive -> MagiskState.NOT_INSTALLED + Info.env.magiskVersionCode < BuildConfig.VERSION_CODE -> MagiskState.OBSOLETE + else -> MagiskState.UP_TO_DATE + } @get:Bindable var stateManager = MagiskState.LOADING set(value) = set(value, field, { field = it }, BR.stateManager) - @get:Bindable - var magiskRemoteVersion = R.string.loading.res() - set(value) = set(value, field, { field = it }, BR.magiskRemoteVersion) - - val magiskInstalledVersion get() = - "${Info.env.magiskVersionString} (${Info.env.magiskVersionCode})" + val magiskInstalledVersion get() = Info.env.run { + if (isActive) + "$magiskVersionString ($magiskVersionCode)".asTransitive() + else + R.string.not_available.asTransitive() + } @get:Bindable - var managerRemoteVersion = R.string.loading.res() + var managerRemoteVersion = R.string.loading.asTransitive() set(value) = set(value, field, { field = it }, BR.managerRemoteVersion) val managerInstalledVersion = Info.stub?.let { "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) (${it.version})" } ?: "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})" - val statePackageName = packageName @get:Bindable var stateManagerProgress = 0 set(value) = set(value, field, { field = it }, BR.stateManagerProgress) - @get:Bindable - val showUninstall get() = Info.env.isActive && state != State.LOADING - @get:Bindable val showSafetyNet get() = Info.hasGMS && isConnected.get() @@ -80,30 +75,25 @@ class HomeViewModel( override fun refresh() = viewModelScope.launch { state = State.LOADING + notifyPropertyChanged(BR.showSafetyNet) svc.fetchUpdate()?.apply { state = State.LOADED - stateMagisk = when { - !Info.env.isActive -> MagiskState.NOT_INSTALLED - magisk.isObsolete -> MagiskState.OBSOLETE - else -> MagiskState.UP_TO_DATE - } stateManager = when { - app.isObsolete -> MagiskState.OBSOLETE + BuildConfig.VERSION_CODE < magisk.versionCode -> MagiskState.OBSOLETE else -> MagiskState.UP_TO_DATE } - magiskRemoteVersion = - "${magisk.version} (${magisk.versionCode})" managerRemoteVersion = - "${app.version} (${app.versionCode}) (${stub.versionCode})" + "${magisk.version} (${magisk.versionCode}) (${stub.versionCode})".asTransitive() launch { ensureEnv() } - } ?: apply { state = State.LOADING_FAILED } - notifyPropertyChanged(BR.showUninstall) - notifyPropertyChanged(BR.showSafetyNet) + } ?: { + state = State.LOADING_FAILED + managerRemoteVersion = R.string.not_available.asTransitive() + }() } val showTest = false @@ -115,9 +105,8 @@ class HomeViewModel( }.publish() fun onProgressUpdate(progress: Float, subject: Subject) { - when (subject) { - is Manager -> stateManagerProgress = progress.times(100f).roundToInt() - } + if (subject is Manager) + stateManagerProgress = progress.times(100f).roundToInt() } fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() @@ -130,13 +119,8 @@ class HomeViewModel( else -> SnackbarEvent(R.string.no_connection).publish() } - fun onMagiskPressed() = when (state) { - State.LOADED -> withExternalRW { - HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() - } - State.LOADING -> SnackbarEvent(R.string.loading).publish() - else -> SnackbarEvent(R.string.no_connection).publish() - } + fun onMagiskPressed() = + HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() fun onSafetyNetPressed() = HomeFragmentDirections.actionHomeFragmentToSafetynetFragment().publish() @@ -160,9 +144,4 @@ class HomeViewModel( } } - private val MagiskJson.isObsolete - get() = Info.env.isActive && Info.env.magiskVersionCode < versionCode - private val ManagerJson.isObsolete - get() = BuildConfig.VERSION_CODE < versionCode - } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt b/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt index 3dfa0a864..dd5f87e25 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/TransitiveText.kt @@ -4,7 +4,6 @@ import android.content.res.Resources import android.widget.TextView import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter -import com.topjohnwu.magisk.ktx.get sealed class TransitiveText { @@ -42,13 +41,13 @@ sealed class TransitiveText { } -fun Int.asTransitive(vararg params: Any) = TransitiveText.Res(this, *params) -fun CharSequence.asTransitive() = TransitiveText.String(this) +fun Int.asTransitive(vararg params: Any): TransitiveText = TransitiveText.Res(this, *params) +fun CharSequence.asTransitive(): TransitiveText = TransitiveText.String(this) @BindingAdapter("android:text") fun TextView.setText(text: TransitiveText) { - this.text = text.getText(get()) + this.text = text.getText(context.resources) } @InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged") diff --git a/app/src/main/res/layout/fragment_home_md2.xml b/app/src/main/res/layout/fragment_home_md2.xml index 419870f24..a1e70eef4 100644 --- a/app/src/main/res/layout/fragment_home_md2.xml +++ b/app/src/main/res/layout/fragment_home_md2.xml @@ -108,7 +108,7 @@ app:layout_constraintTop_toBottomOf="@+id/home_magisk_wrapper" /> @@ -128,7 +128,7 @@