diff --git a/README.md b/README.md index a77ffdeac2..88205047a0 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,11 @@ The following is a list of all third-party dependencies included as part of the - Purpose: Supplementary Android Compose features. - License: Apache 2.0 +- **Core SplashScreen** + - https://developer.android.com/jetpack/androidx/releases/core + - Purpose: Backwards compatible SplashScreen API implementation. + - License: Apache 2.0 + - **Dagger Hilt** - https://github.com/google/dagger - Purpose: Dependency injection framework. diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f0a6b90b13..b5860a55c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,6 +91,7 @@ dependencies { ksp(libs.androidx.room.compiler) implementation(libs.androidx.room.ktx) implementation(libs.androidx.room.runtime) + implementation(libs.androidx.splashscreen) implementation(platform(libs.google.firebase.bom)) implementation(libs.bitwarden.sdk) implementation(libs.bumptech.glide) diff --git a/app/src/main/java/com/x8bit/bitwarden/MainActivity.kt b/app/src/main/java/com/x8bit/bitwarden/MainActivity.kt index 233056b8a8..ee579f97ae 100644 --- a/app/src/main/java/com/x8bit/bitwarden/MainActivity.kt +++ b/app/src/main/java/com/x8bit/bitwarden/MainActivity.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.x8bit.bitwarden.ui.platform.feature.rootnav.RootNavScreen import com.x8bit.bitwarden.ui.platform.theme.BitwardenTheme import dagger.hilt.android.AndroidEntryPoint @@ -13,10 +14,14 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { + var shouldShowSplashScreen = true + installSplashScreen().setKeepOnScreenCondition { shouldShowSplashScreen } super.onCreate(savedInstanceState) setContent { BitwardenTheme { - RootNavScreen() + RootNavScreen( + onSplashScreenRemoved = { shouldShowSplashScreen = false }, + ) } } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt index bcfbd12b53..5068deda81 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button @@ -42,6 +43,7 @@ fun LoginScreen( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(12.dp), modifier = Modifier + .fillMaxSize() .background(MaterialTheme.colorScheme.background) .padding(horizontal = 16.dp, vertical = 32.dp), ) { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreen.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreen.kt index 5c66dd506a..173fffadbb 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreen.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreen.kt @@ -1,6 +1,7 @@ package com.x8bit.bitwarden.ui.platform.feature.rootnav import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -23,9 +24,15 @@ import com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.vaultUnlockedDestin fun RootNavScreen( viewModel: RootNavViewModel = hiltViewModel(), navController: NavHostController = rememberNavController(), + onSplashScreenRemoved: () -> Unit = {}, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() + val isNotSplashScreen = state != RootNavState.Splash + LaunchedEffect(isNotSplashScreen) { + if (isNotSplashScreen) onSplashScreenRemoved() + } + NavHost( navController = navController, startDestination = SPLASH_ROUTE, diff --git a/app/src/main/res/drawable-hdpi/logo_legacy.png b/app/src/main/res/drawable-hdpi/logo_legacy.png deleted file mode 100644 index c1f80693e5..0000000000 Binary files a/app/src/main/res/drawable-hdpi/logo_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/logo_white_legacy.png b/app/src/main/res/drawable-hdpi/logo_white_legacy.png deleted file mode 100644 index d476025e83..0000000000 Binary files a/app/src/main/res/drawable-hdpi/logo_white_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/logo_legacy.png b/app/src/main/res/drawable-xhdpi/logo_legacy.png deleted file mode 100644 index b8d3764921..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/logo_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/logo_white_legacy.png b/app/src/main/res/drawable-xhdpi/logo_white_legacy.png deleted file mode 100644 index d3d9f58052..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/logo_white_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/logo_legacy.png b/app/src/main/res/drawable-xxhdpi/logo_legacy.png deleted file mode 100644 index 9047316769..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/logo_white_legacy.png b/app/src/main/res/drawable-xxhdpi/logo_white_legacy.png deleted file mode 100644 index 7d76d07d2d..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo_white_legacy.png and /dev/null differ diff --git a/app/src/main/res/drawable/splash_screen.xml b/app/src/main/res/drawable/splash_screen.xml deleted file mode 100644 index 56530dc151..0000000000 --- a/app/src/main/res/drawable/splash_screen.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/splash_screen_dark.xml b/app/src/main/res/drawable/splash_screen_dark.xml deleted file mode 100644 index 6e5563e7db..0000000000 --- a/app/src/main/res/drawable/splash_screen_dark.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 53fa6f596f..d76de1bcf2 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -12,6 +12,7 @@ @null false true + @null true @@ -20,10 +21,9 @@ - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 87e723c8ff..d49b211635 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -12,6 +12,7 @@ @android:style/ThemeOverlay.Material.Light @null false + @null true true @@ -21,13 +22,12 @@ - diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt index efe9ff6d6c..68257b55f5 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavScreenTest.kt @@ -8,6 +8,8 @@ import io.mockk.mockk import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Test class RootNavScreenTest : BaseComposeTest() { @@ -47,15 +49,18 @@ class RootNavScreenTest : BaseComposeTest() { every { eventFlow } returns emptyFlow() every { stateFlow } returns rootNavStateFlow } + var isSplashScreenRemoved = false composeTestRule.setContent { RootNavScreen( viewModel = viewModel, navController = fakeNavHostController, + onSplashScreenRemoved = { isSplashScreenRemoved = true }, ) } composeTestRule.runOnIdle { fakeNavHostController.assertCurrentRoute("splash") } + assertFalse(isSplashScreenRemoved) // Make sure navigating to Auth works as expected: rootNavStateFlow.value = RootNavState.Auth @@ -65,6 +70,7 @@ class RootNavScreenTest : BaseComposeTest() { navOptions = expectedNavOptions, ) } + assertTrue(isSplashScreenRemoved) // Make sure navigating to vault unlocked works as expected: rootNavStateFlow.value = RootNavState.VaultUnlocked diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4e5569d331..0fe03c1d04 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,6 +16,7 @@ androidxHiltNavigationCompose = "1.0.0" androidxLifecycle = "2.6.1" androidxNavigation = "2.7.2" androidxRoom = "2.5.2" +androidxSplash = "1.1.0-alpha02" # Once the app and SDK reach a critical point of completeness we should begin fixing the version # here (BIT-311). bitwardenSdk = "0.3.0-SNAPSHOT" @@ -60,6 +61,7 @@ androidx-navigation-compose = { module = "androidx.navigation:navigation-compose androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "androidxRoom" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "androidxRoom" } androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "androidxRoom" } +androidx-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidxSplash" } bitwarden-sdk = { module = "com.bitwarden:sdk-android", version.ref = "bitwardenSdk" } bumptech-glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } detekt-detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" }