From 4de93cfd4b8a596e1abf7302d99429e2bcc200ee Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sun, 19 Mar 2023 23:45:45 -0700 Subject: [PATCH] Use RV to show Magisk logs --- .../com/topjohnwu/magisk/ui/log/LogRvItem.kt | 37 +++++----- .../topjohnwu/magisk/ui/log/LogViewModel.kt | 28 ++++--- .../topjohnwu/magisk/ui/log/SuLogRvItem.kt | 30 ++++++++ app/src/main/res/layout/fragment_log_md2.xml | 1 + .../main/res/layout/include_log_magisk.xml | 73 ++++++++++++------- .../main/res/layout/item_log_access_md2.xml | 2 +- app/src/main/res/layout/item_log_textview.xml | 20 +++++ 7 files changed, 134 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ui/log/SuLogRvItem.kt create mode 100644 app/src/main/res/layout/item_log_textview.xml diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogRvItem.kt index 400f2c8c1..8f818e9fd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogRvItem.kt @@ -1,30 +1,29 @@ package com.topjohnwu.magisk.ui.log -import androidx.databinding.Bindable -import com.topjohnwu.magisk.BR +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.textview.MaterialTextView import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.core.model.su.SuLog import com.topjohnwu.magisk.databinding.ObservableDiffRvItem import com.topjohnwu.magisk.databinding.RvContainer -import com.topjohnwu.magisk.databinding.set -import com.topjohnwu.magisk.ktx.timeDateFormat -import com.topjohnwu.magisk.ktx.toTime +import com.topjohnwu.magisk.databinding.ViewAwareRvItem class LogRvItem( - override val item: SuLog -) : ObservableDiffRvItem(), RvContainer { + override val item: String +) : ObservableDiffRvItem(), RvContainer, ViewAwareRvItem { - override val layoutRes = R.layout.item_log_access_md2 + override val layoutRes = R.layout.item_log_textview - val date = item.time.toTime(timeDateFormat) + override fun itemSameAs(other: LogRvItem) = item == other.item - @get:Bindable - var isTop = false - set(value) = set(value, field, { field = it }, BR.top) - - @get:Bindable - var isBottom = false - set(value) = set(value, field, { field = it }, BR.bottom) - - override fun itemSameAs(other: LogRvItem) = item.appName == other.item.appName + override fun onBind(binding: ViewDataBinding, recyclerView: RecyclerView) { + val view = binding.root as MaterialTextView + view.measure(0, 0) + val desiredWidth = view.measuredWidth + val layoutParams = view.layoutParams + layoutParams.width = desiredWidth + if (recyclerView.width < desiredWidth) { + recyclerView.requestLayout() + } + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index 259b5e960..87eb20dcc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -26,6 +26,9 @@ import java.io.FileInputStream class LogViewModel( private val repo: LogRepository ) : AsyncLoadViewModel() { + @get:Bindable + var loading = true + private set(value) = set(value, field, { field = it }, BR.loading) // --- empty view @@ -34,27 +37,34 @@ class LogViewModel( // --- su log - val items = DiffRvItemList() + val items = DiffRvItemList() val extraBindings = bindExtra { it.put(BR.viewModel, this) } // --- magisk log - @get:Bindable - var consoleText = " " - set(value) = set(value, field, { field = it }, BR.consoleText) + val logs = DiffRvItemList() + var magiskLogRaw = " " override suspend fun doLoadWork() { - consoleText = repo.fetchMagiskLogs() - val (suLogs, diff) = withContext(Dispatchers.Default) { - val suLogs = repo.fetchSuLogs().map { LogRvItem(it) } + loading = true + val (logs, logDiff) = withContext(Dispatchers.Default) { + magiskLogRaw = repo.fetchMagiskLogs() + val logs = magiskLogRaw.split('\n').map { LogRvItem(it) } + logs to this@LogViewModel.logs.calculateDiff(logs) + } + this.logs.update(logs, logDiff) + + val (suLogs, suDiff) = withContext(Dispatchers.Default) { + val suLogs = repo.fetchSuLogs().map { SuLogRvItem(it) } suLogs to items.calculateDiff(suLogs) } items.firstOrNull()?.isTop = false items.lastOrNull()?.isBottom = false - items.update(suLogs, diff) + items.update(suLogs, suDiff) items.firstOrNull()?.isTop = true items.lastOrNull()?.isBottom = true + loading = false } fun saveMagiskLog() = withExternalRW { @@ -82,7 +92,7 @@ class LogViewModel( file.write("\n---Magisk Logs---\n") file.write("${Info.env.versionString} (${Info.env.versionCode})\n\n") - if (Info.env.isActive) file.write(consoleText) + if (Info.env.isActive) file.write(magiskLogRaw) file.write("\n---Manager Logs---\n") file.write("${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})\n\n") diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/SuLogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/SuLogRvItem.kt new file mode 100644 index 000000000..05a85f9a3 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/SuLogRvItem.kt @@ -0,0 +1,30 @@ +package com.topjohnwu.magisk.ui.log + +import androidx.databinding.Bindable +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.core.model.su.SuLog +import com.topjohnwu.magisk.databinding.ObservableDiffRvItem +import com.topjohnwu.magisk.databinding.RvContainer +import com.topjohnwu.magisk.databinding.set +import com.topjohnwu.magisk.ktx.timeDateFormat +import com.topjohnwu.magisk.ktx.toTime + +class SuLogRvItem( + override val item: SuLog +) : ObservableDiffRvItem(), RvContainer { + + override val layoutRes = R.layout.item_log_access_md2 + + val date = item.time.toTime(timeDateFormat) + + @get:Bindable + var isTop = false + set(value) = set(value, field, { field = it }, BR.top) + + @get:Bindable + var isBottom = false + set(value) = set(value, field, { field = it }, BR.bottom) + + override fun itemSameAs(other: SuLogRvItem) = item.appName == other.item.appName +} diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index eb6244e53..324d66af0 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -23,6 +23,7 @@ android:layout_height="match_parent" /> - - + + - - - - - - - + android:layout_gravity="center" + android:gravity="center" + android:orientation="vertical"> - + + + + + android:layout_height="wrap_content" + android:layout_gravity="center"> - + + + diff --git a/app/src/main/res/layout/item_log_access_md2.xml b/app/src/main/res/layout/item_log_access_md2.xml index 9605ce7cf..0c7f43c85 100644 --- a/app/src/main/res/layout/item_log_access_md2.xml +++ b/app/src/main/res/layout/item_log_access_md2.xml @@ -9,7 +9,7 @@ + type="com.topjohnwu.magisk.ui.log.SuLogRvItem" /> + + + + + + + + + + + +