parent
b56a0d58bf
commit
6431577bf1
|
@ -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 ||
|
||||
|
|
|
@ -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 |
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue