mirror of
https://github.com/johrpan/musicus_mobile.git
synced 2025-10-26 10:47:25 +01:00
Add music library path setting
This introduces a new state of the backend called "setup". If the music library path is not set, the backend goes into that state and the app widget can show the UI to set it up. This also introduces a new dependency on shared_preferences.
This commit is contained in:
parent
723977daec
commit
f0644e4058
3 changed files with 66 additions and 1 deletions
37
lib/app.dart
37
lib/app.dart
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'backend.dart';
|
import 'backend.dart';
|
||||||
import 'screens/home.dart';
|
import 'screens/home.dart';
|
||||||
|
import 'selectors/files.dart';
|
||||||
import 'widgets/player_bar.dart';
|
import 'widgets/player_bar.dart';
|
||||||
|
|
||||||
class App extends StatelessWidget {
|
class App extends StatelessWidget {
|
||||||
|
|
@ -64,6 +65,42 @@ class App extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
} else if (backend.status == BackendStatus.setup) {
|
||||||
|
return Material(
|
||||||
|
color: Theme.of(context).scaffoldBackgroundColor,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'Choose the base path for\nyour music library.',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.headline6,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 16.0,
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.folder_open),
|
||||||
|
title: Text('Choose path'),
|
||||||
|
onTap: () async {
|
||||||
|
final path = await Navigator.push<String>(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => FilesSelector(
|
||||||
|
mode: FilesSelectorMode.directory,
|
||||||
|
),
|
||||||
|
fullscreenDialog: true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (path != null) {
|
||||||
|
backend.setMusicLibraryPath(path);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
return Content();
|
return Content();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:rxdart/rxdart.dart';
|
import 'package:rxdart/rxdart.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import 'database.dart';
|
import 'database.dart';
|
||||||
|
|
||||||
enum BackendStatus {
|
enum BackendStatus {
|
||||||
loading,
|
loading,
|
||||||
needsPermissions,
|
needsPermissions,
|
||||||
|
setup,
|
||||||
ready,
|
ready,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -33,6 +35,9 @@ class BackendState extends State<Backend> {
|
||||||
|
|
||||||
Database db;
|
Database db;
|
||||||
BackendStatus status = BackendStatus.loading;
|
BackendStatus status = BackendStatus.loading;
|
||||||
|
String musicLibraryPath;
|
||||||
|
|
||||||
|
SharedPreferences _shPref;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|
@ -49,6 +54,9 @@ class BackendState extends State<Backend> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _load() async {
|
Future<void> _load() async {
|
||||||
|
_shPref = await SharedPreferences.getInstance();
|
||||||
|
musicLibraryPath = _shPref.getString('musicLibraryPath');
|
||||||
|
|
||||||
db = Database('musicus.sqlite');
|
db = Database('musicus.sqlite');
|
||||||
|
|
||||||
final permissionStatus =
|
final permissionStatus =
|
||||||
|
|
@ -58,6 +66,16 @@ class BackendState extends State<Backend> {
|
||||||
setState(() {
|
setState(() {
|
||||||
status = BackendStatus.needsPermissions;
|
status = BackendStatus.needsPermissions;
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
await _loadMusicLibrary();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _loadMusicLibrary() async {
|
||||||
|
if (musicLibraryPath == null) {
|
||||||
|
setState(() {
|
||||||
|
status = BackendStatus.setup;
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
setState(() {
|
setState(() {
|
||||||
status = BackendStatus.ready;
|
status = BackendStatus.ready;
|
||||||
|
|
@ -68,7 +86,7 @@ class BackendState extends State<Backend> {
|
||||||
Future<void> requestPermissions() async {
|
Future<void> requestPermissions() async {
|
||||||
final result =
|
final result =
|
||||||
await _permissionHandler.requestPermissions([PermissionGroup.storage]);
|
await _permissionHandler.requestPermissions([PermissionGroup.storage]);
|
||||||
|
|
||||||
if (result[PermissionGroup.storage] == PermissionStatus.granted) {
|
if (result[PermissionGroup.storage] == PermissionStatus.granted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
status = BackendStatus.ready;
|
status = BackendStatus.ready;
|
||||||
|
|
@ -78,6 +96,15 @@ class BackendState extends State<Backend> {
|
||||||
|
|
||||||
Future<void> openAppSettings() => _permissionHandler.openAppSettings();
|
Future<void> openAppSettings() => _permissionHandler.openAppSettings();
|
||||||
|
|
||||||
|
Future<void> setMusicLibraryPath(String path) async {
|
||||||
|
musicLibraryPath = path;
|
||||||
|
await _shPref.setString('musicLibraryPath', path);
|
||||||
|
setState(() {
|
||||||
|
status = BackendStatus.loading;
|
||||||
|
});
|
||||||
|
await _loadMusicLibrary();
|
||||||
|
}
|
||||||
|
|
||||||
void startPlayer() {
|
void startPlayer() {
|
||||||
playerActive.add(true);
|
playerActive.add(true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ dependencies:
|
||||||
path:
|
path:
|
||||||
permission_handler:
|
permission_handler:
|
||||||
rxdart:
|
rxdart:
|
||||||
|
shared_preferences:
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
build_runner:
|
build_runner:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue