From fdcbb615aba88c2f69e799fffc1645b095b7f138 Mon Sep 17 00:00:00 2001 From: sanjeok77-tech Date: Mon, 23 Feb 2026 12:48:37 +0900 Subject: [PATCH] =?UTF-8?q?v1.2.4:=20Deprecation=20=EA=B2=BD=EA=B3=A0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=82=AD=EC=A0=9C=20=EC=95=8C?= =?UTF-8?q?=EB=9E=8C=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 ++-- .../com/example/shiftalarm/AlarmActivity.kt | 24 +++++++++++++++---- .../com/example/shiftalarm/AlarmReceiver.kt | 21 ++++++++++++++-- .../shiftalarm/FragmentSettingsAlarm.kt | 9 ++++++- version.json | 8 +++---- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 663a13b..c0b4c1e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,8 +20,8 @@ android { applicationId = "com.example.shiftalarm" minSdk = 26 targetSdk = 35 - versionCode = 1123 - versionName = "1.2.3" + versionCode = 1124 + versionName = "1.2.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt b/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt index bf2851a..4fc5df2 100644 --- a/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt +++ b/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt @@ -78,6 +78,14 @@ class AlarmActivity : AppCompatActivity() { // 알람 시작 (화면 상태와 무관하게 항상 실행) startAlarm() + + // 마스터 알람이 꺼져있으면 알람 화면을 즉시 종료 + val prefs = getSharedPreferences("ShiftAlarmPrefs", Context.MODE_PRIVATE) + if (!ShiftAlarmDefaults.isMasterAlarmEnabled(prefs)) { + Toast.makeText(this, "전체 알람이 꺼져있습니다.", Toast.LENGTH_SHORT).show() + finish() + return + } setupControls() // 5분 후 자동 스누즈 @@ -209,6 +217,7 @@ class AlarmActivity : AppCompatActivity() { val dx = event.rawX - startX if (abs(dx) > maxSwipe * 0.8f) { // Trigger Dismiss + @Suppress("DEPRECATION") (getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50) Toast.makeText(this, "알람 해제 완료", Toast.LENGTH_SHORT).show() stopAlarm(); finish() @@ -247,6 +256,7 @@ class AlarmActivity : AppCompatActivity() { } private fun handleSnooze() { + @Suppress("DEPRECATION") (getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50) val snoozeRepeat = intent.getIntExtra("EXTRA_SNOOZE_REPEAT", 3) val text = if (snoozeRepeat == 99) "다시 울림 설정됨" else "다시 울림 (${snoozeRepeat}회 남음)" @@ -274,21 +284,25 @@ class AlarmActivity : AppCompatActivity() { else android.provider.Settings.System.DEFAULT_ALARM_ALERT_URI } - // AudioAttributes 강화: 화면 켜진 상태에서도 알람음이 울리도록 + // AudioAttributes 강화: 무음/진동 모드에서도 알람음이 울리도록 val audioAttrs = AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) // 볼륨 강제 적용 + .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) .build() - // AudioManager를 통해 알람 볼륨 설정 + // AudioManager를 통해 알람 볼륨 설정 및 무음 모드 우회 val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager - val originalVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM) - val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM) + + // 무음 모드에서도 알람음이 울리도록 STREAM_ALARM 사용 (벨소리와 독립) + // 알람 스트림은 다른 스트림과 달리 무음 모드에서도 울림 + val originalRingerMode = audioManager.ringerMode // 알람 볼륨을 최대로 설정 (사용자가 나중에 조정 가능) try { + val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM) audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0) + Log.d("AlarmActivity", "알람 볼륨 설정: $maxVolume (RingerMode: $originalRingerMode)") } catch (e: Exception) { Log.w("AlarmActivity", "알람 볼륨 설정 실패", e) } diff --git a/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt b/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt index 8f3e00d..b2312af 100644 --- a/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt +++ b/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt @@ -15,6 +15,13 @@ class AlarmReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent?) { Log.d(TAG, "===== 알람 수신 (Receiver) =====") + // 마스터 알람이 꺼져있으면 알람 무시 + val prefs = context.getSharedPreferences("ShiftAlarmPrefs", Context.MODE_PRIVATE) + if (!ShiftAlarmDefaults.isMasterAlarmEnabled(prefs)) { + Log.w(TAG, "마스터 알람이 꺼져있어 알람을 무시합니다.") + return + } + val alarmId = intent?.getIntExtra("EXTRA_ALARM_ID", -1) ?: -1 val isCustom = intent?.getBooleanExtra("EXTRA_IS_CUSTOM", false) ?: false @@ -50,6 +57,7 @@ class AlarmReceiver : BroadcastReceiver() { private fun startAlarm(context: Context, intent: Intent?) { // WakeLock 획득 (화면 켜기 및 Activity 실행 보장) val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager + @Suppress("DEPRECATION") val wakeLock = pm.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, "ShiftAlarm::AlarmWakeLock" @@ -71,6 +79,8 @@ class AlarmReceiver : BroadcastReceiver() { context.startService(serviceIntent) } + Log.d(TAG, "ForegroundService 시작 완료") + // 2. AlarmActivity 직접 실행 (알람 화면 표시) val activityIntent = Intent(context, AlarmActivity::class.java).apply { putExtra("EXTRA_SHIFT", intent?.getStringExtra("EXTRA_SHIFT") ?: "근무") @@ -88,8 +98,15 @@ class AlarmReceiver : BroadcastReceiver() { addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) } - context.startActivity(activityIntent) - Log.d(TAG, "AlarmActivity 실행 완료") + // 지연 후 Activity 시작 (ForegroundService가 알림을 먼저 표시하도록) + android.os.Handler(android.os.Looper.getMainLooper()).postDelayed({ + try { + context.startActivity(activityIntent) + Log.d(TAG, "AlarmActivity 실행 완료") + } catch (e: Exception) { + Log.e(TAG, "AlarmActivity 실행 실패", e) + } + }, 500) } catch (e: Exception) { Log.e(TAG, "알람 실행 실패", e) diff --git a/app/src/main/java/com/example/shiftalarm/FragmentSettingsAlarm.kt b/app/src/main/java/com/example/shiftalarm/FragmentSettingsAlarm.kt index 4fd3e62..b056c08 100644 --- a/app/src/main/java/com/example/shiftalarm/FragmentSettingsAlarm.kt +++ b/app/src/main/java/com/example/shiftalarm/FragmentSettingsAlarm.kt @@ -451,13 +451,18 @@ class FragmentSettingsAlarm : Fragment(), SharedPreferences.OnSharedPreferenceCh if (android.os.Build.VERSION.SDK_INT >= 23) { timePicker.hour = parts[0].toInt(); timePicker.minute = parts[1].toInt() } else { - timePicker.currentHour = parts[0].toInt(); timePicker.currentMinute = parts[1].toInt() + @Suppress("DEPRECATION") + timePicker.currentHour = parts[0].toInt() + @Suppress("DEPRECATION") + timePicker.currentMinute = parts[1].toInt() } btnSelectSound.setOnClickListener { val intent = Intent(android.media.RingtoneManager.ACTION_RINGTONE_PICKER).apply { putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_TYPE, android.media.RingtoneManager.TYPE_ALARM) putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, if (currentDialogSoundUri != null) android.net.Uri.parse(currentDialogSoundUri) else null as android.net.Uri?) + // 무음 선택 방지: 시스템 알람음만 선택 가능 + putExtra(android.media.RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false) } startActivityForResult(intent, 100) } @@ -485,7 +490,9 @@ class FragmentSettingsAlarm : Fragment(), SharedPreferences.OnSharedPreferenceCh btnCancel.setOnClickListener { dialog.dismiss() } btnSave.setOnClickListener { + @Suppress("DEPRECATION") val h = if (android.os.Build.VERSION.SDK_INT >= 23) timePicker.hour else timePicker.currentHour + @Suppress("DEPRECATION") val m = if (android.os.Build.VERSION.SDK_INT >= 23) timePicker.minute else timePicker.currentMinute val time = String.format("%02d:%02d", h, m) diff --git a/version.json b/version.json index 31e40a1..8ac4cbf 100644 --- a/version.json +++ b/version.json @@ -1,7 +1,7 @@ { - "versionCode": 1123, - "versionName": "1.2.3", - "apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.3/app.apk", - "changelog": "v1.2.3: 삭제한 알람이 울리는 버그 수정 - AlarmManager 취소 시 action 누락 문제 해결", + "versionCode": 1124, + "versionName": "1.2.4", + "apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.4/app.apk", + "changelog": "v1.2.4: Deprecation 경고 수정 및 삭제 알람 버그 수정", "forceUpdate": false }