Skip to content

Commit d760569

Browse files
committed
add delete button
1 parent 77cca29 commit d760569

File tree

2 files changed

+118
-68
lines changed

2 files changed

+118
-68
lines changed

firebase-dataconnect/demo/src/main/kotlin/com/google/firebase/dataconnect/minimaldemo/MainActivity.kt

Lines changed: 74 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package com.google.firebase.dataconnect.minimaldemo
1717

1818
import android.os.Bundle
19-
import android.view.View.OnClickListener
2019
import android.widget.CompoundButton.OnCheckedChangeListener
2120
import androidx.activity.viewModels
2221
import androidx.appcompat.app.AppCompatActivity
@@ -41,8 +40,9 @@ class MainActivity : AppCompatActivity() {
4140
viewBinding = ActivityMainBinding.inflate(layoutInflater)
4241
setContentView(viewBinding.root)
4342

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() }
4646
viewBinding.useEmulatorCheckBox.setOnCheckedChangeListener(useEmulatorOnCheckedChangeListener)
4747
viewBinding.debugLoggingCheckBox.setOnCheckedChangeListener(debugLoggingOnCheckedChangeListener)
4848

@@ -60,66 +60,14 @@ class MainActivity : AppCompatActivity() {
6060
}
6161

6262
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
10465
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
11769
}
11870

119-
private val insertButtonOnClickListener = OnClickListener { viewModel.insertItem() }
120-
121-
private val getItemButtonOnClickListener = OnClickListener { viewModel.getItem() }
122-
12371
private val debugLoggingOnCheckedChangeListener = OnCheckedChangeListener { _, isChecked ->
12472
if (!lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
12573
return@OnCheckedChangeListener
@@ -135,4 +83,70 @@ class MainActivity : AppCompatActivity() {
13583
}
13684
myApplication.coroutineScope.launch { myApplication.setUseDataConnectEmulator(isChecked) }
13785
}
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+
}
138152
}

firebase-dataconnect/demo/src/main/kotlin/com/google/firebase/dataconnect/minimaldemo/MainActivityViewModel.kt

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.AP
2222
import androidx.lifecycle.viewModelScope
2323
import androidx.lifecycle.viewmodel.initializer
2424
import androidx.lifecycle.viewmodel.viewModelFactory
25-
import com.google.firebase.dataconnect.minimaldemo.connector.DeleteItemByKeyMutation
2625
import com.google.firebase.dataconnect.minimaldemo.connector.GetItemByKeyQuery
2726
import com.google.firebase.dataconnect.minimaldemo.connector.InsertItemMutation
2827
import com.google.firebase.dataconnect.minimaldemo.connector.Zwda6x9zyyKey
@@ -183,6 +182,48 @@ class MainActivityViewModel(private val app: MyApplication) : ViewModel() {
183182
return true
184183
}
185184

185+
@OptIn(ExperimentalCoroutinesApi::class)
186+
private fun State.startGet(
187+
getItemOperationInProgressState:
188+
State.OperationState.InProgress<Zwda6x9zyyKey, GetItemByKeyQuery.Data.Item?>
189+
) {
190+
require(getItemOperationInProgressState === getItem)
191+
val job: Deferred<GetItemByKeyQuery.Data.Item?> = getItemOperationInProgressState.job
192+
val key: Zwda6x9zyyKey = getItemOperationInProgressState.variables
193+
194+
job.start()
195+
196+
job.invokeOnCompletion { exception ->
197+
val result =
198+
if (exception !== null) {
199+
Log.w(TAG, "WARNING: Getting item with key $key FAILED: $exception", exception)
200+
Result.failure(exception)
201+
} else {
202+
val item = job.getCompleted()
203+
Log.i(TAG, "Got item with key $key: $item")
204+
Result.success(item)
205+
}
206+
207+
while (true) {
208+
val oldState = _state.value
209+
if (oldState.getItem !== getItemOperationInProgressState) {
210+
break
211+
}
212+
213+
val getItemOperationCompletedState =
214+
State.OperationState.Completed(
215+
oldState.nextSequenceNumber,
216+
getItemOperationInProgressState.variables,
217+
result,
218+
)
219+
val newState = oldState.withGetCompleted(getItemOperationCompletedState)
220+
if (_state.compareAndSet(oldState, newState)) {
221+
break
222+
}
223+
}
224+
}
225+
}
226+
186227
fun deleteItem() {
187228
while (true) {
188229
if (tryDeleteItem()) {
@@ -228,7 +269,6 @@ class MainActivityViewModel(private val app: MyApplication) : ViewModel() {
228269
return true
229270
}
230271

231-
@OptIn(ExperimentalCoroutinesApi::class)
232272
private fun State.startDelete(
233273
deleteItemOperationInProgressState: State.OperationState.InProgress<Zwda6x9zyyKey, Unit>
234274
) {
@@ -321,9 +361,7 @@ class MainActivityViewModel(private val app: MyApplication) : ViewModel() {
321361
nextSequenceNumber = nextSequenceNumber + 1,
322362
)
323363

324-
fun withDeleteInProgress(
325-
deleteItem: OperationState.InProgress<Zwda6x9zyyKey, Unit>
326-
): State =
364+
fun withDeleteInProgress(deleteItem: OperationState.InProgress<Zwda6x9zyyKey, Unit>): State =
327365
State(
328366
insertItem = insertItem,
329367
getItem = getItem,
@@ -332,9 +370,7 @@ class MainActivityViewModel(private val app: MyApplication) : ViewModel() {
332370
nextSequenceNumber = nextSequenceNumber + 1,
333371
)
334372

335-
fun withDeleteCompleted(
336-
deleteItem: OperationState.Completed<Zwda6x9zyyKey, Unit>
337-
): State =
373+
fun withDeleteCompleted(deleteItem: OperationState.Completed<Zwda6x9zyyKey, Unit>): State =
338374
State(
339375
insertItem = insertItem,
340376
getItem = getItem,

0 commit comments

Comments
 (0)