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

Fix #153/#154 : MultipleChoice/ItemSelection Interaction #258

Closed
wants to merge 75 commits into from
Closed
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
453e858
customization_args issues fix
nikitamarysolomanpvt Oct 18, 2019
8130312
nit
nikitamarysolomanpvt Oct 18, 2019
2f378ef
nit
nikitamarysolomanpvt Oct 18, 2019
296e868
nit
nikitamarysolomanpvt Oct 18, 2019
ba0ba3c
nit
nikitamarysolomanpvt Oct 19, 2019
e65da93
Merge branch 'customization-args-fixes' into merge-fix
veena14cs Oct 21, 2019
f227ed5
Update StateFragmentPresenter.kt
veena14cs Oct 21, 2019
e7b7124
added xmls
veena14cs Oct 21, 2019
0e67155
Update RecyclerViewMatcher.kt
veena14cs Oct 21, 2019
4167caf
Update RecyclerViewMatcher.kt
veena14cs Oct 21, 2019
92e6a80
working on interaction
veena14cs Oct 22, 2019
5e27966
added interactions
veena14cs Oct 22, 2019
e5bdc57
working on text case
veena14cs Oct 22, 2019
2de2d66
Merge branch 'content-card' into multiple-single-input-interaction
veena14cs Oct 22, 2019
fb62097
run test case
veena14cs Oct 22, 2019
b588d7c
nit
veena14cs Oct 22, 2019
0008d5a
renamed views.
veena14cs Oct 22, 2019
ffba169
Update InteractionAdapter.kt
veena14cs Oct 22, 2019
7c4e694
Update StateAdapter.kt
veena14cs Oct 22, 2019
b1a0101
java doc comments.
veena14cs Oct 22, 2019
f19829c
Update RecyclerViewMatcher.kt
veena14cs Oct 22, 2019
18d1672
Update AndroidManifest.xml
veena14cs Oct 22, 2019
46aef2d
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
79a2366
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
d0a4aa6
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
99184b2
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
40a1f6a
Update SelectionInteractionViewModel.kt
veena14cs Oct 23, 2019
eab1559
nit
veena14cs Oct 23, 2019
381da01
Update selection_interaction_item.xml
veena14cs Oct 23, 2019
b143f7b
nit
veena14cs Oct 23, 2019
0562b61
Update StateAdapter.kt
veena14cs Oct 23, 2019
7ea8db0
Update StateAdapter.kt
veena14cs Oct 23, 2019
4c92057
Update StateFragmentPresenter.kt
veena14cs Oct 23, 2019
4c38a3d
Delete SelectionContentViewModel.kt
veena14cs Oct 23, 2019
29273ae
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
50bfbdd
Update InteractionAdapter.kt
veena14cs Oct 23, 2019
6b35a81
Update StateAdapter.kt
veena14cs Oct 23, 2019
a08a2d1
Update StateAdapter.kt
veena14cs Oct 23, 2019
5bdd1ba
fixed issues
veena14cs Oct 24, 2019
ebdb637
Fixed issues.
veena14cs Oct 24, 2019
69c91fc
update
veena14cs Oct 24, 2019
90c4635
Merge branch 'content-card' into multiple-single-input-interaction
veena14cs Oct 24, 2019
01ad3a4
Update welcome.json
veena14cs Oct 24, 2019
1dd48a2
Update selection_interaction_item.xml
veena14cs Oct 24, 2019
e566dbb
Update multiple_choice_interaction_items.xml
veena14cs Oct 24, 2019
0d180cb
Update item_selection_interaction_items.xml
veena14cs Oct 24, 2019
ef7117b
update Kdoc
veena14cs Oct 24, 2019
b52e96f
Update InteractionAdapter.kt
veena14cs Oct 24, 2019
d7b130a
Merge branch 'content-card' into multiple-single-input-interaction
veena14cs Oct 25, 2019
e6531b7
Update StateAdapter.kt
veena14cs Oct 25, 2019
92e1216
working on test
veena14cs Oct 25, 2019
a638a08
Merge branch 'content-card' into multiple-single-input-interaction
veena14cs Oct 25, 2019
c3c03cd
add new exploration
veena14cs Oct 25, 2019
03aaa69
adding test id
veena14cs Oct 25, 2019
979ebda
Update InteractionAdapter.kt
veena14cs Oct 25, 2019
04852e9
Update InteractionAdapter.kt
veena14cs Oct 25, 2019
5c48a97
Update InteractionAdapter.kt
veena14cs Oct 25, 2019
2ba69b7
fixes
veena14cs Oct 25, 2019
5e74aaf
updated
veena14cs Oct 25, 2019
3e8dce7
udated kdoc
veena14cs Oct 25, 2019
5e9abab
Update StateAdapter.kt
veena14cs Oct 25, 2019
c0626a5
Update StateAdapter.kt
veena14cs Oct 25, 2019
19740a9
Update StateAdapter.kt
veena14cs Oct 25, 2019
cf55bc4
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
d9a4c23
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
df1941c
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
d6ffa52
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
37989b9
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
7bb49c2
Update StateFragmentPresenter.kt
veena14cs Oct 25, 2019
21da67f
update
veena14cs Oct 25, 2019
54a37d1
fixes
veena14cs Oct 25, 2019
224b073
Update StateAdapter.kt
veena14cs Oct 25, 2019
72f677b
Update StateSelectionInteractionTest.kt
veena14cs Oct 26, 2019
4fbeef3
created custom selectionview
veena14cs Oct 26, 2019
7772fa2
update
veena14cs Oct 26, 2019
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
160 changes: 160 additions & 0 deletions app/src/main/java/org/oppia/app/player/state/InteractionAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
package org.oppia.app.player.state

