Skip to content
Open
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
ed79214
feat: collection 피처 모듈 생성
devfeijoa Jul 28, 2026
8ef6498
feat: collection 모듈 내 Navigation Compose 의존성 추가
devfeijoa Jul 28, 2026
1d920b3
feat: 컬렉션 기능 구성을 위한 임시 화면 추가
devfeijoa Jul 28, 2026
d5613f6
feat: 컬렉션 기능 내 탐색을 위한 CollectionNavHost 구현
devfeijoa Jul 28, 2026
f86631e
feat: app 모듈 내 컬렉션 피처 모듈 의존성 추가
devfeijoa Jul 28, 2026
23a17d9
feat: Collection 화면 진입을 위한 CollectionActivity 추가
devfeijoa Jul 28, 2026
e1777ed
feat: `CollectionActivity` 내 `AndroidEntryPoint` 어노테이션 추가
devfeijoa Jul 28, 2026
89bbc45
feat: 컬렉션 화면 액티비티(CollectionActivity) 등록
devfeijoa Jul 28, 2026
5027cb0
feat: 컬렉션 목록 진입을 위한 CollectionEntry 컴포저블 추가
devfeijoa Jul 28, 2026
63b0259
feat: 마이페이지 내 컬렉션 진입 섹션 레이아웃 추가
devfeijoa Jul 28, 2026
233767c
feat: 마이페이지 내 컬렉션 진입부 추가
devfeijoa Jul 28, 2026
8e94a05
feat: 컬렉션 화면 내 상단 앱바 추가 및 구조 개선
devfeijoa Jul 28, 2026
e8ee43c
feat: 컬렉션 화면 내 탭 바 컴포저블 추가 및 적용
devfeijoa Jul 28, 2026
462a4b3
feat: 컬렉션 화면 내 탭 선택 기능 구현
devfeijoa Jul 28, 2026
82b98f0
feat: 컬렉션 생성 버튼 컴포넌트 추가 및 적용
devfeijoa Jul 28, 2026
55f7aab
fix: 컬렉션 화면 내 임시 레이아웃 제거
devfeijoa Jul 28, 2026
297de49
refactor: CollectionCreateButton 컴포저블 코드 스타일 및 포맷팅 수정
devfeijoa Jul 28, 2026
6444759
refactor: 코드 스타일 및 포맷팅 수정
devfeijoa Jul 28, 2026
a88bea1
feat: 컬렉션 생성 화면 추가 및 네비게이션 연결
devfeijoa Jul 28, 2026
e7c39cb
feat: 컬렉션 생성 버튼 내 클릭 상호작용 추가
devfeijoa Jul 28, 2026
142052d
feat: 컬렉션 화면 내 생성 화면 이동 로직 추가
devfeijoa Jul 28, 2026
bf8acfa
feat: 컬렉션 생성 화면 내 앱바 추가 및 레이아웃 수정
devfeijoa Jul 28, 2026
bccf4ef
refactor: 컬렉션 생성 화면 내 임시 플레이스홀더 제거
devfeijoa Jul 28, 2026
2b1a3b6
feat: 컬렉션 생성 화면 내 공개 여부 설정 컴포넌트 추가
devfeijoa Jul 28, 2026
33b02f9
feat: 컬렉션 생성 화면 내 이름 입력 컴포넌트 추가
devfeijoa Jul 28, 2026
4b72b18
feat: 컬렉션 생성 화면 내 설명 입력 필드 추가
devfeijoa Jul 29, 2026
a5add47
feat: 컬렉션 생성 화면 내 작품 리스트 섹션 추가
devfeijoa Jul 29, 2026
5c4c650
feat: 컬렉션 생성 내 작품 검색 화면 추가 및 내비게이션 연결
devfeijoa Jul 29, 2026
66f75e1
feat: 컬렉션 작품 검색 화면 내 검색 필드 추가 및 UI 수정
devfeijoa Jul 29, 2026
7618ed9
feat: 컬렉션 작품 검색 필드 입력 기능 및 자동 포커스 구현
devfeijoa Jul 29, 2026
5ca78ec
refactor: consolidate collection app bars
devfeijoa Jul 31, 2026
cf66bbb
feat: 컬렉션 내 서재 작품 선택 화면 추가 및 검색 화면 연동
devfeijoa Jul 31, 2026
8611773
feat: 필터 없는 서재 작품 조회 추가
devfeijoa Jul 31, 2026
40495c7
feat: 컬렉션 서재 작품 항목 추가
devfeijoa Jul 31, 2026
103e3d3
feat: 서재 작품 컬렉션 모델 변환 추가
devfeijoa Jul 31, 2026
fe6c6d7
feat: feature/collection 모듈 내 Navigation 및 Paging Compose 의존성 추가
devfeijoa Aug 1, 2026
c151f1a
feat: 컬렉션 생성 내 서재 작품 선택 기능 구현
devfeijoa Aug 1, 2026
6800b0d
feat: 컬렉션 서재 소설 선택 화면 내 로딩 인디케이터 추가
devfeijoa Aug 1, 2026
47ecaa8
feat: 컬렉션 서재 내 작품 선택 화면 하단 로딩 인디케이터 추가
devfeijoa Aug 1, 2026
f1c82ce
refactor: 서재 관련 레포지토리 내 함수 코드 포맷팅 수정
devfeijoa Aug 3, 2026
6f1ab63
feat: 서재 작품 선택 화면 내 데이터 로드 실패 대응 UI 추가
devfeijoa Aug 6, 2026
3f3190c
fix: 서재 작품 선택 화면 내 에러 상태 처리 로직 개선
devfeijoa Aug 11, 2026
8bd7f27
feat: novel 데이터 모듈 추가
devfeijoa Aug 12, 2026
a3e392b
feat: 작품 검색 엔티티 추가
devfeijoa Aug 12, 2026
9e36cde
feat: 작품 검색 응답 모델 추가
devfeijoa Aug 12, 2026
5ed8c99
feat: 작품 검색 API 추가
devfeijoa Aug 12, 2026
2f7fbf3
feat: 작품 검색 API 의존성 연결
devfeijoa Aug 12, 2026
21f62c0
feat: 작품 검색 PagingSource 기본 요청 구현
devfeijoa Aug 12, 2026
592c049
feat: 작품 검색 Paging 페이지 연결
devfeijoa Aug 12, 2026
9cf8a68
feat: 작품 검색 Paging 오류 처리
devfeijoa Aug 12, 2026
11b553e
feat: 컬렉션 작품 검색 화면 내 검색 및 선택 기능 구현
devfeijoa Aug 13, 2026
1c3f56e
fix: 검색 결과 다음 페이지 오류 시 기존 목록을 유지한다
devfeijoa Aug 13, 2026
f606ff5
feat: 작품 검색 결과 당겨서 새로고침을 지원
devfeijoa Aug 13, 2026
50450e1
feat: 컬렉션 내 소설 검색 및 선택 아이템 컴포저블 구현
devfeijoa Aug 13, 2026
d3f82c8
feat: 컬렉션 내 선택된 소설 정보를 담는 데이터 클래스 추가
devfeijoa Aug 13, 2026
8e279b3
feat: 작품 검색 관련 Repository 구현
devfeijoa Aug 13, 2026
b0b33ef
build: 컬렉션 모듈에 작품 데이터 의존성 추가
devfeijoa Aug 13, 2026
e7bb147
feat: 컬렉션 내 작품 검색을 위한 ViewModel 추가
devfeijoa Aug 13, 2026
88af5a2
feat: 컬렉션 공통 네트워크 오류 화면 구현
devfeijoa Aug 13, 2026
6d5131e
feat: 컬렉션 작품 검색 필드 내 검색 동작 추가 및 접근성 개선
devfeijoa Aug 13, 2026
be65f54
refactor: 컬렉션 서재 내 작품 선택 관리 로직을 ID에서 객체 기반으로 변경
devfeijoa Aug 14, 2026
16c62f2
refactor: 컬렉션 서재 화면의 선택 상태를 객체 기반으로 연결
devfeijoa Aug 14, 2026
952ae43
refactor: 서재 네트워크 오류 UI를 공통 컴포넌트로 대체
devfeijoa Aug 14, 2026
5e7ccea
feat: 검색과 서재의 작품 선택 상태를 통합
devfeijoa Aug 14, 2026
1e0de84
fix: 컬렉션 작품 검색 아이템 레이아웃 수정
devfeijoa Aug 14, 2026
572675f
refactor: CollectionNovelSearchItem 내 import 문 정렬
devfeijoa Aug 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@
android:name=".ui.main.MainActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.collection.CollectionActivity"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.notification.NotificationActivity"
android:exported="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.into.websoso.ui.collection

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.into.websoso.core.designsystem.theme.WebsosoTheme
import com.into.websoso.feature.collection.CollectionNavHost
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class CollectionActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContent {
WebsosoTheme {
CollectionNavHost(onNavigateBack = ::finish)
}
}
}

