Browse Source

Worked on splash screen UI and login screen UI, added fonts

Khubaib 10 tháng trước cách đây
mục cha
commit
513cac44ba
32 tập tin đã thay đổi với 841 bổ sung50 xóa
  1. 0 1
      .idea/gradle.xml
  2. 9 0
      .idea/inspectionProfiles/Project_Default.xml
  3. 329 0
      .idea/other.xml
  4. 2 2
      app/src/main/AndroidManifest.xml
  5. 3 2
      app/src/main/java/com/fastest/pass/MainActivity.kt
  6. 125 0
      app/src/main/java/com/fastest/pass/login/presentation/components/LoginScreen.kt
  7. 29 0
      app/src/main/java/com/fastest/pass/login/presentation/ui/LoginFragment.kt
  8. 26 13
      app/src/main/java/com/fastest/pass/splash/presentation/components/SplashScreen.kt
  9. 5 2
      app/src/main/java/com/fastest/pass/splash/presentation/ui/SplashFragment.kt
  10. 2 1
      app/src/main/java/com/fastest/pass/splash/presentation/viewmodels/SplashViewModel.kt
  11. 13 1
      app/src/main/java/com/fastest/pass/splash/utils/SplashNavigation.kt
  12. 2 2
      app/src/main/java/com/fastest/pass/splash/utils/SplashRoute.kt
  13. 2 2
      app/src/main/java/com/fastest/pass/ui/theme/Color.kt
  14. 20 2
      app/src/main/java/com/fastest/pass/ui/theme/Theme.kt
  15. 253 17
      app/src/main/java/com/fastest/pass/ui/theme/Type.kt
  16. BIN
      app/src/main/res/drawable/backarrow3x.png
  17. BIN
      app/src/main/res/drawable/lockpasslogo.png
  18. BIN
      app/src/main/res/font/outfit_black.ttf
  19. BIN
      app/src/main/res/font/outfit_bold.ttf
  20. BIN
      app/src/main/res/font/outfit_extrabold.ttf
  21. BIN
      app/src/main/res/font/outfit_extralight.ttf
  22. BIN
      app/src/main/res/font/outfit_light.ttf
  23. BIN
      app/src/main/res/font/outfit_medium.ttf
  24. BIN
      app/src/main/res/font/outfit_regular.ttf
  25. BIN
      app/src/main/res/font/outfit_semibold.ttf
  26. BIN
      app/src/main/res/font/outfit_thin.ttf
  27. 2 1
      app/src/main/res/layout/activity_main.xml
  28. 5 0
      app/src/main/res/navigation/nav_graph.xml
  29. 5 0
      app/src/main/res/values/colors.xml
  30. 3 2
      app/src/main/res/values/strings.xml
  31. 5 1
      app/src/main/res/values/themes.xml
  32. 1 1
      gradle/libs.versions.toml

+ 0 - 1
.idea/gradle.xml

@@ -4,7 +4,6 @@
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
-        <option name="testRunner" value="CHOOSE_PER_TEST" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
         <option name="modules">

+ 9 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -3,30 +3,39 @@
     <option name="myName" value="Project Default" />
     <inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
     <inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
       <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
     </inspection_tool>
   </profile>
 </component>

+ 329 - 0
.idea/other.xml

