From 5b83ae69dd43fd5f34ccd1a4e5387efd1947839b Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 25 Feb 2026 15:02:50 +0900 Subject: [PATCH] =?UTF-8?q?feat(profile):=20=ED=81=AC=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=83=81=EC=84=B8=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=85=B8=EC=B6=9C=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/explorer/ExplorerApi.kt | 7 + .../sodalive/explorer/ExplorerRepository.kt | 5 + .../explorer/profile/UserProfileActivity.kt | 13 + .../explorer/profile/UserProfileViewModel.kt | 38 +++ .../profile/detail/CreatorDetailDialog.kt | 157 ++++++++++++ .../detail/GetCreatorDetailResponse.kt | 19 ++ .../res/drawable-xxhdpi/ic_sns_fancimm.png | Bin 0 -> 15185 bytes .../res/drawable-xxhdpi/ic_sns_instagram.png | Bin 0 -> 14119 bytes .../main/res/drawable-xxhdpi/ic_sns_kakao.png | Bin 0 -> 8999 bytes app/src/main/res/drawable-xxhdpi/ic_sns_x.png | Bin 0 -> 8997 bytes .../res/drawable-xxhdpi/ic_sns_youtube.png | Bin 0 -> 5722 bytes app/src/main/res/drawable/ic_x_white.xml | 3 + .../main/res/layout/dialog_creator_detail.xml | 225 ++++++++++++++++++ app/src/main/res/values-en/strings.xml | 9 +- app/src/main/res/values-ja/strings.xml | 9 +- app/src/main/res/values/strings.xml | 9 +- ...260225_크리에이터상세정보다이얼로그구현.md | 110 +++++++++ 17 files changed, 601 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/CreatorDetailDialog.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/GetCreatorDetailResponse.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sns_fancimm.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sns_instagram.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sns_kakao.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sns_x.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sns_youtube.png create mode 100644 app/src/main/res/drawable/ic_x_white.xml create mode 100644 app/src/main/res/layout/dialog_creator_detail.xml create mode 100644 docs/20260225_크리에이터상세정보다이얼로그구현.md diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerApi.kt index 7d303e3b..4a5fed03 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerApi.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerApi.kt @@ -5,6 +5,7 @@ import io.reactivex.rxjava3.core.Single import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.explorer.profile.GetCheersResponse import kr.co.vividnext.sodalive.explorer.profile.GetCreatorProfileResponse +import kr.co.vividnext.sodalive.explorer.profile.detail.GetCreatorDetailResponse import kr.co.vividnext.sodalive.explorer.profile.cheers.PostWriteCheersRequest import kr.co.vividnext.sodalive.explorer.profile.cheers.PutModifyCheersRequest import kr.co.vividnext.sodalive.explorer.profile.donation.GetDonationAllResponse @@ -43,6 +44,12 @@ interface ExplorerApi { @Header("Authorization") authHeader: String ): Single> + @GET("/explorer/profile/{id}/detail") + fun getCreatorDetail( + @Path("id") id: Long, + @Header("Authorization") authHeader: String + ): Single> + @GET("/explorer/profile/{id}/donation-rank") fun getCreatorProfileDonationRanking( @Path("id") id: Long, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerRepository.kt index 754f3581..a79c2861 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerRepository.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerRepository.kt @@ -27,6 +27,11 @@ class ExplorerRepository( authHeader = token ) + fun getCreatorDetail(id: Long, token: String) = api.getCreatorDetail( + id = id, + authHeader = token + ) + fun getCreatorProfileCheers( creatorId: Long, page: Int, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt index 46dcdf74..2ea137da 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt @@ -51,6 +51,7 @@ import kr.co.vividnext.sodalive.explorer.profile.creator_community.GetCommunityP import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity import kr.co.vividnext.sodalive.explorer.profile.creator_community.relativeTimeText import kr.co.vividnext.sodalive.explorer.profile.creator_community.write.CreatorCommunityWriteActivity +import kr.co.vividnext.sodalive.explorer.profile.detail.CreatorDetailDialog import kr.co.vividnext.sodalive.explorer.profile.donation.UserProfileDonationAdapter import kr.co.vividnext.sodalive.explorer.profile.donation.UserProfileDonationAllViewActivity import kr.co.vividnext.sodalive.explorer.profile.fantalk.UserProfileFantalkAllViewActivity @@ -711,6 +712,7 @@ class UserProfileActivity : BaseActivity( if (creator.creatorId == SharedPreferenceManager.userId) { binding.ivNotification.visibility = View.GONE binding.tvNotificationCount.visibility = View.GONE + binding.tvNotificationCount.setOnClickListener(null) binding.tvFollowerList.visibility = View.VISIBLE binding.tvFollowerList.setOnClickListener { @@ -728,6 +730,17 @@ class UserProfileActivity : BaseActivity( R.string.screen_user_profile_follower_count, creator.notificationRecipientCount.moneyFormat() ) + + binding.tvNotificationCount.setOnClickListener { + viewModel.getCreatorDetail(creator.creatorId) { detail -> + CreatorDetailDialog( + activity = this@UserProfileActivity, + layoutInflater = layoutInflater, + screenWidth = screenWidth, + detail = detail + ).show() + } + } } if (creator.isFollow) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileViewModel.kt index fbd64155..225982cf 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileViewModel.kt @@ -12,6 +12,7 @@ import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder import kr.co.vividnext.sodalive.common.Utils import kr.co.vividnext.sodalive.explorer.ExplorerRepository import kr.co.vividnext.sodalive.explorer.profile.cheers.PutModifyCheersRequest +import kr.co.vividnext.sodalive.explorer.profile.detail.GetCreatorDetailResponse import kr.co.vividnext.sodalive.report.ReportRepository import kr.co.vividnext.sodalive.report.ReportRequest import kr.co.vividnext.sodalive.report.ReportType @@ -156,6 +157,43 @@ class UserProfileViewModel( ) } + fun getCreatorDetail(userId: Long, onSuccess: (GetCreatorDetailResponse) -> Unit) { + _isLoading.value = true + compositeDisposable.add( + repository.getCreatorDetail( + id = userId, + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + if (it.success && it.data != null) { + onSuccess(it.data) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue( + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) + ) + } + ) + ) + } + fun follow(creatorId: Long, follow: Boolean = true, notify: Boolean = true) { _isLoading.value = true compositeDisposable.add( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/CreatorDetailDialog.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/CreatorDetailDialog.kt new file mode 100644 index 00000000..8bbb5e96 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/CreatorDetailDialog.kt @@ -0,0 +1,157 @@ +package kr.co.vividnext.sodalive.explorer.profile.detail + +import android.app.Activity +import android.content.Intent +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.view.Window +import android.view.WindowManager +import android.webkit.URLUtil +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.appcompat.app.AlertDialog +import androidx.core.graphics.drawable.toDrawable +import androidx.core.net.toUri +import coil.load +import coil.transform.RoundedCornersTransformation +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.DialogCreatorDetailBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.extensions.moneyFormat + +class CreatorDetailDialog( + private val activity: Activity, + layoutInflater: LayoutInflater, + private val screenWidth: Int, + private val detail: GetCreatorDetailResponse +) { + + private data class SnsItem( + val url: String, + val iconResId: Int + ) + + private val alertDialog: AlertDialog + private val dialogView = DialogCreatorDetailBinding.inflate(layoutInflater) + + init { + val dialogBuilder = AlertDialog.Builder(activity) + dialogBuilder.setView(dialogView.root) + + alertDialog = dialogBuilder.create() + alertDialog.setCancelable(false) + alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + alertDialog.window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) + + setupView() + bindData() + } + + private fun setupView() { + dialogView.ivClose.setOnClickListener { dismiss() } + } + + private fun bindData() { + dialogView.ivProfile.load(detail.profileImageUrl) { + crossfade(true) + placeholder(R.drawable.ic_place_holder) + transformations(RoundedCornersTransformation(16f.dpToPx())) + } + dialogView.tvNickname.text = detail.nickname + + dialogView.tvDebutValue.text = getDebutValue() + dialogView.tvLiveCountValue.text = detail.activitySummary.liveCount.moneyFormat() + dialogView.tvLiveTimeValue.text = detail.activitySummary.liveTime.moneyFormat() + dialogView.tvLiveContributorCountValue.text = detail.activitySummary.liveContributorCount.moneyFormat() + dialogView.tvContentCountValue.text = detail.activitySummary.contentCount.moneyFormat() + + bindSnsItems() + } + + private fun getDebutValue(): String { + val debutDate = detail.debutDate.trim() + val dDay = detail.dDay.trim() + if (debutDate.isBlank() && dDay.isBlank()) { + return activity.getString(R.string.screen_creator_detail_debut_before) + } + + return "$debutDate ($dDay)" + } + + private fun bindSnsItems() { + val snsItems = listOf( + SnsItem( + url = detail.youtubeUrl.trim(), + iconResId = R.drawable.ic_sns_youtube + ), + SnsItem( + url = detail.instagramUrl.trim(), + iconResId = R.drawable.ic_sns_instagram + ), + SnsItem( + url = detail.kakaoOpenChatUrl.trim(), + iconResId = R.drawable.ic_sns_kakao + ), + SnsItem( + url = detail.fancimmUrl.trim(), + iconResId = R.drawable.ic_sns_fancimm + ), + SnsItem( + url = detail.xUrl.trim(), + iconResId = R.drawable.ic_sns_x + ) + ).filter { item -> + item.url.isNotBlank() && URLUtil.isValidUrl(item.url) + } + + if (snsItems.isEmpty()) { + dialogView.llSectionSns.visibility = View.GONE + return + } + + dialogView.llSectionSns.visibility = View.VISIBLE + dialogView.llSnsIcons.removeAllViews() + + snsItems.forEachIndexed { index, item -> + val imageView = ImageView(activity).apply { + setImageResource(item.iconResId) + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ).apply { + if (index > 0) { + marginStart = 12.dpToPx().toInt() + } + } + setOnClickListener { + openUrl(item.url) + } + } + + dialogView.llSnsIcons.addView(imageView) + } + } + + private fun openUrl(url: String) { + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + if (intent.resolveActivity(activity.packageManager) != null) { + activity.startActivity(intent) + } + } + + private fun dismiss() { + alertDialog.dismiss() + } + + fun show() { + alertDialog.show() + + val lp = WindowManager.LayoutParams() + lp.copyFrom(alertDialog.window?.attributes) + lp.width = screenWidth - (48.dpToPx()).toInt() + lp.height = WindowManager.LayoutParams.WRAP_CONTENT + + alertDialog.window?.attributes = lp + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/GetCreatorDetailResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/GetCreatorDetailResponse.kt new file mode 100644 index 00000000..980ebc4b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/GetCreatorDetailResponse.kt @@ -0,0 +1,19 @@ +package kr.co.vividnext.sodalive.explorer.profile.detail + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.explorer.profile.GetCreatorActivitySummary + +@Keep +data class GetCreatorDetailResponse( + @SerializedName("nickname") val nickname: String, + @SerializedName("profileImageUrl") val profileImageUrl: String, + @SerializedName("debutDate") val debutDate: String, + @SerializedName("dday") val dDay: String, + @SerializedName("activitySummary") val activitySummary: GetCreatorActivitySummary, + @SerializedName("instagramUrl") val instagramUrl: String, + @SerializedName("fancimmUrl") val fancimmUrl: String, + @SerializedName("xurl") val xUrl: String, + @SerializedName("youtubeUrl") val youtubeUrl: String, + @SerializedName("kakaoOpenChatUrl") val kakaoOpenChatUrl: String +) diff --git a/app/src/main/res/drawable-xxhdpi/ic_sns_fancimm.png b/app/src/main/res/drawable-xxhdpi/ic_sns_fancimm.png new file mode 100644 index 0000000000000000000000000000000000000000..fac63517acb1dada3d877bc9e775fa78c66a2b77 GIT binary patch literal 15185 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_sns_youtube.png b/app/src/main/res/drawable-xxhdpi/ic_sns_youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..885fbbef268106184f0e940f6a701c6e47cf2fcc GIT binary patch literal 5722 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_x_white.xml b/app/src/main/res/drawable/ic_x_white.xml new file mode 100644 index 00000000..974f1dc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_x_white.xml @@ -0,0 +1,3 @@ + + diff --git a/app/src/main/res/layout/dialog_creator_detail.xml b/app/src/main/res/layout/dialog_creator_detail.xml new file mode 100644 index 00000000..5abfeb39 --- /dev/null +++ b/app/src/main/res/layout/dialog_creator_detail.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 2a5bfb06..10c38b87 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -774,7 +774,14 @@ Invalid request. Share channel Follower list - Followers %1$s + Followers %1$s · Details > + Debut + Before debut + Total live sessions + Cumulative live time + Cumulative live participants + Registered content count + SNS Scheduled Points Live diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 88c39770..6dff89b1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -774,7 +774,14 @@ 無効なリクエストです。 チャンネル共有 フォロワーリスト - フォロワー %1$s人 + フォロワー %1$s人 · 詳細情報 > + デビュー + デビュー前 + ライブ総回数 + ライブ累積時間 + ライブ累積参加者 + 登録コンテンツ数 + SNS 公開予定 ポイント ライブ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 858a359a..25d9a786 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -773,7 +773,14 @@ 잘못된 요청입니다. 채널 공유 팔로워 리스트 - 팔로워 %1$s명 + 팔로워 %1$s명 · 상세정보 > + 데뷔 + 데뷔전 + 라이브 총 횟수 + 라이브 누적 시간 + 라이브 누적 참여자 + 등록 콘텐츠 수 + SNS 오픈예정 포인트 라이브 diff --git a/docs/20260225_크리에이터상세정보다이얼로그구현.md b/docs/20260225_크리에이터상세정보다이얼로그구현.md new file mode 100644 index 00000000..bf174f76 --- /dev/null +++ b/docs/20260225_크리에이터상세정보다이얼로그구현.md @@ -0,0 +1,110 @@ +# 크리에이터 상세정보 다이얼로그 구현 계획 + +## 구현 체크리스트 +- [x] 1단계: 크리에이터 상세정보 다이얼로그 요구사항 및 기존 구현 패턴을 확인한다. + - 대상 파일: `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt`, `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/GetCreatorDetailResponse.kt`, `app/src/main/java/kr/co/vividnext/sodalive/dialog/MemberProfileDialog.kt`, `app/src/main/res/values/strings.xml` +- [x] 2단계: `kr.co.vividnext.sodalive.explorer.profile.detail` 패키지에 크리에이터 상세정보 Custom Dialog UI/로직을 구현한다. + - 대상 파일: `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/detail/*.kt`, `app/src/main/res/layout/*.xml`, `app/src/main/res/drawable/*.xml` +- [x] 3단계: `UserProfileActivity`에서 `tvNotificationCount` 클릭 시 상세정보 다이얼로그가 표시되도록 연결한다. + - 대상 파일: `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileActivity.kt`, `app/src/main/java/kr/co/vividnext/sodalive/explorer/profile/UserProfileViewModel.kt`, `app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerApi.kt`, `app/src/main/java/kr/co/vividnext/sodalive/explorer/ExplorerRepository.kt` +- [x] 4단계: 팔로워 문구를 `팔로워 OO명 · 상세정보 >` 형태로 국제화 문자열에 반영한다. + - 대상 파일: `app/src/main/res/values/strings.xml`, `app/src/main/res/values-en/strings.xml`, `app/src/main/res/values-ja/strings.xml` +- [x] 5단계: 진단/테스트/빌드 검증을 수행하고 문서 하단 검증 기록에 누적한다. + - 대상 명령: `./gradlew :app:testDebugUnitTest`, `./gradlew :app:assembleDebug` + +## 작업 메모 +- `@docs/20260224_AGENTS문서정비.md`의 제목/섹션 구조를 기준 포맷으로 채택한다. +- 구현 중 범위 변경 시 체크리스트를 먼저 갱신한 뒤 코드 변경을 진행한다. +- SNS 아이콘/정렬 정책 추가 반영: `ic_sns_*` 아이콘 사용, 노출 순서 `유튜브 -> 인스타그램 -> 오픈채팅 -> fancimm -> x` 고정. + +## 검증 기록 + +### 1) 계획 문서 포맷 정렬 +- 무엇: 계획 문서를 `제목 -> 구현 체크리스트 -> 작업 메모 -> 검증 기록` 구조로 정렬. +- 왜: 초기 기준 문서(`docs/20260224_AGENTS문서정비.md`)와 동일한 작성 규칙을 유지하기 위해. +- 어떻게: + - `docs/20260224_AGENTS문서정비.md`의 헤더 구조를 확인. + - `docs/20260225_크리에이터상세정보다이얼로그구현.md`에 제목/체크리스트/메모 섹션을 추가 및 정리. +- 결과: 계획 문서 형식이 기준 문서와 동일한 섹션 구조로 정렬됨. + +### 2) 상세정보 다이얼로그 및 문자열 반영 +- 무엇: 크리에이터 상세정보 다이얼로그 구현 및 `tvNotificationCount` 연결, 팔로워 문구 국제화 반영. +- 왜: 팔로워 수 클릭 시 상세정보 노출 UX와 다국어 문구 요구사항을 충족하기 위해. +- 어떻게: + - `CreatorDetailDialog`/`dialog_creator_detail.xml`/`ic_x_white.xml` 생성. + - `ExplorerApi`/`ExplorerRepository`/`UserProfileViewModel`에 크리에이터 상세 API 호출 흐름 추가. + - `UserProfileActivity`에서 `tvNotificationCount` 클릭 시 상세 다이얼로그 표시 연결. + - `values/strings.xml`, `values-en/strings.xml`, `values-ja/strings.xml`의 팔로워 문구를 `... · ... >` 형태로 변경하고 상세정보 타이틀 문자열 추가. +- 결과: 요구한 다이얼로그 표시 흐름과 국제화 문자열 반영 완료. + +### 3) 진단/테스트/빌드 검증 +- 무엇: 변경 파일 진단 및 단위 테스트/디버그 빌드 수행. +- 왜: 구현 반영 후 컴파일/리소스/테스트 안정성을 확인하기 위해. +- 어떻게: + - `lsp_diagnostics`를 수정한 Kotlin/XML 파일에 실행 시도. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: + - LSP: 현재 환경에서 Kotlin/XML LSP 미설정(`No LSP server configured for extension: .kt/.xml`). + - Gradle: `BUILD SUCCESSFUL` (unit test + debug assemble 통과). + +### 4) 추가 수정 후 재검증 +- 무엇: SNS 항목 확장 반영(`fancimmUrl`, `websiteUrl`, `blogUrl`) 이후 재검증. +- 왜: 마지막 코드 변경 이후에도 빌드/테스트가 정상인지 확인하기 위해. +- 어떻게: + - `lsp_diagnostics`로 `CreatorDetailDialog.kt` 진단 실행 시도. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 재실행. +- 결과: + - LSP: Kotlin LSP 미설정(`No LSP server configured for extension: .kt`). + - Gradle: `BUILD SUCCESSFUL`. + +### 5) 최종 변경 반영 후 검증 +- 무엇: SNS 아이템 노출 필드(오픈채팅/인스타그램/유튜브/팬심/X/웹사이트/블로그) 최종 반영 후 재검증. +- 왜: 마지막 수정 이후에도 테스트/빌드 통과 상태를 보장하기 위해. +- 어떻게: + - `lsp_diagnostics`로 `CreatorDetailDialog.kt` 진단 실행 시도. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: + - LSP: Kotlin LSP 미설정(`No LSP server configured for extension: .kt`). + - Gradle: `BUILD SUCCESSFUL`. + +### 6) SNS 순서/아이콘 정책 반영 후 재검증 +- 무엇: SNS 노출 순서를 `유튜브 -> 인스타그램 -> 오픈채팅 -> fancimm -> x`로 고정하고 `ic_sns_*` 아이콘 사용으로 통일. +- 왜: 추가 요청된 UI 정책을 정확히 반영하기 위해. +- 어떻게: + - `CreatorDetailDialog.kt`의 SNS 리스트 순서와 아이콘 리소스를 `ic_sns_youtube`, `ic_sns_instagram`, `ic_sns_kakao`, `ic_sns_fancimm`, `ic_sns_x`로 수정. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: `BUILD SUCCESSFUL`. + +### 7) 프로필 이미지 1:1 전체 폭 반영 후 재검증 +- 무엇: 상세 다이얼로그 프로필 이미지를 다이얼로그 가로 전체 폭으로 확장하고 1:1 비율로 고정. +- 왜: 추가 요청된 UI 규격(가로 full + 정사각형 비율)을 충족하기 위해. +- 어떻게: + - `dialog_creator_detail.xml`에서 이미지 블록을 상단 full-width ConstraintLayout으로 분리. + - `ImageView`를 `0dp x 0dp` + `app:layout_constraintDimensionRatio="1:1"`로 설정해 가로 기준 정사각형을 강제. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: + - LSP: XML LSP 미설정(`No LSP server configured for extension: .xml`). + - Gradle: `BUILD SUCCESSFUL`. + +### 8) 최근 2회 수정 롤백 및 검증 +- 무엇: 직전 2회 수정(라운드/패딩/스크롤 구조 변경, 긴급 표시 수정)을 롤백. +- 왜: 요청에 따라 최근 2회 수정 내용을 원복하기 위해. +- 어떻게: + - `dialog_creator_detail.xml`을 롤백 전 구조(루트 `wrap_content`, 스크롤 `wrap_content`, 이미지 `0dp/0dp + ratio 1:1`)로 복원. + - `CreatorDetailDialog.kt`를 롤백 전 상태(`CircleCropTransformation`, 다이얼로그 높이 `WRAP_CONTENT`, `ivProfile.post` 제거)로 복원. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: + - LSP: Kotlin/XML LSP 미설정(`No LSP server configured for extension: .kt/.xml`). + - Gradle: `BUILD SUCCESSFUL`. + +### 9) 라이브 누적 시간 섹션 추가 +- 무엇: `라이브 총 횟수` 아래에 동일 UI 패턴의 `라이브 누적 시간` 섹션을 추가하고 `liveTime` 값을 표시. +- 왜: 추가 요청된 정보 항목을 동일한 상세정보 구조로 노출하기 위해. +- 어떻게: + - `dialog_creator_detail.xml`에 `ll_section_live_time`, `tv_live_time_title`, `tv_live_time_value` 추가. + - `CreatorDetailDialog.kt`에서 `detail.activitySummary.liveTime`을 `moneyFormat()`으로 바인딩. + - `values/strings.xml`, `values-en/strings.xml`, `values-ja/strings.xml`에 `screen_creator_detail_live_time` 문자열 추가. + - `./gradlew :app:testDebugUnitTest :app:assembleDebug` 실행. +- 결과: + - LSP: Kotlin/XML LSP 미설정(`No LSP server configured for extension: .kt/.xml`). + - Gradle: `BUILD SUCCESSFUL`.