diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt index 733eb85b9..1ea6fedb9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt @@ -14,8 +14,10 @@ class LogRepository( private val logDao: LogDao ) { - fun fetchLogs() = logDao.fetchAll() - .map { it.sortByDescending { it.date.time }; it } + fun fetchLogsNowrap() = logDao.fetchAll() + .map { it.sortedByDescending { it.date.time } } + + fun fetchLogs() = fetchLogsNowrap() .map { it.wrap() } fun fetchMagiskLogs() = "tail -n 5000 ${Const.MAGISK_LOG}".suRaw() diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt index 89cd8efdf..f01dcb4e3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/RedesignModule.kt @@ -19,7 +19,7 @@ val redesignModule = module { viewModel { FlashViewModel() } viewModel { HideViewModel(get()) } viewModel { HomeViewModel(get()) } - viewModel { LogViewModel() } + viewModel { LogViewModel(get()) } viewModel { ModuleViewModel(get(), get(), get()) } viewModel { RequestViewModel() } viewModel { SafetynetViewModel(get()) } diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt index c3fa76291..ce822d5f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XTime.kt @@ -18,3 +18,10 @@ val timeFormatFull by lazy { SimpleDateFormat("yyyy/MM/dd_HH:mm:ss", currentLoca val timeFormatStandard by lazy { SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", currentLocale) } val timeFormatMedium by lazy { DateFormat.getDateInstance(DateFormat.MEDIUM, currentLocale) } val timeFormatTime by lazy { SimpleDateFormat("h:mm a", currentLocale) } +val timeDateFormat by lazy { + DateFormat.getDateTimeInstance( + DateFormat.DEFAULT, + DateFormat.DEFAULT, + currentLocale + ) +} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt index ad278ef80..d1de32e3d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LogRvItem.kt @@ -1,7 +1,10 @@ package com.topjohnwu.magisk.model.entity.recycler +import androidx.databinding.Bindable +import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.ComparableRvItem +import com.topjohnwu.magisk.extensions.timeDateFormat import com.topjohnwu.magisk.extensions.timeFormatMedium import com.topjohnwu.magisk.extensions.toTime import com.topjohnwu.magisk.extensions.toggle @@ -74,4 +77,37 @@ class MagiskLogRvItem : ComparableRvItem() { override fun contentSameAs(other: MagiskLogRvItem): Boolean = false override fun itemSameAs(other: MagiskLogRvItem): Boolean = false +} + +// --- + +class LogItem(val item: MagiskLog) : ObservableItem() { + + override val layoutRes = R.layout.item_log_access_md2 + + val date = item.date.time.toTime(timeDateFormat) + var isTop = false + @Bindable get + set(value) { + field = value + notifyChange(BR.top) + } + var isBottom = false + @Bindable get + set(value) { + field = value + notifyChange(BR.bottom) + } + + override fun itemSameAs(other: LogItem) = item.appName == other.item.appName + + override fun contentSameAs(other: LogItem) = item.fromUid == other.item.fromUid && + item.toUid == other.item.toUid && + item.fromPid == other.item.fromPid && + item.packageName == other.item.packageName && + item.command == other.item.command && + item.action == other.item.action && + item.date == other.item.date && + isTop == other.isTop && + isBottom == other.isBottom } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt index b5e670c24..2a4537fd3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogFragment.kt @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.redesign.log +import android.graphics.Insets import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding import com.topjohnwu.magisk.redesign.compat.CompatFragment @@ -10,10 +11,14 @@ class LogFragment : CompatFragment() { override val layoutRes = R.layout.fragment_log_md2 override val viewModel by viewModel() + override fun consumeSystemWindowInsets(insets: Insets) = insets + override fun onStart() { super.onStart() activity.title = resources.getString(R.string.section_log) } + override fun onPreBind(binding: FragmentLogMd2Binding) = Unit + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt index 1b3ac4dbe..dadbd3684 100644 --- a/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/redesign/log/LogViewModel.kt @@ -1,5 +1,33 @@ package com.topjohnwu.magisk.redesign.log +import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.data.repository.LogRepository +import com.topjohnwu.magisk.extensions.subscribeK +import com.topjohnwu.magisk.model.entity.recycler.LogItem import com.topjohnwu.magisk.redesign.compat.CompatViewModel +import com.topjohnwu.magisk.redesign.home.itemBindingOf +import com.topjohnwu.magisk.redesign.superuser.diffListOf -class LogViewModel : CompatViewModel() \ No newline at end of file +class LogViewModel( + private val repo: LogRepository +) : CompatViewModel() { + + val items = diffListOf() + val itemBinding = itemBindingOf { + it.bindExtra(BR.viewModel, this) + } + + override fun refresh() = repo.fetchLogsNowrap() + .map { it.map { LogItem(it) } } + .map { it to items.calculateDiff(it) } + .subscribeK { + items.firstOrNull()?.isTop = false + items.lastOrNull()?.isBottom = false + + items.update(it.first, it.second) + + items.firstOrNull()?.isTop = true + items.lastOrNull()?.isBottom = true + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_line_bottom_rounded.xml b/app/src/main/res/drawable/bg_line_bottom_rounded.xml new file mode 100644 index 000000000..7ead075af --- /dev/null +++ b/app/src/main/res/drawable/bg_line_bottom_rounded.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_line_top_rounded.xml b/app/src/main/res/drawable/bg_line_top_rounded.xml new file mode 100644 index 000000000..589b19ca4 --- /dev/null +++ b/app/src/main/res/drawable/bg_line_top_rounded.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close_md2.xml b/app/src/main/res/drawable/ic_close_md2.xml new file mode 100644 index 000000000..78e1de996 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_md2.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_log_md2.xml b/app/src/main/res/layout/fragment_log_md2.xml index 7c4a5980c..4fb807940 100644 --- a/app/src/main/res/layout/fragment_log_md2.xml +++ b/app/src/main/res/layout/fragment_log_md2.xml @@ -1,5 +1,7 @@ - + @@ -9,15 +11,19 @@ - - - - - + android:clipToPadding="false" + android:orientation="vertical" + android:paddingStart="@dimen/l1" + android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size}" + android:paddingEnd="@dimen/l1" + android:paddingBottom="@{viewModel.insets.bottom}" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_log_access_md2" + tools:paddingTop="40dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_log_access_md2.xml b/app/src/main/res/layout/item_log_access_md2.xml new file mode 100644 index 000000000..6fdcae553 --- /dev/null +++ b/app/src/main/res/layout/item_log_access_md2.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_log_track_md2.xml b/app/src/main/res/layout/item_log_track_md2.xml new file mode 100644 index 000000000..f245feda3 --- /dev/null +++ b/app/src/main/res/layout/item_log_track_md2.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles_md2.xml b/app/src/main/res/values/styles_md2.xml index 356d2abaf..4d0ee6142 100644 --- a/app/src/main/res/values/styles_md2.xml +++ b/app/src/main/res/values/styles_md2.xml @@ -105,7 +105,7 @@ \ No newline at end of file