From 461b08c41b07ad9df0f7aafb217ed99397257a1f Mon Sep 17 00:00:00 2001 From: Iva <103037123+kp-iva-nedeleva@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:24:44 +0300 Subject: [PATCH] Update screen updates (#81) --- .../ui/src/main/res/values/strings.xml | 3 +- features/splash/build.gradle.kts | 1 + .../java/com/kape/splash/di/SplashModule.kt | 2 +- .../java/com/kape/splash/ui/UpdateScreen.kt | 98 +++++++++++-------- .../com/kape/splash/ui/vm/SplashViewModel.kt | 7 ++ 5 files changed, 70 insertions(+), 41 deletions(-) diff --git a/capabilities/ui/src/main/res/values/strings.xml b/capabilities/ui/src/main/res/values/strings.xml index fd343e2c..bd774cb2 100644 --- a/capabilities/ui/src/main/res/values/strings.xml +++ b/capabilities/ui/src/main/res/values/strings.xml @@ -442,6 +442,7 @@ Show Geo-located Regions Upgrade Your Experience - You\'re using an older version of PIA. Update your app now to enjoy an enhanced experience with all the latest features. + Your app is outdated. Please update to continue using the app. Update Now + Tapping \"Update Now\" will disconnect the VPN. \ No newline at end of file diff --git a/features/splash/build.gradle.kts b/features/splash/build.gradle.kts index 1d05bf9e..c146fe23 100644 --- a/features/splash/build.gradle.kts +++ b/features/splash/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(project(":core:router")) implementation(project(":core:regions")) implementation(project(":core:httpclient")) + implementation(project(":core:vpnconnect")) implementation(project(":capabilities:ui")) implementation(project(":capabilities:notifications")) implementation(project(":capabilities:featureflags")) diff --git a/features/splash/src/main/java/com/kape/splash/di/SplashModule.kt b/features/splash/src/main/java/com/kape/splash/di/SplashModule.kt index 822c2c80..5d55b9bb 100644 --- a/features/splash/src/main/java/com/kape/splash/di/SplashModule.kt +++ b/features/splash/src/main/java/com/kape/splash/di/SplashModule.kt @@ -6,5 +6,5 @@ import org.koin.core.qualifier.named import org.koin.dsl.module val splashModule = module { - viewModel { SplashViewModel(get(), get(), get(), get(), get(named("update-url"))) } + viewModel { SplashViewModel(get(), get(), get(), get(), get(named("update-url")), get()) } } \ No newline at end of file diff --git a/features/splash/src/main/java/com/kape/splash/ui/UpdateScreen.kt b/features/splash/src/main/java/com/kape/splash/ui/UpdateScreen.kt index 254f6aa2..5da39756 100644 --- a/features/splash/src/main/java/com/kape/splash/ui/UpdateScreen.kt +++ b/features/splash/src/main/java/com/kape/splash/ui/UpdateScreen.kt @@ -5,8 +5,10 @@ import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.foundation.background 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.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -26,6 +28,7 @@ import com.kape.splash.ui.vm.SplashViewModel import com.kape.ui.R import com.kape.ui.mobile.elements.PrimaryButton import com.kape.ui.mobile.elements.Screen +import com.kape.ui.mobile.text.OnboardingDescriptionPaymentText import com.kape.ui.mobile.text.OnboardingDescriptionText import com.kape.ui.mobile.text.OnboardingTitleText import com.kape.ui.utils.LocalColors @@ -41,53 +44,70 @@ fun UpdateScreen(viewModel: SplashViewModel = koinViewModel()) = Screen { .padding(top = 64.dp) .background(LocalColors.current.background), verticalArrangement = Arrangement.SpaceBetween, - horizontalAlignment = Alignment.CenterHorizontally, ) { - Column(modifier = Modifier.widthIn(max = 520.dp)) { - Image( - painter = painterResource(id = R.drawable.shield), - contentDescription = null, - modifier = Modifier - .padding(40.dp) - .height(140.dp) - .fillMaxWidth(), - ) - Column(modifier = Modifier.semantics(mergeDescendants = true) { }) { - OnboardingTitleText( - content = stringResource(id = R.string.update_required_title), + Box( + modifier = Modifier + .widthIn(max = 520.dp) + .fillMaxHeight() + .weight(1f, true), + ) { + Column( + verticalArrangement = Arrangement.SpaceBetween, + ) { + Image( + painter = painterResource(id = R.drawable.shield), + contentDescription = null, modifier = Modifier - .fillMaxWidth() - .padding(16.dp), + .padding(40.dp) + .height(200.dp) + .fillMaxWidth(), ) + Column(modifier = Modifier.semantics(mergeDescendants = true) { }) { + OnboardingTitleText( + content = stringResource(id = R.string.update_required_title), + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + ) + + OnboardingDescriptionText( + content = stringResource(id = R.string.update_required_message), + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + ) + } + } - OnboardingDescriptionText( - content = stringResource(id = R.string.update_required_message), + Column(modifier = Modifier.align(Alignment.BottomCenter)) { + PrimaryButton( + text = stringResource(id = R.string.update_required_action), modifier = Modifier .fillMaxWidth() - .padding(16.dp), - ) - } + .padding(start = 16.dp, top = 4.dp, bottom = 36.dp, end = 16.dp) + .align(Alignment.CenterHorizontally), + ) { + viewModel.onUpdateClicked( + launchUpdate = { url -> + val launchIntent = Intent(Intent.ACTION_VIEW) + launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + launchIntent.data = Uri.parse(url) + // Silently fail if Google Play Store isn't installed. + if (launchIntent.resolveActivity(context.packageManager) != null) { + context.startActivity(launchIntent) + } + }, + ) + } - Spacer(modifier = Modifier.weight(1f)) + if (viewModel.isConnected()) { + OnboardingDescriptionPaymentText( + stringResource(R.string.update_required_info), + Modifier.align(Alignment.CenterHorizontally), + ) - PrimaryButton( - text = stringResource(id = R.string.update_required_action), - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, top = 4.dp, bottom = 36.dp, end = 16.dp) - .align(Alignment.CenterHorizontally), - ) { - viewModel.onUpdateClicked( - launchUpdate = { url -> - val launchIntent = Intent(Intent.ACTION_VIEW) - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - launchIntent.data = Uri.parse(url) - // Silently fail if Google Play Store isn't installed. - if (launchIntent.resolveActivity(context.packageManager) != null) { - context.startActivity(launchIntent) - } - }, - ) + Spacer(modifier = Modifier.padding(bottom = 40.dp)) + } } } } diff --git a/features/splash/src/main/java/com/kape/splash/ui/vm/SplashViewModel.kt b/features/splash/src/main/java/com/kape/splash/ui/vm/SplashViewModel.kt index 5207b102..b870dcba 100644 --- a/features/splash/src/main/java/com/kape/splash/ui/vm/SplashViewModel.kt +++ b/features/splash/src/main/java/com/kape/splash/ui/vm/SplashViewModel.kt @@ -7,6 +7,7 @@ import com.kape.httpclient.domain.GetWebsiteDownloadLink import com.kape.router.EnterFlow import com.kape.router.ExitFlow import com.kape.router.Router +import com.kape.vpnconnect.domain.ConnectionUseCase import com.kape.vpnregions.utils.RegionListProvider import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent @@ -17,6 +18,7 @@ class SplashViewModel( private val forceUpdateUseCase: ForceUpdateUseCase, private val getWebsiteDownloadLink: GetWebsiteDownloadLink, private val appUpdateUrl: String, + private val connectionUseCase: ConnectionUseCase, ) : ViewModel(), KoinComponent { private var updateUrl: String = "" @@ -46,6 +48,11 @@ class SplashViewModel( } fun onUpdateClicked(launchUpdate: (updateUrl: String) -> Unit) { + viewModelScope.launch { + connectionUseCase.stopConnection().collect {} + } launchUpdate(appUpdateUrl.ifEmpty { updateUrl }) } + + fun isConnected(): Boolean = connectionUseCase.isConnected() } \ No newline at end of file