Skip to content

Commit ba23e4d

Browse files
committed
created SettingsMiddleware and LocalSettingsRepository
1 parent b72b830 commit ba23e4d

File tree

19 files changed

+291
-39
lines changed

19 files changed

+291
-39
lines changed

app/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
repositories {
2+
maven{ url "https://dl.bintray.com/russhwolf/multiplatform-settings" }
3+
}
14
apply plugin: 'com.android.application'
25

36
apply plugin: 'kotlin-android'
@@ -23,6 +26,10 @@ android {
2326
minifyEnabled false
2427
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2528
}
29+
debug {
30+
// MPP libraries don't currently get this resolution automatically
31+
matchingFallbacks = ['release']
32+
}
2633
}
2734
packagingOptions {
2835
exclude 'META-INF/*.kotlin_module'
@@ -55,6 +62,7 @@ dependencies {
5562
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
5663
implementation project(':common')
5764
implementation 'nl.dionsegijn:konfetti:1.1.2'
65+
implementation "com.russhwolf:multiplatform-settings:0.2"
5866

5967
kapt 'com.github.bumptech.glide:compiler:4.8.0'
6068
testImplementation 'junit:junit:4.12'

app/src/test/java/com/willowtreeapps/namegame/ReducersTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ class ReducersTest {
125125
assertEquals(10, final.questionClock)
126126
}
127127

128+
@Test
129+
fun `ChangeNumQuestionsAction should update AppState`() {
130+
val initial = generateInitialTestState()
131+
132+
val final = reducer(initial, Actions.ChangeNumQuestionsSettingsAction(10))
133+
134+
assertEquals(10, final.settings.numQuestions)
135+
136+
}
137+
128138
private fun generateInitialTestState(): AppState {
129139
val initialState = reducer(AppState(), Actions.FetchingProfilesSuccessAction(MockRepositoryFactory.getValidResponse()))
130140
return initialState

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ buildscript {
1010
maven { url 'https://dl.bintray.com/jetbrains/kotlin-native-dependencies' }
1111
}
1212
dependencies {
13+
// classpath 'com.android.tools.build:gradle:3.3.2'
1314
classpath 'com.android.tools.build:gradle:3.5.0-alpha10'
1415
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
1516
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlinVersion"
@@ -25,6 +26,7 @@ allprojects {
2526
mavenCentral()
2627
maven { url "https://jitpack.io" }
2728
maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
29+
maven { url "https://dl.bintray.com/russhwolf/multiplatform-settings" }
2830
maven { url "https://kotlin.bintray.com/kotlinx" }
2931
maven { url "https://dl.bintray.com/kotlin/ktor" }
3032
maven { url "https://dl.bintray.com/soywiz/soywiz" }

common/build.gradle

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
1-
//plugins {
2-
// id("org.jetbrains.kotlin.native.cocoapods")
3-
//}
41
repositories {
52
maven { url "https://dl.bintray.com/soywiz/soywiz" }
63
}
74

8-
apply plugin: 'kotlin-multiplatform'
95
apply plugin: 'com.android.library'
6+
apply plugin: 'kotlin-multiplatform'
107
apply plugin: 'kotlinx-serialization'
118

12-
13-
14-
15-
169
kotlin {
1710

18-
android {
19-
compilations.all {
20-
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { task ->
21-
kotlinOptions {
22-
freeCompilerArgs = ['-Xuse-experimental=kotlin.Experimental']
23-
}
24-
}
25-
}
26-
publishLibraryVariants("release")
27-
}
11+
12+
// android {
13+
// compilations.all {
14+
// tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { task ->
15+
// kotlinOptions {
16+
// freeCompilerArgs = ['-Xuse-experimental=kotlin.Experimental']
17+
// }
18+
// }
19+
// }
20+
// publishLibraryVariants("release")
21+
// }
2822

2923
// iosArm64("ios")
3024
// iosX64("iosSim")
@@ -39,24 +33,34 @@ kotlin {
3933
// }
4034
//
4135
targets {
42-
fromPreset(presets.jvm, 'jvm')
36+
// fromPreset(presets.jvm, 'jvm')
4337

4438
// fromPreset(presets.android, 'androidMain')
39+
fromPreset(presets.android, 'android')
40+
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
41+
? presets.iosArm64 : presets.iosX64
42+
43+
fromPreset(iOSTarget, 'ios') {
44+
binaries {
45+
framework('shared')
46+
}
47+
}
4548

4649
// Change to `presets.iosArm64` to deploy the app to iPhone
4750
// Change to `presets.iosX64` to deploy the app to iPhone
48-
fromPreset(presets.iosX64, 'ios') {
51+
// fromPreset(presets.iosX64, 'ios') {
4952
// fromPreset(presets.iosArm64, 'ios') {
50-
compilations.main.outputKinds('FRAMEWORK')
51-
}
53+
// compilations.main.outputKinds('FRAMEWORK')
54+
// }
5255
}
5356
sourceSets {
5457
commonMain {
5558
dependencies {
56-
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
59+
api 'org.jetbrains.kotlin:kotlin-stdlib'
5760
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutinesVersion"
5861
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serializationVersion"
5962
implementation "io.ktor:ktor-client-logging:$ktorVersion"
63+
implementation "com.russhwolf:multiplatform-settings:0.2"
6064

6165

6266
implementation "io.ktor:ktor-client-core:$ktorVersion"
@@ -72,7 +76,7 @@ kotlin {
7276
}
7377
androidMain {
7478
dependencies {
75-
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
79+
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
7680
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
7781

7882
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion"
@@ -113,17 +117,22 @@ kotlin {
113117
}
114118
}
115119

116-
iosSimMain.dependsOn iosMain
117-
iosSimTest.dependsOn iosTest
120+
// iosSimMain.dependsOn iosMain
121+
// iosSimTest.dependsOn iosTest
118122
}
119123
}
120124

121125
android {
122-
compileSdkVersion 27
126+
compileSdkVersion 28
123127
defaultConfig {
124128
minSdkVersion 15
125129
}
126130
buildTypes {
131+
//This is for MultiplatformSettings
132+
debug {
133+
// MPP libraries don't currently get this resolution automatically
134+
matchingFallbacks = ['release']
135+
}
127136
release {
128137
minifyEnabled true
129138
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
@@ -136,7 +145,6 @@ android {
136145
// Xcode runs this task itself during its build process when we configure it.
137146
// make sure all Gradle infrastructure exists (gradle.wrapper, gradlew)
138147
//and gradlw is in executable mode (chmod +x gradlew)
139-
140148
task packForXCode(type: Sync) {
141149
final File frameworkDir = new File(buildDir, "xcode-frameworks")
142150
final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.willowtreeapps.common.repo
2+
3+
import android.app.Application
4+
import android.content.Context
5+
import com.russhwolf.settings.PlatformSettings
6+
7+
8+
9+
actual fun userSettings(context: Any?) = PlatformSettings.Factory(context as Context).create()

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ sealed class Actions : Action {
2222
class DecrementCountDownAction
2323
class TimesUpAction
2424

25+
class LoadAllSettingsAction
26+
class ChangeNumQuestionsSettingsAction(val num: Int)
27+
2528
}
2629

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ data class AppState(val isLoadingProfiles: Boolean = false,
77
val errorLoadingProfiles: Boolean = false,
88
val errorMsg: String = "",
99
val currentQuestionIndex: Int = 0,
10-
val numQuestions: Int = 3,
1110
val waitingForNextQuestion: Boolean = false,
1211
val waitingForResultsTap: Boolean = false,
1312
val questionClock: Int = 0,
14-
val questions: List<Question> = listOf()) {
13+
val questions: List<Question> = listOf(),
14+
val settings: UserSettings = UserSettings.defaults()) {
1515
companion object {
1616
val INITIAL_STATE = AppState()
1717
}
@@ -51,3 +51,9 @@ data class Question(val profileId: ProfileId,
5151
}
5252
}
5353

54+
data class UserSettings(val numQuestions: Int) {
55+
companion object {
56+
fun defaults() = UserSettings(3)
57+
}
58+
}
59+

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,34 @@ import com.beyondeye.reduks.middlewares.applyMiddleware
55
import com.beyondeye.reduks.middlewares.thunkMiddleware
66
import com.willowtreeapps.common.middleware.NavigationMiddleware
77
import com.willowtreeapps.common.middleware.Navigator
8+
import com.willowtreeapps.common.middleware.SettingsMiddleware
89
import com.willowtreeapps.common.middleware.ViewEffectsMiddleware
10+
import com.willowtreeapps.common.repo.LocalStorageSettingsRepository
11+
import com.willowtreeapps.common.repo.userSettings
912
import com.willowtreeapps.common.util.VibrateUtil
1013
import kotlin.coroutines.CoroutineContext
1114

12-
class GameEngine(navigator: Navigator, application: Any = Any(),
15+
class GameEngine(navigator: Navigator,
16+
application: Any = Any(),
1317
networkContext: CoroutineContext,
1418
uiContext: CoroutineContext) {
1519
private val navigationMiddleware = NavigationMiddleware(navigator)
1620
private val viewEffectsMiddleware = ViewEffectsMiddleware()
1721
private val presenterFactory by lazy { PresenterFactory(this, networkContext) }
1822
val vibrateUtil = VibrateUtil(application)
23+
private val settingsMiddleware by lazy { SettingsMiddleware(LocalStorageSettingsRepository(userSettings(application))) }
1924

2025
val appStore by lazy {
2126
SimpleStore(AppState.INITIAL_STATE, ::reducer)
2227
.applyMiddleware(::thunkMiddleware,
2328
viewEffectsMiddleware::dispatch,
24-
navigationMiddleware::dispatch)
29+
navigationMiddleware::dispatch,
30+
settingsMiddleware::dispatch)
2531
}
2632

33+
init {
34+
appStore.dispatch(Actions.LoadAllSettingsAction())
35+
}
2736
fun attachView(view: View): Presenter<out View?> = presenterFactory.attachView(view)
2837

2938
fun detachView(view: View) = presenterFactory.detachView(view)

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ fun reducer(state: AppState, action: Any): AppState =
1414
when (action) {
1515
is FetchingProfilesStartedAction -> state.copy(isLoadingProfiles = true)
1616
is FetchingProfilesSuccessAction -> {
17-
val rounds = generateRounds(action.profiles, state.numQuestions)
17+
val rounds = generateRounds(action.profiles, state.settings.numQuestions)
1818
state.copy(isLoadingProfiles = false, profiles = action.profiles, questions = rounds)
1919
}
2020
is FetchingProfilesFailedAction -> state.copy(isLoadingProfiles = false, errorLoadingProfiles = true, errorMsg = action.message)
@@ -40,6 +40,8 @@ fun reducer(state: AppState, action: Any): AppState =
4040
state.copy(questions = newQuestions, waitingForNextQuestion = true, questionClock = -1)
4141
}
4242

43+
is ChangeNumQuestionsSettingsAction -> state.copy(settings = state.settings.copy(numQuestions = action.num))
44+
4345
else -> throw AssertionError("Action ${action::class.simpleName} not handled")
4446
}
4547

0 commit comments

Comments
 (0)