Notification system audit: fix 6 defects, close 5 gaps, add rich notifications (v1.1.0)

Defects fixed:
- D1: Fix notification ID range collision (report reminders 700k→2M+)
- D2: Streak risk now checks both dzikir pagi & petang
- D3: _cancelPrayerPending no longer kills non-prayer notifications
- D4: Push notifications carry deeplink in payload for proper routing
- D5: Add reconfigureTimeZoneIfNeeded() for TZ change detection
- D6: Defer launch notification routing until widget tree is ready

Gaps closed:
- G1: Add streak risk + weekly summary toggles to settings UI
- G2: Verified boot reschedule already in place (flutter_local_notifications v21)
- G3: Remove unused mirrorAdzanToInbox field and legacy cleanup calls
- G4: Add notif_push_opened analytics tracking
- G5: Add notif_settings_changed analytics tracking

Enhancements:
- O1: Rich notification with Sudah Sholat action button on report reminders
- O2: Permission check on app resume via WidgetsBindingObserver (30s throttle)
- O2b: Fix stretched notification icon (white crescent moon vector drawable)
- O3: Expired inbox cleanup in background sync
- O4: Haptic feedback on notification bell quick actions

Bump version 1.0.8+9 → 1.1.0+10
This commit is contained in:
Dwindi Ramadhana
2026-06-06 22:38:02 +07:00
parent 2bd8e3666a
commit 4badfb6521
13 changed files with 420 additions and 37 deletions

View File

@@ -101,9 +101,6 @@ class AppSettings extends HiveObject {
@HiveField(31)
int maxNonPrayerPushPerDay;
@HiveField(32)
bool mirrorAdzanToInbox;
@HiveField(33)
bool tilawahAutoContinueNextSurah;
@@ -152,7 +149,6 @@ class AppSettings extends HiveObject {
this.quietHoursStart = '22:00',
this.quietHoursEnd = '05:00',
this.maxNonPrayerPushPerDay = 2,
this.mirrorAdzanToInbox = false,
this.tilawahAutoContinueNextSurah = true,
this.shalatReportReminderEnabled = true,
this.shalatReportReminderDelayMinutes = 30,

View File

@@ -70,8 +70,6 @@ class AppSettingsAdapter extends TypeAdapter<AppSettings> {
fields.containsKey(30) ? fields[30] as String? ?? '05:00' : '05:00',
maxNonPrayerPushPerDay:
fields.containsKey(31) ? fields[31] as int? ?? 2 : 2,
mirrorAdzanToInbox:
fields.containsKey(32) ? fields[32] as bool? ?? false : false,
tilawahAutoContinueNextSurah:
fields.containsKey(33) ? fields[33] as bool? ?? true : true,
shalatReportReminderEnabled:
@@ -88,7 +86,7 @@ class AppSettingsAdapter extends TypeAdapter<AppSettings> {
@override
void write(BinaryWriter writer, AppSettings obj) {
writer
..writeByte(38)
..writeByte(37)
..writeByte(0)
..write(obj.userName)
..writeByte(1)
@@ -153,8 +151,6 @@ class AppSettingsAdapter extends TypeAdapter<AppSettings> {
..write(obj.quietHoursEnd)
..writeByte(31)
..write(obj.maxNonPrayerPushPerDay)
..writeByte(32)
..write(obj.mirrorAdzanToInbox)
..writeByte(33)
..write(obj.tilawahAutoContinueNextSurah)
..writeByte(34)