companion object {
fun getIntent(context: Context): Intent = Intent(context, CollectionActivity::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
Expand All @@ -28,11 +29,14 @@ import com.into.websoso.core.common.util.SingleEventHandler
import com.into.websoso.core.common.util.getS3ImageUrl
import com.into.websoso.core.common.util.setListViewHeightBasedOnChildren
import com.into.websoso.core.common.util.tracker.Tracker
import com.into.websoso.core.designsystem.theme.WebsosoTheme
import com.into.websoso.core.resource.R.drawable.img_loading_thumbnail
import com.into.websoso.core.resource.R.string.my_library_attractive_point_fixed_text
import com.into.websoso.data.model.GenrePreferenceEntity
import com.into.websoso.data.model.NovelPreferenceEntity
import com.into.websoso.databinding.FragmentMyPageBinding
import com.into.websoso.feature.collection.component.CollectionEntry
import com.into.websoso.ui.collection.CollectionActivity
import com.into.websoso.ui.main.MainViewModel
import com.into.websoso.ui.main.myPage.MyLibraryViewModel
import com.into.websoso.ui.main.myPage.adapter.RestGenrePreferenceAdapter
Expand Down Expand Up @@ -77,6 +81,7 @@ class MyPageFragment : BaseFragment<FragmentMyPageBinding>(fragment_my_page) {
setupObserver()
onProfileEditClick()
onStorageButtonClick()
setupCollectionEntry()
tracker.trackEvent("mypage")
}

Expand All @@ -92,6 +97,23 @@ class MyPageFragment : BaseFragment<FragmentMyPageBinding>(fragment_my_page) {
binding.lifecycleOwner = viewLifecycleOwner
}

private fun setupCollectionEntry() {
binding.cvMyPageCollectionEntry.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
WebsosoTheme {
CollectionEntry(onClick = ::navigateToCollection)
}
}
}
}

