본문 바로가기
Projects/It's My Waye

[It's My Waye] 9. 알람 화면 기능 구현

by DevJaewoo 2022. 2. 9.
반응형

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()
    }

구현 결과

구현 결과

반응형