Skip to content

Commit 6ae0cd4

Browse files
author
Patrick Jackson
committed
voice mode working on iOS and debounce function added;
1 parent 3118a57 commit 6ae0cd4

File tree

25 files changed

+163
-136
lines changed

25 files changed

+163
-136
lines changed

android/src/main/java/com/willowtreeapps/namegame/store/BaseNameGameViewFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ package com.willowtreeapps.namegame.store
33
import android.os.Bundle
44
import androidx.fragment.app.Fragment
55
import com.willowtreeapps.common.Logger
6-
import com.willowtreeapps.common.Presenter
7-
import com.willowtreeapps.common.View
8-
import com.willowtreeapps.common.ui.GameResultsPresenter
6+
import com.willowtreeapps.common.ui.Presenter
7+
import com.willowtreeapps.common.ui.View
98
import com.willowtreeapps.namegame.NameGameApp
109
import kotlinx.coroutines.CoroutineScope
1110
import kotlinx.coroutines.Dispatchers

android/src/main/java/com/willowtreeapps/namegame/store/GameResultsFragment.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ class GameResultsFragment : BaseNameGameViewFragment<GameResultsPresenter>(), Ga
3030
}
3131

3232
override fun showResults(viewState: GameResultsViewState) {
33-
activity?.runOnUiThread {
34-
txt_questionTitle.text = viewState.resultsText
35-
txt_message.text = viewState.messageText
36-
}
33+
txt_questionTitle.text = viewState.resultsText
34+
txt_message.text = viewState.messageText
3735
}
3836

3937
override fun onBackPressed(): Boolean {

android/src/main/java/com/willowtreeapps/namegame/store/StartFragment.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,10 @@ class StartFragment : Fragment(), CoroutineScope, StartView {
2626

2727
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2828
btn_start.setOnClickListener {
29-
activity?.runOnUiThread {
30-
presenter?.startGame()
31-
}
29+
presenter?.startGame()
3230
}
3331
btn_settings.setOnClickListener {
34-
activity?.runOnUiThread {
35-
presenter?.settingsTapped()
36-
}
32+
presenter?.settingsTapped()
3733
}
3834
}
3935

@@ -48,20 +44,14 @@ class StartFragment : Fragment(), CoroutineScope, StartView {
4844
}
4945

5046
override fun hideLoading() {
51-
activity?.runOnUiThread {
52-
loading_spinner.visibility = View.GONE
53-
}
47+
loading_spinner.visibility = View.GONE
5448
}
5549

5650
override fun showLoading() {
57-
activity?.runOnUiThread {
58-
loading_spinner.visibility = View.VISIBLE
59-
}
51+
loading_spinner.visibility = View.VISIBLE
6052
}
6153

6254
override fun showError(msg: String) {
63-
activity?.runOnUiThread {
64-
txt_error.text = msg
65-
}
55+
txt_error.text = msg
6656
}
6757
}

android/src/test/java/com/willowtreeapps/namegame/DebouceTest.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
package com.willowtreeapps.namegame
22

33
import com.willowtreeapps.common.util.debounce
4+
import kotlinx.coroutines.runBlocking
45
import org.junit.Assert.assertEquals
56
import org.junit.Test
67

