Made entire code independent of individual components/problems/solutions.

Adding more components/problems/solutions only requires changes
in resource files and in the respective enum classes now.

Furthermore, enums can now be inferred from spinner options directly.
It is no longer needed to convert cases.
This commit is contained in:
Jim Martens 2019-07-20 20:13:09 +02:00
parent 36cb8fa2ab
commit d1b6829655
6 changed files with 93 additions and 76 deletions

View File

@ -2,11 +2,11 @@ package de.twomartens.troubleshooting
class Message(val message: String, val sent: Boolean, val createdAt: Long)
class SpinnerOption(val text: String, val type: OptionType) {
class SpinnerOption(val id: String, val text: String, val type: OptionType) {
companion object Factory {
fun getOptions(strings: Array<String>, type: OptionType): Array<SpinnerOption> {
fun getOptions(ids: Array<String>, strings: Array<String>, type: OptionType): Array<SpinnerOption> {
return Array(strings.size) {
SpinnerOption(strings[it], type)
SpinnerOption(ids[it], strings[it], type)
}
}
}

View File

@ -106,6 +106,7 @@ class MessageListActivity : AppCompatActivity() {
val isInitialized = model.initialized.value
return if (isInitialized != null && !isInitialized) {
model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.components_values),
resources.getStringArray(R.array.components),
OptionType.COMPONENT))
adapter.notifyDataSetChanged()
@ -122,7 +123,7 @@ class MessageListActivity : AppCompatActivity() {
sendMessage(selectedOption, model, recyclerView, horizontalLayout)
val messages = branch(
selectedOption,
model, adapter, ::getSolutionArray,
model, adapter,
::componentSelected,
::problemSelected,
::yesNoSelected,
@ -173,10 +174,8 @@ class MessageListActivity : AppCompatActivity() {
private fun branch(selectedOption: SpinnerOption,
model: MessageListViewModel,
adapter: ArrayAdapter<SpinnerOption>,
getSolutionArray: (String) -> Array<String>,
componentSelected: (MessageListViewModel, ArrayAdapter<SpinnerOption>) -> List<Message>,
problemSelected: (MessageListViewModel, ArrayAdapter<SpinnerOption>,
(String) -> Array<String>) -> List<Message>,
problemSelected: (MessageListViewModel, ArrayAdapter<SpinnerOption>) -> List<Message>,
yesNoSelected: (SpinnerOption,
MessageListViewModel,
ArrayAdapter<SpinnerOption>,
@ -204,12 +203,12 @@ class MessageListActivity : AppCompatActivity() {
return when (selectedOption.type) {
OptionType.COMPONENT -> {
model.component.value = Component.valueOf(selectedOption.text.replace(' ', '_').toUpperCase())
model.component.value = Component.valueOf(selectedOption.id)
componentSelected(model, adapter)
}
OptionType.PROBLEM -> {
model.problem.value = Problem.valueOf(selectedOption.text.replace(' ', '_').toUpperCase())
problemSelected(model, adapter, getSolutionArray)
model.problem.value = Problem.valueOf(selectedOption.id)
problemSelected(model, adapter)
}
OptionType.BINARY -> {
yesNoSelected(selectedOption, model, adapter,
@ -219,7 +218,7 @@ class MessageListActivity : AppCompatActivity() {
}
OptionType.STORY -> {
doNotShowSpinner()
if (selectedOption.text == getString(R.string.who_are_you)) {
if (selectedOption.id == "WHO_ARE_YOU") {
listOf(
Message(
getString(R.string.gardner_second),
@ -241,23 +240,16 @@ class MessageListActivity : AppCompatActivity() {
private fun componentSelected(model: MessageListViewModel, adapter: ArrayAdapter<SpinnerOption>): List<Message> {
model.spinnerOptions.value?.clear()
when (model.component.value) {
Component.PRINTER -> model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.printer_problems),
OptionType.PROBLEM))
Component.PC -> model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.pc_problems),
OptionType.PROBLEM))
Component.MONITOR -> model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.monitor_problems),
OptionType.PROBLEM))
Component.TV -> model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.tv_problems),
OptionType.PROBLEM))
Component.ROUTER -> model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.router_problems),
OptionType.PROBLEM))
}
model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(resources.getIdentifier(
model.component.value?.name.plus("_problems_values"),
"array",
packageName)),
resources.getStringArray(resources.getIdentifier(
model.component.value?.name.plus("_problems"),
"array",
packageName)),
OptionType.PROBLEM))
adapter.notifyDataSetChanged()
return listOf(
@ -266,17 +258,18 @@ class MessageListActivity : AppCompatActivity() {
)
}
private fun problemSelected(model: MessageListViewModel, adapter: ArrayAdapter<SpinnerOption>,
getSolutionArray: (String) -> Array<String>): List<Message> {
val format = "component_problem"
val stringName = format.replace("component", model.component.value.toString().toLowerCase()).
replace("problem", model.problem.value.toString().toLowerCase().replace(' ', '_'))
model.solutions.value?.addAll(getSolutionArray(stringName))
private fun problemSelected(model: MessageListViewModel, adapter: ArrayAdapter<SpinnerOption>): List<Message> {
model.solutions.value?.addAll(resources.getStringArray(resources.getIdentifier(
model.component.value?.name.plus("_").plus(model.problem.value?.name),
"array",
packageName
)))
val firstSolutionQuestion = getString(R.string.have_you_tried, model.solutions.value?. let { it[0] })
model.nextSolutionIndex.value = (model.nextSolutionIndex.value ?: 0) + 1
model.spinnerOptions.value?.clear()
model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.binary_values),
resources.getStringArray(R.array.binary),
OptionType.BINARY))
adapter.notifyDataSetChanged()
@ -315,8 +308,8 @@ class MessageListActivity : AppCompatActivity() {
private fun triedAnswer(selection: SpinnerOption, model: MessageListViewModel,
didItWorkQuestion: (MessageListViewModel) -> List<Message>,
pleaseTry: () -> List<Message>): List<Message> {
return when (selection.text) {
"yes" -> didItWorkQuestion(model)
return when (selection.id) {
"YES" -> didItWorkQuestion(model)
else -> pleaseTry()
}
}
@ -324,8 +317,8 @@ class MessageListActivity : AppCompatActivity() {
private fun doesItWorkAnswer(selection: SpinnerOption, model: MessageListViewModel, adapter: ArrayAdapter<SpinnerOption>,
problemSolved: (MessageListViewModel, ArrayAdapter<SpinnerOption>) -> List<Message>,
nextSolutionQuestion: (MessageListViewModel, ArrayAdapter<SpinnerOption>) -> List<Message>): List<Message> {
return when (selection.text) {
"yes" -> problemSolved(model, adapter)
return when (selection.id) {
"YES" -> problemSolved(model, adapter)
else -> nextSolutionQuestion(model, adapter)
}
}
@ -349,7 +342,10 @@ class MessageListActivity : AppCompatActivity() {
private fun problemSolved(model: MessageListViewModel, adapter: ArrayAdapter<SpinnerOption>): List<Message> {
model.spinnerOptions.value?.clear()
model.spinnerOptions.value?.add(SpinnerOption(getString(R.string.can_you_say_sth_different), OptionType.STORY))
model.spinnerOptions.value?.add(SpinnerOption(
"SAY_SOMETHING_DIFFERENT",
getString(R.string.can_you_say_sth_different),
OptionType.STORY))
adapter.notifyDataSetChanged()
return listOf(Message(getString(R.string.okay), false, System.currentTimeMillis()))
}
@ -371,7 +367,10 @@ class MessageListActivity : AppCompatActivity() {
}
model.spinnerOptions.value?.clear()
model.spinnerOptions.value?.add(SpinnerOption(getString(R.string.who_are_you), OptionType.STORY))
model.spinnerOptions.value?.add(SpinnerOption(
"WHO_ARE_YOU",
getString(R.string.who_are_you),
OptionType.STORY))
adapter.notifyDataSetChanged()
return listOf(
@ -389,7 +388,10 @@ class MessageListActivity : AppCompatActivity() {
model.nextSolutionIndex.value = (model.nextSolutionIndex.value ?: 0) + 1
model.currentSolutionState.value = State.HAVE_YOU_TRIED
model.spinnerOptions.value?.clear()
model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(resources.getStringArray(R.array.binary), OptionType.BINARY))
model.spinnerOptions.value?.addAll(SpinnerOption.getOptions(
resources.getStringArray(R.array.binary_values),
resources.getStringArray(R.array.binary),
OptionType.BINARY))
adapter.notifyDataSetChanged()
return listOf(
@ -399,24 +401,4 @@ class MessageListActivity : AppCompatActivity() {
)
}
}
private fun getSolutionArray(stringName: String): Array<String> {
return when (stringName) {
"printer_wrong_colour_printed" -> resources.getStringArray(R.array.printer_wrong_colour_printed)
"printer_weird_sounds_when_printing" -> resources.getStringArray(R.array.printer_weird_sounds_when_printing)
//
"pc_does_not_boot" -> resources.getStringArray(R.array.pc_does_not_boot)
"pc_mouse_does_not_react" -> resources.getStringArray(R.array.pc_mouse_does_not_react)
//
"monitor_black_blobs_visible" -> resources.getStringArray(R.array.monitor_black_blobs_visible)
"monitor_no_image_visible" -> resources.getStringArray(R.array.monitor_no_image_visible)
//
"router_no_internet_connection" -> resources.getStringArray(R.array.router_no_internet_connection)
"router_wifi_does_not_work" -> resources.getStringArray(R.array.router_wifi_does_not_work)
//
"tv_no_channels_available" -> resources.getStringArray(R.array.tv_no_channels_available)
"tv_bad_image_quality" -> resources.getStringArray(R.array.tv_bad_image_quality)
else -> arrayOf("")
}
}
}

View File

@ -12,4 +12,11 @@
<item>Router</item>
<item>TV</item>
</string-array>
<string-array name="components_values">
<item>MONITOR</item>
<item>PC</item>
<item>PRINTER</item>
<item>ROUTER</item>
<item>TV</item>
</string-array>
</resources>

View File

@ -1,22 +1,46 @@
<resources>
<string-array name="printer_problems">
<string-array name="PRINTER_problems">
<item>Wrong colour printed</item>
<item>Weird sounds when printing</item>
</string-array>
<string-array name="pc_problems">
<string-array name="PRINTER_problems_values">
<item>WRONG_COLOUR_PRINTED</item>
<item>WEIRD_SOUNDS_WHEN_PRINTING</item>
</string-array>
<string-array name="PC_problems">
<item>Does not boot</item>
<item>Mouse does not react</item>
</string-array>
<string-array name="monitor_problems">
<string-array name="PC_problems_values">
<item>DOES_NOT_BOOT</item>
<item>MOUSE_DOES_NOT_REACT</item>
</string-array>
<string-array name="MONITOR_problems">
<item>Black blobs visible</item>
<item>No image visible</item>
</string-array>
<string-array name="router_problems">
<string-array name="MONITOR_problems_values">
<item>BLACK_BLOBS_VISIBLE</item>
<item>NO_IMAGE_VISIBLE</item>
</string-array>
<string-array name="ROUTER_problems">
<item>No internet connection</item>
<item>WiFi does not work</item>
</string-array>
<string-array name="tv_problems">
<string-array name="ROUTER_problems_values">
<item>NO_INTERNET_CONNECTION</item>
<item>WIFI_DOES_NOT_WORK</item>
</string-array>
<string-array name="TV_problems">
<item>No channels available</item>
<item>Bad image quality</item>
</string-array>
<string-array name="TV_problems_values">
<item>NO_CHANNELS_AVAILABLE</item>
<item>BAD_IMAGE_QUALITY</item>
</string-array>
</resources>

View File

@ -1,38 +1,38 @@
<resources>
<string-array name="printer_wrong_colour_printed">
<string-array name="PRINTER_WRONG_COLOUR_PRINTED">
<item>running the maintenance</item>
</string-array>
<string-array name="printer_weird_sounds_when_printing">
<string-array name="PRINTER_WEIRD_SOUNDS_WHEN_PRINTING">
<item>turning it off and on again</item>
</string-array>
<string-array name="pc_does_not_boot">
<string-array name="PC_DOES_NOT_BOOT">
<item>turning it off and on again</item>
</string-array>
<string-array name="pc_mouse_does_not_react">
<string-array name="PC_MOUSE_DOES_NOT_REACT">
<item>reconnecting the mouse</item>
</string-array>
<string-array name="monitor_black_blobs_visible">
<string-array name="MONITOR_BLACK_BLOBS_VISIBLE">
<item>turning it off and on again</item>
<item>reconnecting the monitor</item>
</string-array>
<string-array name="monitor_no_image_visible">
<string-array name="MONITOR_NO_IMAGE_VISIBLE">
<item>turning it off and on again</item>
<item>reconnecting the monitor</item>
</string-array>
<string-array name="router_no_internet_connection">
<string-array name="ROUTER_NO_INTERNET_CONNECTION">
<item>reconnecting the router</item>
</string-array>
<string-array name="router_wifi_does_not_work">
<string-array name="ROUTER_WIFI_DOES_NOT_WORK">
<item>turning the WiFi off and on again</item>
</string-array>
<string-array name="tv_no_channels_available">
<string-array name="TV_NO_CHANNELS_AVAILABLE">
<item>running the channel search</item>
</string-array>
<string-array name="tv_bad_image_quality">
<string-array name="TV_BAD_IMAGE_QUALITY">
<item>reconnecting the TV</item>
</string-array>
</resources>

View File

@ -26,4 +26,8 @@
<item>yes</item>
<item>no</item>
</string-array>
<string-array name="binary_values">
<item>YES</item>
<item>NO</item>
</string-array>
</resources>