From d1e5971bad72b94cdde61f9055a7f7d7ab35f544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=81ctor=20Abraham?= Date: Fri, 1 Aug 2025 11:45:41 +0200 Subject: [PATCH 1/6] Create API module --- api/.gitignore | 1 + api/build.gradle.kts | 17 +++++++++++++++++ api/consumer-rules.pro | 0 api/proguard-rules.pro | 21 +++++++++++++++++++++ api/src/main/AndroidManifest.xml | 4 ++++ settings.gradle.kts | 1 + 6 files changed, 44 insertions(+) create mode 100644 api/.gitignore create mode 100644 api/build.gradle.kts create mode 100644 api/consumer-rules.pro create mode 100644 api/proguard-rules.pro create mode 100644 api/src/main/AndroidManifest.xml diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/api/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/api/build.gradle.kts b/api/build.gradle.kts new file mode 100644 index 00000000..509c50fd --- /dev/null +++ b/api/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("java-library") + alias(libs.plugins.kotlin.jvm) +} +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + + dependencies { + implementation(libs.kotlinx.coroutines) + } +} +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} diff --git a/api/consumer-rules.pro b/api/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/api/proguard-rules.pro b/api/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/api/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/api/src/main/AndroidManifest.xml b/api/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/api/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index af91a4b3..2046cba4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,3 +39,4 @@ include(":foundations") include(":clock") include(":design") include(":networkMonitor") +include(":api") From ff250a7bcec89239d55f2b7184a0c1060bb89d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=81ctor=20Abraham?= Date: Fri, 1 Aug 2025 16:53:08 +0200 Subject: [PATCH 2/6] Add API module with delete profile method --- api/build.gradle.kts | 11 ++ .../kotlin/com/gravatar/app/di/ApiModule.kt | 27 +++++ .../gravatar/app/model/DeleteAccountStatus.kt | 9 ++ .../com/gravatar/app/restapi/GravatarApi.kt | 24 +++++ .../gravatar/app/services/GravatarService.kt | 29 ++++++ gradle/libs.versions.toml | 5 + ...outAppDialogTest.aboutAppDialogVisible.png | Bin 49554 -> 66009 bytes .../gravatar/app/homeUi/di/HomeUiModule.kt | 2 + .../topbar/components/AboutAppDialog.kt | 29 +++++- .../topbar/components/AboutAppDialogEvent.kt | 5 + .../components/AboutAppDialogViewModel.kt | 25 +++++ homeUi/src/main/res/values/strings.xml | 3 + .../topbar/components/AboutAppDialogTest.kt | 1 + .../components/AboutAppDialogViewModelTest.kt | 42 ++++++++ userComponent/build.gradle.kts | 1 + .../app/usercomponent/di/HttpClientModule.kt | 3 + .../usercomponent/di/UserComponentModule.kt | 3 + .../usecase/DeleteUserProfileUseCase.kt | 27 +++++ .../usecase/DeleteUserProfileUseCaseTest.kt | 95 ++++++++++++++++++ 19 files changed, 340 insertions(+), 1 deletion(-) create mode 100644 api/src/main/kotlin/com/gravatar/app/di/ApiModule.kt create mode 100644 api/src/main/kotlin/com/gravatar/app/model/DeleteAccountStatus.kt create mode 100644 api/src/main/kotlin/com/gravatar/app/restapi/GravatarApi.kt create mode 100644 api/src/main/kotlin/com/gravatar/app/services/GravatarService.kt create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogEvent.kt create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModel.kt create mode 100644 homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt create mode 100644 userComponent/src/main/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCase.kt create mode 100644 userComponent/src/test/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCaseTest.kt diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 509c50fd..004abde6 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,13 +1,24 @@ plugins { id("java-library") alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.ksp) } java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 dependencies { + implementation(project(":foundations")) + + implementation(project.dependencies.platform(libs.koin.bom)) + implementation(libs.koin.core) implementation(libs.kotlinx.coroutines) + implementation(libs.retrofit) + implementation(libs.retrofit.serialization) + ksp(libs.moshi.kotlin.codegen) + + // Test dependencies + testImplementation(libs.junit) } } kotlin { diff --git a/api/src/main/kotlin/com/gravatar/app/di/ApiModule.kt b/api/src/main/kotlin/com/gravatar/app/di/ApiModule.kt new file mode 100644 index 00000000..8f87eb46 --- /dev/null +++ b/api/src/main/kotlin/com/gravatar/app/di/ApiModule.kt @@ -0,0 +1,27 @@ +package com.gravatar.app.di + +import com.gravatar.app.restapi.GravatarApi +import com.gravatar.app.services.GravatarService +import com.gravatar.app.services.GravatarServiceImpl +import com.squareup.moshi.Moshi +import org.koin.dsl.module +import retrofit2.Retrofit +import retrofit2.converter.moshi.MoshiConverterFactory + +val apiModule = module { + single { + Retrofit.Builder() + .baseUrl("https://api.gravatar.com/v3/") + .addConverterFactory( + MoshiConverterFactory.create() + ) + .build() + } + single { get().create(GravatarApi::class.java) } + single { + GravatarServiceImpl( + gravatarApi = get(), + dispatchers = get() + ) + } +} \ No newline at end of file diff --git a/api/src/main/kotlin/com/gravatar/app/model/DeleteAccountStatus.kt b/api/src/main/kotlin/com/gravatar/app/model/DeleteAccountStatus.kt new file mode 100644 index 00000000..fe59f182 --- /dev/null +++ b/api/src/main/kotlin/com/gravatar/app/model/DeleteAccountStatus.kt @@ -0,0 +1,9 @@ +package com.gravatar.app.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class DeleteAccountStatus( + @Json(name = "status") val status: String = "disabled", +) \ No newline at end of file diff --git a/api/src/main/kotlin/com/gravatar/app/restapi/GravatarApi.kt b/api/src/main/kotlin/com/gravatar/app/restapi/GravatarApi.kt new file mode 100644 index 00000000..90d16e48 --- /dev/null +++ b/api/src/main/kotlin/com/gravatar/app/restapi/GravatarApi.kt @@ -0,0 +1,24 @@ +package com.gravatar.app.restapi + +import com.gravatar.app.model.DeleteAccountStatus +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +/** + * Interface defining the Gravatar API endpoints. + */ +internal interface GravatarApi { + /** + * Disables the user's Gravatar account. + * Makes a POST request to https://api.gravatar.com/v3/me/status + * + * @return [Result] indicating success or failure of the operation + */ + @POST("me/status") + suspend fun disableAccount( + @Header("Authorization") authorization: String, + @Body body: DeleteAccountStatus = DeleteAccountStatus() + ): Response +} diff --git a/api/src/main/kotlin/com/gravatar/app/services/GravatarService.kt b/api/src/main/kotlin/com/gravatar/app/services/GravatarService.kt new file mode 100644 index 00000000..81c64b07 --- /dev/null +++ b/api/src/main/kotlin/com/gravatar/app/services/GravatarService.kt @@ -0,0 +1,29 @@ +package com.gravatar.app.services + +import com.gravatar.app.foundations.DispatcherProvider +import com.gravatar.app.restapi.GravatarApi +import kotlinx.coroutines.withContext + +internal class GravatarServiceImpl( + private val gravatarApi: GravatarApi, + private val dispatchers: DispatcherProvider +) : GravatarService { + + override suspend fun deleteProfile(authorization: String): Result = withContext(dispatchers.io) { + return@withContext try { + val response = gravatarApi.disableAccount("Bearer $authorization") + + if (response.isSuccessful) { + Result.success(Unit) + } else { + Result.failure(Exception("Failed to disable account.")) + } + } catch (e: Exception) { + Result.failure(e) + } + } +} + +interface GravatarService { + suspend fun deleteProfile(authorization: String): Result +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d13b4872..99639ff2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ kotlin = "2.1.21" lifecycleRuntimeKtx = "2.9.1" navigationCompose = "2.9.0" mockk = "1.14.2" +retrofit = "3.0.0" roborazzi = "1.45.1" robolectric = "4.14.1" room = "2.7.2" @@ -27,6 +28,7 @@ ucrop = "2.2.11" androidxTestCore = "1.6.1" constraintLayout = "1.1.0" qrose= "1.0.1" +moshi = "1.15.2" [libraries] kotlinx-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinCoroutines" } @@ -72,6 +74,9 @@ ktor-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" ktor-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" } ktor-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" } ktor-serialization-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" } +moshi-kotlin-codegen = { group = "com.squareup.moshi", name = "moshi-kotlin-codegen", version.ref = "moshi" } +retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } +retrofit-serialization = { group = "com.squareup.retrofit2", name = "converter-moshi", version.ref = "retrofit" } room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } diff --git a/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.aboutAppDialogVisible.png b/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.aboutAppDialogVisible.png index f9e7d36a2bf778a7691b18446f76bf5e818e2701..79ae83c855b1e136bc855d5e7ac5b659bc044a2c 100644 GIT binary patch delta 45157 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 diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/di/HomeUiModule.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/di/HomeUiModule.kt index 6160dd41..29ace663 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/di/HomeUiModule.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/di/HomeUiModule.kt @@ -5,6 +5,7 @@ import com.gravatar.app.homeUi.presentation.DrawableUtils import com.gravatar.app.homeUi.presentation.FileUtils import com.gravatar.app.homeUi.presentation.home.HomeViewModel import com.gravatar.app.homeUi.presentation.home.components.topbar.TopBarPickerPopupViewModel +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogViewModel import com.gravatar.app.homeUi.presentation.home.gravatar.GravatarViewModel import com.gravatar.app.homeUi.presentation.home.profile.ProfileViewModel import com.gravatar.app.homeUi.presentation.home.share.ShareViewModel @@ -21,6 +22,7 @@ val homeUiModule = module { viewModelOf(::ProfileViewModel) viewModelOf(::GravatarViewModel) viewModelOf(::TopBarPickerPopupViewModel) + viewModelOf(::AboutAppDialogViewModel) viewModelOf(::ShareViewModel) viewModelOf(::HomeViewModel) diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt index e11262a7..88b8d04d 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt @@ -26,12 +26,14 @@ import com.gravatar.app.design.components.dialog.GravatarDialog import com.gravatar.app.design.theme.GravatarAppTheme import com.gravatar.app.homeUi.AppVersion import com.gravatar.app.homeUi.R +import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject @OptIn(ExperimentalMaterial3Api::class) @Composable internal fun AboutAppDialog( onDismissRequest: () -> Unit, + viewModel: AboutAppDialogViewModel = koinViewModel() ) { val appVersion: AppVersion = koinInject() GravatarDialog( @@ -40,6 +42,7 @@ internal fun AboutAppDialog( AboutAppDialogContent( appVersion = appVersion.value, onDone = onDismissRequest, + onEvent = viewModel::onEvent, modifier = Modifier ) } @@ -50,6 +53,7 @@ internal fun AboutAppDialog( internal fun AboutAppDialogContent( appVersion: String, onDone: () -> Unit, + onEvent: (AboutAppDialogEvent) -> Unit, modifier: Modifier = Modifier, ) { val context = LocalContext.current @@ -109,6 +113,28 @@ internal fun AboutAppDialogContent( } ) } + Column { + Text( + text = stringResource(R.string.about_app_dialog_delete_account), + style = MaterialTheme.typography.titleMedium.copy( + fontWeight = FontWeight.SemiBold + ), + modifier = modifier.padding(top = 4.dp), + ) + DialogText( + text = stringResource(R.string.about_app_dialog_delete_profile_description), + ) + Text( + text = stringResource(R.string.about_app_dialog_delete_account_button), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onErrorContainer, + modifier = Modifier + .padding(top = 8.dp) + .clickable { + onEvent(AboutAppDialogEvent.OnDeleteAccount) + } + ) + } PrimaryButton( text = stringResource(R.string.done_button_cta), onClick = onDone, @@ -150,7 +176,8 @@ private fun AboutAppDialogContentPreview() { AboutAppDialogContent( appVersion = "0.0.1", onDone = { }, - modifier = Modifier.fillMaxWidth(), + onEvent = { _ -> }, + modifier = Modifier.fillMaxWidth() ) } } diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogEvent.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogEvent.kt new file mode 100644 index 00000000..c07621f3 --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogEvent.kt @@ -0,0 +1,5 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components + +sealed class AboutAppDialogEvent { + data object OnDeleteAccount : AboutAppDialogEvent() +} diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModel.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModel.kt new file mode 100644 index 00000000..54a66e97 --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModel.kt @@ -0,0 +1,25 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfile +import kotlinx.coroutines.launch + +class AboutAppDialogViewModel( + private val deleteUserProfile: DeleteUserProfile, +) : ViewModel() { + + fun onEvent(event: AboutAppDialogEvent) { + when (event) { + AboutAppDialogEvent.OnDeleteAccount -> { + deleteProfile() + } + } + } + + private fun deleteProfile() { + viewModelScope.launch { + deleteUserProfile() + } + } +} diff --git a/homeUi/src/main/res/values/strings.xml b/homeUi/src/main/res/values/strings.xml index aa181f4d..d6bef425 100644 --- a/homeUi/src/main/res/values/strings.xml +++ b/homeUi/src/main/res/values/strings.xml @@ -76,6 +76,7 @@ Legal Terms of Service Privacy Policy + Delete account Done Share info from your Gravatar profile. Name @@ -87,4 +88,6 @@ Expand QR Code for sharing contact information QR Code Close + Delete account + No longer using Gravatar? Delete your account here. diff --git a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt index 4b6e4ff7..b5ed948c 100644 --- a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt +++ b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt @@ -12,6 +12,7 @@ class AboutAppDialogTest : RoborazziTest() { AboutAppDialogContent( appVersion = "1.0.0", onDone = {}, + onEvent = { _ -> } ) } } diff --git a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt new file mode 100644 index 00000000..773fca87 --- /dev/null +++ b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt @@ -0,0 +1,42 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components + +import com.gravatar.app.testUtils.CoroutineTestRule +import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfile +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +@OptIn(ExperimentalCoroutinesApi::class) +class AboutAppDialogViewModelTest { + private val testDispatcher = StandardTestDispatcher() + + @get:Rule + var coroutineTestRule = CoroutineTestRule(testDispatcher) + + private val deleteUserProfile: DeleteUserProfile = mockk() + private lateinit var viewModel: AboutAppDialogViewModel + + @Before + fun setup() { + coEvery { deleteUserProfile.invoke() } returns Result.success(Unit) + + viewModel = AboutAppDialogViewModel(deleteUserProfile) + } + + @Test + fun `when OnDeleteAccount event is received then deleteUserProfile is invoked`() = runTest { + // When + viewModel.onEvent(AboutAppDialogEvent.OnDeleteAccount) + advanceUntilIdle() + + // Then + coVerify { deleteUserProfile.invoke() } + } +} diff --git a/userComponent/build.gradle.kts b/userComponent/build.gradle.kts index 7740fb9a..80e94584 100644 --- a/userComponent/build.gradle.kts +++ b/userComponent/build.gradle.kts @@ -17,6 +17,7 @@ android { dependencies { implementation(project(":foundations")) implementation(project(":clock")) + implementation(project(":api")) implementation(libs.kotlinx.coroutines) implementation(libs.androidx.datastore.prefs) diff --git a/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/HttpClientModule.kt b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/HttpClientModule.kt index ac49c4dd..a28bdaaa 100644 --- a/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/HttpClientModule.kt +++ b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/HttpClientModule.kt @@ -1,5 +1,6 @@ package com.gravatar.app.usercomponent.di +import com.gravatar.app.di.apiModule import com.gravatar.app.usercomponent.data.interceptors.UnauthorizeInterceptor import com.gravatar.app.usercomponent.domain.usecase.Logout import com.gravatar.services.AvatarService @@ -35,4 +36,6 @@ internal val httpClientModule = module { } single { ProfileService(okHttpClient = get()) } single { AvatarService(okHttpClient = get()) } + + includes(apiModule) } diff --git a/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/UserComponentModule.kt b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/UserComponentModule.kt index 3fa2bba9..e1bc99c1 100644 --- a/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/UserComponentModule.kt +++ b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/di/UserComponentModule.kt @@ -15,6 +15,8 @@ import com.gravatar.app.usercomponent.domain.repository.ProfileRepository import com.gravatar.app.usercomponent.domain.repository.UserRepository import com.gravatar.app.usercomponent.domain.usecase.DeleteUserAvatar import com.gravatar.app.usercomponent.domain.usecase.DeleteUserAvatarUseCase +import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfile +import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfileUseCase import com.gravatar.app.usercomponent.domain.usecase.FetchAvatarsUseCase import com.gravatar.app.usercomponent.domain.usecase.FetchUserAvatars import com.gravatar.app.usercomponent.domain.usecase.GetAvatarUrl @@ -58,6 +60,7 @@ val userComponentModule = module { factoryOf(::UpdateUserSharePreferencesUseCase) { bind() } factoryOf(::GetPrivateContactInfoUseCase) { bind() } factoryOf(::UpdatePrivateContactInfoUseCase) { bind() } + factoryOf(::DeleteUserProfileUseCase) { bind() } factoryOf(::UserSharePreferencesOperations) { bind() } factoryOf(::PrivateContactInfoOperations) { bind() } factoryOf(::WordPressClient) diff --git a/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCase.kt b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCase.kt new file mode 100644 index 00000000..d4cf26db --- /dev/null +++ b/userComponent/src/main/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCase.kt @@ -0,0 +1,27 @@ +package com.gravatar.app.usercomponent.domain.usecase + +import com.gravatar.app.services.GravatarService +import com.gravatar.app.usercomponent.domain.repository.AuthRepository + +internal class DeleteUserProfileUseCase( + private val gravatarService: GravatarService, + private val authRepository: AuthRepository, + private val logout: Logout +) : DeleteUserProfile { + + override suspend fun invoke(): Result { + val token = authRepository.getToken() + return if (token != null) { + gravatarService.deleteProfile(token) + .onSuccess { + logout() + } + } else { + Result.failure(IllegalStateException("User is not logged in")) + } + } +} + +interface DeleteUserProfile { + suspend operator fun invoke(): Result +} diff --git a/userComponent/src/test/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCaseTest.kt b/userComponent/src/test/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCaseTest.kt new file mode 100644 index 00000000..986385d4 --- /dev/null +++ b/userComponent/src/test/kotlin/com/gravatar/app/usercomponent/domain/usecase/DeleteUserProfileUseCaseTest.kt @@ -0,0 +1,95 @@ +package com.gravatar.app.usercomponent.domain.usecase + +import com.gravatar.app.services.GravatarService +import com.gravatar.app.testUtils.CoroutineTestRule +import com.gravatar.app.usercomponent.domain.repository.AuthRepository +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +@OptIn(ExperimentalCoroutinesApi::class) +class DeleteUserProfileUseCaseTest { + private val testDispatcher = StandardTestDispatcher() + + @get:Rule + var coroutineTestRule = CoroutineTestRule(testDispatcher) + + private val gravatarService: GravatarService = mockk() + private val authRepository: AuthRepository = mockk() + private val logout: Logout = mockk() + private lateinit var deleteUserProfileUseCase: DeleteUserProfileUseCase + + private val testToken = "test-token" + + @Before + fun setup() { + deleteUserProfileUseCase = DeleteUserProfileUseCase( + gravatarService = gravatarService, + authRepository = authRepository, + logout = logout + ) + + // Default mock behavior + coEvery { logout.invoke() } returns Unit + } + + @Test + fun `invoke should return success when user is logged in and profile deletion succeeds`() = runTest { + // Given + coEvery { authRepository.getToken() } returns testToken + coEvery { gravatarService.deleteProfile(testToken) } returns Result.success(Unit) + + // When + val result = deleteUserProfileUseCase.invoke() + + // Then + assertTrue(result.isSuccess) + coVerify { authRepository.getToken() } + coVerify { gravatarService.deleteProfile(testToken) } + coVerify { logout.invoke() } + } + + @Test + fun `invoke should return failure when user is not logged in`() = runTest { + // Given + coEvery { authRepository.getToken() } returns null + + // When + val result = deleteUserProfileUseCase.invoke() + + // Then + assertTrue(result.isFailure) + val exception = result.exceptionOrNull() + assertTrue(exception is IllegalStateException) + assertEquals("User is not logged in", exception?.message) + coVerify { authRepository.getToken() } + coVerify(exactly = 0) { gravatarService.deleteProfile(any()) } + coVerify(exactly = 0) { logout.invoke() } + } + + @Test + fun `invoke should return failure when profile deletion fails`() = runTest { + // Given + val testException = Exception("Service error") + coEvery { authRepository.getToken() } returns testToken + coEvery { gravatarService.deleteProfile(testToken) } returns Result.failure(testException) + + // When + val result = deleteUserProfileUseCase.invoke() + + // Then + assertTrue(result.isFailure) + assertEquals(testException, result.exceptionOrNull()) + coVerify { authRepository.getToken() } + coVerify { gravatarService.deleteProfile(testToken) } + coVerify(exactly = 0) { logout.invoke() } + } +} From 52bc9cbd6b28092fadb7f157b4dbe32fed12927b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=81ctor=20Abraham?= Date: Sat, 2 Aug 2025 01:06:01 +0200 Subject: [PATCH 3/6] Profile deletion confirmation dialog --- ...t.deleteConfirmationBottomSheetVisible.png | Bin 0 -> 69878 bytes .../gravatar/app/homeUi/di/HomeUiModule.kt | 2 +- .../topbar/components/AboutAppDialogEvent.kt | 5 - .../components/AboutAppDialogViewModel.kt | 25 ----- .../components/{ => about}/AboutAppDialog.kt | 40 ++++++-- .../components/about/AboutAppDialogEvent.kt | 7 ++ .../components/about/AboutAppDialogState.kt | 6 ++ .../about/AboutAppDialogViewModel.kt | 60 +++++++++++ .../about/DeleteConfirmationBottomSheet.kt | 96 ++++++++++++++++++ .../home/gravatar/GravatarScreen.kt | 2 +- .../home/profile/ProfileScreen.kt | 2 +- .../presentation/home/share/ShareScreen.kt | 2 +- homeUi/src/main/res/values/strings.xml | 3 + .../topbar/components/AboutAppDialogTest.kt | 14 +++ .../components/AboutAppDialogViewModelTest.kt | 91 ++++++++++++++++- 15 files changed, 311 insertions(+), 44 deletions(-) create mode 100644 homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.deleteConfirmationBottomSheetVisible.png delete mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogEvent.kt delete mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModel.kt rename homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/{ => about}/AboutAppDialog.kt (82%) create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogEvent.kt create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt create mode 100644 homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/DeleteConfirmationBottomSheet.kt diff --git a/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.deleteConfirmationBottomSheetVisible.png b/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.deleteConfirmationBottomSheetVisible.png new file mode 100644 index 0000000000000000000000000000000000000000..a187d055834dcbaad466127e424fa7b8f8023f8f GIT binary patch literal 69878 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

m>j`cnu>AsM4>w|< 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 { - deleteProfile() - } - } - } - - private fun deleteProfile() { - viewModelScope.launch { - deleteUserProfile() - } - } -} diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt similarity index 82% rename from homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt rename to homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt index 88b8d04d..fc95c2fe 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialog.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt @@ -1,17 +1,22 @@ -package com.gravatar.app.homeUi.presentation.home.components.topbar.components +package com.gravatar.app.homeUi.presentation.home.components.topbar.components.about import android.content.Context import android.content.Intent import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -36,17 +41,36 @@ internal fun AboutAppDialog( viewModel: AboutAppDialogViewModel = koinViewModel() ) { val appVersion: AppVersion = koinInject() + val uiState by viewModel.uiState.collectAsState() + GravatarDialog( onDismissRequest = onDismissRequest, content = { - AboutAppDialogContent( - appVersion = appVersion.value, - onDone = onDismissRequest, - onEvent = viewModel::onEvent, - modifier = Modifier - ) + if (uiState.isLoading) { + Box(contentAlignment = Alignment.Center) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onSurfaceVariant, + strokeWidth = 4.dp, + modifier = Modifier.padding(16.dp) + ) + } + } else { + AboutAppDialogContent( + appVersion = appVersion.value, + onDone = onDismissRequest, + onEvent = viewModel::onEvent, + modifier = Modifier + ) + } } ) + + if (uiState.isDeleteConfirmationVisible) { + DeleteConfirmationBottomSheet( + onDismiss = { viewModel.onEvent(AboutAppDialogEvent.OnHideDeleteConfirmation) }, + onConfirm = { viewModel.onEvent(AboutAppDialogEvent.OnConfirmDeleteAccount) } + ) + } } @Composable @@ -131,7 +155,7 @@ internal fun AboutAppDialogContent( modifier = Modifier .padding(top = 8.dp) .clickable { - onEvent(AboutAppDialogEvent.OnDeleteAccount) + onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) } ) } diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogEvent.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogEvent.kt new file mode 100644 index 00000000..07654c54 --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogEvent.kt @@ -0,0 +1,7 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components.about + +sealed class AboutAppDialogEvent { + data object OnShowDeleteConfirmation : AboutAppDialogEvent() + data object OnHideDeleteConfirmation : AboutAppDialogEvent() + data object OnConfirmDeleteAccount : AboutAppDialogEvent() +} diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt new file mode 100644 index 00000000..c4108f0d --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt @@ -0,0 +1,6 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components.about + +internal data class AboutAppDialogState( + val isDeleteConfirmationVisible: Boolean = false, + val isLoading: Boolean = false, +) diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt new file mode 100644 index 00000000..bfb32dbe --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt @@ -0,0 +1,60 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components.about + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfile +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +internal class AboutAppDialogViewModel( + private val deleteUserProfile: DeleteUserProfile, +) : ViewModel() { + + private val _uiState = MutableStateFlow(AboutAppDialogState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun onEvent(event: AboutAppDialogEvent) { + when (event) { + AboutAppDialogEvent.OnShowDeleteConfirmation -> { + showDeleteConfirmation() + } + + AboutAppDialogEvent.OnHideDeleteConfirmation -> { + hideDeleteConfirmation() + } + + AboutAppDialogEvent.OnConfirmDeleteAccount -> { + deleteProfile() + hideDeleteConfirmation() + } + } + } + + private fun showDeleteConfirmation() { + _uiState.update { currentState -> + currentState.copy(isDeleteConfirmationVisible = true) + } + } + + private fun hideDeleteConfirmation() { + _uiState.update { currentState -> + currentState.copy(isDeleteConfirmationVisible = false) + } + } + + private fun deleteProfile() { + viewModelScope.launch { + _uiState.update { currentState -> + currentState.copy(isLoading = true) + } + deleteUserProfile().onFailure { + _uiState.update { currentState -> + currentState.copy(isLoading = false) + } + } + } + } +} diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/DeleteConfirmationBottomSheet.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/DeleteConfirmationBottomSheet.kt new file mode 100644 index 00000000..bf1a9c67 --- /dev/null +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/DeleteConfirmationBottomSheet.kt @@ -0,0 +1,96 @@ +package com.gravatar.app.homeUi.presentation.home.components.topbar.components.about + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.gravatar.app.homeUi.R +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun DeleteConfirmationBottomSheet( + onDismiss: () -> Unit, + onConfirm: () -> Unit +) { + val sheetState = rememberModalBottomSheetState() + val scope = rememberCoroutineScope() + + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = sheetState + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = stringResource(R.string.about_app_dialog_delete_profile_confirmation_title), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, + textAlign = TextAlign.Center + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = stringResource(R.string.about_app_dialog_delete_profile_confirmation_description), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center + ) + + Spacer(modifier = Modifier.height(24.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(16.dp, Alignment.CenterHorizontally), + ) { + TextButton( + onClick = { + scope.launch { + sheetState.hide() + onDismiss() + } + }, + modifier = Modifier.weight(1f), + ) { + Text(text = stringResource(R.string.about_app_dialog_delete_profile_confirmation_cancel)) + } + + TextButton( + onClick = { + scope.launch { + sheetState.hide() + onConfirm() + } + }, + modifier = Modifier.weight(1f), + ) { + Text( + text = stringResource(R.string.about_app_dialog_delete_account_button), + color = MaterialTheme.colorScheme.error + ) + } + } + } + } +} diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/gravatar/GravatarScreen.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/gravatar/GravatarScreen.kt index 0e02298e..59fb7261 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/gravatar/GravatarScreen.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/gravatar/GravatarScreen.kt @@ -54,7 +54,7 @@ import com.gravatar.app.homeUi.GravatarFileProvider import com.gravatar.app.homeUi.R import com.gravatar.app.homeUi.presentation.home.components.ErrorViewWithRetry import com.gravatar.app.homeUi.presentation.home.components.PermissionRationaleDialog -import com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialog +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialog import com.gravatar.app.homeUi.presentation.home.gravatar.components.AvatarDeletionConfirmationDialog import com.gravatar.app.homeUi.presentation.home.gravatar.components.AvatarOption import com.gravatar.app.homeUi.presentation.home.gravatar.components.CollapsibleTopAppBar diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/profile/ProfileScreen.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/profile/ProfileScreen.kt index 065e117e..46d2cc03 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/profile/ProfileScreen.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/profile/ProfileScreen.kt @@ -39,7 +39,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.gravatar.app.design.components.snackbar.SnackbarType import com.gravatar.app.design.components.snackbar.showGravatarSnackbar import com.gravatar.app.homeUi.R -import com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialog +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialog import com.gravatar.app.homeUi.presentation.home.profile.about.AboutInputField import com.gravatar.app.homeUi.presentation.home.profile.about.AboutSection import com.gravatar.app.homeUi.presentation.home.profile.header.AnimatedProfileHeader diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt index 184e6274..40797d0e 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt @@ -30,7 +30,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.repeatOnLifecycle import com.gravatar.app.design.theme.GravatarAppTheme import com.gravatar.app.homeUi.GravatarFileProvider -import com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialog +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialog import com.gravatar.app.homeUi.presentation.home.share.components.ExpandedQrCode import com.gravatar.app.homeUi.presentation.home.share.components.ItemDivider import com.gravatar.app.homeUi.presentation.home.share.components.PrivateInformationDialog diff --git a/homeUi/src/main/res/values/strings.xml b/homeUi/src/main/res/values/strings.xml index d6bef425..6389f501 100644 --- a/homeUi/src/main/res/values/strings.xml +++ b/homeUi/src/main/res/values/strings.xml @@ -90,4 +90,7 @@ Close Delete account No longer using Gravatar? Delete your account here. + Deleting your Gravatar profile will immediately prevent all access to it. + "Your data will be permanently deleted after 30 days. During this period, you can still restore your profile by logging in at gravatar.com using your browser. After 30 days, it will no longer be recoverable. " + Cancel diff --git a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt index b5ed948c..d8970242 100644 --- a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt +++ b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogTest.kt @@ -1,6 +1,9 @@ package com.gravatar.app.homeUi.presentation.home.components.topbar.components +import androidx.compose.material3.ExperimentalMaterial3Api import com.gravatar.app.design.theme.GravatarAppTheme +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialogContent +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.DeleteConfirmationBottomSheet import com.gravatar.app.testUtils.roborazzi.RoborazziTest import org.junit.Test @@ -16,4 +19,15 @@ class AboutAppDialogTest : RoborazziTest() { ) } } + + @OptIn(ExperimentalMaterial3Api::class) + @Test + fun deleteConfirmationBottomSheetVisible() = screenshotTest { + GravatarAppTheme { + DeleteConfirmationBottomSheet( + onDismiss = {}, + onConfirm = {} + ) + } + } } diff --git a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt index 773fca87..5bb028ea 100644 --- a/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt +++ b/homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/AboutAppDialogViewModelTest.kt @@ -1,5 +1,9 @@ package com.gravatar.app.homeUi.presentation.home.components.topbar.components +import app.cash.turbine.test +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialogEvent +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialogState +import com.gravatar.app.homeUi.presentation.home.components.topbar.components.about.AboutAppDialogViewModel import com.gravatar.app.testUtils.CoroutineTestRule import com.gravatar.app.usercomponent.domain.usecase.DeleteUserProfile import io.mockk.coEvery @@ -9,6 +13,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test @@ -31,12 +36,94 @@ class AboutAppDialogViewModelTest { } @Test - fun `when OnDeleteAccount event is received then deleteUserProfile is invoked`() = runTest { + fun `when OnShowDeleteConfirmation event is received then delete confirmation is shown`() = runTest { // When - viewModel.onEvent(AboutAppDialogEvent.OnDeleteAccount) + viewModel.onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) + advanceUntilIdle() + + // Then + viewModel.uiState.test { + val expectedState = AboutAppDialogState( + isDeleteConfirmationVisible = true, + isLoading = false, + ) + assertEquals(expectedState, awaitItem()) + } + } + + @Test + fun `when OnHideDeleteConfirmation event is received then delete confirmation is hidden`() = runTest { + // Given + viewModel.onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) + + // When + viewModel.onEvent(AboutAppDialogEvent.OnHideDeleteConfirmation) + advanceUntilIdle() + + viewModel.uiState.test { + val expectedState = AboutAppDialogState( + isDeleteConfirmationVisible = false, + isLoading = false, + ) + assertEquals(expectedState, awaitItem()) + } + } + + @Test + fun `when OnConfirmDeleteAccount event is received then deleteUserProfile is invoked and confirmation is hidden`() = runTest { + // Given + viewModel.onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) + + // When + viewModel.onEvent(AboutAppDialogEvent.OnConfirmDeleteAccount) advanceUntilIdle() // Then coVerify { deleteUserProfile.invoke() } + viewModel.uiState.test { + val expectedState = AboutAppDialogState( + isDeleteConfirmationVisible = false, + isLoading = true, + ) + assertEquals(expectedState, awaitItem()) + } + } + + @Test + fun `when OnConfirmDeleteAccount event is received then isLoading is set to true`() = runTest { + // Given + viewModel.onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) + + // When + viewModel.onEvent(AboutAppDialogEvent.OnConfirmDeleteAccount) + advanceUntilIdle() + + // Then + viewModel.uiState.test { + val expectedState = AboutAppDialogState( + isDeleteConfirmationVisible = false, + isLoading = true, + ) + assertEquals(expectedState, awaitItem()) + } + } + + @Test + fun `when OnConfirmDeleteAccount event is received and deleteUserProfile fails then isLoading is set to false`() = runTest { + // Given + coEvery { deleteUserProfile.invoke() } returns Result.failure(Exception("Failed to delete profile")) + viewModel = AboutAppDialogViewModel(deleteUserProfile) + + // When + viewModel.onEvent(AboutAppDialogEvent.OnConfirmDeleteAccount) + + // Then + viewModel.uiState.test { + val expectedState = AboutAppDialogState( + isDeleteConfirmationVisible = false, + isLoading = false, + ) + assertEquals(expectedState, awaitItem()) + } } } From 76714db74a56ce82336d1a6f1d9b219187f662d3 Mon Sep 17 00:00:00 2001 From: etoledom Date: Mon, 4 Aug 2025 10:20:17 +0200 Subject: [PATCH 4/6] Remove extra trailing empty space Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- homeUi/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeUi/src/main/res/values/strings.xml b/homeUi/src/main/res/values/strings.xml index 6389f501..5a32a75a 100644 --- a/homeUi/src/main/res/values/strings.xml +++ b/homeUi/src/main/res/values/strings.xml @@ -91,6 +91,6 @@ Delete account No longer using Gravatar? Delete your account here. Deleting your Gravatar profile will immediately prevent all access to it. - "Your data will be permanently deleted after 30 days. During this period, you can still restore your profile by logging in at gravatar.com using your browser. After 30 days, it will no longer be recoverable. " + "Your data will be permanently deleted after 30 days. During this period, you can still restore your profile by logging in at gravatar.com using your browser. After 30 days, it will no longer be recoverable." Cancel From 2280a582670682057d572f0bdb8fa9d397551e76 Mon Sep 17 00:00:00 2001 From: Eduardo Toledo Date: Mon, 4 Aug 2025 14:34:40 +0200 Subject: [PATCH 5/6] Adding generic error alert to delete account flow --- .../topbar/components/about/AboutAppDialog.kt | 32 ++++++++++++++++++- .../components/about/AboutAppDialogState.kt | 1 + .../about/AboutAppDialogViewModel.kt | 13 +++++++- homeUi/src/main/res/values/strings.xml | 1 + 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt index fc95c2fe..0d15a7e8 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialog.kt @@ -7,12 +7,20 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material3.AlertDialogDefaults +import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -62,6 +70,28 @@ internal fun AboutAppDialog( modifier = Modifier ) } + if (uiState.showDeleteAccountErrorAlert) { + BasicAlertDialog( + onDismissRequest = { viewModel.dismissErrorMessage() } + ) { + Surface( + modifier = Modifier.wrapContentWidth().wrapContentHeight(), + shape = MaterialTheme.shapes.large, + tonalElevation = AlertDialogDefaults.TonalElevation + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text(text = stringResource(R.string.about_app_dialog_delete_profile_error_message)) + Spacer(modifier = Modifier.height(24.dp)) + TextButton( + onClick = { viewModel.dismissErrorMessage() }, + modifier = Modifier.align(Alignment.End) + ) { + Text(text = stringResource(R.string.done_button_cta)) + } + } + } + } + } } ) @@ -153,7 +183,7 @@ internal fun AboutAppDialogContent( style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onErrorContainer, modifier = Modifier - .padding(top = 8.dp) + .padding(top = 16.dp, bottom = 8.dp) .clickable { onEvent(AboutAppDialogEvent.OnShowDeleteConfirmation) } diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt index c4108f0d..21972bcb 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogState.kt @@ -3,4 +3,5 @@ package com.gravatar.app.homeUi.presentation.home.components.topbar.components.a internal data class AboutAppDialogState( val isDeleteConfirmationVisible: Boolean = false, val isLoading: Boolean = false, + val showDeleteAccountErrorAlert: Boolean = false, ) diff --git a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt index bfb32dbe..5876b31a 100644 --- a/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt +++ b/homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/components/topbar/components/about/AboutAppDialogViewModel.kt @@ -33,6 +33,15 @@ internal class AboutAppDialogViewModel( } } + fun dismissErrorMessage() { + _uiState.update { currentState -> + currentState.copy( + showDeleteAccountErrorAlert = false, + isLoading = false + ) + } + } + private fun showDeleteConfirmation() { _uiState.update { currentState -> currentState.copy(isDeleteConfirmationVisible = true) @@ -52,7 +61,9 @@ internal class AboutAppDialogViewModel( } deleteUserProfile().onFailure { _uiState.update { currentState -> - currentState.copy(isLoading = false) + currentState.copy( + showDeleteAccountErrorAlert = true + ) } } } diff --git a/homeUi/src/main/res/values/strings.xml b/homeUi/src/main/res/values/strings.xml index 5a32a75a..4967abc5 100644 --- a/homeUi/src/main/res/values/strings.xml +++ b/homeUi/src/main/res/values/strings.xml @@ -93,4 +93,5 @@ Deleting your Gravatar profile will immediately prevent all access to it. "Your data will be permanently deleted after 30 days. During this period, you can still restore your profile by logging in at gravatar.com using your browser. After 30 days, it will no longer be recoverable." Cancel + An error has occurred while deleting your account From d6106f75c8eac797e2c5132c0a448ee389cf3dd7 Mon Sep 17 00:00:00 2001 From: Eduardo Toledo Date: Mon, 4 Aug 2025 14:35:51 +0200 Subject: [PATCH 6/6] Update snapshot --- ...outAppDialogTest.aboutAppDialogVisible.png | Bin 66009 -> 66357 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.aboutAppDialogVisible.png b/homeUi/screenshotTests/roborazzi/com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialogTest.aboutAppDialogVisible.png index 79ae83c855b1e136bc855d5e7ac5b659bc044a2c..e7bf2bcd28bbf7edec2a30cfca86c811f6912293 100644 GIT binary patch delta 21380 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]`kYN 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 delta 21355 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 A6aWAK