Skip to content

Commit

Permalink
possibility to change default music provider
Browse files Browse the repository at this point in the history
  • Loading branch information
apoleon33 committed Jan 8, 2024
1 parent b24d6b6 commit 054e516
Show file tree
Hide file tree
Showing 8 changed files with 687 additions and 78 deletions.
2 changes: 2 additions & 0 deletions assets/apple.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
456 changes: 456 additions & 0 deletions assets/deezer.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
40 changes: 28 additions & 12 deletions lib/albumCard/display_as_card.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:cradle/album.dart';
import 'package:cradle/albumCard/display_album.dart';
import 'package:cradle/services.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';

import '../moreInfoMenu.dart';
Expand Down Expand Up @@ -155,18 +157,32 @@ class DisplayAlbumAsCard extends DisplayAlbum {
const MoreInfoMenu(),

// new Spacer(),
FilledButton.icon(
icon: SvgPicture.asset(
"assets/spotify.svg",
color: Theme.of(context)
.colorScheme
.onPrimary,
width: 18,
height: 18,
),
onPressed: _launchUrl,
label: const Text("Listen on Spotify"),
),

Consumer<ServiceNotifier>(builder:
(context, serviceNotifier, child) {
return FilledButton.icon(
icon: SvgPicture.asset(
serviceNotifier
.currentService.iconPath,
color: Theme.of(context)
.colorScheme
.onPrimary,
width: 18,
height: 18,
),
onPressed: () {
String initialUrl = serviceNotifier
.currentService.searchUrl;
String url = Uri.encodeFull(
'$initialUrl${album.name} - ${album.artist}');
_url = Uri.parse(url);
_launchUrl();
},
label: Text(
"Listen on ${serviceNotifier.currentService.fullName}",
),
);
})
],
),
)
Expand Down
64 changes: 36 additions & 28 deletions lib/route/home.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:cradle/navigation.dart';
import 'package:cradle/route/settings.dart';
import 'package:cradle/services.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'albumCard.dart';

Expand Down Expand Up @@ -87,44 +89,50 @@ class _MyHomePageState extends State<MyHomePage> {
_createAlbumList();
List<Widget> albumCards = albumList;

return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.surface,
title: Align(
alignment: Alignment.centerLeft,
child: Text(
widget.title,
style: const TextStyle(fontFamily: 'Cloister', fontSize: 24.0),
)),
actions: (indexPage == 0)
? [
IconButton(
return ChangeNotifierProvider(
create: (context) => ServiceNotifier(),
child: Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.surface,
title: Align(
alignment: Alignment.centerLeft,
child: Text(
widget.title,
style: const TextStyle(fontFamily: 'Cloister', fontSize: 24.0),
)),
actions: (indexPage == 0)
? [
IconButton(
onPressed: () {
setState(() {
isCard = !isCard;
});
},
icon: (!isCard)
? const Icon(Icons.view_list)
: const Icon(Icons.grid_view))
]
: [],
),
body: RefreshIndicator(
onRefresh: _refreshData,
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
albumCards,
[const Settings()]
][indexPage],
: const Icon(Icons.grid_view),
)
]
: [],
),
body: RefreshIndicator(
onRefresh: _refreshData,
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
albumCards,
[const Settings()]
][indexPage],
),
),
),
bottomNavigationBar: Navigation(
callBack: callBack,
currentPageIndex: indexPage,
),
),
bottomNavigationBar:
Navigation(callBack: callBack, currentPageIndex: indexPage),
);
}
}
114 changes: 89 additions & 25 deletions lib/route/settings.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:cradle/theme_manager.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:cradle/services.dart';

