From 6431577bf1abb42def92f220b28bde08eeaae294 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 12 Aug 2024 16:58:23 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=8C=EB=9E=8C=20-=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/mypage/alarm/AddAlarmActivity.kt | 151 +++++++++++++----- .../sodalive/mypage/alarm/AlarmAdapter.kt | 15 +- .../main/res/drawable-xxhdpi/ic_calendar.png | Bin 0 -> 573 bytes .../main/res/layout/activity_add_alarm.xml | 30 ++++ app/src/main/res/layout/item_alarm.xml | 2 +- app/src/main/res/values/themes.xml | 1 + 6 files changed, 154 insertions(+), 45 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_calendar.png diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AddAlarmActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AddAlarmActivity.kt index bb572d9..e4f9648 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AddAlarmActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AddAlarmActivity.kt @@ -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::inflate @@ -30,6 +35,9 @@ class AddAlarmActivity : BaseActivity( private var selectedContentTitle = "" private var selectedContentCreatorNickname = "" + private var selectedDateCalendar = Calendar.getInstance() + private val selectedDays = mutableListOf() + override fun onCreate(savedInstanceState: Bundle?) { activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() @@ -67,32 +75,15 @@ class AddAlarmActivity : BaseActivity( 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( 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( finish() } - private fun getAdjustedTimeInMillis(hour: Int, minute: Int, selectedDays: List): 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 || diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AlarmAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AlarmAdapter.kt index c5e0540..77398ac 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AlarmAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/alarm/AlarmAdapter.kt @@ -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) } diff --git a/app/src/main/res/drawable-xxhdpi/ic_calendar.png b/app/src/main/res/drawable-xxhdpi/ic_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..346f935bfa42ca4254a6676c59ef14939a0830a7 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxl5idjv*C{Z)Z0a9x~u@ohrwCf%g*UE#6aX zXW2G5UgqSG-r(e(&|K0qjq?y&Ds%WwZ%uZiiL%pgIKB5vU-Uxc{{)W7!3-idQv^7Y z&xo{FZr^!wQw}>b$6S34i=8rS4eL$rwk$qTenz%sp~LC^ZMV;Je^4*k$Gnimf9Af8 zpJX{yEhKNaa=%|F$=9Fp{m8rYEjK&YyZvUckNH%)ICtZUs{%|SQFBBlL}XrgX29aJ z!Q|ye7I~jpN%fk!yNtST$h5Ovde#`V#z*Ji)T8mtu@=X4qH+~=IqGjl+W+9K7n<%_ zs<^MHGhODsru@5T;g3&5vwq9gDb-|mOz-;eG(@5LVdMA1{|>#gy?p$rX8id(zZRZ~ z^Z#>Yj{dje4@cDH%g=4osuk-=H+*fG(0AB-`%k+sYj!_-e9m&lgN+Z*{e1S%W<|nF zpB;^92b`4DZn$c@Zpmomn#R97Ls7d!`r2f^*i27%R&PA0UH1k{*8RWyG0)P3_bAuY z$>v>uIQ2tqVBH@7P0DC(`4w@xhR!`aeD6Q`Gm|6qH$=~I>ap-Y0|)}lO& t!a6=ye=oVtpBEteFa_p> literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_add_alarm.xml b/app/src/main/res/layout/activity_add_alarm.xml index 855c46d..6315b95 100644 --- a/app/src/main/res/layout/activity_add_alarm.xml +++ b/app/src/main/res/layout/activity_add_alarm.xml @@ -43,9 +43,36 @@ android:paddingHorizontal="13.3dp" android:paddingVertical="16dp"> + + + + + + + @@ -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" /> diff --git a/app/src/main/res/layout/item_alarm.xml b/app/src/main/res/layout/item_alarm.xml index 571b107..c35dfad 100644 --- a/app/src/main/res/layout/item_alarm.xml +++ b/app/src/main/res/layout/item_alarm.xml @@ -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" /> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1e088cd..770ae02 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -68,6 +68,7 @@ 1 8dp 15sp + @font/gmarket_sans_medium center @color/alarm_day_checkbox_text_selector