Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Payload processing refactoring #337

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ buildscript {
lifecycleVersion = '2.2.0'
androidXCoreVersion = '2.1.0'
paletteKtxVersion = '1.0.0'
recyclerViewVersion = '1.2.0-alpha04'

// Publishing
androidMavenGradleVersion = '2.1'
Expand Down
1 change: 1 addition & 0 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ dependencies {
implementation "com.google.android.material:material:$materialComponentsVersion"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.palette:palette-ktx:$paletteKtxVersion"
implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion"

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.chuckerteam.chucker.internal.support

import android.graphics.Typeface
import android.text.SpannableString
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.BackgroundColorSpan
import android.text.style.ForegroundColorSpan
import android.text.style.StyleSpan
import android.text.style.UnderlineSpan

/**
Expand Down Expand Up @@ -60,3 +63,7 @@ private fun applyColoredSpannable(
builder
}
}

fun CharSequence.applyBoldSpan() = SpannableString(this).apply {
setSpan(StyleSpan(Typeface.BOLD), 0, this.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
Comment on lines +67 to +69
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be ok to name it .bold()?

It could be called as "${headerItem.name}: ".bold().

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.chuckerteam.chucker.internal.ui.transaction

import android.text.SpannableStringBuilder
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chuckerteam.chucker.databinding.ChuckerTransactionItemBodyLineBinding

internal class TransactionBodyAdapter : RecyclerView.Adapter<TransactionBodyAdapter.BodyLineViewHolder>() {

private val items = arrayListOf<SpannableStringBuilder>()

fun setItems(headersItems: List<SpannableStringBuilder>) {
items.clear()
items.addAll(headersItems)
notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BodyLineViewHolder {
val inflater = LayoutInflater.from(parent.context)
val bodyItemBinding = ChuckerTransactionItemBodyLineBinding.inflate(inflater, parent, false)
return BodyLineViewHolder(bodyItemBinding)
}

override fun getItemCount(): Int = items.size

override fun onBindViewHolder(holder: BodyLineViewHolder, position: Int) {
holder.bind(items[position])
}

internal class BodyLineViewHolder(
private val bodyBinding: ChuckerTransactionItemBodyLineBinding
) : RecyclerView.ViewHolder(bodyBinding.root) {

fun bind(item: SpannableStringBuilder) {
bodyBinding.bodyLine.text = item
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.chuckerteam.chucker.internal.ui.transaction

import android.text.SpannableStringBuilder
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chuckerteam.chucker.databinding.ChuckerTransactionItemHeadersBinding
import com.chuckerteam.chucker.internal.data.entity.HttpHeader
import com.chuckerteam.chucker.internal.support.applyBoldSpan

internal class TransactionHeadersAdapter : RecyclerView.Adapter<TransactionHeadersAdapter.HeaderViewHolder>() {

private val headers = arrayListOf<HttpHeader>()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generaly speaking, I don't get why we should use arrayListOf instead of mutableListOf.


fun setItems(headersItems: List<HttpHeader>) {
headers.clear()
headers.addAll(headersItems)
notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HeaderViewHolder {
val inflater = LayoutInflater.from(parent.context)
val headersItemBinding = ChuckerTransactionItemHeadersBinding.inflate(inflater, parent, false)
return HeaderViewHolder(headersItemBinding)
}

override fun getItemCount(): Int = headers.size

override fun onBindViewHolder(holder: HeaderViewHolder, position: Int) {
holder.bind(headers[position])
}

internal class HeaderViewHolder(
private val headerBinding: ChuckerTransactionItemHeadersBinding
) : RecyclerView.ViewHolder(headerBinding.root) {

fun bind(headerItem: HttpHeader) {
val headerName = "${headerItem.name}: ".applyBoldSpan()
val headerValue = headerItem.value
headerBinding.responseHeaders.text = SpannableStringBuilder(headerName).append(headerValue)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.chuckerteam.chucker.internal.ui.transaction

import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chuckerteam.chucker.R
import com.chuckerteam.chucker.databinding.ChuckerTransactionItemImageBinding
import com.chuckerteam.chucker.internal.support.ChessboardDrawable

internal class TransactionImageAdapter : RecyclerView.Adapter<TransactionImageAdapter.ImageViewHolder>() {

private lateinit var image: Bitmap
private var luminance: Double? = null

fun setImageItem(image: Bitmap, luminance: Double?) {
this.image = image
this.luminance = luminance
notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
val inflater = LayoutInflater.from(parent.context)
val itemBinding = ChuckerTransactionItemImageBinding.inflate(inflater, parent, false)
return ImageViewHolder(itemBinding)
}

override fun getItemCount(): Int = if (!this::image.isInitialized) 0 else 1

override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
holder.bind(image, luminance)
}

internal class ImageViewHolder(
private val imageBinding: ChuckerTransactionItemImageBinding
) : RecyclerView.ViewHolder(imageBinding.root) {

fun bind(item: Bitmap, luminance: Double?) {
imageBinding.binaryData.setImageBitmap(item)
imageBinding.root.background = createContrastingBackground(luminance)
}

private fun createContrastingBackground(luminance: Double?): Drawable? {
if (luminance == null) return null

return if (luminance < LUMINANCE_THRESHOLD) {
ChessboardDrawable.createPattern(
itemView.context,
R.color.chucker_chessboard_even_square_light,
R.color.chucker_chessboard_odd_square_light,
R.dimen.chucker_half_grid
)
} else {
ChessboardDrawable.createPattern(
itemView.context,
R.color.chucker_chessboard_even_square_dark,
R.color.chucker_chessboard_odd_square_dark,
R.dimen.chucker_half_grid
)
}
}

private companion object {
const val LUMINANCE_THRESHOLD = 0.25
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.chuckerteam.chucker.internal.support.highlightWithDefinedColors
* We're using a [RecyclerView] to show the content of the body line by line to do not affect
* performances when loading big payloads.
*/
internal class TransactionBodyAdapter : RecyclerView.Adapter<TransactionPayloadViewHolder>() {
internal class TransactionPayloadAdapter : RecyclerView.Adapter<TransactionPayloadViewHolder>() {

private val items = arrayListOf<TransactionPayloadItem>()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ConcatAdapter
import com.chuckerteam.chucker.R
import com.chuckerteam.chucker.databinding.ChuckerFragmentTransactionPayloadBinding
import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
Expand All @@ -42,7 +43,19 @@ internal class TransactionPayloadFragment :
Fragment(), SearchView.OnQueryTextListener {

private lateinit var payloadBinding: ChuckerFragmentTransactionPayloadBinding
private val payloadAdapter = TransactionBodyAdapter()

private val payloadAdapter = TransactionPayloadAdapter()

private val headerAdapter by lazy { TransactionHeadersAdapter() }
private val bodyAdapter by lazy { TransactionBodyAdapter() }
private val imageAdapter by lazy { TransactionImageAdapter() }
Comment on lines +49 to +51
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These 3 adapter are not yet called, is it normal?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a draft PR, it is not finalized as well as not meant for review.


private val newPayloadAdapter = ConcatAdapter(
payloadAdapter,
headerAdapter,
bodyAdapter,
imageAdapter
)

private var backgroundSpanColor: Int = Color.YELLOW
private var foregroundSpanColor: Int = Color.RED
Expand Down Expand Up @@ -77,7 +90,7 @@ internal class TransactionPayloadFragment :

payloadBinding.payloadRecyclerView.apply {
setHasFixedSize(true)
adapter = payloadAdapter
adapter = newPayloadAdapter
}

viewModel.transaction
Expand Down