-
-
Notifications
You must be signed in to change notification settings - Fork 365
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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>() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Generaly speaking, I don't get why we should use |
||
|
||
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 |
---|---|---|
|
@@ -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 | ||
|
@@ -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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These 3 adapter are not yet called, is it normal? There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
@@ -77,7 +90,7 @@ internal class TransactionPayloadFragment : | |
|
||
payloadBinding.payloadRecyclerView.apply { | ||
setHasFixedSize(true) | ||
adapter = payloadAdapter | ||
adapter = newPayloadAdapter | ||
} | ||
|
||
viewModel.transaction | ||
|
There was a problem hiding this comment.
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()
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good.