From 723977daece0ef090fcf3b6424be5d7d3157b6e0 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sat, 28 Mar 2020 09:54:04 +0100 Subject: [PATCH] Properly handle permissions The backend has a new state called "needsPermissions" and the app widget reacts accordingly. --- lib/app.dart | 33 ++++++++++++++++++++++++++++++++- lib/backend.dart | 32 +++++++++++++++++++++++++++++--- pubspec.yaml | 1 + 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 639d02c..d6e31fb 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -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: [ + 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(); } diff --git a/lib/backend.dart b/lib/backend.dart index cea3de5..47dcdfb 100644 --- a/lib/backend.dart +++ b/lib/backend.dart @@ -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 { + final _permissionHandler = PermissionHandler(); + final playerActive = BehaviorSubject.seeded(false); final playing = BehaviorSubject.seeded(false); final position = BehaviorSubject.seeded(0.0); @@ -47,11 +51,33 @@ class BackendState extends State { Future _load() async { db = Database('musicus.sqlite'); - setState(() { - status = BackendStatus.ready; - }); + final permissionStatus = + await _permissionHandler.checkPermissionStatus(PermissionGroup.storage); + + if (permissionStatus != PermissionStatus.granted) { + setState(() { + status = BackendStatus.needsPermissions; + }); + } else { + setState(() { + status = BackendStatus.ready; + }); + } } + Future requestPermissions() async { + final result = + await _permissionHandler.requestPermissions([PermissionGroup.storage]); + + if (result[PermissionGroup.storage] == PermissionStatus.granted) { + setState(() { + status = BackendStatus.ready; + }); + } + } + + Future openAppSettings() => _permissionHandler.openAppSettings(); + void startPlayer() { playerActive.add(true); } diff --git a/pubspec.yaml b/pubspec.yaml index 1cc068b..28e8da9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: sdk: flutter moor_flutter: path: + permission_handler: rxdart: dev_dependencies: