Skip to content

Conversation

@m6z1
Copy link
Member

@m6z1 m6z1 commented Dec 27, 2025

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 프로필 아바타 추가했습니다.
  • viewPager + dots indicator 로 구현했으며, 캐릭터 선택 시 Viewpager 깜빡임을 개선하기 위해 노오력했습니다 ^^ (gemini 가)
  • 변경된 api 엔드포인트를 수정했습니다.
  • BindingAdapter s3 이미지 로딩하는 함수 만들었습니다.
  • color system 에 gray200 값 잘못되어 있길래 수정했습니다. (왜인지 잠수함 패치인 듯함 . . )

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

KakaoTalk_Video_2025-12-28-00-16-08.mp4

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

Summary by CodeRabbit

릴리스 노트

  • New Features

    • S3 기반 이미지 로딩 기능 추가
    • 아바타 프로필 이미지 지원
    • 아바타 선택 화면에 dots indicator 추가
  • UI/Style

    • 아바타 선택 인터페이스를 ViewPager로 개선
    • 프로필 편집 화면 색상 및 레이아웃 업데이트
    • 앱 전체 UI 색상 토큰 통일
  • Chores

    • 프로필 수정 관련 텍스트 리소스 업데이트

✏️ Tip: You can customize this high-level summary in your review settings.

@m6z1 m6z1 added 🍯 [FEAT] 새로운 기능을 개발합니다. 🏹 궁사 명지 웹소소 공주의 은밀한 사냥생활 labels Dec 27, 2025
@github-actions github-actions bot requested a review from s9hn December 27, 2025 15:17
@coderabbitai
Copy link

coderabbitai bot commented Dec 27, 2025

개요

API 엔드포인트 경로 업데이트, avatarId 타입 변경(Int → Long), S3 이미지 로딩 바인딩 추가, 아바타 선택 UI를 RecyclerView에서 ViewPager2로 리팩터링, 그리고 전체 앱의 색상 리소스(gray_200_AEADB3 → gray_200_949399) 통일.

변경 사항