@@ -0,0 +1,329 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="direct_access_persist.xml">
+    <option name="deviceSelectionList">
+      <list>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="27" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="F01L" />
+          <option name="id" value="F01L" />
+          <option name="manufacturer" value="FUJITSU" />
+          <option name="name" value="F-01L" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1280" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="28" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="SH-01L" />
+          <option name="id" value="SH-01L" />
+          <option name="manufacturer" value="SHARP" />
+          <option name="name" value="AQUOS sense2 SH-01L" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2160" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="Lenovo" />
+          <option name="codename" value="TB370FU" />
+          <option name="id" value="TB370FU" />
+          <option name="manufacturer" value="Lenovo" />
+          <option name="name" value="Tab P12" />
+          <option name="screenDensity" value="340" />
+          <option name="screenX" value="1840" />
+          <option name="screenY" value="2944" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="a51" />
+          <option name="id" value="a51" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy A51" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="akita" />
+          <option name="id" value="akita" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="b0q" />
+          <option name="id" value="b0q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S22 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="32" />
+          <option name="brand" value="google" />
+          <option name="codename" value="bluejay" />
+          <option name="id" value="bluejay" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="caiman" />
+          <option name="id" value="caiman" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="960" />
+          <option name="screenY" value="2142" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="comet" />
+          <option name="id" value="comet" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro Fold" />
+          <option name="screenDensity" value="390" />
+          <option name="screenX" value="2076" />
+          <option name="screenY" value="2152" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="29" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="crownqlteue" />
+          <option name="id" value="crownqlteue" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Note9" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2220" />
+          <option name="screenY" value="1080" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="dm3q" />
+          <option name="id" value="dm3q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S23 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="e1q" />
+          <option name="id" value="e1q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S24" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix" />
+          <option name="id" value="felix" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix" />
+          <option name="id" value="felix" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix_camera" />
+          <option name="id" value="felix_camera" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold (Camera-enabled)" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="gts8uwifi" />
+          <option name="id" value="gts8uwifi" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Tab S8 Ultra" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1848" />
+          <option name="screenY" value="2960" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="husky" />
+          <option name="id" value="husky" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8 Pro" />
+          <option name="screenDensity" value="390" />
+          <option name="screenX" value="1008" />
+          <option name="screenY" value="2244" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="java" />
+          <option name="id" value="java" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="G20" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="komodo" />
+          <option name="id" value="komodo" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9 Pro XL" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="1008" />
+          <option name="screenY" value="2244" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="lynx" />
+          <option name="id" value="lynx" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="google" />
+          <option name="codename" value="oriole" />
+          <option name="id" value="oriole" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="panther" />
+          <option name="id" value="panther" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q5q" />
+          <option name="id" value="q5q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold5" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1812" />
+          <option name="screenY" value="2176" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q6q" />
+          <option name="id" value="q6q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold6" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1856" />
+          <option name="screenY" value="2160" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="r11" />
+          <option name="id" value="r11" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Watch" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="384" />
+          <option name="screenY" value="384" />
+          <option name="type" value="WEAR_OS" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="redfin" />
+          <option name="id" value="redfin" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 5" />
+          <option name="screenDensity" value="440" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="shiba" />
+          <option name="id" value="shiba" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="tangorpro" />
+          <option name="id" value="tangorpro" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Tablet" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1600" />
+          <option name="screenY" value="2560" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="tokay" />
+          <option name="id" value="tokay" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 9" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2424" />
+        </PersistentDeviceSelectionData>
+      </list>
+    </option>
+  </component>
+</project>

+ 2 - 2
app/src/main/AndroidManifest.xml

@@ -7,9 +7,9 @@
         android:allowBackup="true"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@drawable/lockpasslogo"
         android:label="@string/app_name"
-        android:roundIcon="@mipmap/ic_launcher_round"
+        android:roundIcon="@drawable/lockpasslogo"
         android:supportsRtl="true"
         android:theme="@style/Theme.FastestPass"
         tools:targetApi="31">

+ 3 - 2
app/src/main/java/com/fastest/pass/MainActivity.kt

@@ -1,6 +1,7 @@
 package com.fastest.pass
 
 import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
 import androidx.fragment.app.FragmentActivity
 import androidx.navigation.NavController
 import androidx.navigation.fragment.NavHostFragment
