瀏覽代碼

Worked on browse screen, new item browse screen and its navigation & structure

Khubaib 4 月之前
父節點
當前提交
e7552502de

+ 1 - 1
app/src/main/java/com/fastest/pass/account/presentation/ui/components/AccountScreen.kt

@@ -803,7 +803,7 @@ fun ColumnScope.SwitchPasswordGenerator(
         verticalAlignment = Alignment.CenterVertically
     ) {
         Text(
-            text = stringResource(id = title).plus(isSwitchEnabled).plus(isSwitch),
+            text = stringResource(id = title),
             color = colorResource(id = R.color.gray_splash),
             style = MaterialTheme.typography.titleMedium,
             lineHeight = 20.sp,

+ 6 - 10
app/src/main/java/com/fastest/pass/browse/di/BrowseModule.kt

@@ -1,6 +1,5 @@
 package com.fastest.pass.browse.di
 
-import com.fastest.pass.account.utils.AccountNavigation
 import com.fastest.pass.browse.utils.BrowseNavigation
 import dagger.Module
 import dagger.Provides
@@ -8,16 +7,13 @@ import dagger.hilt.InstallIn
 import dagger.hilt.components.SingletonComponent
 import javax.inject.Singleton
 
+@Module
+@InstallIn(SingletonComponent::class)
 object BrowseModule {
 
-    @Module
-    @InstallIn(SingletonComponent::class)
-    object AccountModule {
-
-        @Provides
-        @Singleton
-        fun provideNavigation() : BrowseNavigation {
-            return BrowseNavigation()
-        }
+    @Provides
+    @Singleton
+    fun provideNavigation() : BrowseNavigation {
+        return BrowseNavigation()
     }
 }

+ 20 - 0
app/src/main/java/com/fastest/pass/browse/di/NewItemBrowseModule.kt

@@ -0,0 +1,20 @@
+package com.fastest.pass.browse.di
+
+import com.fastest.pass.browse.utils.BrowseNavigation
+import com.fastest.pass.browse.utils.NewItemBrowseNavigation
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object NewItemBrowseModule {
+
+    @Provides
+    @Singleton
+    fun provideNavigation() : NewItemBrowseNavigation {
+        return NewItemBrowseNavigation()
+    }
+}

+ 16 - 8
app/src/main/java/com/fastest/pass/browse/presentation/ui/components/BrowseScreen.kt

@@ -38,13 +38,21 @@ import androidx.compose.ui.unit.dp
 import com.fastest.pass.R
 import com.fastest.pass.home.domain.model.AddNewItem
 import com.fastest.pass.home.presentation.ui.components.AddNewItemRow
-import com.fastest.pass.home.presentation.ui.components.ClickTypeAddNewItem
 import com.fastest.pass.home.presentation.ui.components.GapLine
-import com.fastest.pass.home.presentation.ui.components.SearchBarRow
-import com.fastest.pass.security.presentation.ui.components.SearchBarRowSS
+
+enum class ClickTypeItemBrowse {
+    Password,
+    Bank,
+    Payment,
+    Wifi,
+    Note,
+    Contact,
+    Driver,
+    Passport
+}
 
 @Composable
-fun BrowseScreen() {
+fun BrowseScreen(clickTypeItemBrowse: (ClickTypeItemBrowse) -> Unit) {
     Box(
         modifier = Modifier
             .fillMaxSize(),
@@ -64,8 +72,8 @@ fun BrowseScreen() {
             Spacer(modifier = Modifier.height(20.dp))
             GapLine()
             Spacer(modifier = Modifier.height(0.dp))
-            AddNewItemListBS {
-
+            AddNewItemListBS { clickTypeItemBrowseId ->
+                clickTypeItemBrowse(clickTypeItemBrowseId)
             }
         }
     }
@@ -149,7 +157,7 @@ fun ColumnScope.SearchBarRowBS() {
 }
 
 @Composable
-fun AddNewItemListBS(clickType: (ClickTypeAddNewItem) -> Unit) {
+fun AddNewItemListBS(clickType: (ClickTypeItemBrowse) -> Unit) {
     val itemList by remember {
         mutableStateOf(
             listOf(
@@ -176,7 +184,7 @@ fun AddNewItemListBS(clickType: (ClickTypeAddNewItem) -> Unit) {
             contentPadding = PaddingValues(top = 0.dp)
         ) {
             items(itemList, itemContent = { item ->
-                AddNewItemRow(item = item) {
+                AddNewItemBrowseRow(item = item) {
                     clickType(it)
                 }
             })

+ 94 - 0
app/src/main/java/com/fastest/pass/browse/presentation/ui/components/NewItemBrowseRow.kt

@@ -0,0 +1,94 @@
+package com.fastest.pass.browse.presentation.ui.components
+
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+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.Color
+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.home.domain.model.AddNewItem
+
+@Composable
+fun AddNewItemBrowseRow(item: AddNewItem, clickType: (ClickTypeItemBrowse) -> Unit) {
+    Row(
+        modifier = Modifier
+            .padding(top = 10.dp)
+            .border(
+                border = BorderStroke(1.dp, colorResource(id = R.color.home_background_color)),
+                shape = RoundedCornerShape(15.dp)
+            )
+            .clip(RoundedCornerShape(15.dp))
+            .background(colorResource(id = R.color.white))
+            .fillMaxWidth()
+            .clickable {
+                clickType.invoke(ClickTypeItemBrowse.valueOf(item.id))
+            },
+        horizontalArrangement = Arrangement.Start,
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+        Surface(
+            modifier = Modifier.padding(start = 10.dp),
+            color = Color.Transparent
+        ) {
+            Image(
+                painter = painterResource(id = item.icon),
+                contentDescription = "Icon",
+                modifier = Modifier
+                    .padding(start = 0.dp)
+                    .padding(vertical = 15.dp)
+                    .size(34.dp)
+                    .weight(1f),
+            )
+        }
+
+        Surface(
+            modifier = Modifier.padding(start = 15.dp, end = 5.dp),
+            color = Color.Transparent
+        ) {
+            Text(
+                text = item.name,
+                style = MaterialTheme.typography.displayMedium,
+                color = colorResource(id = R.color.gray_splash),
+                maxLines = 1,
+                modifier = Modifier
+                    .weight(1F)
+            )
+        }
+
+        Spacer(modifier = Modifier.weight(1f))
+
+        Surface(
+            modifier = Modifier
+                .padding(end = 15.dp)
+                .align(Alignment.CenterVertically),
+            color = Color.Transparent
+        ) {
+            Image(
+                painter = painterResource(id = R.drawable.arrow_right),
+                contentDescription = "Front_Arrow",
+                modifier = Modifier
+                    .padding(start = 0.dp, end = 0.dp)
+                    .size(24.dp)
+                    .weight(1f),
+            )
+        }
+    }
+}

+ 29 - 1
app/src/main/java/com/fastest/pass/browse/presentation/ui/components/NewItemBrowseScreen.kt

@@ -1,11 +1,18 @@
 package com.fastest.pass.browse.presentation.ui.components
 
 import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+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.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
@@ -25,9 +32,30 @@ enum class ClickTypeNewItemBrowse {
 }
 @Composable
 fun NewItemBrowseScreen(
-    isItemsAdded: Boolean = false
+    screenName: String,
+    screenNameType: ClickTypeItemBrowse,
+    clickTypeNewItemBrowse: (ClickTypeNewItemBrowse) -> Unit
 ) {
+    Column(
+        modifier = Modifier
+            .fillMaxSize()
+            .padding(top = 0.dp)
+            .statusBarsPadding()
+            .background(colorResource(id = R.color.white))
+            .navigationBarsPadding()
+    ) {
+        Row(
+            modifier = Modifier
+                .fillMaxWidth()
+                .height(25.dp)
+                .background(colorResource(id = R.color.blue_login))
+        ) { }
 
+        Spacer(modifier = Modifier.height(20.dp))
+        ShowNewItemBrowseHeader(text = screenName) { clickTypeNewItemBrowseId ->
+            clickTypeNewItemBrowse(clickTypeNewItemBrowseId)
+        }
+    }
 }
 
 @Composable

+ 53 - 2
app/src/main/java/com/fastest/pass/browse/presentation/ui/fragment/BrowseFragment.kt

@@ -1,6 +1,7 @@
 package com.fastest.pass.home.presentation.ui.fragment
 
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -13,18 +14,31 @@ import androidx.compose.material.Text
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.res.colorResource
+import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import com.fastest.pass.BaseFragment
 import com.fastest.pass.R
 import com.fastest.pass.browse.presentation.ui.components.BrowseScreen
+import com.fastest.pass.browse.presentation.ui.components.ClickTypeItemBrowse
 import com.fastest.pass.browse.presentation.viewmodels.BrowseViewModel
+import com.fastest.pass.browse.utils.BrowseNavigation
+import com.fastest.pass.browse.utils.BrowseRoute
 import com.fastest.pass.ui.theme.FastestPassTheme
 import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
 
 @AndroidEntryPoint
 class BrowseFragment : BaseFragment() {
 
-    val viewmodel: BrowseViewModel by viewModels()
+    val viewmodel: BrowseViewModel by activityViewModels()
+
+    @Inject
+    lateinit var navigation: BrowseNavigation
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        navigation.navigate(this)
+    }
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -42,7 +56,44 @@ class BrowseFragment : BaseFragment() {
                                 .background(colorResource(id = R.color.home_background_color))
                                 .padding(paddingValues.calculateBottomPadding())
                         ) {
-                            BrowseScreen()
+                            BrowseScreen { clickTypeItemBrowse ->
+                                Log.d("screenNameBrowse", "clickTypeItemBrowseBF = ${clickTypeItemBrowse.name} ,,")
+
+                                when (clickTypeItemBrowse) {
+                                    ClickTypeItemBrowse.Password -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Bank -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Payment -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Wifi -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Note -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Contact -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Driver -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                    ClickTypeItemBrowse.Passport -> {
+                                        viewmodel.navigateToItemScreen(clickTypeItemBrowse)
+                                        viewmodel.navigateTo(BrowseRoute.OpenNewItemBrowseScreen)
+                                    }
+                                }
+                            }
                         }
                     }
                 }

+ 64 - 2
app/src/main/java/com/fastest/pass/browse/presentation/ui/fragment/NewItemBrowseFragment.kt

@@ -1,6 +1,7 @@
 package com.fastest.pass.browse.presentation.ui.fragment
 
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -9,17 +10,40 @@ import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material.Scaffold
+import androidx.compose.runtime.collectAsState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.res.colorResource
+import androidx.fragment.app.activityViewModels
+import androidx.fragment.app.viewModels
 import com.fastest.pass.BaseFragment
 import com.fastest.pass.R
+import com.fastest.pass.browse.presentation.ui.components.ClickTypeItemBrowse
+import com.fastest.pass.browse.presentation.ui.components.ClickTypeNewItemBrowse
 import com.fastest.pass.browse.presentation.ui.components.NewItemBrowseScreen
+import com.fastest.pass.browse.presentation.viewmodels.BrowseViewModel
+import com.fastest.pass.browse.presentation.viewmodels.NewItemBrowseViewmodel
+import com.fastest.pass.browse.utils.BrowseRoute
+import com.fastest.pass.browse.utils.NewItemBrowseNavigation
+import com.fastest.pass.browse.utils.NewItemBrowseRoute
 import com.fastest.pass.ui.theme.FastestPassTheme
 import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
 
 @AndroidEntryPoint
 class NewItemBrowseFragment : BaseFragment() {
+
+    val viewmodel: NewItemBrowseViewmodel by viewModels()
+    val browseViewmodel: BrowseViewModel by activityViewModels()
+
+    @Inject
+    lateinit var navigation: NewItemBrowseNavigation
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        navigation.navigate(this)
+    }
+
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -34,10 +58,48 @@ class NewItemBrowseFragment : BaseFragment() {
                         Box(
                             modifier = Modifier
                                 .fillMaxSize()
-                                .background(colorResource(id = R.color.white))
+                                .background(colorResource(id = R.color.blue_login))
                                 .padding(paddingValues.calculateBottomPadding())
                         ) {
-                            NewItemBrowseScreen()
+                            val screenName = browseViewmodel.itemScreenName.collectAsState()
+                            var headerName = ""
+
+                            Log.d("screenNameBrowse", "screenName = ${screenName.value},")
+
+                            when (screenName.value) {
+                                    ClickTypeItemBrowse.Password -> {
+                                        headerName = "Password"
+                                    }
+                                    ClickTypeItemBrowse.Bank -> {
+                                        headerName = "Bank Account"
+                                    }
+                                    ClickTypeItemBrowse.Payment -> {
+                                        headerName = "Payment Card"
+                                    }
+                                    ClickTypeItemBrowse.Wifi -> {
+                                        headerName = "Wifi Password"
+                                    }
+                                    ClickTypeItemBrowse.Note -> {
+                                        headerName = "Secure Note"
+                                    }
+                                    ClickTypeItemBrowse.Contact -> {
+                                        headerName = "Contact Info"
+                                    }
+                                    ClickTypeItemBrowse.Driver -> {
+                                        headerName = "Driver's License"
+                                    }
+                                    ClickTypeItemBrowse.Passport -> {
+                                        headerName = "Passport"
+                                    }
+                                }
+
+                            NewItemBrowseScreen(headerName, screenName.value) { clickTypeNewItemBrowse ->
+                                when (clickTypeNewItemBrowse) {
+                                    ClickTypeNewItemBrowse.GO_BACK_BROWSE -> {
+                                        viewmodel.navigateTo(NewItemBrowseRoute.GoBackToBrowseScreen)
+                                    }
+                                }
+                            }
                         }
                     }
                 }

+ 18 - 0
app/src/main/java/com/fastest/pass/browse/presentation/viewmodels/BrowseViewModel.kt

@@ -1,7 +1,25 @@
 package com.fastest.pass.browse.presentation.viewmodels
 
+import android.util.Log
 import androidx.lifecycle.ViewModel
+import com.fastest.pass.browse.presentation.ui.components.ClickTypeItemBrowse
+import com.fastest.pass.browse.utils.BrowseRoute
+import com.fastest.pass.home.presentation.ui.components.ClickTypeAddNewItem
+import kotlinx.coroutines.flow.MutableStateFlow
 
 class BrowseViewModel : ViewModel() {
+    private val _router = MutableStateFlow<BrowseRoute>(BrowseRoute.OpenNoneScreen)
+    val router: MutableStateFlow<BrowseRoute> = _router
 
+    private val _itemScreenName = MutableStateFlow<ClickTypeItemBrowse>(ClickTypeItemBrowse.Password)
+    val itemScreenName: MutableStateFlow<ClickTypeItemBrowse> = _itemScreenName
+
+    fun navigateTo(browseRoute: BrowseRoute) {
+        _router.value = browseRoute
+    }
+
+    fun navigateToItemScreen(clickTypeItemBrowse: ClickTypeItemBrowse) {
+        Log.d("test_screen_name", "screenNameBrowse = ${clickTypeItemBrowse.name}")
+        _itemScreenName.value = clickTypeItemBrowse
+    }
 }

+ 14 - 0
app/src/main/java/com/fastest/pass/browse/presentation/viewmodels/NewItemBrowseViewmodel.kt

@@ -0,0 +1,14 @@
+package com.fastest.pass.browse.presentation.viewmodels
+
+import androidx.lifecycle.ViewModel
+import com.fastest.pass.browse.utils.NewItemBrowseRoute
+import kotlinx.coroutines.flow.MutableStateFlow
+
+class NewItemBrowseViewmodel : ViewModel() {
+    private val _router = MutableStateFlow<NewItemBrowseRoute>(NewItemBrowseRoute.OpenNoneScreen)
+    val router: MutableStateFlow<NewItemBrowseRoute> = _router
+
+    fun navigateTo(newItemBrowseRoute: NewItemBrowseRoute) {
+        _router.value = newItemBrowseRoute
+    }
+}

+ 16 - 15
app/src/main/java/com/fastest/pass/browse/utils/BrowseNavigation.kt

@@ -3,24 +3,25 @@ package com.fastest.pass.browse.utils
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
 import com.fastest.pass.R
-import com.fastest.pass.account.utils.AccountRoute
 import com.fastest.pass.home.presentation.ui.fragment.BrowseFragment
 
 class BrowseNavigation {
 
-//    fun navigate(browseFragment: BrowseFragment) {
-//        browseFragment.lifecycleScope.launchWhenStarted {
-//            browseFragment.viewmodel.router.collect { router ->
-//                when (router) {
-//                    AccountRoute.OpenLoginScreen -> {
-//                        browseFragment.findNavController().popBackStack()
-//                        browseFragment.findNavController().navigate(R.id.loginFragment)
-//                    }
-//                    AccountRoute.OpenNoneScreen -> {}
-//                }
-//                browseFragment.viewmodel.navigateTo(AccountRoute.OpenNoneScreen)
-//            }
-//        }
-//    }
+    fun navigate(browseFragment: BrowseFragment) {
+        browseFragment.lifecycleScope.launchWhenStarted {
+            browseFragment.viewmodel.router.collect { router ->
+                when (router) {
+                    BrowseRoute.GoBackToBrowseScreen -> {
+                        browseFragment.findNavController().popBackStack()
+                    }
+                    BrowseRoute.OpenNewItemBrowseScreen -> {
+                        browseFragment.findNavController().navigate(R.id.newItemBrowseFragment)
+                    }
+                    BrowseRoute.OpenNoneScreen -> {}
+                }
+                browseFragment.viewmodel.navigateTo(BrowseRoute.OpenNoneScreen)
+            }
+        }
+    }
 
 }

+ 24 - 0
app/src/main/java/com/fastest/pass/browse/utils/NewItemBrowseNavigation.kt

@@ -0,0 +1,24 @@
+package com.fastest.pass.browse.utils
+
+import androidx.lifecycle.lifecycleScope
+import androidx.navigation.fragment.findNavController
+import com.fastest.pass.browse.presentation.ui.fragment.NewItemBrowseFragment
+
+class NewItemBrowseNavigation {
+
+    fun navigate(newItemBrowseFragment: NewItemBrowseFragment) {
+        newItemBrowseFragment.lifecycleScope.launchWhenStarted {
+            newItemBrowseFragment.viewmodel.router.collect { router ->
+                when (router) {
+                    NewItemBrowseRoute.GoBackToBrowseScreen -> {
+                        newItemBrowseFragment.findNavController().popBackStack()
+                    }
+                    NewItemBrowseRoute.OpenNoneScreen -> {}
+                }
+
+                newItemBrowseFragment.viewmodel.navigateTo(NewItemBrowseRoute.OpenNoneScreen)
+            }
+        }
+    }
+
+}

+ 6 - 0
app/src/main/java/com/fastest/pass/browse/utils/NewItemBrowseRoute.kt

@@ -0,0 +1,6 @@
+package com.fastest.pass.browse.utils
+
+sealed class NewItemBrowseRoute {
+    data object GoBackToBrowseScreen : NewItemBrowseRoute()
+    data object OpenNoneScreen : NewItemBrowseRoute()
+}

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

@@ -65,4 +65,9 @@
         android:name="com.fastest.pass.home.presentation.ui.fragment.NewItemFormFragment"
         android:label="NewItemFormFragment" />
 
+    <fragment
+        android:id="@+id/newItemBrowseFragment"
+        android:name="com.fastest.pass.browse.presentation.ui.fragment.NewItemBrowseFragment"
+        android:label="NewItemBrowseFragment" />
+
 </navigation>