Skip to content

Commit

Permalink
Extract models and adapterDelegates from FillBlanksStepQuizFormDelegate
Browse files Browse the repository at this point in the history
  • Loading branch information
XanderZhu committed Nov 10, 2023
1 parent b06fbfa commit 960222d
Show file tree
Hide file tree
Showing 7 changed files with 237 additions and 143 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.hyperskill.app.android.step_quiz_fill_blanks.adapter

import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import org.hyperskill.app.android.R
import org.hyperskill.app.android.step_quiz_fill_blanks.model.FillBlanksUiItem
import ru.nobird.android.ui.adapterdelegates.AdapterDelegate
import ru.nobird.android.ui.adapterdelegates.DelegateViewHolder
import ru.nobird.android.view.base.ui.extension.setTextIfChanged

class FillBlanksInputItemAdapterDelegate(
private val onClick: (inputItemIndex: Int, text: String) -> Unit
) : AdapterDelegate<FillBlanksUiItem, DelegateViewHolder<FillBlanksUiItem>>() {
override fun isForViewType(position: Int, data: FillBlanksUiItem): Boolean =
data is FillBlanksUiItem.Input

override fun onCreateViewHolder(parent: ViewGroup): DelegateViewHolder<FillBlanksUiItem> =
ViewHolder(createView(parent, R.layout.item_step_quiz_fill_blanks_input))

inner class ViewHolder(root: View) : DelegateViewHolder<FillBlanksUiItem>(root) {
val textView = itemView as TextView

init {
textView.setOnClickListener {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
onClick(position, textView.text.toString())
}
}
}

override fun onBind(data: FillBlanksUiItem) {
val inputItem = data as FillBlanksUiItem.Input
textView.isClickable = inputItem.isEnabled
textView.setTextIfChanged(inputItem.origin.inputText ?: "")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.hyperskill.app.android.step_quiz_fill_blanks.adapter

import android.graphics.drawable.LayerDrawable
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import org.hyperskill.app.android.R
import org.hyperskill.app.android.core.extensions.LayerListDrawableDelegate
import org.hyperskill.app.android.step_quiz_fill_blanks.model.FillBlanksUiItem
import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksOption
import ru.nobird.android.ui.adapterdelegates.AdapterDelegate
import ru.nobird.android.ui.adapterdelegates.DelegateViewHolder
import ru.nobird.android.view.base.ui.extension.setTextIfChanged

class FillBlanksSelectItemAdapterDelegate(
private val options: List<FillBlanksOption>,
private val onClick: (blankIndex: Int, selectedOptionIndex: Int?) -> Unit
) : AdapterDelegate<FillBlanksUiItem, DelegateViewHolder<FillBlanksUiItem>>() {
override fun isForViewType(position: Int, data: FillBlanksUiItem): Boolean =
data is FillBlanksUiItem.Select

override fun onCreateViewHolder(parent: ViewGroup): DelegateViewHolder<FillBlanksUiItem> =
ViewHolder(createView(parent, R.layout.item_step_quiz_fill_blanks_select))

inner class ViewHolder(root: View) : DelegateViewHolder<FillBlanksUiItem>(root) {
private val textView = itemView as TextView
private val layerListDrawableDelegate = LayerListDrawableDelegate(
listOf(
R.id.step_quiz_fill_blanks_select_empty_layer,
R.id.step_quiz_fill_blanks_select_filled_layer,
R.id.step_quiz_fill_blanks_select_empty_selected_layer,
R.id.step_quiz_fill_blanks_select_filled_selected_layer
),
textView.background.mutate() as LayerDrawable
)

init {
textView.setOnClickListener {
val position = bindingAdapterPosition
val item = itemData as? FillBlanksUiItem.Select ?: return@setOnClickListener
val selectedOptionIndex = item.origin.selectedOptionIndex
if (position != RecyclerView.NO_POSITION) {
onClick(position, selectedOptionIndex)
}
}
}

override fun onBind(data: FillBlanksUiItem) {
val selectItem = data as FillBlanksUiItem.Select
val selectedOptionIndex = selectItem.origin.selectedOptionIndex
val text = if (selectedOptionIndex != null) {
options.getOrNull(selectedOptionIndex)?.displayText
} else {
null
}
textView.isClickable = selectItem.isEnabled
textView.setTextIfChanged(text ?: "")
layerListDrawableDelegate.showLayer(
when {
selectItem.isHighlighted && text.isNullOrEmpty() ->
R.id.step_quiz_fill_blanks_select_empty_selected_layer
text.isNullOrEmpty() -> R.id.step_quiz_fill_blanks_select_empty_layer
else -> R.id.step_quiz_fill_blanks_select_filled_layer
}
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.hyperskill.app.android.step_quiz_fill_blanks.adapter

import android.graphics.drawable.LayerDrawable
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isInvisible
import androidx.recyclerview.widget.RecyclerView
import org.hyperskill.app.android.R
import org.hyperskill.app.android.core.extensions.LayerListDrawableDelegate
import org.hyperskill.app.android.databinding.ItemStepQuizFillBlanksSelectOptionBinding
import org.hyperskill.app.android.step_quiz_fill_blanks.model.FillBlanksSelectOptionUIItem
import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksOption
import ru.nobird.android.ui.adapterdelegates.AdapterDelegate
import ru.nobird.android.ui.adapterdelegates.DelegateViewHolder
import ru.nobird.android.view.base.ui.extension.setTextIfChanged

class FillBlanksSelectOptionAdapterDelegate(
private val onClick: (selectedOptionIndex: Int, option: FillBlanksOption) -> Unit
) : AdapterDelegate<FillBlanksSelectOptionUIItem, DelegateViewHolder<FillBlanksSelectOptionUIItem>>() {
override fun isForViewType(position: Int, data: FillBlanksSelectOptionUIItem): Boolean = true

override fun onCreateViewHolder(parent: ViewGroup): DelegateViewHolder<FillBlanksSelectOptionUIItem> =
ViewHolder(createView(parent, R.layout.item_step_quiz_fill_blanks_select_option))

inner class ViewHolder(root: View) : DelegateViewHolder<FillBlanksSelectOptionUIItem>(root) {
private val binding = ItemStepQuizFillBlanksSelectOptionBinding.bind(itemView)

private val layerListDrawableDelegate = LayerListDrawableDelegate(
listOf(
R.id.step_quiz_fill_blanks_select_empty_layer,
R.id.step_quiz_fill_blanks_select_filled_layer,
R.id.step_quiz_fill_blanks_select_empty_selected_layer,
R.id.step_quiz_fill_blanks_select_filled_selected_layer
),
binding.stepQuizFillBlanksSelectOptionContainer.background.mutate() as LayerDrawable
)

init {
binding.stepQuizFillBlanksSelectOptionContainer.setOnClickListener {
val position = bindingAdapterPosition
val item = itemData
if (position != RecyclerView.NO_POSITION && item != null) {
onClick(position, item.option)
}
}
}

override fun onBind(data: FillBlanksSelectOptionUIItem) {
with(binding.stepQuizFillBlanksSelectOptionText) {
isInvisible = data.isUsed
setTextIfChanged(data.option.displayText)
}
binding.stepQuizFillBlanksSelectOptionContainer.isClickable =
data.isClickable && !data.isUsed
layerListDrawableDelegate.showLayer(
if (data.isUsed) {
R.id.step_quiz_fill_blanks_select_empty_layer
} else {
R.id.step_quiz_fill_blanks_select_filled_layer
}
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.hyperskill.app.android.step_quiz_fill_blanks.adapter

import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.text.HtmlCompat
import androidx.core.view.updateLayoutParams
import com.google.android.flexbox.FlexboxLayoutManager
import org.hyperskill.app.android.R
import org.hyperskill.app.android.step_quiz_fill_blanks.model.FillBlanksUiItem
import ru.nobird.android.ui.adapterdelegates.AdapterDelegate
import ru.nobird.android.ui.adapterdelegates.DelegateViewHolder
import ru.nobird.android.view.base.ui.extension.setTextIfChanged

class FillBlanksTextItemAdapterDelegate : AdapterDelegate<FillBlanksUiItem, DelegateViewHolder<FillBlanksUiItem>>() {

override fun isForViewType(position: Int, data: FillBlanksUiItem): Boolean =
data is FillBlanksUiItem.Text

override fun onCreateViewHolder(parent: ViewGroup): DelegateViewHolder<FillBlanksUiItem> =
ViewHolder(createView(parent, R.layout.item_step_quiz_fill_blanks_text))

private class ViewHolder(root: View) : DelegateViewHolder<FillBlanksUiItem>(root) {
private val textView = itemView as TextView

override fun onBind(data: FillBlanksUiItem) {
val textItem = data as FillBlanksUiItem.Text
textView.updateLayoutParams<FlexboxLayoutManager.LayoutParams> {
isWrapBefore = textItem.origin.startsWithNewLine
}
textView.setTextIfChanged(
HtmlCompat.fromHtml(textItem.origin.text, HtmlCompat.FROM_HTML_MODE_COMPACT)
)
}
}
}
Loading

0 comments on commit 960222d

Please sign in to comment.