Skip to content

Commit d4aa384

Browse files
author
sharayuwadghule
committed
dialog: Add error haptic feedback to showErrorDialog.
Previously, showErrorDialog provided only visual feedback when displaying an error. This can make error notifications easier to miss on devices that support haptic feedback. Call HapticFeedback.errorNotification() when showing an error dialog so users receive platform-appropriate tactile feedback in addition to the visual dialog. Fixes #2338.
1 parent 6e1db2d commit d4aa384

4 files changed

Lines changed: 29 additions & 1 deletion

File tree

ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ SPEC CHECKSUMS:
205205
FirebaseCoreInternal: 7c12fc3011d889085e765e317d7b9fd1cef97af9
206206
FirebaseInstallations: 4e6e162aa4abaaeeeb01dd00179dfc5ad9c2194e
207207
FirebaseMessaging: 341004946fa7ffc741344b20f1b667514fc93e31
208-
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
208+
Flutter: 71a624a5bc0c04062bf19101d501e466baf2fb47
209209
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
210210
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
211211
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326

lib/widgets/dialog.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/cupertino.dart';
22
import 'package:flutter/foundation.dart';
33
import 'package:flutter/material.dart';
4+
import 'package:flutter/services.dart';
5+
46

57
import '../generated/l10n/zulip_localizations.dart';
68
import '../model/settings.dart';
@@ -165,6 +167,7 @@ DialogStatus<void> showErrorDialog({
165167
String? message,
166168
Uri? learnMoreButtonUrl,
167169
}) {
170+
HapticFeedback.errorNotification();
168171
final zulipLocalizations = ZulipLocalizations.of(context);
169172
final future = showDialog<void>(
170173
context: context,

test/flutter_checks.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ extension TextEditingValueChecks on Subject<TextEditingValue> {
6262
Subject<TextRange> get composing => has((x) => x.composing, 'composing');
6363
}
6464

65+
extension MethodCallChecks on Subject<MethodCall> {
66+
Subject<String> get method => has((c) => c.method, 'method');
67+
Subject<Object?> get arguments => has((c) => c.arguments as Object?, 'arguments');
68+
}
69+
6570
//|//////////////////////////////////////////////////////////////
6671
// From 'package:flutter/animation.dart'.
6772
//

test/widgets/dialog_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import 'package:checks/checks.dart';
22
import 'package:flutter/foundation.dart';
33
import 'package:flutter/material.dart';
4+
import 'package:flutter/services.dart';
45
import 'package:flutter_checks/flutter_checks.dart';
56
import 'package:flutter_test/flutter_test.dart';
67
import 'package:url_launcher/url_launcher.dart';
78
import 'package:zulip/model/settings.dart';
89
import 'package:zulip/widgets/app.dart';
910
import 'package:zulip/widgets/dialog.dart';
1011

12+
import '../flutter_checks.dart';
1113
import '../model/binding.dart';
1214
import 'dialog_checks.dart';
1315
import 'test_app.dart';
@@ -38,6 +40,24 @@ void main() {
3840
checkErrorDialog(tester, expectedTitle: title, expectedMessage: message);
3941
}, variant: const TargetPlatformVariant({TargetPlatform.android, TargetPlatform.iOS}));
4042

43+
testWidgets('triggers error haptic feedback', (tester) async {
44+
await prepare(tester);
45+
46+
final calls = <MethodCall>[];
47+
final messenger = TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger;
48+
messenger.setMockMethodCallHandler(SystemChannels.platform, (methodCall) async {
49+
calls.add(methodCall);
50+
return null;
51+
});
52+
53+
showErrorDialog(context: context, title: title, message: message);
54+
await tester.pump();
55+
56+
check(calls).single
57+
..method.equals('HapticFeedback.vibrate')
58+
..arguments.equals('HapticFeedbackType.errorNotification');
59+
}, variant: const TargetPlatformVariant({TargetPlatform.android, TargetPlatform.iOS}));
60+
4161
testWidgets('user closes error dialog', (tester) async {
4262
await prepare(tester);
4363

0 commit comments

Comments
 (0)