private fun navigateToCollection() {
singleEventHandler.throttleFirst {
startActivity(CollectionActivity.getIntent(requireContext()))
}
}

private fun setupRestGenrePreferenceAdapter() {
binding.lvMyLibraryRestGenre.adapter = restGenrePreferenceAdapter
}
Expand Down
21 changes: 19 additions & 2 deletions app/src/main/res/layout/fragment_my_page.xml
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,28 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_my_page_user_profile" />

<androidx.compose.ui.platform.ComposeView
android:id="@+id/cv_my_page_collection_entry"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider" />

<View
android:id="@+id/view_my_page_collection_divider"
android:layout_width="0dp"
android:layout_height="3dp"
android:background="@color/gray_50_F4F5F8"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cv_my_page_collection_entry" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_my_library_genre_preference"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider"
app:layout_constraintTop_toBottomOf="@id/view_my_page_collection_divider"
tools:layout_editor_absoluteX="0dp">

<TextView
Expand Down Expand Up @@ -447,7 +464,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/view_my_page_profile_divider">
app:layout_constraintTop_toBottomOf="@id/view_my_page_collection_divider">

<TextView
android:id="@+id/tv_my_library_preference_analysis_title"
Expand Down
23 changes: 23 additions & 0 deletions core/resource/src/main/res/drawable/ic_collection_create.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="19.44"
android:viewportHeight="19.44">
<path
android:pathData="M9.707,0.36C14.838,0.36 19.08,4.593 19.08,9.716C19.08,14.847 14.847,19.08 9.716,19.08C4.593,19.08 0.36,14.847 0.36,9.716C0.36,4.594 4.584,0.36 9.707,0.36Z"
android:fillColor="#FFFFFF"
android:strokeColor="#EEEEF2"
android:strokeWidth="0.72" />
<path
android:pathData="M5.4,9.72L14.04,9.72"
android:fillColor="#00000000"
android:strokeColor="#6A5DFD"
android:strokeLineCap="round"
android:strokeWidth="2.254" />
<path
android:pathData="M9.72,5.4L9.72,14.04"
android:fillColor="#00000000"
android:strokeColor="#6A5DFD"
android:strokeLineCap="round"
android:strokeWidth="2.254" />
</vector>
13 changes: 13 additions & 0 deletions feature/collection/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.into.websoso.setNamespace

plugins {
id("websoso.android.feature")
}

android {
setNamespace("feature.collection")
}

dependencies {
implementation(libs.navigation.compose)
}
4 changes: 4 additions & 0 deletions feature/collection/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
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(
onNavigateBack: () -> Unit,
modifier: Modifier = Modifier,
) {
val navController = rememberNavController()

NavHost(
navController = navController,
startDestination = COLLECTION_ROUTE,
modifier = modifier,
) {
composable(route = COLLECTION_ROUTE) {
CollectionScreen(onNavigateBack = onNavigateBack)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.into.websoso.feature.collection

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
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.WebsosoTheme
import com.into.websoso.core.designsystem.theme.White
import com.into.websoso.feature.collection.component.CollectionAppBar
import com.into.websoso.feature.collection.component.CollectionCreateButton
import com.into.websoso.feature.collection.component.CollectionTabRow
import com.into.websoso.feature.collection.model.CollectionTab

@Composable
fun CollectionScreen(
onNavigateBack: () -> Unit,
modifier: Modifier = Modifier,
) {
var selectedTab by rememberSaveable { mutableStateOf(CollectionTab.MY_COLLECTION) }

Column(
modifier = modifier
.fillMaxSize()
.background(White)
.statusBarsPadding(),
) {
CollectionAppBar(onNavigateBack = onNavigateBack)
CollectionTabRow(
selectedTab = selectedTab,
onTabSelected = { selectedTab = it },
)
CollectionCreateButton(
modifier = Modifier.padding(
horizontal = 20.dp,
vertical = 16.dp,
),
)
}
}

@Preview(showBackground = true)
@Composable
private fun CollectionScreenPreview() {
WebsosoTheme {
CollectionScreen(onNavigateBack = {})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.into.websoso.feature.collection.component

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
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.WebsosoTheme
import com.into.websoso.core.designsystem.theme.White
import com.into.websoso.core.resource.R.drawable.ic_navigate_left

@Composable
internal fun CollectionAppBar(
onNavigateBack: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(
modifier = modifier
.fillMaxWidth()
.height(44.dp)
.background(White),
contentAlignment = Alignment.Center,
) {
IconButton(
onClick = onNavigateBack,
modifier = Modifier
.align(Alignment.CenterStart)
.padding(start = 6.dp)
.size(44.dp),
) {
Image(
painter = painterResource(id = ic_navigate_left),
contentDescription = null,
modifier = Modifier.size(24.dp),
Comment on lines +50 to +53

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate file =="
fd -a 'CollectionAppBar\.kt$' .

echo "== file excerpt =="
file=$(fd 'CollectionAppBar\.kt$' . | head -n1)
if [ -n "${file:-}" ]; then
  wc -l "$file"
  sed -n '1,120p' "$file" | cat -n
fi

echo "== accessibility contentDescription occurrences in Jetpack Compose Image usage =="
rg -n "Image\\(|contentDescription\\s*=" feature/collection/src/main/java/com/into/websoso/feature/collection/component/CollectionAppBar.kt

Repository: Team-WSS/WSS-Android

Length of output: 2963


뒤로가기 버튼에 접근성 라벨을 지정해 주세요.

IconButton 내부 이미지의 contentDescriptionnull이라 TalkBack에서 버튼의 목적을 알 수 없습니다. "뒤로 가기" 문자열 리소스를 사용해 접근성 라벨을 지정해 주세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/collection/src/main/java/com/into/websoso/feature/collection/component/CollectionAppBar.kt`
around lines 42 - 45, Update the back-navigation Image inside the
CollectionAppBar IconButton to use the existing Korean string resource for “뒤로
가기” as its contentDescription instead of null, preserving the current icon and
button behavior.

)
}
Text(
text = "컬렉션",
color = Black,
style = WebsosoTheme.typography.title2,
)
}
}

@Preview(showBackground = true)
@Composable
private fun CollectionAppBarPreview() {
WebsosoTheme {
CollectionAppBar(onNavigateBack = {})
}
}
Loading
Loading