Update home fragment

This commit is contained in:
topjohnwu 2021-01-24 00:02:49 -08:00
parent 5113f6d375
commit 658d74e026
7 changed files with 53 additions and 112 deletions

View File

@ -6,7 +6,6 @@ import com.topjohnwu.magisk.core.model.UpdateInfo
import com.topjohnwu.magisk.core.utils.net.NetworkObserver import com.topjohnwu.magisk.core.utils.net.NetworkObserver
import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.ktx.get
import com.topjohnwu.magisk.ktx.getProperty import com.topjohnwu.magisk.ktx.getProperty
import com.topjohnwu.magisk.utils.CachedValue
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.topjohnwu.superuser.ShellUtils.fastCmd import com.topjohnwu.superuser.ShellUtils.fastCmd
import com.topjohnwu.superuser.internal.UiThreadHandler import com.topjohnwu.superuser.internal.UiThreadHandler
@ -18,10 +17,6 @@ val isRunningAsStub get() = Info.stub != null
object Info { object Info {
val envRef = CachedValue { loadState() }
@JvmStatic val env by envRef
var stub: DynAPK.Data? = null var stub: DynAPK.Data? = null
val stubChk: DynAPK.Data val stubChk: DynAPK.Data
get() = stub as DynAPK.Data get() = stub as DynAPK.Data
@ -29,15 +24,16 @@ object Info {
var remote = UpdateInfo() var remote = UpdateInfo()
// Device state // Device state
var crypto = "" @JvmStatic val env by lazy { loadState() }
@JvmField var isSAR = false @JvmField var isSAR = false
@JvmField var isAB = false @JvmField var isAB = false
@JvmStatic val isFDE get() = crypto == "block" @JvmStatic val isFDE get() = crypto == "block"
@JvmField var ramdisk = false @JvmField var ramdisk = false
@JvmField var hasGMS = true @JvmField var hasGMS = true
@JvmField var isPixel = false @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" @JvmField val isEmulator = getProperty("ro.kernel.qemu", "0") == "1"
var crypto = ""
val isConnected by lazy { val isConnected by lazy {
ObservableBoolean(false).also { field -> ObservableBoolean(false).also { field ->

View File

@ -26,14 +26,14 @@ class HomeFragment : BaseUIFragment<HomeViewModel, FragmentHomeMd2Binding>() {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
// Set barrier reference IDs in code, since resource IDs will be stripped in release mode // Set barrier reference IDs in code, since resource IDs will be stripped in release mode
binding.homeMagiskWrapper.homeMagiskTitleBarrier.referencedIds = binding.homeMagiskWrapper.homeMagiskTitleBarrier.referencedIds =
intArrayOf(R.id.home_magisk_button, R.id.home_magisk_title, R.id.home_magisk_icon) intArrayOf(R.id.home_magisk_button, R.id.home_magisk_title, R.id.home_magisk_icon)
binding.homeMagiskWrapper.homeMagiskBarrier.referencedIds = 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 = binding.homeManagerWrapper.homeManagerTitleBarrier.referencedIds =
intArrayOf(R.id.home_manager_button, R.id.home_manager_title, R.id.home_manager_icon) intArrayOf(R.id.home_manager_button, R.id.home_manager_title, R.id.home_manager_icon)
@ -46,11 +46,14 @@ class HomeFragment : BaseUIFragment<HomeViewModel, FragmentHomeMd2Binding>() {
menu.removeItem(R.id.action_reboot) menu.removeItem(R.id.action_reboot)
} }
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { override fun onOptionsItemSelected(item: MenuItem): Boolean {
R.id.action_settings -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment() when (item.itemId) {
.navigate() R.id.action_settings ->
R.id.action_reboot -> RebootEvent.inflateMenu(activity).show() HomeFragmentDirections.actionHomeFragmentToSettingsFragment().navigate()
else -> null R.id.action_reboot -> RebootEvent.inflateMenu(activity).show()
}?.let { true } ?: super.onOptionsItemSelected(item) else -> return super.onOptionsItemSelected(item)
}
return true
}
} }

View File

@ -9,8 +9,6 @@ import com.topjohnwu.magisk.core.Config
import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.Info
import com.topjohnwu.magisk.core.download.Subject import com.topjohnwu.magisk.core.download.Subject
import com.topjohnwu.magisk.core.download.Subject.Manager 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.data.repository.NetworkService
import com.topjohnwu.magisk.events.OpenInappLinkEvent import com.topjohnwu.magisk.events.OpenInappLinkEvent
import com.topjohnwu.magisk.events.SnackbarEvent 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.ManagerInstallDialog
import com.topjohnwu.magisk.events.dialog.UninstallDialog import com.topjohnwu.magisk.events.dialog.UninstallDialog
import com.topjohnwu.magisk.ktx.await import com.topjohnwu.magisk.ktx.await
import com.topjohnwu.magisk.ktx.packageName import com.topjohnwu.magisk.utils.asTransitive
import com.topjohnwu.magisk.ktx.res
import com.topjohnwu.magisk.utils.set import com.topjohnwu.magisk.utils.set
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -38,37 +35,35 @@ class HomeViewModel(
var isNoticeVisible = Config.safetyNotice var isNoticeVisible = Config.safetyNotice
set(value) = set(value, field, { field = it }, BR.noticeVisible) set(value) = set(value, field, { field = it }, BR.noticeVisible)
@get:Bindable val stateMagisk = when {
var stateMagisk = MagiskState.LOADING !Info.env.isActive -> MagiskState.NOT_INSTALLED
set(value) = set(value, field, { field = it }, BR.stateMagisk, BR.showUninstall) Info.env.magiskVersionCode < BuildConfig.VERSION_CODE -> MagiskState.OBSOLETE
else -> MagiskState.UP_TO_DATE
}
@get:Bindable @get:Bindable
var stateManager = MagiskState.LOADING var stateManager = MagiskState.LOADING
set(value) = set(value, field, { field = it }, BR.stateManager) set(value) = set(value, field, { field = it }, BR.stateManager)
@get:Bindable val magiskInstalledVersion get() = Info.env.run {
var magiskRemoteVersion = R.string.loading.res() if (isActive)
set(value) = set(value, field, { field = it }, BR.magiskRemoteVersion) "$magiskVersionString ($magiskVersionCode)".asTransitive()
else
val magiskInstalledVersion get() = R.string.not_available.asTransitive()
"${Info.env.magiskVersionString} (${Info.env.magiskVersionCode})" }
@get:Bindable @get:Bindable
var managerRemoteVersion = R.string.loading.res() var managerRemoteVersion = R.string.loading.asTransitive()
set(value) = set(value, field, { field = it }, BR.managerRemoteVersion) set(value) = set(value, field, { field = it }, BR.managerRemoteVersion)
val managerInstalledVersion = Info.stub?.let { val managerInstalledVersion = Info.stub?.let {
"${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) (${it.version})" "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) (${it.version})"
} ?: "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})" } ?: "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
val statePackageName = packageName
@get:Bindable @get:Bindable
var stateManagerProgress = 0 var stateManagerProgress = 0
set(value) = set(value, field, { field = it }, BR.stateManagerProgress) set(value) = set(value, field, { field = it }, BR.stateManagerProgress)
@get:Bindable
val showUninstall get() = Info.env.isActive && state != State.LOADING
@get:Bindable @get:Bindable
val showSafetyNet get() = Info.hasGMS && isConnected.get() val showSafetyNet get() = Info.hasGMS && isConnected.get()
@ -80,30 +75,25 @@ class HomeViewModel(
override fun refresh() = viewModelScope.launch { override fun refresh() = viewModelScope.launch {
state = State.LOADING state = State.LOADING
notifyPropertyChanged(BR.showSafetyNet)
svc.fetchUpdate()?.apply { svc.fetchUpdate()?.apply {
state = State.LOADED state = State.LOADED
stateMagisk = when {
!Info.env.isActive -> MagiskState.NOT_INSTALLED
magisk.isObsolete -> MagiskState.OBSOLETE
else -> MagiskState.UP_TO_DATE
}
stateManager = when { stateManager = when {
app.isObsolete -> MagiskState.OBSOLETE BuildConfig.VERSION_CODE < magisk.versionCode -> MagiskState.OBSOLETE
else -> MagiskState.UP_TO_DATE else -> MagiskState.UP_TO_DATE
} }
magiskRemoteVersion =
"${magisk.version} (${magisk.versionCode})"
managerRemoteVersion = managerRemoteVersion =
"${app.version} (${app.versionCode}) (${stub.versionCode})" "${magisk.version} (${magisk.versionCode}) (${stub.versionCode})".asTransitive()
launch { launch {
ensureEnv() ensureEnv()
} }
} ?: apply { state = State.LOADING_FAILED } } ?: {
notifyPropertyChanged(BR.showUninstall) state = State.LOADING_FAILED
notifyPropertyChanged(BR.showSafetyNet) managerRemoteVersion = R.string.not_available.asTransitive()
}()
} }
val showTest = false val showTest = false
@ -115,9 +105,8 @@ class HomeViewModel(
}.publish() }.publish()
fun onProgressUpdate(progress: Float, subject: Subject) { fun onProgressUpdate(progress: Float, subject: Subject) {
when (subject) { if (subject is Manager)
is Manager -> stateManagerProgress = progress.times(100f).roundToInt() stateManagerProgress = progress.times(100f).roundToInt()
}
} }
fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish() fun onLinkPressed(link: String) = OpenInappLinkEvent(link).publish()
@ -130,13 +119,8 @@ class HomeViewModel(
else -> SnackbarEvent(R.string.no_connection).publish() else -> SnackbarEvent(R.string.no_connection).publish()
} }
fun onMagiskPressed() = when (state) { fun onMagiskPressed() =
State.LOADED -> withExternalRW { HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish()
HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish()
}
State.LOADING -> SnackbarEvent(R.string.loading).publish()
else -> SnackbarEvent(R.string.no_connection).publish()
}
fun onSafetyNetPressed() = fun onSafetyNetPressed() =
HomeFragmentDirections.actionHomeFragmentToSafetynetFragment().publish() 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
} }

View File

@ -4,7 +4,6 @@ import android.content.res.Resources
import android.widget.TextView import android.widget.TextView
import androidx.databinding.BindingAdapter import androidx.databinding.BindingAdapter
import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingAdapter
import com.topjohnwu.magisk.ktx.get
sealed class TransitiveText { sealed class TransitiveText {
@ -42,13 +41,13 @@ sealed class TransitiveText {
} }
fun Int.asTransitive(vararg params: Any) = TransitiveText.Res(this, *params) fun Int.asTransitive(vararg params: Any): TransitiveText = TransitiveText.Res(this, *params)
fun CharSequence.asTransitive() = TransitiveText.String(this) fun CharSequence.asTransitive(): TransitiveText = TransitiveText.String(this)
@BindingAdapter("android:text") @BindingAdapter("android:text")
fun TextView.setText(text: TransitiveText) { fun TextView.setText(text: TransitiveText) {
this.text = text.getText(get()) this.text = text.getText(context.resources)
} }
@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged") @InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")

View File

@ -108,7 +108,7 @@
app:layout_constraintTop_toBottomOf="@+id/home_magisk_wrapper" /> app:layout_constraintTop_toBottomOf="@+id/home_magisk_wrapper" />
<Space <Space
gone="@{!viewModel.showSafetyNet &amp;&amp; !viewModel.showUninstall}" gone="@{!viewModel.showSafetyNet &amp;&amp; !Info.env.isActive}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/l1" /> android:layout_height="@dimen/l1" />
@ -128,7 +128,7 @@
<Button <Button
style="@style/WidgetFoundation.Button.Outlined.Error" style="@style/WidgetFoundation.Button.Outlined.Error"
gone="@{!viewModel.showUninstall}" goneUnless="@{Info.env.isActive}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/l1" android:layout_marginStart="@dimen/l1"

View File

@ -55,7 +55,6 @@
android:id="@+id/home_magisk_button" android:id="@+id/home_magisk_button"
style="@style/WidgetFoundation.Button" style="@style/WidgetFoundation.Button"
invisible="@{viewModel.stateMagisk != MagiskState.OBSOLETE}" invisible="@{viewModel.stateMagisk != MagiskState.OBSOLETE}"
android:enabled="@{viewModel.stateManager != MagiskState.OBSOLETE}"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.onMagiskPressed()}" android:onClick="@{() -> viewModel.onMagiskPressed()}"
@ -69,7 +68,6 @@
<Button <Button
style="@style/WidgetFoundation.Button.Text" style="@style/WidgetFoundation.Button.Text"
invisible="@{viewModel.stateMagisk == MagiskState.OBSOLETE}" invisible="@{viewModel.stateMagisk == MagiskState.OBSOLETE}"
android:enabled="@{viewModel.stateManager != MagiskState.OBSOLETE}"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.onMagiskPressed()}" android:onClick="@{() -> viewModel.onMagiskPressed()}"
@ -105,41 +103,24 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:id="@+id/home_magisk_latest_version" android:id="@+id/home_magisk_installed_version"
style="@style/W.Home.Item.Top" style="@style/W.Home.Item.Top"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView
style="@style/W.Home.ItemContent"
android:text="@string/home_latest_version" />
<TextView
style="@style/W.Home.ItemContent.Right"
android:text="@{viewModel.loadFailed ? @string/not_available : viewModel.magiskRemoteVersion }"
tools:text="20.1 (12345)" />
</LinearLayout>
<LinearLayout
android:id="@+id/home_magisk_installed_version"
style="@style/W.Home.Item"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/home_magisk_latest_version">
<TextView <TextView
style="@style/W.Home.ItemContent" style="@style/W.Home.ItemContent"
android:text="@string/home_installed_version" /> android:text="@string/home_installed_version" />
<TextView <TextView
style="@style/W.Home.ItemContent.Right" style="@style/W.Home.ItemContent.Right"
android:text="@{Info.env.isActive ? viewModel.magiskInstalledVersion : @string/not_available}" android:text="@{viewModel.magiskInstalledVersion}"
tools:text="20.1 (12345)" /> tools:text="22.0 (22000)" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/home_device_details_recovery" android:id="@+id/home_device_details_ramdisk"
style="@style/W.Home.Item.Bottom" style="@style/W.Home.Item.Bottom"
app:layout_constraintStart_toStartOf="@+id/home_magisk_installed_version" app:layout_constraintStart_toStartOf="@+id/home_magisk_installed_version"
app:layout_constraintTop_toBottomOf="@+id/home_magisk_installed_version"> app:layout_constraintTop_toBottomOf="@+id/home_magisk_installed_version">
@ -160,7 +141,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="end" app:barrierDirection="end"
tools:constraint_referenced_ids="home_magisk_latest_version,home_magisk_installed_version"/> tools:constraint_referenced_ids="home_magisk_installed_version,home_device_details_ramdisk"/>
<LinearLayout <LinearLayout
android:id="@+id/home_device_details_ab" android:id="@+id/home_device_details_ab"
@ -181,7 +162,7 @@
<LinearLayout <LinearLayout
android:id="@+id/home_device_details_sar" android:id="@+id/home_device_details_sar"
style="@style/W.Home.Item" style="@style/W.Home.Item.Bottom"
app:layout_constraintStart_toStartOf="@+id/home_device_details_ab" app:layout_constraintStart_toStartOf="@+id/home_device_details_ab"
app:layout_constraintTop_toBottomOf="@+id/home_device_details_ab"> app:layout_constraintTop_toBottomOf="@+id/home_device_details_ab">
@ -196,23 +177,6 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/home_device_details_crypto"
style="@style/W.Home.Item.Bottom"
app:layout_constraintStart_toStartOf="@+id/home_device_details_sar"
app:layout_constraintTop_toBottomOf="@+id/home_device_details_sar">
<TextView
style="@style/W.Home.ItemContent"
android:text="Crypto" />
<TextView
style="@style/W.Home.ItemContent.Right"
android:text="@{Info.cryptoText}"
tools:text="N/A" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout> </LinearLayout>

View File

@ -115,8 +115,8 @@
<TextView <TextView
style="@style/W.Home.ItemContent.Right" style="@style/W.Home.ItemContent.Right"
android:text="@{viewModel.loadFailed ? @string/not_available : viewModel.managerRemoteVersion}" android:text="@{viewModel.managerRemoteVersion}"
tools:text="8.0.0 (123) (10)" /> tools:text="22.0 (22000) (16)" />
</LinearLayout> </LinearLayout>
@ -133,7 +133,7 @@
<TextView <TextView
style="@style/W.Home.ItemContent.Right" style="@style/W.Home.ItemContent.Right"
android:text="@{viewModel.managerInstalledVersion}" android:text="@{viewModel.managerInstalledVersion}"
tools:text="8.0.0 (123) (10)" /> tools:text="22.0 (22000) (16)" />
</LinearLayout> </LinearLayout>
@ -150,7 +150,7 @@
<TextView <TextView
android:id="@+id/home_manager_extra_connection_value" android:id="@+id/home_manager_extra_connection_value"
style="@style/W.Home.ItemContent.Right" style="@style/W.Home.ItemContent.Right"
android:text="@{viewModel.statePackageName}" android:text="@{context.packageName}"
tools:text="com.topjohnwu.magisk" /> tools:text="com.topjohnwu.magisk" />
</LinearLayout> </LinearLayout>