From 459bc086fb7bc7bf16a8ea07097e15caf5759b37 Mon Sep 17 00:00:00 2001 From: Jeff Lockhart Date: Fri, 9 Dec 2022 17:37:44 -0700 Subject: [PATCH 1/3] Update dependencies --- readme.md | 2 +- src/app/build.gradle | 8 ++--- src/build.gradle | 36 +++++++------------- src/gradle/wrapper/gradle-wrapper.properties | 3 +- src/settings.gradle | 3 ++ 5 files changed, 21 insertions(+), 31 deletions(-) diff --git a/readme.md b/readme.md index 0b1f68c..0c9523f 100755 --- a/readme.md +++ b/readme.md @@ -35,7 +35,7 @@ Then add the following to the Date: Fri, 9 Dec 2022 23:40:00 -0700 Subject: [PATCH 2/3] Resolve warnings Remove some unused declarations --- .../learningpath/DatabaseIntegrationTests.kt | 3 +++ .../couchbase/learningpath/InventoryNavGraph.kt | 4 ++-- .../data/audits/AuditRepositoryDb.kt | 3 --- .../data/stockItem/StockItemRepositoryDb.kt | 9 ++++----- .../learningpath/services/ReplicatorServiceDb.kt | 16 +++++++--------- .../couchbase/learningpath/ui/MainActivity.kt | 7 +++++-- .../couchbase/learningpath/ui/audit/AuditCard.kt | 8 ++++---- .../learningpath/ui/audit/AuditEditorView.kt | 5 +++-- .../ui/audit/AuditEditorViewModel.kt | 2 +- .../learningpath/ui/audit/AuditListView.kt | 7 +++---- .../learningpath/ui/audit/AuditListViewModel.kt | 1 - .../learningpath/ui/audit/StockItemCard.kt | 8 ++++---- .../ui/audit/StockItemSelectionView.kt | 9 +++------ .../ui/developer/DevDatabaseInfoView.kt | 8 ++++---- .../learningpath/ui/developer/DeveloperView.kt | 9 ++++----- .../ui/developer/ReplicatorConfigView.kt | 6 +++--- .../learningpath/ui/developer/ReplicatorView.kt | 9 ++++----- .../ui/developer/ReplicatorViewModel.kt | 2 -- .../learningpath/ui/profile/UserProfileView.kt | 8 ++++---- .../learningpath/ui/project/ProjectCard.kt | 8 ++++---- .../learningpath/ui/project/ProjectEditorView.kt | 6 +++--- .../ui/project/ProjectEditorViewModel.kt | 4 +++- .../learningpath/ui/project/ProjectListView.kt | 8 ++++---- .../learningpath/ui/project/WarehouseCard.kt | 8 ++++---- .../ui/project/WarehouseSelectionView.kt | 6 +++--- src/app/src/main/res/values-night/themes.xml | 2 +- src/app/src/main/res/values/themes.xml | 2 +- 27 files changed, 81 insertions(+), 87 deletions(-) diff --git a/src/app/src/androidTest/java/com/couchbase/learningpath/DatabaseIntegrationTests.kt b/src/app/src/androidTest/java/com/couchbase/learningpath/DatabaseIntegrationTests.kt index 004cb3d..a156842 100644 --- a/src/app/src/androidTest/java/com/couchbase/learningpath/DatabaseIntegrationTests.kt +++ b/src/app/src/androidTest/java/com/couchbase/learningpath/DatabaseIntegrationTests.kt @@ -13,12 +13,15 @@ import com.couchbase.learningpath.data.warehouse.WarehouseRepositoryDb import com.couchbase.learningpath.models.* import com.couchbase.learningpath.services.MockAuthenticationService import com.couchbase.lite.CouchbaseLiteException +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.test.runTest +import kotlinx.serialization.ExperimentalSerializationApi import org.junit.* import org.junit.Assert.* import org.junit.runner.RunWith +@OptIn(ExperimentalSerializationApi::class, ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) class DatabaseIntegrationTests { diff --git a/src/app/src/main/java/com/couchbase/learningpath/InventoryNavGraph.kt b/src/app/src/main/java/com/couchbase/learningpath/InventoryNavGraph.kt index 3da381e..06d74c1 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/InventoryNavGraph.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/InventoryNavGraph.kt @@ -134,8 +134,8 @@ fun InventoryNavGraph( auditId = it } val viewModel = getViewModel() - viewModel.getAudit(projectId = projectId, auditId = auditId) - viewModel.navigateToListSelection = actions.navigateToStockItemListSelector + viewModel.getAudit(projectId = projectId, auditId = auditId) + viewModel.navigateToListSelection = actions.navigateToStockItemListSelector AuditEditorView( viewModel = viewModel, diff --git a/src/app/src/main/java/com/couchbase/learningpath/data/audits/AuditRepositoryDb.kt b/src/app/src/main/java/com/couchbase/learningpath/data/audits/AuditRepositoryDb.kt index 4a7fd36..702fbfb 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/data/audits/AuditRepositoryDb.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/data/audits/AuditRepositoryDb.kt @@ -7,12 +7,10 @@ import android.util.Log import com.couchbase.learningpath.data.DatabaseManager import com.couchbase.learningpath.models.Audit import com.couchbase.learningpath.models.AuditDao -import com.couchbase.learningpath.models.Project import com.couchbase.learningpath.models.StockItem import com.couchbase.learningpath.services.AuthenticationService import com.couchbase.lite.* import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.withContext import kotlinx.serialization.ExperimentalSerializationApi @@ -21,7 +19,6 @@ import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import java.util.* -@OptIn(ExperimentalCoroutinesApi::class) class AuditRepositoryDb( var context: Context, private val authenticationService: AuthenticationService diff --git a/src/app/src/main/java/com/couchbase/learningpath/data/stockItem/StockItemRepositoryDb.kt b/src/app/src/main/java/com/couchbase/learningpath/data/stockItem/StockItemRepositoryDb.kt index ec7c19c..a92fa49 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/data/stockItem/StockItemRepositoryDb.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/data/stockItem/StockItemRepositoryDb.kt @@ -4,7 +4,6 @@ package com.couchbase.learningpath.data.stockItem import android.content.Context import android.util.Log -import androidx.compose.ui.text.toLowerCase import com.couchbase.learningpath.data.DatabaseManager import com.couchbase.learningpath.models.StockItem import com.couchbase.learningpath.models.StockItemDao @@ -34,7 +33,7 @@ class StockItemRepositoryDb( db?.let { database -> val query = database.createQuery("SELECT * FROM _ AS item WHERE documentType=\"$documentType\"") - var results = query.execute().allResults() + val results = query.execute().allResults() results.forEach { result -> val stockItem = Json.decodeFromString(result.toJSON()).item stockItems.add(stockItem) @@ -76,7 +75,7 @@ class StockItemRepositoryDb( db?.let { database -> var queryString = "SELECT * FROM _ as item WHERE documentType=\"item\" AND lower(name) LIKE ('%' || \$parameterName || '%')" // 1 - var parameters = Parameters() // 2 + val parameters = Parameters() // 2 parameters.setString("parameterName", searchName.lowercase()) // 3 searchDescription?.let { description -> if (description.isNotEmpty()) { // 4 @@ -88,9 +87,9 @@ class StockItemRepositoryDb( ) // 6 } } - var query = database.createQuery(queryString) // 7 + val query = database.createQuery(queryString) // 7 query.parameters = parameters // 8 - var results = query.execute().allResults() // 9 + val results = query.execute().allResults() // 9 results.forEach { result -> // 10 val stockItem = Json.decodeFromString(result.toJSON()).item // 11 diff --git a/src/app/src/main/java/com/couchbase/learningpath/services/ReplicatorServiceDb.kt b/src/app/src/main/java/com/couchbase/learningpath/services/ReplicatorServiceDb.kt index c7d9b49..7427cf2 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/services/ReplicatorServiceDb.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/services/ReplicatorServiceDb.kt @@ -7,13 +7,11 @@ import com.couchbase.learningpath.data.DatabaseManager import com.couchbase.learningpath.data.replicator.ReplicatorConfig import com.couchbase.learningpath.data.replicator.ReplicatorManager import com.couchbase.lite.* -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.flow.Flow import java.net.URI @InternalCoroutinesApi -@OptIn( ExperimentalCoroutinesApi::class) class ReplicatorServiceDb ( private val authenticationService: AuthenticationService, val context: Context) : ReplicatorService @@ -28,16 +26,16 @@ class ReplicatorServiceDb ( //if your sync gateway server is running on a different IP change it here override var replicationConfig = mutableStateOf( ReplicatorConfig( - username = loggedInUser.username, - password = loggedInUser.password, + username = loggedInUser.username, + password = loggedInUser.password, endpointUrl = "ws://10.0.2.2:4984/projects", - replicatorType = "PUSH AND PULL", - heartBeat = 60L, - continuous = true, - selfSignedCert = true) + replicatorType = "PUSH AND PULL", + heartBeat = 60L, + continuous = true, + selfSignedCert = true + ) ) - override val replicationStatus = mutableStateOf("") override val replicationTypes = listOf("PUSH AND PULL", "PUSH", "PULL") override val canStartReplication = mutableStateOf(false) diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/MainActivity.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/MainActivity.kt index 791efb0..86348d8 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/MainActivity.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/MainActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.padding import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier @@ -81,9 +82,11 @@ class MainActivity : ComponentActivity() { Scaffold(scaffoldState = scaffoldState, snackbarHost = { scaffoldState.snackbarHostState - }) { + } + ) { padding -> ModalDrawer( - modifier = Modifier.semantics { contentDescription = menuResource }, + modifier = Modifier.semantics { contentDescription = menuResource } + .padding(padding), drawerState = drawerState, gesturesEnabled = drawerState.isOpen, drawerContent = { diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditCard.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditCard.kt index 955254e..60c6779 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditCard.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditCard.kt @@ -187,13 +187,13 @@ fun AuditCardPreview() { InventoryAppBar(title = "Audit", navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { AuditCard( audit = audit, onEditChange = onEditChange, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorView.kt index e4b9842..ebcf3f4 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorView.kt @@ -39,11 +39,12 @@ fun AuditEditorView( title = "Audit Editor", navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() + .padding(padding) ) { viewModel.navigateUpCallback = navigateUp AuditEditor( diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorViewModel.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorViewModel.kt index d4186a2..d8888c7 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorViewModel.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditEditorViewModel.kt @@ -134,7 +134,7 @@ class AuditEditorViewModel( it.projectId = projectId.value auditRepository.save(it) withContext(Dispatchers.Main) { - navigateUpCallback() + navigateUpCallback() } } } diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListView.kt index 3056119..2a9fb0a 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListView.kt @@ -49,13 +49,12 @@ fun AuditListView( } ) } - ) - { + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { val audits = viewModel.audits.observeAsState() AuditList( items = audits.value, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListViewModel.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListViewModel.kt index 387e964..17ddf86 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListViewModel.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/AuditListViewModel.kt @@ -11,7 +11,6 @@ import com.couchbase.learningpath.models.Project import kotlinx.coroutines.Dispatchers import kotlinx.serialization.decodeFromString import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemCard.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemCard.kt index 9cfc897..86de0ef 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemCard.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemCard.kt @@ -88,13 +88,13 @@ fun StockItemCardPreview() { InventoryAppBar(title = "Stock Item Selection", navigationIcon = Icons.Filled.Menu, navigationOnClick = { }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { StockItemCard( stockItem = stockItem, onStockItemSelected = onStockItemSelected diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemSelectionView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemSelectionView.kt index f4b8d7b..65c2211 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemSelectionView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/audit/StockItemSelectionView.kt @@ -13,10 +13,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.couchbase.learningpath.models.StockItem -import com.couchbase.learningpath.models.Warehouse import com.couchbase.learningpath.ui.components.InventoryAppBar -import com.couchbase.learningpath.ui.project.WarehouseCard -import com.couchbase.learningpath.ui.project.WarehouseSelector import com.couchbase.learningpath.ui.theme.LearningPathTheme import com.couchbase.learningpath.ui.theme.Red500 @@ -37,12 +34,12 @@ fun StockItemSelectionView( navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() }) } - ) - { + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ){ + .padding(padding) + ) { val onStockItemSelected: (StockItem) -> Unit = { stockItem -> viewModel.onStockItemSelected(stockItem) diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DevDatabaseInfoView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DevDatabaseInfoView.kt index e6e91a8..8c4b213 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DevDatabaseInfoView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DevDatabaseInfoView.kt @@ -28,13 +28,13 @@ fun DevDatabaseInfoView( InventoryAppBar(title = "Developer - Database Information", navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { DeveloperInfoWidget( viewModel.inventoryDatabaseName.value, viewModel.inventoryDatabaseLocation.value, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DeveloperView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DeveloperView.kt index 1c1fded..a22651d 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DeveloperView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/DeveloperView.kt @@ -36,14 +36,13 @@ fun DeveloperView( InventoryAppBar(title = "Developer", navigationIcon = Icons.Filled.Menu, navigationOnClick = { openDrawer() }) - }) - - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { DeveloperWidget( toastMessage = viewModel.toastMessage.value, onLoadSampleData = viewModel.onLoadSampleData, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorConfigView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorConfigView.kt index 45dca73..672d26a 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorConfigView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorConfigView.kt @@ -33,12 +33,12 @@ fun ReplicatorConfigView( navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() } ) - }) - - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() + .padding(padding) ) { ReplicatorConfigOptions( serverUrl = viewModel.serverUrlState.value, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorView.kt index 80ab585..ba8c0dc 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorView.kt @@ -43,14 +43,13 @@ fun ReplicatorView( } } ) - }) - - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { ReplicatorWidget( replicationStatus = viewModel.replicationStatus.value, replicationProgress = viewModel.replicationProgress.value, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorViewModel.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorViewModel.kt index 2449094..0aeb230 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorViewModel.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/developer/ReplicatorViewModel.kt @@ -11,8 +11,6 @@ import com.couchbase.lite.ReplicatorChange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch -import kotlinx.coroutines.flow.collect -import kotlin.math.log class ReplicatorViewModel(private val replicatorService: ReplicatorService) : ViewModel() { diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/profile/UserProfileView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/profile/UserProfileView.kt index ddb9813..758cac7 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/profile/UserProfileView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/profile/UserProfileView.kt @@ -51,13 +51,13 @@ fun UserProfileView( InventoryAppBar(title = "User Profile", navigationIcon = Icons.Filled.Menu, navigationOnClick = { openDrawer() }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { UserProfileFormWidget( viewModel.givenName.value, viewModel.onGivenNameChanged, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectCard.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectCard.kt index 11b01ce..bb8a58d 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectCard.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectCard.kt @@ -185,13 +185,13 @@ fun ProjectCardPreview() { InventoryAppBar(title = "User Profile", navigationIcon = Icons.Filled.Menu, navigationOnClick = { }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { ProjectCard( project = project, onProjectSelected = onProjectSelected, diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorView.kt index a9344f0..42cda91 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorView.kt @@ -41,12 +41,12 @@ fun ProjectEditorView( navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() }) } - ) - { + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ){ + .padding(padding) + ) { viewModel.navigateUpCallback = navigateUp viewModel.navigateToListSelection = navigateToListSelection diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorViewModel.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorViewModel.kt index 6128289..56e108c 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorViewModel.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectEditorViewModel.kt @@ -21,7 +21,9 @@ class ProjectEditorViewModel( ) : ViewModel() { private val defaultWarehouseText: String = "No Warehouse Selected" - var projectState = mutableStateOf(null) + + @OptIn(ExperimentalSerializationApi::class) + val projectState = mutableStateOf(null) val dueDateState = mutableStateOf("Select Due Date") val warehouseSelectionState = mutableStateOf(defaultWarehouseText) diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectListView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectListView.kt index 2d03f32..26e3561 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectListView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/ProjectListView.kt @@ -45,13 +45,13 @@ fun ProjectListView( InventoryAppBar(title = stringResource(id = R.string.projects), navigationIcon = Icons.Filled.Menu, navigationOnClick = { openDrawer() }) - }, floatingActionButton = { AddButton(navigateToProjectEditor) }) - { + }, floatingActionButton = { AddButton(navigateToProjectEditor) } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { // collecting the flow and turning it into state // https://developer.android.com/jetpack/compose/libraries#streams val projectList by viewModel.repositoryFlow.collectAsState(initial = listOf()) diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseCard.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseCard.kt index 0190c1a..157d59d 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseCard.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseCard.kt @@ -119,13 +119,13 @@ fun WarehouseCardPreview() { InventoryAppBar(title = "Warehouse Selection", navigationIcon = Icons.Filled.Menu, navigationOnClick = { }) - }) - { + } + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ) - { + .padding(padding) + ) { WarehouseCard( warehouse = warehouse, onWarehouseSelected = onWarehouseSelected diff --git a/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseSelectionView.kt b/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseSelectionView.kt index 7544b0a..6e0d83e 100644 --- a/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseSelectionView.kt +++ b/src/app/src/main/java/com/couchbase/learningpath/ui/project/WarehouseSelectionView.kt @@ -34,12 +34,12 @@ fun WarehouseSelectionView( navigationIcon = Icons.Filled.ArrowBack, navigationOnClick = { navigateUp() }) } - ) - { + ) { padding -> Surface( color = MaterialTheme.colors.background, modifier = Modifier.fillMaxSize() - ){ + .padding(padding) + ) { val onWarehouseSelected: (Warehouse) -> Unit = { warehouse -> viewModel.onWarehouseSelected(warehouse) diff --git a/src/app/src/main/res/values-night/themes.xml b/src/app/src/main/res/values-night/themes.xml index ec802c2..27cc7f6 100755 --- a/src/app/src/main/res/values-night/themes.xml +++ b/src/app/src/main/res/values-night/themes.xml @@ -10,6 +10,6 @@ @color/teal_200 @color/black - ?attr/colorPrimaryVariant + ?attr/colorPrimaryVariant \ No newline at end of file diff --git a/src/app/src/main/res/values/themes.xml b/src/app/src/main/res/values/themes.xml index 0f16f91..56c5cec 100644 --- a/src/app/src/main/res/values/themes.xml +++ b/src/app/src/main/res/values/themes.xml @@ -10,7 +10,7 @@ @color/teal_200 @color/black - ?attr/colorPrimaryVariant + ?attr/colorPrimaryVariant From 381f352cba4d7a2faaadfb92c89b86b0513ea472 Mon Sep 17 00:00:00 2001 From: Jeff Lockhart Date: Fri, 9 Dec 2022 23:45:57 -0700 Subject: [PATCH 3/3] Fix functional tests --- .../couchbase/learningpath/FunctionalTests.kt | 159 +++++------------- 1 file changed, 43 insertions(+), 116 deletions(-) diff --git a/src/app/src/androidTest/java/com/couchbase/learningpath/FunctionalTests.kt b/src/app/src/androidTest/java/com/couchbase/learningpath/FunctionalTests.kt index c709af7..df2a638 100644 --- a/src/app/src/androidTest/java/com/couchbase/learningpath/FunctionalTests.kt +++ b/src/app/src/androidTest/java/com/couchbase/learningpath/FunctionalTests.kt @@ -1,29 +1,19 @@ package com.couchbase.learningpath import androidx.compose.material.* -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.semantics import androidx.compose.ui.test.* import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.navigation.NavGraph.Companion.findStartDestination -import androidx.navigation.compose.rememberNavController import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.google.accompanist.insets.ProvideWindowInsets -import kotlinx.coroutines.launch import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import com.couchbase.learningpath.services.MockAuthenticationService import com.couchbase.learningpath.ui.MainActivity -import com.couchbase.learningpath.ui.components.Drawer -import com.couchbase.learningpath.ui.theme.LearningPathTheme +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.serialization.ExperimentalSerializationApi +@OptIn(ExperimentalMaterialApi::class, ExperimentalSerializationApi::class, ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) class FunctionalTests { //LoginView keys @@ -45,7 +35,7 @@ class FunctionalTests { //sample data private val testUsername1 = "demo@example.com" - private val testPassword = "password" + private val testPassword = "P@ssw0rd12" private val testFirstName1 = "Bob" private val testLastName1 = "Smith" private val testJobTitle1 = "Developer" @@ -55,7 +45,6 @@ class FunctionalTests { private val testLastName2 = "Doe" private val testJobTitle2 = "Sr. Developer Advocate" - @OptIn(ExperimentalMaterialApi::class) @get:Rule val composeTestRule = createAndroidComposeRule() @@ -63,11 +52,10 @@ class FunctionalTests { fun resetData() { } - @OptIn(ExperimentalMaterialApi::class) @Test fun testApplicationWorkflow() { - var resources = launchLoginScreenWithNavGraph() + val resources = getResources() composeTestRule.waitForIdle() //authenticate as testUser1 @@ -116,10 +104,15 @@ class FunctionalTests { //authenticate as testUser1 testAuthentication(testUsername1, testPassword, resources) + composeTestRule.onNodeWithContentDescription(resources[keyAppBarMenu].toString()) + .performClick() + + composeTestRule.onNodeWithText("Update User Profile") + .performClick() + assertUserProfile(testFirstName1, testLastName1, testJobTitle1, testUsername1, resources) } - @OptIn(ExperimentalMaterialApi::class) private fun testAuthentication( username: String, password: String, @@ -140,22 +133,32 @@ class FunctionalTests { composeTestRule.waitForIdle() } - @OptIn(ExperimentalMaterialApi::class) private fun testUserProfileForm( firstName: String, lastName: String, jobTitle: String, resources: Map ) { - composeTestRule.onNodeWithContentDescription(resources[keyTfFirstName].toString()) - .performTextInput(firstName) - composeTestRule.onNodeWithContentDescription(resources[keyTfLastName].toString()) - .performTextInput(lastName) - composeTestRule.onNodeWithContentDescription(resources[keyTfJobTitle].toString()) - .performTextInput(jobTitle) + composeTestRule.onNodeWithContentDescription(resources[keyAppBarMenu].toString()) + .performClick() + + composeTestRule.onNodeWithText("Update User Profile") + .performClick() + + composeTestRule.onNodeWithContentDescription(resources[keyTfFirstName].toString()).apply { + performTextClearance() + performTextInput(firstName) + } + composeTestRule.onNodeWithContentDescription(resources[keyTfLastName].toString()).apply { + performTextClearance() + performTextInput(lastName) + } + composeTestRule.onNodeWithContentDescription(resources[keyTfJobTitle].toString()).apply { + performTextClearance() + performTextInput(jobTitle) + } } - @OptIn(ExperimentalMaterialApi::class) private fun assertUserProfile( firstName: String, lastName: String, @@ -176,7 +179,6 @@ class FunctionalTests { .assert(hasText(jobTitle, ignoreCase = true)) } - @OptIn(ExperimentalMaterialApi::class) private fun logout(resources: Map) { composeTestRule.onNodeWithContentDescription(resources[keyAppBarMenu].toString()) .performClick() @@ -185,101 +187,26 @@ class FunctionalTests { .performClick() } - @OptIn(ExperimentalMaterialApi::class) - private fun launchLoginScreenWithNavGraph(): Map { - var resources = HashMap() - composeTestRule.setContent { - + private fun getResources(): Map { + val resources = HashMap() + with(composeTestRule.activity.resources) { // ** get resources for testing ** // ** LoginView - resources[keyTfUsername] = stringResource(id = R.string.tfUsername) - resources[keyTfPassword] = stringResource(id = R.string.tfPassword) - resources[keyBtnLogin] = stringResource(id = R.string.btnLogin) + resources[keyTfUsername] = getString(R.string.tfUsername) + resources[keyTfPassword] = getString(R.string.tfPassword) + resources[keyBtnLogin] = getString(R.string.btnLogin) //** UserProfileView - resources[keyLblEmail] = stringResource(id = R.string.lblEmail) - resources[keyTfFirstName] = stringResource(id = R.string.tfGivenName) - resources[keyTfLastName] = stringResource(id = R.string.tfSurname) - resources[keyTfJobTitle] = stringResource(id = R.string.tfJobTitle) - resources[keyBtnSave] = stringResource(id = R.string.btnSave) + resources[keyLblEmail] = getString(R.string.lblEmail) + resources[keyTfFirstName] = getString(R.string.tfGivenName) + resources[keyTfLastName] = getString(R.string.tfSurname) + resources[keyTfJobTitle] = getString(R.string.tfJobTitle) + resources[keyBtnSave] = getString(R.string.btnSave) //* Overflow Menu - resources[keyAppBarMenu] = stringResource(id = R.string.btnAppBarMenu) - resources[keyBtnMenu] = stringResource(id = R.string.btnMenu) - resources[keyBtnLogout] = stringResource(id = R.string.btnLogout) - - ProvideWindowInsets { - - val context = LocalContext.current - - val scope = rememberCoroutineScope() - val navController = rememberNavController() - val scaffoldState = rememberScaffoldState() - val authService = MockAuthenticationService() - - //we need a drawer overflow menu on multiple screens - //so we need top level scaffold. An event to open the drawer is passed - //to each screen that needs it. - val drawerState = rememberDrawerState(DrawerValue.Closed) - val openDrawer = { - scope.launch { - drawerState.open() - } - } - - LearningPathTheme() { - Scaffold(scaffoldState = scaffoldState, - snackbarHost = { - scaffoldState.snackbarHostState - }) { - ModalDrawer( - modifier = Modifier.semantics { contentDescription = "overflowMenu" }, - drawerState = drawerState, - gesturesEnabled = drawerState.isOpen, - drawerContent = { - Drawer( - modifier = Modifier.semantics { - contentDescription = "overflowMenu1" - }, - firstName = "", - lastName = "", - email = "", - team = "", - profilePicture = null, - onClicked = { route -> - scope.launch { - drawerState.close() - } - when (route) { - MainDestinations.LOGOUT_ROUTE -> { - authService.logout() - navController.navigate(MainDestinations.LOGIN_ROUTE) { - popUpTo(navController.graph.findStartDestination().id) { - inclusive = true - } - } - } - else -> { - navController.navigate(route) { - popUpTo(navController.graph.startDestinationId) - launchSingleTop = true - } - } - } - } - ) - } - ) { - InventoryNavGraph( - openDrawer = { openDrawer() }, - navController = navController, - scaffoldState = scaffoldState, - scope = scope - ) - } - } - } - } + resources[keyAppBarMenu] = getString(R.string.btnAppBarMenu) + resources[keyBtnMenu] = getString(R.string.btnMenu) + resources[keyBtnLogout] = getString(R.string.btnLogout) } return resources }