-
Notifications
You must be signed in to change notification settings - Fork 0
feat: 프로필 아바타 추가 #774
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: 프로필 아바타 추가 #774
Conversation
개요API 엔드포인트 경로 업데이트, avatarId 타입 변경(Int → Long), S3 이미지 로딩 바인딩 추가, 아바타 선택 UI를 RecyclerView에서 ViewPager2로 리팩터링, 그리고 전체 앱의 색상 리소스(gray_200_AEADB3 → gray_200_949399) 통일. 변경 사항
예상 코드 리뷰 노력🎯 4 (Complex) | ⏱️ ~50분 관련 가능성 있는 PR
제안 라벨
제안 리뷰어
시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this 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 이미지 로딩을 위한 방어적 코드 추가 권장새로운
loads3ImageUrlBindingAdapter가 잘 구현되었지만, 몇 가지 개선사항을 고려해보세요:
- 빈 문자열 처리:
s3ImageKey가 비어있거나 null인 경우 처리 로직이 없습니다.- 로딩 플레이스홀더: 이미지 로딩 중 표시할 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
📒 Files selected for processing (87)
app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.ktapp/src/main/java/com/into/websoso/data/mapper/AvatarMapper.ktapp/src/main/java/com/into/websoso/data/model/AvatarEntity.ktapp/src/main/java/com/into/websoso/data/remote/api/AvatarApi.ktapp/src/main/java/com/into/websoso/data/remote/api/UserApi.ktapp/src/main/java/com/into/websoso/data/remote/request/UserProfileEditRequestDto.ktapp/src/main/java/com/into/websoso/data/remote/response/AvatarsResponseDto.ktapp/src/main/java/com/into/websoso/data/repository/UserRepository.ktapp/src/main/java/com/into/websoso/ui/createFeed/CreateFeedActivity.ktapp/src/main/java/com/into/websoso/ui/detailExplore/DetailExploreDialogBottomSheet.ktapp/src/main/java/com/into/websoso/ui/detailExploreResult/DetailExploreResultDialogBottomSheet.ktapp/src/main/java/com/into/websoso/ui/feedDetail/adapter/FeedDetailCommentViewHolder.ktapp/src/main/java/com/into/websoso/ui/mapper/AvatarMapper.ktapp/src/main/java/com/into/websoso/ui/onboarding/second/OnboardingSecondFragment.ktapp/src/main/java/com/into/websoso/ui/profileEdit/AvatarChangeBottomSheetDialog.ktapp/src/main/java/com/into/websoso/ui/profileEdit/ColumnSpacingItemDecoration.ktapp/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditActivity.ktapp/src/main/java/com/into/websoso/ui/profileEdit/ProfileEditViewModel.ktapp/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeAdapter.ktapp/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarChangeViewHolder.ktapp/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarPagerAdapter.ktapp/src/main/java/com/into/websoso/ui/profileEdit/adapter/AvatarSelectPageViewHolder.ktapp/src/main/java/com/into/websoso/ui/profileEdit/model/Avatar.ktapp/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.ktapp/src/main/java/com/into/websoso/ui/profileEdit/model/ProfileEditUiModel.ktapp/src/main/res/color/bg_main_bottom_nav_item_selector.xmlapp/src/main/res/color/bg_novel_detail_rating_read_status_selector.xmlapp/src/main/res/color/bg_novel_info_read_status_graph_text_selector.xmlapp/src/main/res/color/bg_novel_rating_chip_text_selector.xmlapp/src/main/res/color/bg_profile_disclosure_text_selector.xmlapp/src/main/res/color/bg_profile_edit_chip_text_selector.xmlapp/src/main/res/color/bg_rating_date_text_selector.xmlapp/src/main/res/drawable/bg_primary_100_radius_12dp.xmlapp/src/main/res/drawable/selector_onboarding_first_duplication_check_button_text_color.xmlapp/src/main/res/layout/activity_account_info.xmlapp/src/main/res/layout/activity_blocked_users.xmlapp/src/main/res/layout/activity_create_feed.xmlapp/src/main/res/layout/activity_detail_explore_result.xmlapp/src/main/res/layout/activity_feed_detail.xmlapp/src/main/res/layout/activity_normal_explore.xmlapp/src/main/res/layout/activity_notification_setting.xmlapp/src/main/res/layout/activity_novel_detail.xmlapp/src/main/res/layout/activity_novel_rating.xmlapp/src/main/res/layout/activity_other_user_page.xmlapp/src/main/res/layout/activity_profile_edit.xmlapp/src/main/res/layout/activity_withdraw_first.xmlapp/src/main/res/layout/activity_withdraw_second.xmlapp/src/main/res/layout/dialog_avatar_change.xmlapp/src/main/res/layout/dialog_create_feed_search_novel.xmlapp/src/main/res/layout/dialog_detail_explore.xmlapp/src/main/res/layout/dialog_login_request.xmlapp/src/main/res/layout/dialog_novel_rating_keyword.xmlapp/src/main/res/layout/dialog_terms_agreement.xmlapp/src/main/res/layout/fragment_detail_explore_keyword.xmlapp/src/main/res/layout/fragment_detail_explore_result_keyword.xmlapp/src/main/res/layout/fragment_explore.xmlapp/src/main/res/layout/fragment_feed.xmlapp/src/main/res/layout/fragment_home.xmlapp/src/main/res/layout/fragment_my_activity.xmlapp/src/main/res/layout/fragment_my_library.xmlapp/src/main/res/layout/fragment_my_page.xmlapp/src/main/res/layout/fragment_novel_feed.xmlapp/src/main/res/layout/fragment_novel_info.xmlapp/src/main/res/layout/fragment_onboarding_first.xmlapp/src/main/res/layout/fragment_onboarding_second.xmlapp/src/main/res/layout/fragment_onboarding_third.xmlapp/src/main/res/layout/fragment_other_user_activity.xmlapp/src/main/res/layout/fragment_other_user_library.xmlapp/src/main/res/layout/item_avatar_page.xmlapp/src/main/res/layout/item_detail_explore_result.xmlapp/src/main/res/layout/item_detail_explore_result_header.xmlapp/src/main/res/layout/item_feed.xmlapp/src/main/res/layout/item_feed_detail_comment.xmlapp/src/main/res/layout/item_feed_detail_header.xmlapp/src/main/res/layout/item_feed_no_more.xmlapp/src/main/res/layout/item_my_activity.xmlapp/src/main/res/layout/item_normal_explore.xmlapp/src/main/res/layout/item_normal_explore_header.xmlapp/src/main/res/layout/item_popular_feed_slot.xmlapp/src/main/res/layout/item_profile_edit_avatar.xmlapp/src/main/res/layout/item_recommended_novel_by_user_taste.xmlapp/src/main/res/layout/item_rest_genre.xmlapp/src/main/res/layout/item_search_novel.xmlapp/src/main/res/layout/layout_loading.xmlapp/src/main/res/layout/layout_search.xmlapp/src/main/res/values/colors.xmlcore/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의 내용 비교를 명시적인 필드 비교로 변경한 것이 적절합니다.avatarId와isRepresentative필드만 비교하여 불필요한 리바인딩을 방지할 수 있습니다.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호출 시점에서avatarId는ProfileModel.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 색상도 일관되게 적용되었습니다.
| avatarProfile = avatarProfileImage, | ||
| avatarImage = avatarImage, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# avatarThumbnail 필드의 모든 사용처 검색
rg -nP --type=kotlin '\bavatarThumbnail\b' -C 2Repository: Team-WSS/WSS-Android
Length of output: 5039
🏁 Script executed:
cat -n app/src/main/java/com/into/websoso/ui/mapper/AvatarMapper.ktRepository: Team-WSS/WSS-Android
Length of output: 604
🏁 Script executed:
find . -name "AvatarModel.kt" -type fRepository: Team-WSS/WSS-Android
Length of output: 136
🏁 Script executed:
cat -n ./app/src/main/java/com/into/websoso/ui/profileEdit/model/AvatarModel.ktRepository: Team-WSS/WSS-Android
Length of output: 413
🏁 Script executed:
rg -n --type=kotlin "AvatarModel" -C 2 | head -100Repository: 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가 avatarProfile과 avatarImage로 변경되었으나, 하위 계층 코드가 여전히 avatarThumbnail 필드를 사용하고 있습니다. ViewModel에서 수동으로 avatarProfile → avatarThumbnail으로 매핑 중이지만, 다음 위치들도 함께 업데이트되어야 합니다:
ProfileEditUiModel.kt:11-avatarThumbnail필드를avatarProfile로 변경ProfileEditViewModel.kt:249, 282-avatarProfile직접 사용으로 변경ProfileEditActivity.kt:276-279- 메서드명 및 파라미터 업데이트UserMapper.kt:27- 매핑 필드명 업데이트 필요
| val position = parent.getChildAdapterPosition(view) | ||
| val column = position / spanCount | ||
|
|
||
| if (column > 0) { | ||
| outRect.left = spacing | ||
| } else { | ||
| outRect.left = 0 | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
컬럼 계산 로직 오류 수정 필요
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.
| 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, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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' -C2Repository: 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 -50Repository: 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.kt11번 줄)은 여전히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.
| val avatarProfile: String = "", | ||
| val avatarImage: String = "", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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' -C2Repository: Team-WSS/WSS-Android
Length of output: 12676
아바타 필드 구조 변경이 불완전합니다. 추가 작업이 필요합니다.
AvatarModel은 avatarThumbnail 필드를 제거하고 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.
| <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}" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "*.kt" | head -20Repository: Team-WSS/WSS-Android
Length of output: 1583
🏁 Script executed:
rg -nP --type=kt '@BindingAdapter.*loads3ImageUrl' -A 15Repository: Team-WSS/WSS-Android
Length of output: 90
🏁 Script executed:
rg -nP --type=kt 'loads3ImageUrl' -B 2 -A 10Repository: Team-WSS/WSS-Android
Length of output: 90
🏁 Script executed:
rg -nP --type=kt '@BindingAdapter' -l | head -10Repository: Team-WSS/WSS-Android
Length of output: 90
🏁 Script executed:
rg -nP 'loads3ImageUrl' -B 2 -A 10Repository: Team-WSS/WSS-Android
Length of output: 2691
🏁 Script executed:
rg -nP '@BindingAdapter' | head -20Repository: 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 15Repository: Team-WSS/WSS-Android
Length of output: 46
🏁 Script executed:
cat -n app/src/main/java/com/into/websoso/core/common/util/BindingAdapter.ktRepository: 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' -lRepository: Team-WSS/WSS-Android
Length of output: 680
🏁 Script executed:
rg 'fun.*getS3ImageUrl' -B 2 -A 10Repository: 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.
📌𝘐𝘴𝘴𝘶𝘦𝘴
📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯
📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵
KakaoTalk_Video_2025-12-28-00-16-08.mp4
💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴
Summary by CodeRabbit
릴리스 노트
New Features
UI/Style
Chores
✏️ Tip: You can customize this high-level summary in your review settings.