diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f87f0f070..7fe2bf5cd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -93,6 +93,7 @@ dependencies { implementation(projects.feature.signin) implementation(projects.feature.library) implementation(projects.feature.feed) + implementation(projects.feature.collection) // AndroidX 및 Jetpack 기본 라이브러리 implementation(libs.androidx.core.ktx) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a67f2cedf..2446f0f1a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -76,6 +76,10 @@ android:name=".ui.main.MainActivity" android:exported="false" android:screenOrientation="portrait" /> + (fragment_my_page) { setupObserver() onProfileEditClick() onStorageButtonClick() + setupCollectionEntry() tracker.trackEvent("mypage") } @@ -92,6 +96,21 @@ class MyPageFragment : BaseFragment(fragment_my_page) { binding.lifecycleOwner = viewLifecycleOwner } + private fun setupCollectionEntry() { + binding.cvMyPageCollectionEntry.apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + WebsosoTheme { + CollectionEntry(onClick = ::navigateToCollection) + } + } + } + } + + private fun navigateToCollection() { + startActivity(CollectionActivity.getIntent(requireContext())) + } + private fun setupRestGenrePreferenceAdapter() { binding.lvMyLibraryRestGenre.adapter = restGenrePreferenceAdapter } diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml index 5eabdef49..39e4f6d61 100644 --- a/app/src/main/res/layout/fragment_my_page.xml +++ b/app/src/main/res/layout/fragment_my_page.xml @@ -279,11 +279,28 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/cl_my_page_user_profile" /> + + + + + app:layout_constraintTop_toBottomOf="@id/view_my_page_collection_divider"> + + + diff --git a/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionEntry.kt b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionEntry.kt new file mode 100644 index 000000000..8329f710b --- /dev/null +++ b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionEntry.kt @@ -0,0 +1,71 @@ +package com.into.websoso.feature.collection + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +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.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.into.websoso.core.common.extensions.debouncedClickable +import com.into.websoso.core.designsystem.theme.Gray300 +import com.into.websoso.core.designsystem.theme.Primary100 +import com.into.websoso.core.designsystem.theme.WebsosoTheme +import com.into.websoso.core.designsystem.theme.White +import com.into.websoso.core.resource.R + +@Composable +fun CollectionEntry( + onClick: () -> Unit, + modifier: Modifier = Modifier, + collectionCount: Int = 0, +) { + Row( + modifier = modifier + .fillMaxWidth() + .background(White) + .debouncedClickable(onClick = onClick) + .padding( + horizontal = 20.dp, + vertical = 20.dp, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = buildAnnotatedString { + append("컬렉션 ") + withStyle(style = SpanStyle(color = Primary100)) { + append(collectionCount.toString()) + } + append("개") + }, + color = Gray300, + style = WebsosoTheme.typography.title2, + ) + Spacer(modifier = Modifier.weight(1f)) + Image( + imageVector = ImageVector.vectorResource(R.drawable.btn_setting_right), + contentDescription = null, + modifier = Modifier.size(24.dp), + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun CollectionEntryPreview() { + WebsosoTheme { + CollectionEntry(onClick = {}) + } +} diff --git a/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionNavHost.kt b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionNavHost.kt new file mode 100644 index 000000000..4d95db7af --- /dev/null +++ b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionNavHost.kt @@ -0,0 +1,24 @@ +package com.into.websoso.feature.collection + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController + +private const val COLLECTION_ROUTE = "collection" + +@Composable +fun CollectionNavHost(modifier: Modifier = Modifier) { + val navController = rememberNavController() + + NavHost( + navController = navController, + startDestination = COLLECTION_ROUTE, + modifier = modifier, + ) { + composable(route = COLLECTION_ROUTE) { + CollectionScreen() + } + } +} diff --git a/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionScreen.kt b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionScreen.kt new file mode 100644 index 000000000..69cf4c753 --- /dev/null +++ b/feature/collection/src/main/java/com/into/websoso/feature/collection/CollectionScreen.kt @@ -0,0 +1,48 @@ +package com.into.websoso.feature.collection + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.into.websoso.core.designsystem.theme.Black +import com.into.websoso.core.designsystem.theme.Gray200 +import com.into.websoso.core.designsystem.theme.WebsosoTheme +import com.into.websoso.core.designsystem.theme.White + +@Composable +fun CollectionScreen(modifier: Modifier = Modifier) { + Column( + modifier = modifier + .fillMaxSize() + .background(White) + .padding(horizontal = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text( + text = "컬렉션", + color = Black, + style = WebsosoTheme.typography.headline1, + ) + Text( + text = "임시화면", + color = Gray200, + style = WebsosoTheme.typography.body2, + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun CollectionScreenPreview() { + WebsosoTheme { + CollectionScreen() + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e2bcebb8b..f1901b57f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,6 +32,7 @@ lifecycle-extensions = "2.2.0" datastore-preferences = "1.2.0" security-crypto = "1.1.0" paging = "3.3.6" +navigation = "2.9.8" # Testing Libraries junit = "4.13.2" @@ -167,6 +168,7 @@ compose-material3 = { module = "androidx.compose.material3:material3" } compose-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-hilt-navigation = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt-navigation-compose" } +navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" } lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose" } androidx-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" } diff --git a/settings.gradle.kts b/settings.gradle.kts index e23a00fed..81a0aa86b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -44,6 +44,7 @@ include( ":feature:signin", ":feature:library", ":feature:feed", + ":feature:collection", ) include(":domain:feed") include(":data:user")