v1.1.4 - 기기 사용 중 전체화면 알람 팝업 보장 및 설정 화면 상단 닫기 아이콘 배치로 화면 공간 극대화

This commit is contained in:
sanjeok77
2026-08-14 10:51:32 +09:00
parent 16dc0fed9e
commit a00f009b44
10 changed files with 78 additions and 64 deletions
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -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"
}
+1
View File
@@ -10,6 +10,7 @@
<!-- Alarm & Full Screen -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- Service & Notification -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
@@ -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)
}
@@ -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
@@ -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) {
@@ -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()
}
}
+17 -27
View File
@@ -7,28 +7,39 @@
android:background="@drawable/bg_mesh_gradient"
android:id="@+id/settings_root">
<!-- Top Header: Title + Close Icon Button -->
<LinearLayout
android:id="@+id/settingsHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingTop="4dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:paddingEnd="16dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent">
<TextView
android:id="@+id/settingsTitle"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="설정"
android:textColor="@color/text_primary"
android:textSize="32sp"
android:textSize="30sp"
android:textStyle="bold"
android:letterSpacing="-0.03"/>
<ImageButton
android:id="@+id/btnCloseSettings"
android:layout_width="44dp"
android:layout_height="44dp"
android:src="@drawable/ic_close"
android:background="?attr/selectableItemBackgroundBorderless"
app:tint="@color/text_primary"
android:padding="10dp"/>
</LinearLayout>
<com.google.android.material.tabs.TabLayout
@@ -46,33 +57,12 @@
android:background="@android:color/transparent"
app:layout_constraintTop_toBottomOf="@id/settingsHeader"/>
<!-- Full-height ViewPager2 without cramped bottom bar -->
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tabLayout"
app:layout_constraintBottom_toTopOf="@id/bottomActionLayout"/>
<LinearLayout
android:id="@+id/bottomActionLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:background="@android:color/transparent"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="58dp"
android:text="닫기"
android:textSize="17sp"
android:textStyle="bold"
android:textColor="#FFFFFF"
app:cornerRadius="29dp"
android:backgroundTint="@color/primary"
android:elevation="6dp"
android:stateListAnimator="@null"/>
</LinearLayout>
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
+13 -14
View File
@@ -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)
+4 -4
View File
@@ -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
}