아래는 “한 번 울릴 때(자동 종료까지) 5분/10분 → 15분/20분 옵션을 추가”하기 위해, 나중에 개발할 때 손대야 하는 지점을 현재 구조 기준으로 정리한 것입니다.
(중요: 이 변경은 ‘1분 후 다시 울림’(스누즈 딜레이) 과는 무관하고, “한 번 울렸을 때 최대 몇 분 울릴지” 만 늘리는 개선입니다.)


변경해야 할 곳 요약

  1. 설정 UI: AlarmEditActivity 화면에서 5/10을 고르는 UI에 15/20을 추가
  2. 저장 모델: AlarmItem.snoozeMinutes(또는 동일 의미의 필드)에 15/20이 저장되도록
  3. 울림 서비스 자동 종료 시간: WeekdayAlarmService에서 stopHandler.postDelayed(...)가 snoozeMinutes를 분 단위로 반영하도록

타이머(AlarmService)는 현재 코드상 자동 종료가 5분 고정이라면, “타이머도 15/20을 원할 때”는 AlarmService도 별도 개선 대상입니다.
지금 질문은 “알람 메뉴(요일 알람)”의 5/10을 늘리는 쪽으로 이해하고, 그 기준으로 씁니다.


1) AlarmEdit UI에 15분/20분 옵션 추가

(A) 레이아웃이 RadioButton/Chip 형태인 경우(가장 흔함)

파일:

  • app/src/main/res/layout/activity_alarm_edit.xml (또는 비슷한 이름)

현재 5분/10분 버튼이 이런 식이면:

<RadioButton
    android:id="@+id/radio_5"
    android:text="5분"
    android:tag="5"/>

<RadioButton
    android:id="@+id/radio_10"
    android:text="10분"
    android:tag="10"/>

아래 2개를 그대로 추가합니다.

<RadioButton
    android:id="@+id/radio_15"
    android:text="15분"
    android:tag="15"/>

<RadioButton
    android:id="@+id/radio_20"
    android:text="20분"
    android:tag="20"/>

(B) values/arrays.xml로 옵션을 관리하는 경우

파일:

  • app/src/main/res/values/arrays.xml (또는 strings.xml)

예를 들어 이런 배열이 있으면:

<string-array name="snooze_minutes_options">
    <item>5</item>
    <item>10</item>
</string-array>

여기에 추가:

<string-array name="snooze_minutes_options">
    <item>5</item>
    <item>10</item>
    <item>15</item>
    <item>20</item>
</string-array>

2) AlarmEditActivity에서 “선택값 저장” 로직에 15/20 허용

파일(거의 확실):

  • app/src/main/java/.../alarmclock/AlarmEditActivity.kt

현재 코드가 5/10만 분기하는 형태면(예시):

val snoozeMinutes = when (checkedId) {
    R.id.radio_5 -> 5
    R.id.radio_10 -> 10
    else -> 5
}

이걸 아래처럼 확장:

val snoozeMinutes = when (checkedId) {
    R.id.radio_5 -> 5
    R.id.radio_10 -> 10
    R.id.radio_15 -> 15
    R.id.radio_20 -> 20
    else -> 5
}

또는 tag를 쓰는 구조라면(권장, 버튼 늘어도 코드가 단순):

val checked = findViewById<RadioButton>(radioGroup.checkedRadioButtonId)
val snoozeMinutes = (checked.tag as String).toInt()  // 5/10/15/20

그리고 저장할 때:

item.snoozeMinutes = snoozeMinutes
AlarmStore(this).save(item)

3) WeekdayAlarmService 자동 종료 시간을 snoozeMinutes에 맞추기

파일:

  • app/src/main/java/com/krdonon/timer/alarm/WeekdayAlarmService.kt

여기에서 “자동 종료”가 보통 이런 형태일 겁니다.

stopHandler.postDelayed({ stopAlarm() }, 5 * 60 * 1000L)

이게 고정이면, 반드시 아래처럼 “snoozeMinutes 반영”으로 바꿔야 합니다.

val ringMs = (snoozeMinutes.coerceAtLeast(1)) * 60_000L
stopHandler.postDelayed({ stopAlarm() }, ringMs)

이미 snoozeMinutes를 쓰고 있다면, 여기 수정은 필요 없습니다.
다만 15/20이 들어왔을 때도 제대로 동작하도록 coerceAtLeast(1) 같은 방어는 유지하는 게 좋습니다.


4) (선택) 유효성/기본값 제한이 있으면 같이 수정

프로젝트에 이런 코드가 있으면 같이 바꿔야 합니다.

A) 5/10만 허용하는 validation

예시:

if (item.snoozeMinutes != 5 && item.snoozeMinutes != 10) item.snoozeMinutes = 5

→ 아래처럼 허용 범위를 넓히거나:

val allowed = setOf(5, 10, 15, 20)
if (item.snoozeMinutes !in allowed) item.snoozeMinutes = 5

B) 기본값이 5로 박혀있는 곳

  • AlarmItem 생성 시 default
  • AlarmStore에서 null이면 5로 넣는 곳

이건 그대로 둬도 무방합니다(기본값은 계속 5).


5) “타이머(AlarmService)”도 15/20을 원할 때

지금 올려주셨던 AlarmService는 자동 종료가 5분 고정입니다:

stopHandler.postDelayed({ stopAlarm() }, 5 * 60 * 1000L)

타이머도 15/20 선택을 넣으려면:

  • 타이머 설정값(분)을 별도 저장(Preferences or Timer 모델)
  • AlarmService.start()에 extra로 “ringDurationMinutes” 전달
  • 위 postDelayed를 extra 값으로 대체

