diff --git a/mobile/lib/features/settings/settings_page.dart b/mobile/lib/features/settings/settings_page.dart index 174310a27d..4d9199be74 100644 --- a/mobile/lib/features/settings/settings_page.dart +++ b/mobile/lib/features/settings/settings_page.dart @@ -12,7 +12,6 @@ import 'package:package_info_plus/package_info_plus.dart'; import '../../shared/auth/auth.dart'; import '../../shared/clipboard_utils.dart'; import '../../shared/success_haptic.dart'; -import '../../shared/push/push_bridge.dart'; import '../../shared/push/push_relay_capability_provider.dart'; import '../../shared/relay/relay.dart'; import '../../shared/utils/string_utils.dart'; diff --git a/mobile/lib/features/settings/settings_page/notifications_section.dart b/mobile/lib/features/settings/settings_page/notifications_section.dart index 8383b90403..34b46a4cd0 100644 --- a/mobile/lib/features/settings/settings_page/notifications_section.dart +++ b/mobile/lib/features/settings/settings_page/notifications_section.dart @@ -22,49 +22,14 @@ class _NotificationsSection extends ConsumerWidget { !optOutPending) { return const SizedBox.shrink(); } - final authorization = ref.watch(buzzPushAuthorizationStatusProvider); - final status = authorization.value; - final permissionUnavailable = authorization.hasError; - final permissionDenied = status == BuzzPushAuthorizationStatus.denied; - final showSettingsRecovery = - optOutPending || - (community.pushNotificationsEnabled && - (permissionDenied || permissionUnavailable)); final canToggle = hasCapability || community.pushNotificationsEnabled; - final subtitle = optOutPending - ? 'Waiting for relay confirmation; notifications may continue' - : !community.pushNotificationsEnabled - ? 'Off for this community' - : !hasCapability - ? 'Push support unavailable; you can still turn notifications off' - : switch (status) { - BuzzPushAuthorizationStatus.notDetermined => - 'Waiting for iOS notification permission', - BuzzPushAuthorizationStatus.denied => - 'Enabled in Buzz, but disabled in iOS Settings', - BuzzPushAuthorizationStatus.authorized || - BuzzPushAuthorizationStatus.provisional || - BuzzPushAuthorizationStatus.ephemeral => - 'Receive message notifications from this community', - null when authorization.isLoading => - 'Checking iOS notification permission', - null => 'Enabled in Buzz; iOS permission status unavailable', - }; return AppListCard( - label: 'Notifications', verticalPadding: Grid.twelve, children: [ AppListRow( key: const ValueKey('push-notifications-enabled'), - icon: BuzzIcons.bell, - title: 'Push notifications', - subtitle: subtitle, - subtitleStyle: showSettingsRecovery - ? context.textTheme.bodySmall?.copyWith( - color: context.colors.error, - ) - : null, + title: 'Notifications', trailing: Switch.adaptive( value: community.pushNotificationsEnabled, onChanged: !canToggle @@ -86,15 +51,6 @@ class _NotificationsSection extends ConsumerWidget { ), ), ), - if (showSettingsRecovery) - AppListRow( - key: const ValueKey('push-notifications-open-settings'), - icon: BuzzIcons.settings, - title: 'Open iOS Notification Settings', - onTap: () => unawaited( - ref.read(buzzPushNotificationSettingsOpenerProvider)(), - ), - ), ], ); } diff --git a/mobile/test/features/settings/notification_recovery_test.dart b/mobile/test/features/settings/notification_recovery_test.dart index 7f95680686..25cd70ecc1 100644 --- a/mobile/test/features/settings/notification_recovery_test.dart +++ b/mobile/test/features/settings/notification_recovery_test.dart @@ -61,7 +61,6 @@ void main() { final pending = Completer(); final snapshots = >[]; final tombstones = []; - var settingsOpened = 0; var relayAvailable = false; await tester.pumpWidget( ProviderScope( @@ -90,12 +89,6 @@ void main() { buzzPushAuthorizationStatusReaderProvider.overrideWithValue( () async => BuzzPushAuthorizationStatus.denied, ), - buzzPushNotificationSettingsOpenerProvider.overrideWithValue( - () async { - settingsOpened++; - return true; - }, - ), ], child: MaterialApp( theme: AppTheme.light(), @@ -117,17 +110,6 @@ void main() { '${container.read(activeCommunityProvider)} / ${container.read(communityListProvider)}', ); expect(tester.widget(find.byType(Switch)).value, isTrue); - expect( - find.text( - 'Push support unavailable; you can still turn notifications off', - ), - findsOneWidget, - ); - await tester.tap( - find.byKey(const ValueKey('push-notifications-open-settings')), - ); - await tester.pump(); - expect(settingsOpened, 1); await tester.tap(find.byType(Switch)); await tester.pumpAndSettle(); final stored = (await storage.loadAll()).single; @@ -135,18 +117,9 @@ void main() { expect(stored.pushSubscriptionState.pendingTombstoneGeneration, 8); expect(tombstones, [8]); expect(snapshots.last.single.pushNotificationsEnabled, isFalse); - expect( - find.text('Waiting for relay confirmation; notifications may continue'), - findsOneWidget, - ); final offSwitch = tester.widget(find.byType(Switch)); expect(offSwitch.value, isFalse); expect(offSwitch.onChanged, isNull); - await tester.tap( - find.byKey(const ValueKey('push-notifications-open-settings')), - ); - await tester.pump(); - expect(settingsOpened, 2); relayAvailable = true; await container .read(communityListProvider.notifier) diff --git a/mobile/test/features/settings/settings_page_test.dart b/mobile/test/features/settings/settings_page_test.dart index d587159e3d..5cc2f78b38 100644 --- a/mobile/test/features/settings/settings_page_test.dart +++ b/mobile/test/features/settings/settings_page_test.dart @@ -194,109 +194,6 @@ void main() { debugDefaultTargetPlatformOverride = null; }); - testWidgets('shows denied display permission and opens iOS settings', ( - tester, - ) async { - debugDefaultTargetPlatformOverride = TargetPlatform.iOS; - addTearDown(() => debugDefaultTargetPlatformOverride = null); - SharedPreferences.setMockInitialValues({}); - final prefs = await SharedPreferences.getInstance(); - final community = Community.create( - name: 'Team', - relayUrl: 'wss://relay.example', - ).copyWith(pushNotificationsEnabled: true); - var openSettingsCalls = 0; - - await tester.pumpWidget( - ProviderScope( - overrides: [ - savedPrefsProvider.overrideWithValue(prefs), - activeCommunityProvider.overrideWith((ref) async => community), - currentRelayPushDescriptorProvider.overrideWith( - (ref) async => _pushDescriptor, - ), - appLifecycleProvider.overrideWith(_SettingsLifecycleNotifier.new), - buzzPushAuthorizationStatusReaderProvider.overrideWithValue( - () async => BuzzPushAuthorizationStatus.denied, - ), - buzzPushNotificationSettingsOpenerProvider.overrideWithValue( - () async { - openSettingsCalls += 1; - return true; - }, - ), - ], - child: MaterialApp( - theme: AppTheme.light(), - home: SettingsPage( - profileHeader: const SizedBox.shrink(), - identityRecoveryPageBuilder: (_) => const SizedBox.shrink(), - ), - ), - ), - ); - await tester.pumpAndSettle(); - - expect(tester.widget(find.byType(Switch)).value, isTrue); - expect( - find.text('Enabled in Buzz, but disabled in iOS Settings'), - findsOneWidget, - ); - await tester.tap( - find.byKey(const ValueKey('push-notifications-open-settings')), - ); - await tester.pump(); - expect(openSettingsCalls, 1); - debugDefaultTargetPlatformOverride = null; - }); - - testWidgets('shows permission lookup errors with settings recovery', ( - tester, - ) async { - debugDefaultTargetPlatformOverride = TargetPlatform.iOS; - addTearDown(() => debugDefaultTargetPlatformOverride = null); - SharedPreferences.setMockInitialValues({}); - final prefs = await SharedPreferences.getInstance(); - final community = Community.create( - name: 'Team', - relayUrl: 'wss://relay.example', - ).copyWith(pushNotificationsEnabled: true); - - await tester.pumpWidget( - ProviderScope( - overrides: [ - savedPrefsProvider.overrideWithValue(prefs), - activeCommunityProvider.overrideWith((ref) async => community), - currentRelayPushDescriptorProvider.overrideWith( - (ref) async => _pushDescriptor, - ), - appLifecycleProvider.overrideWith(_SettingsLifecycleNotifier.new), - buzzPushAuthorizationStatusReaderProvider.overrideWithValue( - () async => throw StateError('authorization unavailable'), - ), - ], - child: MaterialApp( - theme: AppTheme.light(), - home: SettingsPage( - profileHeader: const SizedBox.shrink(), - identityRecoveryPageBuilder: (_) => const SizedBox.shrink(), - ), - ), - ), - ); - await tester.pumpAndSettle(); - - expect( - find.text('Enabled in Buzz; iOS permission status unavailable'), - findsOneWidget, - ); - expect( - find.byKey(const ValueKey('push-notifications-open-settings')), - findsOneWidget, - ); - debugDefaultTargetPlatformOverride = null; - }); - for (final brightness in Brightness.values) { testWidgets( 'shows status above profile editing and routes photo directly in ${brightness.name}',