78
class DebounceTest {
89
@Test
910
fun `does not call if within delay time`() {
1011
var ct = 0
11-
val f: ()-> Unit = { ct++ }
12-
val debounceFun = debounce( f = f)
13-
debounceFun()
14-
debounceFun()
12+
runBlocking {
13+
val f: (Unit) -> Unit = { ct++ }
14+
val debounceFun = debounce(coroutineContext = this.coroutineContext, f = f)
15+
debounceFun(Unit)
16+
debounceFun(Unit)
17+
debounceFun(Unit)
18+
debounceFun(Unit)
19+
debounceFun(Unit)
20+
debounceFun(Unit)
21+
}
1522
assertEquals(1, ct)
16-
1723
}
1824

1925
// @Test
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.willowtreeapps.common.util
2+
3+
actual fun isAndroid(): Boolean = true

common/src/commonMain/kotlin/com/willowtreeapps/common/AppState.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.willowtreeapps.common
22

3+
import com.willowtreeapps.common.repo.GameResultResponses
4+
35
data class AppState(val isLoadingItems: Boolean = false,
46
val items: List<Item> = listOf(),
57
val errorLoadingItems: Boolean = false,
@@ -8,6 +10,7 @@ data class AppState(val isLoadingItems: Boolean = false,
810
val waitingForNextQuestion: Boolean = false,
911
val questionClock: Int = -1,
1012
val questionTitle: String = "",
13+
val gameResultResponses: GameResultResponses = GameResultResponses(),
1114
val questions: List<Question> = listOf(),
1215
val settings: UserSettings = UserSettings.defaults()) {
1316
companion object {

common/src/commonMain/kotlin/com/willowtreeapps/common/GameEngine.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import com.willowtreeapps.common.middleware.SettingsMiddleware
99
import com.willowtreeapps.common.middleware.ViewEffectsMiddleware
1010
import com.willowtreeapps.common.repo.LocalStorageSettingsRepository
1111
import com.willowtreeapps.common.repo.userSettings
12+
import com.willowtreeapps.common.ui.Presenter
13+
import com.willowtreeapps.common.ui.PresenterFactory
14+
import com.willowtreeapps.common.ui.View
1215
import com.willowtreeapps.common.util.VibrateUtil
1316
import kotlinx.coroutines.CoroutineScope
1417
import kotlinx.coroutines.launch
@@ -17,7 +20,7 @@ import kotlin.coroutines.CoroutineContext
1720
class GameEngine(navigator: Navigator,
1821
application: Any = Any(),
1922
networkContext: CoroutineContext,
20-
private val uiContext: CoroutineContext) {
23+
val uiContext: CoroutineContext) {
2124
private val navigationMiddleware = NavigationMiddleware(navigator)
2225
private val viewEffectsMiddleware = ViewEffectsMiddleware()
2326
private val presenterFactory by lazy { PresenterFactory(this, networkContext) }

common/src/commonMain/kotlin/com/willowtreeapps/common/Reducers.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ fun reducer(state: AppState, action: Any): AppState =
4949
}
5050

5151
val newQuestions = state.questions.toMutableList()
52-
newQuestions[state.currentQuestionIndex] = newQuestions[state.currentQuestionIndex].copy(answerName = answerName, status = status, answerNameInterpretedAs = action.name)
52+
newQuestions[state.currentQuestionIndex] = newQuestions[state.currentQuestionIndex].copy(answerName = answerName,
53+
status = status,
54+
answerNameInterpretedAs = action.name)
5355
state.copy(questions = newQuestions, waitingForNextQuestion = true)
5456
}
5557
is NextQuestionAction -> state.copy(waitingForNextQuestion = false, currentQuestionIndex = state.currentQuestionIndex + 1)

common/src/commonMain/kotlin/com/willowtreeapps/common/boundary/TransformFunctions.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ fun AppState.toQuestionViewState(): QuestionViewState {
1313
val choice3 = currentQuestion?.choices?.get(2)!!.displayName()
1414
val choice4 = currentQuestion?.choices?.get(3)!!.displayName()
1515
val correctBtnNum = currentQuestion?.choices?.indexOfFirst { it.id == item.id }!! + 1
16-
var selectedBtnNum = currentQuestion?.choices?.indexOfFirst { it.equalsDisplayName(currentQuestion?.answerName ?: "") }
16+
var selectedBtnNum = currentQuestion?.choices?.indexOfFirst {
17+
it.equalsDisplayName(currentQuestion?.answerName ?: "")
18+
}
1719
if (selectedBtnNum != null) {
1820
selectedBtnNum += 1
1921
}
@@ -29,18 +31,20 @@ fun AppState.toQuestionViewState(): QuestionViewState {
2931
nextButtonVisible = this.waitingForNextQuestion && !isGameComplete(),
3032
endButtonVisible = isGameComplete(),
3133
timerText = timerText,
32-
selectedBtnNum = selectedBtnNum ?: -1)
34+
selectedBtnNum = selectedBtnNum ?: -1)
3335
}
3436

3537
fun AppState.toGameResultsViewState(): GameResultsViewState {
3638
val percentage = ((numCorrect.toFloat() / questions.size) * 100).toInt()
37-
val messageText = when (percentage) {
38-
100 -> perfectScoreResponses.takeRandom()
39-
in 80..99 -> goodScoreResponses.takeRandom()
40-
in 50..79 -> okScoreResponses.takeRandom()
41-
in 10..49 -> badScoreResponses.takeRandom()
42-
0 -> zeroScoreResponses.takeRandom()
43-
else -> throw IllegalStateException("Error in toGameResultsViewState when statement or invalid game state")
39+
val messageText = with(gameResultResponses) {
40+
when (percentage) {
41+
100 -> perfect
42+
in 80..99 -> good
43+
in 50..79 -> ok
44+
in 10..49 -> bad
45+
0 -> zero
46+
else -> throw IllegalStateException("Error in toGameResultsViewState when statement or invalid game state")
47+
}
4448
}
4549
return GameResultsViewState(resultsText = gameTotals(),
4650
messageText = messageText)

common/src/commonMain/kotlin/com/willowtreeapps/common/repo/ItemRepository.kt

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.willowtreeapps.common.repo
33
import com.willowtreeapps.common.Item
44
import com.willowtreeapps.common.PlatformDispatcher
55
import com.willowtreeapps.common.ItemId
6+
import com.willowtreeapps.common.takeRandom
67

78
/**
89
* interface for providing list of items for the game. Items are generic representation.
@@ -13,7 +14,8 @@ interface ItemRepository {
1314
}
1415

1516
data class ItemsHolder(val questionTitle: String,
16-
val items: List<Item>)
17+
val items: List<Item>,
18+
val gameResultResponses: GameResultResponses = GameResultResponses())
1719

1820
class ProfileItemRepository(val repo: ProfilesRepository = KtorProfilesRepository()) : ItemRepository {
1921
override suspend fun fetchItems(): GatewayResponse<ItemsHolder, GenericError> {
@@ -35,10 +37,10 @@ class DogItemRepository(val repo: KtorDogsRepository = KtorDogsRepository(Platfo
3537
return if (results.isSuccessful) {
3638
val itemsHolder = ItemsHolder(questionTitle = "Name the breed",
3739
items = results.response?.map {
38-
Item(id = ItemId(it.breed + "_" + it.subBreed),
39-
firstName = it.breed, lastName = it.subBreed ?: "",
40-
imageUrl = it.imageUrl)
41-
}!!)
40+
Item(id = ItemId(it.breed + "_" + it.subBreed),
41+
firstName = it.breed, lastName = it.subBreed ?: "",
42+
imageUrl = it.imageUrl)
43+
}!!)
4244
GatewayResponse.createSuccess(itemsHolder, 200, "")
4345
} else {
4446
GatewayResponse.createError(GenericError("Error"), 500, "")
@@ -52,10 +54,10 @@ class CatItemRepository(val repo: KtorCatsRepository = KtorCatsRepository(Platfo
5254
val results = repo.allBreeds()
5355
val itemsHolder = ItemsHolder(questionTitle = "Name the breed",
5456
items = results.response?.map {
55-
Item(id = ItemId(it.id),
56-
firstName = it.breed, lastName = "",
57-
imageUrl = it.imageUrl)
58-
}!!)
57+
Item(id = ItemId(it.id),
58+
firstName = it.breed, lastName = "",
59+
imageUrl = it.imageUrl)
60+
}!!)
5961
return if (results.isSuccessful) {
6062
GatewayResponse.createSuccess(itemsHolder, 200, "")
6163
} else {
@@ -64,3 +66,39 @@ class CatItemRepository(val repo: KtorCatsRepository = KtorCatsRepository(Platfo
6466
}
6567
}
6668

69+
data class GameResultResponses(
70+
val perfect: String = perfectScoreResponses.takeRandom(),
71+
val good: String = goodScoreResponses.takeRandom(),
72+
val ok: String = okScoreResponses.takeRandom(),
73+
val bad: String = badScoreResponses.takeRandom(),
74+
val zero: String = zeroScoreResponses.takeRandom()
75+
)
76+
77+
val perfectScoreResponses = listOf(
78+
"Perfect!!",
79+
"Wow, perfection!",
80+
"Great Job - 100% !!!",
81+
"Ok, you've worked here a while.")
82+
83+
val goodScoreResponses = listOf(
84+
"Nice!!",
85+
"Pretty Good!",
86+
"Good, but you still meet a few folks!!!",
87+
"Good Job!")
88+
89+
val okScoreResponses = listOf(
90+
"Not bad, but you can do better!!",
91+
"Still meeting people?",
92+
"Not that great \nYou could stand some practice.",
93+
"A few more times are I think you'll learn more names.")
94+
95+
val badScoreResponses = listOf(
96+
"Ok, do you even work here??",
97+
"Practice, Practice, Practice. \nYou'll get it!",
98+
"Wow, that is not good. \nNew to the company?",
99+
"No worries, try again!")
100+
101+
val zeroScoreResponses = listOf(
102+
"Did you even try??",
103+
"Not even one correct?? \nWow...want to try again?",
104+
"Even my cat gets a few right....")

0 commit comments

Comments
 (0)