From 36339897789948e8a8d9a1988c07c94d8d1edb2c Mon Sep 17 00:00:00 2001 From: Maksim Zoteev <39910552+F0x1d@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:19:37 +0300 Subject: [PATCH] [feat]: update v1.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat]: applied search and filters are displayed now * [feat]: update zh_rCN translation * [fix]: crash with filters with no selected log levels * [feat]: placeholders in empty lists * [fix]: small placeholders UI improvements * [feat]: update zh_rCN translation * [build]: bumped version to 1.5.1 --------- Co-authored-by: ‭huajijam --- app/build.gradle | 4 +-- .../logfox/database/entity/UserFilter.kt | 6 +++- .../logfox/ui/dialog/SearchBottomSheet.kt | 3 +- .../logfox/ui/fragment/RecordingsFragment.kt | 3 ++ .../fragment/crashes/list/CrashesFragment.kt | 3 ++ .../ui/fragment/filters/FiltersFragment.kt | 3 ++ .../logfox/ui/fragment/logs/LogsFragment.kt | 28 +++++++++++++++ .../logfox/ui/viewholder/FilterViewHolder.kt | 18 +++++----- .../f0x1d/logfox/viewmodel/LogsViewModel.kt | 21 +++++++----- .../drawable/placeholder_icon_background.xml | 12 +++++++ app/src/main/res/layout/fragment_crashes.xml | 9 +++++ .../main/res/layout/fragment_edit_filter.xml | 4 +-- app/src/main/res/layout/fragment_filters.xml | 13 +++++-- app/src/main/res/layout/fragment_logs.xml | 14 ++++++-- .../main/res/layout/fragment_recordings.xml | 17 +++++++--- app/src/main/res/layout/item_filter.xml | 2 +- .../main/res/layout/placeholder_crashes.xml | 34 +++++++++++++++++++ .../main/res/layout/placeholder_filters.xml | 34 +++++++++++++++++++ app/src/main/res/layout/placeholder_logs.xml | 34 +++++++++++++++++++ .../res/layout/placeholder_recordings.xml | 34 +++++++++++++++++++ app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values-ru/plurals.xml | 5 +++ app/src/main/res/values-ru/strings.xml | 5 +++ app/src/main/res/values-zh-rCN/plurals.xml | 3 ++ app/src/main/res/values-zh-rCN/strings.xml | 11 ++++-- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/plurals.xml | 4 +++ app/src/main/res/values/strings.xml | 5 +++ app/src/main/res/values/styles.xml | 12 +++---- build.gradle | 2 +- 30 files changed, 302 insertions(+), 43 deletions(-) create mode 100644 app/src/main/res/drawable/placeholder_icon_background.xml create mode 100644 app/src/main/res/layout/placeholder_crashes.xml create mode 100644 app/src/main/res/layout/placeholder_filters.xml create mode 100644 app/src/main/res/layout/placeholder_logs.xml create mode 100644 app/src/main/res/layout/placeholder_recordings.xml diff --git a/app/build.gradle b/app/build.gradle index d1804067..ea13890b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "com.f0x1d.logfox" minSdk 24 targetSdk 34 - versionCode 52 - versionName "1.5.0" + versionCode 53 + versionName "1.5.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/f0x1d/logfox/database/entity/UserFilter.kt b/app/src/main/java/com/f0x1d/logfox/database/entity/UserFilter.kt index a990bae1..8ca41ce7 100644 --- a/app/src/main/java/com/f0x1d/logfox/database/entity/UserFilter.kt +++ b/app/src/main/java/com/f0x1d/logfox/database/entity/UserFilter.kt @@ -52,7 +52,11 @@ interface UserFilterDao { class AllowedLevelsConverter { @TypeConverter - fun toAllowedLevels(data: String) = data.split(",").map { enumValues()[it.toInt()] } + fun toAllowedLevels(data: String) = when (data.isEmpty()) { + true -> emptyList() + + else -> data.split(",").map { enumValues()[it.toInt()] } + } @TypeConverter fun fromAllowedLevels(allowedLevels: List) = allowedLevels.joinToString(",") { it.ordinal.toString() } diff --git a/app/src/main/java/com/f0x1d/logfox/ui/dialog/SearchBottomSheet.kt b/app/src/main/java/com/f0x1d/logfox/ui/dialog/SearchBottomSheet.kt index 72932b00..f70794ae 100644 --- a/app/src/main/java/com/f0x1d/logfox/ui/dialog/SearchBottomSheet.kt +++ b/app/src/main/java/com/f0x1d/logfox/ui/dialog/SearchBottomSheet.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo +import androidx.core.view.isVisible import androidx.hilt.navigation.fragment.hiltNavGraphViewModels import com.f0x1d.logfox.R import com.f0x1d.logfox.databinding.SheetSearchBinding @@ -24,7 +25,7 @@ class SearchBottomSheet: BaseBottomSheet() { binding.queryText.setText(query) - binding.clearSearchButton.visibility = if (query == null) View.GONE else View.VISIBLE + binding.clearSearchButton.isVisible = query != null binding.clearSearchButton.setOnClickListener { search(null) } diff --git a/app/src/main/java/com/f0x1d/logfox/ui/fragment/RecordingsFragment.kt b/app/src/main/java/com/f0x1d/logfox/ui/fragment/RecordingsFragment.kt index 10e33076..764b38ff 100644 --- a/app/src/main/java/com/f0x1d/logfox/ui/fragment/RecordingsFragment.kt +++ b/app/src/main/java/com/f0x1d/logfox/ui/fragment/RecordingsFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager @@ -99,6 +100,8 @@ class RecordingsFragment: BaseViewModelFragment(), scrollLogToBottom() } + viewModel.queryAndFilters.asLiveData().observe(viewLifecycleOwner) { + val (query, filters) = it + + val subtitle = buildString { + if (query != null) { + append(query) + + if (filters.isNotEmpty()) + append(", ") + } + + if (filters.isNotEmpty()) + append(resources.getQuantityString(R.plurals.filters_count, filters.size, filters.size)) + } + + binding.toolbar.subtitle = subtitle + binding.placeholderLayout.placeholderText.setText( + when (subtitle.isEmpty()) { + true -> R.string.no_logs + + else -> R.string.all_logs_were_filtered_out + } + ) + } + viewModel.selectedItems.asLiveData().observe(viewLifecycleOwner) { val selecting = it.isNotEmpty() @@ -150,6 +176,8 @@ class LogsFragment: BaseViewModelFragment(), } viewModel.logs.asLiveData().observe(viewLifecycleOwner) { + binding.placeholderLayout.root.isVisible = it.isEmpty() + adapter.submitList(null) adapter.submitList(it) { scrollLogToBottom() diff --git a/app/src/main/java/com/f0x1d/logfox/ui/viewholder/FilterViewHolder.kt b/app/src/main/java/com/f0x1d/logfox/ui/viewholder/FilterViewHolder.kt index f1f8a6bf..9b485e72 100644 --- a/app/src/main/java/com/f0x1d/logfox/ui/viewholder/FilterViewHolder.kt +++ b/app/src/main/java/com/f0x1d/logfox/ui/viewholder/FilterViewHolder.kt @@ -32,19 +32,19 @@ class FilterViewHolder( override fun bindTo(data: UserFilter) { binding.includingText.setText(if (data.including) R.string.including else R.string.excluding) - binding.allowedLevelsText.setTextOrMakeGoneIfNull(R.string.log_levels, data.allowedLevels.joinToString { it.letter }) - binding.uidText.setTextOrMakeGoneIfNull(R.string.uid, data.uid) - binding.pidText.setTextOrMakeGoneIfNull(R.string.pid, data.pid) - binding.tidText.setTextOrMakeGoneIfNull(R.string.tid, data.tid) - binding.packageNameText.setTextOrMakeGoneIfNull(R.string.package_name, data.packageName) - binding.tagText.setTextOrMakeGoneIfNull(R.string.tag, data.tag) - binding.contentText.setTextOrMakeGoneIfNull(R.string.content_contains, data.content) + binding.allowedLevelsText.setTextOrMakeGoneIfEmpty(R.string.log_levels, data.allowedLevels.joinToString { it.letter }) + binding.uidText.setTextOrMakeGoneIfEmpty(R.string.uid, data.uid) + binding.pidText.setTextOrMakeGoneIfEmpty(R.string.pid, data.pid) + binding.tidText.setTextOrMakeGoneIfEmpty(R.string.tid, data.tid) + binding.packageNameText.setTextOrMakeGoneIfEmpty(R.string.package_name, data.packageName) + binding.tagText.setTextOrMakeGoneIfEmpty(R.string.tag, data.tag) + binding.contentText.setTextOrMakeGoneIfEmpty(R.string.content_contains, data.content) checkedListener.check(data.enabled) } - private fun TextView.setTextOrMakeGoneIfNull(prefix: Int, content: String?) { - visibility = if (content == null) View.GONE else View.VISIBLE + private fun TextView.setTextOrMakeGoneIfEmpty(prefix: Int, content: String?) { + visibility = if (content.isNullOrEmpty()) View.GONE else View.VISIBLE if (content != null) { text = Html.fromHtml("${context.getString(prefix)}: $content") diff --git a/app/src/main/java/com/f0x1d/logfox/viewmodel/LogsViewModel.kt b/app/src/main/java/com/f0x1d/logfox/viewmodel/LogsViewModel.kt index be3fae9d..0a17525d 100644 --- a/app/src/main/java/com/f0x1d/logfox/viewmodel/LogsViewModel.kt +++ b/app/src/main/java/com/f0x1d/logfox/viewmodel/LogsViewModel.kt @@ -41,6 +41,9 @@ class LogsViewModel @Inject constructor( ): BaseViewModel(application) { val query = MutableStateFlow(null) + val queryAndFilters = query.combine(database.userFilterDao().getAllAsFlow()) { query, filters -> + query to filters.filter { it.enabled } + }.flowOn(Dispatchers.IO) val paused = MutableStateFlow(false) @@ -117,12 +120,12 @@ class LogsViewModel @Inject constructor( fun pause() = paused.update { true } fun resume() = paused.update { false } -} - -data class LogsData( - val logs: List, - val filters: List, - val query: String?, - val paused: Boolean, - val passing: Boolean = true -) \ No newline at end of file + + private data class LogsData( + val logs: List, + val filters: List, + val query: String?, + val paused: Boolean, + val passing: Boolean = true + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/placeholder_icon_background.xml b/app/src/main/res/drawable/placeholder_icon_background.xml new file mode 100644 index 00000000..5bf3805e --- /dev/null +++ b/app/src/main/res/drawable/placeholder_icon_background.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_crashes.xml b/app/src/main/res/layout/fragment_crashes.xml index 1160dd02..e4de9a54 100644 --- a/app/src/main/res/layout/fragment_crashes.xml +++ b/app/src/main/res/layout/fragment_crashes.xml @@ -20,6 +20,15 @@ app:titleCentered="true" /> + + diff --git a/app/src/main/res/layout/fragment_filters.xml b/app/src/main/res/layout/fragment_filters.xml index b7a5d103..ad7cbdc1 100644 --- a/app/src/main/res/layout/fragment_filters.xml +++ b/app/src/main/res/layout/fragment_filters.xml @@ -31,14 +31,23 @@ android:paddingBottom="71dp" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + + diff --git a/app/src/main/res/layout/fragment_logs.xml b/app/src/main/res/layout/fragment_logs.xml index 9b9c4eaf..c792dc96 100644 --- a/app/src/main/res/layout/fragment_logs.xml +++ b/app/src/main/res/layout/fragment_logs.xml @@ -18,6 +18,7 @@ android:layout_height="?actionBarSize" app:title="@string/app_name" app:titleCentered="true" + app:subtitleCentered="true" app:menu="@menu/logs_menu" app:navigationIconTint="?colorOnSurface"/> @@ -29,6 +30,15 @@ android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + + diff --git a/app/src/main/res/layout/fragment_recordings.xml b/app/src/main/res/layout/fragment_recordings.xml index cbed5cd8..3d69c0a0 100644 --- a/app/src/main/res/layout/fragment_recordings.xml +++ b/app/src/main/res/layout/fragment_recordings.xml @@ -29,6 +29,15 @@ android:paddingBottom="66dp" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + + diff --git a/app/src/main/res/layout/item_filter.xml b/app/src/main/res/layout/item_filter.xml index bc52a8e4..abcdbcf1 100644 --- a/app/src/main/res/layout/item_filter.xml +++ b/app/src/main/res/layout/item_filter.xml @@ -121,7 +121,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toEndOf="@id/allowed_levels_text" + app:layout_constraintStart_toEndOf="@id/including_text" app:layout_constraintEnd_toStartOf="@id/delete_button" app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/layout/placeholder_crashes.xml b/app/src/main/res/layout/placeholder_crashes.xml new file mode 100644 index 00000000..1c6f338b --- /dev/null +++ b/app/src/main/res/layout/placeholder_crashes.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/placeholder_filters.xml b/app/src/main/res/layout/placeholder_filters.xml new file mode 100644 index 00000000..5952610c --- /dev/null +++ b/app/src/main/res/layout/placeholder_filters.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/placeholder_logs.xml b/app/src/main/res/layout/placeholder_logs.xml new file mode 100644 index 00000000..2047c65b --- /dev/null +++ b/app/src/main/res/layout/placeholder_logs.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/placeholder_recordings.xml b/app/src/main/res/layout/placeholder_recordings.xml new file mode 100644 index 00000000..d8236fef --- /dev/null +++ b/app/src/main/res/layout/placeholder_recordings.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index b8f7ad3b..c611fd80 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,4 +1,5 @@ #3a3c3e + #424242 \ No newline at end of file diff --git a/app/src/main/res/values-ru/plurals.xml b/app/src/main/res/values-ru/plurals.xml index f79d2115..1024b935 100644 --- a/app/src/main/res/values-ru/plurals.xml +++ b/app/src/main/res/values-ru/plurals.xml @@ -5,4 +5,9 @@ %d выбраны %d выбраны + + %d фильтр + %d фильтра + %d фильтров + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 018f4c82..f9c8dca1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -127,4 +127,9 @@ Добавлять информацию об устройстве при экспорте записей и сбоев Свалка логов хранится в оперативной памяти, так что не переполните её выбранным значением В запись + Сейчас логов нет + Все логи отфильтрованы + Сейчас сбоев нет + Сейчас записей нет + Сейчас фильтров нет \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/plurals.xml b/app/src/main/res/values-zh-rCN/plurals.xml index a17fdda3..4e5b55d3 100644 --- a/app/src/main/res/values-zh-rCN/plurals.xml +++ b/app/src/main/res/values-zh-rCN/plurals.xml @@ -3,4 +3,7 @@ 已选择 %d 项 + + %d 个过滤器 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9015608d..e2d10c06 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -41,11 +41,11 @@ 这不是一个数字 字体大小 收集 Java 崩溃 - 显示 Java 崩溃消息 + 发送 Java 崩溃通知 收集 JNI 崩溃 - 显示 JNI 崩溃消息 + 发送 JNI 崩溃通知 收集 ANR - 显示 ANR 消息 + 发送 ANR 通知 错误: %s Log 等级 标签 @@ -128,4 +128,9 @@ 在导出的崩溃日志和录制中包含设备信息 日志存储在 RAM 中,请确保所选值不会溢出 RAM 转为录制 + 目前没有日志 + 所有日志都被过滤掉了 + 目前没有崩溃记录 + 目前没有录制 + 目前没有过滤器 \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7f68f528..634b46d3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,4 +10,5 @@ @color/color_primary #ffdadce0 + #E5E5E5 \ No newline at end of file diff --git a/app/src/main/res/values/plurals.xml b/app/src/main/res/values/plurals.xml index 96aa8ebe..f29e9bb5 100644 --- a/app/src/main/res/values/plurals.xml +++ b/app/src/main/res/values/plurals.xml @@ -4,4 +4,8 @@ %d item selected %d items selected + + %d filter + %d filters + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f84c6818..e500c6de 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,4 +137,9 @@ Include device information with exported recordings and crashes Logs dump lines are kept in RAM, so make sure not to overflow it with chosen count To recording + There are currently no logs + All logs were filtered out + There are currently no crashes + There are currently no recordings + There are currently no filters \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9c446976..e42b71d0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -26,18 +26,18 @@ @layout/fragment_settings - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0afffba4..69972f5c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - agp_version = '8.1.3' + agp_version = '8.1.4' kotlin_version = '1.9.0' ksp_version = '1.9.0-1.0.12'