하지만 질문하신 “알람 메뉴의 5/10에 15/20 추가”만이라면, 우선은 WeekdayAlarmService 쪽만 건드리면 됩니다.


나중에 작업할 때 빠르게 찾는 키워드

코드에서 이 문자열로 검색하면 수정 지점이 바로 나옵니다.

  • snoozeMinutes
  • 5 * 60 * 1000
  • "5분"
  • "10분"
  • IMPORTANCE_LOW (이건 기록 알림 관련, 옵션 추가와는 무관)

원하시면, 지금 “현재 프로젝트 최신본 zip”을 한 번만 올려주시면 제가 실제 파일 기준으로 정확한 파일명/라인 기준으로 “여기 추가/여기 수정”을 딱 맞춰서 체크리스트로 다시 써드릴 수 있습니다.

 

 


좋습니다. 질문하신 3/4/5번을 “현재 구조 기준”으로 정확히 풀어서 설명드리겠습니다. (핵심은 **‘선택값 저장’**과 **‘그 값을 실제로 사용하는 곳’**이 다를 수 있다는 점입니다.)


3번이 뭔가요?

제가 말한 3번(WeekdayAlarmService 자동 종료 시간 반영) 은 이런 뜻입니다.

  • 알람이 울리기 시작하면(1회 울림 시작),
  • 사용자가 아무 것도 안 해도 “너무 오래 울리지 않게” 몇 분 후 자동으로 꺼지게(stop) 해놓은 코드가 있습니다.
  • 그 “자동으로 꺼지는 시간”을 5분/10분/15분/20분 선택값에 맞춰 주는 부분이 3번입니다.

즉, “한 번 울릴 때 오래 울리는 시간(최대 울림 시간)” 을 결정하는 핵심이 3번입니다.

2번 코드만 수정하면 충분하냐?

아니요. 2번은 ‘저장’, 3번은 ‘사용’ 입니다.

  • 2번만 하면: “15/20이 저장은 됨”
  • 3번이 고정 5분이면: “저장은 20분인데 실제는 5분만 울리고 꺼짐”

그래서 “15/20을 추가하고 실제로 15/20분 울리게” 하려면,

  • 3번이 고정값(5분)이라면 반드시 수정해야 합니다.
  • 반대로, WeekdayAlarmService가 이미 snoozeMinutes로 자동 종료 시간을 계산하고 있다면 수정할 필요 없습니다.

4번은 “그런 코드가 있으면” 수정해야 한다는 뜻 맞나요?

맞습니다.

4번은 프로젝트 어딘가에 이런 식의 제한(검증) 코드가 있을 때만 해당됩니다.

예:

  • “5나 10만 허용, 그 외는 5로 강제” 같은 코드
  • 혹은 “10보다 크면 10으로 강제” 같은 코드

이런 제한이 있으면 15/20이 저장되거나 로딩될 때 자동으로 5나 10으로 바뀌어 버립니다.

따라서 4번은:

  • 그런 제한 코드가 실제로 존재하면 수정해야 하고
  • 없으면 신경 안 써도 됩니다.

5) “현재 코드는 10분 선택이 있는데 10분이 안 된다는 말인가요?”

아니요. “10분이 안 된다”는 뜻이 아닙니다.
다만 여기서 중요한 구분이 있습니다.

(A) 요일 알람(AlarmAgain/WeekdayAlarmService)에서의 10분

  • 10분은 보통 “한 번 울릴 때 최대 10분 울리고 자동 종료” 로 쓰이도록 만들어져 있습니다.
  • 지금 3회 스누즈가 정상 동작하는 상태라면, 10분도 같은 방식으로 동작할 가능성이 높습니다.

(B) 타이머(AlarmService)에서의 “자동 종료 시간”

사용자님이 전에 올려주신 AlarmService 코드를 보면, 타이머 쪽은 자동 종료가 5분 고정입니다.

// 자동 종료(5분)
stopHandler.postDelayed({ stopAlarm() }, 5 * 60 * 1000L)

즉,

  • “10분 선택”이 요일 알람 설정이라면 타이머에는 영향이 없습니다.
  • “타이머도 10분 동안 울리게” 하고 싶다면, AlarmService도 별도 개선이 필요합니다(지금은 5분 고정).

정리하면:

  • 요일 알람의 10분은 정상 동작 가능
  • 타이머의 자동 종료 시간은 현재 5분 고정 (이건 ‘10분 선택이 안 된다’가 아니라 ‘타이머는 아직 선택값을 안 쓰고 있다’는 의미)

한 줄 결론

  • 15/20을 “선택지로 추가”만 하면(2번) 저장은 되지만,
  • 실제로 15/20분 울리게 하려면 WeekdayAlarmService(3번)가 그 값을 자동 종료 시간에 반영하는지 반드시 확인해야 합니다.
  • 4번은 “그런 제한 코드가 있을 때만” 수정.
  • “10분 선택이 안 된다”가 아니라, 타이머 쪽 자동 종료는 현재 5분 고정이고, 요일 알람 쪽은 설계에 따라 다릅니다.

원하시면, 제가 가장 빠르게 확답드릴 수 있게 WeekdayAlarmService.kt의 ‘자동 종료 postDelayed’ 부분 10줄만 붙여주세요.
그 코드만 보면 “3번을 꼭 수정해야 하는지(고정 5분인지 / snoozeMinutes 반영 중인지)”를 즉시 판정해드릴 수 있습니다.

반응형

+ Recent posts