-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathMainActivity.kt
142 lines (118 loc) · 4.93 KB
/
MainActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package net.aquadc.propertiesSampleApp
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Notification
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.RemoteViews
import net.aquadc.persistence.android.parcel.ParcelPropertiesMemento
import net.aquadc.properties.android.bindings.bindViewTo
import net.aquadc.properties.android.bindings.view.bindEnabledTo
import net.aquadc.properties.android.bindings.view.setWhenClicked
import net.aquadc.properties.android.bindings.widget.bindErrorMessageTo
import net.aquadc.properties.android.bindings.widget.bind
import net.aquadc.properties.android.bindings.widget.textTo
import net.aquadc.properties.android.bindings.widget.bindTextBidirectionally
import net.aquadc.properties.android.bindings.widget.bindTextTo
import net.aquadc.properties.map
import net.aquadc.properties.persistence.memento.restoreTo
import net.aquadc.propertiesSampleLogic.MainVm
import splitties.dimensions.dip
import splitties.systemservices.notificationManager
import splitties.views.dsl.core.button
import splitties.views.dsl.core.editText
import splitties.views.dsl.core.horizontalLayout
import splitties.views.dsl.core.lParams
import splitties.views.dsl.core.textView
import splitties.views.dsl.core.verticalLayout
import splitties.views.dsl.core.wrapInScrollView
import splitties.views.padding
/**
* Sample MVVm view for Android.
*/
class MainActivity : Activity() {
private lateinit var vm: MainVm
@SuppressLint("ResourceType")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// create or restore ViewModel
vm = (lastNonConfigurationInstance as MainVm?) ?: MainVm(app.user)
// restore ViewModel's state in case of process death
savedInstanceState?.getParcelable<ParcelPropertiesMemento>("vm")?.restoreTo(vm)
setContentView(verticalLayout {
padding = dip(16)
addView(editText {
id = 1
hint = "Email"
bindTextBidirectionally(vm.emailProp)
bindErrorMessageTo(vm.emailValidProp.map {
if (it) null else "E-mail is invalid"
})
})
addView(editText {
id = 2
hint = "Name"
bindTextBidirectionally(vm.nameProp)
})
addView(editText {
id = 3
hint = "Surname"
bindTextBidirectionally(vm.surnameProp)
})
addView(button {
bindEnabledTo(vm.buttonEnabledProp)
bindTextTo(vm.buttonEnabledProp.map {
if (it) "Save changes" else "Nothing changed"
})
setWhenClicked(vm.buttonClickedProp)
})
addView(View(this@MainActivity), lParams(weight = 1f))
addView(textView {
text = "Other samples"
})
addView(horizontalLayout {
addView(button {
text = "RecyclerView"
startWhenClicked<RecyclerViewActivity>()
}, lParams(weight = 1f))
addView(button {
text = "SQLite"
startWhenClicked<SqliteActivity>()
}, lParams(weight = 1f))
})
// kinda hacky: I use bindViewTo in order to update notification while activity is visible.
// Depending on your use-case, lifecycle will be different,
// so don't forget to unsubscribe and cancel the notification!
bindViewTo(RemoteViews(packageName, R.layout.notification).bind(
android.R.id.text1 textTo vm.nameProp,
android.R.id.text2 textTo vm.emailProp
)) { v, views ->
with(v.context) {
notificationManager.notify(
1,
Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContent(views)
.setOngoing(true)
.run { if (Build.VERSION.SDK_INT >= 16) build() else notification }
)
}
}
}.wrapInScrollView())
}
private inline fun <reified A : Activity> View.startWhenClicked(): Unit =
startWhenClicked(A::class.java)
private fun View.startWhenClicked(klass: Class<out Activity>): Unit =
setOnClickListener { startActivity(Intent(it.context, klass)) }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable("vm", ParcelPropertiesMemento(vm))
}
override fun onRetainNonConfigurationInstance(): Any? = vm
override fun onDestroy() {
notificationManager.cancel(1)
super.onDestroy()
}
}