Skip to content

Commit f7edd2f

Browse files
committed
get get all items operation to work; recycler view does not work yet though
1 parent 017e670 commit f7edd2f

File tree

6 files changed

+149
-270
lines changed

6 files changed

+149
-270
lines changed

firebase-dataconnect/demo/firebase/dataconnect/connector/operations.gql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,20 @@ query GetItemByKey(
4949
}
5050
}
5151

52+
query GetAllItems @auth(level: PUBLIC) {
53+
items: zwda6x9zyys {
54+
id
55+
string
56+
int
57+
int64
58+
float
59+
boolean
60+
date
61+
timestamp
62+
any
63+
}
64+
}
65+
5266
mutation DeleteItemByKey(
5367
$key: zwda6x9zyy_Key!
5468
) @auth(level: PUBLIC) {

firebase-dataconnect/demo/src/main/AndroidManifest.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ See the License for the specific language governing permissions and
1616
limitations under the License.
1717
-->
1818

19-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
20-
xmlns:tools="http://schemas.android.com/tools">
19+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2120

2221
<application
2322
android:name=".MyApplication"
@@ -32,7 +31,10 @@ limitations under the License.
3231
</intent-filter>
3332
</activity>
3433

35-
<activity android:name=".ListItemsActivity" />
34+
<activity
35+
android:name=".ListItemsActivity"
36+
android:label="List Items"
37+
/>
3638

3739
</application>
3840

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

Lines changed: 27 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -16,151 +16,59 @@
1616
package com.google.firebase.dataconnect.minimaldemo
1717

1818
import android.os.Bundle
19-
import android.view.Menu
20-
import android.view.MenuItem
21-
import android.widget.CompoundButton.OnCheckedChangeListener
19+
import android.view.View
2220
import androidx.activity.viewModels
2321
import androidx.appcompat.app.AppCompatActivity
24-
import androidx.lifecycle.Lifecycle
2522
import androidx.lifecycle.flowWithLifecycle
2623
import androidx.lifecycle.lifecycleScope
27-
import com.google.firebase.dataconnect.minimaldemo.ListItemsViewModel.OperationState
28-
import com.google.firebase.dataconnect.minimaldemo.databinding.ActivityMainBinding
24+
import com.google.firebase.dataconnect.minimaldemo.databinding.ActivityListItemsBinding
2925
import kotlinx.coroutines.flow.collectLatest
3026
import kotlinx.coroutines.launch
3127

3228
class ListItemsActivity : AppCompatActivity() {
3329

3430
private lateinit var myApplication: MyApplication
35-
private lateinit var viewBinding: ActivityMainBinding
31+
private lateinit var viewBinding: ActivityListItemsBinding
3632
private val viewModel: ListItemsViewModel by viewModels { ListItemsViewModel.Factory }
3733

3834
override fun onCreate(savedInstanceState: Bundle?) {
3935
super.onCreate(savedInstanceState)
4036
myApplication = application as MyApplication
4137

42-
viewBinding = ActivityMainBinding.inflate(layoutInflater)
38+
viewBinding = ActivityListItemsBinding.inflate(layoutInflater)
4339
setContentView(viewBinding.root)
4440

45-
viewBinding.insertItemButton.setOnClickListener { viewModel.insertItem() }
46-
viewBinding.getItemButton.setOnClickListener { viewModel.getItem() }
47-
viewBinding.deleteItemButton.setOnClickListener { viewModel.deleteItem() }
48-
viewBinding.useEmulatorCheckBox.setOnCheckedChangeListener(useEmulatorOnCheckedChangeListener)
49-
viewBinding.debugLoggingCheckBox.setOnCheckedChangeListener(debugLoggingOnCheckedChangeListener)
50-
5141
lifecycleScope.launch {
42+
if (viewModel.loadingState == ListItemsViewModel.LoadingState.NotStarted) {
43+
viewModel.getItems()
44+
}
5245
viewModel.stateSequenceNumber.flowWithLifecycle(lifecycle).collectLatest {
5346
onViewModelStateChange()
5447
}
5548
}
5649
}
5750

58-
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
59-
menuInflater.inflate(R.menu.menu_main, menu)
60-
return true
61-
}
62-
63-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
64-
return super.onOptionsItemSelected(item)
65-
}
66-
67-
override fun onResume() {
68-
super.onResume()
69-
lifecycleScope.launch {
70-
viewBinding.useEmulatorCheckBox.isChecked = myApplication.getUseDataConnectEmulator()
71-
viewBinding.debugLoggingCheckBox.isChecked = myApplication.getDataConnectDebugLoggingEnabled()
72-
}
73-
}
74-
7551
private fun onViewModelStateChange() {
76-
viewBinding.progressText.text = viewModel.progressText
77-
viewBinding.insertItemButton.isEnabled = !viewModel.isInsertOperationInProgress
78-
viewBinding.getItemButton.isEnabled =
79-
viewModel.isGetOperationRunnable && !viewModel.isGetOperationInProgress
80-
viewBinding.deleteItemButton.isEnabled =
81-
viewModel.isDeleteOperationRunnable && !viewModel.isDeleteOperationInProgress
82-
}
83-
84-
private val debugLoggingOnCheckedChangeListener = OnCheckedChangeListener { _, isChecked ->
85-
if (!lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
86-
return@OnCheckedChangeListener
87-
}
88-
myApplication.coroutineScope.launch {
89-
myApplication.setDataConnectDebugLoggingEnabled(isChecked)
52+
val items = viewModel.result?.getOrNull()
53+
val exception = viewModel.result?.exceptionOrNull()
54+
val loadingState = viewModel.loadingState
55+
56+
if (loadingState == ListItemsViewModel.LoadingState.InProgress) {
57+
viewBinding.statusText.text = "Loading Items..."
58+
viewBinding.statusText.visibility = View.VISIBLE
59+
viewBinding.recyclerView.visibility = View.GONE
60+
} else if (items !== null) {
61+
viewBinding.statusText.text = "Items: $items"
62+
viewBinding.statusText.visibility = View.VISIBLE
63+
viewBinding.recyclerView.visibility = View.GONE
64+
} else if (exception !== null) {
65+
viewBinding.statusText.text = "Loading items FAILED: $exception"
66+
viewBinding.statusText.visibility = View.VISIBLE
67+
viewBinding.recyclerView.visibility = View.GONE
68+
} else {
69+
viewBinding.statusText.text = null
70+
viewBinding.statusText.visibility = View.GONE
71+
viewBinding.recyclerView.visibility = View.GONE
9072
}
9173
}
92-
93-
private val useEmulatorOnCheckedChangeListener = OnCheckedChangeListener { _, isChecked ->
94-
if (!lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
95-
return@OnCheckedChangeListener
96-
}
97-
myApplication.coroutineScope.launch { myApplication.setUseDataConnectEmulator(isChecked) }
98-
}
99-
100-
companion object {
101-
102-
private val ListItemsViewModel.isInsertOperationInProgress: Boolean
103-
get() = insertState is OperationState.InProgress
104-
105-
private val ListItemsViewModel.isGetOperationInProgress: Boolean
106-
get() = getState is OperationState.InProgress
107-
108-
private val ListItemsViewModel.isDeleteOperationInProgress: Boolean
109-
get() = deleteState is OperationState.InProgress
110-
111-
private val ListItemsViewModel.isGetOperationRunnable: Boolean
112-
get() = lastInsertedKey !== null
113-
114-
private val ListItemsViewModel.isDeleteOperationRunnable: Boolean
115-
get() = lastInsertedKey !== null
116-
117-
private val ListItemsViewModel.progressText: String?
118-
get() {
119-
// Save properties to local variables to enable Kotlin's type narrowing in the "if" blocks
120-
// below.
121-
val insertState = insertState
122-
val getState = getState
123-
val deleteState = deleteState
124-
val state =
125-
listOfNotNull(insertState, getState, deleteState).maxByOrNull { it.sequenceNumber }
126-
127-
return if (state === null) {
128-
null
129-
} else if (state === insertState) {
130-
when (insertState) {
131-
is OperationState.InProgress ->
132-
"Inserting item: ${insertState.variables.toDisplayString()}"
133-
is OperationState.Completed ->
134-
insertState.result.fold(
135-
onSuccess = {
136-
"Inserted item with id=${it.id}:\n${insertState.variables.toDisplayString()}"
137-
},
138-
onFailure = { "Inserting item ${insertState.variables} FAILED: $it" },
139-
)
140-
}
141-
} else if (state === getState) {
142-
when (getState) {
143-
is OperationState.InProgress -> "Retrieving item with ID ${getState.variables.id}..."
144-
is OperationState.Completed ->
145-
getState.result.fold(
146-
onSuccess = {
147-
"Retrieved item with ID ${getState.variables.id}:\n${it?.toDisplayString()}"
148-
},
149-
onFailure = { "Retrieving item with ID ${getState.variables.id} FAILED: $it" },
150-
)
151-
}
152-
} else if (state === deleteState) {
153-
when (deleteState) {
154-
is OperationState.InProgress -> "Deleting item with ID ${deleteState.variables.id}..."
155-
is OperationState.Completed ->
156-
deleteState.result.fold(
157-
onSuccess = { "Deleted item with ID ${deleteState.variables.id}" },
158-
onFailure = { "Deleting item with ID ${deleteState.variables.id} FAILED: $it" },
159-
)
160-
}
161-
} else {
162-
throw RuntimeException("internal error: unknown state: $state (error code vp4rjptx6r)")
163-
}
164-
}
165-
}
16674
}

0 commit comments

Comments
 (0)