코호트 / 파일 요약
데이터 계층 - 모델 및 매퍼
app/src/main/java/com/into/websoso/data/model/AvatarEntity.kt, app/src/main/java/com/into/websoso/data/mapper/AvatarMapper.kt
avatarId를 Int에서 Long으로 변경, 새로운 avatarProfileImage 필드 추가, AvatarResponseDto.toData()에서 매핑 적용
데이터 계층 - API 및 요청/응답
app/src/main/java/com/into/websoso/data/remote/api/AvatarApi.kt, app/src/main/java/com/into/websoso/data/remote/api/UserApi.kt, app/src/main/java/com/into/websoso/data/remote/request/UserProfileEditRequestDto.kt, app/src/main/java/com/into/websoso/data/remote/response/AvatarsResponseDto.kt
AvatarApi 엔드포인트 경로를 "avatars"에서 "avatar-profiles"로 변경, UserApi 경로를 "users/my-profile"에서 "users/profile"로 변경, UserProfileEditRequestDto avatarId 타입 Long?으로 업데이트, AvatarsResponseDto 직렬화 이름 및 필드 구조 변경
데이터 계층 - 저장소
app/src/main/java/com/into/websoso/data/repository/UserRepository.kt
saveEditingUserProfile 메서드의 avatarId 파라미터 타입을 Int?에서 Long?으로 변경
UI 계층 - 바인딩 어댑터
app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt
S3 이미지 로딩 바인딩 "loads3ImageUrl" 추가, 실패 시 기본 이미지(img_loading_thumbnail) 제공
UI 계층 - 모델
app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt, app/src/main/java/com/into/websoso/ui/profileEdit/model/ProfileEditUiModel.kt, app/src/main/java/com/into/websoso/ui/mapper/AvatarMapper.kt
AvatarModel avatarId를 Int에서 Long으로 변경, avatarThumbnail 제거 및 avatarProfile, avatarImage 추가, ProfileModel avatarId를 Long으로 변경, 매핑 로직 업데이트
UI 계층 - 프로필 편집 (아바타 선택)
app/src/main/java/com/into/websoso/ui/profileEdit/AvatarChangeBottomSheetDialog.kt, app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeAdapter.kt, app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeViewHolder.kt, app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarPagerAdapter.kt (신규), app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarSelectPageViewHolder.kt (신규)
아바타 선택 UI를 GridLayout RecyclerView에서 ViewPager2 기반 페이지 스타일로 리팩터링, AvatarPagerAdapter 신규 추가, 리스트 청킹(10개 단위) 처리
UI 계층 - 보조 클래스
app/src/main/java/com/into/websoso/ui/profileEdit/ColumnSpacingItemDecoration.kt
그리드 열 간격을 처리하는 새로운 RecyclerView.ItemDecoration 클래스 추가
UI 계층 - ViewModel
app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditViewModel.kt
아바타 페치 시 대표 아바타 계산 및 avatarProfile 매핑 로직 추가
UI 계층 - 삭제
app/src/main/java/com/into/websoso/ui/profileEdit/model/Avatar.kt
아바타 애니메이션 열거형 및 관련 확장 함수 삭제
UI 계층 - 기타 액티비티/프래그먼트
app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt, app/src/main/java/com/into/websoso/ui/detailExplore/DetailExploreDialogBottomSheet.kt, app/src/main/java/com/into/websoso/ui/detailExploreResult/DetailExploreResultDialogBottomSheet.kt, app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailCommentViewHolder.kt, app/src/main/java/com/into/websoso/ui/onboarding/second/OnboardingSecondFragment.kt, app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditActivity.kt
색상 리소스 업데이트(gray_200_AEADB3 → gray_200_949399) 적용
리소스 - 레이아웃
app/src/main/res/layout/dialog_avatar_change.xml
LottieAnimationView에서 ImageView로 변경, RecyclerView 대신 ViewPager2 및 DotsIndicator 추가, 마진 및 텍스트 스타일 조정, 새로운 "확인" 버튼 추가
리소스 - 색상
app/src/main/res/values/colors.xml
gray_200_AEADB3(#AEADB3) 제거 및 gray_200_949399(#949399) 추가
리소스 - 색상 셀렉터 (다수)
app/src/main/res/color/bg_*.xml, app/src/main/res/drawable/selector_*.xml
색상 리소스를 gray_200_949399로 통일(약 10개 파일)
리소스 - 레이아웃 파일 (다수)
app/src/main/res/layout/*.xml (약 50개 파일)
텍스트 색상, 힌트 색상, tint 속성 등을 gray_200_949399로 업데이트
리소스 - 아이템 레이아웃
app/src/main/res/layout/item_avatar_page.xml (신규), app/src/main/res/layout/item_profile_edit_avatar.xml
ViewPager2 페이지 기반 아바타 그리드 레이아웃 추가, 기존 아바타 항목 크기 조정 및 이미지 소스 변경(avatarThumbnail → avatarProfile)
리소스 - 기타
core/resource/src/main/res/values/strings.xml, app/src/main/res/drawable/bg_primary_100_radius_12dp.xml
프로필 편집 아바타 문자열 업데이트("대표 캐릭터 설정하기" → "확인", "원래대로 유지하기" → "취소"), border radius 14dp → 12dp 조정

예상 코드 리뷰 노력

🎯 4 (Complex) | ⏱️ ~50분

관련 가능성 있는 PR

  • #709: BindingAdapter에서 새로운 loads3ImageUrl 바인딩 추가 및 기존 loadImageWithOptions 동작 변경 등 동일 클래스 수정으로 코드 레벨 관련성 있음.

제안 라벨

🍯 [FEAT], ♻️ [REFACTOR], 🏹 궁사 명지

제안 리뷰어

  • yeonjeen
  • junseo511
  • s9hn

🐰 프로필 아바타가 새로 생겼어,
S3에서 이미지를 예쁘게 불러와,
ViewPager로 슥슥 넘기고,
색감도 맞춰져서 반짝반짝,
우리의 프로필은 더욱 매력적이네! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 '프로필 아바타 추가'로 주요 변경사항인 프로필 아바타 기능 추가를 명확하게 반영하고 있습니다.
Description check ✅ Passed PR 설명은 제공된 템플릿의 모든 필수 섹션(Issues, Work Description, Screenshot, To Reviewers)을 포함하고 있으며, 변경사항을 구체적으로 기술하고 있습니다.
Linked Issues check ✅ Passed PR의 모든 주요 변경사항이 이슈 #771의 프로필 아바타 추가 요구사항과 일치합니다. ViewPager + DotsIndicator 구현, API 엔드포인트 수정, S3 이미지 로딩 지원, 색상 시스템 수정이 모두 포함되어 있습니다.
Out of Scope Changes check ✅ Passed 범위 내 변경사항들입니다. 색상 리소스(gray_200) 변경, 문자열 리소스 변경, 레이아웃 업데이트 등 모두 아바타 기능 추가와 관련된 필요한 변경사항입니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/771

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🧹 Nitpick comments (4)
app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt (1)

14-25: S3 이미지 로딩을 위한 방어적 코드 추가 권장

새로운 loads3ImageUrl BindingAdapter가 잘 구현되었지만, 몇 가지 개선사항을 고려해보세요:

  1. 빈 문자열 처리: s3ImageKey가 비어있거나 null인 경우 처리 로직이 없습니다.
  2. 로딩 플레이스홀더: 이미지 로딩 중 표시할 placeholder가 없어 사용자 경험이 저하될 수 있습니다.
🔎 제안하는 개선 코드
 @JvmStatic
 @BindingAdapter("loads3ImageUrl")
 fun loadS3ImageUrl(
     view: ImageView,
-    s3ImageKey: String,
+    s3ImageKey: String?,
 ) {
+    if (s3ImageKey.isNullOrBlank()) {
+        view.setImageResource(img_loading_thumbnail)
+        return
+    }
+
     val fullUrl: String = view.getS3ImageUrl(s3ImageKey)
 
     view.load(fullUrl) {
+        placeholder(img_loading_thumbnail)
         error(img_loading_thumbnail)
     }
 }
app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarSelectPageViewHolder.kt (1)

15-38: 어댑터 재사용과 깜빡임 방지 로직이 잘 구현되었습니다.

ViewHolder 내부에서 어댑터를 재사용하는 패턴이 올바르게 구현되었고, itemAnimator = null 설정으로 ViewPager 깜빡임 문제를 해결한 점이 좋습니다. itemDecorationCount 체크로 중복 추가도 방지하고 있습니다.

🔎 선택적 개선: 매직 넘버를 상수로 추출

가독성을 위해 하드코딩된 값들을 companion object의 상수로 추출하는 것을 고려해보세요:

+    companion object {
+        private const val GRID_SPAN_COUNT = 2
+        private const val COLUMN_SPACING_DP = 12
+
         fun of(
             parent: ViewGroup,
             onAvatarClick: (avatar: AvatarModel) -> Unit,
         ): AvatarSelectPageViewHolder {
                 binding.rvAvatarPage.layoutManager = GridLayoutManager(
                     binding.root.context,
-                    2,
+                    GRID_SPAN_COUNT,
                     GridLayoutManager.HORIZONTAL,
                     false,
                 )
                     binding.rvAvatarPage.addItemDecoration(
                         ColumnSpacingItemDecoration(
-                            2,
-                            12,
+                            GRID_SPAN_COUNT,
+                            COLUMN_SPACING_DP,
                         ),
                     )
app/src/main/java/com/into/websoso/data/remote/response/AvatarsResponseDto.kt (1)

8-9: API 스키마 업데이트가 정확히 반영되었습니다.

서버 API의 필드명 변경사항이 올바르게 적용되었습니다.

💡 선택적 개선: 변수명과 SerialName 일관성

SerialName이 avatarProfiles로 변경되었는데 변수명은 여전히 avatars입니다. 일관성을 위해 변수명도 변경하는 것을 고려해보세요:

     @SerialName("avatarProfiles")
-    val avatars: List<AvatarResponseDto>,
+    val avatarProfiles: List<AvatarResponseDto>,

단, 이 변경은 해당 DTO를 사용하는 다른 코드에도 영향을 미칩니다.

app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarPagerAdapter.kt (1)

37-45: 아이템 비교 로직이 적절히 구현되었습니다.

첫 번째 아바타의 ID로 페이지를 식별하는 방식이 합리적입니다. 빈 리스트의 경우 참조 비교를 사용하고 있는데, ViewPager 사용 패턴상 빈 페이지가 생성되지 않을 것으로 예상되어 실질적인 문제는 없어 보입니다.

💡 선택적 개선: 빈 리스트 처리 명시화

더 명확한 의도 표현을 위해 빈 리스트 케이스를 명시적으로 처리하는 것을 고려해보세요:

             override fun areItemsTheSame(
                 oldItem: List<AvatarModel>,
                 newItem: List<AvatarModel>,
             ): Boolean =
-                if (oldItem.isNotEmpty() && newItem.isNotEmpty()) {
+                when {
+                    oldItem.isEmpty() && newItem.isEmpty() -> true
+                    oldItem.isEmpty() || newItem.isEmpty() -> false
+                    else ->
                     oldItem.first().avatarId == newItem.first().avatarId
-                } else {
-                    oldItem === newItem
                 }
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f3bc40e and c6852aa.

📒 Files selected for processing (87)
  • app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt
  • app/src/main/java/com/into/websoso/data/mapper/AvatarMapper.kt
  • app/src/main/java/com/into/websoso/data/model/AvatarEntity.kt
  • app/src/main/java/com/into/websoso/data/remote/api/AvatarApi.kt
  • app/src/main/java/com/into/websoso/data/remote/api/UserApi.kt
  • app/src/main/java/com/into/websoso/data/remote/request/UserProfileEditRequestDto.kt
  • app/src/main/java/com/into/websoso/data/remote/response/AvatarsResponseDto.kt
  • app/src/main/java/com/into/websoso/data/repository/UserRepository.kt
  • app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt
  • app/src/main/java/com/into/websoso/ui/detailExplore/DetailExploreDialogBottomSheet.kt
  • app/src/main/java/com/into/websoso/ui/detailExploreResult/DetailExploreResultDialogBottomSheet.kt
  • app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailCommentViewHolder.kt
  • app/src/main/java/com/into/websoso/ui/mapper/AvatarMapper.kt
  • app/src/main/java/com/into/websoso/ui/onboarding/second/OnboardingSecondFragment.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/AvatarChangeBottomSheetDialog.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/ColumnSpacingItemDecoration.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditActivity.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditViewModel.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeAdapter.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeViewHolder.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarPagerAdapter.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarSelectPageViewHolder.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/model/Avatar.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt
  • app/src/main/java/com/into/websoso/ui/profileEdit/model/ProfileEditUiModel.kt
  • app/src/main/res/color/bg_main_bottom_nav_item_selector.xml
  • app/src/main/res/color/bg_novel_detail_rating_read_status_selector.xml
  • app/src/main/res/color/bg_novel_info_read_status_graph_text_selector.xml
  • app/src/main/res/color/bg_novel_rating_chip_text_selector.xml
  • app/src/main/res/color/bg_profile_disclosure_text_selector.xml
  • app/src/main/res/color/bg_profile_edit_chip_text_selector.xml
  • app/src/main/res/color/bg_rating_date_text_selector.xml
  • app/src/main/res/drawable/bg_primary_100_radius_12dp.xml
  • app/src/main/res/drawable/selector_onboarding_first_duplication_check_button_text_color.xml
  • app/src/main/res/layout/activity_account_info.xml
  • app/src/main/res/layout/activity_blocked_users.xml
  • app/src/main/res/layout/activity_create_feed.xml
  • app/src/main/res/layout/activity_detail_explore_result.xml
  • app/src/main/res/layout/activity_feed_detail.xml
  • app/src/main/res/layout/activity_normal_explore.xml
  • app/src/main/res/layout/activity_notification_setting.xml
  • app/src/main/res/layout/activity_novel_detail.xml
  • app/src/main/res/layout/activity_novel_rating.xml
  • app/src/main/res/layout/activity_other_user_page.xml
  • app/src/main/res/layout/activity_profile_edit.xml
  • app/src/main/res/layout/activity_withdraw_first.xml
  • app/src/main/res/layout/activity_withdraw_second.xml
  • app/src/main/res/layout/dialog_avatar_change.xml
  • app/src/main/res/layout/dialog_create_feed_search_novel.xml
  • app/src/main/res/layout/dialog_detail_explore.xml
  • app/src/main/res/layout/dialog_login_request.xml
  • app/src/main/res/layout/dialog_novel_rating_keyword.xml
  • app/src/main/res/layout/dialog_terms_agreement.xml
  • app/src/main/res/layout/fragment_detail_explore_keyword.xml
  • app/src/main/res/layout/fragment_detail_explore_result_keyword.xml
  • app/src/main/res/layout/fragment_explore.xml
  • app/src/main/res/layout/fragment_feed.xml
  • app/src/main/res/layout/fragment_home.xml
  • app/src/main/res/layout/fragment_my_activity.xml
  • app/src/main/res/layout/fragment_my_library.xml
  • app/src/main/res/layout/fragment_my_page.xml
  • app/src/main/res/layout/fragment_novel_feed.xml
  • app/src/main/res/layout/fragment_novel_info.xml
  • app/src/main/res/layout/fragment_onboarding_first.xml
  • app/src/main/res/layout/fragment_onboarding_second.xml
  • app/src/main/res/layout/fragment_onboarding_third.xml
  • app/src/main/res/layout/fragment_other_user_activity.xml
  • app/src/main/res/layout/fragment_other_user_library.xml
  • app/src/main/res/layout/item_avatar_page.xml
  • app/src/main/res/layout/item_detail_explore_result.xml
  • app/src/main/res/layout/item_detail_explore_result_header.xml
  • app/src/main/res/layout/item_feed.xml
  • app/src/main/res/layout/item_feed_detail_comment.xml
  • app/src/main/res/layout/item_feed_detail_header.xml
  • app/src/main/res/layout/item_feed_no_more.xml
  • app/src/main/res/layout/item_my_activity.xml
  • app/src/main/res/layout/item_normal_explore.xml
  • app/src/main/res/layout/item_normal_explore_header.xml
  • app/src/main/res/layout/item_popular_feed_slot.xml
  • app/src/main/res/layout/item_profile_edit_avatar.xml
  • app/src/main/res/layout/item_recommended_novel_by_user_taste.xml
  • app/src/main/res/layout/item_rest_genre.xml
  • app/src/main/res/layout/item_search_novel.xml
  • app/src/main/res/layout/layout_loading.xml
  • app/src/main/res/layout/layout_search.xml
  • app/src/main/res/values/colors.xml
  • core/resource/src/main/res/values/strings.xml
💤 Files with no reviewable changes (1)
  • app/src/main/java/com/into/websoso/ui/profileEdit/model/Avatar.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-09T09:44:15.264Z
Learnt from: s9hn
Repo: Team-WSS/WSS-Android PR: 705
File: feature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.kt:65-68
Timestamp: 2025-08-09T09:44:15.264Z
Learning: In the LibraryScreen.kt file, the bottom sheet configuration with `rememberModalBottomSheetState(skipPartiallyExpanded = true, confirmValueChange = { false })` works correctly and does not prevent the bottom sheet from opening or closing, despite `confirmValueChange` returning false.

Applied to files:

  • app/src/main/java/com/into/websoso/ui/profileEdit/AvatarChangeBottomSheetDialog.kt
🧬 Code graph analysis (1)
app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt (1)
app/src/main/java/com/into/websoso/core/common/ui/custom/WebsosoSearchEditText.kt (1)
  • setWebsosoSearchHintTextColor (147-149)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (92)
app/src/main/java/com/into/websoso/ui/detailExploreResult/DetailExploreResultDialogBottomSheet.kt (1)

98-98: 색상 시스템 업데이트가 올바르게 적용되었습니다.

PR 목표에 명시된 대로 gray200 색상 값 수정이 정확히 반영되었으며, 선택되지 않은 탭 버튼의 기본 색상이 업데이트된 색상 시스템과 일관되게 변경되었습니다.

app/src/main/res/drawable/bg_primary_100_radius_12dp.xml (1)

4-4: LGTM! 코너 반경 표준화

12dp로 통일하는 것은 디자인 시스템 일관성을 위한 적절한 변경입니다.

app/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.kt (1)

20-20: LGTM! 색상 리소스 업데이트

전체 프로젝트의 색상 시스템 업데이트와 일관되게 적용되었습니다.

Also applies to: 84-84

app/src/main/res/layout/fragment_explore.xml (1)

54-54: LGTM! 색상 리소스 일관성 유지

모든 TextView의 색상이 새로운 gray_200_949399로 일관되게 업데이트되었습니다.

Also applies to: 101-101, 210-210

app/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailCommentViewHolder.kt (1)

9-9: LGTM! 차단/숨김 댓글 색상 업데이트

차단된 유저 및 숨김 처리된 댓글의 색상이 새로운 디자인 시스템에 맞게 업데이트되었습니다.

Also applies to: 40-40, 47-47

app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeViewHolder.kt (1)

18-25: LGTM! 아바타 이미지 로딩 개선

변경사항이 적절합니다:

  • avatarProfile 필드로 전환하여 새로운 아바타 모델 구조와 일치
  • executePendingBindings() 추가로 즉시 UI 업데이트 보장
  • 불필요한 메서드 제거는 ViewPager 기반 UI로의 리팩터링과 일치
app/src/main/java/com/into/websoso/data/remote/api/UserApi.kt (1)

71-71: 엔드포인트 클레임 재검토 필요

현재 코드에서 patchProfile 메서드는 이미 @PATCH("users/profile") 엔드포인트를 사용하고 있습니다. users/my-profile은 GET 엔드포인트(getMyProfile())로만 존재하므로 PATCH 엔드포인트의 변경 주장은 근거가 없습니다. 또한 avatarId는 이미 Long? 타입으로 설정되어 있어 타입 변경 내역도 확인되지 않습니다.

Likely an incorrect or invalid review comment.

app/src/main/java/com/into/websoso/ui/profileEdit/AvatarChangeBottomSheetDialog.kt (3)

17-19: LGTM! 어댑터 초기화 로직이 올바릅니다.

AvatarPagerAdapter를 lazy 초기화하여 필요할 때만 생성하는 패턴이 적절합니다.


50-60: ViewPager 깜빡임 개선 로직이 잘 구현되었습니다.

현재 페이지를 보존하고 애니메이션 없이 설정하는 방식으로 깜빡임 문제를 해결했습니다. submitList의 콜백에서 setCurrentItem을 호출하여 리스트 제출 완료 후 페이지를 복원하는 것이 적절합니다.


63-70: LGTM! ViewPager 설정이 적절합니다.

offscreenPageLimit = 1 설정으로 인접 페이지를 메모리에 유지하여 스크롤 성능을 최적화했고, dots indicator를 통해 사용자에게 현재 페이지를 명확히 표시합니다.

app/src/main/res/layout/fragment_detail_explore_result_keyword.xml (1)

179-179: LGTM! 색상 리소스 업데이트가 일관되게 적용되었습니다.

gray_200 색상값을 새로운 디자인 시스템에 맞게 업데이트한 변경사항입니다.

app/src/main/res/layout/layout_search.xml (1)

19-19: LGTM! 검색창 힌트 색상이 새로운 디자인 시스템에 맞게 업데이트되었습니다.

app/src/main/res/color/bg_novel_rating_chip_text_selector.xml (1)

4-4: LGTM! 칩 텍스트 셀렉터의 색상이 올바르게 업데이트되었습니다.

app/src/main/res/layout/fragment_my_page.xml (1)

94-94: LGTM! 사용자 소개 텍스트 색상이 새로운 디자인 시스템에 맞게 업데이트되었습니다.

app/src/main/res/layout/fragment_onboarding_second.xml (1)

35-35: LGTM! 온보딩 화면의 힌트 텍스트 색상이 일관되게 업데이트되었습니다.

비밀 정보 안내 텍스트와 생년 입력 힌트의 색상이 새로운 디자인 시스템에 맞게 변경되었습니다.

Also applies to: 111-111

app/src/main/res/layout/fragment_feed.xml (1)

42-42: LGTM! 피드 없음 안내 텍스트 색상이 새로운 디자인 시스템에 맞게 업데이트되었습니다.

app/src/main/res/color/bg_novel_info_read_status_graph_text_selector.xml (1)

5-5: LGTM! 독서 상태 그래프 텍스트 셀렉터의 색상이 올바르게 업데이트되었습니다.

app/src/main/res/layout/fragment_other_user_activity.xml (1)

31-31: LGTM! 색상 리소스 업데이트가 올바르게 적용되었습니다.

gray_200 색상 값 수정이 PR 목표에 맞게 정확히 반영되었습니다.

app/src/main/res/layout/activity_normal_explore.xml (1)

169-169: LGTM! 색상 시스템 업데이트가 일관되게 적용되었습니다.

app/src/main/res/layout/fragment_detail_explore_keyword.xml (1)

180-180: LGTM! 색상 업데이트가 정확합니다.

app/src/main/res/layout/activity_withdraw_first.xml (1)

53-53: LGTM! 색상 리소스가 올바르게 업데이트되었습니다.

app/src/main/res/layout/activity_notification_setting.xml (1)

73-73: LGTM! 색상 변경이 정확합니다.

app/src/main/res/layout/layout_loading.xml (1)

47-47: LGTM! 색상 시스템 업데이트가 올바릅니다.

app/src/main/res/layout/item_feed_detail_comment.xml (1)

84-84: LGTM! 색상 업데이트가 정확하게 적용되었습니다.

app/src/main/res/layout/item_rest_genre.xml (1)

47-47: gray200 색상 업데이트 확인 완료

텍스트 색상이 새로운 gray_200_949399로 올바르게 업데이트되었습니다.

app/src/main/res/layout/activity_blocked_users.xml (1)

84-84: 색상 리소스 변경 적용 확인

차단된 사용자 없음 메시지의 텍스트 색상이 올바르게 업데이트되었습니다.

app/src/main/res/layout/activity_other_user_page.xml (1)

81-81: 사용자 프로필 색상 업데이트 확인

사용자 소개(Line 81)와 비공개 메시지(Line 216)의 텍스트 색상이 새로운 gray_200_949399로 일관되게 적용되었습니다.

Also applies to: 216-216

app/src/main/res/layout/fragment_novel_info.xml (1)

405-405: 리뷰 없음 상태 색상 업데이트 완료

리뷰가 없을 때 표시되는 메시지의 색상이 올바르게 적용되었습니다.

app/src/main/res/layout/fragment_home.xml (1)

150-150: 홈 화면 전체 색상 시스템 업데이트 확인

관심 피드, 추천 작품 등 홈 화면의 모든 설명 텍스트 색상이 새로운 gray_200_949399로 일관되게 적용되었습니다.

Also applies to: 187-187, 228-228, 261-261, 301-301

app/src/main/res/color/bg_profile_disclosure_text_selector.xml (1)

3-3: 프로필 공개 설정 색상 셀렉터 업데이트 완료

비활성 상태의 텍스트 색상이 새로운 gray_200_949399로 올바르게 적용되었습니다.

app/src/main/res/color/bg_rating_date_text_selector.xml (1)

5-5: 평가 날짜 색상 셀렉터 업데이트 확인

선택되지 않은 상태의 텍스트 색상이 새로운 gray_200_949399로 적용되었습니다.

app/src/main/res/layout/activity_account_info.xml (1)

111-111: 회색 컬러 마이그레이션 완료

이메일 텍스트의 색상이 gray_200_949399로 올바르게 업데이트되었으며, 코드베이스 전체에서 이전 색상 참조(gray_200_AEADB3)가 모두 제거되어 마이그레이션이 완전히 완료되었습니다.

app/src/main/res/layout/activity_feed_detail.xml (1)

116-116: 색상 리소스 업데이트 확인됨.

EditText 힌트 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/res/layout/dialog_novel_rating_keyword.xml (1)

171-171: 색상 리소스 업데이트 확인됨.

빈 상태 텍스트 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/res/layout/item_feed_no_more.xml (1)

27-27: 색상 리소스 업데이트 확인됨.

콘텐츠 텍스트 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/java/com/into/websoso/ui/detailExplore/DetailExploreDialogBottomSheet.kt (1)

103-103: 색상 리소스 업데이트 확인됨.

기본 버튼 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/res/layout/item_search_novel.xml (1)

64-64: 색상 리소스 업데이트 확인됨.

작가명 텍스트 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/res/layout/dialog_detail_explore.xml (1)

39-39: 색상 리소스 업데이트 확인됨.

키워드 버튼 텍스트 색상이 새로운 gray_200_949399 리소스로 올바르게 업데이트되었습니다.

app/src/main/res/layout/item_detail_explore_result_header.xml (1)

56-56: 색상 리소스 업데이트 확인됨.

문의 버튼 텍스트와 하단 구분선 색상이 새로운 gray_200_949399 리소스로 일관되게 업데이트되었습니다.

Also applies to: 65-65

app/src/main/res/layout/item_normal_explore_header.xml (1)

57-57: 색상 리소스 업데이트 확인 완료

회색 계열 색상이 일관되게 업데이트되었습니다. 텍스트와 밑줄에 동일한 색상이 적용되어 시각적 일관성이 유지됩니다.

Also applies to: 65-65

app/src/main/res/layout/fragment_my_activity.xml (1)

31-31: 색상 업데이트 적용 확인

빈 상태 메시지의 색상이 새로운 디자인 시스템에 맞게 업데이트되었습니다.

app/src/main/res/layout/fragment_onboarding_first.xml (1)

41-41: 힌트 텍스트 색상 일관성 확인

닉네임 입력 관련 힌트 텍스트들의 색상이 통일되게 업데이트되었습니다.

Also applies to: 66-66

app/src/main/res/layout/item_feed_detail_header.xml (1)

84-84: 피드 메타데이터 색상 통일

수정 표시, 좋아요 수, 댓글 수 등 부가 정보의 색상이 일관되게 적용되었습니다.

Also applies to: 227-227, 265-265

app/src/main/res/layout/dialog_create_feed_search_novel.xml (1)

47-47: 다이얼로그 보조 텍스트 색상 업데이트 확인

설명 텍스트와 검색 결과 없음 메시지의 색상이 새로운 색상 시스템에 맞게 변경되었습니다.

Also applies to: 111-111

app/src/main/res/color/bg_novel_detail_rating_read_status_selector.xml (1)

5-5: 셀렉터 색상 업데이트 확인

비활성 상태의 색상이 새로운 회색 계열로 올바르게 업데이트되었습니다.

app/src/main/res/layout/item_detail_explore_result.xml (1)

55-55: 소설 정보 색상 일관성 유지

관심 수, 평점, 작가명 등 소설 메타데이터의 색상이 통일되게 적용되었습니다.

Also applies to: 79-79, 107-107

app/src/main/res/layout/item_normal_explore.xml (1)

73-73: 탐색 결과 아이템 색상 업데이트 완료

일반 탐색 화면의 소설 메타데이터 색상이 다른 탐색 화면들과 일관되게 업데이트되었습니다.

Also applies to: 100-100, 116-116

app/src/main/res/layout/fragment_novel_feed.xml (1)

73-73: LGTM! 색상 리소스 업데이트가 올바르게 적용되었습니다.

gray200 색상 값 수정이 일관되게 반영되어 UI의 시각적 일관성이 개선되었습니다.

core/resource/src/main/res/values/strings.xml (1)

348-349: LGTM! 버튼 텍스트가 더 간결하고 직관적으로 개선되었습니다.

"확인"/"취소"는 표준적인 다이얼로그 버튼 패턴으로 사용자 경험이 향상됩니다.

app/src/main/res/layout/item_recommended_novel_by_user_taste.xml (1)

53-53: LGTM! 색상 업데이트가 일관되게 적용되었습니다.

추천 작품 아이템의 모든 보조 텍스트(관심 수, 평점, 작가명)에 통일된 gray200 색상이 적용되어 시각적 일관성이 확보되었습니다.

Also applies to: 77-77, 103-103

app/src/main/res/layout/activity_profile_edit.xml (1)

173-173: LGTM! 프로필 편집 화면의 색상 테마가 일관되게 업데이트되었습니다.

중복확인 버튼, 입력 힌트, 설명 텍스트 등 모든 보조 UI 요소에 통일된 색상이 적용되어 시각적 일관성이 향상되었습니다.

Also applies to: 249-249, 295-295

app/src/main/res/layout/item_popular_feed_slot.xml (1)

63-63: LGTM! 피드 상호작용 지표의 색상이 일관되게 업데이트되었습니다.

좋아요 수와 댓글 수 텍스트에 통일된 색상이 적용되어 UI 일관성이 개선되었습니다.

Also applies to: 86-86

app/src/main/res/layout/dialog_login_request.xml (1)

46-46: LGTM! 다이얼로그 버튼 색상이 올바르게 업데이트되었습니다.

닫기 버튼에 일관된 gray200 색상이 적용되어 다른 다이얼로그 UI와 통일성을 유지합니다.

app/src/main/res/layout/fragment_onboarding_third.xml (1)

36-36: LGTM! 온보딩 화면의 색상이 일관되게 업데이트되었습니다.

장르 추천 설명 텍스트에 통일된 색상이 적용되어 온보딩 경험의 시각적 일관성이 확보되었습니다.

app/src/main/res/color/bg_profile_edit_chip_text_selector.xml (1)

4-4: LGTM! 칩 텍스트 색상 selector가 올바르게 업데이트되었습니다.

선택되지 않은 칩의 텍스트 색상이 새로운 gray200 값으로 통일되어 프로필 편집 UI의 일관성이 유지됩니다.

app/src/main/res/layout/fragment_other_user_library.xml (1)

239-239: 색상 시스템 업데이트가 정확하게 적용되었습니다.

gray_200 색상 값 수정이 일관되게 적용되어 UI 텍스트 색상이 통일되었습니다.

Also applies to: 312-312, 348-348, 384-384, 505-505

app/src/main/res/layout/activity_novel_rating.xml (1)

105-105: 색상 시스템 업데이트가 정확하게 적용되었습니다.

날짜 표시, 키워드 버튼, 뒤로가기 아이콘의 색상이 새로운 gray_200_949399 값으로 일관되게 업데이트되었습니다.

Also applies to: 202-202, 265-265

app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditActivity.kt (1)

18-18: 색상 시스템 업데이트가 정확하게 적용되었습니다.

중복 확인 버튼의 비활성화 상태 색상이 새로운 gray_200_949399 값으로 업데이트되었습니다.

Also applies to: 112-112

app/src/main/res/layout/item_avatar_page.xml (1)

1-21: 아바타 페이지 레이아웃이 적절하게 구현되었습니다.

5열 그리드 레이아웃과 적절한 마진 설정으로 아바타 선택 UI가 잘 구성되었습니다. ViewPager와 함께 사용하기에 적합한 구조입니다.

app/src/main/res/layout/activity_detail_explore_result.xml (1)

49-49: 색상 시스템 업데이트가 정확하게 적용되었습니다.

필터 텍스트와 검색 결과 없음 메시지의 색상이 일관되게 업데이트되었습니다.

Also applies to: 61-61, 129-129

app/src/main/res/layout/activity_novel_detail.xml (1)

305-305: 색상 시스템 업데이트가 정확하게 적용되었습니다.

탭 레이아웃의 비선택 상태 텍스트 색상과 날짜 네비게이션 아이콘의 색상이 새로운 gray_200_949399 값으로 업데이트되었습니다.

Also applies to: 583-583

app/src/main/res/layout/item_feed.xml (1)

78-78: 색상 시스템 업데이트가 정확하게 적용되었습니다.

피드 아이템의 수정 표시, 좋아요/댓글 카운트, 비공개 레이블 색상이 일관되게 업데이트되었습니다.

Also applies to: 270-270, 309-309, 335-335, 343-343

app/src/main/java/com/into/websoso/ui/onboarding/second/OnboardingSecondFragment.kt (1)

8-8: 색상 시스템 업데이트가 정확하게 적용되었습니다.

출생연도 미입력 상태의 플레이스홀더 텍스트 색상이 새로운 gray_200_949399 값으로 업데이트되었습니다.

Also applies to: 56-56

app/src/main/res/color/bg_main_bottom_nav_item_selector.xml (1)

4-4: 색상 시스템 업데이트 확인

gray_200 색상 리소스가 일관성 있게 업데이트되었습니다.

app/src/main/res/drawable/selector_onboarding_first_duplication_check_button_text_color.xml (1)

4-4: 색상 업데이트 적용 확인

gray_200 색상이 일관되게 업데이트되었습니다.

app/src/main/res/layout/activity_withdraw_second.xml (1)

259-259: 색상 리소스 일괄 업데이트 확인

여러 UI 요소에서 gray_200 색상 리소스가 일관성 있게 업데이트되었습니다.

Also applies to: 283-283, 329-329, 367-367, 405-405

app/src/main/java/com/into/websoso/data/model/AvatarEntity.kt (2)

4-4: avatarId 타입 변경 확인

avatarId 타입이 Int에서 Long으로 일관성 있게 변경되었습니다.


7-7: avatarProfileImage 필드 검증 완료

avatarProfileImage 필드가 정상적으로 구현되었습니다. API 응답 DTO에서 올바른 @SerialName 주석과 함께 정의되어 있으며, 데이터 매퍼와 UI 매퍼에서도 올바르게 매핑되고 있습니다.

app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditViewModel.kt (2)

240-244: 대표 아바타 초기화 로직 개선

대표 아바타를 찾아서 selectedAvatar로 설정하는 로직이 추가되었습니다. null 안전성을 위해 기본 AvatarModel()로 폴백하는 것이 적절합니다.


249-249: 필드 매핑 관계 확인됨 - 추가 조치 불필요

이는 필드명 변경이 아니라 두 개의 서로 다른 모델 간의 올바른 필드 매핑입니다. AvatarModel의 avatarProfile 필드에서 ProfileModel의 avatarThumbnail 필드로 값을 매핑하는 것으로, 모두 올바르게 정의되어 있습니다.

Likely an incorrect or invalid review comment.

app/src/main/java/com/into/websoso/data/mapper/AvatarMapper.kt (1)

11-11: avatarProfileImage 매핑이 올바르게 구현되었습니다

AvatarResponseDto에 avatarProfileImage 필드가 정의되어 있으며, AvatarMapper.kt에서 올바르게 매핑되었습니다. 매핑 로직은 완전하고 정확합니다.

app/src/main/java/com/into/websoso/ui/profileEdit/model/ProfileEditUiModel.kt (1)

10-10: avatarId 타입 변경이 일관성 있게 적용되었습니다

avatarId의 타입이 Int에서 Long으로 변경되었으며, 이 변경이 관련된 모든 모델과 메서드 시그니처에 일관성 있게 적용되었습니다:

  • ProfileModel.avatarId: Long
  • AvatarModel.avatarId: Long
  • UserRepository.saveEditingUserProfile(avatarId: Long?, ...)

모든 타입 비교와 할당이 일치하며, 남아있는 Int 선언이 없습니다.

app/src/main/java/com/into/websoso/data/remote/request/UserProfileEditRequestDto.kt (1)

9-9: 백엔드 API는 이미 Long 타입을 지원 중 - 추가 검증 불필요

avatarId가 Long? 타입을 사용하는 것은 적절합니다. 백엔드 응답 DTO(AvatarsResponseDto)가 이미 avatarId를 Long으로 정의하고 있으며, 클라이언트 전체 레이어(AvatarEntity, AvatarModel, ProfileEditUiModel 등)도 일관되게 Long 타입을 사용하고 있습니다. 이는 백엔드 API가 이미 Long 타입을 올바르게 처리하고 있음을 의미합니다.

app/src/main/java/com/into/websoso/data/remote/api/AvatarApi.kt (1)

7-7: 백엔드 API 엔드포인트 변경 확인이 필요합니다.

API 경로가 "avatars"에서 "avatar-profiles"로 변경되었습니다. 백엔드에서 이 새로운 엔드포인트를 지원하는지, 그리고 이전 엔드포인트가 deprecated되었는지 확인해주세요.

app/src/main/res/layout/fragment_my_library.xml (1)

238-238: LGTM!

색상 시스템 업데이트가 일관되게 적용되었습니다. gray_200_949399로의 전환이 올바르게 반영되어 있습니다.

Also applies to: 311-311, 347-347, 383-383, 504-504

app/src/main/res/layout/item_profile_edit_avatar.xml (3)

22-25: LGTM!

레이아웃 크기 조정과 하단 여백 추가가 적절합니다.


28-29: LGTM!

선택 표시용 View의 크기가 외부 ConstraintLayout과 일치하도록 조정되었습니다.


40-47: avatarProfile 속성이 올바르게 정의되어 있고 데이터 바인딩이 정상적으로 작동합니다.

AvatarModel에서 avatarProfile 속성이 문자열 타입으로 올바르게 정의되어 있으며, item_profile_edit_avatar.xml@{avatar.avatarProfile} 바인딩 참조가 정확합니다. 이미지 URL 매핑도 제대로 구성되어 있습니다.

app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeAdapter.kt (2)

16-21: LGTM!

조건부 분기를 제거하고 단순화한 바인딩 로직이 더 명확하고 유지보수하기 쉽습니다.


30-35: LGTM!

DiffUtil의 내용 비교를 명시적인 필드 비교로 변경한 것이 적절합니다. avatarIdisRepresentative 필드만 비교하여 불필요한 리바인딩을 방지할 수 있습니다.

app/src/main/res/layout/dialog_terms_agreement.xml (1)

30-30: LGTM!

색상 시스템 업데이트가 약관 동의 다이얼로그에 일관되게 적용되었습니다.

Also applies to: 96-96, 129-129, 162-162

app/src/main/res/layout/item_my_activity.xml (1)

95-95: LGTM!

활동 아이템의 색상 업데이트가 올바르게 적용되었습니다. 수정 표시, 좋아요/댓글 수, 비공개 표시 등에 새로운 gray 색상이 일관되게 사용되고 있습니다.

Also applies to: 255-255, 294-294, 320-320, 328-328

app/src/main/res/values/colors.xml (1)

17-17: 색상 리소스 마이그레이션이 완료되었습니다.

gray_200_AEADB3에 대한 참조가 코드베이스 전체에서 모두 제거되었으며, 모든 사용 지점에서 gray_200_949399로 업데이트되었음을 확인했습니다. 변경사항은 다음 6개 파일에 반영되어 있습니다:

  • OnboardingSecondFragment.kt
  • ProfileEditActivity.kt
  • FeedDetailCommentViewHolder.kt
  • DetailExploreResultDialogBottomSheet.kt
  • DetailExploreDialogBottomSheet.kt
  • CreateFeedActivity.kt
app/src/main/java/com/into/websoso/data/repository/UserRepository.kt (1)

94-101: avatarId 타입 변경이 올바르게 적용되었습니다.

saveEditingUserProfile 호출 시점에서 avatarIdProfileModel.avatarId (Long 타입)와 compareAndReturnNewOrNullValue() 함수를 통해 Long? 타입으로 전달되므로 함수 서명과 일치합니다.

백엔드 API가 Long 타입의 avatarId를 지원하는지는 별도로 확인 필요합니다.

app/src/main/res/layout/activity_create_feed.xml (1)

151-151: 색상 시스템 업데이트가 올바르게 적용되었습니다.

gray_200 색상 리소스 이름과 값이 일관되게 업데이트되었습니다. 텍스트 힌트와 보조 텍스트 색상에 새로운 gray_200_949399 리소스가 정확히 적용되었습니다.

Also applies to: 174-174, 197-197, 205-205, 214-214

app/src/main/java/com/into/websoso/data/remote/response/AvatarsResponseDto.kt (2)

13-14: avatarId의 Long 타입 변경이 올바르게 적용되었습니다.

ID 범위 확장을 위한 타입 변경이 서버 API 스키마와 일관되게 반영되었습니다.


19-22: 이중 이미지 구조가 의도에 맞게 구현되었습니다.

avatarProfileImage(프로필용)와 avatarImage(캐릭터용) 두 이미지 필드를 분리하여 각각의 용도에 맞게 활용할 수 있도록 설계되었습니다.

app/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarPagerAdapter.kt (2)

23-33: 부분 업데이트 로직이 올바르게 구현되었습니다.

payloads를 활용한 부분 업데이트 처리로 ViewPager의 깜빡임을 효과적으로 방지하고 있습니다.


47-60: 콘텐츠 비교 로직이 효율적으로 구현되었습니다.

대표 아바타 선택 상태(isRepresentative) 변경을 감지하여 필요한 경우에만 재바인딩하는 최적화가 잘 적용되었습니다. getChangePayload에서 Unit을 반환하여 부분 업데이트를 트리거하는 방식도 적절합니다.

app/src/main/res/layout/dialog_avatar_change.xml (3)

76-97: ViewPager2와 DotsIndicator가 적절히 구성되었습니다.

RecyclerView 기반 구조에서 ViewPager2로의 전환이 올바르게 이루어졌으며, DotsIndicator를 통해 페이징 상태를 직관적으로 표시하고 있습니다. 색상과 크기 설정도 디자인 시스템에 맞게 적용되었습니다.


99-137: 버튼 레이아웃이 사용자 경험을 고려하여 잘 설계되었습니다.

취소와 설정 버튼을 동일한 크기로 나란히 배치하여 균형잡힌 UI를 구성했고, 시각적 계층(회색 vs 프라이머리 색상)을 통해 주요 액션을 명확히 구분하고 있습니다.


31-70: 텍스트 스타일과 간격이 디자인 시스템에 맞게 조정되었습니다.

마진 조정과 텍스트 스타일 변경으로 더 나은 시각적 계층과 가독성을 제공합니다. 업데이트된 gray_200 색상도 일관되게 적용되었습니다.

Comment on lines +11 to +12
avatarProfile = avatarProfileImage,
avatarImage = avatarImage,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# avatarThumbnail 필드의 모든 사용처 검색
rg -nP --type=kotlin '\bavatarThumbnail\b' -C 2

Repository: Team-WSS/WSS-Android

Length of output: 5039


🏁 Script executed:

cat -n app/src/main/java/com/into/websoso/ui/mapper/AvatarMapper.kt

Repository: Team-WSS/WSS-Android

Length of output: 604


🏁 Script executed:

find . -name "AvatarModel.kt" -type f

Repository: Team-WSS/WSS-Android

Length of output: 136


🏁 Script executed:

cat -n ./app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt

Repository: Team-WSS/WSS-Android

Length of output: 413


🏁 Script executed:

rg -n --type=kotlin "AvatarModel" -C 2 | head -100

Repository: Team-WSS/WSS-Android

Length of output: 11184


🏁 Script executed:

cat -n app/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditViewModel.kt | sed -n '245,285p'

Repository: Team-WSS/WSS-Android

Length of output: 2080


🏁 Script executed:

cat -n app/src/main/java/com/into/websoso/ui/mapper/UserMapper.kt | sed -n '20,35p'

Repository: Team-WSS/WSS-Android

Length of output: 664


필드 매핑 마이그레이션 완료 필요 - avatarThumbnail 참조 남아있음.

AvatarMapper가 avatarProfileavatarImage로 변경되었으나, 하위 계층 코드가 여전히 avatarThumbnail 필드를 사용하고 있습니다. ViewModel에서 수동으로 avatarProfile → avatarThumbnail으로 매핑 중이지만, 다음 위치들도 함께 업데이트되어야 합니다:

  • ProfileEditUiModel.kt:11 - avatarThumbnail 필드를 avatarProfile로 변경
  • ProfileEditViewModel.kt:249, 282 - avatarProfile 직접 사용으로 변경
  • ProfileEditActivity.kt:276-279 - 메서드명 및 파라미터 업데이트
  • UserMapper.kt:27 - 매핑 필드명 업데이트 필요

Comment on lines +17 to +24
val position = parent.getChildAdapterPosition(view)
val column = position / spanCount

if (column > 0) {
outRect.left = spacing
} else {
outRect.left = 0
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

컬럼 계산 로직 오류 수정 필요

Line 18의 컬럼 계산이 잘못되었습니다. 현재 코드는 나눗셈(/)을 사용하여 행 번호를 계산하고 있지만, 컬럼 인덱스를 구하려면 나머지 연산자(%)를 사용해야 합니다.

현재 동작 (잘못됨):

  • spanCount=3일 때, position 0-2는 column 0, position 3-5는 column 1
  • 전체 행에 spacing이 적용되어 의도한 동작이 아님

올바른 동작:

  • spanCount=3일 때, position 0,3,6은 column 0 (간격 없음)
  • position 1,4,7은 column 1 (왼쪽 간격), position 2,5,8은 column 2 (왼쪽 간격)
🔎 수정 제안
     val position = parent.getChildAdapterPosition(view)
-    val column = position / spanCount
+    val column = position % spanCount
 
     if (column > 0) {
         outRect.left = spacing
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val position = parent.getChildAdapterPosition(view)
val column = position / spanCount
if (column > 0) {
outRect.left = spacing
} else {
outRect.left = 0
}
val position = parent.getChildAdapterPosition(view)
val column = position % spanCount
if (column > 0) {
outRect.left = spacing
} else {
outRect.left = 0
}
🤖 Prompt for AI Agents
In
app/src/main/java/com/into/websoso/ui/profileEdit/ColumnSpacingItemDecoration.kt
around lines 17 to 24, the code incorrectly computes the column using integer
division (position / spanCount); change it to use the remainder operator
(position % spanCount) so column = position % spanCount, then keep the existing
logic to set outRect.left = spacing when column > 0 and 0 when column == 0;
ensure you only change the operator and not the surrounding spacing logic.


data class AvatarModel(
val avatarId: Int = 0,
val avatarId: Long = 0,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, locate and examine the AvatarModel.kt file
echo "=== Finding AvatarModel.kt ==="
fd AvatarModel.kt

echo -e "\n=== Examining AvatarModel.kt content ==="
cat -n "app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt"

Repository: Team-WSS/WSS-Android

Length of output: 557


🏁 Script executed:

#!/bin/bash
# Search for avatarId with Int type declarations
echo "=== Checking for avatarId with Int type in Kotlin files ==="
rg --type=kotlin 'avatarId\s*:\s*Int\b' -C3

echo -e "\n=== Checking for avatarId in function parameters with Int type ==="
rg --type=kotlin 'avatarId\s*:\s*Int\b' -C2

echo -e "\n=== Checking for remaining avatarThumbnail references ==="
rg --type=kotlin 'avatarThumbnail' -C2

Repository: Team-WSS/WSS-Android

Length of output: 5078


🏁 Script executed:

#!/bin/bash
# Check data classes for avatarId type
echo "=== Checking AvatarModel, DTOs, and Entity classes ==="
rg --type=kotlin 'data class|class.*{' -A 10 | grep -E '(class (Avatar|User)|avatarId)' | head -50

Repository: Team-WSS/WSS-Android

Length of output: 237


🏁 Script executed:

#!/bin/bash
echo "=== Examining ProfileEditUiModel.kt ==="
cat -n "app/src/main/java/com/into/websoso/ui/profileEdit/model/ProfileEditUiModel.kt"

Repository: Team-WSS/WSS-Android

Length of output: 1184


🏁 Script executed:

#!/bin/bash
echo "=== Checking avatarId type consistency in all related files ==="
rg --type=kotlin 'avatarId\s*:\s*Long' -C1

echo -e "\n=== Checking ProfileEditUiModel field mapping ==="
fd ProfileEditUiModel.kt -x cat -n {}

Repository: Team-WSS/WSS-Android

Length of output: 3156


avatarId 타입 변경은 코드베이스 전체에서 일관되게 적용되었습니다.

avatarId의 타입이 Int에서 Long으로 변경된 부분은 모든 관련 클래스에서 올바르게 적용되었습니다. 그러나 필드 구조 변경은 불완전합니다.

  • avatarId 타입 일관성: ✓ AvatarModel, ProfileModel, AvatarsResponseDto, UserProfileEditRequestDto, UserRepository, AvatarEntity 모두 Long으로 통일됨
  • 필드 마이그레이션 불완전: ProfileModel (ProfileEditUiModel.kt 11번 줄)은 여전히 avatarThumbnail 필드를 유지하고 있으나, AvatarModel은 이 필드를 제거했습니다. 현재 ViewModel에서 avatarProfile → avatarThumbnail 매핑으로 임시 대응 중입니다.

ProfileModel도 AvatarModel과 동일하게 avatarThumbnail을 제거하고 avatarProfile, avatarImage를 사용하도록 통일하세요.

🤖 Prompt for AI Agents
In app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt around
line 4, AvatarModel changed to remove avatarThumbnail and use
avatarProfile/avatarImage with avatarId as Long; ProfileModel
(ProfileEditUiModel.kt line ~11) still declares avatarThumbnail causing an
inconsistent field map — remove avatarThumbnail from ProfileModel and add/ensure
avatarProfile and avatarImage fields match AvatarModel's names and types, update
constructors/copy functions and any direct property accesses, then update
ViewModel mapping logic and XML/fragment usages to reference
avatarProfile/avatarImage instead of avatarThumbnail so all classes and usages
are consistent.

Comment on lines +7 to +8
val avatarProfile: String = "",
val avatarImage: String = "",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for avatarThumbnail references in Kotlin files
echo "=== Searching for avatarThumbnail in Kotlin files ==="
rg -n 'avatarThumbnail' --type=kotlin -C3

echo -e "\n=== Searching for avatarThumbnail in layout XML files ==="
rg -n 'avatarThumbnail' app/src/main/res/layout/ -C2

echo -e "\n=== Searching for avatarThumbnail anywhere in codebase ==="
rg -n 'avatarThumbnail' -C2

Repository: Team-WSS/WSS-Android

Length of output: 12676


아바타 필드 구조 변경이 불완전합니다. 추가 작업이 필요합니다.

AvatarModelavatarThumbnail 필드를 제거하고 avatarProfile, avatarImage 필드를 추가했지만, 다음 위치에서 여전히 avatarThumbnail을 사용 중입니다:

  • ProfileEditActivity.kt (line 90): updateAvatarThumbnail(uiState.profile.avatarThumbnail) 호출
  • ProfileEditActivity.kt (line 276-280): updateAvatarThumbnail() 함수 정의
  • ProfileEditViewModel.kt (line 249, 282, 323, 327): avatarThumbnail 필드 할당 및 메서드 정의
  • ProfileEditUiModel.kt (line 11): val avatarThumbnail: String = "" 필드 유지
  • activity_profile_edit.xml (line 83): 데이터 바인딩에서 avatarThumbnail 참조
  • UserMapper.kt (line 27): avatarThumbnail = avatarImage 매핑

ProfileModel과 관련 컴포넌트들이 새로운 필드명(avatarProfile, avatarImage)을 사용하도록 업데이트해야 합니다.

🤖 Prompt for AI Agents
In app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.kt around
lines 7-8, the AvatarModel fields were changed but related code still references
the removed avatarThumbnail; update all usages to the new field names: replace
reads/writes of avatarThumbnail with avatarProfile or avatarImage as appropriate
(profile display vs full image) in ProfileEditActivity.kt (call and function
updateAvatarThumbnail -> updateAvatarProfile/updateAvatarImage at lines ~90 and
276-280), ProfileEditViewModel.kt (assignments and methods at lines ~249, 282,
323, 327), ProfileEditUiModel.kt (remove avatarThumbnail and expose
avatarProfile/avatarImage), activity_profile_edit.xml (data binding at line ~83
to bind new fields), and UserMapper.kt (map avatarProfile and avatarImage
correctly instead of assigning avatarThumbnail); ensure method names, parameter
types and bindings are consistent and update any nullability or default values
accordingly.

Comment on lines +39 to +48
<ImageView
android:id="@+id/iv_profile_edit_avatar"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginHorizontal="56dp"
android:layout_marginTop="16dp"
android:layout_height="240dp"
android:layout_marginTop="4dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_profile_edit_avatar_title"
app:lottie_autoPlay="true" />
app:loads3ImageUrl="@{viewModel.avatarChangeUiState.selectedAvatar.avatarImage}" />
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "*.kt" | head -20

Repository: Team-WSS/WSS-Android

Length of output: 1583


🏁 Script executed:

rg -nP --type=kt '@BindingAdapter.*loads3ImageUrl' -A 15

Repository: Team-WSS/WSS-Android

Length of output: 90


🏁 Script executed:

rg -nP --type=kt 'loads3ImageUrl' -B 2 -A 10

Repository: Team-WSS/WSS-Android

Length of output: 90


🏁 Script executed:

rg -nP --type=kt '@BindingAdapter' -l | head -10

Repository: Team-WSS/WSS-Android

Length of output: 90


🏁 Script executed:

rg -nP 'loads3ImageUrl' -B 2 -A 10

Repository: Team-WSS/WSS-Android

Length of output: 2691


🏁 Script executed:

rg -nP '@BindingAdapter' | head -20

Repository: Team-WSS/WSS-Android

Length of output: 423


🏁 Script executed:

fd -e kt -name "*BindingAdapter*" -o -name "*Extension*"

Repository: Team-WSS/WSS-Android

Length of output: 294


🏁 Script executed:

rg -nP 'fun.*loads3ImageUrl' -B 5 -A 15

Repository: Team-WSS/WSS-Android

Length of output: 46


🏁 Script executed:

cat -n app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.kt

Repository: Team-WSS/WSS-Android

Length of output: 2725


🏁 Script executed:

find . -type f -name "*img_loading_thumbnail*"

Repository: Team-WSS/WSS-Android

Length of output: 340


🏁 Script executed:

rg 'img_loading_thumbnail' -l

Repository: Team-WSS/WSS-Android

Length of output: 680


🏁 Script executed:

rg 'fun.*getS3ImageUrl' -B 2 -A 10

Repository: Team-WSS/WSS-Android

Length of output: 1375


S3 이미지 로드 바인딩 어댑터에 플레이스홀더 설정이 누락되었습니다.

loadS3ImageUrl 바인딩 어댑터는 이미지 로드 실패 시 img_loading_thumbnail 에러 드로어블을 설정하고 있으나, 로드 중 표시할 플레이스홀더 드로어블이 없습니다. 같은 파일의 loadImageWithOptions 어댑터처럼 placeholder와 crossfade 옵션을 추가하여 로딩 중 사용자 경험을 개선하는 것을 권장합니다.

🤖 Prompt for AI Agents
app/src/main/res/layout/dialog_avatar_change.xml lines 39-48: the ImageView uses
the loadS3ImageUrl binding adapter but there is no placeholder set for loading
state; update the loadS3ImageUrl binding adapter (not this layout) to accept and
apply a placeholder drawable (use R.drawable.img_loading_thumbnail) and enable a
crossfade option like the existing loadImageWithOptions adapter so that while
the S3 image is being fetched a placeholder is shown and the final image fades
in.

@m6z1 m6z1 merged commit 1a27ee9 into develop Dec 27, 2025
3 checks passed
@m6z1 m6z1 deleted the feat/771 branch December 27, 2025 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🍯 [FEAT] 새로운 기능을 개발합니다. 🏹 궁사 명지 웹소소 공주의 은밀한 사냥생활

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 프로필 아바타 추가

2 participants