Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fdcbb615ab | |||
| 161cc8060d |
@@ -20,8 +20,8 @@ android {
|
|||||||
applicationId = "com.example.shiftalarm"
|
applicationId = "com.example.shiftalarm"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = 1121
|
versionCode = 1124
|
||||||
versionName = "1.2.1"
|
versionName = "1.2.4"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,14 @@ class AlarmActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
// 알람 시작 (화면 상태와 무관하게 항상 실행)
|
// 알람 시작 (화면 상태와 무관하게 항상 실행)
|
||||||
startAlarm()
|
startAlarm()
|
||||||
|
|
||||||
|
// 마스터 알람이 꺼져있으면 알람 화면을 즉시 종료
|
||||||
|
val prefs = getSharedPreferences("ShiftAlarmPrefs", Context.MODE_PRIVATE)
|
||||||
|
if (!ShiftAlarmDefaults.isMasterAlarmEnabled(prefs)) {
|
||||||
|
Toast.makeText(this, "전체 알람이 꺼져있습니다.", Toast.LENGTH_SHORT).show()
|
||||||
|
finish()
|
||||||
|
return
|
||||||
|
}
|
||||||
setupControls()
|
setupControls()
|
||||||
|
|
||||||
// 5분 후 자동 스누즈
|
// 5분 후 자동 스누즈
|
||||||
@@ -209,6 +217,7 @@ class AlarmActivity : AppCompatActivity() {
|
|||||||
val dx = event.rawX - startX
|
val dx = event.rawX - startX
|
||||||
if (abs(dx) > maxSwipe * 0.8f) {
|
if (abs(dx) > maxSwipe * 0.8f) {
|
||||||
// Trigger Dismiss
|
// Trigger Dismiss
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
(getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50)
|
(getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50)
|
||||||
Toast.makeText(this, "알람 해제 완료", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "알람 해제 완료", Toast.LENGTH_SHORT).show()
|
||||||
stopAlarm(); finish()
|
stopAlarm(); finish()
|
||||||
@@ -247,6 +256,7 @@ class AlarmActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleSnooze() {
|
private fun handleSnooze() {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
(getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50)
|
(getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator)?.vibrate(50)
|
||||||
val snoozeRepeat = intent.getIntExtra("EXTRA_SNOOZE_REPEAT", 3)
|
val snoozeRepeat = intent.getIntExtra("EXTRA_SNOOZE_REPEAT", 3)
|
||||||
val text = if (snoozeRepeat == 99) "다시 울림 설정됨" else "다시 울림 (${snoozeRepeat}회 남음)"
|
val text = if (snoozeRepeat == 99) "다시 울림 설정됨" else "다시 울림 (${snoozeRepeat}회 남음)"
|
||||||
@@ -274,21 +284,25 @@ class AlarmActivity : AppCompatActivity() {
|
|||||||
else android.provider.Settings.System.DEFAULT_ALARM_ALERT_URI
|
else android.provider.Settings.System.DEFAULT_ALARM_ALERT_URI
|
||||||
}
|
}
|
||||||
|
|
||||||
// AudioAttributes 강화: 화면 켜진 상태에서도 알람음이 울리도록
|
// AudioAttributes 강화: 무음/진동 모드에서도 알람음이 울리도록
|
||||||
val audioAttrs = AudioAttributes.Builder()
|
val audioAttrs = AudioAttributes.Builder()
|
||||||
.setUsage(AudioAttributes.USAGE_ALARM)
|
.setUsage(AudioAttributes.USAGE_ALARM)
|
||||||
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||||
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) // 볼륨 강제 적용
|
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
// AudioManager를 통해 알람 볼륨 설정
|
// AudioManager를 통해 알람 볼륨 설정 및 무음 모드 우회
|
||||||
val audioManager = getSystemService(Context.AUDIO_SERVICE) as 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 {
|
try {
|
||||||
|
val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM)
|
||||||
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0)
|
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0)
|
||||||
|
Log.d("AlarmActivity", "알람 볼륨 설정: $maxVolume (RingerMode: $originalRingerMode)")
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.w("AlarmActivity", "알람 볼륨 설정 실패", e)
|
Log.w("AlarmActivity", "알람 볼륨 설정 실패", e)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,13 @@ class AlarmReceiver : BroadcastReceiver() {
|
|||||||
override fun onReceive(context: Context, intent: Intent?) {
|
override fun onReceive(context: Context, intent: Intent?) {
|
||||||
Log.d(TAG, "===== 알람 수신 (Receiver) =====")
|
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 alarmId = intent?.getIntExtra("EXTRA_ALARM_ID", -1) ?: -1
|
||||||
val isCustom = intent?.getBooleanExtra("EXTRA_IS_CUSTOM", false) ?: false
|
val isCustom = intent?.getBooleanExtra("EXTRA_IS_CUSTOM", false) ?: false
|
||||||
|
|
||||||
@@ -50,6 +57,7 @@ class AlarmReceiver : BroadcastReceiver() {
|
|||||||
private fun startAlarm(context: Context, intent: Intent?) {
|
private fun startAlarm(context: Context, intent: Intent?) {
|
||||||
// WakeLock 획득 (화면 켜기 및 Activity 실행 보장)
|
// WakeLock 획득 (화면 켜기 및 Activity 실행 보장)
|
||||||
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
val wakeLock = pm.newWakeLock(
|
val wakeLock = pm.newWakeLock(
|
||||||
PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
|
PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
|
||||||
"ShiftAlarm::AlarmWakeLock"
|
"ShiftAlarm::AlarmWakeLock"
|
||||||
@@ -71,6 +79,8 @@ class AlarmReceiver : BroadcastReceiver() {
|
|||||||
context.startService(serviceIntent)
|
context.startService(serviceIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "ForegroundService 시작 완료")
|
||||||
|
|
||||||
// 2. AlarmActivity 직접 실행 (알람 화면 표시)
|
// 2. AlarmActivity 직접 실행 (알람 화면 표시)
|
||||||
val activityIntent = Intent(context, AlarmActivity::class.java).apply {
|
val activityIntent = Intent(context, AlarmActivity::class.java).apply {
|
||||||
putExtra("EXTRA_SHIFT", intent?.getStringExtra("EXTRA_SHIFT") ?: "근무")
|
putExtra("EXTRA_SHIFT", intent?.getStringExtra("EXTRA_SHIFT") ?: "근무")
|
||||||
@@ -88,8 +98,15 @@ class AlarmReceiver : BroadcastReceiver() {
|
|||||||
addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
||||||
}
|
}
|
||||||
|
|
||||||
context.startActivity(activityIntent)
|
// 지연 후 Activity 시작 (ForegroundService가 알림을 먼저 표시하도록)
|
||||||
Log.d(TAG, "AlarmActivity 실행 완료")
|
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) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "알람 실행 실패", e)
|
Log.e(TAG, "알람 실행 실패", e)
|
||||||
|
|||||||
@@ -451,13 +451,18 @@ class FragmentSettingsAlarm : Fragment(), SharedPreferences.OnSharedPreferenceCh
|
|||||||
if (android.os.Build.VERSION.SDK_INT >= 23) {
|
if (android.os.Build.VERSION.SDK_INT >= 23) {
|
||||||
timePicker.hour = parts[0].toInt(); timePicker.minute = parts[1].toInt()
|
timePicker.hour = parts[0].toInt(); timePicker.minute = parts[1].toInt()
|
||||||
} else {
|
} 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 {
|
btnSelectSound.setOnClickListener {
|
||||||
val intent = Intent(android.media.RingtoneManager.ACTION_RINGTONE_PICKER).apply {
|
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_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_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)
|
startActivityForResult(intent, 100)
|
||||||
}
|
}
|
||||||
@@ -485,7 +490,9 @@ class FragmentSettingsAlarm : Fragment(), SharedPreferences.OnSharedPreferenceCh
|
|||||||
|
|
||||||
btnCancel.setOnClickListener { dialog.dismiss() }
|
btnCancel.setOnClickListener { dialog.dismiss() }
|
||||||
btnSave.setOnClickListener {
|
btnSave.setOnClickListener {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
val h = if (android.os.Build.VERSION.SDK_INT >= 23) timePicker.hour else timePicker.currentHour
|
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 m = if (android.os.Build.VERSION.SDK_INT >= 23) timePicker.minute else timePicker.currentMinute
|
||||||
val time = String.format("%02d:%02d", h, m)
|
val time = String.format("%02d:%02d", h, m)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"versionCode": 1122,
|
"versionCode": 1124,
|
||||||
"versionName": "1.2.2",
|
"versionName": "1.2.4",
|
||||||
"apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.2/app.apk",
|
"apkUrl": "https://git.webpluss.net/sanjeok77/ShiftRing/releases/download/v1.2.4/app.apk",
|
||||||
"changelog": "v1.2.2: 삭제한 알람이 울리는 버그 수정 - AlarmManager 취소 시 action 누락 문제 해결",
|
"changelog": "v1.2.4: Deprecation 경고 수정 및 삭제 알람 버그 수정",
|
||||||
"forceUpdate": false
|
"forceUpdate": false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user