@@ -230,6 +230,91 @@ void main() {
230230 await resumed.close ();
231231 });
232232
233+ // If permissions are permanently denied, permission request will not show.
234+ testWidgets ('Required permission permanently denied' , (tester) async {
235+ final testStub = MockTestStub ();
236+ when (testStub.getSharedPreference ())
237+ .thenAnswer ((realInvocation) => Future .value (prefs));
238+ when (testStub.status (Permission .location))
239+ .thenAnswer ((realInvocation) => Future .value (PermissionStatus .permanentlyDenied));
240+ when (testStub.openAppSettings ())
241+ .thenAnswer ((realInvocation) => Future .value ());
242+
243+ final config = FlutterForcePermissionConfig (
244+ title: 'Title' ,
245+ confirmText: 'Confirm' ,
246+ permissionItemConfigs: [
247+ PermissionItemConfig (
248+ permissions: [
249+ Permission .location,
250+ ],
251+ itemText: PermissionItemText (
252+ header: 'Foreground location' ,
253+ rationaleText: 'Rationale' ,
254+ forcedPermissionDialogConfig: ForcedPermissionDialogConfig (
255+ title: 'Location required' ,
256+ text: 'Location needed for proper operation' ,
257+ buttonText: 'Settings' ,
258+ ),
259+ ),
260+ required : true ,
261+ ),
262+ ],
263+ );
264+ final status = < Permission , PermissionServiceStatus > {
265+ Permission .location: PermissionServiceStatus (
266+ status: PermissionStatus .denied,
267+ requested: false ,
268+ serviceStatus: ServiceStatus .enabled,
269+ ),
270+ };
271+ final StreamController <bool > resumed = StreamController .broadcast ()
272+ ..add (true );
273+
274+ await tester.pumpWidget (
275+ MaterialApp (
276+ home: DisclosurePage .stub (
277+ permissionConfig: config,
278+ permissionStatuses: status,
279+ service: testStub,
280+ resumed: resumed,
281+ ),
282+ ),
283+ );
284+
285+ expect (find.text ('Title' ), findsOneWidget);
286+ expect (find.text ('Foreground location' ), findsOneWidget);
287+ expect (find.text ('Rationale' ), findsOneWidget);
288+ expect (find.text ('Confirm' ), findsOneWidget);
289+
290+ await tester.tap (find.text ('Confirm' ));
291+ await tester.pump ();
292+
293+ expect (find.text ('Location required' ), findsOneWidget);
294+ expect (find.text ('Location needed for proper operation' ), findsOneWidget);
295+ expect (find.text ('Settings' ), findsOneWidget);
296+
297+ await tester.tap (find.text ('Settings' ));
298+ await tester.pump ();
299+
300+ verify (testStub.openAppSettings ());
301+
302+ resumed.add (true );
303+ await tester.pump ();
304+
305+ expect (find.text ('Settings' ), findsOneWidget);
306+ await tester.tap (find.text ('Settings' ));
307+
308+ when (testStub.status (Permission .location))
309+ .thenAnswer ((realInvocation) => Future .value (PermissionStatus .granted));
310+ resumed.add (true );
311+ await tester.pump ();
312+
313+ expect (find.text ('Settings' ), findsNothing);
314+
315+ await resumed.close ();
316+ });
317+
233318 testWidgets ('Required service permission' , (tester) async {
234319 final testStub = MockTestStub ();
235320 when (testStub.getSharedPreference ())
0 commit comments