@@ -13,10 +14,10 @@ open class MainActivity : FragmentActivity() {
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+        enableEdgeToEdge()
         setContentView(R.layout.activity_main)
 
-        val navHostFragment =
-            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
+        val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
         navController = navHostFragment.navController
         val navInflater = navHostFragment.navController.navInflater
         val graph = navInflater.inflate(R.navigation.nav_graph)

+ 125 - 0
app/src/main/java/com/fastest/pass/login/presentation/components/LoginScreen.kt

@@ -0,0 +1,125 @@
+package com.fastest.pass.login.presentation.components
+
+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.BoxScope
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.navigationBarsPadding
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavHostController
+import com.fastest.pass.R
+
+@Composable
+fun LoginScreen() {
+    Box(
+        modifier = Modifier
+            .background(colorResource(id = R.color.blue_login))
+            .fillMaxSize()
+            .statusBarsPadding()
+    ) {
+        
+        Column(
+            modifier = Modifier
+                .fillMaxSize()
+                .padding(top = 30.dp)
+                .statusBarsPadding()
+        ) {
+            ShowHeaderLogin(text = stringResource(R.string.login))
+
+            Column(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .padding(top = 30.dp)
+                    .statusBarsPadding()
+                    .background(
+                        colorResource(id = R.color.light_gray_login),
+                    )
+            ) {
+                Text(
+                    text = stringResource(id = R.string.master_password_required),
+                    color = colorResource(id = R.color.gray_splash),
+                    style = MaterialTheme.typography.displayLarge.copy(
+                        fontSize = 24.sp
+                    ),
+                    modifier = Modifier.align(Alignment.CenterHorizontally)
+                )
+                Text(
+                    text = stringResource(id = R.string.enter_master_password),
+                    color = colorResource(id = R.color.gray_splash),
+                    style = MaterialTheme.typography.displayLarge.copy(
+                        fontSize = 15.sp
+                    ),
+                    lineHeight = 20.sp,
+                    modifier = Modifier.align(Alignment.CenterHorizontally)
+                )
+            }
+
+        }
+    }
+}
+
+@Composable
+fun ColumnScope.ShowHeaderLogin(text: String) {
+    Row(
+        modifier = Modifier
+            .align(Alignment.Start)
+            .padding(top = 30.dp)
+            .fillMaxWidth(),
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+        IconButton(
+            onClick = {},
+            modifier = Modifier
+                .padding(start = 30.dp)
+                .size(24.dp, 24.dp)
+        ) {
+            Icon(
+                painter = painterResource(id = R.drawable.backarrow3x),
+                contentDescription = "Arrow-Back",
+                tint = colorResource(id = R.color.white),
+                modifier = Modifier.size(24.dp, 24.dp)
+            )
+        }
+        Surface(
+            modifier = Modifier
+                .padding(start = 15.dp),
+            color = colorResource(id = R.color.transparent)
+        ) {
+            Text(
+                text = text,
+                color = colorResource(id = R.color.white),
+                style = MaterialTheme.typography.displayLarge.copy(
+                    fontSize = 24.sp
+                ),
+            )
+        }
+    }
+}

+ 29 - 0
app/src/main/java/com/fastest/pass/login/presentation/ui/LoginFragment.kt

@@ -0,0 +1,29 @@
+package com.fastest.pass.login.presentation.ui
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.compose.ui.platform.ComposeView
+import com.fastest.pass.R
+import com.fastest.pass.login.presentation.components.LoginScreen
+
+class LoginFragment : Fragment() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        return ComposeView(requireContext()).apply {
+            setContent {
+                LoginScreen()
+            }
+        }
+    }
+
+}

+ 26 - 13
app/src/main/java/com/fastest/pass/splash/presentation/components/SplashScreen.kt

@@ -1,28 +1,41 @@
 package com.fastest.pass.splash.presentation.components
 
