Skip to content

Commit 607ba3e

Browse files
authored
Merge pull request #8 from gogovan/fix/required-perm
fix requesting permissions may request requested permissions
2 parents cad6069 + b9a7b90 commit 607ba3e

File tree

2 files changed

+90
-99
lines changed

2 files changed

+90
-99
lines changed

lib/flutter_force_permission.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,9 @@ class FlutterForcePermission {
4848
var needShow = false;
4949
for (final permConfig in config.permissionItemConfigs) {
5050
for (final perm in permConfig.permissions) {
51-
if (!(permissionStatuses[perm]?.requested ?? true)) {
52-
needShow = true;
53-
break;
54-
}
5551
if (permissionStatuses[perm]?.status != PermissionStatus.granted &&
56-
permConfig.required) {
52+
(permConfig.required ||
53+
!(permissionStatuses[perm]?.requested ?? true))) {
5754
needShow = true;
5855
break;
5956
}

lib/src/views/disclosure_page.dart

Lines changed: 88 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,14 @@ class DisclosurePage extends StatefulWidget {
4545
State<DisclosurePage> createState() => _DisclosurePageState();
4646
}
4747

48-
@immutable
49-
class _PermissionItem {
50-
const _PermissionItem(this.permission, this.itemText);
51-
52-
final Permission permission;
53-
final PermissionItemText itemText;
54-
55-
@override
56-
bool operator ==(Object other) =>
57-
identical(this, other) ||
58-
other is _PermissionItem &&
59-
runtimeType == other.runtimeType &&
60-
permission == other.permission &&
61-
itemText == other.itemText;
62-
63-
@override
64-
int get hashCode => permission.hashCode ^ itemText.hashCode;
65-
66-
@override
67-
String toString() =>
68-
'_PermissionItem{permission: $permission, itemText: $itemText}';
48+
class _DisplayItem {
49+
_DisplayItem({
50+
required this.config,
51+
required this.isService,
52+
});
53+
54+
final PermissionItemConfig config;
55+
final bool isService;
6956
}
7057

7158
class _DisclosurePageState extends State<DisclosurePage>
@@ -94,6 +81,37 @@ class _DisclosurePageState extends State<DisclosurePage>
9481
super.dispose();
9582
}
9683

84+
List<_DisplayItem> _getRequestingPermissions() =>
85+
widget.permissionConfig.permissionItemConfigs.expand((e) {
86+
var denied = false;
87+
var requested = false;
88+
var serviceDisabled = false;
89+
for (final Permission p in e.permissions) {
90+
if (widget.permissionStatuses[p]?.status !=
91+
PermissionStatus.granted) {
92+
denied = true;
93+
}
94+
if (widget.permissionStatuses[p]?.requested ?? true) {
95+
requested = true;
96+
}
97+
if (widget.permissionStatuses[p]?.serviceStatus ==
98+
ServiceStatus.disabled) {
99+
serviceDisabled = true;
100+
}
101+
}
102+
final serviceText = e.serviceItemText;
103+
104+
final List<_DisplayItem> result = [];
105+
if (serviceDisabled && serviceText != null && e.required) {
106+
result.add(_DisplayItem(config: e, isService: true));
107+
}
108+
if (denied && (!requested || e.required)) {
109+
result.add(_DisplayItem(config: e, isService: false));
110+
}
111+
112+
return result;
113+
}).toList();
114+
97115
@override
98116
Widget build(BuildContext context) {
99117
final titleWidget = Column(
@@ -107,37 +125,7 @@ class _DisclosurePageState extends State<DisclosurePage>
107125
],
108126
);
109127

110-
final permissionItems =
111-
widget.permissionConfig.permissionItemConfigs.expand((e) {
112-
var denied = false;
113-
var requested = false;
114-
var serviceDisabled = false;
115-
for (final Permission p in e.permissions) {
116-
if (widget.permissionStatuses[p]?.status != PermissionStatus.granted) {
117-
denied = true;
118-
}
119-
if (widget.permissionStatuses[p]?.requested ?? true) {
120-
requested = true;
121-
}
122-
if (widget.permissionStatuses[p]?.serviceStatus ==
123-
ServiceStatus.disabled) {
124-
serviceDisabled = true;
125-
}
126-
}
127-
final itemText = e.itemText;
128-
final serviceText = e.serviceItemText;
129-
final permission = e.permissions.first;
130-
131-
final List<_PermissionItem> result = [];
132-
if (serviceDisabled && serviceText != null) {
133-
result.add(_PermissionItem(permission, serviceText));
134-
}
135-
if (denied && !requested) {
136-
result.add(_PermissionItem(permission, itemText));
137-
}
138-
139-
return result;
140-
}).toList();
128+
final permissionItems = _getRequestingPermissions();
141129

142130
return Scaffold(
143131
body: Column(
@@ -152,7 +140,10 @@ class _DisclosurePageState extends State<DisclosurePage>
152140
return titleWidget;
153141
} else {
154142
final item = permissionItems[index - 1];
155-
var icon = item.itemText.icon;
143+
final config = item.isService
144+
? item.config.serviceItemText
145+
: item.config.itemText;
146+
var icon = config?.icon;
156147
icon ??= Icon(
157148
Icons.perm_device_info_sharp,
158149
color: Theme.of(context).primaryColor,
@@ -170,7 +161,7 @@ class _DisclosurePageState extends State<DisclosurePage>
170161
children: [
171162
Flexible(
172163
child: Text(
173-
item.itemText.header,
164+
config?.header ?? '',
174165
style: Theme.of(context).textTheme.subtitle1,
175166
softWrap: true,
176167
overflow: TextOverflow.ellipsis,
@@ -179,7 +170,7 @@ class _DisclosurePageState extends State<DisclosurePage>
179170
),
180171
Flexible(
181172
child: Text(
182-
item.itemText.rationaleText,
173+
config?.rationaleText ?? '',
183174
style: Theme.of(context).textTheme.bodyText2,
184175
softWrap: true,
185176
overflow: TextOverflow.ellipsis,
@@ -215,53 +206,56 @@ class _DisclosurePageState extends State<DisclosurePage>
215206

216207
// Request permissions one by one because in some cases requesting
217208
// multiple permissions does not ask the user as expected.
218-
for (final PermissionItemConfig permConfig
219-
in widget.permissionConfig.permissionItemConfigs) {
220-
for (final Permission perm in permConfig.permissions) {
221-
if (permConfig.required && perm is PermissionWithService) {
222-
final text = permConfig.serviceItemText;
223-
if (text != null) {
224-
var serviceStatus = await widget._service.serviceStatus(perm);
225-
while (serviceStatus == ServiceStatus.disabled) {
226-
if (perm == Permission.phone) {
227-
await _showRequiredPermDialog(text, _showPhoneSettings);
228-
} else if (perm == Permission.location ||
229-
perm == Permission.locationAlways ||
230-
perm == Permission.locationWhenInUse) {
231-
await _showRequiredPermDialog(text, _showLocationSettings);
232-
} else {
233-
if (kDebugMode) {
234-
print(
235-
'[flutter-force-permission] WARN: Unsupported Permission with service $perm found.',
236-
);
209+
for (final _DisplayItem item in _getRequestingPermissions()) {
210+
if (item.isService) {
211+
final text = item.config.serviceItemText;
212+
if (text != null) {
213+
for (final Permission perm in item.config.permissions) {
214+
if (perm is PermissionWithService) {
215+
var serviceStatus = await widget._service.serviceStatus(perm);
216+
while (serviceStatus == ServiceStatus.disabled) {
217+
if (perm == Permission.phone) {
218+
await _showRequiredPermDialog(text, _showPhoneSettings);
219+
} else if (perm == Permission.location ||
220+
perm == Permission.locationAlways ||
221+
perm == Permission.locationWhenInUse) {
222+
await _showRequiredPermDialog(text, _showLocationSettings);
223+
} else {
224+
if (kDebugMode) {
225+
print(
226+
'[flutter-force-permission] WARN: Unsupported Permission with service $perm found.',
227+
);
228+
}
229+
break;
237230
}
238-
break;
231+
// ignore: avoid-ignoring-return-values, not needed.
232+
await widget._resumed.stream.firstWhere((element) => element);
233+
serviceStatus = await widget._service.serviceStatus(perm);
239234
}
235+
}
236+
}
237+
}
238+
} else {
239+
for (final Permission perm in item.config.permissions) {
240+
// ignore: avoid-ignoring-return-values, not needed.
241+
await widget._service.request(perm);
242+
243+
if (item.config.required) {
244+
var permStatus = await widget._service.status(perm);
245+
while (permStatus != PermissionStatus.granted) {
246+
await _showRequiredPermDialog(
247+
item.config.itemText,
248+
_showAppSettings,
249+
);
240250
// ignore: avoid-ignoring-return-values, not needed.
241251
await widget._resumed.stream.firstWhere((element) => element);
242-
serviceStatus = await widget._service.serviceStatus(perm);
252+
permStatus = await widget._service.status(perm);
243253
}
244254
}
245-
}
246255

247-
// ignore: avoid-ignoring-return-values, not needed.
248-
await widget._service.request(perm);
249-
250-
if (permConfig.required) {
251-
var permStatus = await widget._service.status(perm);
252-
while (permStatus != PermissionStatus.granted) {
253-
await _showRequiredPermDialog(
254-
permConfig.itemText,
255-
_showAppSettings,
256-
);
257-
// ignore: avoid-ignoring-return-values, not needed.
258-
await widget._resumed.stream.firstWhere((element) => element);
259-
permStatus = await widget._service.status(perm);
260-
}
256+
// ignore: avoid-ignoring-return-values, not needed.
257+
await prefs.setBool(getRequestedPrefKey(perm), true);
261258
}
262-
263-
// ignore: avoid-ignoring-return-values, not needed.
264-
await prefs.setBool(getRequestedPrefKey(perm), true);
265259
}
266260
}
267261

0 commit comments

Comments
 (0)