- 날짜 선택 추가
This commit is contained in:
klaus 2024-08-12 16:58:23 +09:00
parent b56a0d58bf
commit 6431577bf1
6 changed files with 154 additions and 45 deletions

View File

@ -1,6 +1,8 @@
package kr.co.vividnext.sodalive.mypage.alarm
import android.annotation.SuppressLint
import android.app.Activity
import android.app.DatePickerDialog
import android.content.Context
import android.content.Intent
import android.media.AudioManager
@ -10,12 +12,15 @@ import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import com.orhanobut.logger.Logger
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.databinding.ActivityAddAlarmBinding
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
import kr.co.vividnext.sodalive.mypage.alarm.select_audio_content.AlarmSelectAudioContentActivity
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
ActivityAddAlarmBinding::inflate
@ -30,6 +35,9 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
private var selectedContentTitle = ""
private var selectedContentCreatorNickname = ""
private var selectedDateCalendar = Calendar.getInstance()
private val selectedDays = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
activityResultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
@ -67,32 +75,15 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
binding.chkSat
)
dayCheckBoxes.forEach {
it.setOnCheckedChangeListener { _, _ -> updateResultText() }
}
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val maxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
binding.sbVolume.max = maxVol
binding.sbVolume.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
if (alarmId != -1) {
alarmViewModel.getAlarmById(alarmId).observe(this) { alarm ->
alarm?.let {
binding.etAlarmTitle.setText(it.title)
val calendar = Calendar.getInstance().apply { timeInMillis = it.time }
binding.timePicker.hour = calendar.get(Calendar.HOUR_OF_DAY)
binding.timePicker.minute = calendar.get(Calendar.MINUTE)
dayCheckBoxes.forEach { checkBox ->
checkBox.isChecked = it.days.contains(checkBox.text.toString())
}
binding.tvContentTitle.text = it.contentTitle
binding.sbVolume.progress = it.volume
selectedContentId = it.contentId
selectedContentTitle = it.contentTitle
selectedContentCreatorNickname = it.contentCreatorNickname
}
}
}
binding.rlSelectAlarmContent.setOnClickListener {
activityResultLauncher.launch(
Intent(
@ -107,17 +98,109 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
binding.toolbar.tvBack.text = "알람 설정"
binding.toolbar.tvBack.setOnClickListener { finish() }
binding.tvCancel.setOnClickListener { finish() }
binding.ivCalendar.setOnClickListener {
val datePickerDialog = DatePickerDialog(
this,
{ _, selectedYear, selectedMonth, selectedDay ->
dayCheckBoxes.forEach { it.isChecked = false }
selectedDays.clear()
selectedDateCalendar.set(selectedYear, selectedMonth, selectedDay)
checkAndAdjustDateTime()
},
selectedDateCalendar.get(Calendar.YEAR),
selectedDateCalendar.get(Calendar.MONDAY),
selectedDateCalendar.get(Calendar.DAY_OF_MONTH)
)
datePickerDialog.datePicker.minDate = Calendar.getInstance().timeInMillis
datePickerDialog.show()
}
binding.timePicker.setOnTimeChangedListener { _, _, _ -> checkAndAdjustDateTime() }
if (alarmId != -1) {
alarmViewModel.getAlarmById(alarmId).observe(this) { alarm ->
alarm?.let {
binding.etAlarmTitle.setText(it.title)
selectedDateCalendar.timeInMillis = it.time
binding.timePicker.hour = selectedDateCalendar.get(Calendar.HOUR_OF_DAY)
binding.timePicker.minute = selectedDateCalendar.get(Calendar.MINUTE)
dayCheckBoxes.forEach { checkBox ->
checkBox.isChecked = it.days.contains(checkBox.text.toString())
}
binding.tvContentTitle.text = it.contentTitle
binding.sbVolume.progress = it.volume
selectedContentId = it.contentId
selectedContentTitle = it.contentTitle
selectedContentCreatorNickname = it.contentCreatorNickname
}
}
}
checkAndAdjustDateTime()
}
private fun checkAndAdjustDateTime() {
val currentCalendar = Calendar.getInstance()
selectedDateCalendar.set(Calendar.HOUR_OF_DAY, binding.timePicker.hour)
selectedDateCalendar.set(Calendar.MINUTE, binding.timePicker.minute)
selectedDateCalendar.set(Calendar.SECOND, 0)
selectedDateCalendar.set(Calendar.MILLISECOND, 0)
if (selectedDateCalendar.before(currentCalendar)) {
selectedDateCalendar.add(Calendar.DAY_OF_MONTH, 1)
}
updateResultText()
}
@SuppressLint("SetTextI18n")
private fun updateResultText() {
selectedDays.clear()
dayCheckBoxes.filter { it.isChecked }.map { selectedDays.add(it.text.toString()) }
if (selectedDays.isNotEmpty()) {
binding.tvDaysOrDate.text = if (selectedDays.size == 7) {
"매일"
} else {
"매주 ${selectedDays.joinToString(", ")}"
}
} else {
val dateFormat = SimpleDateFormat(
"yyyy년 M월 d일 (E)",
Locale.getDefault()
)
val formattedDate = dateFormat.format(selectedDateCalendar.time)
binding.tvDaysOrDate.text = formattedDate
}
}
private fun saveAlarm() {
if (!validate()) return
val hour = binding.timePicker.hour
val minute = binding.timePicker.minute
val alarmTitle = binding.etAlarmTitle.text.toString()
val selectedDays = dayCheckBoxes.filter { it.isChecked }.map { it.text.toString() }
val alarmTime = if (selectedDays.isNotEmpty()) {
val hour = binding.timePicker.hour
val minute = binding.timePicker.minute
val calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY, hour)
calendar.set(Calendar.MINUTE, minute)
calendar.set(Calendar.SECOND, 0)
calendar.set(Calendar.MILLISECOND, 0)
calendar.timeInMillis
} else {
selectedDateCalendar.timeInMillis
}
val calendar = Calendar.getInstance()
calendar.timeInMillis = alarmTime
val alarmTime = getAdjustedTimeInMillis(hour, minute, selectedDays)
val alarm = Alarm(
id = if (alarmId == -1) 0 else alarmId,
title = alarmTitle,
@ -137,24 +220,6 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
finish()
}
private fun getAdjustedTimeInMillis(hour: Int, minute: Int, selectedDays: List<String>): Long {
val alarmTimeInMillis = getTimeInMillis(hour, minute)
return if (selectedDays.isEmpty() && alarmTimeInMillis <= System.currentTimeMillis()) {
getTimeInMillis(hour + 24, minute) // 다음 날로 설정
} else {
alarmTimeInMillis
}
}
private fun getTimeInMillis(hour: Int, minute: Int): Long {
val calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY, hour)
calendar.set(Calendar.MINUTE, minute)
calendar.set(Calendar.SECOND, 0)
calendar.set(Calendar.MILLISECOND, 0)
return calendar.timeInMillis
}
private fun validate(): Boolean {
if (
selectedContentId <= 0 ||

View File

@ -9,6 +9,7 @@ import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.databinding.ItemAlarmBinding
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
class AlarmAdapter(
@ -44,7 +45,19 @@ class AlarmAdapter(
binding.tvDays.text = if (alarm.days.isNotEmpty()) {
alarm.getDaysText()
} else {
SimpleDateFormat("MM월 dd일 (E)", Locale.getDefault())
val currentCalendar = Calendar.getInstance()
val alarmCalendar = Calendar.getInstance()
alarmCalendar.timeInMillis = alarm.time
val pattern = if (
currentCalendar.get(Calendar.YEAR) == alarmCalendar.get(Calendar.YEAR)
) {
"M월 d일 (E)"
} else {
"yyyy년 M월 d일 (E)"
}
SimpleDateFormat(pattern, Locale.getDefault())
.format(alarm.time)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

View File

@ -43,9 +43,36 @@
android:paddingHorizontal="13.3dp"
android:paddingVertical="16dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_days_or_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_toStartOf="@id/iv_calendar"
android:fontFamily="@font/gmarket_sans_medium"
android:textColor="@color/white"
android:textSize="12sp" />
<ImageView
android:id="@+id/iv_calendar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:padding="5dp"
android:src="@drawable/ic_calendar" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:orientation="horizontal">
<CheckBox
@ -127,6 +154,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="콘텐츠"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
@ -136,6 +164,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="콘텐츠를 선택해주세요"
android:textColor="@color/color_3bb9f1"
android:textSize="12sp" />
@ -154,6 +183,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="21dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="볼륨"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />

View File

@ -45,7 +45,7 @@
android:fontFamily="@font/gmarket_sans_medium"
android:gravity="center"
android:textColor="@color/color_eeeeee"
android:textSize="33.3sp"
android:textSize="28sp"
tools:text="10:00" />
</LinearLayout>

View File

@ -68,6 +68,7 @@
<item name="android:layout_weight">1</item>
<item name="android:padding">8dp</item>
<item name="android:textSize">15sp</item>
<item name="android:fontFamily">@font/gmarket_sans_medium</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@color/alarm_day_checkbox_text_selector</item>
</style>