parent
b56a0d58bf
commit
6431577bf1
|
@ -1,6 +1,8 @@
|
||||||
package kr.co.vividnext.sodalive.mypage.alarm
|
package kr.co.vividnext.sodalive.mypage.alarm
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
|
import android.app.DatePickerDialog
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.media.AudioManager
|
import android.media.AudioManager
|
||||||
|
@ -10,12 +12,15 @@ import android.widget.Toast
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
|
import com.orhanobut.logger.Logger
|
||||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||||
import kr.co.vividnext.sodalive.common.Constants
|
import kr.co.vividnext.sodalive.common.Constants
|
||||||
import kr.co.vividnext.sodalive.databinding.ActivityAddAlarmBinding
|
import kr.co.vividnext.sodalive.databinding.ActivityAddAlarmBinding
|
||||||
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
|
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
|
||||||
import kr.co.vividnext.sodalive.mypage.alarm.select_audio_content.AlarmSelectAudioContentActivity
|
import kr.co.vividnext.sodalive.mypage.alarm.select_audio_content.AlarmSelectAudioContentActivity
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
||||||
ActivityAddAlarmBinding::inflate
|
ActivityAddAlarmBinding::inflate
|
||||||
|
@ -30,6 +35,9 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
||||||
private var selectedContentTitle = ""
|
private var selectedContentTitle = ""
|
||||||
private var selectedContentCreatorNickname = ""
|
private var selectedContentCreatorNickname = ""
|
||||||
|
|
||||||
|
private var selectedDateCalendar = Calendar.getInstance()
|
||||||
|
private val selectedDays = mutableListOf<String>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
activityResultLauncher = registerForActivityResult(
|
activityResultLauncher = registerForActivityResult(
|
||||||
ActivityResultContracts.StartActivityForResult()
|
ActivityResultContracts.StartActivityForResult()
|
||||||
|
@ -67,32 +75,15 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
||||||
binding.chkSat
|
binding.chkSat
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dayCheckBoxes.forEach {
|
||||||
|
it.setOnCheckedChangeListener { _, _ -> updateResultText() }
|
||||||
|
}
|
||||||
|
|
||||||
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||||
val maxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
|
val maxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
|
||||||
binding.sbVolume.max = maxVol
|
binding.sbVolume.max = maxVol
|
||||||
binding.sbVolume.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
|
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 {
|
binding.rlSelectAlarmContent.setOnClickListener {
|
||||||
activityResultLauncher.launch(
|
activityResultLauncher.launch(
|
||||||
Intent(
|
Intent(
|
||||||
|
@ -107,17 +98,109 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
||||||
binding.toolbar.tvBack.text = "알람 설정"
|
binding.toolbar.tvBack.text = "알람 설정"
|
||||||
binding.toolbar.tvBack.setOnClickListener { finish() }
|
binding.toolbar.tvBack.setOnClickListener { finish() }
|
||||||
binding.tvCancel.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() {
|
private fun saveAlarm() {
|
||||||
if (!validate()) return
|
if (!validate()) return
|
||||||
|
|
||||||
val hour = binding.timePicker.hour
|
|
||||||
val minute = binding.timePicker.minute
|
|
||||||
val alarmTitle = binding.etAlarmTitle.text.toString()
|
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(
|
val alarm = Alarm(
|
||||||
id = if (alarmId == -1) 0 else alarmId,
|
id = if (alarmId == -1) 0 else alarmId,
|
||||||
title = alarmTitle,
|
title = alarmTitle,
|
||||||
|
@ -137,24 +220,6 @@ class AddAlarmActivity : BaseActivity<ActivityAddAlarmBinding>(
|
||||||
finish()
|
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 {
|
private fun validate(): Boolean {
|
||||||
if (
|
if (
|
||||||
selectedContentId <= 0 ||
|
selectedContentId <= 0 ||
|
||||||
|
|
|
@ -9,6 +9,7 @@ import kr.co.vividnext.sodalive.R
|
||||||
import kr.co.vividnext.sodalive.databinding.ItemAlarmBinding
|
import kr.co.vividnext.sodalive.databinding.ItemAlarmBinding
|
||||||
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
|
import kr.co.vividnext.sodalive.mypage.alarm.db.Alarm
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Calendar
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
class AlarmAdapter(
|
class AlarmAdapter(
|
||||||
|
@ -44,7 +45,19 @@ class AlarmAdapter(
|
||||||
binding.tvDays.text = if (alarm.days.isNotEmpty()) {
|
binding.tvDays.text = if (alarm.days.isNotEmpty()) {
|
||||||
alarm.getDaysText()
|
alarm.getDaysText()
|
||||||
} else {
|
} 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)
|
.format(alarm.time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 573 B |
|
@ -43,9 +43,36 @@
|
||||||
android:paddingHorizontal="13.3dp"
|
android:paddingHorizontal="13.3dp"
|
||||||
android:paddingVertical="16dp">
|
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
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="13.3dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
|
@ -127,6 +154,7 @@
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:fontFamily="@font/gmarket_sans_medium"
|
||||||
android:text="콘텐츠"
|
android:text="콘텐츠"
|
||||||
android:textColor="@color/color_eeeeee"
|
android:textColor="@color/color_eeeeee"
|
||||||
android:textSize="14.7sp" />
|
android:textSize="14.7sp" />
|
||||||
|
@ -136,6 +164,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:fontFamily="@font/gmarket_sans_medium"
|
||||||
android:text="콘텐츠를 선택해주세요"
|
android:text="콘텐츠를 선택해주세요"
|
||||||
android:textColor="@color/color_3bb9f1"
|
android:textColor="@color/color_3bb9f1"
|
||||||
android:textSize="12sp" />
|
android:textSize="12sp" />
|
||||||
|
@ -154,6 +183,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="21dp"
|
android:layout_marginTop="21dp"
|
||||||
|
android:fontFamily="@font/gmarket_sans_medium"
|
||||||
android:text="볼륨"
|
android:text="볼륨"
|
||||||
android:textColor="@color/color_eeeeee"
|
android:textColor="@color/color_eeeeee"
|
||||||
android:textSize="14.7sp" />
|
android:textSize="14.7sp" />
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
android:fontFamily="@font/gmarket_sans_medium"
|
android:fontFamily="@font/gmarket_sans_medium"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textColor="@color/color_eeeeee"
|
android:textColor="@color/color_eeeeee"
|
||||||
android:textSize="33.3sp"
|
android:textSize="28sp"
|
||||||
tools:text="10:00" />
|
tools:text="10:00" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@
|
||||||
<item name="android:layout_weight">1</item>
|
<item name="android:layout_weight">1</item>
|
||||||
<item name="android:padding">8dp</item>
|
<item name="android:padding">8dp</item>
|
||||||
<item name="android:textSize">15sp</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:gravity">center</item>
|
||||||
<item name="android:textColor">@color/alarm_day_checkbox_text_selector</item>
|
<item name="android:textColor">@color/alarm_day_checkbox_text_selector</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in New Issue