From 20f93cff44ccf17b17b444baf02d62bf2d33e56c Mon Sep 17 00:00:00 2001 From: Harrishan Date: Thu, 19 Dec 2024 21:38:35 +0100 Subject: [PATCH 1/4] fix: ensure that null values are caught and managed --- .../ui/components/ProfileComponents.kt | 7 +++++- .../periodpals/ui/profile/EditProfile.kt | 22 +++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/android/periodpals/ui/components/ProfileComponents.kt b/app/src/main/java/com/android/periodpals/ui/components/ProfileComponents.kt index be5a4e783..40a6d8ae4 100644 --- a/app/src/main/java/com/android/periodpals/ui/components/ProfileComponents.kt +++ b/app/src/main/java/com/android/periodpals/ui/components/ProfileComponents.kt @@ -220,7 +220,7 @@ fun ProfileSaveButton( descriptionState: TextFieldState, profileImageState: TextFieldState, byteArray: ByteArray?, - preferredDistance: Int, + preferredDistance: Int?, context: Context, userViewModel: UserViewModel, navigationActions: NavigationActions, @@ -241,6 +241,11 @@ fun ProfileSaveButton( Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show() return@Button } + if (preferredDistance == null) { + Log.d(LOG_TAG, LOG_FAILURE) + Toast.makeText(context, TOAST_FAILURE, Toast.LENGTH_SHORT).show() + return@Button + } Log.d(LOG_TAG, LOG_SAVING_PROFILE) val newUser = diff --git a/app/src/main/java/com/android/periodpals/ui/profile/EditProfile.kt b/app/src/main/java/com/android/periodpals/ui/profile/EditProfile.kt index d851e6eea..aaeb8b420 100644 --- a/app/src/main/java/com/android/periodpals/ui/profile/EditProfile.kt +++ b/app/src/main/java/com/android/periodpals/ui/profile/EditProfile.kt @@ -72,23 +72,27 @@ fun EditProfileScreen(userViewModel: UserViewModel, navigationActions: Navigatio formState.reset() val nameState = formState.getState(UserViewModel.NAME_STATE_NAME) - nameState.change(userState.value?.name ?: "") val dobState = formState.getState(UserViewModel.DOB_STATE_NAME) - dobState.change(userState.value?.dob ?: "") val descriptionState = formState.getState(UserViewModel.DESCRIPTION_STATE_NAME) - descriptionState.change(userState.value?.description ?: "") val profileImageState = formState.getState(UserViewModel.PROFILE_IMAGE_STATE_NAME) - profileImageState.change(userState.value?.imageUrl ?: DEFAULT_PROFILE_PICTURE) + + userState.value?.let { + nameState.change(it.name) + dobState.change(it.dob) + descriptionState.change(it.description) + profileImageState.change(it.imageUrl) + } + var userAvatarState by remember { - mutableStateOf(userAvatar?.value ?: Uri.parse(DEFAULT_PROFILE_PICTURE).uriToByteArray(context)) + mutableStateOf(userAvatar.value ?: Uri.parse(DEFAULT_PROFILE_PICTURE).uriToByteArray(context)) } val launcher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - profileImageState.change(result.data?.data.toString()) - userAvatarState = result.data?.data?.uriToByteArray(context) + if ((result.resultCode == Activity.RESULT_OK) && (result.data != null)) { + profileImageState.change(result.data!!.data.toString()) + userAvatarState = result.data!!.data?.uriToByteArray(context) } } @@ -165,7 +169,7 @@ fun EditProfileScreen(userViewModel: UserViewModel, navigationActions: Navigatio descriptionState, profileImageState, userAvatarState, - userViewModel.user.value!!.preferredDistance, + userViewModel.user.value?.preferredDistance, context, userViewModel, navigationActions, From ef34af53fbb8e875e31f4c7ee258b5eab10987c8 Mon Sep 17 00:00:00 2001 From: Harrishan Date: Thu, 19 Dec 2024 22:10:14 +0100 Subject: [PATCH 2/4] fix: user is not loaded when `loadAuthenticationUserDataFails` in `GPSServiceImpl` --- .../periodpals/services/GPSServiceImpl.kt | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/android/periodpals/services/GPSServiceImpl.kt b/app/src/main/java/com/android/periodpals/services/GPSServiceImpl.kt index 1ab6fe93a..837ca9ea4 100644 --- a/app/src/main/java/com/android/periodpals/services/GPSServiceImpl.kt +++ b/app/src/main/java/com/android/periodpals/services/GPSServiceImpl.kt @@ -199,17 +199,20 @@ class GPSServiceImpl( private fun uploadUserLocation() { Log.d(TAG_UPLOAD_LOCATION, "Uploading user location") authenticationViewModel.loadAuthenticationUserData( - onFailure = { Log.d(TAG_UPLOAD_LOCATION, "Authentication data is null") }) - userViewModel.loadUser( - authenticationViewModel.authUserData.value!!.uid, onSuccess = { - val newUser = - userViewModel.user.value?.copy(locationGIS = parseLocationGIS(_location.value)) - if (newUser != null) { - userViewModel.saveUser(user = newUser) - } - Log.d(TAG_UPLOAD_LOCATION, "success callback: user location uploaded") - }) + Log.d(TAG_UPLOAD_LOCATION, "Authentication data loaded") + userViewModel.loadUser( + authenticationViewModel.authUserData.value!!.uid, + onSuccess = { + val newUser = + userViewModel.user.value?.copy(locationGIS = parseLocationGIS(_location.value)) + if (newUser != null) { + userViewModel.saveUser(user = newUser) + } + Log.d(TAG_UPLOAD_LOCATION, "success callback: user location uploaded") + }) + }, + onFailure = { Log.d(TAG_UPLOAD_LOCATION, "Authentication data is null") }) } /** From bb65f0518e0e1649e672bbd4e19dcabb63e712cc Mon Sep 17 00:00:00 2001 From: Harrishan Date: Thu, 19 Dec 2024 22:23:00 +0100 Subject: [PATCH 3/4] fix: load user after a successful load auth data in `ProfileScreen` --- .../periodpals/ui/profile/ProfileScreen.kt | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/android/periodpals/ui/profile/ProfileScreen.kt b/app/src/main/java/com/android/periodpals/ui/profile/ProfileScreen.kt index 49497ab8b..435d17752 100644 --- a/app/src/main/java/com/android/periodpals/ui/profile/ProfileScreen.kt +++ b/app/src/main/java/com/android/periodpals/ui/profile/ProfileScreen.kt @@ -243,17 +243,17 @@ fun init( onSuccess = { Log.d(TAG, "Authentication data loaded successfully") chatViewModel.connectUser(userState, authenticationViewModel = authenticationViewModel) + userViewModel.loadUser( + authenticationViewModel.authUserData.value!!.uid, + onSuccess = { + userViewModel.user.value?.let { + userViewModel.downloadFile( + it.imageUrl, + onSuccess = { onSuccess() }, + onFailure = { e: Exception -> onFailure(Exception(e)) }) + } + }, + onFailure = { e: Exception -> onFailure(Exception(e)) }) }, onFailure = { Log.d(TAG, "Authentication data is null") }) - userViewModel.loadUser( - authenticationViewModel.authUserData.value!!.uid, - onSuccess = { - userViewModel.user.value?.let { - userViewModel.downloadFile( - it.imageUrl, - onSuccess = { onSuccess() }, - onFailure = { e: Exception -> onFailure(Exception(e)) }) - } - }, - onFailure = { e: Exception -> onFailure(Exception(e)) }) } From 3fad4f4765ce9a6394ef3eaeb6573db4ad1591b0 Mon Sep 17 00:00:00 2001 From: Harrishan Date: Fri, 20 Dec 2024 06:17:34 +0100 Subject: [PATCH 4/4] test: return value when `userviewModel.avatar` is called --- .../java/com/android/periodpals/ui/profile/EditProfileTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/test/java/com/android/periodpals/ui/profile/EditProfileTest.kt b/app/src/test/java/com/android/periodpals/ui/profile/EditProfileTest.kt index 5fd1f3e64..a4ad6ccdf 100644 --- a/app/src/test/java/com/android/periodpals/ui/profile/EditProfileTest.kt +++ b/app/src/test/java/com/android/periodpals/ui/profile/EditProfileTest.kt @@ -118,6 +118,7 @@ class EditProfileTest { `when`(navigationActions.currentRoute()).thenReturn(Route.PROFILE) `when`(userViewModel.formState).thenReturn(formState) + `when`(userViewModel.avatar).thenReturn(mutableStateOf(ByteArray(0))) } @Test