diff --git a/app.apk b/app.apk index 9a8347d..148456e 100644 Binary files a/app.apk and b/app.apk differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8715964..a7da936 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 = 113 - versionName = "1.1.3" + versionCode = 114 + versionName = "1.1.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca896d1..bdb9c7f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + diff --git a/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt b/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt index 968ffd6..0070658 100644 --- a/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt +++ b/app/src/main/java/com/example/shiftalarm/AlarmActivity.kt @@ -44,16 +44,6 @@ class AlarmActivity : AppCompatActivity() { super.onCreate(savedInstanceState) - // ForegroundService가 실행 중이면 먼저 중지 - stopService(Intent(this, AlarmForegroundService::class.java)) - - // Service 중지 후 약간의 지연을 두어 AudioFocus가 완전히 해제되도록 함 - try { - Thread.sleep(100) - } catch (e: InterruptedException) { - // 무시 - } - enableEdgeToEdge() binding = ActivityAlarmBinding.inflate(layoutInflater) binding.root.background = ContextCompat.getDrawable(this, R.drawable.bg_alarm_gradient) @@ -467,6 +457,10 @@ class AlarmActivity : AppCompatActivity() { } catch (e: Exception) {} vibrator = null + try { + stopService(Intent(this, AlarmForegroundService::class.java)) + } catch (e: Exception) {} + val nm = getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager nm.cancel(1) } diff --git a/app/src/main/java/com/example/shiftalarm/AlarmForegroundService.kt b/app/src/main/java/com/example/shiftalarm/AlarmForegroundService.kt index f15b827..26d68c8 100644 --- a/app/src/main/java/com/example/shiftalarm/AlarmForegroundService.kt +++ b/app/src/main/java/com/example/shiftalarm/AlarmForegroundService.kt @@ -78,9 +78,20 @@ class AlarmForegroundService : Service() { // 5. 사용 중일 때도 즉시 전체화면 AlarmActivity 화면 띄우기 try { - startActivity(fullScreenIntent) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + val options = android.app.ActivityOptions.makeBasic().apply { + setPendingIntentBackgroundActivityStartMode(android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) + } + fullScreenPendingIntent.send(this, 0, null, null, null, null, options.toBundle()) + } else { + fullScreenPendingIntent.send() + } } catch (e: Exception) { - e.printStackTrace() + try { + startActivity(fullScreenIntent) + } catch (e2: Exception) { + e2.printStackTrace() + } } return START_NOT_STICKY diff --git a/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt b/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt index 851bed0..a44db49 100644 --- a/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt +++ b/app/src/main/java/com/example/shiftalarm/AlarmReceiver.kt @@ -89,11 +89,31 @@ class AlarmReceiver : BroadcastReceiver() { putExtra("EXTRA_SNOOZE_REPEAT", intent?.getIntExtra("EXTRA_SNOOZE_REPEAT", 3) ?: 3) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_NO_USER_ACTION) } + + val pendingLaunch = android.app.PendingIntent.getActivity( + context, + 200, + activityIntent, + android.app.PendingIntent.FLAG_UPDATE_CURRENT or android.app.PendingIntent.FLAG_IMMUTABLE + ) + try { - context.startActivity(activityIntent) - Log.d(TAG, "AlarmActivity 즉시 실행 완료") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + val options = android.app.ActivityOptions.makeBasic().apply { + setPendingIntentBackgroundActivityStartMode(android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) + } + pendingLaunch.send(context, 0, null, null, null, null, options.toBundle()) + } else { + pendingLaunch.send() + } + Log.d(TAG, "AlarmActivity PendingIntent 전송 완료") } catch (e: Exception) { - Log.e(TAG, "AlarmActivity 실행 실패", e) + try { + context.startActivity(activityIntent) + Log.d(TAG, "AlarmActivity 직접 startActivity 완료") + } catch (e2: Exception) { + Log.e(TAG, "AlarmActivity 실행 실패", e2) + } } } catch (e: Exception) { diff --git a/app/src/main/java/com/example/shiftalarm/SettingsActivity.kt b/app/src/main/java/com/example/shiftalarm/SettingsActivity.kt index 331249a..9b6000c 100644 --- a/app/src/main/java/com/example/shiftalarm/SettingsActivity.kt +++ b/app/src/main/java/com/example/shiftalarm/SettingsActivity.kt @@ -49,8 +49,7 @@ class SettingsActivity : AppCompatActivity() { val targetTab = intent.getIntExtra("TARGET_TAB", 0) binding.viewPager.setCurrentItem(targetTab, false) - binding.btnSave.text = "닫기" - binding.btnSave.setOnClickListener { + binding.btnCloseSettings.setOnClickListener { finish() } } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index b04661b..e96234c 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -7,28 +7,39 @@ android:background="@drawable/bg_mesh_gradient" android:id="@+id/settings_root"> + + + + - - - - - + app:layout_constraintBottom_toBottomOf="parent"/> diff --git a/scratch/release.py b/scratch/release.py index 1f73fd9..04dbfaa 100755 --- a/scratch/release.py +++ b/scratch/release.py @@ -6,18 +6,17 @@ import shutil token = "e3b515eaa0a6683c921ca3bf718e281ed30a6075" owner_repo = "sanjeok77/ShiftRing" -tag = "v1.1.3" -title = "v1.1.3 - 하루 메모 헤더 아이콘 컨테이너 스타일 적용, 사용 설명서 최신화 및 닫기 아이콘 교체, 업데이트 정보 자동 연동" -body = """## 🚀 ShiftRing v1.1.3 릴리즈 +tag = "v1.1.4" +title = "v1.1.4 - 기기 사용 중 전체화면 알람 팝업 보장 및 설정 화면 상단 닫기 아이콘 배치로 화면 공간 극대화" +body = """## 🚀 ShiftRing v1.1.4 릴리즈 ### 🌟 주요 변경 및 개선 사항 -1. **🎨 하루 메모 저장/삭제 아이콘 원형 컨테이너 스타일 적용 (`dialog_day_settings.xml`)**: - - 설정 탭과 일관된 원형 컨테이너 스타일로 개편: 휴지통(레드 `#FF3B30`)과 저장 체크(블루 `#007AFF`) 아이콘을 시각적으로 구분하여 직관성 및 터치 편의성 극대화 -2. **📖 사용 설명서 전면 최신화 및 닫기 아이콘 수정 (`activity_manual.xml`, `ManualActivity.kt`, `MANUAL.md`)**: - - 상단 닫기 버튼을 휴지통 아이콘에서 직관적인 닫기(X) 아이콘(`ic_close`)으로 전면 교체 - - 마크다운 잔여 기호(`**`)를 모두 정돈하고 고대비 컬러 키워드 강조 및 최신 One UI 8.5 기능 가이드로 최신화 -3. **🔄 공지사항(업데이트 정보) 최신화 및 실시간 자동 동기화 (`activity_notice.xml`, `NoticeActivity.kt`, `CHANGELOG.md`)**: - - 닫기 아이콘을 `ic_close`로 교체하고, Gitea 최신 원격 릴리즈 및 로컬 체인지로그와 실시간 자동 연동""" +1. **⏰ 기기 사용(화면 켜짐/잠금해제) 중에도 전체화면 알람창 즉시 팝업 보장 (`AlarmReceiver.kt`, `AlarmForegroundService.kt`, `AlarmActivity.kt`, `AndroidManifest.xml`)**: + - `SYSTEM_ALERT_WINDOW` 및 Android 14+ `ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED` 적용 + - 포그라운드 서비스 라이프사이클을 알람 종료 시점까지 유지하여 시스템 알림(헤드업)에 머무르지 않고 실제 전체화면 `AlarmActivity`가 최상단에 직접 뜨도록 완벽 개선 +2. **📐 설정 화면 하단 고정 닫기 버튼 제거 & 상단 타이틀 옆 닫기(X) 아이콘 배치 (`activity_settings.xml`, `SettingsActivity.kt`)**: + - 하단을 답답하게 차지하던 대형 닫기 바를 제거하고, 상단 '설정' 타이틀 우측에 깔끔한 닫기(X) 아이콘(`btnCloseSettings`)을 배치 + - 설정 탭의 ViewPager2 높이를 화면 하단 끝까지 확장하여 넓고 시원한 One UI 화면 공간 확보""" apk_path = "app/build/outputs/apk/release/app-release.apk" if not os.path.exists(apk_path): @@ -55,10 +54,10 @@ print("Updated app.apk at project root.") # Update version.json v_info = { - "versionCode": 113, - "versionName": "1.1.3", + "versionCode": 114, + "versionName": "1.1.4", "apkUrl": direct_url, - "changelog": "v1.1.3: 하루 메모 아이콘 스타일 개선, 사용 설명서 최신화 및 닫기 버튼 수정, 업데이트 정보 자동 연동", + "changelog": "v1.1.4: 기기 사용 중 전체화면 알람 즉시 팝업 보장, 설정 상단 닫기 아이콘 배치 및 화면 공간 극대화", "forceUpdate": False } with open("version.json", "w", encoding="utf-8") as f: @@ -70,7 +69,7 @@ print(f"Updated version.json with apkUrl: {direct_url}") git_path = r"C:\Users\work\AppData\Roaming\MobaXterm\slash\mx86_64b\bin" os.environ["PATH"] = git_path + os.pathsep + os.environ.get("PATH", "") -commit_msg = "v1.1.3 - 하루 메모 헤더 아이콘 컨테이너 스타일 적용, 사용 설명서 최신화 및 닫기 아이콘 교체, 업데이트 정보 자동 연동" +commit_msg = "v1.1.4 - 기기 사용 중 전체화면 알람 팝업 보장 및 설정 화면 상단 닫기 아이콘 배치로 화면 공간 극대화" subprocess.run(["git", "add", "."], check=True) subprocess.run(["git", "commit", "-m", commit_msg], check=True) subprocess.run(["git", "push", "origin", "main"], check=True) diff --git a/version.json b/version.json index 08524ff..e695f0e 100644 --- a/version.json +++ b/version.json @@ -1,7 +1,7 @@ { - "versionCode": 113, - "versionName": "1.1.3", - "apkUrl": "https://git.webpluss.net/attachments/c78389e6-0036-41e0-8ead-73f719539707", - "changelog": "v1.1.3: 하루 메모 아이콘 스타일 개선, 사용 설명서 최신화 및 닫기 버튼 수정, 업데이트 정보 자동 연동", + "versionCode": 114, + "versionName": "1.1.4", + "apkUrl": "https://git.webpluss.net/attachments/48975b62-8e5c-40bd-82ba-5ddbe4c3e9bc", + "changelog": "v1.1.4: 기기 사용 중 전체화면 알람 즉시 팝업 보장, 설정 상단 닫기 아이콘 배치 및 화면 공간 극대화", "forceUpdate": false } \ No newline at end of file