반응형
Intro
알람 화면의 기능을 구현했다.
구현한 기능들은 다음과 같다.
- 알람 전체 활성화 Off 시 아래의 항목 전부 숨김
- 방해금지 시간의 숫자를 24 이상으로 입력할 경우 23으로 설정
- 알람 전체 활성화 상태, 방해금지 시간 SharedPreference에 저장
- 앱 실행 시 DB에서 Item 목록을 불러와 RecyclerView에 표시
알람 비활성화 시 항목 숨김
binding.switchAlarmAll.setOnCheckedChangeListener { _, isChecked ->
updateAlarmEnabled(isChecked)
}
private fun updateAlarmEnabled(enable: Boolean) {
Log.d(TAG, "updateAlarmEnabled: $enable")
binding.switchAlarmAll.isChecked = enable
if (enable) binding.alarmContent.visibility = View.VISIBLE
else binding.alarmContent.visibility = View.INVISIBLE
ApplicationManager.isAlarmEnabled = enable
}
범위 밖의 시간 수정
private fun updateAlarmOfftimeStart(start: Int) {
val formattedStart = when {
start < 0 -> 0
start > 23 -> 23
else -> start
}
if(binding.editAlarmOfftimeStart.text.toString() != formattedStart.toString()) {
binding.editAlarmOfftimeStart.setText(formattedStart.toString())
}
Log.d(TAG, "updateAlarmOfftimeStart: $formattedStart")
ApplicationManager.alarmOffTimeStart = formattedStart
}
private fun updateAlarmOfftimeEnd(end: Int) {
val formattedEnd = when {
end < 0 -> 0
end > 23 -> 23
else -> end
}
if(binding.editAlarmOfftimeEnd.text.toString() != formattedEnd.toString()) {
binding.editAlarmOfftimeEnd.setText(formattedEnd.toString())
}
Log.d(TAG, "updateAlarmOfftimeEnd: $formattedEnd")
ApplicationManager.alarmOffTimeEnd = formattedEnd
}
설정값 SharedPreference에 저장
Application을 상속받은 ApplicationManager 클래스를 새로 만들었다.
Application을 상속받아 프로그램 시작 시 가장 먼저 호출되기 때문에 초기화 코드를 넣기 좋다.
companion object {
private const val PREFERENCE_ALARM_ENABLED = "alarm_enabled"
private const val PREFERENCE_ALARM_OFFTIME_START = "alarm_offtime_start"
private const val PREFERENCE_ALARM_OFFTIME_END = "alarm_offtime_end"
lateinit var applicationContext: Context
lateinit var sharedPreferences: SharedPreferences
var isAlarmEnabled: Boolean = false
set(value) {
if(value != field) sharedPreferences.edit().putBoolean(PREFERENCE_ALARM_ENABLED, value).apply()
field = value
}
var alarmOffTimeStart: Int = 0
set(value) {
if(value != field) sharedPreferences.edit().putInt(PREFERENCE_ALARM_OFFTIME_START, value).apply()
field = value
}
var alarmOffTimeEnd: Int = 0
set(value) {
if(value != field) sharedPreferences.edit().putInt(PREFERENCE_ALARM_OFFTIME_END, value).apply()
field = value
}
}
override fun onCreate() {
super.onCreate()
ApplicationManager.applicationContext = applicationContext
sharedPreferences = getSharedPreferences(PREFERENCE_NAME, 0)
loadPreferences()
}
private fun loadPreferences() {
isAlarmEnabled = sharedPreferences.getBoolean(PREFERENCE_ALARM_ENABLED, true)
alarmOffTimeStart = sharedPreferences.getInt(PREFERENCE_ALARM_OFFTIME_START, 0)
alarmOffTimeEnd = sharedPreferences.getInt(PREFERENCE_ALARM_OFFTIME_END, 0)
Log.d(TAG, "loadPreferences: \n" +
"AlarmEnabled: $isAlarmEnabled\n" +
"AlarmOffTimeStart: $alarmOffTimeStart\n" +
"AlarmOffTimeEnd: $alarmOffTimeEnd")
}
앱 실행 시 DB에서 Item 목록 불러오기
이전의 초기화 코드에 ItemDAO를 사용해 목록을 불러온다.
private fun loadPreferences() {
...
val itemDAO = ItemDAO(applicationContext)
ItemList = itemDAO.selectAll()
Log.d(TAG, "loadPreferences: $ItemList")
}
AlarmFragment가 화면에 표시될 때 이전에 초기화된 ItemList를 불러와 AlarmRecyclerAdapter에 넣어주도록 설정한다.
alarmRecyclerView = binding.recyclerviewAlarm
alarmRecyclerAdapter = AlarmRecyclerAdapter()
alarmRecyclerView.adapter = alarmRecyclerAdapter
alarmRecyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
alarmRecyclerAdapter.dataSet = ApplicationManager.ItemList
AlarmRecyclerAdapter에 ArrayList 변수의 Setter 함수를 값이 변경되면 자동으로 업데이트하도록 설정했다.
var dataSet: List<Item> = ArrayList()
set(value) {
field = value
notifyDataSetChanged()
}
구현 결과
반응형
'Projects > It's My Waye' 카테고리의 다른 글
[It's My Waye] 11. 알람 기능 구현 - 알람 제어 (0) | 2022.04.27 |
---|---|
[It's My Waye] 10. 알람 기능 구현 - 알람 켜기 (0) | 2022.04.27 |
[It's My Waye] 8. 알람 UI 구현 (0) | 2022.02.09 |
[It's My Waye] 7. 메인화면 UI 구현 (DrawerLayout) (0) | 2022.01.23 |
[It's My Waye] 6. DB 기능 구현 - 테스트 코드 작성 (0) | 2022.01.23 |