From 5d4294a15fb1c99e0cd8ec01b814df8eded67b0f Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sat, 17 Aug 2024 19:47:16 +0300 Subject: [PATCH 1/5] Added onboarding form page animation & made other pages animations run only when page is visible for the user --- .../screen/onboarding/OnBoardingScreen.kt | 9 ++++- .../screen/onboarding/page/FormPageContent.kt | 37 +++++++++++++++++-- .../onboarding/page/LookAndFeelPageContent.kt | 7 ++-- .../onboarding/page/ProvidersPageContent.kt | 7 ++-- .../screen/txt2img/TextToImageScreen.kt | 3 +- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt index 708a7bbc..d2832481 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt @@ -197,11 +197,16 @@ private fun OnBoardingScreenContent( userScrollEnabled = false, ) { index -> when (OnBoardingPage.entries[index]) { - OnBoardingPage.Form -> FormPageContent() - OnBoardingPage.Providers -> ProviderPageContent() + OnBoardingPage.Providers -> ProviderPageContent( + isPageVisible = pagerState.currentPage == OnBoardingPage.Providers.ordinal + ) + OnBoardingPage.Form -> FormPageContent( + isPageVisible = pagerState.currentPage == OnBoardingPage.Form.ordinal + ) OnBoardingPage.LocalDiffusion -> LocalDiffusionPageContent() OnBoardingPage.LookAndFeel -> LookAndFeelPageContent( darkThemeToken = state.darkThemeToken, + isPageVisible = pagerState.currentPage == OnBoardingPage.LookAndFeel.ordinal ) } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt index a24cfebd..4339496b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt @@ -1,13 +1,18 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding.page +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity @@ -21,15 +26,20 @@ import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneWidth import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreenContent import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageState import com.shifthackz.aisdv1.presentation.widget.frame.PhoneFrame +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable fun FormPageContent( modifier: Modifier = Modifier, -) = Column( + isPageVisible: Boolean = false, + ) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { + val scope = rememberCoroutineScope() + val scrollState = rememberScrollState() Spacer(modifier = Modifier.weight(1f)) Text( text = buildOnBoardingText(LocalizationR.string.on_boarding_page_form_title), @@ -42,9 +52,7 @@ fun FormPageContent( ) { CompositionLocalProvider(LocalDensity provides onBoardingDensity) { TextToImageScreenContent( - modifier = Modifier - .gesturesDisabled() - .aspectRatio(onBoardingPhoneAspectRatio), + modifier = Modifier.aspectRatio(onBoardingPhoneAspectRatio), state = TextToImageState( onBoardingDemo = true, advancedToggleButtonVisible = false, @@ -58,8 +66,29 @@ fun FormPageContent( subSeed = "151297", subSeedStrength = 0.69f, ), + scrollState = scrollState, + ) + Box( + modifier = Modifier + .gesturesDisabled() + .aspectRatio(onBoardingPhoneAspectRatio), ) } } Spacer(modifier = Modifier.weight(1f)) + DisposableEffect(isPageVisible) { + val job = scope.launch { + while (isPageVisible) { + scrollState.scrollTo(0) + delay(2000) + scrollState.animateScrollTo(scrollState.maxValue / 2 + 60, tween(2000)) + delay(2000) + scrollState.animateScrollTo(scrollState.maxValue, tween(2000)) + delay(2000) + } + } + onDispose { + job.cancel() + } + } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt index c7f570e1..88860fa1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt @@ -41,7 +41,8 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR fun LookAndFeelPageContent( modifier: Modifier = Modifier, darkThemeToken: DarkThemeToken, -) = Column( + isPageVisible: Boolean = false, + ) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -85,9 +86,9 @@ fun LookAndFeelPageContent( } } } - DisposableEffect(Unit) { + DisposableEffect(isPageVisible) { val job = scope.launch { - while (true) { + while (isPageVisible) { delay(700) themeState = themeState.copy( colorToken = ColorToken.entries.random(), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt index 362ccfbd..b0d7eae1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt @@ -36,7 +36,8 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable fun ProviderPageContent( modifier: Modifier = Modifier, -) = Column( + isPageVisible: Boolean = false, + ) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -69,9 +70,9 @@ fun ProviderPageContent( } } Spacer(modifier = Modifier.weight(1f)) - DisposableEffect(Unit) { + DisposableEffect(isPageVisible) { val job = scope.launch { - while (true) { + while (isPageVisible) { delay(1200) serverState = serverState.copy( mode = ServerSource.entries.random(), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt index af121398..b8f5c964 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt @@ -2,6 +2,7 @@ package com.shifthackz.aisdv1.presentation.screen.txt2img +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -64,6 +65,7 @@ fun TextToImageScreen() { fun TextToImageScreenContent( modifier: Modifier = Modifier, state: TextToImageState, + scrollState: ScrollState = rememberScrollState(), processIntent: (GenerationMviIntent) -> Unit = {}, ) { val promptChipTextFieldState = remember { mutableStateOf(TextFieldValue()) } @@ -115,7 +117,6 @@ fun TextToImageScreenContent( } }, content = { paddingValues -> - val scrollState = rememberScrollState() Column( modifier = Modifier .padding(paddingValues) From 58341dd6742ecca344cd47006a77ebe823a003ea Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sat, 17 Aug 2024 20:32:36 +0300 Subject: [PATCH 2/5] ServerSetupViewModelTest updated --- .../presentation/screen/setup/ServerSetupViewModelTest.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt index 5c23b4e6..f507f3dd 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt +++ b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt @@ -24,11 +24,13 @@ import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk +import io.mockk.unmockkAll import io.mockk.verify import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import kotlinx.coroutines.test.runTest +import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test @@ -82,6 +84,12 @@ class ServerSetupViewModelTest : CoreViewModelTest() { } returns Single.just(mockHuggingFaceModels) } + @After + override fun finalize() { + super.finalize() + unmockkAll() + } + @Test fun `initialized, expected UI state updated with correct stub values`() { val state = viewModel.state.value From 843ded9867d6f5402e00fecc8b12614c299155bc Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Sun, 18 Aug 2024 20:45:38 +0300 Subject: [PATCH 3/5] UI update: - Updated splash screen with system colors - Added scroll for onboarding pager - Made Form page animation slightly faster - Updated LookAndFeelPage animation & UI - Updated configuration loader screen with system colors --- .../core/extensions/GestureExtensions.kt | 2 + .../aisdv1/presentation/di/ViewModelModule.kt | 1 + .../loader/ConfigurationLoaderScreen.kt | 4 +- .../screen/onboarding/OnBoardingScreen.kt | 5 +- .../screen/onboarding/OnBoardingState.kt | 1 + .../screen/onboarding/OnBoardingViewModel.kt | 8 +- .../screen/onboarding/page/FormPageContent.kt | 17 ++-- .../page/LocalDiffusionPageContent.kt | 15 +++- .../onboarding/page/LookAndFeelPageContent.kt | 50 ++++++++--- .../onboarding/page/ProvidersPageContent.kt | 21 +++-- .../screen/settings/SettingsScreen.kt | 86 ++++++++++--------- .../screen/splash/SplashScreen.kt | 14 ++- 12 files changed, 151 insertions(+), 73 deletions(-) diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/GestureExtensions.kt b/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/GestureExtensions.kt index 277a1cff..777c0782 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/GestureExtensions.kt +++ b/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/GestureExtensions.kt @@ -1,10 +1,12 @@ package com.shifthackz.aisdv1.core.extensions +import android.annotation.SuppressLint import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.PointerEventPass import androidx.compose.ui.input.pointer.PointerInputChange import androidx.compose.ui.input.pointer.pointerInput +@SuppressLint("ReturnFromAwaitPointerEventScope") fun Modifier.gesturesDisabled(disabled: Boolean = true) = if (disabled) { pointerInput(Unit) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt index 23e5a154..38d69873 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt @@ -61,6 +61,7 @@ val viewModelModule = module { splashNavigationUseCase = get(), preferenceManager = get(), schedulersProvider = get(), + buildInfoProvider = get(), ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt index fa3c3aec..30b9ed21 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt @@ -26,6 +26,8 @@ import org.koin.androidx.compose.koinViewModel fun ConfigurationLoaderScreen() { MviComponent( viewModel = koinViewModel(), + navigationBarColor = MaterialTheme.colorScheme.surface, + applySystemUiColors = true, ) { state, _ -> ScreenContent( modifier = Modifier.fillMaxSize(), @@ -40,7 +42,7 @@ private fun ScreenContent( state: ConfigurationLoaderState, ) { Box( - modifier = modifier.background(MaterialTheme.colorScheme.background), + modifier = modifier.background(MaterialTheme.colorScheme.surface), ) { Column( modifier = Modifier.fillMaxSize(), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt index d2832481..b0f224d5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt @@ -194,18 +194,21 @@ private fun OnBoardingScreenContent( modifier = Modifier.fillMaxSize(), state = pagerState, beyondBoundsPageCount = OnBoardingPage.entries.size, - userScrollEnabled = false, + userScrollEnabled = true, ) { index -> when (OnBoardingPage.entries[index]) { OnBoardingPage.Providers -> ProviderPageContent( isPageVisible = pagerState.currentPage == OnBoardingPage.Providers.ordinal ) + OnBoardingPage.Form -> FormPageContent( isPageVisible = pagerState.currentPage == OnBoardingPage.Form.ordinal ) + OnBoardingPage.LocalDiffusion -> LocalDiffusionPageContent() OnBoardingPage.LookAndFeel -> LookAndFeelPageContent( darkThemeToken = state.darkThemeToken, + appVersion = state.appVersion, isPageVisible = pagerState.currentPage == OnBoardingPage.LookAndFeel.ordinal ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt index 812a4082..cd5f6872 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt @@ -5,4 +5,5 @@ import com.shifthackz.android.core.mvi.MviState data class OnBoardingState( val darkThemeToken: DarkThemeToken = DarkThemeToken.FRAPPE, + val appVersion: String = "", ) : MviState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt index 8a2f057e..e00c2eb7 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt @@ -1,5 +1,6 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding +import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider import com.shifthackz.aisdv1.core.common.log.errorLog import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread @@ -19,6 +20,7 @@ class OnBoardingViewModel( private val splashNavigationUseCase: SplashNavigationUseCase, private val preferenceManager: PreferenceManager, private val schedulersProvider: SchedulersProvider, + private val buildInfoProvider: BuildInfoProvider, ) : MviRxViewModel() { override val initialState = OnBoardingState() @@ -26,7 +28,11 @@ class OnBoardingViewModel( init { updateState { val token = DarkThemeToken.parse(preferenceManager.designDarkThemeToken) - it.copy(darkThemeToken = token) + val version = buildInfoProvider.toString() + it.copy( + darkThemeToken = token, + appVersion = version + ) } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt index 4339496b..3bd80642 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt @@ -1,6 +1,8 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding.page import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -12,13 +14,14 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled +import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio @@ -70,8 +73,12 @@ fun FormPageContent( ) Box( modifier = Modifier - .gesturesDisabled() - .aspectRatio(onBoardingPhoneAspectRatio), + .aspectRatio(onBoardingPhoneAspectRatio) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = EmptyLambda + ), ) } } @@ -82,9 +89,9 @@ fun FormPageContent( scrollState.scrollTo(0) delay(2000) scrollState.animateScrollTo(scrollState.maxValue / 2 + 60, tween(2000)) - delay(2000) + delay(1000) scrollState.animateScrollTo(scrollState.maxValue, tween(2000)) - delay(2000) + delay(1000) } } onDispose { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt index 9893fe8f..adc5db4f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt @@ -1,6 +1,8 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding.page import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -10,6 +12,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -17,7 +20,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled +import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity @@ -32,7 +35,7 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable fun LocalDiffusionPageContent( modifier: Modifier = Modifier, -) = Column( + ) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -49,7 +52,6 @@ fun LocalDiffusionPageContent( ) { CompositionLocalProvider(LocalDensity provides onBoardingDensity) { val localModifier = Modifier - .gesturesDisabled() .aspectRatio(onBoardingPhoneAspectRatio) Box( contentAlignment = Alignment.Center, @@ -70,7 +72,12 @@ fun LocalDiffusionPageContent( Box( modifier = localModifier .fillMaxWidth() - .background(Color.Black.copy(alpha = 0.7f)), + .background(Color.Black.copy(alpha = 0.7f)) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = EmptyLambda + ), contentAlignment = Alignment.Center, ) { Box( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt index 88860fa1..2d00dc2b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt @@ -1,5 +1,8 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding.page +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio @@ -20,9 +23,10 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled +import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda import com.shifthackz.aisdv1.domain.entity.ColorToken import com.shifthackz.aisdv1.domain.entity.DarkThemeToken +import com.shifthackz.aisdv1.domain.entity.Grid import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio @@ -41,8 +45,9 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR fun LookAndFeelPageContent( modifier: Modifier = Modifier, darkThemeToken: DarkThemeToken, + appVersion: String, isPageVisible: Boolean = false, - ) = Column( +) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -58,6 +63,18 @@ fun LookAndFeelPageContent( ), ) } + var settingsState by remember { + mutableStateOf( + SettingsState( + loading = false, + onBoardingDemo = true, + colorToken = themeState.colorToken, + darkThemeToken = themeState.darkThemeToken, + darkTheme = darkTheme, + appVersion = appVersion + ), + ) + } Spacer(modifier = Modifier.weight(1f)) Text( text = buildOnBoardingText(LocalizationR.string.on_boarding_page_ui_title), @@ -72,16 +89,17 @@ fun LookAndFeelPageContent( CompositionLocalProvider(LocalDensity provides onBoardingDensity) { AiSdAppTheme(themeState) { SettingsScreenContent( + modifier = Modifier.aspectRatio(onBoardingPhoneAspectRatio), + state = settingsState, + ) + Box( modifier = Modifier - .gesturesDisabled() - .aspectRatio(onBoardingPhoneAspectRatio), - state = SettingsState( - loading = false, - onBoardingDemo = true, - colorToken = themeState.colorToken, - darkThemeToken = darkThemeToken, - darkTheme = darkTheme, - ), + .aspectRatio(onBoardingPhoneAspectRatio) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = EmptyLambda + ), ) } } @@ -90,8 +108,16 @@ fun LookAndFeelPageContent( val job = scope.launch { while (isPageVisible) { delay(700) + val darkThemeTokenRnd = DarkThemeToken.entries.random() + val colorTokenRnd = ColorToken.entries.random() + settingsState = settingsState.copy( + galleryGrid = Grid.entries.random(), + darkThemeToken = darkThemeTokenRnd, + colorToken = colorTokenRnd, + ) themeState = themeState.copy( - colorToken = ColorToken.entries.random(), + darkThemeToken = darkThemeTokenRnd, + colorToken = colorTokenRnd, ) } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt index b0d7eae1..b82b9328 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt @@ -1,5 +1,8 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding.page +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio @@ -20,7 +23,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled +import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity @@ -38,7 +41,8 @@ fun ProviderPageContent( modifier: Modifier = Modifier, isPageVisible: Boolean = false, ) = Column( - modifier = modifier.fillMaxSize(), + modifier = modifier + .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { val scope = rememberCoroutineScope() @@ -62,11 +66,18 @@ fun ProviderPageContent( ) { CompositionLocalProvider(LocalDensity provides onBoardingDensity) { ServerSetupScreenContent( - modifier = Modifier - .gesturesDisabled() - .aspectRatio(onBoardingPhoneAspectRatio), + modifier = Modifier.aspectRatio(onBoardingPhoneAspectRatio), state = serverState, ) + Box( + modifier = Modifier + .aspectRatio(onBoardingPhoneAspectRatio) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = EmptyLambda + ), + ) } } Spacer(modifier = Modifier.weight(1f)) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt index 0c13e5d4..51e03172 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt @@ -577,48 +577,50 @@ private fun ContentSettingsState( } //endregion - //region LINKS & OTHERS - SettingsHeader( - modifier = headerModifier, - loading = state.loading, - text = LocalizationR.string.settings_header_info.asUiText(), - ) - SettingsItem( - modifier = itemModifier, - loading = state.loading, - startIcon = Icons.Default.MonetizationOn, - text = LocalizationR.string.settings_item_donate.asUiText(), - onClick = { processIntent(SettingsIntent.Action.Donate) }, - ) - SettingsItem( - modifier = itemModifier, - loading = state.loading, - startIcon = Icons.Default.AllInclusive, - text = LocalizationR.string.settings_item_on_boarding.asUiText(), - onClick = { processIntent(SettingsIntent.Action.OnBoarding) }, - ) - SettingsItem( - modifier = itemModifier, - loading = state.loading, - startIcon = Icons.Default.Report, - text = LocalizationR.string.settings_item_report_problem.asUiText(), - onClick = { processIntent(SettingsIntent.Action.ReportProblem) }, - ) - SettingsItem( - modifier = itemModifier, - loading = state.loading, - startIcon = Icons.Default.Gavel, - text = LocalizationR.string.settings_item_policy.asUiText(), - onClick = { processIntent(SettingsIntent.LaunchUrl.OpenPolicy) }, - ) - SettingsItem( - modifier = itemModifier, - loading = state.loading, - startIcon = Icons.Default.Code, - text = LocalizationR.string.settings_item_source.asUiText(), - onClick = { processIntent(SettingsIntent.LaunchUrl.OpenSourceCode) }, - ) - //endregion + if(!state.onBoardingDemo){ + //region LINKS & OTHERS + SettingsHeader( + modifier = headerModifier, + loading = state.loading, + text = LocalizationR.string.settings_header_info.asUiText(), + ) + SettingsItem( + modifier = itemModifier, + loading = state.loading, + startIcon = Icons.Default.MonetizationOn, + text = LocalizationR.string.settings_item_donate.asUiText(), + onClick = { processIntent(SettingsIntent.Action.Donate) }, + ) + SettingsItem( + modifier = itemModifier, + loading = state.loading, + startIcon = Icons.Default.AllInclusive, + text = LocalizationR.string.settings_item_on_boarding.asUiText(), + onClick = { processIntent(SettingsIntent.Action.OnBoarding) }, + ) + SettingsItem( + modifier = itemModifier, + loading = state.loading, + startIcon = Icons.Default.Report, + text = LocalizationR.string.settings_item_report_problem.asUiText(), + onClick = { processIntent(SettingsIntent.Action.ReportProblem) }, + ) + SettingsItem( + modifier = itemModifier, + loading = state.loading, + startIcon = Icons.Default.Gavel, + text = LocalizationR.string.settings_item_policy.asUiText(), + onClick = { processIntent(SettingsIntent.LaunchUrl.OpenPolicy) }, + ) + SettingsItem( + modifier = itemModifier, + loading = state.loading, + startIcon = Icons.Default.Code, + text = LocalizationR.string.settings_item_source.asUiText(), + onClick = { processIntent(SettingsIntent.LaunchUrl.OpenSourceCode) }, + ) + //endregion + } AnimatedVisibility(visible = state.appVersion.isNotEmpty()) { Text( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt index 3fdf8ee4..fda5275c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt @@ -1,7 +1,9 @@ package com.shifthackz.aisdv1.presentation.screen.splash +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.shifthackz.aisdv1.core.ui.MviComponent @@ -9,7 +11,15 @@ import org.koin.androidx.compose.koinViewModel @Composable fun SplashScreen() { - MviComponent(viewModel = koinViewModel()) { _, _ -> - Box(Modifier.fillMaxSize()) + MviComponent( + viewModel = koinViewModel(), + navigationBarColor = MaterialTheme.colorScheme.surface, + applySystemUiColors = true, + ) { _, _ -> + Box( + Modifier + .fillMaxSize() + .background(color = MaterialTheme.colorScheme.surface), + ) } } From e09adacefb772798d4caf579abbea097d307025a Mon Sep 17 00:00:00 2001 From: ComicSANS Date: Mon, 19 Aug 2024 10:27:42 +0300 Subject: [PATCH 4/5] Updated OnBoardingViewModelSplashSourceTest --- .../onboarding/OnBoardingViewModelSplashSourceTest.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt index ecd1b935..bf1a38e4 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt +++ b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt @@ -1,5 +1,6 @@ package com.shifthackz.aisdv1.presentation.screen.onboarding +import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider import com.shifthackz.aisdv1.domain.entity.DarkThemeToken import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase @@ -22,6 +23,7 @@ class OnBoardingViewModelSplashSourceTest : CoreViewModelTest() private val stubSplashNavigationUseCase = mockk() private val stubPreferenceManager = mockk() + private val stubBuildInfoProvider = mockk() override val testViewModelStrategy = CoreViewModelInitializeStrategy.InitializeEveryTime @@ -31,6 +33,7 @@ class OnBoardingViewModelSplashSourceTest : CoreViewModelTest Date: Sat, 24 Aug 2024 18:06:45 +0300 Subject: [PATCH 5/5] Resolved PR comments --- .../presentation/screen/onboarding/page/FormPageContent.kt | 2 +- .../screen/onboarding/page/LocalDiffusionPageContent.kt | 2 +- .../screen/onboarding/page/ProvidersPageContent.kt | 5 ++--- .../aisdv1/presentation/screen/settings/SettingsScreen.kt | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt index 3bd80642..16e6192b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt @@ -37,7 +37,7 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR fun FormPageContent( modifier: Modifier = Modifier, isPageVisible: Boolean = false, - ) = Column( +) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt index adc5db4f..fbfb6e79 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt @@ -35,7 +35,7 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable fun LocalDiffusionPageContent( modifier: Modifier = Modifier, - ) = Column( +) = Column( modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt index b82b9328..cf04e04f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt @@ -40,9 +40,8 @@ import com.shifthackz.aisdv1.core.localization.R as LocalizationR fun ProviderPageContent( modifier: Modifier = Modifier, isPageVisible: Boolean = false, - ) = Column( - modifier = modifier - .fillMaxSize(), +) = Column( + modifier = modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { val scope = rememberCoroutineScope() diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt index 51e03172..7e50da66 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt @@ -577,7 +577,7 @@ private fun ContentSettingsState( } //endregion - if(!state.onBoardingDemo){ + if (!state.onBoardingDemo) { //region LINKS & OTHERS SettingsHeader( modifier = headerModifier,