Skip to content

Commit 1e9d4bc

Browse files
authored
Merge pull request #202 from icerockdev/develop
Release 0.14.0
2 parents cae693d + 8bca036 commit 1e9d4bc

File tree

14 files changed

+366
-19
lines changed

14 files changed

+366
-19
lines changed

README.md

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,22 @@ allprojects {
5050
project build.gradle
5151
```groovy
5252
dependencies {
53-
commonMainApi("dev.icerock.moko:mvvm-core:0.13.1") // only ViewModel, EventsDispatcher, Dispatchers.UI
54-
commonMainApi("dev.icerock.moko:mvvm-flow:0.13.1") // api mvvm-core, CFlow for native and binding extensions
55-
commonMainApi("dev.icerock.moko:mvvm-livedata:0.13.1") // api mvvm-core, LiveData and extensions
56-
commonMainApi("dev.icerock.moko:mvvm-state:0.13.1") // api mvvm-livedata, ResourceState class and extensions
57-
commonMainApi("dev.icerock.moko:mvvm-livedata-resources:0.13.1") // api mvvm-core, moko-resources, extensions for LiveData with moko-resources
53+
commonMainApi("dev.icerock.moko:mvvm-core:0.14.0") // only ViewModel, EventsDispatcher, Dispatchers.UI
54+
commonMainApi("dev.icerock.moko:mvvm-flow:0.14.0") // api mvvm-core, CFlow for native and binding extensions
55+
commonMainApi("dev.icerock.moko:mvvm-livedata:0.14.0") // api mvvm-core, LiveData and extensions
56+
commonMainApi("dev.icerock.moko:mvvm-state:0.14.0") // api mvvm-livedata, ResourceState class and extensions
57+
commonMainApi("dev.icerock.moko:mvvm-livedata-resources:0.14.0") // api mvvm-core, moko-resources, extensions for LiveData with moko-resources
58+
commonMainApi("dev.icerock.moko:mvvm-flow-resources:0.14.0") // api mvvm-core, moko-resources, extensions for Flow with moko-resources
5859
59-
androidMainApi("dev.icerock.moko:mvvm-flow-compose:0.13.1") // api mvvm-flow, binding extensions for Jetpack Compose (jvm, js, android)
60-
androidMainApi("dev.icerock.moko:mvvm-livedata-compose:0.13.1") // api mvvm-livedata, binding extensions for Jetpack Compose (jvm, js, android)
61-
androidMainApi("dev.icerock.moko:mvvm-livedata-material:0.13.1") // api mvvm-livedata, Material library android extensions
62-
androidMainApi("dev.icerock.moko:mvvm-livedata-glide:0.13.1") // api mvvm-livedata, Glide library android extensions
63-
androidMainApi("dev.icerock.moko:mvvm-livedata-swiperefresh:0.13.1") // api mvvm-livedata, SwipeRefreshLayout library android extensions
64-
androidMainApi("dev.icerock.moko:mvvm-databinding:0.13.1") // api mvvm-livedata, DataBinding support for Android
65-
androidMainApi("dev.icerock.moko:mvvm-viewbinding:0.13.1") // api mvvm-livedata, ViewBinding support for Android
60+
androidMainApi("dev.icerock.moko:mvvm-flow-compose:0.14.0") // api mvvm-flow, binding extensions for Jetpack Compose (jvm, js, android)
61+
androidMainApi("dev.icerock.moko:mvvm-livedata-compose:0.14.0") // api mvvm-livedata, binding extensions for Jetpack Compose (jvm, js, android)
62+
androidMainApi("dev.icerock.moko:mvvm-livedata-material:0.14.0") // api mvvm-livedata, Material library android extensions
63+
androidMainApi("dev.icerock.moko:mvvm-livedata-glide:0.14.0") // api mvvm-livedata, Glide library android extensions
64+
androidMainApi("dev.icerock.moko:mvvm-livedata-swiperefresh:0.14.0") // api mvvm-livedata, SwipeRefreshLayout library android extensions
65+
androidMainApi("dev.icerock.moko:mvvm-databinding:0.14.0") // api mvvm-livedata, DataBinding support for Android
66+
androidMainApi("dev.icerock.moko:mvvm-viewbinding:0.14.0") // api mvvm-livedata, ViewBinding support for Android
6667
67-
commonTestImplementation("dev.icerock.moko:mvvm-test:0.13.1") // test utilities
68+
commonTestImplementation("dev.icerock.moko:mvvm-test:0.14.0") // test utilities
6869
}
6970
```
7071

@@ -74,10 +75,10 @@ kotlin {
7475
// export correct artifact to use all classes of library directly from Swift
7576
targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java).all {
7677
binaries.withType(org.jetbrains.kotlin.gradle.plugin.mpp.Framework::class.java).all {
77-
export("dev.icerock.moko:mvvm-core:0.13.1")
78-
export("dev.icerock.moko:mvvm-livedata:0.13.1")
79-
export("dev.icerock.moko:mvvm-livedata-resources:0.13.1")
80-
export("dev.icerock.moko:mvvm-state:0.13.1")
78+
export("dev.icerock.moko:mvvm-core:0.14.0")
79+
export("dev.icerock.moko:mvvm-livedata:0.14.0")
80+
export("dev.icerock.moko:mvvm-livedata-resources:0.14.0")
81+
export("dev.icerock.moko:mvvm-state:0.14.0")
8182
}
8283
}
8384
}
@@ -93,7 +94,7 @@ generation enabled. All `LiveData` to `UIView` bindings is extensions for UI ele
9394
To use MOKO MVVM with SwiftUI set name of your kotlin framework to `MultiPlatformLibrary` and add
9495
dependency to CocoaPods:
9596
```ruby
96-
pod 'mokoMvvmFlowSwiftUI', :podspec => 'https://raw.githubusercontent.com/icerockdev/moko-mvvm/release/0.13.1/mokoMvvmFlowSwiftUI.podspec'
97+
pod 'mokoMvvmFlowSwiftUI', :podspec => 'https://raw.githubusercontent.com/icerockdev/moko-mvvm/release/0.14.0/mokoMvvmFlowSwiftUI.podspec'
9798
```
9899
required export of `mvvm-core` and `mvvm-flow`.
99100

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ androidLifecycleVersion = "2.2.0"
44
coroutinesVersion = "1.6.0-native-mt"
55
mokoResourcesVersion = "0.18.0"
66
mokoTestVersion = "0.6.1"
7-
mokoMvvmVersion = "0.13.1"
7+
mokoMvvmVersion = "0.14.0"
88
mokoKSwiftVersion = "0.4.0"
99
composeVersion = "1.1.1"
1010
composeJetBrainsVersion = "1.1.1"
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
plugins {
6+
id("kmm-library-convention")
7+
id("detekt-convention")
8+
id("publication-convention")
9+
}
10+
11+
dependencies {
12+
commonMainApi(projects.mvvmFlow)
13+
commonMainApi(libs.mokoResources)
14+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest package="dev.icerock.moko.mvvm.flow.resources" />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.moko.mvvm.flow.resources
6+
7+
import android.widget.TextView
8+
import androidx.lifecycle.LifecycleOwner
9+
import dev.icerock.moko.mvvm.flow.CStateFlow
10+
import dev.icerock.moko.mvvm.flow.binding.bind
11+
import dev.icerock.moko.resources.desc.StringDesc
12+
import kotlinx.coroutines.DisposableHandle
13+
14+
fun <T : StringDesc?> TextView.bindText(
15+
lifecycleOwner: LifecycleOwner,
16+
flow: CStateFlow<T>
17+
): DisposableHandle {
18+
return flow.bind(lifecycleOwner) { this.text = it?.toString(this.context) }
19+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.moko.mvvm.flow.resources
6+
7+
import dev.icerock.moko.mvvm.flow.CStateFlow
8+
import dev.icerock.moko.mvvm.flow.DisposableHandle
9+
import dev.icerock.moko.mvvm.flow.binding.bind
10+
import dev.icerock.moko.resources.desc.StringDesc
11+
import platform.UIKit.UIButton
12+
import platform.UIKit.UIControlStateNormal
13+
14+
fun <T : StringDesc?> UIButton.bindTitle(
15+
flow: CStateFlow<T>
16+
): DisposableHandle {
17+
return bind(flow) {
18+
this.setTitle(
19+
it?.localized(),
20+
forState = UIControlStateNormal
21+
)
22+
}
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.moko.mvvm.flow.resources
6+
7+
import dev.icerock.moko.mvvm.flow.CStateFlow
8+
import dev.icerock.moko.mvvm.flow.DisposableHandle
9+
import dev.icerock.moko.mvvm.flow.binding.bind
10+
import dev.icerock.moko.resources.desc.StringDesc
11+
import platform.UIKit.UILabel
12+
13+
fun <T : StringDesc?> UILabel.bindText(
14+
flow: CStateFlow<T>
15+
): DisposableHandle {
16+
return bind(flow) { this.text = it?.localized() }
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.moko.mvvm.flow.resources
6+
7+
import dev.icerock.moko.mvvm.flow.CStateFlow
8+
import dev.icerock.moko.mvvm.flow.DisposableHandle
9+
import dev.icerock.moko.mvvm.flow.binding.bind
10+
import dev.icerock.moko.resources.desc.StringDesc
11+
import platform.UIKit.UITextField
12+
13+
fun <T : StringDesc?> UITextField.bindText(
14+
flow: CStateFlow<T>
15+
): DisposableHandle {
16+
return bind(flow) { value ->
17+
val newValue = value?.localized().orEmpty()
18+
if (this.text == newValue) return@bind
19+
this.text = newValue
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2022 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.moko.mvvm.flow.resources
6+
7+
import dev.icerock.moko.mvvm.flow.CStateFlow
8+
import dev.icerock.moko.mvvm.flow.DisposableHandle
9+
import dev.icerock.moko.mvvm.flow.binding.bind
10+
import dev.icerock.moko.resources.desc.StringDesc
11+
import platform.UIKit.UITextView
12+
13+
fun <T : StringDesc?> UITextView.bindText(
14+
flow: CStateFlow<T>
15+
): DisposableHandle {
16+
return bind(flow) { value ->
17+
val newValue = value?.localized().orEmpty()
18+
if (this.text == newValue) return@bind
19+
this.text = newValue
20+
}
21+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
import dev.icerock.moko.mvvm.flow.cStateFlow
6+
import dev.icerock.moko.mvvm.flow.resources.bindTitle
7+
import dev.icerock.moko.resources.desc.StringDesc
8+
import dev.icerock.moko.resources.desc.desc
9+
import kotlinx.cinterop.readValue
10+
import kotlinx.coroutines.flow.MutableStateFlow
11+
import platform.CoreGraphics.CGRectZero
12+
import platform.UIKit.UIButton
13+
import kotlin.test.BeforeTest
14+
import kotlin.test.Ignore
15+
import kotlin.test.Test
16+
import kotlin.test.assertEquals
17+
18+
@Ignore
19+
class UIButtonBindingsTests {
20+
21+
private lateinit var destination: UIButton
22+
23+
@BeforeTest
24+
fun setup() {
25+
destination = UIButton(frame = CGRectZero.readValue())
26+
}
27+
28+
@Test
29+
fun `nonnullable stringdesc title`() {
30+
val source: MutableStateFlow<StringDesc> = MutableStateFlow("init".desc())
31+
destination.bindTitle(source.cStateFlow())
32+
assertEquals(
33+
expected = "init",
34+
actual = destination.currentTitle
35+
)
36+
source.value = "second".desc()
37+
assertEquals(
38+
expected = "second",
39+
actual = destination.currentTitle
40+
)
41+
}
42+
43+
@Test
44+
fun `nullable stringdesc title`() {
45+
val source: MutableStateFlow<StringDesc?> = MutableStateFlow(null)
46+
destination.bindTitle(source.cStateFlow())
47+
assertEquals(
48+
expected = null,
49+
actual = destination.currentTitle
50+
)
51+
source.value = "value".desc()
52+
assertEquals(
53+
expected = "value",
54+
actual = destination.currentTitle
55+
)
56+
}
57+
}

0 commit comments

Comments
 (0)