@@ -3,8 +3,10 @@ package com.project200.feature.timer
33import android.graphics.Color
44import android.view.View
55import android.view.WindowManager
6+ import android.widget.EditText
67import androidx.core.graphics.drawable.toDrawable
78import com.project200.presentation.base.BaseDialogFragment
9+ import com.project200.presentation.utils.TimeEditTextLimiter.addRangeLimit
810import com.project200.undabang.feature.timer.R
911import com.project200.undabang.feature.timer.databinding.DialogTimePickerBinding
1012import dagger.hilt.android.AndroidEntryPoint
@@ -14,28 +16,29 @@ import java.util.Locale
1416class TimePickerDialog (
1517 private val initialTime : Int? = null ,
1618 private val onTimeSelected : (Int ) -> Unit ,
17- ) :
18- BaseDialogFragment <DialogTimePickerBinding >(R .layout.dialog_time_picker) {
19+ ) : BaseDialogFragment<DialogTimePickerBinding>(R .layout.dialog_time_picker) {
1920 override fun getViewBinding (view : View ): DialogTimePickerBinding {
2021 return DialogTimePickerBinding .bind(view)
2122 }
2223
2324 override fun setupViews () {
2425 super .setupViews()
2526
27+ // 다이얼로그 가로 너비 및 배경 투명화 설정
2628 dialog?.window?.let { window ->
2729 val screenWidth = resources.displayMetrics.widthPixels
2830 val desiredWidth = (screenWidth * 0.85 ).toInt()
2931 window.setLayout(desiredWidth, WindowManager .LayoutParams .WRAP_CONTENT )
3032 window.setBackgroundDrawable(Color .TRANSPARENT .toDrawable())
3133 }
3234
33- setupTimePickers()
35+ setupTimeInputs()
36+ setupFocusAndRangeListeners()
3437
3538 binding.confirmBtn.setOnClickListener {
36- // NumberPicker에서 선택된 분과 초를 가져옵니다.
37- val minutes = binding.minutePicker.value
38- val seconds = binding.secondPicker.value
39+ // 빈 칸일 경우 0으로 처리, 범위 재확인
40+ val minutes = ( binding.minuteEt.text.toString().toIntOrNull() ? : 0 ).coerceIn( 0 , 59 )
41+ val seconds = ( binding.secondEt.text.toString().toIntOrNull() ? : 0 ).coerceIn( 0 , 59 )
3942 val totalTimeInSeconds = (minutes * 60 ) + seconds
4043
4144 onTimeSelected(totalTimeInSeconds)
@@ -47,22 +50,43 @@ class TimePickerDialog(
4750 }
4851 }
4952
50- private fun setupTimePickers () {
51- binding.minutePicker.apply {
52- minValue = 0
53- maxValue = 59 // 최대 59분
54- value = initialTime?.div(60 ) ? : 0 // 초기값이 null인 경우 0으로 설정
55- setFormatter { String .format(Locale .KOREA , " %02d" , it) }
56- }
53+ private fun setupTimeInputs () {
54+ // 초 단위를 분과 초로 계산하여 초기값 설정
55+ val minutes = initialTime?.div(60 ) ? : 0
56+ val seconds = initialTime?.rem(60 ) ? : 0
5757
58- binding.secondPicker.apply {
59- minValue = 0
60- maxValue = 59 // 최대 59초
61- value = initialTime?.rem(60 ) ? : 0 // 초기값이 null인 경우 0으로 설정
62- setFormatter { String .format(Locale .KOREA , " %02d" , it) }
63- }
58+ binding.minuteEt.setText(String .format(Locale .KOREA , " %02d" , minutes))
59+ binding.secondEt.setText(String .format(Locale .KOREA , " %02d" , seconds))
6460 }
6561
66- companion object {
62+ private fun setupFocusAndRangeListeners () {
63+ // 1. 포커스 상태에 따른 배경 및 포맷팅 처리
64+ val focusChangeListener =
65+ View .OnFocusChangeListener { view, hasFocus ->
66+ if (view is EditText ) {
67+ if (hasFocus) {
68+ // 포커스 얻었을 때: 배경 적용 및 텍스트 전체 선택
69+ view.setBackgroundResource(com.project200.undabang.presentation.R .drawable.bg_solid_corner)
70+ view.selectAll()
71+ } else {
72+ // 포커스 잃었을 때: 배경 제거 및 00~59 보정 후 포맷팅
73+ view.setBackgroundResource(0 )
74+ val input = view.text.toString().toIntOrNull() ? : 0
75+ val clamped = input.coerceIn(0 , 59 )
76+ view.setText(String .format(Locale .KOREA , " %02d" , clamped))
77+ }
78+ }
79+ }
80+
81+ binding.minuteEt.onFocusChangeListener = focusChangeListener
82+ binding.secondEt.onFocusChangeListener = focusChangeListener
83+
84+ // 실시간 입력 범위 제한 (0~59)
85+ binding.minuteEt.addRangeLimit(59 )
86+ binding.secondEt.addRangeLimit(59 )
87+
88+ // 초기 상태 배경 제거
89+ binding.minuteEt.setBackgroundResource(0 )
90+ binding.secondEt.setBackgroundResource(0 )
6791 }
6892}
0 commit comments