import android.text.Spannable
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.databinding.library.baseAdapters.BR
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_selection_interaction_items.view.*
import kotlinx.android.synthetic.main.multiple_choice_interaction_items.view.*
import org.oppia.app.R
import org.oppia.app.databinding.ItemSelectionInteractionItemsBinding
import org.oppia.app.databinding.MultipleChoiceInteractionItemsBinding
import org.oppia.app.model.InteractionObject
import org.oppia.app.model.StringList
import org.oppia.app.player.state.itemviewmodel.CustomizationArgsInteractionViewModel
import org.oppia.app.player.state.itemviewmodel.SelectionContentViewModel
import org.oppia.app.player.state.listener.InteractionAnswerRetriever
import org.oppia.util.parser.HtmlParser

private const val VIEW_TYPE_MULTIPLE_CHOICE = 1
private const val VIEW_TYPE_ITEM_SELECTION = 2
private const val INTERACTION_ADAPTER_TAG = "Interaction Adapter"

/** Adapter to bind the interactions to the [RecyclerView]. It handles MultipleChoiceInput and ItemSelectionInput interaction views. */
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
class InteractionAdapter(
private val htmlParserFactory: HtmlParser.Factory,
private val entityType: String,
private val explorationId: String,
private val itemList: MutableList<SelectionContentViewModel>,
private val customizationArgs: CustomizationArgsInteractionViewModel
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), InteractionAnswerRetriever {
veena14cs marked this conversation as resolved.
Show resolved Hide resolved

private var itemSelectedPosition = -1
private var selectedAnswerIndex = -1
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
private var selectedHtmlStringList = mutableListOf<String>()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
VIEW_TYPE_MULTIPLE_CHOICE -> {
val inflater = LayoutInflater.from(parent.context)
val binding =
DataBindingUtil.inflate<MultipleChoiceInteractionItemsBinding>(
inflater,
R.layout.multiple_choice_interaction_items,
parent,
/* attachToParent= */ false
)
MultipleChoiceViewHolder(binding)
}
VIEW_TYPE_ITEM_SELECTION -> {
val inflater = LayoutInflater.from(parent.context)
val binding =
DataBindingUtil.inflate<ItemSelectionInteractionItemsBinding>(
inflater,
R.layout.item_selection_interaction_items,
parent,
/* attachToParent= */ false
)
ItemSelectionViewHolder(binding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
VIEW_TYPE_MULTIPLE_CHOICE -> (holder as MultipleChoiceViewHolder).bind(
itemList[position].htmlContent,
position,
itemSelectedPosition
)
VIEW_TYPE_ITEM_SELECTION -> (holder as ItemSelectionViewHolder).bind(
itemList[position]
)
}
}

// Determines the appropriate ViewType according to the interaction type.
override fun getItemViewType(position: Int): Int {
return if (customizationArgs.interactionId == "ItemSelectionInput") {
if (customizationArgs.maxAllowableSelectionCount > 1) {
VIEW_TYPE_ITEM_SELECTION
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
} else {
VIEW_TYPE_MULTIPLE_CHOICE
}
} else {
VIEW_TYPE_MULTIPLE_CHOICE
}
}

override fun getItemCount(): Int {
return itemList.size
}

private inner class ItemSelectionViewHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
internal fun bind(selectionContentViewModel: SelectionContentViewModel) {
binding.setVariable(BR.htmlContent, selectionContentViewModel.htmlContent)
binding.executePendingBindings()
val htmlResult: Spannable = htmlParserFactory.create(entityType, explorationId).parseOppiaHtml(
selectionContentViewModel.htmlContent,
binding.root.item_selection_contents_text_view
)
binding.root.item_selection_contents_text_view.text = htmlResult
binding.root.item_selection_checkbox.isChecked = selectionContentViewModel.isAnswerSelected
binding.root.checkbox_container.setOnClickListener {
if (binding.root.item_selection_checkbox.isChecked) {
itemList[adapterPosition].isAnswerSelected = false
selectedHtmlStringList.remove(binding.root.item_selection_contents_text_view.text.toString())
} else {
if (selectedHtmlStringList.size != customizationArgs.maxAllowableSelectionCount) {
itemList[adapterPosition].isAnswerSelected = true
selectedHtmlStringList.add(binding.root.item_selection_contents_text_view.text.toString())
} else {
Log.d(
INTERACTION_ADAPTER_TAG,
"You cannot select more than " + customizationArgs.maxAllowableSelectionCount + " options"
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
)
}
}
notifyDataSetChanged()
}
}
}

