Skip to content

Commit 548886d

Browse files
committed
feat : 알람 시작 화면 수정 및 막차까지 남은시간 구현
1 parent cd09787 commit 548886d

File tree

5 files changed

+123
-81
lines changed

5 files changed

+123
-81
lines changed

presentation/src/main/java/com/stop/TimeConverter.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,12 @@ fun makeFullTime(time: String): Calendar {
2323
calendar.time = dateTime
2424

2525
return calendar
26+
}
27+
28+
fun convertTimeMillisToString(time: Long): String {
29+
val hours = (time / 1000) / 60 / 60 % 24
30+
val minutes = (time / 1000) / 60 % 60
31+
val seconds = (time / 1000) % 60
32+
33+
return String.format("%02d:%02d:%02d", hours, minutes, seconds)
2634
}

presentation/src/main/java/com/stop/ui/alarmsetting/AlarmSettingViewModel.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.stop.ui.alarmsetting
22

3+
import androidx.lifecycle.LiveData
34
import androidx.lifecycle.MutableLiveData
45
import androidx.lifecycle.ViewModel
56
import androidx.lifecycle.viewModelScope
@@ -8,10 +9,12 @@ import androidx.work.WorkManager
89
import androidx.work.workDataOf
910
import com.stop.AlarmFunctions
1011
import com.stop.LastTimeCheckWorker
12+
import com.stop.convertTimeMillisToString
1113
import com.stop.domain.model.alarm.AlarmUseCaseItem
1214
import com.stop.domain.usecase.alarm.DeleteAlarmUseCase
1315
import com.stop.domain.usecase.alarm.GetAlarmUseCase
1416
import com.stop.domain.usecase.alarm.SaveAlarmUseCase
17+
import com.stop.makeFullTime
1518
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
1619
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_TIME
1720
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.LAST_TIME
@@ -21,7 +24,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
2124
import kotlinx.coroutines.flow.StateFlow
2225
import kotlinx.coroutines.flow.collectLatest
2326
import kotlinx.coroutines.launch
24-
import java.util.UUID
27+
import java.util.*
2528
import javax.inject.Inject
2629

2730
@HiltViewModel
@@ -44,6 +47,9 @@ class AlarmSettingViewModel @Inject constructor(
4447

4548
private lateinit var workerId: UUID
4649

50+
private val _lastTimeCountDown = MutableLiveData("")
51+
val lastTimeCountDown: LiveData<String> = _lastTimeCountDown
52+
4753
fun saveAlarm(alarmUseCaseItem: AlarmUseCaseItem) {
4854
viewModelScope.launch(Dispatchers.IO) {
4955
saveAlarmUseCase.saveAlarm(alarmUseCaseItem.copy(alarmTime = alarmTime.value ?: 0, alarmMethod = alarmMethod))
@@ -68,7 +74,6 @@ class AlarmSettingViewModel @Inject constructor(
6874
}
6975

7076
fun callAlarm(time: String) {
71-
val time = "00:30:30"
7277
alarmFunctions.callAlarm(time, alarmTime.value ?: 0, ALARM_CODE)
7378
}
7479

@@ -94,4 +99,22 @@ class AlarmSettingViewModel @Inject constructor(
9499
workManager.cancelWorkById(workerId)
95100
}
96101

102+
fun startCountDownTimer() {
103+
val lastTimeMillis = makeFullTime(_alarmItem.value?.lastTime ?: "").timeInMillis
104+
val nowTimeMillis = System.currentTimeMillis()
105+
var diffTimeMillis = if (lastTimeMillis > nowTimeMillis) lastTimeMillis - nowTimeMillis else 0L
106+
107+
viewModelScope.launch(Dispatchers.IO) {
108+
var oldTimeMillis = System.currentTimeMillis()
109+
while (diffTimeMillis > 0L) {
110+
val delayMillis = System.currentTimeMillis() - oldTimeMillis
111+
if (delayMillis == 1000L) {
112+
diffTimeMillis -= delayMillis
113+
_lastTimeCountDown.postValue(convertTimeMillisToString(diffTimeMillis))
114+
oldTimeMillis = System.currentTimeMillis()
115+
}
116+
}
117+
}
118+
}
119+
97120
}

presentation/src/main/java/com/stop/ui/alarmstart/AlarmStartFragment.kt

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,25 @@ class AlarmStartFragment : Fragment() {
3535
return binding.root
3636
}
3737

38-
private fun initBinding(){
38+
private fun initBinding() {
3939
binding.apply {
4040
alarmSettingViewModel.getAlarm()
41+
alarmSettingViewModel.startCountDownTimer()
4142
lifecycleOwner = viewLifecycleOwner
4243
viewModel = alarmSettingViewModel
44+
fragment = this@AlarmStartFragment
4345
}
4446
}
4547

46-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
47-
super.onViewCreated(view, savedInstanceState)
48-
49-
listenButton()
48+
fun clickAlarmTurnOff() {
49+
turnOffSoundService()
50+
alarmSettingViewModel.deleteAlarm()
51+
requireActivity().finish()
5052
}
5153

52-
private fun listenButton() {
53-
with(binding) {
54-
buttonAlarmTurnOff.setOnClickListener {
55-
turnOffSoundService()
56-
alarmSettingViewModel.deleteAlarm()
57-
//alarmSettingViewModel.removeAlarmWorker()
58-
requireActivity().finish()
59-
}
60-
61-
textViewMissionStart.setOnClickListener {
62-
turnOffSoundService()
63-
root.findNavController().navigate(R.id.action_alarmStartFragment_to_missionFragment)
64-
alarmSettingViewModel.deleteAlarm()
65-
//alarmSettingViewModel.removeAlarmWorker()
66-
}
67-
}
54+
fun clickMissionStart() {
55+
turnOffSoundService()
56+
binding.root.findNavController().navigate(R.id.action_alarmStartFragment_to_missionFragment)
6857
}
6958

7059
private fun turnOffSoundService() {

presentation/src/main/res/layout/fragment_alarm_start.xml

Lines changed: 79 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
name="viewModel"
1010
type="com.stop.ui.alarmsetting.AlarmSettingViewModel" />
1111

12+
<variable
13+
name="fragment"
14+
type="com.stop.ui.alarmstart.AlarmStartFragment" />
15+
1216
</data>
1317

1418
<androidx.constraintlayout.widget.ConstraintLayout
@@ -38,96 +42,113 @@
3842
android:orientation="horizontal"
3943
app:layout_constraintGuide_begin="35dp" />
4044

41-
<TextView
42-
android:id="@+id/text_view_start_position"
45+
<View
46+
android:id="@+id/view_top"
4347
android:layout_width="0dp"
44-
android:layout_height="wrap_content"
45-
android:background="@drawable/background_gray_d9_8"
46-
android:ellipsize="end"
47-
android:maxLines="1"
48-
android:padding="8dp"
49-
android:text="@{@string/start_position_text(viewModel.alarmItem.startPosition)}"
50-
android:textColor="@color/black"
51-
android:textSize="24sp"
52-
android:textStyle="bold"
48+
android:layout_height="120dp"
49+
android:background="@color/main_dark_grey"
50+
app:layout_constraintEnd_toEndOf="parent"
51+
app:layout_constraintStart_toStartOf="parent"
52+
app:layout_constraintTop_toTopOf="parent" />
53+
54+
<View
55+
android:id="@+id/view_search"
56+
android:layout_width="0dp"
57+
android:layout_height="50dp"
58+
android:layout_marginBottom="15dp"
59+
android:background="@drawable/background_search"
60+
app:layout_constraintBottom_toBottomOf="@id/view_top"
5361
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
54-
app:layout_constraintStart_toStartOf="@id/guide_line_start"
55-
app:layout_constraintTop_toTopOf="@id/guideline_top" />
62+
app:layout_constraintStart_toStartOf="@id/guide_line_start" />
5663

5764
<TextView
58-
android:id="@+id/text_view_end_position"
65+
android:id="@+id/text_view_start_position"
5966
android:layout_width="0dp"
60-
android:layout_height="wrap_content"
61-
android:layout_marginTop="8dp"
62-
android:background="@drawable/background_gray_d9_8"
67+
android:layout_height="0dp"
68+
android:layout_marginStart="10dp"
69+
android:layout_marginEnd="5dp"
6370
android:ellipsize="end"
71+
android:gravity="center"
6472
android:maxLines="1"
65-
android:padding="8dp"
66-
android:text="@{@string/end_position_text(viewModel.alarmItem.endPosition)}"
67-
android:textColor="@color/black"
68-
android:textSize="24sp"
69-
android:textStyle="bold"
70-
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
71-
app:layout_constraintStart_toStartOf="@id/guide_line_start"
72-
app:layout_constraintTop_toBottomOf="@id/text_view_start_position" />
73+
android:text="@{viewModel.alarmItem.startPosition}"
74+
android:textColor="@color/main_light_grey"
75+
android:textSize="17sp"
76+
app:layout_constraintBottom_toBottomOf="@id/view_search"
77+
app:layout_constraintEnd_toStartOf="@id/image_view_arrow_right"
78+
app:layout_constraintStart_toStartOf="@id/view_search"
79+
app:layout_constraintTop_toTopOf="@id/view_search"
80+
tools:text="출발지" />
81+
82+
<ImageView
83+
android:id="@+id/image_view_arrow_right"
84+
android:layout_width="wrap_content"
85+
android:layout_height="wrap_content"
86+
app:layout_constraintBottom_toBottomOf="@id/view_search"
87+
app:layout_constraintEnd_toEndOf="@id/view_search"
88+
app:layout_constraintStart_toStartOf="@id/view_search"
89+
app:layout_constraintTop_toTopOf="@id/view_search"
90+
app:srcCompat="@drawable/ic_arrow_right" />
7391

7492
<TextView
75-
android:id="@+id/text_view_last_time"
93+
android:id="@+id/text_view_end_position"
7694
android:layout_width="0dp"
77-
android:layout_height="wrap_content"
78-
android:layout_marginTop="8dp"
79-
android:background="@drawable/background_gray_d9_8"
95+
android:layout_height="0dp"
96+
android:layout_marginStart="5dp"
97+
android:layout_marginEnd="10dp"
8098
android:ellipsize="end"
99+
android:gravity="center"
81100
android:maxLines="1"
82-
android:padding="8dp"
83-
android:text="@{@string/last_time_text(viewModel.alarmItem.lastTime)}"
84-
android:textColor="@color/black"
85-
android:textSize="24sp"
86-
android:textStyle="bold"
87-
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
88-
app:layout_constraintStart_toStartOf="@id/guide_line_start"
89-
app:layout_constraintTop_toBottomOf="@id/text_view_end_position" />
101+
android:text="@{viewModel.alarmItem.endPosition}"
102+
android:textColor="@color/main_light_grey"
103+
android:textSize="17sp"
104+
app:layout_constraintBottom_toBottomOf="@id/view_search"
105+
app:layout_constraintEnd_toEndOf="@id/view_search"
106+
app:layout_constraintStart_toEndOf="@id/image_view_arrow_right"
107+
app:layout_constraintTop_toTopOf="@id/view_search"
108+
tools:text="도착지" />
90109

91110
<TextView
92-
android:id="@+id/text_view_walk_time"
93-
android:layout_width="0dp"
111+
android:id="@+id/text_view_left_time"
112+
android:layout_width="wrap_content"
94113
android:layout_height="wrap_content"
95-
android:layout_marginTop="8dp"
96-
android:background="@drawable/background_gray_d9_8"
97-
android:ellipsize="end"
98-
android:maxLines="1"
99-
android:padding="8dp"
100-
android:text="@{@string/walk_time_text(viewModel.alarmItem.walkTime)}"
101-
android:textColor="@color/black"
102-
android:textSize="24sp"
114+
android:text="@{viewModel.lastTimeCountDown}"
115+
android:textColor="@color/main_dark_grey"
116+
android:textSize="60sp"
103117
android:textStyle="bold"
118+
app:layout_constraintBottom_toTopOf="@id/text_view_mission_start"
104119
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
105120
app:layout_constraintStart_toStartOf="@id/guide_line_start"
106-
app:layout_constraintTop_toBottomOf="@id/text_view_last_time" />
121+
app:layout_constraintTop_toBottomOf="@id/view_top"
122+
tools:text="23:23:23" />
107123

108124
<TextView
109125
android:id="@+id/text_view_mission_start"
110-
android:layout_width="180dp"
111-
android:layout_height="180dp"
112-
android:background="@drawable/selector_mission_start_button"
126+
android:layout_width="0dp"
127+
android:layout_height="wrap_content"
128+
android:layout_marginBottom="12dp"
129+
android:background="@color/main_dark_grey"
113130
android:gravity="center"
131+
android:onClick="@{() -> fragment.clickMissionStart()}"
132+
android:padding="10dp"
114133
android:text="@string/mission_start"
115-
android:textColor="@color/black"
116-
android:textSize="36sp"
134+
android:textColor="@color/white"
135+
android:textSize="24sp"
117136
android:textStyle="bold"
118137
app:layout_constraintBottom_toTopOf="@id/button_alarm_turn_off"
119138
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
120-
app:layout_constraintStart_toStartOf="@id/guide_line_start"
121-
app:layout_constraintTop_toBottomOf="@id/text_view_walk_time" />
139+
app:layout_constraintStart_toStartOf="@id/guide_line_start" />
122140

123-
<com.google.android.material.button.MaterialButton
141+
<TextView
124142
android:id="@+id/button_alarm_turn_off"
125-
style="@style/Widget.Material3.Button.OutlinedButton"
126143
android:layout_width="0dp"
127144
android:layout_height="wrap_content"
128145
android:layout_marginBottom="24dp"
146+
android:background="@color/red"
147+
android:gravity="center"
148+
android:onClick="@{()->fragment.clickAlarmTurnOff()}"
149+
android:padding="10dp"
129150
android:text="@string/alarm_turn_off_text"
130-
android:textColor="@color/black"
151+
android:textColor="@color/white"
131152
android:textSize="24sp"
132153
android:textStyle="bold"
133154
app:layout_constraintBottom_toBottomOf="parent"

presentation/src/main/res/values/colors.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919
<color name="transparent">#00FFFFFF</color>
2020
<color name="hint_text_color">#808590</color>
2121
<color name="blue">#2196F3</color>
22+
<color name="red">#F44336</color>
2223
</resources>

0 commit comments

Comments
 (0)