Skip to content

Commit

Permalink
Improve the way event metadata is displayed on the UI.
Browse files Browse the repository at this point in the history
  • Loading branch information
pandulapeter committed Oct 16, 2020
1 parent 226ad81 commit db46f11
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ import com.pandulapeter.beagle.common.configuration.Appearance.GeneralTexts.Comp
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_DURATION
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_HEADERS
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_METADATA
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_NONE
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_TIMESTAMP
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_TOGGLE_DETAILS_HINT
import com.pandulapeter.beagle.common.configuration.Appearance.NetworkLogTexts.Companion.DEFAULT_TOGGLE_EXPAND_COLLAPSE
import com.pandulapeter.beagle.common.configuration.Appearance.ScreenCaptureTexts
import com.pandulapeter.beagle.common.configuration.Appearance.ScreenCaptureTexts.Companion.DEFAULT_IN_PROGRESS_NOTIFICATION_CONTENT
import com.pandulapeter.beagle.common.configuration.Appearance.ScreenCaptureTexts.Companion.DEFAULT_IN_PROGRESS_NOTIFICATION_TITLE
Expand Down Expand Up @@ -137,25 +138,28 @@ data class Appearance(
/**
* Holder for copies related to the network event detail dialog.
*
* @param metadata - The term used for the request / response metadata. [DEFAULT_METADATA] by default.
* @param headers - The term used for request / response headers. [DEFAULT_HEADERS] by default.
* @param none - The term used when the list of headers is empty. [DEFAULT_NONE] by default.
* @param timestamp - The term used for the timestamp of the logged event. [DEFAULT_TIMESTAMP] by default.
* @param duration - The term used for the duration of the logged event. [DEFAULT_DURATION] by default.
* @param toggleDetailsHint - The hint for the on / off toggle that hides or shows network event metadata. [DEFAULT_TOGGLE_DETAILS_HINT] by default.
* @param toggleExpandCollapseHint - The hint for the toggle that expands or collapses all JSON tags. [DEFAULT_TOGGLE_EXPAND_COLLAPSE] by default.
*/
data class NetworkLogTexts(
val metadata: Text = Text.CharSequence(DEFAULT_METADATA),
val headers: Text = Text.CharSequence(DEFAULT_HEADERS),
val none: Text = Text.CharSequence(DEFAULT_NONE),
val timestamp: Text = Text.CharSequence(DEFAULT_TIMESTAMP),
val duration: Text = Text.CharSequence(DEFAULT_DURATION),
val toggleDetailsHint: Text = Text.CharSequence(DEFAULT_TOGGLE_DETAILS_HINT)
val toggleExpandCollapseHint: Text = Text.CharSequence(DEFAULT_TOGGLE_EXPAND_COLLAPSE)
) {
companion object {
private const val DEFAULT_METADATA = "Metadata"
private const val DEFAULT_HEADERS = "Headers"
private const val DEFAULT_NONE = "none"
private const val DEFAULT_TIMESTAMP = "Timestamp"
private const val DEFAULT_DURATION = "Duration"
private const val DEFAULT_TOGGLE_DETAILS_HINT = "Toggle details"
private const val DEFAULT_TOGGLE_EXPAND_COLLAPSE = "Expand / collapse all"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ internal class NetworkLogDetailDialogFragment : DialogFragment() {
navigationIcon = context.tintedDrawable(R.drawable.beagle_ic_close, textColor)
toggleDetailsButton = menu.findItem(R.id.beagle_toggle_details).also {
it.isVisible = true
it.title = context.text(BeagleCore.implementation.appearance.networkLogTexts.toggleDetailsHint)
it.title = context.text(BeagleCore.implementation.appearance.networkLogTexts.toggleExpandCollapseHint)
}
shareButton = menu.findItem(R.id.beagle_share).also {
it.title = context.text(BeagleCore.implementation.appearance.generalTexts.shareHint)
Expand All @@ -74,10 +74,13 @@ internal class NetworkLogDetailDialogFragment : DialogFragment() {
viewModel.isProgressBarVisible.observe(this, {
progressBar.visible = it
})
viewModel.areDetailsEnabled.observe(this, {
viewModel.areTagsExpanded.observe(this, {
toggleDetailsButton.icon = context?.tintedDrawable(if (it) R.drawable.beagle_ic_toggle_details_on else R.drawable.beagle_ic_toggle_details_off, textColor)
})
val networkLogDetailAdapter = NetworkLogDetailAdapter(viewModel::onItemClicked)
val networkLogDetailAdapter = NetworkLogDetailAdapter(
onHeaderClicked = viewModel::onHeaderClicked,
onItemClicked = viewModel::onItemClicked
)
recyclerView.run {
layoutManager = LinearLayoutManager(context)
adapter = networkLogDetailAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.pandulapeter.beagle.core.util.extension.createAndShareLogFile
import com.pandulapeter.beagle.core.util.extension.jsonLevel
import com.pandulapeter.beagle.core.util.extension.text
import com.pandulapeter.beagle.core.view.networkLogDetail.list.DetailsViewHolder
import com.pandulapeter.beagle.core.view.networkLogDetail.list.HeaderViewHolder
import com.pandulapeter.beagle.core.view.networkLogDetail.list.LineViewHolder
import com.pandulapeter.beagle.core.view.networkLogDetail.list.NetworkLogDetailListItem
import com.pandulapeter.beagle.core.view.networkLogDetail.list.TitleViewHolder
Expand All @@ -33,8 +34,8 @@ internal class NetworkLogDetailDialogViewModel(application: Application) : Andro
private val textDuration = application.text(BeagleCore.implementation.appearance.networkLogTexts.duration)
private val _isProgressBarVisible = MutableLiveData(true)
val isProgressBarVisible: LiveData<Boolean> = _isProgressBarVisible
private val _areDetailsEnabled = MutableLiveData(false)
val areDetailsEnabled: LiveData<Boolean> = _areDetailsEnabled
private val _areTagsExpanded = MutableLiveData(true)
val areTagsExpanded: LiveData<Boolean> = _areTagsExpanded
private val _isShareButtonEnabled = MutableLiveData(false)
val isShareButtonEnabled: LiveData<Boolean> = _isShareButtonEnabled
private val _items = MutableLiveData(emptyList<NetworkLogDetailListItem>())
Expand All @@ -45,10 +46,19 @@ internal class NetworkLogDetailDialogViewModel(application: Application) : Andro
private var collapsedLineIndices = mutableListOf<Int>()
private var hasCollapsingContent = false
private var longestLine = ""
private var shouldShowMetadata = false
private val metadataText = BeagleCore.implementation.appearance.networkLogTexts.metadata

init {
areDetailsEnabled.observeForever {
viewModelScope.launch { refreshUi() }
areTagsExpanded.observeForever { areDetailsEnabled ->
viewModelScope.launch {
shouldShowMetadata = areDetailsEnabled
collapsedLineIndices.clear()
if (!areDetailsEnabled) {
collapsedLineIndices.addAll(items.value?.filter { it is LineViewHolder.UiModel && it.isClickable }?.map { it.lineIndex }.orEmpty())
}
refreshUi()
}
}
}

Expand Down Expand Up @@ -81,16 +91,18 @@ internal class NetworkLogDetailDialogViewModel(application: Application) : Andro
}

fun onToggleDetailsButtonPressed() {
_areDetailsEnabled.value = !(areDetailsEnabled.value ?: true)
if (_isProgressBarVisible.value == false) {
_areTagsExpanded.value = !(areTagsExpanded.value ?: true)
}
}

fun shareLogs(activity: Activity?, timestamp: Long, id: String) {
if (_isShareButtonEnabled.value == true) {
if (_isProgressBarVisible.value == false && _isShareButtonEnabled.value == true) {
viewModelScope.launch {
_isShareButtonEnabled.postValue(false)
activity?.createAndShareLogFile(
fileName = "${BeagleCore.implementation.behavior.getNetworkLogFileName(timestamp, id)}.txt",
content = title.run { if (_areDetailsEnabled.value == true) append(details) else this }
content = title.run { if (shouldShowMetadata) append(details) else this }
.append(
"\n\n${
jsonLines.joinToString("\n") { line ->
Expand All @@ -109,6 +121,15 @@ internal class NetworkLogDetailDialogViewModel(application: Application) : Andro
}
}

fun onHeaderClicked() {
viewModelScope.launch {
if (_isProgressBarVisible.value == false) {
shouldShowMetadata = !shouldShowMetadata
refreshUi()
}
}
}

fun onItemClicked(lineIndex: Int) {
viewModelScope.launch {
if (collapsedLineIndices.contains(lineIndex)) {
Expand All @@ -128,7 +149,14 @@ internal class NetworkLogDetailDialogViewModel(application: Application) : Andro
longestLine = longestLine
)
)
if (_areDetailsEnabled.value == true) {
add(
HeaderViewHolder.UiModel(
lineIndex = -300,
content = metadataText,
isCollapsed = !shouldShowMetadata
)
)
if (shouldShowMetadata) {
add(DetailsViewHolder.UiModel(details.trim()))
}
var levelToSkip = Int.MAX_VALUE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.pandulapeter.beagle.core.view.networkLogDetail.list

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.pandulapeter.beagle.common.configuration.Text
import com.pandulapeter.beagle.core.R
import com.pandulapeter.beagle.core.util.extension.setText
import com.pandulapeter.beagle.utils.extensions.tintedDrawable

internal class HeaderViewHolder private constructor(
itemView: View,
onItemClicked: () -> Unit
) : RecyclerView.ViewHolder(itemView) {

private val textView = itemView.findViewById<TextView>(R.id.beagle_text_view)
private val drawableExpand by lazy { itemView.context.tintedDrawable(R.drawable.beagle_ic_expand, textView.textColors.defaultColor) }
private val drawableCollapse by lazy { itemView.context.tintedDrawable(R.drawable.beagle_ic_collapse, textView.textColors.defaultColor) }

init {
itemView.setOnClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
onItemClicked()
}
}
}

fun bind(uiModel: UiModel) = textView.run {
setText(uiModel.content)
setCompoundDrawablesWithIntrinsicBounds(null, null, if (uiModel.isCollapsed) drawableExpand else drawableCollapse, null)
}

data class UiModel(
override val lineIndex: Int,
val content: Text,
val isCollapsed: Boolean
) : NetworkLogDetailListItem

companion object {
fun create(
parent: ViewGroup,
onItemClicked: () -> Unit
) = HeaderViewHolder(
itemView = LayoutInflater.from(parent.context).inflate(R.layout.beagle_item_network_log_detail_header, parent, false),
onItemClicked = onItemClicked
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.pandulapeter.beagle.core.R

internal class NetworkLogDetailAdapter(
private val onHeaderClicked: () -> Unit,
private val onItemClicked: (Int) -> Unit
) : ListAdapter<NetworkLogDetailListItem, RecyclerView.ViewHolder>(object : DiffUtil.ItemCallback<NetworkLogDetailListItem>() {

Expand All @@ -18,20 +19,23 @@ internal class NetworkLogDetailAdapter(
}) {
override fun getItemViewType(position: Int) = when (getItem(position)) {
is DetailsViewHolder.UiModel -> R.layout.beagle_item_network_log_detail_details
is HeaderViewHolder.UiModel -> R.layout.beagle_item_network_log_detail_header
is LineViewHolder.UiModel -> R.layout.beagle_item_network_log_detail_line
is TitleViewHolder.UiModel -> R.layout.beagle_item_network_log_detail_title
else -> throw IllegalArgumentException("Unsupported item type at position $position.")
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = when (viewType) {
R.layout.beagle_item_network_log_detail_details -> DetailsViewHolder.create(parent)
R.layout.beagle_item_network_log_detail_header -> HeaderViewHolder.create(parent, onHeaderClicked)
R.layout.beagle_item_network_log_detail_line -> LineViewHolder.create(parent, onItemClicked)
R.layout.beagle_item_network_log_detail_title -> TitleViewHolder.create(parent)
else -> throw IllegalArgumentException("Unsupported view type: $viewType.")
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) = when (holder) {
is DetailsViewHolder -> holder.bind(getItem(position) as DetailsViewHolder.UiModel)
is HeaderViewHolder -> holder.bind(getItem(position) as HeaderViewHolder.UiModel)
is LineViewHolder -> holder.bind(getItem(position) as LineViewHolder.UiModel)
is TitleViewHolder -> holder.bind(getItem(position) as TitleViewHolder.UiModel)
else -> throw IllegalArgumentException("Unsupported view holder type at position $position.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<com.pandulapeter.beagle.core.view.TolerantHorizontalScrollView
android:id="@+id/beagle_child_horizontal_scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:clipToPadding="false"
android:fillViewport="true"
android:scrollbars="none">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
android:id="@+id/beagle_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/beagle_large_content_padding"
android:layout_marginLeft="@dimen/beagle_large_content_padding"
android:layout_marginTop="-8dp"
android:paddingStart="@dimen/beagle_content_padding"
android:paddingLeft="@dimen/beagle_content_padding"
android:paddingEnd="0dp"
android:paddingRight="0dp"
android:paddingBottom="@dimen/beagle_large_content_padding"
android:textColor="?android:attr/textColorPrimary"
tools:ignore="Overdraw"
Expand Down
16 changes: 16 additions & 0 deletions core/src/main/res/layout/beagle_item_network_log_detail_header.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/beagle_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/beagle_large_content_padding"
android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/beagle_content_padding_small"
android:gravity="center_vertical"
android:paddingTop="@dimen/beagle_content_padding_small"
android:paddingBottom="@dimen/beagle_content_padding_small"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
tools:ignore="Overdraw"
tools:text="Text" />
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/beagle_text_view"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:drawablePadding="@dimen/beagle_medium_content_padding"
Expand Down

0 comments on commit db46f11

Please sign in to comment.