Skip to content

Commit

Permalink
Saving ViewModel state in Android, #3
Browse files Browse the repository at this point in the history
  • Loading branch information
Miha-x64 committed Feb 8, 2018
1 parent fbb89b9 commit b3668ba
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 9 deletions.
3 changes: 0 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,17 @@ verticalLayout {
padding = dip(16)

editText {
id = 1
hint = "Email"
bindTextBidirectionally(vm.emailProp)
bindErrorMessageTo(vm.emailValidProp.map { if (it) null else "E-mail is invalid" })
}

editText {
id = 2
hint = "Name"
bindTextBidirectionally(vm.nameProp)
}

editText {
id = 3
hint = "Surname"
bindTextBidirectionally(vm.surnameProp)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package net.aquadc.properties.android.sample

import android.app.Activity
import android.os.Bundle
import net.aquadc.properties.android.ParcelPropertiesMemento
import net.aquadc.properties.android.bindings.*
import net.aquadc.properties.map
import net.aquadc.properties.sample.logic.MainVm
Expand All @@ -17,26 +18,27 @@ class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

vm = MainVm(app.userProp)
// create or restore ViewModel
vm = (lastNonConfigurationInstance as MainVm?) ?: MainVm(app.userProp)

// restore ViewModel's state in case of process death
savedInstanceState?.getParcelable<ParcelPropertiesMemento>("vm")?.restoreTo(vm)

verticalLayout {
padding = dip(16)

editText {
id = 1
hint = "Email"
bindTextBidirectionally(vm.emailProp)
bindErrorMessageTo(vm.emailValidProp.map { if (it) null else "E-mail is invalid" })
}

editText {
id = 2
hint = "Name"
bindTextBidirectionally(vm.nameProp)
}

editText {
id = 3
hint = "Surname"
bindTextBidirectionally(vm.surnameProp)
}
Expand All @@ -56,4 +58,11 @@ class MainActivity : Activity() {
}
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable("vm", ParcelPropertiesMemento(vm))
}

override fun onRetainNonConfigurationInstance(): Any? = vm

}
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
package net.aquadc.properties.sample.logic

import net.aquadc.properties.*
import net.aquadc.properties.persistence.PersistableProperties
import net.aquadc.properties.persistence.PropertyIo
import net.aquadc.properties.persistence.x

/**
* This ViewModel can be used both in Android and on JVM.
* In ansroid-sample it is used in Android Activity,
* In android-sample it is used in Android Activity,
* and in fx-sample it is in JavaFX view.
*/
class MainVm(
private val userProp: MutableProperty<InMemoryUser>
) {
) : PersistableProperties {

// todo: find a shorter way to create single-threaded properties
val emailProp = unsynchronizedMutablePropertyOf(userProp.value.email)
val nameProp = unsynchronizedMutablePropertyOf(userProp.value.name)
val surnameProp = unsynchronizedMutablePropertyOf(userProp.value.surname)
val buttonClickedProp = unsynchronizedMutablePropertyOf(false)

override fun saveOrRestore(d: PropertyIo) {
d x emailProp
d x nameProp
d x surnameProp
}

val emailValidProp = unsynchronizedMutablePropertyOf(false)
val buttonEnabledProp = unsynchronizedMutablePropertyOf(false)
val buttonTextProp = unsynchronizedMutablePropertyOf("")
Expand Down

0 comments on commit b3668ba

Please sign in to comment.