Skip to content

Commit 5f62fc4

Browse files
committed
fix request with service may not be correctly shown
1 parent 1e83230 commit 5f62fc4

File tree

1 file changed

+61
-46
lines changed

1 file changed

+61
-46
lines changed

lib/src/views/disclosure_page.dart

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

48+
class _DisplayItem {
49+
_DisplayItem({
50+
required this.config,
51+
required this.isService,
52+
});
53+
54+
final PermissionItemConfig config;
55+
final bool isService;
56+
}
57+
4858
class _DisclosurePageState extends State<DisclosurePage>
4959
with
5060
// ignore: prefer_mixin, WidgetsBindingObserver is Framework code
@@ -71,7 +81,7 @@ class _DisclosurePageState extends State<DisclosurePage>
7181
super.dispose();
7282
}
7383

74-
List<PermissionItemConfig> _getRequestingPermissions() =>
84+
List<_DisplayItem> _getRequestingPermissions() =>
7585
widget.permissionConfig.permissionItemConfigs.expand((e) {
7686
var denied = false;
7787
var requested = false;
@@ -91,12 +101,12 @@ class _DisclosurePageState extends State<DisclosurePage>
91101
}
92102
final serviceText = e.serviceItemText;
93103

94-
final List<PermissionItemConfig> result = [];
95-
if (serviceDisabled && serviceText != null) {
96-
result.add(e);
104+
final List<_DisplayItem> result = [];
105+
if (serviceDisabled && serviceText != null && e.required) {
106+
result.add(_DisplayItem(config: e, isService: true));
97107
}
98108
if (denied && (!requested || e.required)) {
99-
result.add(e);
109+
result.add(_DisplayItem(config: e, isService: false));
100110
}
101111

102112
return result;
@@ -130,7 +140,8 @@ class _DisclosurePageState extends State<DisclosurePage>
130140
return titleWidget;
131141
} else {
132142
final item = permissionItems[index - 1];
133-
var icon = item.itemText.icon;
143+
final config = item.isService ? item.config.serviceItemText : item.config.itemText;
144+
var icon = config?.icon;
134145
icon ??= Icon(
135146
Icons.perm_device_info_sharp,
136147
color: Theme.of(context).primaryColor,
@@ -148,7 +159,7 @@ class _DisclosurePageState extends State<DisclosurePage>
148159
children: [
149160
Flexible(
150161
child: Text(
151-
item.itemText.header,
162+
config?.header ?? '',
152163
style: Theme.of(context).textTheme.subtitle1,
153164
softWrap: true,
154165
overflow: TextOverflow.ellipsis,
@@ -157,7 +168,7 @@ class _DisclosurePageState extends State<DisclosurePage>
157168
),
158169
Flexible(
159170
child: Text(
160-
item.itemText.rationaleText,
171+
config?.rationaleText ?? '',
161172
style: Theme.of(context).textTheme.bodyText2,
162173
softWrap: true,
163174
overflow: TextOverflow.ellipsis,
@@ -193,52 +204,56 @@ class _DisclosurePageState extends State<DisclosurePage>
193204

194205
// Request permissions one by one because in some cases requesting
195206
// multiple permissions does not ask the user as expected.
196-
for (final PermissionItemConfig permConfig in _getRequestingPermissions()) {
197-
for (final Permission perm in permConfig.permissions) {
198-
if (permConfig.required && perm is PermissionWithService) {
199-
final text = permConfig.serviceItemText;
200-
if (text != null) {
201-
var serviceStatus = await widget._service.serviceStatus(perm);
202-
while (serviceStatus == ServiceStatus.disabled) {
203-
if (perm == Permission.phone) {
204-
await _showRequiredPermDialog(text, _showPhoneSettings);
205-
} else if (perm == Permission.location ||
206-
perm == Permission.locationAlways ||
207-
perm == Permission.locationWhenInUse) {
208-
await _showRequiredPermDialog(text, _showLocationSettings);
209-
} else {
210-
if (kDebugMode) {
211-
print(
212-
'[flutter-force-permission] WARN: Unsupported Permission with service $perm found.',
213-
);
207+
for (final _DisplayItem item in _getRequestingPermissions()) {
208+
if (item.isService) {
209+
final text = item.config.serviceItemText;
210+
if (text != null) {
211+
for (final Permission perm in item.config.permissions) {
212+
if (perm is PermissionWithService) {
213+
var serviceStatus = await widget._service.serviceStatus(perm);
214+
while (serviceStatus == ServiceStatus.disabled) {
215+
if (perm == Permission.phone) {
216+
await _showRequiredPermDialog(text, _showPhoneSettings);
217+
} else if (perm == Permission.location ||
218+
perm == Permission.locationAlways ||
219+
perm == Permission.locationWhenInUse) {
220+
await _showRequiredPermDialog(text, _showLocationSettings);
221+
} else {
222+
if (kDebugMode) {
223+
print(
224+
'[flutter-force-permission] WARN: Unsupported Permission with service $perm found.',
225+
);
226+
}
227+
break;
214228
}
215-
break;
229+
// ignore: avoid-ignoring-return-values, not needed.
230+
await widget._resumed.stream.firstWhere((element) => element);
231+
serviceStatus = await widget._service.serviceStatus(perm);
216232
}
233+
}
234+
}
235+
}
236+
} else {
237+
for (final Permission perm in item.config.permissions) {
238+
// ignore: avoid-ignoring-return-values, not needed.
239+
await widget._service.request(perm);
240+
241+
if (item.config.required) {
242+
var permStatus = await widget._service.status(perm);
243+
while (permStatus != PermissionStatus.granted) {
244+
await _showRequiredPermDialog(
245+
item.config.itemText,
246+
_showAppSettings,
247+
);
217248
// ignore: avoid-ignoring-return-values, not needed.
218249
await widget._resumed.stream.firstWhere((element) => element);
219-
serviceStatus = await widget._service.serviceStatus(perm);
250+
permStatus = await widget._service.status(perm);
220251
}
221252
}
222-
}
223253

224-
// ignore: avoid-ignoring-return-values, not needed.
225-
await widget._service.request(perm);
226-
227-
if (permConfig.required) {
228-
var permStatus = await widget._service.status(perm);
229-
while (permStatus != PermissionStatus.granted) {
230-
await _showRequiredPermDialog(
231-
permConfig.itemText,
232-
_showAppSettings,
233-
);
234-
// ignore: avoid-ignoring-return-values, not needed.
235-
await widget._resumed.stream.firstWhere((element) => element);
236-
permStatus = await widget._service.status(perm);
237-
}
254+
// ignore: avoid-ignoring-return-values, not needed.
255+
await prefs.setBool(getRequestedPrefKey(perm), true);
238256
}
239-
240-
// ignore: avoid-ignoring-return-values, not needed.
241-
await prefs.setBool(getRequestedPrefKey(perm), true);
242257
}
243258
}
244259

0 commit comments

Comments
 (0)