Skip to content

Commit f21b6b9

Browse files
committed
Merge branch 'hotfix/remove-full-screen-intent'
2 parents 16a265d + 7e39d10 commit f21b6b9

12 files changed

Lines changed: 99 additions & 210 deletions

android/app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<!-- Android 13(API 33) 이상 알림 권한 -->
33
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
44
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
5-
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT"/>
65
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
76
<uses-permission android:name="android.permission.VIBRATE"/>
87

android/app/src/main/kotlin/club/devkor/ontime/NativeAlarmReceiver.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import android.os.Build
1414
class NativeAlarmReceiver : BroadcastReceiver() {
1515
companion object {
1616
private const val TAG = "OnTimeNativeAlarm"
17-
private const val ALARM_CHANNEL_ID = "on_time_alarm_full_screen"
17+
private const val ALARM_CHANNEL_ID = "on_time_alarm"
1818
private const val ALARM_CHANNEL_NAME = "OnTime alarms"
1919
private const val NOTIFICATION_ID_OFFSET = 730000
2020

@@ -223,7 +223,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
223223
"Native alarm broadcast fired requestCode=$requestCode " +
224224
"scheduleId=${extras["scheduleId"]} alarmTime=${extras["alarmTime"]}",
225225
)
226-
postFullScreenAlarmNotification(context, requestCode, extras)
226+
postAlarmNotification(context, requestCode, extras)
227227
}
228228

229229
private fun handleDismissAlarm(context: Context, intent: Intent) {
@@ -246,7 +246,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
246246
)
247247
}
248248

