16
16
package com.google.firebase.dataconnect.minimaldemo
17
17
18
18
import android.os.Bundle
19
- import android.view.View.OnClickListener
20
19
import android.widget.CompoundButton.OnCheckedChangeListener
21
20
import androidx.activity.viewModels
22
21
import androidx.appcompat.app.AppCompatActivity
@@ -41,8 +40,9 @@ class MainActivity : AppCompatActivity() {
41
40
viewBinding = ActivityMainBinding .inflate(layoutInflater)
42
41
setContentView(viewBinding.root)
43
42
44
- viewBinding.insertItemButton.setOnClickListener(insertButtonOnClickListener)
45
- viewBinding.getItemButton.setOnClickListener(getItemButtonOnClickListener)
43
+ viewBinding.insertItemButton.setOnClickListener { viewModel.insertItem() }
44
+ viewBinding.getItemButton.setOnClickListener { viewModel.getItem() }
45
+ viewBinding.deleteItemButton.setOnClickListener { viewModel.deleteItem() }
46
46
viewBinding.useEmulatorCheckBox.setOnCheckedChangeListener(useEmulatorOnCheckedChangeListener)
47
47
viewBinding.debugLoggingCheckBox.setOnCheckedChangeListener(debugLoggingOnCheckedChangeListener)
48
48
@@ -60,66 +60,14 @@ class MainActivity : AppCompatActivity() {
60
60
}
61
61
62
62
private fun collectViewModelState (state : MainActivityViewModel .State ) {
63
- val (insertProgressText, insertSequenceNumber) =
64
- when (state.insertItem) {
65
- is OperationState .New -> Pair (null , null )
66
- is OperationState .InProgress ->
67
- Pair (
68
- " Inserting item: ${state.insertItem.variables.toDisplayString()} " ,
69
- state.insertItem.sequenceNumber,
70
- )
71
- is OperationState .Completed ->
72
- Pair (
73
- state.insertItem.result.fold(
74
- onSuccess = {
75
- " Inserted item with id=${it.id} :\n ${state.insertItem.variables.toDisplayString()} "
76
- },
77
- onFailure = { " Inserting item ${state.insertItem.variables} FAILED: $it " },
78
- ),
79
- state.insertItem.sequenceNumber,
80
- )
81
- }
82
-
83
- val (getProgressText, getSequenceNumber) =
84
- when (state.getItem) {
85
- is OperationState .New -> Pair (null , null )
86
- is OperationState .InProgress ->
87
- Pair (
88
- " Retrieving item with ID ${state.getItem.variables.id} ..." ,
89
- state.getItem.sequenceNumber,
90
- )
91
- is OperationState .Completed ->
92
- Pair (
93
- state.getItem.result.fold(
94
- onSuccess = {
95
- " Retrieved item with ID ${state.getItem.variables.id} :\n ${it?.toDisplayString()} "
96
- },
97
- onFailure = { " Retrieving item with ID ${state.getItem.variables.id} FAILED: $it " },
98
- ),
99
- state.getItem.sequenceNumber,
100
- )
101
- }
102
-
103
- viewBinding.insertItemButton.isEnabled = state.insertItem !is OperationState .InProgress
63
+ viewBinding.progressText.text = state.progressText
64
+ viewBinding.insertItemButton.isEnabled = ! state.isInsertOperationInProgress
104
65
viewBinding.getItemButton.isEnabled =
105
- state.getItem !is OperationState .InProgress && state.lastInsertedKey != = null
106
-
107
- viewBinding.progressText.text =
108
- if (getSequenceNumber == = null ) {
109
- insertProgressText
110
- } else if (insertSequenceNumber == = null ) {
111
- getProgressText
112
- } else if (insertSequenceNumber > getSequenceNumber) {
113
- insertProgressText
114
- } else {
115
- getProgressText
116
- }
66
+ state.isGetOperationRunnable && ! state.isGetOperationInProgress
67
+ viewBinding.deleteItemButton.isEnabled =
68
+ state.isDeleteOperationRunnable && ! state.isDeleteOperationInProgress
117
69
}
118
70
119
- private val insertButtonOnClickListener = OnClickListener { viewModel.insertItem() }
120
-
121
- private val getItemButtonOnClickListener = OnClickListener { viewModel.getItem() }
122
-
123
71
private val debugLoggingOnCheckedChangeListener = OnCheckedChangeListener { _, isChecked ->
124
72
if (! lifecycle.currentState.isAtLeast(Lifecycle .State .RESUMED )) {
125
73
return @OnCheckedChangeListener
@@ -135,4 +83,70 @@ class MainActivity : AppCompatActivity() {
135
83
}
136
84
myApplication.coroutineScope.launch { myApplication.setUseDataConnectEmulator(isChecked) }
137
85
}
86
+
87
+ companion object {
88
+
89
+ private val MainActivityViewModel .State .isInsertOperationInProgress: Boolean
90
+ get() = insertItem is OperationState .InProgress
91
+
92
+ private val MainActivityViewModel .State .isGetOperationInProgress: Boolean
93
+ get() = getItem is OperationState .InProgress
94
+
95
+ private val MainActivityViewModel .State .isGetOperationRunnable: Boolean
96
+ get() = lastInsertedKey != = null
97
+
98
+ private val MainActivityViewModel .State .isDeleteOperationInProgress: Boolean
99
+ get() = deleteItem is OperationState .InProgress
100
+
101
+ private val MainActivityViewModel .State .isDeleteOperationRunnable: Boolean
102
+ get() = lastInsertedKey != = null
103
+
104
+ private val MainActivityViewModel .State .progressText: String?
105
+ get() {
106
+ val insertState = insertItem as ? OperationState .SequencedOperationState
107
+ val getState = getItem as ? OperationState .SequencedOperationState
108
+ val deleteState = deleteItem as ? OperationState .SequencedOperationState
109
+
110
+ val state =
111
+ listOfNotNull(insertState, getState, deleteState).maxByOrNull { it.sequenceNumber }
112
+
113
+ return if (state == = null ) {
114
+ null
115
+ } else if (state == = insertState) {
116
+ when (insertState) {
117
+ is OperationState .InProgress ->
118
+ " Inserting item: ${insertState.variables.toDisplayString()} "
119
+ is OperationState .Completed ->
120
+ insertState.result.fold(
121
+ onSuccess = {
122
+ " Inserted item with id=${it.id} :\n ${insertState.variables.toDisplayString()} "
123
+ },
124
+ onFailure = { " Inserting item ${insertState.variables} FAILED: $it " },
125
+ )
126
+ }
127
+ } else if (state == = getState) {
128
+ when (getState) {
129
+ is OperationState .InProgress -> " Retrieving item with ID ${getState.variables.id} ..."
130
+ is OperationState .Completed ->
131
+ getState.result.fold(
132
+ onSuccess = {
133
+ " Retrieved item with ID ${getState.variables.id} :\n ${it?.toDisplayString()} "
134
+ },
135
+ onFailure = { " Retrieving item with ID ${getState.variables.id} FAILED: $it " },
136
+ )
137
+ }
138
+ } else if (state == = deleteState) {
139
+ when (deleteState) {
140
+ is OperationState .InProgress -> " Deleting item with ID ${deleteState.variables.id} ..."
141
+ is OperationState .Completed ->
142
+ deleteState.result.fold(
143
+ onSuccess = { " Deleted item with ID ${deleteState.variables.id} " },
144
+ onFailure = { " Deleting item with ID ${deleteState.variables.id} FAILED: $it " },
145
+ )
146
+ }
147
+ } else {
148
+ throw RuntimeException (" internal error: unknown state: $state (error code vp4rjptx6r)" )
149
+ }
150
+ }
151
+ }
138
152
}
0 commit comments