Skip to content

Commit b8dac13

Browse files
committed
feat : 홈 화면 바텀시트 구현 완료
1 parent 763fc8d commit b8dac13

File tree

8 files changed

+212
-44
lines changed

8 files changed

+212
-44
lines changed

data/src/main/java/com/stop/data/local/source/alarm/AlarmLocalDataSourceImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ internal class AlarmLocalDataSourceImpl @Inject constructor(
2828

2929
override suspend fun deleteAlarm() {
3030
context.datastore.edit { preferences ->
31-
preferences.remove(ALARM)
31+
preferences.clear()
3232
}
3333
}
3434

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ class SoundService : LifecycleService() {
6161
}
6262
}
6363
}
64-
65-
deleteAlarmUseCase.deleteAlarm()
6664
}
6765
}
6866

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
66
import com.stop.domain.model.alarm.AlarmUseCaseItem
7+
import com.stop.domain.usecase.alarm.DeleteAlarmUseCase
78
import com.stop.domain.usecase.alarm.GetAlarmUseCase
89
import com.stop.domain.usecase.alarm.SaveAlarmUseCase
910
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -17,7 +18,8 @@ import javax.inject.Inject
1718
@HiltViewModel
1819
class AlarmSettingViewModel @Inject constructor(
1920
private val saveAlarmUseCase: SaveAlarmUseCase,
20-
private val getAlarmUseCase: GetAlarmUseCase
21+
private val getAlarmUseCase: GetAlarmUseCase,
22+
private val deleteAlarmUseCase: DeleteAlarmUseCase
2123
) : ViewModel() {
2224

2325
val alarmTime = MutableLiveData(0)
@@ -45,4 +47,10 @@ class AlarmSettingViewModel @Inject constructor(
4547
}
4648
}
4749

50+
fun deleteAlarm(){
51+
viewModelScope.launch(Dispatchers.IO){
52+
deleteAlarmUseCase.deleteAlarm()
53+
}
54+
}
55+
4856
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,14 @@ class AlarmStartFragment : Fragment() {
5353
with(binding) {
5454
buttonAlarmTurnOff.setOnClickListener {
5555
turnOffSoundService()
56+
alarmSettingViewModel.deleteAlarm()
57+
requireActivity().finish()
5658
}
5759

5860
textViewMissionStart.setOnClickListener {
5961
turnOffSoundService()
6062
root.findNavController().navigate(R.id.action_alarmStartFragment_to_missionFragment)
63+
alarmSettingViewModel.deleteAlarm()
6164
}
6265
}
6366
}

presentation/src/main/java/com/stop/ui/map/MapFragment.kt

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.stop.ui.map
22

33
import android.Manifest.permission
44
import android.os.Bundle
5-
import android.util.TypedValue
65
import android.view.LayoutInflater
76
import android.view.View
87
import android.view.ViewGroup
@@ -39,6 +38,7 @@ class MapFragment : Fragment(), MapHandler {
3938
savedInstanceState: Bundle?
4039
): View {
4140
_binding = FragmentMapBinding.inflate(inflater, container, false)
41+
4242
initBinding()
4343

4444
return binding.root
@@ -47,11 +47,11 @@ class MapFragment : Fragment(), MapHandler {
4747
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4848
super.onViewCreated(view, savedInstanceState)
4949

50-
alarmViewModel.getAlarm()
5150
initTMap()
5251
initView()
5352
initNavigateAction()
5453
initBottomSheetBehavior()
54+
listenButtonClick()
5555
}
5656

5757
override fun alertTMapReady() {
@@ -128,14 +128,35 @@ class MapFragment : Fragment(), MapHandler {
128128
private fun initBottomSheetBehavior() {
129129
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
130130

131-
alarmViewModel.isAlarmItemNotNull.asLiveData().observe(viewLifecycleOwner) { isBottomSheetVisible ->
132-
if (isBottomSheetVisible) {
133-
behavior.state = BottomSheetBehavior.STATE_EXPANDED
134-
behavior.maxHeight = convertDpToPx(200)
135-
} else {
136-
behavior.maxHeight = convertDpToPx(100)
137-
}
131+
alarmViewModel.getAlarm()
132+
133+
alarmViewModel.isAlarmItemNotNull.asLiveData().observe(viewLifecycleOwner){
134+
behavior.isDraggable = it
138135
}
136+
137+
behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
138+
override fun onStateChanged(bottomSheet: View, newState: Int) {
139+
when (newState) {
140+
BottomSheetBehavior.STATE_EXPANDED -> {
141+
binding.homeBottomSheet.layoutStateExpanded.root.visibility = View.VISIBLE
142+
binding.homeBottomSheet.textViewAlarmState.visibility = View.GONE
143+
binding.homeBottomSheet.homeBottomSheetDragHandle.visibility = View.GONE
144+
}
145+
BottomSheetBehavior.STATE_COLLAPSED -> {
146+
binding.homeBottomSheet.layoutStateExpanded.root.visibility = View.GONE
147+
binding.homeBottomSheet.textViewAlarmState.visibility = View.VISIBLE
148+
binding.homeBottomSheet.homeBottomSheetDragHandle.visibility = View.VISIBLE
149+
}
150+
BottomSheetBehavior.STATE_HALF_EXPANDED -> Unit
151+
BottomSheetBehavior.STATE_DRAGGING -> Unit
152+
BottomSheetBehavior.STATE_SETTLING -> Unit
153+
BottomSheetBehavior.STATE_HIDDEN -> Unit
154+
}
155+
}
156+
157+
override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit
158+
159+
})
139160
}
140161

141162
private fun addBookmarkMarker() {
@@ -210,12 +231,12 @@ class MapFragment : Fragment(), MapHandler {
210231
}
211232
}
212233

213-
private fun convertDpToPx(dp: Int): Int {
214-
return TypedValue.applyDimension(
215-
TypedValue.COMPLEX_UNIT_DIP,
216-
dp.toFloat(),
217-
resources.displayMetrics
218-
).toInt()
234+
private fun listenButtonClick(){
235+
binding.homeBottomSheet.layoutStateExpanded.buttonAlarmTurnOff.setOnClickListener {
236+
alarmViewModel.deleteAlarm()
237+
val behavior = BottomSheetBehavior.from(binding.layoutHomeBottomSheet)
238+
behavior.state = BottomSheetBehavior.STATE_COLLAPSED
239+
}
219240
}
220241

221242
override fun onDestroyView() {
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<data>
7+
8+
<variable
9+
name="viewModel"
10+
type="com.stop.ui.alarmsetting.AlarmSettingViewModel" />
11+
12+
</data>
13+
14+
<androidx.constraintlayout.widget.ConstraintLayout
15+
android:layout_width="match_parent"
16+
android:layout_height="match_parent"
17+
tools:context=".ui.alarmstart.AlarmStartFragment"
18+
tools:theme="@style/Theme.Material3.Light.NoActionBar">
19+
20+
<androidx.constraintlayout.widget.Guideline
21+
android:id="@+id/guide_line_start"
22+
android:layout_width="wrap_content"
23+
android:layout_height="wrap_content"
24+
android:orientation="vertical"
25+
app:layout_constraintGuide_begin="16dp" />
26+
27+
<androidx.constraintlayout.widget.Guideline
28+
android:id="@+id/guide_line_end"
29+
android:layout_width="wrap_content"
30+
android:layout_height="wrap_content"
31+
android:orientation="vertical"
32+
app:layout_constraintGuide_end="16dp" />
33+
34+
<androidx.constraintlayout.widget.Guideline
35+
android:id="@+id/guideline_top"
36+
android:layout_width="wrap_content"
37+
android:layout_height="wrap_content"
38+
android:orientation="horizontal"
39+
app:layout_constraintGuide_begin="35dp" />
40+
41+
<TextView
42+
android:id="@+id/text_view_start_position"
43+
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"
53+
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" />
56+
57+
<TextView
58+
android:id="@+id/text_view_end_position"
59+
android:layout_width="0dp"
60+
android:layout_height="wrap_content"
61+
android:layout_marginTop="8dp"
62+
android:background="@drawable/background_gray_d9_8"
63+
android:ellipsize="end"
64+
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+
74+
<TextView
75+
android:id="@+id/text_view_last_time"
76+
android:layout_width="0dp"
77+
android:layout_height="wrap_content"
78+
android:layout_marginTop="8dp"
79+
android:background="@drawable/background_gray_d9_8"
80+
android:ellipsize="end"
81+
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" />
90+
91+
<TextView
92+
android:id="@+id/text_view_walk_time"
93+
android:layout_width="0dp"
94+
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"
103+
android:textStyle="bold"
104+
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
105+
app:layout_constraintStart_toStartOf="@id/guide_line_start"
106+
app:layout_constraintTop_toBottomOf="@id/text_view_last_time" />
107+
108+
<TextView
109+
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"
113+
android:gravity="center"
114+
android:text="@string/mission_start"
115+
android:textColor="@color/black"
116+
android:textSize="36sp"
117+
android:textStyle="bold"
118+
app:layout_constraintBottom_toTopOf="@id/button_alarm_turn_off"
119+
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" />
122+
123+
<com.google.android.material.button.MaterialButton
124+
android:id="@+id/button_alarm_turn_off"
125+
style="@style/Widget.Material3.Button.OutlinedButton"
126+
android:layout_width="0dp"
127+
android:layout_height="wrap_content"
128+
android:layout_marginBottom="24dp"
129+
android:text="@string/alarm_delete_text"
130+
android:textColor="@color/black"
131+
android:textSize="24sp"
132+
android:textStyle="bold"
133+
app:layout_constraintBottom_toBottomOf="parent"
134+
app:layout_constraintEnd_toEndOf="@id/guide_line_end"
135+
app:layout_constraintStart_toStartOf="@id/guide_line_start" />
136+
137+
</androidx.constraintlayout.widget.ConstraintLayout>
138+
139+
</layout>

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

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3-
xmlns:app="http://schemas.android.com/apk/res-auto">
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:bind="http://schemas.android.com/apk/res-auto">
45

56
<data>
6-
<import type="android.view.View"/>
77

88
<variable
99
name="alarmViewModel"
@@ -21,32 +21,29 @@
2121
android:layout_height="5dp"
2222
android:layout_marginTop="17dp"
2323
android:background="@drawable/background_panel"
24-
app:layout_constraintStart_toStartOf="parent"
2524
app:layout_constraintEnd_toEndOf="parent"
25+
app:layout_constraintStart_toStartOf="parent"
2626
app:layout_constraintTop_toTopOf="parent" />
2727

28-
<androidx.constraintlayout.widget.ConstraintLayout
29-
android:id="@+id/home_bottom_sheet_no_alarm"
30-
android:layout_width="match_parent"
28+
<TextView
29+
android:id="@+id/text_view_alarm_state"
30+
android:layout_width="wrap_content"
3131
android:layout_height="wrap_content"
32-
android:visibility="@{alarmViewModel.isAlarmItemNotNull() ? View.GONE : View.VISIBLE}"
33-
app:layout_constraintTop_toBottomOf="@id/home_bottom_sheet_drag_handle">
34-
35-
<TextView
36-
android:id="@+id/textView"
37-
android:layout_width="wrap_content"
38-
android:layout_height="wrap_content"
39-
android:layout_marginTop="25dp"
40-
android:layout_marginBottom="25dp"
41-
android:text="@string/no_alarm"
42-
android:textColor="#808590"
43-
android:textSize="15sp"
44-
app:layout_constraintEnd_toEndOf="parent"
45-
app:layout_constraintStart_toStartOf="parent"
46-
app:layout_constraintTop_toTopOf="parent"
47-
app:layout_constraintBottom_toBottomOf="parent"/>
48-
49-
</androidx.constraintlayout.widget.ConstraintLayout>
32+
android:layout_marginTop="25dp"
33+
android:layout_marginBottom="25dp"
34+
android:text="@{alarmViewModel.isAlarmItemNotNull ? @string/exist_alarm : @string/non_exist_alarm}"
35+
android:textColor="#808590"
36+
android:textSize="15sp"
37+
app:layout_constraintEnd_toEndOf="parent"
38+
app:layout_constraintStart_toStartOf="parent"
39+
android:visibility="visible"
40+
app:layout_constraintTop_toTopOf="@id/home_bottom_sheet_drag_handle" />
41+
42+
<include
43+
android:id="@+id/layout_state_expanded"
44+
layout="@layout/bottom_sheet_home_state_expanded"
45+
android:visibility="gone"
46+
bind:viewModel="@{alarmViewModel}"/>
5047

5148
</androidx.constraintlayout.widget.ConstraintLayout>
5249

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@
3434
<string name="no_start_input">출발지가 입력되지 않았습니다.</string>
3535
<string name="no_end_input">도착지가 입력되지 않았습니다.</string>
3636
<string name="km">km</string>
37-
<string name="no_alarm">현재 등록된 막차 알림이 없습니다.</string>
37+
<string name="non_exist_alarm">현재 등록된 막차 알림이 없습니다.</string>
38+
<string name="exist_alarm">현재 등록된 막차 알림이 있습니다.</string>
3839
<string name="start_position_text">출발지 : %1$s</string>
3940
<string name="end_position_text">도착지 : %1$s</string>
4041
<string name="last_time_text">막차시간 : %1$s</string>
4142
<string name="walk_time_text">도보시간 : %1$d분</string>
4243
<string name="alarm_turn_off_text">알람 해제</string>
44+
<string name="alarm_delete_text">알람 삭제</string>
4345
</resources>

0 commit comments

Comments
 (0)