249-
private fun postFullScreenAlarmNotification(
249+
private fun postAlarmNotification(
250250
context: Context,
251251
requestCode: Int,
252252
extras: Map<String, String>,
@@ -265,7 +265,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
265265
return
266266
}
267267
ensureAlarmChannel(manager)
268-
val fullScreenIntent = activityPendingIntentForExtras(
268+
val contentIntent = activityPendingIntentForExtras(
269269
context,
270270
requestCode,
271271
extras,
@@ -294,8 +294,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
294294
.setVisibility(Notification.VISIBILITY_PUBLIC)
295295
.setOngoing(true)
296296
.setAutoCancel(false)
297-
.setFullScreenIntent(fullScreenIntent, true)
298-
.setContentIntent(fullScreenIntent)
297+
.setContentIntent(contentIntent)
299298
.addAction(
300299
Notification.Action.Builder(
301300
context.applicationInfo.icon,
@@ -307,7 +306,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
307306
manager.notify(notificationId(requestCode), notification)
308307
NativeLog.d(
309308
TAG,
310-
"Full-screen alarm notification posted requestCode=$requestCode " +
309+
"Alarm notification posted requestCode=$requestCode " +
311310
"scheduleId=${extras["scheduleId"]}",
312311
)
313312
}
@@ -324,7 +323,7 @@ class NativeAlarmReceiver : BroadcastReceiver() {
324323
ALARM_CHANNEL_NAME,
325324
NotificationManager.IMPORTANCE_HIGH,
326325
).apply {
327-
description = "Full-screen OnTime schedule alarms."
326+
description = "OnTime schedule alarm alerts."
328327
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
329328
setBypassDnd(true)
330329
}

android/settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ plugins {
2222
// START: FlutterFire Configuration
2323
id "com.google.gms.google-services" version "4.4.2" apply false
2424
// END: FlutterFire Configuration
25-
id "org.jetbrains.kotlin.android" version "2.0.20" apply false
25+
id "org.jetbrains.kotlin.android" version "2.2.0" apply false
2626
}
2727

2828
include ":app"

docs/Android-Alarm-Notification-QA.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ signed release AAB or release-equivalent Android build.
88
Do not mark #457 complete until these are satisfied:
99

1010
- #452 provides a signed release AAB or release-equivalent install path.
11-
- #445 full-screen intent declaration material is reviewed or submitted by a
12-
human with Play Console access, per the parent track order.
11+
- The Play-bound Android build removes `USE_FULL_SCREEN_INTENT` and replaces
12+
version code 52 in every affected Play track.
1313
- QA has access to an Android device or emulator with Google Play services, a
1414
backend environment with alarm APIs enabled, and a test account that can create
1515
schedules.
@@ -34,7 +34,7 @@ Minimum recommended coverage:
3434

3535
- Android 13 or newer for `POST_NOTIFICATIONS`.
3636
- Android 12 or newer for exact alarm special access.
37-
- One physical device for boot restore and full-screen alarm behavior.
37+
- One physical device for boot restore and alarm notification behavior.
3838

3939
## Permission Setup
4040

@@ -137,18 +137,19 @@ show fallback behavior instead of native exact alarm scheduling.
137137
Expected result: no native alarm or fallback notification is armed; the app
138138
surfaces permission recovery instead of silently claiming alarm coverage.
139139

140-
### 6. Full-Screen Alarm UI
140+
### 6. Alarm Notification Tap-Through
141141

142142
1. Allow exact alarm special access and notification permission.
143143
2. Create a near-future schedule.
144144
3. Lock the device or put the app in the background.
145145
4. Wait for the alarm.
146-
5. Use the full-screen alarm action to start preparing.
146+
5. Tap the alarm notification to start preparing.
147147
6. Repeat once and dismiss/cancel the ringing alarm instead of starting.
148148

149-
Expected result: `AlarmRingingActivity` appears only for the user-scheduled
150-
alarm moment, the start action routes into schedule preparation, and dismissal
151-
stops ringing/vibration and removes the alarm notification.
149+
Expected result: an alarm notification appears for the user-scheduled alarm
150+
moment, tapping it opens `AlarmRingingActivity`, the start action routes into
151+
schedule preparation, and dismissal stops ringing/vibration and removes the
152+
alarm notification.
152153

153154
### 7. Cancellation
154155

docs/Android-Manifest-Permissions.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@ reload.
1717

1818
| Permission | Status | Justification |
1919
| --- | --- | --- |
20-
| `android.permission.POST_NOTIFICATIONS` | Keep | Required on Android 13+ for OnTime reminder, preparation-step, and alarm notifications. Native alarm fallback also checks this permission before posting the full-screen alarm notification. |
20+
| `android.permission.POST_NOTIFICATIONS` | Keep | Required on Android 13+ for OnTime reminder, preparation-step, and alarm notifications. Native alarm handling also checks this permission before posting alarm notifications. |
2121
| `android.permission.SCHEDULE_EXACT_ALARM` | Keep | Required on Android 12+ for user-scheduled schedule alarms that must fire at the selected time. Native alarm scheduling checks `AlarmManager.canScheduleExactAlarms()` before using `setAlarmClock`. |
22-
| `android.permission.USE_FULL_SCREEN_INTENT` | Keep | Required for the user-scheduled alarm ringing notification to present `AlarmRingingActivity` as a full-screen alarm experience. Usage is tied to alarm-category notifications, not generic or promotional notifications. |
2322
| `android.permission.RECEIVE_BOOT_COMPLETED` | Keep | Required for `NativeAlarmBootReceiver` to restore persisted future native alarms after device restart. The receiver is not exported. |
2423
| `android.permission.VIBRATE` | Keep | Required so alarm and notification channels can use vibration behavior for time-sensitive reminders and alarms. |
2524

26-
No unused app-owned release permission was found during the audit.
25+
No unused app-owned release permission remains in the manifest.
26+
27+
## Removed Permission
28+
29+
| Permission | Status | Reason |
30+
| --- | --- | --- |
31+
| `android.permission.USE_FULL_SCREEN_INTENT` | Removed | Google Play rejected OnTime's declaration for version code 52 and instructed the team to remove this permission from all submitted version codes. OnTime must not declare this permission or call `setFullScreenIntent(...)` in Play-bound builds. |
2732

2833
## Manifest Merge Notes
2934

@@ -63,9 +68,9 @@ Debug and profile merged manifests may additionally contain their variant-owned
6368

6469
- `MainActivity` checks exact alarm and notification permission state before
6570
scheduling native alarms.
66-
- `NativeAlarmReceiver` posts alarm-category full-screen notifications and
67-
skips posting when notification permission is denied.
71+
- `NativeAlarmReceiver` posts alarm-category notifications and skips posting
72+
when notification permission is denied.
6873
- `NativeAlarmBootReceiver` handles boot completion and exact-alarm permission
6974
state changes to restore persisted native alarms.
70-
- `AlarmRingingActivity` is the full-screen alarm UI launched only from the
71-
alarm notification path.
75+
- `AlarmRingingActivity` is the tap-through alarm UI launched from the alarm
76+
notification content intent.

docs/Google-Play-Data-Safety.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ deletion support must be approved by the release owner.
7272
| Alarm device registration | Current device registration sends app-generated device id, platform, app version, OS version, native alarm support, and alarm providers. | Device or other identifiers, app info and performance | Source-backed, backend retention pending |
7373
| Alarm status reporting | Alarm status reports send device id, reconciliation timestamps, schedule window, coverage window, alarm provider, status, permission issue, armed schedule ids, skipped count, and failures. | App info and performance, diagnostics, device or other identifiers | Source-backed, backend retention pending |
7474
| Local alarm registry | Scheduled alarm records are stored locally with schedule id, alarm time, preparation start time, fingerprint, notification ids, provider, schedule title, and payload. | On-device storage; disclose only if transmitted or shared elsewhere | Source-backed |
75-
| Android permissions | Release manifest includes notification, exact alarm, full-screen intent, boot restore, vibration, and dependency-owned network/Firebase/sign-in permissions. It does not include location, contacts, camera, microphone, phone, SMS, storage, calendar, nearby-device, or Bluetooth permissions. | Permission/API evidence for form consistency | Source-backed by #442 |
75+
| Android permissions | Release manifest includes notification, exact alarm, boot restore, vibration, and dependency-owned network/Firebase/sign-in permissions. It does not include full-screen intent, location, contacts, camera, microphone, phone, SMS, storage, calendar, nearby-device, or Bluetooth permissions. | Permission/API evidence for form consistency | Source-backed by #442 |
7676
| Firebase Cloud Messaging SDK | The app uses `firebase_core` and `firebase_messaging`. Firebase documentation says Cloud Messaging collects app version automatically and depends on Firebase Installations; FID and Firebase user agent handling must be considered. | SDK-collected data, device or other identifiers, app info and performance | Source-backed dependency, final SDK review pending |
7777
| Firebase Analytics Product Usage Events | Planned analytics release uses Firebase Analytics for workflow milestone events only, with Help Improve OnTime opt-out, pseudonymous analytics identifiers, schema-versioned event names, app version, platform, workflow result, stable error categories, and coarse counts or durations. The event catalog forbids raw schedule names, notes, place names, preparation step names, email, OAuth identifiers, FCM token, raw exceptions, request bodies, response bodies, and free text. | App activity, app info and performance, device or other identifiers; purposes include Analytics, app functionality, debugging and operations, and non-personalized experiments | Planned; not present in current `pubspec.yaml` until `firebase_analytics` is added |
7878
| Google Play services core SDKs | Google Play services base/basement/tasks may be present through dependencies. Google's disclosure page says the listed core SDKs do not collect end-user data, but app owners remain responsible for the overall disclosure. | SDK review | Dependency review pending |

0 commit comments

Comments
 (0)