Skip to content

발화 정확도 화면, 대본 일치율 화면 구현#148

Merged
HamBeomJoon merged 6 commits into
developfrom
feat/#121-report-script-match
Jun 18, 2026
Merged

발화 정확도 화면, 대본 일치율 화면 구현#148
HamBeomJoon merged 6 commits into
developfrom
feat/#121-report-script-match

Conversation

@HamBeomJoon

@HamBeomJoon HamBeomJoon commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

📌 작업 내용

분석 리포트 정확도 상세 화면 추가

  • 리포트 화면의 발화, 대본 일치율 카드 클릭 시 정확도 상세 화면으로 이동하도록 연결했습니다.

  • 정확도 상세 화면에서 발화/대본 일치율 탭을 제공하고, 문장 단위 분석 결과를 표시합니다.

  • 문장별 시간, 상태 chip, 피드백, 단어 단위 하이라이트를 렌더링합니다.

  • /recording/analyze/{analysisResultId}/words 응답을 문장 기반 구조로 변경했습니다.

  • 상세 화면 하단 bottom sheet에 오디오 플레이어를 추가했습니다.


🧩 관련 이슈


📸 스크린샷

스크린샷 2026-06-13 19 33 05 스크린샷 2026-06-13 19 32 32

Summary by CodeRabbit

새로운 기능

  • 정확도 분석 상세 화면 추가로 문장별 분석 결과 확인 가능
  • 발음 오류(삽입, 생략, 불일치)를 시각적으로 표시
  • 오디오 재생과 동기화된 분석 결과 하이라이트
  • 발음 정확도 및 스크립트 매칭 탭으로 이슈별 필터링

- 발화 정확도 및 대본 일치율 상세 분석을 위한 `AccuracyDetailScreen` 추가
- 오디오 재생과 연동된 단어별 분석 결과 표시 기능 구현 (MediaPlayer 사용)
- 리포트 화면의 정확도 지표 카드 클릭 시 상세 화면으로 이동하는 로직 추가
- `WordAnalysisStatus` enum 도입 및 네트워크 응답 매퍼 수정
- 기존 리포트 관련 컴포넌트들을 `report` 패키지로 이동 및 구조 정리
…cript-match

# Conflicts:
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportInnerNavKey.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportViewModel.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportScreenLayout.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/AccuracySection.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/common/ReportMetricCards.kt
#	Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/contract/AnalysisReportUiIntent.kt
#	Prezel/feature/report/impl/src/main/res/values/strings.xml
- `AccuracyDetail` 화면의 데이터 로드 실패 시 스낵바 메시지 표시 로직 추가
- `ReportEntryBuilder` 내 내비게이션 호출 로직을 확장 함수로 분리하여 가독성 개선
- `ReportInnerNavKey.ScriptCorrection` 클래스에 `analysisResultId` 공통 인터페이스 적용 및 `Serializable` 어노테이션 추가
- `ReportMetricCards`의 불필요한 `noRippleClickable` 임포트 제거
- `AccuracyDetailUiEffect` 및 `AccuracyDetailUiMessage` 정의를 통한 에러 핸들링 구조화
- 분석 단위를 `WordAnalysisDetail`에서 `SentenceAnalysisDetail`로 변경하여 문장 단위 피드백 및 UI 구현
- 문장 내 개별 단어의 분석 상태를 하이라이트하여 표시하는 `SentenceAnalysisCard` 컴포넌트 추가
- UI 상태 관리를 위한 `SentenceAnalysisUiModel` 및 `WordAnalysisUiModel` 정의
- 도메인 모델 및 네트워크 응답 DTO에 문장 상세 정보(`sentenceDetails`) 필드 추가
- `WordAnalysisDetail`에서 더 이상 사용하지 않는 `description` 필드 제거
- 컬렉션의 안정성을 위해 `kotlinx.collections.immutable` 의존성 추가 및 `ImmutableList` 적용
- `AccuracyDetailScreen` 및 관련 컴포넌트의 데이터 흐름을 문장 모델 중심으로 리팩터링
- `RemoteAudioPlaybackState` 구현을 통해 `MediaPlayer`의 준비 상태 및 에러 핸들링 로직 강화
- UI 플레이어 상태와 실제 오디오 재생 위치 간의 동기화 로직 추가 (`SEEK_SYNC_THRESHOLD_MILLIS` 기준)
- 분석 데이터 유무에 따라 바텀 시트의 `peekHeight`를 동적으로 조절하는 기능 구현
- `SentenceAnalysisUiModel`의 상태 판정 로직 개선 및 `hasSpeechAccuracyStatus` 등 신규 필드 추가
- `AccuracyDetailViewModel`의 데이터 요청 로직을 `onSuccess`/`onFailure` 구조로 리팩터링
- 바텀 시트 내부 레이아웃 구성 및 스크롤 동작 최적화
@HamBeomJoon HamBeomJoon self-assigned this Jun 13, 2026
@HamBeomJoon HamBeomJoon requested a review from moondev03 as a code owner June 13, 2026 10:36
@HamBeomJoon HamBeomJoon added the ✨ feat 새로운 기능 추가 또는 기존 기능 확장 label Jun 13, 2026
@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@HamBeomJoon, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 36 minutes and 7 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: abf5395b-4f9b-4da7-8c68-56381b0485a0

