@@ -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
7158class _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