From 310905fb58d514e23b16da6e6e4b2740fa0feace Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 16:23:56 +0900 Subject: [PATCH 1/7] =?UTF-8?q?chore/#130:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B6=80=EB=B6=84=EC=9D=B4=20=ED=82=A4=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=EC=97=90=20=EA=B0=80=EB=A0=A4=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../key/presentation/ui/login/LoginScreen.kt | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt index f8f3d517..4f04e6d5 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt @@ -1,5 +1,6 @@ package com.paw.key.presentation.ui.login +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -12,14 +13,22 @@ import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.relocation.BringIntoViewRequester +import androidx.compose.foundation.relocation.bringIntoViewRequester +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.vectorResource @@ -75,6 +84,7 @@ fun LoginRoute( ) } +@OptIn(ExperimentalFoundationApi::class) @Composable fun LoginScreen( paddingValues: PaddingValues, @@ -90,11 +100,17 @@ fun LoginScreen( isLoginFormValid: Boolean, modifier: Modifier = Modifier, ) { + val bringIntoViewRequester = remember { BringIntoViewRequester() } + val focusRequester = remember { FocusRequester() } + val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() + Column( modifier = modifier .fillMaxSize() .statusBarsPadding() .background(PawKeyTheme.colors.white1) + .verticalScroll(scrollState) ) { TopBar( title = "기존 계정으로 로그인", @@ -143,7 +159,7 @@ fun LoginScreen( suffix = { Icon( imageVector = ImageVector.vectorResource( - if (!isPasswordVisible) R.drawable.ic_eye_linear_gray_valid + if (isPasswordVisible) R.drawable.ic_eye_linear_gray_valid else R.drawable.ic_eye_linear_invalid ), contentDescription = null, @@ -151,6 +167,16 @@ fun LoginScreen( tint = PawKeyTheme.colors.gray200 ) }, + modifier = Modifier + .bringIntoViewRequester(bringIntoViewRequester) + .focusRequester(focusRequester) + .onFocusChanged { focusState -> + if (focusState.isFocused) { + coroutineScope.launch { + bringIntoViewRequester.bringIntoView() + } + } + }, ) } From 6525ea91ddac5b4ccd438a77a9344dc7d44736a4 Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 16:57:56 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat/#130:=20=EC=82=B0=EC=B1=85=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EB=93=B1=EB=A1=9D=20=EC=8B=A4=ED=8C=A8=20=EC=8B=9C?= =?UTF-8?q?=20Toast=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/entity/walkreview/WalkReviewRecordEntity.kt | 2 +- .../presentation/ui/course/walkreview/WalkReviewScreen.kt | 7 +++++++ .../ui/course/walkreview/viewmodel/WalkReviewViewModel.kt | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/paw/key/domain/model/entity/walkreview/WalkReviewRecordEntity.kt b/app/src/main/java/com/paw/key/domain/model/entity/walkreview/WalkReviewRecordEntity.kt index a5866769..e98c9f42 100644 --- a/app/src/main/java/com/paw/key/domain/model/entity/walkreview/WalkReviewRecordEntity.kt +++ b/app/src/main/java/com/paw/key/domain/model/entity/walkreview/WalkReviewRecordEntity.kt @@ -16,13 +16,13 @@ data class WalkReviewRecordEntity( title = title, description = description, isPublic = isPublic, - isMine = isMine, selectedCategories = categories.map { category -> SelectedCategoryDto( categoryId = category.categoryId, selectedOptionIds = category.selectedOptionIds ) }, + isMine = isMine, routeId = routeId, ) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt index 2ae4cb4f..01ac302a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt @@ -4,6 +4,7 @@ import android.Manifest import android.net.Uri import android.os.Build import android.util.Log +import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts @@ -29,6 +30,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -64,6 +66,7 @@ fun WalkReviewRoute( ) { val state by viewModel.state.collectAsStateWithLifecycle() val isValid = state.isValidForm + val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current @@ -111,6 +114,10 @@ fun WalkReviewRoute( sideEffect.message ) + is WalkReviewContract.WalkReviewSideEffect.SHowToastMessage -> { + Toast.makeText(context, sideEffect.message, Toast.LENGTH_SHORT).show() + } + is WalkReviewContract.WalkReviewSideEffect.NavigateNext -> { Log.d("WalkReviewRoute", "navigateNext") navigateShared(sideEffect.routeId, sideEffect.pageId) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt index ad9fe28d..c84a079e 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt @@ -75,8 +75,11 @@ class WalkReviewViewModel @Inject constructor( _sideEffect.emit(WalkReviewSideEffect.NavigateNext(response.routeId, response.postId)) Log.d("WalkReviewViewModel", "리뷰 전송 성공!") Log.d("WalkReviewViewModel", "routeId : ${response.routeId}, postId : ${response.postId}") - }.onFailure { + }.onFailure { respon -> + _sideEffect.emit(WalkReviewSideEffect.SHowToastMessage("${respon.message}")) _sideEffect.emit(WalkReviewSideEffect.ShowSnackBar("리뷰 전송 실패!")) + + Log.e("WalkReviewViewModel", "리뷰 전송 실패!") } } From 7a387de7dfdc749c012b8b0f6382cbaea37f7524 Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 16:58:15 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat/#130:=20=EC=82=AC=EC=A7=84=20=EC=BA=A1?= =?UTF-8?q?=EC=B2=98=20=EB=B2=84=EC=A0=84=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/course/walk/WalkCourseScreen.kt | 102 +++++++++++++++--- .../walkreview/state/WalkReviewContract.kt | 1 + 2 files changed, 90 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt index c5b425a2..9156ce58 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt @@ -10,8 +10,10 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import android.opengl.GLException import android.os.Build +import android.os.Handler import android.os.Looper import android.util.Log +import android.view.PixelCopy import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -308,7 +310,6 @@ fun WalkCourseRoute( onLabelClick = { _, _ -> }, currentUserLocation = state.currentLocation, poiPoints = if (isSharedWalk) { - //Todo : 여기 공유용 루트 좌표값용 listOf() } else { state.poiPoints @@ -613,7 +614,7 @@ fun WalkCourseScreen( .noRippleClickable { onStopTracking() } - .padding(horizontal = 24.dp, vertical = 16.dp), + .padding(horizontal = 28.dp, vertical = 16.dp), color = PawKeyTheme.colors.white1, style = PawKeyTheme.typography.body16Sb ) @@ -626,20 +627,95 @@ fun WalkCourseScreen( } fun captureMapToBitmap(surfaceView: GLSurfaceView, onCaptured: (Bitmap?) -> Unit) { - surfaceView.queueEvent { - val egl = EGLContext.getEGL() as EGL10 - val gl = egl.eglGetCurrentContext().gl as GL10 - - // 원하는 최종 크기를 먼저 계산 - val screenWidth = surfaceView.context.resources.displayMetrics.widthPixels - val contentWidth = (screenWidth - 32) - val targetHeight = (156 * surfaceView.context.resources.displayMetrics.density).toInt() - - val bitmap = createBitmapFromGLSurface(0, 0, surfaceView.width, surfaceView.height, gl) - onCaptured(bitmap) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + captureUsingPixelCopy(surfaceView, onCaptured) + } else { + surfaceView.queueEvent { + val egl = EGLContext.getEGL() as EGL10 + val gl = egl.eglGetCurrentContext().gl as GL10 + + val context = surfaceView.context + val density = context.resources.displayMetrics.density + val screenWidth = context.resources.displayMetrics.widthPixels + + val contentWidth = (screenWidth - 32) + val targetHeight = (156 * density).toInt() + + // OpenGL로 전체 비트맵 캡처 + val fullBitmap = createBitmapFromGLSurface(0, 0, surfaceView.width, surfaceView.height, gl) + + val croppedBitmap = fullBitmap?.let { bitmap -> + val centerX = bitmap.width / 2 + val centerY = bitmap.height / 2 + + val cropStartX = (centerX - contentWidth / 2).coerceAtLeast(0) + val cropStartY = (centerY - targetHeight / 2).coerceAtLeast(0) + + val safeWidth = minOf(contentWidth, bitmap.width - cropStartX) + val safeHeight = minOf(targetHeight, bitmap.height - cropStartY) + + Bitmap.createBitmap(bitmap, cropStartX, cropStartY, safeWidth, safeHeight) + } + + onCaptured(croppedBitmap) + } } } +@RequiresApi(Build.VERSION_CODES.O) +fun captureUsingPixelCopy( + surfaceView: GLSurfaceView, + onCaptured: (Bitmap?) -> Unit +) { + val rawBitmap = Bitmap.createBitmap(surfaceView.width, surfaceView.height, Bitmap.Config.ARGB_8888) + + try { + PixelCopy.request(surfaceView, rawBitmap, { copyResult -> + if (copyResult == PixelCopy.SUCCESS) { + val croppedBitmap = cropCenterWithAspectRatio(rawBitmap, 16f / 11f) + onCaptured(croppedBitmap) + } else { + Log.e("PixelCopy", "PixelCopy 실패: $copyResult") + onCaptured(null) + } + }, Handler(Looper.getMainLooper())) + } catch (e: IllegalArgumentException) { + e.printStackTrace() + onCaptured(null) + } +} + +fun cropCenterWithAspectRatio( + bitmap: Bitmap, + targetAspectRatio: Float +): Bitmap { + val width = bitmap.width + val height = bitmap.height + val currentAspectRatio = width.toFloat() / height.toFloat() + + val cropWidth: Int + val cropHeight: Int + + if (currentAspectRatio > targetAspectRatio) { + // 현재 이미지가 더 넓음 → 좌우 잘라야 함 + cropHeight = height + cropWidth = (height * targetAspectRatio).toInt() + } else { + // 현재 이미지가 더 높음 → 위아래 잘라야 함 + cropWidth = width + cropHeight = (width / targetAspectRatio).toInt() + } + + val startX = ((width - cropWidth) / 2).coerceAtLeast(0) + val startY = ((height - cropHeight) / 2).coerceAtLeast(0) + + val safeWidth = minOf(cropWidth, width - startX) + val safeHeight = minOf(cropHeight, height - startY) + + return Bitmap.createBitmap(bitmap, startX, startY, safeWidth, safeHeight) +} + + fun createBitmapFromGLSurface(x: Int, y: Int, w: Int, h: Int, gl: GL10): Bitmap? { val bitmapBuffer = IntArray(w * h) val bitmapSource = IntArray(w * h) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt index 2dd7bfcc..fee4731c 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt @@ -36,6 +36,7 @@ class WalkReviewContract { sealed class WalkReviewSideEffect { data class ShowSnackBar(val message: String) : WalkReviewSideEffect() + data class SHowToastMessage(val message: String) : WalkReviewSideEffect() data object NavigateUp: WalkReviewSideEffect() data class NavigateNext(val routeId : Int, val pageId : Int): WalkReviewSideEffect() } From 125ba09325eba926ce72af9561553d10c8c80e30 Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 17:16:34 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat/#130:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EB=8F=84=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=EB=B0=94=EB=A1=9C=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EB=A1=9C=20=ED=8F=AC=EC=BB=A4=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharedroute/SharedWalkCourseScreen.kt | 2 +- .../ui/course/walk/WalkCourseScreen.kt | 5 ++-- .../key/presentation/ui/login/LoginScreen.kt | 14 ++++++++++- .../ui/login/component/LoginTextField.kt | 24 ++++++++++++------- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/SharedWalkCourseScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/SharedWalkCourseScreen.kt index f7df779f..c01efc2e 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/SharedWalkCourseScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/SharedWalkCourseScreen.kt @@ -577,7 +577,7 @@ fun SharedWalkCourseScreen( color = PawKeyTheme.colors.green500, shape = RoundedCornerShape(8.dp) ) - .padding(horizontal = 28.dp, vertical = 16.dp), + .padding(horizontal = 24.dp, vertical = 16.dp), color = PawKeyTheme.colors.green500, style = PawKeyTheme.typography.body16Sb ) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt index 9156ce58..97e6a7e7 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/WalkCourseScreen.kt @@ -476,12 +476,11 @@ fun WalkCourseScreen( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - // Todo : 텍스트 스타일 24b로 변경 예쩡 if (!isSharedWalk) { Text( text = "산책이 중단되었어요!", textAlign = TextAlign.Center, - style = PawKeyTheme.typography.head22B, + style = PawKeyTheme.typography.head24B, color = PawKeyTheme.colors.white1, modifier = Modifier.fillMaxWidth() ) @@ -493,6 +492,7 @@ fun WalkCourseScreen( style = PawKeyTheme.typography.body16M, color = PawKeyTheme.colors.white2, modifier = Modifier.fillMaxWidth() + .padding(top = 12.dp) ) } else { Text( @@ -573,6 +573,7 @@ fun WalkCourseScreen( }, modifier = Modifier .padding(top = 16.dp) + .padding(bottom = 44.dp) ) } else { Row ( diff --git a/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt index 4f04e6d5..ea22b5c0 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/login/LoginScreen.kt @@ -16,6 +16,8 @@ import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.relocation.BringIntoViewRequester import androidx.compose.foundation.relocation.bringIntoViewRequester import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHostState @@ -32,6 +34,7 @@ import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -104,6 +107,7 @@ fun LoginScreen( val focusRequester = remember { FocusRequester() } val coroutineScope = rememberCoroutineScope() val scrollState = rememberScrollState() + val passwordFocusRequester = remember { FocusRequester() } Column( modifier = modifier @@ -139,7 +143,13 @@ fun LoginScreen( textValue = email, placeHolder = "사용하실 아이디를 입력해주세요", isPassword = true, - onTextChanged = onEmailChanged + onTextChanged = onEmailChanged, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions( + onNext = { + passwordFocusRequester.requestFocus() + } + ) ) Spacer(modifier = Modifier.height(40.dp)) @@ -156,6 +166,8 @@ fun LoginScreen( placeHolder = "사용하실 비밀번호를 입력해주세요", isPassword = isPasswordVisible, onTextChanged = onPasswordChanged, + focusRequester = passwordFocusRequester, + keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done), suffix = { Icon( imageVector = ImageVector.vectorResource( diff --git a/app/src/main/java/com/paw/key/presentation/ui/login/component/LoginTextField.kt b/app/src/main/java/com/paw/key/presentation/ui/login/component/LoginTextField.kt index e46c2b1c..d4f9093f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/login/component/LoginTextField.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/login/component/LoginTextField.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.LocalTextSelectionColors import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.material3.Text @@ -15,6 +17,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation @@ -22,6 +26,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.paw.key.core.designsystem.theme.PawKeyTheme + @Composable fun LoginTextField( textValue: String, @@ -29,7 +34,10 @@ fun LoginTextField( onTextChanged: (String) -> Unit, modifier: Modifier = Modifier, isPassword: Boolean = false, - suffix: @Composable (() -> Unit)? = null + suffix: @Composable (() -> Unit)? = null, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + focusRequester: FocusRequester? = null, ) { val customTextSelectionColors = TextSelectionColors( handleColor = PawKeyTheme.colors.green500, @@ -46,9 +54,12 @@ fun LoginTextField( singleLine = true, textStyle = PawKeyTheme.typography.body14R, visualTransformation = if (!isPassword) PasswordVisualTransformation() else VisualTransformation.None, + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + modifier = focusRequester?.let { modifier.focusRequester(it) } ?: modifier, decorationBox = { innerTextField -> Box( - modifier = modifier + modifier = Modifier .fillMaxWidth() .background( color = PawKeyTheme.colors.white1, @@ -63,13 +74,9 @@ fun LoginTextField( ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .fillMaxWidth() + modifier = Modifier.fillMaxWidth() ) { - Box( - modifier = Modifier - .weight(1f) - ) { + Box(modifier = Modifier.weight(1f)) { if (textValue.isEmpty()) { Text( text = placeHolder, @@ -89,7 +96,6 @@ fun LoginTextField( } - @Preview @Composable private fun LoginTextFieldPreview() { From 0da0585d6f10030c66cf9afe2cd92f85e3cfe474 Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 17:17:01 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat/#130:=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../key/presentation/ui/course/entire/tab/map/TapMapScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt index 2081d69d..693536ec 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt @@ -227,7 +227,7 @@ fun TapMapScreen( contentAlignment = Alignment.BottomCenter ) { Text( - text = "산책 기록 시작하기", + text = "산책 기록하기", color = PawKeyTheme.colors.white1, fontSize = 16.sp, modifier = Modifier From a75b9ec3388b7fa4ad245d35ac53c5c1fa24473e Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 17:17:32 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat/#130:=20=EC=84=9C=EB=B2=84=EC=97=90=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=ED=95=98=EA=B2=8C=20=EC=A2=8C=ED=91=9C?= =?UTF-8?q?=EA=B0=92=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD,=20?= =?UTF-8?q?=EC=B2=AB=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharedroute/component/sharedCourseMapView.kt | 16 ++++++++++++---- .../sharedroute/viewmodel/SharedWalkViewModel.kt | 2 +- .../ui/signup/viewmodel/SignUpViewModel.kt | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt index 6a13e05f..bd634640 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt @@ -247,20 +247,28 @@ fun sharedWalkCourseMapView( } } - LaunchedEffect(centerLabel, trackingManager) { + LaunchedEffect(isTrackingEnabled) { + kakaoMapState?.moveCamera( + CameraUpdateFactory.newCenterPosition( + currentUserLocation, 19 + ) + ) + } + + /*LaunchedEffect(centerLabel, trackingManager) { if (centerLabel != null && trackingManager != null) { trackingManager?.startTracking(centerLabel) } - } + }*/ LaunchedEffect(isPauseTracking) { if (!isPauseTracking) { - trackingManager?.stopTracking() + //trackingManager?.stopTracking() mapView.isClickable = false dimScreenLayer?.setColor(Color.Black.copy(alpha = 0.5f).toArgb()) dimScreenLayer?.setVisible(true) } else { - trackingManager?.stopTracking() + //trackingManager?.stopTracking() mapView.isClickable = true dimScreenLayer?.setVisible(false) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/viewmodel/SharedWalkViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/viewmodel/SharedWalkViewModel.kt index 1ec00c70..15236366 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/viewmodel/SharedWalkViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/viewmodel/SharedWalkViewModel.kt @@ -54,7 +54,7 @@ class SharedWalkCourseViewModel @Inject constructor( _state.update { state -> state.copy( poiPoints = it.geometry.coordinates.map { coord -> - LatLng.from(coord[0], coord[1]) + LatLng.from(coord[1], coord[0]) }.toPersistentList() ) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/signup/viewmodel/SignUpViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/signup/viewmodel/SignUpViewModel.kt index feba6c15..01e3b118 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/signup/viewmodel/SignUpViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/signup/viewmodel/SignUpViewModel.kt @@ -474,6 +474,7 @@ class SignUpViewModel @Inject constructor( _sideEffect.emit(SignUpContract.SignUpSideEffect.NavigateNext) }.onFailure { error -> Log.e("SignUpViewModel", "SignUp failed: ${error.message}") + Log.e("SignUpViewModel", "SignUp failed: ${request}") _sideEffect.emit(SignUpContract.SignUpSideEffect.ShowSnackBar("회원가입 실패: ${error.message}")) } } catch (e: Exception) { From 72ade44c7673b6a75c4f812a4bd2c062fdee8ec1 Mon Sep 17 00:00:00 2001 From: sonms Date: Fri, 18 Jul 2025 17:18:35 +0900 Subject: [PATCH 7/7] =?UTF-8?q?chore/#130:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EB=AC=B8=EC=A0=9C=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 --- .../java/com/paw/key/core/util/PreferenceDataStore.kt | 2 +- .../com/paw/key/presentation/ui/main/PawKeyNavHost.kt | 8 ++++---- .../presentation/ui/region/component/regionalMapView.kt | 3 --- .../presentation/ui/region/viewmodel/RegionViewModel.kt | 4 ---- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/paw/key/core/util/PreferenceDataStore.kt b/app/src/main/java/com/paw/key/core/util/PreferenceDataStore.kt index 4f215e9e..1daebdca 100644 --- a/app/src/main/java/com/paw/key/core/util/PreferenceDataStore.kt +++ b/app/src/main/java/com/paw/key/core/util/PreferenceDataStore.kt @@ -141,7 +141,7 @@ object PreferenceDataStore { } fun getUserId(): Flow = summaryStore.data.map { - it[USER_ID_KEY] ?: 0 + it[USER_ID_KEY] ?: 41 } fun getUserName(): Flow = summaryStore.data.map { diff --git a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt index 1c39591b..4e701e0b 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt @@ -206,7 +206,7 @@ fun PawKeyNavHost( ) archivedDetailNavGraph( - navigateUp = navigator::navigateUp, + navigateUp = navigator::navigateHome, navigateToSharedWalk = { routeId, pageId -> Log.e("navigateNext", "navigateNext : $routeId") navigator.navigateSharedWalkCourse( @@ -264,10 +264,10 @@ fun PawKeyNavHost( loginNavGraph( paddingValues = paddingValues, - navigateUp = navigator::navigateHome, - navigateNext = { + navigateUp = { navigator.navigateSignUpFlow() }, + navigateNext = navigator::navigateHome, snackBarHostState = snackbarHostState ) @@ -285,7 +285,7 @@ fun PawKeyNavHost( popUpTo(0) { inclusive = true } launchSingleTop = true } - navigator.navigateHome(navOptions = options) + navigator.navigateHome(options) } ) diff --git a/app/src/main/java/com/paw/key/presentation/ui/region/component/regionalMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/region/component/regionalMapView.kt index 33597462..f64e0af8 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/region/component/regionalMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/region/component/regionalMapView.kt @@ -53,9 +53,6 @@ fun regionalMapView( // ------------------------------------------------ // - - - DisposableEffect(lifeCycle) { val observer = object : DefaultLifecycleObserver { override fun onCreate(owner: LifecycleOwner) { diff --git a/app/src/main/java/com/paw/key/presentation/ui/region/viewmodel/RegionViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/region/viewmodel/RegionViewModel.kt index 9febc843..7f635194 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/region/viewmodel/RegionViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/region/viewmodel/RegionViewModel.kt @@ -34,10 +34,6 @@ class RegionViewModel @Inject constructor( fun getRegionGeometry(userId: Int, regionId: Int) = viewModelScope.launch { regionRepository.getRegionGeometry(userId, regionId) .onSuccess { data -> - Log.d("RegionViewModel", "API 응답 성공: $data") - Log.d("RegionViewModel", "geometry type: ${data.geometry.type}") - Log.d("RegionViewModel", "coordinates size: ${data.geometry.coordinates.size}") - val coordinates = data.geometry.coordinates val flattenedLatLng = flattenCoordinatesToLatLng(coordinates)