📥 Commits

Reviewing files that changed from the base of the PR and between 7cd0ec7 and 0461f24.

📒 Files selected for processing (6)
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/RemoteAudioPlaybackState.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/ScriptDetailList.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/SentenceAnalysisCard.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/model/SentenceAnalysisUiModel.kt
  • Prezel/feature/report/impl/src/main/res/values/strings.xml
📝 Walkthrough

발화 정확도/대본 일치 상세 화면 구현

문장 단위 분석 데이터 구조로 재설계하고, 정확도 상세 화면의 전체 MVVM 아키텍처를 구현했으며, 원격 오디오 재생 동기화와 UI 컴포넌트 렌더링을 포함하고, 기존 리포트 화면과 네비게이션으로 통합합니다.

변경사항

데이터 모델 구조화 및 네트워크 스키마 업데이트

계층 / 파일(들) 요약
도메인 모델 재구조화: 문장 단위 분석
Prezel/core/model/..., Prezel/core/network/..., Prezel/core/data/...
PresentationWordDetailwordDetails: List에서 sentenceDetails: ImmutableList<SentenceAnalysisDetail> 기반으로 변경합니다. 새로운 SentenceAnalysisDetail은 문장, 상태, 피드백, 정확도, 시작·종료 시간, 하위 단어 상세를 포함합니다. WordAnalysisDetailstatusString에서 WordAnalysisStatus enum으로 변경하고 description 필드를 제거합니다. WordAnalysisStatus는 7가지 상태와 문자열 역변환 from() 메서드를 제공합니다. 네트워크 응답 모델과 매퍼도 함께 업데이트되어 문장 단위 응답 역직렬화와 도메인 변환을 지원합니다. kotlinx.collections.immutable 의존성이 추가됩니다.

정확도 상세 화면 MVVM 및 상태 관리

