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:
@@ -40,7 +40,6 @@ class _NotificationCenterScreenState extends State<NotificationCenterScreen>
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tabController = TabController(length: 2, vsync: this);
|
||||
unawaited(NotificationInboxService.instance.removeByType('prayer'));
|
||||
_alarmsFuture = NotificationService.instance.pendingAlerts();
|
||||
NotificationAnalyticsService.instance.track(
|
||||
'notif_inbox_opened',
|
||||
|
||||
@@ -749,6 +749,36 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
|
||||
trailing: const Icon(LucideIcons.chevronRight, size: 20),
|
||||
onTap: () => _showPushCapDialog(context),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
_settingRow(
|
||||
isDark,
|
||||
icon: LucideIcons.flame,
|
||||
iconColor: const Color(0xFFE17055),
|
||||
title: 'Peringatan Streak',
|
||||
subtitle: 'Tilawah & dzikir belum tercatat',
|
||||
trailing: IosToggle(
|
||||
value: _settings.streakRiskEnabled,
|
||||
onChanged: (v) {
|
||||
_settings.streakRiskEnabled = v;
|
||||
_saveSettings();
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
_settingRow(
|
||||
isDark,
|
||||
icon: LucideIcons.calendarDays,
|
||||
iconColor: const Color(0xFF7B61FF),
|
||||
title: 'Ringkasan Mingguan',
|
||||
subtitle: 'Ringkasan ibadah setiap hari Senin',
|
||||
trailing: IosToggle(
|
||||
value: _settings.weeklySummaryEnabled,
|
||||
onChanged: (v) {
|
||||
_settings.weeklySummaryEnabled = v;
|
||||
_saveSettings();
|
||||
},
|
||||
),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -963,7 +993,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
|
||||
icon: LucideIcons.info,
|
||||
iconColor: AppColors.sage,
|
||||
title: 'Versi Aplikasi',
|
||||
subtitle: '1.0.8',
|
||||
subtitle: '1.1.0',
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
_settingRow(
|
||||
|
||||
Reference in New Issue
Block a user