From 56f3afdf5554205cc6b0f78a7c6d673521514bf3 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Tue, 4 Aug 2026 19:30:24 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20AnalysisStepLayout=20=EB=82=B4=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EA=B7=B8=EB=A0=88=EC=8A=A4=20=EB=B0=94=20?= =?UTF-8?q?=EB=85=B8=EC=B6=9C=20=EC=A0=9C=EC=96=B4=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `AnalysisStepLayout`에 `showProgressBar` 파라미터를 추가하여 상단 프로그레스 바의 가시성을 선택적으로 조절할 수 있도록 개선 - `ScriptInputScreen`에서 `isHiddenOptions` 상태에 따라 프로그레스 바를 자동으로 숨기도록 연동 --- .../feature/analysis/impl/component/AnalysisStepLayout.kt | 5 ++++- .../prezel/feature/analysis/impl/script/ScriptInputScreen.kt | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt index e07cad1c..bef82339 100644 --- a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt +++ b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt @@ -45,6 +45,7 @@ internal fun AnalysisStepLayout( contentScrollable: Boolean = true, alwaysShowButtonAreaDivider: Boolean = false, isHiddenOptions: Boolean = false, + showProgressBar: Boolean = true, content: @Composable ColumnScope.() -> Unit, ) { val contentScrollState = rememberScrollState() @@ -79,7 +80,9 @@ internal fun AnalysisStepLayout( } } } - ProgressBar(progress = progress) + if (showProgressBar) { + ProgressBar(progress = progress) + } AnalysisStepContent( scrollState = contentScrollState, diff --git a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/script/ScriptInputScreen.kt b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/script/ScriptInputScreen.kt index 897ddfbc..ce758142 100644 --- a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/script/ScriptInputScreen.kt +++ b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/script/ScriptInputScreen.kt @@ -158,6 +158,7 @@ private fun ScriptInputScreen( onButtonClick = onNext, onBack = onBack, isHiddenOptions = isHiddenOptions, + showProgressBar = !isHiddenOptions, trailingText = stringResource(R.string.feature_analysis_impl_skip), onTrailingTextClick = onSkip, contentScrollable = false, From eb4f77374eadc6fd8aa9febed51521172490c284 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Tue, 4 Aug 2026 19:44:46 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=B6=84=EC=84=9D=20=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=20=ED=99=94=EB=A9=B4=20=ED=95=98=EB=8B=A8=20=EC=98=81?= =?UTF-8?q?=EC=97=AD=20=ED=82=A4=EB=B3=B4=EB=93=9C=20=ED=8C=A8=EB=94=A9=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `AnalysisStepBottomArea`의 `PrezelButtonArea`에 `advancedImePadding` 추가 - 키보드 활성화 시 버튼 영역의 레이아웃 대응 개선 --- .../feature/analysis/impl/component/AnalysisStepLayout.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt index bef82339..b710c9d0 100644 --- a/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt +++ b/Prezel/feature/analysis/impl/src/main/java/com/team/prezel/feature/analysis/impl/component/AnalysisStepLayout.kt @@ -26,6 +26,7 @@ import com.team.prezel.core.designsystem.component.actions.button.config.ButtonH import com.team.prezel.core.designsystem.component.actions.button.config.ButtonType import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.theme.PrezelTheme +import com.team.prezel.core.ui.util.advancedImePadding import com.team.prezel.feature.analysis.impl.R @OptIn(ExperimentalMaterial3Api::class) @@ -128,7 +129,9 @@ private fun AnalysisStepButtonArea( onSubButtonClick: (() -> Unit)?, ) { PrezelButtonArea( - modifier = Modifier.background(PrezelTheme.colors.bgRegular), + modifier = Modifier + .background(PrezelTheme.colors.bgRegular) + .advancedImePadding(), showBackground = showDivider, mainButton = { modifier -> PrezelButton( From a2efb196046ef7698b30393bd928669aa6166490 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Tue, 4 Aug 2026 19:52:51 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=EB=B0=9C=ED=99=94=20=EC=A0=95?= =?UTF-8?q?=ED=99=95=EB=8F=84=20=EC=83=81=EC=84=B8=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?BottomSheet=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EB=B0=8F?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `AccuracyDetailSheetPeekHeight` 상수를 정의하여 시트 높이 관리 일원화 - `BottomSheetScaffoldState` 확장 프로퍼티를 세분화하여 시트 전환 상태 및 확장 여부 판단 로직 개선 - 시트 확장 타겟 상태에 따라 상단 바(`AccuracyDetailTopAppBar`) 노출 여부를 제어하도록 수정 - `AccuracyDetailPlayerSheet` 내부 레이아웃 구조를 `Box`와 `weight` 기반으로 변경하여 가시성 및 배치 최적화 - `SentenceAnalysisCard` 내 불필요한 `heightIn` 제약 제거 및 매개변수 전달 방식 수정 --- .../accuracydetail/AccuracyDetailScreen.kt | 29 ++++++------ .../component/AccuracyDetailPlayerSheet.kt | 45 ++++++++++--------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt index fcf5354f..249beb3d 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/AccuracyDetailScreen.kt @@ -4,7 +4,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState @@ -39,6 +39,7 @@ import com.team.prezel.core.model.presentation.WordAnalysisStatus import com.team.prezel.core.ui.state.LocalSnackbarHostState import com.team.prezel.feature.report.impl.R import com.team.prezel.feature.report.impl.accuracydetail.component.AccuracyDetailPlayerSheet +import com.team.prezel.feature.report.impl.accuracydetail.component.AccuracyDetailSheetPeekHeight import com.team.prezel.feature.report.impl.accuracydetail.component.AccuracyDetailTopAppBar import com.team.prezel.feature.report.impl.accuracydetail.component.ScriptDetailList import com.team.prezel.feature.report.impl.accuracydetail.component.toMarkerType @@ -148,7 +149,8 @@ private fun AccuracyDetailScreenContent( } } val scaffoldState = rememberDetailScaffoldState(expandedSheet = expandedSheet) - val isSheetExpanded = scaffoldState.isSheetExpanded + val isSheetLayoutExpanded = scaffoldState.isSheetLayoutExpanded + val showTopBar = !scaffoldState.isSheetTargetExpanded PlaybackEffect( playerState = playerState, @@ -161,7 +163,8 @@ private fun AccuracyDetailScreenContent( selectedSentence = selectedSentence, sentenceDetails = sentenceDetails, playerState = playerState, - expanded = isSheetExpanded, + expanded = isSheetLayoutExpanded, + showTopBar = showTopBar, onClose = onClose, tabLabels = tabLabels, onClickTab = { index -> pagerState.requestScrollToPage(index) }, @@ -215,10 +218,14 @@ private fun rememberDetailScaffoldState(expandedSheet: Boolean): BottomSheetScaf ) @OptIn(ExperimentalMaterial3Api::class) -private val BottomSheetScaffoldState.isSheetExpanded: Boolean +private val BottomSheetScaffoldState.isSheetLayoutExpanded: Boolean get() = bottomSheetState.currentValue == SheetValue.Expanded || bottomSheetState.targetValue == SheetValue.Expanded +@OptIn(ExperimentalMaterial3Api::class) +private val BottomSheetScaffoldState.isSheetTargetExpanded: Boolean + get() = bottomSheetState.targetValue == SheetValue.Expanded + @Composable private fun PlaybackEffect( playerState: PrezelPlayerState, @@ -264,6 +271,7 @@ private fun AccuracyDetailScaffold( sentenceDetails: ImmutableList, playerState: PrezelPlayerState, expanded: Boolean, + showTopBar: Boolean, onClose: () -> Unit, tabLabels: ImmutableList, onClickTab: (Int) -> Unit, @@ -275,7 +283,7 @@ private fun AccuracyDetailScaffold( BottomSheetScaffold( modifier = Modifier.fillMaxSize(), scaffoldState = scaffoldState, - sheetPeekHeight = 276.dp, + sheetPeekHeight = AccuracyDetailSheetPeekHeight, sheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), sheetContainerColor = PrezelTheme.colors.solidWhite, sheetShadowElevation = if (expanded) 0.dp else 12.dp, @@ -286,14 +294,7 @@ private fun AccuracyDetailScaffold( sentenceDetails = sentenceDetails, playerState = playerState, expanded = expanded, - modifier = Modifier - .then( - if (expanded) { - Modifier.heightIn(max = expandedSheetMaxHeight) - } else { - Modifier - }, - ), + modifier = Modifier.height(expandedSheetMaxHeight), ) }, sheetDragHandle = null, @@ -304,7 +305,7 @@ private fun AccuracyDetailScaffold( .fillMaxSize() .padding(innerPadding), ) { - if (!expanded) { + if (showTopBar) { AccuracyDetailTopAppBar(onClose = onClose) } PrezelTabs( diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt index d559038d..29807110 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/accuracydetail/component/AccuracyDetailPlayerSheet.kt @@ -9,8 +9,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState @@ -45,6 +43,8 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +internal val AccuracyDetailSheetPeekHeight = 276.dp + @Composable internal fun AccuracyDetailPlayerSheet( selectedTab: AccuracyDetailTab, @@ -54,28 +54,29 @@ internal fun AccuracyDetailPlayerSheet( expanded: Boolean, modifier: Modifier = Modifier, ) { - Column( - modifier = modifier.then( - if (expanded) { + Box(modifier = modifier.fillMaxSize()) { + Column( + modifier = if (expanded) { Modifier.fillMaxSize() } else { - Modifier.fillMaxWidth() + Modifier + .fillMaxWidth() + .height(AccuracyDetailSheetPeekHeight) }, - ), - ) { - SheetHandle() - SheetDetailContent( - selectedTab = selectedTab, - selectedSentence = selectedSentence, - sentenceDetails = sentenceDetails, - expanded = expanded, - modifier = if (expanded) Modifier.weight(1f) else Modifier, - ) - PrezelPlayer( - state = playerState, - trackContentDescription = stringResource(R.string.feature_report_impl_script_detail_player_track_desc), - modifier = Modifier.navigationBarsPadding(), - ) + ) { + SheetHandle() + SheetDetailContent( + selectedTab = selectedTab, + selectedSentence = selectedSentence, + sentenceDetails = sentenceDetails, + expanded = expanded, + modifier = Modifier.weight(1f), + ) + PrezelPlayer( + state = playerState, + trackContentDescription = stringResource(R.string.feature_report_impl_script_detail_player_track_desc), + ) + } } } @@ -213,6 +214,7 @@ private fun SpeechDetailContent( SentenceAnalysisCard( detail = detail, highlighted = detail == highlightedDetail, + text = detail.mainFeedback, subText = detail.subFeedback.takeIf { expanded }, useStatusTextColor = false, status = detail.speechAccuracyStatus, @@ -261,7 +263,6 @@ private fun ScriptMatchDetailContent( SentenceAnalysisCard( detail = detail, highlighted = detail == highlightedDetail, - modifier = Modifier.heightIn(min = 104.dp), text = detail.mainFeedback, useStatusTextColor = false, status = detail.scriptMatchStatus,