class Settings extends StatefulWidget {
const Settings({super.key});
Expand All @@ -12,6 +14,7 @@ class Settings extends StatefulWidget {

class _Settings extends State<Settings> {
int colorMode = 0;
Service? selectedService = Service.spotify;

@override
void initState() {
Expand All @@ -35,33 +38,94 @@ class _Settings extends State<Settings> {
child: Column(
children: [
const Text("Theme mode"),
Consumer<ModeTheme>(builder: (context, themeMode, child) {
return SegmentedButton(
segments: const [
ButtonSegment(
value: 0,
label: Text("system"),
icon: Icon(Icons.settings_brightness)),
ButtonSegment(
value: 1,
label: Text("light"),
icon: Icon(Icons.light_mode)),
ButtonSegment(
value: 2, label: Text("dark"), icon: Icon(Icons.dark_mode))
],
selected: <int>{themeMode.themeMode},
onSelectionChanged: (Set<int> newSelection) async {
themeMode.themeMode = newSelection.first;
final prefs = await SharedPreferences.getInstance();
setState(() {
colorMode = newSelection.first;
});
await prefs.setInt('color', newSelection.first);
},
);
})
buildThemeMode(),
const Padding(
padding: EdgeInsets.only(
top: 8.0,
bottom: 8.0,
),
child: Divider(
indent: 16.0,
endIndent: 16.0,
),
),
const Text("Default music provider"),
buildServiceSelection(),
],
),
);
}

Widget buildThemeMode() {
return Consumer<ModeTheme>(builder: (context, themeMode, child) {
return SegmentedButton(
segments: const [
ButtonSegment(
value: 0,
label: Text("system"),
icon: Icon(Icons.settings_brightness),
),
ButtonSegment(
value: 1,
label: Text("light"),
icon: Icon(Icons.light_mode),
),
ButtonSegment(
value: 2,
label: Text("dark"),
icon: Icon(Icons.dark_mode),
)
],
selected: <int>{themeMode.themeMode},
onSelectionChanged: (Set<int> newSelection) async {
themeMode.themeMode = newSelection.first;
final prefs = await SharedPreferences.getInstance();
setState(() {
colorMode = newSelection.first;
});
await prefs.setInt('color', newSelection.first);
},
);
});
}

Widget buildServiceSelection() {
return Consumer<ServiceNotifier>(
builder: (context, serviceNotifier, child) {
List<ButtonSegment> servicesList = [];
for (var element in Service.values) {
servicesList.add(
ButtonSegment(
value: element,
label: Text(element.name),
icon: SvgPicture.asset(
element.iconPath,
width: 18.0,
color: Theme.of(context).colorScheme.onSurface,
),
),
);
}

return Padding(
padding: const EdgeInsets.only(
left: 16.0,
right: 16.0,
),
child: SegmentedButton(
segments: servicesList,
selected: {serviceNotifier.currentService},
onSelectionChanged: (Set newSelection) async {
serviceNotifier.currentService = newSelection.first;
final pref = await SharedPreferences.getInstance();
setState(() {
selectedService = newSelection.first;
});
await pref.setInt('service', newSelection.first.index);
},
),
);
},
);
}
}
63 changes: 63 additions & 0 deletions lib/services.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

enum Service {
spotify(
name: "Spotify",
iconPath: "assets/spotify.svg",
fullName: "Spotify",
searchUrl: 'https://open.spotify.com/search/',
),
apple(
name: "Apple",
iconPath: "assets/apple.svg",
fullName: "Apple Music",
searchUrl: 'https://music.apple.com/us/search?term=',
),
deezer(
name: "Deezer",
iconPath: "assets/deezer.svg",
fullName: "Deezer",
searchUrl: 'https://www.deezer.com/search/',
);

const Service({
required this.name,
required this.iconPath,
required this.fullName,
required this.searchUrl,
});

final String name;
final String iconPath;
final String fullName;
final String searchUrl;
}

class ServiceNotifier extends ChangeNotifier {
Service _currentService = Service.spotify;

ServiceNotifier() {
_initCurrentService();
}

void _initCurrentService() async {
final prefs = await SharedPreferences.getInstance();

int i = prefs.getInt('service') ?? 0;

for (Service element in Service.values) {
if (element.index == i) {
currentService = element;
break;
}
}
}

Service get currentService => _currentService;

set currentService(Service newService) {
_currentService = newService;
notifyListeners();
}
}
Loading

0 comments on commit 054e516

Please sign in to comment.