Explorar o código

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

Khubaib hai 1 mes
pai
achega
513cac44ba
Modificáronse 32 ficheiros con 841 adicións e 50 borrados
  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=BIN
      app/src/main/res/drawable/backarrow3x.png
  17. BIN=BIN
      app/src/main/res/drawable/lockpasslogo.png
  18. BIN=BIN
      app/src/main/res/font/outfit_black.ttf
  19. BIN=BIN
      app/src/main/res/font/outfit_bold.ttf
  20. BIN=BIN
      app/src/main/res/font/outfit_extrabold.ttf
  21. BIN=BIN
      app/src/main/res/font/outfit_extralight.ttf
  22. BIN=BIN
      app/src/main/res/font/outfit_light.ttf
  23. BIN=BIN
      app/src/main/res/font/outfit_medium.ttf
  24. BIN=BIN
      app/src/main/res/font/outfit_regular.ttf
  25. BIN=BIN
      app/src/main/res/font/outfit_semibold.ttf
  26. BIN=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=BIN
app/src/main/res/drawable/backarrow3x.png


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


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


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


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


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


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


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


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


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


BIN=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]