Skip to content

Commit

Permalink
feat: album art dominant color as accent color (#447)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kingkor Roy Tirtho committed Apr 28, 2023
1 parent cac8ea6 commit 31b9249
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 5 deletions.
1 change: 1 addition & 0 deletions lib/collections/spotube_icons.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,5 @@ abstract class SpotubeIcons {
static const hoverOff = Icons.back_hand_outlined;
static const dragHandle = Icons.drag_indicator;
static const lightning = Icons.flash_on_rounded;
static const colorSync = FeatherIcons.activity;
}
7 changes: 5 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'package:spotube/collections/routes.dart';
import 'package:spotube/collections/intents.dart';
import 'package:spotube/models/logger.dart';
import 'package:spotube/provider/downloader_provider.dart';
import 'package:spotube/provider/palette_provider.dart';
import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/services/audio_player.dart';
import 'package:spotube/services/pocketbase.dart';
Expand Down Expand Up @@ -188,6 +189,8 @@ class SpotubeState extends ConsumerState<Spotube> {
ref.watch(userPreferencesProvider.select((s) => s.themeMode));
final accentMaterialColor =
ref.watch(userPreferencesProvider.select((s) => s.accentColorScheme));
final paletteColor =
ref.watch(paletteProvider.select((s) => s?.dominantColor?.color));

useInitSysTray(ref);

Expand All @@ -209,8 +212,8 @@ class SpotubeState extends ConsumerState<Spotube> {
return DragToResizeArea(child: child!);
},
themeMode: themeMode,
theme: theme(accentMaterialColor, Brightness.light),
darkTheme: theme(accentMaterialColor, Brightness.dark),
theme: theme(paletteColor ?? accentMaterialColor, Brightness.light),
darkTheme: theme(paletteColor ?? accentMaterialColor, Brightness.dark),
shortcuts: {
...WidgetsApp.defaultShortcuts.map((key, value) {
return MapEntry(
Expand Down
9 changes: 9 additions & 0 deletions lib/pages/settings/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,15 @@ class SettingsPage extends HookConsumerWidget {
),
onTap: pickColorScheme(),
),
SwitchListTile(
secondary: const Icon(SpotubeIcons.colorSync),
title: const Text("Sync Album Color"),
subtitle: const Text(
"Uses the dominant color of the album art as the accent color",
),
value: preferences.albumColorSync,
onChanged: preferences.setAlbumColorSync,
),
Text(
" Playback",
style: theme.textTheme.headlineSmall
Expand Down
4 changes: 4 additions & 0 deletions lib/provider/palette_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import 'package:palette_generator/palette_generator.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final paletteProvider = StateProvider<PaletteGenerator?>((ref) => null);
27 changes: 27 additions & 0 deletions lib/provider/playlist_queue_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ import 'package:audio_service/audio_service.dart';
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/models/local_track.dart';
import 'package:spotube/models/spotube_track.dart';
import 'package:spotube/extensions/track.dart';
import 'package:spotube/provider/blacklist_provider.dart';
import 'package:spotube/provider/palette_provider.dart';
import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/services/audio_player.dart';
import 'package:spotube/services/linux_audio_service.dart';
Expand Down Expand Up @@ -532,6 +535,30 @@ class PlaylistQueueNotifier extends PersistedStateNotifier<PlaylistQueue?> {
state = state!.copyWith(tracks: Set.from(tracks), active: active);
}

Future<void> updatePalette() async {
final palette = await PaletteGenerator.fromImageProvider(
UniversalImage.imageProvider(
TypeConversionUtils.image_X_UrlString(
state?.activeTrack.album?.images,
placeholder: ImagePlaceholder.albumArt,
),
height: 50,
width: 50,
),
);
ref.read(paletteProvider.notifier).state = palette;
}

@override
set state(state) {
if (preferences.albumColorSync &&
state != null &&
state.active != this.state?.active) {
updatePalette();
}
super.state = state;
}

@override
Future<PlaylistQueue>? fromJson(Map<String, dynamic> json) {
if (json.isEmpty) return null;
Expand Down
22 changes: 19 additions & 3 deletions lib/provider/user_preferences_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import 'package:spotube/components/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/provider/palette_provider.dart';
import 'package:spotube/provider/playlist_queue_provider.dart';

import 'package:spotube/utils/persisted_change_notifier.dart';
import 'package:spotube/utils/platform.dart';
Expand Down Expand Up @@ -33,6 +35,7 @@ class UserPreferences extends PersistedChangeNotifier {
AudioQuality audioQuality;

SpotubeColor accentColorScheme;
bool albumColorSync;
bool skipSponsorSegments;

String downloadLocation;
Expand All @@ -45,12 +48,16 @@ class UserPreferences extends PersistedChangeNotifier {

bool showSystemTrayIcon;

UserPreferences({
final Ref ref;

UserPreferences(
this.ref, {
required this.recommendationMarket,
required this.themeMode,
required this.layoutMode,
required this.predownload,
required this.accentColorScheme,
this.albumColorSync = true,
this.saveTrackLyrics = false,
this.checkUpdate = true,
this.audioQuality = AudioQuality.high,
Expand Down Expand Up @@ -98,7 +105,13 @@ class UserPreferences extends PersistedChangeNotifier {
updatePersistence();
}

void setBackgroundColorScheme(MaterialColor color) {
void setAlbumColorSync(bool sync) {
albumColorSync = sync;
if (!sync) {
ref.read(paletteProvider.notifier).state = null;
} else {
ref.read(PlaylistQueueNotifier.notifier).updatePalette();
}
notifyListeners();
updatePersistence();
}
Expand Down Expand Up @@ -168,6 +181,7 @@ class UserPreferences extends PersistedChangeNotifier {
accentColorScheme = map["accentColorScheme"] != null
? SpotubeColor.fromString(map["accentColorScheme"])
: accentColorScheme;
albumColorSync = map["albumColorSync"] ?? albumColorSync;
audioQuality = map["audioQuality"] != null
? AudioQuality.values[map["audioQuality"]]
: audioQuality;
Expand Down Expand Up @@ -196,6 +210,7 @@ class UserPreferences extends PersistedChangeNotifier {
"recommendationMarket": recommendationMarket,
"themeMode": themeMode.index,
"accentColorScheme": accentColorScheme.toString(),
"albumColorSync": albumColorSync,
"checkUpdate": checkUpdate,
"audioQuality": audioQuality.index,
"skipSponsorSegments": skipSponsorSegments,
Expand All @@ -209,7 +224,8 @@ class UserPreferences extends PersistedChangeNotifier {
}

final userPreferencesProvider = ChangeNotifierProvider(
(_) => UserPreferences(
(ref) => UserPreferences(
ref,
accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"),
recommendationMarket: 'US',
themeMode: ThemeMode.system,
Expand Down

0 comments on commit 31b9249

Please sign in to comment.