Properly handle permissions

The backend has a new state called "needsPermissions" and the app widget
reacts accordingly.
This commit is contained in:
Elias Projahn 2020-03-28 09:54:04 +01:00
parent bd844c44ea
commit 723977daec
3 changed files with 62 additions and 4 deletions

View file

@ -30,9 +30,40 @@ class App extends StatelessWidget {
home: Builder(
builder: (context) {
if (backend.status == BackendStatus.loading) {
return Container(
return Material(
color: Theme.of(context).scaffoldBackgroundColor,
);
} else if (backend.status == BackendStatus.needsPermissions) {
return Material(
color: Theme.of(context).scaffoldBackgroundColor,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Musicus needs permissions\nto access your files.',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6,
),
SizedBox(
height: 16.0,
),
ListTile(
leading: const Icon(Icons.done),
title: Text('Grant permissions'),
onTap: () {
backend.requestPermissions();
},
),
ListTile(
leading: const Icon(Icons.settings),
title: Text('Open system\'s app settings'),
onTap: () {
backend.openAppSettings();
},
),
],
),
);
} else {
return Content();
}

View file

@ -1,10 +1,12 @@
import 'package:flutter/widgets.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:rxdart/rxdart.dart';
import 'database.dart';
enum BackendStatus {
loading,
needsPermissions,
ready,
}
@ -23,6 +25,8 @@ class Backend extends StatefulWidget {
}
class BackendState extends State<Backend> {
final _permissionHandler = PermissionHandler();
final playerActive = BehaviorSubject.seeded(false);
final playing = BehaviorSubject.seeded(false);
final position = BehaviorSubject.seeded(0.0);
@ -47,10 +51,32 @@ class BackendState extends State<Backend> {
Future<void> _load() async {
db = Database('musicus.sqlite');
final permissionStatus =
await _permissionHandler.checkPermissionStatus(PermissionGroup.storage);
if (permissionStatus != PermissionStatus.granted) {
setState(() {
status = BackendStatus.needsPermissions;
});
} else {
setState(() {
status = BackendStatus.ready;
});
}
}
Future<void> requestPermissions() async {
final result =
await _permissionHandler.requestPermissions([PermissionGroup.storage]);
if (result[PermissionGroup.storage] == PermissionStatus.granted) {
setState(() {
status = BackendStatus.ready;
});
}
}
Future<void> openAppSettings() => _permissionHandler.openAppSettings();
void startPlayer() {
playerActive.add(true);

View file

@ -13,6 +13,7 @@ dependencies:
sdk: flutter
moor_flutter:
path:
permission_handler:
rxdart:
dev_dependencies: