diff --git a/app/src/main/java/com/runnect/runnect/presentation/run/RunActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/run/RunActivity.kt index fe9e4257..59019f35 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/run/RunActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/run/RunActivity.kt @@ -97,6 +97,7 @@ class RunActivity : BindingActivity(R.layout.activity_run), getCurrentLocation() showRecord() backButton() + setUpPauseResume() val runCourseData: CourseData? = intent.getParcelableExtra(EXTRA_COUNTDOWN_TO_RUN) val targetDistanceM = runCourseData?.distance?.let { (it * 1000f).roundToInt() } @@ -133,6 +134,30 @@ class RunActivity : BindingActivity(R.layout.activity_run), stopService(serviceIntent) //서비스 객체 제거 } + private fun setUpPauseResume() { + binding.btnRunPauseResume.setOnClickListener { + val isPaused = viewModel.isPaused.value ?: false + if (isPaused) { + timerService?.resumeTimer() + } else { + timerService?.pauseTimer() + } + viewModel.isPaused.value = !isPaused + updatePauseResumeUI(!isPaused) + } + } + + private fun updatePauseResumeUI(isPaused: Boolean) { + binding.btnRunPauseResume.apply { + setImageResource(if (isPaused) R.drawable.ic_run_resume else R.drawable.ic_run_pause) + contentDescription = getString( + if (isPaused) R.string.run_description_resume else R.string.run_description_pause + ) + } + binding.btnRunStop.visibility = if (isPaused) View.VISIBLE else View.GONE + binding.tvPausedLabel.visibility = if (isPaused) View.VISIBLE else View.GONE + } + override fun onStart() { super.onStart() // Timer 결과값을 받기 위해 브로드캐스트 리시버 등록 @@ -336,7 +361,7 @@ class RunActivity : BindingActivity(R.layout.activity_run), } private fun showRecord() { - binding.btnRunFinish.setOnClickListener { + binding.btnRunStop.setOnClickListener { stopTimer() val totalTimeSec = ((timerData.hour ?: 0) * 3600) + ((timerData.minute ?: 0) * 60) + (timerData.second ?: 0) Analytics.logEvent( diff --git a/app/src/main/java/com/runnect/runnect/presentation/run/RunViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/run/RunViewModel.kt index d15f35ad..4c7bf98d 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/run/RunViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/run/RunViewModel.kt @@ -9,4 +9,5 @@ class RunViewModel : ViewModel() { val dataFrom = MutableLiveData() var courseId = MutableLiveData() var publicCourseId = MutableLiveData() + val isPaused = MutableLiveData(false) } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/run/TimerService.kt b/app/src/main/java/com/runnect/runnect/presentation/run/TimerService.kt index b8afbc7d..b526c007 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/run/TimerService.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/run/TimerService.kt @@ -90,6 +90,19 @@ class TimerService : Service() { timer?.cancel() } + // 일시정지: 타이머만 멈추고 누적된 time은 유지한다 (resumeTimer에서 이어서 증가) + fun pauseTimer() { + timer?.cancel() + notificationBuilder.setContentText("일시정지 중") + val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager + notificationManager.notify(NOTI_ID, notificationBuilder.build()) + } + + // 재개: 기존 time 값에 이어서 타이머를 다시 시작한다 + fun resumeTimer() { + startTimer() + } + override fun onBind(intent: Intent?): IBinder { return binder } diff --git a/app/src/main/res/drawable/bg_paused_pill.xml b/app/src/main/res/drawable/bg_paused_pill.xml new file mode 100644 index 00000000..419c2fb0 --- /dev/null +++ b/app/src/main/res/drawable/bg_paused_pill.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/circle_ghost_button.xml b/app/src/main/res/drawable/circle_ghost_button.xml new file mode 100644 index 00000000..a18252dd --- /dev/null +++ b/app/src/main/res/drawable/circle_ghost_button.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/circle_m1_button.xml b/app/src/main/res/drawable/circle_m1_button.xml new file mode 100644 index 00000000..e9f960dd --- /dev/null +++ b/app/src/main/res/drawable/circle_m1_button.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_run_pause.xml b/app/src/main/res/drawable/ic_run_pause.xml new file mode 100644 index 00000000..9eb5838b --- /dev/null +++ b/app/src/main/res/drawable/ic_run_pause.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_run_resume.xml b/app/src/main/res/drawable/ic_run_resume.xml new file mode 100644 index 00000000..3da04e6a --- /dev/null +++ b/app/src/main/res/drawable/ic_run_resume.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_run_stop.xml b/app/src/main/res/drawable/ic_run_stop.xml new file mode 100644 index 00000000..7a1d144f --- /dev/null +++ b/app/src/main/res/drawable/ic_run_stop.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/layout/activity_run.xml b/app/src/main/res/layout/activity_run.xml index 39fbf25f..54f9bcf7 100644 --- a/app/src/main/res/layout/activity_run.xml +++ b/app/src/main/res/layout/activity_run.xml @@ -154,22 +154,59 @@ tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="0dp" /> - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/view_run_top_frame" + tools:visibility="visible" /> + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7fbacbf8..552ca706 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,10 @@ 시간 러닝 종료 current_location + 일시정지 + 재개 + 러닝 종료 + 일시정지 중 선택 업로드