-import android.widget.Toast
-import androidx.compose.material3.Text
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.livedata.observeAsState
-import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import com.fastest.pass.R
 import com.fastest.pass.splash.presentation.viewmodels.SplashViewModel
 
 @Composable
 fun SplashScreen(viewModel: SplashViewModel) {
 
-    val navigateToLogin by viewModel.navigateToLogin.observeAsState()
-    val context = LocalContext.current
-
     LaunchedEffect(key1 = true) {
         viewModel.checkAuthentication()
     }
 
-    if (navigateToLogin == true) {
-        Toast.makeText(context, "Login", Toast.LENGTH_SHORT).show()
-    } else {
-        Text(text = "Splash")
+    Box(
+        modifier = Modifier
+            .background(colorResource(id = R.color.gray_splash))
+            .fillMaxSize()
+        ) {
+        Image(
+            modifier = Modifier
+                .width(244.dp)
+                .height(75.dp)
+                .align(Alignment.Center),
+            painter = painterResource(
+                id = R.drawable.lockpasslogo),
+            contentDescription = "FastestPass",
+        )
     }
-
 }

+ 5 - 2
app/src/main/java/com/fastest/pass/splash/presentation/ui/SplashFragment.kt

@@ -11,6 +11,7 @@ import com.fastest.pass.splash.presentation.viewmodels.SplashViewModel
 import dagger.hilt.android.AndroidEntryPoint
 import androidx.fragment.app.viewModels
 import com.fastest.pass.splash.utils.SplashNavigation
+import com.fastest.pass.ui.theme.FastestPassTheme
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -30,9 +31,11 @@ class SplashFragment : Fragment() {
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {
-        return ComposeView(requireContext()).apply {
+        return ComposeView(requireActivity()).apply {
             setContent {
-                SplashScreen(viewModel)
+                FastestPassTheme {
+                    SplashScreen(viewModel)
+                }
             }
         }
     }

+ 2 - 1
app/src/main/java/com/fastest/pass/splash/presentation/viewmodels/SplashViewModel.kt

@@ -25,7 +25,8 @@ class SplashViewModel @Inject constructor(var splashUseCase: SplashUseCase) : Vi
     fun checkAuthentication() {
         viewModelScope.launch {
             delay(2000)
-            _navigateToLogin.value = true
+            navigateTo(SplashRoute.OpenLogin)
+//            _navigateToLogin.value = true
         }
     }
 

+ 13 - 1
app/src/main/java/com/fastest/pass/splash/utils/SplashNavigation.kt

@@ -1,13 +1,25 @@
 package com.fastest.pass.splash.utils
 
 import androidx.lifecycle.lifecycleScope
+import androidx.navigation.fragment.findNavController
+import com.fastest.pass.R
 import com.fastest.pass.splash.presentation.ui.SplashFragment
 
 class SplashNavigation {
 
     fun navigate(splashFragment: SplashFragment){
         splashFragment.lifecycleScope.launchWhenStarted {
-//            splashFragment.viewModel.route
+            splashFragment.viewModel.router.collect { router ->
+                when (router) {
+                    SplashRoute.OpenLogin -> {
+                        splashFragment.findNavController().popBackStack()
+                        splashFragment.findNavController().navigate(R.id.loginFragment)
+                    }
+                    SplashRoute.NoneScreen -> {}
+                }
+
+                splashFragment.viewModel.navigateTo(SplashRoute.NoneScreen)
+            }
         }
     }
 

+ 2 - 2
app/src/main/java/com/fastest/pass/splash/utils/SplashRoute.kt

@@ -1,6 +1,6 @@
 package com.fastest.pass.splash.utils
 
 sealed class SplashRoute {
-    object OpenLogin : SplashRoute()
-    object NoneScreen : SplashRoute()
+    data object OpenLogin : SplashRoute()
+    data object NoneScreen : SplashRoute()
 }

+ 2 - 2
app/src/main/java/com/fastest/pass/ui/theme/Color.kt

@@ -2,10 +2,10 @@ package com.fastest.pass.ui.theme
 
 import androidx.compose.ui.graphics.Color
 
-val Purple80 = Color(0xFFD0BCFF)
+val Gray_Splash = Color(0xFF404B69)
 val PurpleGrey80 = Color(0xFFCCC2DC)
 val Pink80 = Color(0xFFEFB8C8)
 
-val Purple40 = Color(0xFF6650a4)
+val Gray_Splash2 = Color(0xFF404B69)
 val PurpleGrey40 = Color(0xFF625b71)
 val Pink40 = Color(0xFF7D5260)

+ 20 - 2
app/src/main/java/com/fastest/pass/ui/theme/Theme.kt

@@ -9,16 +9,22 @@ import androidx.compose.material3.dynamicDarkColorScheme
 import androidx.compose.material3.dynamicLightColorScheme
 import androidx.compose.material3.lightColorScheme
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
+import androidx.fragment.app.FragmentActivity
 
 private val DarkColorScheme = darkColorScheme(
-    primary = Purple80,
+    primary = Gray_Splash,
     secondary = PurpleGrey80,
     tertiary = Pink80
 )
 
 private val LightColorScheme = lightColorScheme(
-    primary = Purple40,
+    primary = Gray_Splash,
     secondary = PurpleGrey40,
     tertiary = Pink40
 
@@ -50,6 +56,18 @@ fun FastestPassTheme(
         else -> LightColorScheme
     }
 
+    val view = LocalView.current
+    if (!view.isInEditMode) {
+        SideEffect {
+            val window = (view.context as Activity).window
+            window.statusBarColor = Color.Transparent.toArgb()
+            window.navigationBarColor = Color.Transparent.toArgb()
+//            window.navigationBarColor = colorScheme.surfaceColorAtElevation(4.dp).toArgb()
+            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
+            WindowCompat.getInsetsController(window, view).isAppearanceLightNavigationBars = darkTheme
+        }
+    }
+
     MaterialTheme(
         colorScheme = colorScheme,
         typography = Typography,

+ 253 - 17
app/src/main/java/com/fastest/pass/ui/theme/Type.kt

@@ -1,34 +1,270 @@
 package com.fastest.pass.ui.theme
 
 import androidx.compose.material3.Typography
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.sp
+import com.fastest.pass.R
 
 // Set of Material typography styles to start with
+
+val outfitFontFamily = FontFamily(
+    Font(R.font.outfit_black, FontWeight.Black),
+    Font(R.font.outfit_bold, FontWeight.Bold),
+    Font(R.font.outfit_extrabold, FontWeight.ExtraBold),
+    Font(R.font.outfit_semibold, FontWeight.SemiBold),
+    Font(R.font.outfit_medium, FontWeight.Medium),
+    Font(R.font.outfit_regular, FontWeight.Normal),
+    Font(R.font.outfit_light, FontWeight.Light),
+    Font(R.font.outfit_extralight, FontWeight.ExtraLight),
+    Font(R.font.outfit_thin, FontWeight.Thin)
+)
+
 val Typography = Typography(
-    bodyLarge = TextStyle(
-        fontFamily = FontFamily.Default,
+    displaySmall = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 14.sp,
+    ),
+    displayMedium = TextStyle(
+        fontFamily = outfitFontFamily,
         fontWeight = FontWeight.Normal,
         fontSize = 16.sp,
-        lineHeight = 24.sp,
-        letterSpacing = 0.5.sp
-    )
-    /* Other default text styles to override
+        textAlign = TextAlign.Right,
+        lineHeight = 30.sp
+    ),
+    displayLarge = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 24.sp,
+    ),
+    headlineSmall = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 12.sp,
+    ),
+    headlineMedium = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 14.sp,
+        textAlign = TextAlign.Center,
+        letterSpacing = (-0.14).sp
+    ),
+    headlineLarge = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Medium,
+        fontSize = 28.sp,
+    ),
+    titleSmall = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Medium,
+        fontSize = 16.sp,
+    ),
+    titleMedium = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Medium,
+        fontSize = 18.sp,
+    ),
     titleLarge = TextStyle(
-        fontFamily = FontFamily.Default,
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.SemiBold,
+        fontSize = 30.sp,
+        lineHeight = 50.sp,
+        letterSpacing = 0.45.sp,
+        textAlign = TextAlign.Center
+    ),
+
+    bodySmall = TextStyle(
+        fontFamily = outfitFontFamily,
         fontWeight = FontWeight.Normal,
-        fontSize = 22.sp,
-        lineHeight = 28.sp,
-        letterSpacing = 0.sp
+        fontSize = 14.sp,
+        lineHeight = 30.sp,
     ),
-    labelSmall = TextStyle(
-        fontFamily = FontFamily.Default,
+    bodyMedium = TextStyle(
+        fontFamily = outfitFontFamily,
         fontWeight = FontWeight.Medium,
-        fontSize = 11.sp,
-        lineHeight = 16.sp,
-        letterSpacing = 0.5.sp
+        fontSize = 18.sp,
+        textAlign = TextAlign.Center,
+    ),
+    bodyLarge = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Medium,
+        fontSize = 14.sp,
+    ),
+    labelSmall = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 14.sp,
+        textAlign = TextAlign.Center,
+        lineHeight = 30.sp
+    ),
+    labelMedium = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 16.sp,
+        textAlign = TextAlign.Center
+    ),
+    labelLarge = TextStyle(
+        fontFamily = outfitFontFamily,
+        fontWeight = FontWeight.Normal,
+        fontSize = 18.sp,
+        textAlign = TextAlign.Center
+    )
+)
+
+val Typography.customTypography: Typography
+    @Composable
+    get() = Typography(
+        displaySmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 18.sp,
+            lineHeight = 30.sp,
+        ),
+        displayMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            textAlign = TextAlign.Center,
+            color = colorResource(id = R.color.blue_login),
+        ),
+        displayLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.SemiBold,
+            fontSize = 18.sp,
+            textAlign = TextAlign.Right,
+            color = colorResource(id = R.color.blue_login),
+        ),
+        headlineSmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 12.sp,
+            lineHeight = 30.sp,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        headlineMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            textAlign = TextAlign.Right,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        headlineLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 18.sp,
+            textAlign = TextAlign.Center,
+        ),
+        titleSmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            textAlign = TextAlign.Right,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        titleMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            textAlign = TextAlign.Right,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        titleLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            color = colorResource(id = R.color.blue_login)
+        )
+        ,
+        bodySmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Medium,
+            fontSize = 12.sp,
+            color = colorResource(id = R.color.white)
+        ),
+        bodyMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            lineHeight = 22.sp,
+            letterSpacing = 0.21.sp,
+            color = colorResource(id = R.color.white)
+        ),
+        bodyLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            color = colorResource(id = R.color.white)
+        ),
+        labelSmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            textAlign = TextAlign.Center,
+            lineHeight = 22.sp,
+            letterSpacing = 0.21.sp,
+            color = colorResource(id = R.color.white)
+        ),
+        labelMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Medium,
+            fontSize = 16.sp,
+            textAlign = TextAlign.Center
+        ),
+        labelLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            lineHeight = 30.sp,
+            color = colorResource(id = R.color.white)
+        ),
     )
-    */
-)
+
+val Typography.customTypography2: Typography
+    @Composable
+    get() = Typography(
+        labelSmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Medium,
+            fontSize = 12.sp,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        labelMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            textAlign = TextAlign.Right
+        ),
+        labelLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.SemiBold,
+            fontSize = 20.sp,
+            textAlign = TextAlign.Right
+        ),
+        bodySmall = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.SemiBold,
+            fontSize = 20.sp,
+            textAlign = TextAlign.Center
+        ),
+        bodyMedium = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            lineHeight = 22.sp,
+            letterSpacing = 0.21.sp,
+            color = colorResource(id = R.color.blue_login)
+        ),
+        bodyLarge = TextStyle(
+            fontFamily = outfitFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 11.sp,
+            textAlign = TextAlign.Center,
+            letterSpacing = (-0.26).sp,
+        )
+    )

BIN
app/src/main/res/drawable/backarrow3x.png


BIN
app/src/main/res/drawable/lockpasslogo.png


BIN
app/src/main/res/font/outfit_black.ttf


BIN
app/src/main/res/font/outfit_bold.ttf


BIN
app/src/main/res/font/outfit_extrabold.ttf


BIN
app/src/main/res/font/outfit_extralight.ttf


BIN
app/src/main/res/font/outfit_light.ttf


BIN
app/src/main/res/font/outfit_medium.ttf


BIN
app/src/main/res/font/outfit_regular.ttf


BIN
app/src/main/res/font/outfit_semibold.ttf


BIN
app/src/main/res/font/outfit_thin.ttf


+ 2 - 1
app/src/main/res/layout/activity_main.xml

@@ -6,5 +6,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     app:defaultNavHost="true"
-    app:navGraph="@navigation/nav_graph" />
+    app:navGraph="@navigation/nav_graph"
+    />
 

+ 5 - 0
app/src/main/res/navigation/nav_graph.xml

@@ -6,4 +6,9 @@
         android:id="@+id/splashFragment"
         android:name="com.fastest.pass.splash.presentation.ui.SplashFragment"
         android:label="SplashFragment" />
+
+    <fragment
+        android:id="@+id/loginFragment"
+        android:name="com.fastest.pass.login.presentation.ui.LoginFragment"
+        android:label="LoginFragment" />
 </navigation>

+ 5 - 0
app/src/main/res/values/colors.xml

@@ -7,4 +7,9 @@
     <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
+    <color name="gray_splash">#404B69</color>
+    <color name="blue_login">#283149</color>
+    <color name="light_gray_login">#DBEDF3</color>
+    <color name="transparent">#00000000</color>
+
 </resources>

+ 3 - 2
app/src/main/res/values/strings.xml

@@ -1,5 +1,6 @@
 <resources>
     <string name="app_name">FastestPass</string>
-    <!-- TODO: Remove or change this placeholder text -->
-    <string name="hello_blank_fragment">Hello blank fragment</string>
+    <string name="login">Log In</string>
+    <string name="master_password_required">Master password required</string>
+    <string name="enter_master_password">Hello! Please enter your master password to continue.</string>
 </resources>

+ 5 - 1
app/src/main/res/values/themes.xml

@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 
-    <style name="Theme.FastestPass" parent="android:Theme.Material.Light.NoActionBar" />
+    <style name="Theme.FastestPass" parent="android:Theme.Material.Light.NoActionBar" >
+        <item name="android:windowDisablePreview">true</item>
+        <item name="android:windowBackground">@color/gray_splash</item>
+    </style>
+
 </resources>

+ 1 - 1
gradle/libs.versions.toml

@@ -17,7 +17,7 @@ okhttp3-interceptor = "4.9.0"
 lifecycle-viewmodel = "2.7.0"
 navigation-compose = "2.7.7"
 runtime-livedata = "1.7.5"
-androidx-fragment = "1.6.2"
+androidx-fragment = "1.8.5"
 navigationFragment = "2.8.4"
 
 [libraries]