계층 / 파일(들) 요약
MVVM 계약 정의
Prezel/feature/report/impl/accuracydetail/contract/*, model/*
세 가지 UI 상태(Loading, Error, Content(wordDetail))를 선언합니다. AccuracyDetailUiIntent는 내용이 없는 sealed interface로, AccuracyDetailUiEffectShowMessage(message) effect를 정의합니다. AccuracyDetailUiMessageFetchDetailFailed 메시지 타입을 제공합니다.
ViewModel 및 데이터 로드
Prezel/feature/report/impl/accuracydetail/AccuracyDetailViewModel.kt
Hilt @HiltViewModel으로 정의되며, analysisResultId를 assisted 생성자로 받습니다. 초기화 시 FetchPresentationWordDetailUseCase로 데이터를 비동기 조회하고, 성공 시 Content 상태로, 실패 시 에러 메시지 effect 발행 후 Error 상태로 전환합니다.

원격 오디오 재생 관리

계층 / 파일(들) 요약
원격 URL 오디오 재생 상태
Prezel/feature/report/impl/accuracydetail/RemoteAudioPlaybackState.kt
rememberRemoteAudioPlaybackState(audioUrl) 컴포저블 훅으로 RemoteAudioPlaybackState 인스턴스를 remember(audioUrl)로 캐시하고, DisposableEffect에서 release()를 호출해 리소스를 정리합니다. 내부적으로 MediaPlayer를 준비 전·후 분기하여 관리하고, play(startPosition), pause(), seekTo(position), release() 메서드를 제공합니다. 준비 중 위치는 pendingPositionMillis, 준비 후는 lastKnownPositionMillis로 추적합니다. 준비 완료, 에러, 완료 리스너를 통해 상태 전환과 에러 처리를 합니다.

정확도 상세 화면 UI 구성

계층 / 파일(들) 요약
메인 화면 및 상태 분기
Prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt
AccuracyDetailScreen(onClose, initialTab, viewModel) 컴포저블이 uiState 기반으로 로딩/에러/콘텐츠를 분기하고, uiEffectShowMessage를 스낵바로 표시합니다. 콘텐츠 상태에서는 탭(발화 정확도/대본 매치) 페이징, 선택 탭별 문장 필터링, 현재 재생 위치 기반 선택 문장 계산, 원격 오디오와 플레이어 상태 동기화를 수행합니다. 재생 동기화는 PlaybackEffect로 구현되어 플레이어 상태 변화를 원격 play/pause/seekTo로 반영하고, 주기적 위치 업데이트와 에러 처리를 포함합니다.
플레이어 바텀시트 및 문장 상세
Prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt, ScriptDetailList.kt
AccuracyDetailPlayerSheet는 상단 핸들, 탭별 상세 콘텐츠(SpeechDetailContent, ScriptMatchDetailContent), 하단 PrezelPlayer를 배치합니다. 확장 여부에 따라 상세 영역의 레이아웃 가중치와 표시 범위를 조절합니다. ScriptDetailList는 선택 탭 변경 시 스크롤을 리셋하고, sentenceDetails를 순회하며 SentenceAnalysisCard로 렌더링하거나 빈 상태 텍스트를 표시합니다.
문장 분석 카드 및 하이라이트
Prezel/feature/report/impl/accuracydetail/component/SentenceAnalysisCard.kt
SentenceAnalysisCard(detail, highlighted, ...)는 시작 시간, 상태 칩, 문장 텍스트를 렌더링합니다. highlightWordDetails 플래그에 따라 전체 텍스트를 단색으로 표시하거나 단어별 하이라이트(색상)를 적용합니다. 단어 하이라이트는 detail.wordDetails의 각 단어를 원문에서 인덱스로 찾아 buildAnnotatedStringwithStyle으로 구간별 색상을 적용합니다. WordAnalysisStatus 유틸 함수들이 마커 타입 변환, 텍스트색, 칩색, 상태 라벨을 제공합니다.
상단 앱바
Prezel/feature/report/impl/accuracydetail/component/AccuracyDetailTopAppBar.kt
feature_report_impl_section_accuracy 제목과 우측 취소 아이콘 버튼으로 구성되며, 클릭 시 onClose 콜백을 호출합니다.

UI 모델 및 데이터 매핑

계층 / 파일(들) 요약
UI 표현 모델
Prezel/feature/report/impl/accuracydetail/model/SentenceAnalysisUiModel.kt
SentenceAnalysisUiModel은 문장 텍스트, 상태, 피드백, 정확도, 시간, 단어 상세를 포함하며, isScriptMatchIssue, isSpeechAccuracyIssue, hasSpeechAccuracyStatus, scriptMatchStatus, speechAccuracyStatus 등 파생 속성을 제공합니다. WordAnalysisUiModel은 단어, 상태, 정확도, 시간을 담습니다. WordAnalysisStatus 확장 속성들이 상태를 분류하고, toUiModels() 매핑 함수가 도메인 모델을 UI 모델로 변환합니다.

네비게이션 통합

계층 / 파일(들) 요약
네비게이션 키 및 라우팅
Prezel/feature/report/impl/navigation/ReportInnerNavKey.kt, ReportEntryBuilder.kt
ReportInnerNavKey sealed interface에 공통 analysisResultId: Long 프로퍼티를 추가하고, 새로운 AccuracyDetail(analysisResultId, initialTab: AccuracyDetailTab) 데이터 클래스를 정의합니다. ReportEntryBuilder에서 accuracyDetailEntry()ReportInnerNavKey.AccuracyDetail 엔트리에 AccuracyDetailScreen을 구성하고, 네비게이션 함수 navigateToAccuracyDetail을 제공합니다.
리포트 화면 연결
Prezel/feature/report/impl/report/AnalysisReportScreen.kt, AnalysisReportViewModel.kt, component/*
AnalysisReportScreennavigateToSpeechAccuracy, navigateToScriptMatch 콜백 파라미터를 추가하고, NavigateToSpeechAccuracy / NavigateToScriptMatch effect를 처리하여 콜백을 호출합니다. 컴포저블 체인을 통해 onSpeechAccuracyClick, onScriptMatchClick 핸들러를 AccuracySection까지 전달합니다. AccuracyMetricCards의 두 카드에서 값이 존재할 때 활성화되고 콜백이 호출됩니다. AnalysisReportViewModel의 intent 핸들러에 ClickSpeechAccuracy, ClickScriptMatch 분기를 추가하고, 해당 effect를 발행하는 private 메서드를 제공합니다. MetricResultCardPrezelTouchArea 기반으로 변경되어 enabled 상태를 지원합니다.

지역화 문자열

계층 / 파일(들) 요약
UI 텍스트 리소스
Prezel/feature/report/impl/src/main/res/values/strings.xml
정확도 상세/대본 상세 관련 로드 실패, 빈 상태, 오디오 트랙, 상태 라벨 문자열 리소스를 추가합니다.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ 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%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 정확도 상세 화면과 대본 일치율 화면 구현이라는 주요 변경사항을 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명은 필수 섹션(작업 내용, 관련 이슈, 스크린샷)을 모두 포함하며 구체적인 변경사항과 스크린샷이 제공되고 있습니다.
Linked Issues check ✅ Passed PR 변경사항은 이슈 #121의 요구사항인 발화 정확도 화면과 대본 일치율 화면 구현을 완전히 충족하고 있습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 정확도 상세 화면 및 대본 일치율 화면 구현이라는 범위 내에서 이루어지고 있으며 불필요한 변경은 없습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 7

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

Inline comments:
In `@Prezel/core/model/build.gradle.kts`:
- Line 6: The build.gradle.kts currently declares
implementation(libs.kotlinx.collections.immutable) but PresentationWordDetail
(sentenceDetails/wordDetails) exposes ImmutableList in its public API, so either
the dependency must be published as api or the convention must be updated to
ensure api propagation; update the project as follows: (1) Decide whether the
module should expose ImmutableList - if yes, change implementation(...) to
api(libs.kotlinx.collections.immutable) in Prezel/core/model/build.gradle.kts;
(2) If the prezel.jvm.library convention does not configure apiElements (it
currently only applies org.jetbrains.kotlin.jvm), update the convention
(Prezel/build-logic/convention) to apply the java-library plugin or otherwise
configure API dependency propagation so api(...) has an effect; (3) After
updating the convention, switch implementation to api in build.gradle.kts and
run build to verify the ImmutableList type is available to consumers; if you
choose not to expose ImmutableList, instead make sentenceDetails/wordDetails use
internal/private types or map to public types so implementation scope remains
correct.

In
`@Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt`:
- Around line 202-213: initialItems is remembered only by markerSentenceDetails
while it depends on selectedTab too, causing stale markerType after tab
switches; update the remember call in AccuracyDetailScreen so it includes
selectedTab (e.g., remember(markerSentenceDetails, selectedTab) { ... }) so
PrezelPlayerItem.Marker mapping (using selectedTab to choose
speechAccuracyStatus.toMarkerType() vs scriptMatchStatus.toMarkerType()) is
recomputed when the tab changes.

In
`@Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/ScriptDetailList.kt`:
- Around line 42-54: The empty-state text is always using the speech-only string
even when selectedTab == SCRIPT_MATCH; update the branch in ScriptDetailList
(where sentenceDetails.isNotEmpty() is checked and
SentenceAnalysisCard/EmptyDetailText are used) to choose the EmptyDetailText
message based on selectedTab (e.g., use a when(selectedTab) to call
stringResource(R.string.feature_report_impl_script_detail_empty_speech) for
speech tab and the appropriate stringResource for SCRIPT_MATCH and any other
tabs), leaving the existing SentenceAnalysisCard usage (detail, highlighted,
showStatusChip, highlightWordDetails, status) unchanged.

In
`@Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/SentenceAnalysisCard.kt`:
- Around line 181-192: The UNKNOWN branch in WordAnalysisStatus.statusLabel()
currently returns the raw enum value (WordAnalysisStatus.UNKNOWN -> value);
change it to return a localized string resource instead (e.g.,
WordAnalysisStatus.UNKNOWN ->
stringResource(R.string.feature_report_impl_script_detail_status_unknown)), and
add the corresponding entry in strings.xml (and provide translations) so UNKNOWN
is shown via resources rather than the raw enum value.

In
`@Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/model/SentenceAnalysisUiModel.kt`:
- Around line 46-53: The mapping misclassifies MISPRONUNCIATION as a
script-match issue; update the two extension getters so MISPRONUNCIATION is
removed from WordAnalysisStatus.isScriptMatchIssue and added to
WordAnalysisStatus.isSpeechAccuracyIssue: change isScriptMatchIssue to only
include INSERTION and OMISSION, and change isSpeechAccuracyIssue to include
STUTTER and MISPRONUNCIATION (adjust the boolean expressions in the respective
getters).

In
`@Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/RemoteAudioPlaybackState.kt`:
- Around line 88-115: The preparePlayer() path can leak a MediaPlayer if an
exception is thrown before assigning the new instance to the mediaPlayer field;
modify RemoteAudioPlaybackState.preparePlayer so you create the MediaPlayer into
a local val (e.g., val player = MediaPlayer()), use that local for
setOnPreparedListener/setDataSource/prepareAsync/etc., and in the
runCatching.onFailure block call player.release() for that local instance (but
avoid releasing the field mediaPlayer which should only be released elsewhere);
after successful creation assign mediaPlayer = player as the current instance.

In `@Prezel/feature/report/impl/src/main/res/values/strings.xml`:
- Line 65: The empty-state text for the script tab is hard-coded to the
speech-only string feature_report_impl_script_detail_empty_speech; add a new
string resource (e.g., feature_report_impl_script_detail_empty_script with the
appropriate script-specific text) and update the UI logic in ScriptDetailList to
branch on the active tab type (script vs speech/mismatch tab) and select the
correct string resource (use feature_report_impl_script_detail_empty_script for
the script tab and keep feature_report_impl_script_detail_empty_speech for the
speech tab); ensure the code paths that currently reference
feature_report_impl_script_detail_empty_speech are replaced or conditionalized
to use the new key when the script tab is active.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c83b1150-1db5-4c3c-a9fc-7ada793f1272

📥 Commits

Reviewing files that changed from the base of the PR and between a740c18 and 7cd0ec7.

📒 Files selected for processing (28)
  • Prezel/core/data/build.gradle.kts
  • Prezel/core/data/src/main/java/com/team/prezel/core/data/mapper/PresentationMapper.kt
  • Prezel/core/model/build.gradle.kts
  • Prezel/core/model/src/main/java/com/team/prezel/core/model/presentation/PresentationWordDetail.kt
  • Prezel/core/network/src/main/java/com/team/prezel/core/network/model/presentation/PresentationWordDetailResponse.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailViewModel.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/RemoteAudioPlaybackState.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailTopAppBar.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/ScriptDetailList.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/SentenceAnalysisCard.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/contract/AccuracyDetailUiEffect.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/contract/AccuracyDetailUiIntent.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/contract/AccuracyDetailUiState.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/model/AccuracyDetailUiMessage.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/model/SentenceAnalysisUiModel.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportInnerNavKey.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportViewModel.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportScreenLayout.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/AccuracySection.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/common/ReportMetricCards.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/contract/AnalysisReportUiEffect.kt
  • Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/contract/AnalysisReportUiIntent.kt
  • Prezel/feature/report/impl/src/main/res/values/strings.xml

Comment thread Prezel/core/model/build.gradle.kts
Comment thread Prezel/feature/report/impl/src/main/res/values/strings.xml
- `WordAnalysisStatus.MISPRONUNCIATION`을 대본 일치 이슈에서 발음 정확도 이슈로 재분류
- 선택된 탭 종류에 따라 빈 화면 메시지가 다르게 표시되도록 `emptyDetailTextResId` 로직 추가
- `AccuracyDetailScreen`에서 탭 전환 시 플레이어 마커가 정상적으로 갱신되도록 `remember` 종속성 추가
- `WordAnalysisStatus.UNKNOWN` 상태에 하드코딩된 값 대신 문자열 리소스 적용
- `RemoteAudioPlaybackState`에서 `MediaPlayer` 초기화 실패 시 `release()`를 호출하여 자원 누수 방지 및 안정성 강화

@moondev03 moondev03 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

👍

@HamBeomJoon HamBeomJoon merged commit 6e79658 into develop Jun 18, 2026
2 checks passed
@HamBeomJoon HamBeomJoon deleted the feat/#121-report-script-match branch June 18, 2026 10:25
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.

발화 정확도 화면, 대본 일치율 화면 구현

2 participants