private inner class MultipleChoiceViewHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
internal fun bind(rawString: String, position: Int, selectedPosition: Int) {
binding.setVariable(BR.htmlContent, rawString)
binding.executePendingBindings()
val htmlResult: Spannable = htmlParserFactory.create(entityType, explorationId).parseOppiaHtml(
rawString,
binding.root.multiple_choice_content_text_view
)
binding.root.multiple_choice_content_text_view.text = htmlResult
binding.root.multiple_choice_radio_button.isChecked = selectedPosition == position
binding.root.radio_container.setOnClickListener {
itemSelectedPosition = adapterPosition
selectedAnswerIndex = adapterPosition
notifyDataSetChanged()
}
}
}

override fun getPendingAnswer(): InteractionObject {
val interactionObjectBuilder = InteractionObject.newBuilder()
if (customizationArgs.interactionId == "ItemSelectionInput") {
if (selectedHtmlStringList.size >= 0) {
interactionObjectBuilder.setOfHtmlString = StringList.newBuilder().addAllHtml(selectedHtmlStringList).build()
} else {
if (selectedAnswerIndex >= 0) {
interactionObjectBuilder.nonNegativeInt = selectedAnswerIndex
}

}
}
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
return interactionObjectBuilder.build()
}
}
49 changes: 45 additions & 4 deletions app/src/main/java/org/oppia/app/player/state/StateAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,29 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import org.oppia.app.R
import androidx.databinding.library.baseAdapters.BR
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.content_item.view.*
import kotlinx.android.synthetic.main.interaction_read_only_item.view.*
import kotlinx.android.synthetic.main.numeric_input_interaction_item.view.*
import kotlinx.android.synthetic.main.selection_interaction_item.view.*
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
import kotlinx.android.synthetic.main.state_button_item.view.*
import kotlinx.android.synthetic.main.text_input_interaction_item.view.*
import org.oppia.app.R
import org.oppia.app.databinding.ContentItemBinding
import org.oppia.app.databinding.InteractionReadOnlyItemBinding
import org.oppia.app.databinding.NumericInputInteractionItemBinding
import org.oppia.app.databinding.SelectionInteractionItemBinding
import org.oppia.app.databinding.StateButtonItemBinding
import org.oppia.app.databinding.TextInputInteractionItemBinding
import org.oppia.app.model.InteractionObject
import org.oppia.app.player.state.customview.NumericInputInteractionView
import org.oppia.app.player.state.customview.TextInputInteractionView
import org.oppia.app.player.state.itemviewmodel.ContentViewModel
import org.oppia.app.player.state.itemviewmodel.CustomizationArgsInteractionViewModel
import org.oppia.app.player.state.itemviewmodel.InteractionReadOnlyViewModel
import org.oppia.app.player.state.itemviewmodel.NumericInputInteractionViewModel
import org.oppia.app.player.state.itemviewmodel.SelectionContentViewModel
import org.oppia.app.player.state.itemviewmodel.StateButtonViewModel
import org.oppia.app.player.state.itemviewmodel.TextInputInteractionViewModel
import org.oppia.app.player.state.listener.InputInteractionTextListener
Expand All @@ -37,6 +41,7 @@ const val VIEW_TYPE_INTERACTION_READ_ONLY = 2
const val VIEW_TYPE_NUMERIC_INPUT_INTERACTION = 3
const val VIEW_TYPE_TEXT_INPUT_INTERACTION = 4
const val VIEW_TYPE_STATE_BUTTON = 5
const val VIEW_TYPE_SELECTION_INTERACTION = 6

