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" }