class StateAdapter(
private val itemList: MutableList<Any>,
Expand All @@ -49,7 +54,7 @@ class StateAdapter(

private var inputInteractionView: Any = StateButtonViewModel

lateinit var stateButtonViewModel: StateButtonViewModel
private lateinit var stateButtonViewModel: StateButtonViewModel

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
Expand Down Expand Up @@ -108,7 +113,18 @@ class StateAdapter(
)
StateButtonViewHolder(binding, interactionListener)
}
else -> throw IllegalArgumentException("Invalid view type") as Throwable
VIEW_TYPE_SELECTION_INTERACTION -> {
val inflater = LayoutInflater.from(parent.context)
val binding =
DataBindingUtil.inflate<SelectionInteractionItemBinding>(
inflater,
R.layout.selection_interaction_item,
parent,
/* attachToParent= */false
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
)
SelectionInteractionViewHolder(binding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}

Expand All @@ -129,6 +145,9 @@ class StateAdapter(
VIEW_TYPE_STATE_BUTTON -> {
(holder as StateButtonViewHolder).bind((itemList[position] as StateButtonViewModel))
}
VIEW_TYPE_SELECTION_INTERACTION -> {
(holder as SelectionInteractionViewHolder).bind((itemList[position] as CustomizationArgsInteractionViewModel))
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
}
}
}

Expand All @@ -138,6 +157,7 @@ class StateAdapter(
is NumericInputInteractionViewModel -> VIEW_TYPE_NUMERIC_INPUT_INTERACTION
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
is TextInputInteractionViewModel -> VIEW_TYPE_TEXT_INPUT_INTERACTION
is InteractionReadOnlyViewModel -> VIEW_TYPE_INTERACTION_READ_ONLY
is CustomizationArgsInteractionViewModel -> VIEW_TYPE_SELECTION_INTERACTION
is StateButtonViewModel -> {
stateButtonViewModel = itemList[position] as StateButtonViewModel
VIEW_TYPE_STATE_BUTTON
Expand Down Expand Up @@ -231,6 +251,27 @@ class StateAdapter(
}
}

inner class SelectionInteractionViewHolder(
val binding: ViewDataBinding
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
) : RecyclerView.ViewHolder(binding.root) {
internal fun bind(customizationArgs: CustomizationArgsInteractionViewModel) {
val items: Array<String>?
val choiceContentList: MutableList<SelectionContentViewModel> = ArrayList()
binding.executePendingBindings()
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
val gaeCustomArgsInString = customizationArgs.choiceItems.toString().replace("[", "").replace("]", "")
items = gaeCustomArgsInString.split(",").toTypedArray()
for (values in items) {
val selectionContentViewModel = SelectionContentViewModel()
selectionContentViewModel.htmlContent = values
selectionContentViewModel.isAnswerSelected = false
choiceContentList.add(selectionContentViewModel)
}
val interactionAdapter =
InteractionAdapter(htmlParserFactory, entityType, explorationId, choiceContentList, customizationArgs)
binding.root.selection_interaction_recyclerview.adapter = interactionAdapter
}
}

override fun doesTextExists(textExists: Boolean) {
if (textExists) {
stateButtonViewModel.isInteractionButtonActive.set(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import org.oppia.app.player.audio.CellularDataDialogFragment
import org.oppia.app.player.exploration.EXPLORATION_ACTIVITY_TOPIC_ID_ARGUMENT_KEY
import org.oppia.app.player.exploration.ExplorationActivity
import org.oppia.app.player.state.itemviewmodel.ContentViewModel
import org.oppia.app.player.state.itemviewmodel.CustomizationArgsInteractionViewModel
import org.oppia.app.player.state.itemviewmodel.InteractionReadOnlyViewModel
import org.oppia.app.player.state.itemviewmodel.NumericInputInteractionViewModel
import org.oppia.app.player.state.itemviewmodel.StateButtonViewModel
Expand All @@ -41,6 +42,7 @@ import javax.inject.Inject

private const val TAG_CELLULAR_DATA_DIALOG = "CELLULAR_DATA_DIALOG"
private const val TAG_AUDIO_FRAGMENT = "AUDIO_FRAGMENT"
private const val TAG_STATE_FRAGMENT = "STATE_FRAGMENT"

const val CONTINUE = "Continue"
const val END_EXPLORATION = "EndExploration"
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
Expand Down Expand Up @@ -97,7 +99,7 @@ class StateFragmentPresenter @Inject constructor(
useCellularData = prefs.useCellularData
}
})
explorationId = fragment.arguments!!.getString(EXPLORATION_ACTIVITY_TOPIC_ID_ARGUMENT_KEY)
explorationId = fragment.arguments!!.getString(EXPLORATION_ACTIVITY_TOPIC_ID_ARGUMENT_KEY)!!

stateAdapter = StateAdapter(itemList, this as InteractionListener, htmlParserFactory, entityType, explorationId)

Expand Down Expand Up @@ -424,8 +426,42 @@ class StateFragmentPresenter @Inject constructor(
TEXT_INPUT -> {
addTextInputItem()
}
MULTIPLE_CHOICE_INPUT -> {
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
addMultipleChoiceInputItem()
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
}
ITEM_SELECT_INPUT -> {
addMultipleChoiceInputItem()
}
}
}
}

private fun addMultipleChoiceInputItem() {
val customizationArgsMap: Map<String, InteractionObject> =
currentEphemeralState.get()!!.state.interaction.customizationArgsMap
val multipleChoiceInputInteractionViewModel = CustomizationArgsInteractionViewModel()
val allKeys: Set<String> = customizationArgsMap.keys

for (key in allKeys) {
logger.d(TAG_STATE_FRAGMENT, key)
}
when {
customizationArgsMap.contains("choices") -> {
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
when {
customizationArgsMap.contains("maxAllowableSelectionCount") -> {
multipleChoiceInputInteractionViewModel.maxAllowableSelectionCount =
currentEphemeralState.get()!!.state.interaction.customizationArgsMap["maxAllowableSelectionCount"]!!.signedInt
multipleChoiceInputInteractionViewModel.minAllowableSelectionCount =
currentEphemeralState.get()!!.state.interaction.customizationArgsMap["minAllowableSelectionCount"]!!.signedInt
}
}
multipleChoiceInputInteractionViewModel.interactionId = currentEphemeralState.get()!!.state.interaction.id
multipleChoiceInputInteractionViewModel.choiceItems =
currentEphemeralState.get()!!.state.interaction.customizationArgsMap["choices"]!!.setOfHtmlString.htmlList
}
}
itemList.add(multipleChoiceInputInteractionViewModel)
stateAdapter.notifyDataSetChanged()
}

private fun addNumericInputItem() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.oppia.app.player.state.itemviewmodel

import androidx.lifecycle.ViewModel
import org.oppia.app.fragment.FragmentScope
import javax.inject.Inject

/** [ObservableViewModel] for multiple or item-selection input choice list. */
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
@FragmentScope
class CustomizationArgsInteractionViewModel @Inject constructor() : ViewModel() {
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
veena14cs marked this conversation as resolved.
Show resolved Hide resolved

var choiceItems: MutableList<String>? = null
var interactionId: String = ""
var maxAllowableSelectionCount: Int = 0
var minAllowableSelectionCount: Int = 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.oppia.app.player.state.itemviewmodel

import androidx.lifecycle.ViewModel
import org.oppia.app.fragment.FragmentScope
import javax.inject.Inject

/** [ObservableViewModel] for MultipleChoiceInput values or ItemSelectionInput values. */
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
@FragmentScope
class SelectionContentViewModel @Inject constructor() : ViewModel() {
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
var htmlContent: String =""
veena14cs marked this conversation as resolved.
Show resolved Hide resolved
var isAnswerSelected = false
}
Loading