From 5f58570bc2006e9e45e7494e909d947f9041489f Mon Sep 17 00:00:00 2001 From: Moritz Weber Date: Tue, 4 May 2021 18:45:57 +0200 Subject: [PATCH] highlighted songs per artist --- lib/domain/actors/audio_player_actor.dart | 4 --- .../repositories/music_data_repository.dart | 1 + .../pages/artist_details_page.dart | 29 +++++++++++++++++++ lib/presentation/pages/artists_page.dart | 1 + lib/presentation/state/music_data_store.dart | 11 +++++++ .../state/music_data_store.g.dart | 27 +++++++++++++++++ .../widgets/artist_highlighted_songs.dart | 27 +++++++++++++++++ lib/presentation/widgets/song_list_tile.dart | 2 +- .../music_data_repository_impl.dart | 18 ++++++++++++ 9 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 lib/presentation/widgets/artist_highlighted_songs.dart diff --git a/lib/domain/actors/audio_player_actor.dart b/lib/domain/actors/audio_player_actor.dart index 22d6119..776d0d1 100644 --- a/lib/domain/actors/audio_player_actor.dart +++ b/lib/domain/actors/audio_player_actor.dart @@ -41,15 +41,11 @@ class AudioPlayerActor { void _handlePosition(Duration position, Song song) { if (song == null || position == null) return; - print('HANDLE POSITION'); - final int pos = position.inMilliseconds; if (pos < song.duration * 0.05) { - print('COUNT -> TRUE'); _countSongPlayback = true; } else if (pos > song.duration * 0.95 && _countSongPlayback) { - print('INCREMENT PLAY COUNT: ${song.title}'); _countSongPlayback = false; _incrementPlayCount(song); } diff --git a/lib/domain/repositories/music_data_repository.dart b/lib/domain/repositories/music_data_repository.dart index 8fd1ee9..184fadb 100644 --- a/lib/domain/repositories/music_data_repository.dart +++ b/lib/domain/repositories/music_data_repository.dart @@ -9,6 +9,7 @@ abstract class MusicDataInfoRepository { Stream> get songStream; Stream> getAlbumSongStream(Album album); Stream> getArtistSongStream(Artist artist); + Stream> getArtistHighlightedSongStream(Artist artist); Stream> get albumStream; Stream> getArtistAlbumStream(Artist artist); diff --git a/lib/presentation/pages/artist_details_page.dart b/lib/presentation/pages/artist_details_page.dart index 7f75bd8..46330b8 100644 --- a/lib/presentation/pages/artist_details_page.dart +++ b/lib/presentation/pages/artist_details_page.dart @@ -9,6 +9,7 @@ import '../state/music_data_store.dart'; import '../theming.dart'; import '../widgets/artist_albums.dart'; import '../widgets/artist_header.dart'; +import '../widgets/artist_highlighted_songs.dart'; import 'album_details_page.dart'; class ArtistDetailsPage extends StatelessWidget { @@ -40,6 +41,34 @@ class ArtistDetailsPage extends StatelessWidget { onPressed: () => audioStore.shuffleArtist(artist), ), ), + const Padding( + padding: EdgeInsets.only( + left: HORIZONTAL_PADDING + 2, + right: HORIZONTAL_PADDING + 2, + bottom: 4.0, + ), + child: Text( + 'Highlights', + style: TEXT_HEADER, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: HORIZONTAL_PADDING, + vertical: 4.0, + ), + child: Container( + height: 1.0, + color: Colors.white10, + ), + ), + ], + ), + ), + ArtistHighlightedSongs(songs: musicDataStore.artistHighlightedSongStream.value), + SliverList( + delegate: SliverChildListDelegate( + [ const Padding( padding: EdgeInsets.only( left: HORIZONTAL_PADDING + 2, diff --git a/lib/presentation/pages/artists_page.dart b/lib/presentation/pages/artists_page.dart index d379aa0..083c58a 100644 --- a/lib/presentation/pages/artists_page.dart +++ b/lib/presentation/pages/artists_page.dart @@ -31,6 +31,7 @@ class _ArtistsPageState extends State with AutomaticKeepAliveClient title: Text(artist.name), onTap: () { musicDataStore.fetchAlbumsFromArtist(artist); + musicDataStore.fetchHighlightedSongsFromArtist(artist); Navigator.push( context, MaterialPageRoute( diff --git a/lib/presentation/state/music_data_store.dart b/lib/presentation/state/music_data_store.dart index 10302fa..df282fc 100644 --- a/lib/presentation/state/music_data_store.dart +++ b/lib/presentation/state/music_data_store.dart @@ -68,6 +68,9 @@ abstract class _MusicDataStore with Store { @observable ObservableStream> artistAlbumStream; + @observable + ObservableStream> artistHighlightedSongStream; + @observable bool isUpdatingDatabase = false; @@ -92,12 +95,20 @@ abstract class _MusicDataStore with Store { _musicDataInfoRepository.getAlbumSongStream(album).asObservable(initialValue: []); } + // TODO: das hier ist komplett bescheuert... brauchen einen eigenen Store für die ArtistDetailsPage @action Future fetchAlbumsFromArtist(Artist artist) async { artistAlbumStream = _musicDataInfoRepository.getArtistAlbumStream(artist).asObservable(initialValue: []); } + @action + Future fetchHighlightedSongsFromArtist(Artist artist) async { + artistHighlightedSongStream = _musicDataInfoRepository + .getArtistHighlightedSongStream(artist) + .asObservable(initialValue: []); + } + Future setSongBlocked(Song song, bool blocked) => _setSongBlocked(song, blocked); Future toggleNextSongLink(Song song) async { diff --git a/lib/presentation/state/music_data_store.g.dart b/lib/presentation/state/music_data_store.g.dart index fca9eb6..bee6923 100644 --- a/lib/presentation/state/music_data_store.g.dart +++ b/lib/presentation/state/music_data_store.g.dart @@ -93,6 +93,23 @@ mixin _$MusicDataStore on _MusicDataStore, Store { }); } + final _$artistHighlightedSongStreamAtom = + Atom(name: '_MusicDataStore.artistHighlightedSongStream'); + + @override + ObservableStream> get artistHighlightedSongStream { + _$artistHighlightedSongStreamAtom.reportRead(); + return super.artistHighlightedSongStream; + } + + @override + set artistHighlightedSongStream(ObservableStream> value) { + _$artistHighlightedSongStreamAtom + .reportWrite(value, super.artistHighlightedSongStream, () { + super.artistHighlightedSongStream = value; + }); + } + final _$isUpdatingDatabaseAtom = Atom(name: '_MusicDataStore.isUpdatingDatabase'); @@ -135,6 +152,15 @@ mixin _$MusicDataStore on _MusicDataStore, Store { .run(() => super.fetchAlbumsFromArtist(artist)); } + final _$fetchHighlightedSongsFromArtistAsyncAction = + AsyncAction('_MusicDataStore.fetchHighlightedSongsFromArtist'); + + @override + Future fetchHighlightedSongsFromArtist(Artist artist) { + return _$fetchHighlightedSongsFromArtistAsyncAction + .run(() => super.fetchHighlightedSongsFromArtist(artist)); + } + @override String toString() { return ''' @@ -143,6 +169,7 @@ albumStream: ${albumStream}, artistStream: ${artistStream}, albumSongStream: ${albumSongStream}, artistAlbumStream: ${artistAlbumStream}, +artistHighlightedSongStream: ${artistHighlightedSongStream}, isUpdatingDatabase: ${isUpdatingDatabase}, sortedArtistAlbums: ${sortedArtistAlbums} '''; diff --git a/lib/presentation/widgets/artist_highlighted_songs.dart b/lib/presentation/widgets/artist_highlighted_songs.dart new file mode 100644 index 0000000..a31376c --- /dev/null +++ b/lib/presentation/widgets/artist_highlighted_songs.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +import '../../domain/entities/song.dart'; +import 'song_list_tile.dart'; + +class ArtistHighlightedSongs extends StatelessWidget { + const ArtistHighlightedSongs({Key key, this.songs, this.onTap, this.onTapPlay}) : super(key: key); + + final List songs; + final Function onTap; + final Function onTapPlay; + + @override + Widget build(BuildContext context) { + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, int index) { + final Song song = songs[index]; + return SongListTile( + song: song + ); + }, + childCount: songs.length, + ), + ); + } +} diff --git a/lib/presentation/widgets/song_list_tile.dart b/lib/presentation/widgets/song_list_tile.dart index 7656123..5f749cc 100644 --- a/lib/presentation/widgets/song_list_tile.dart +++ b/lib/presentation/widgets/song_list_tile.dart @@ -4,7 +4,7 @@ import '../../domain/entities/song.dart'; import '../utils.dart' as utils; class SongListTile extends StatelessWidget { - const SongListTile({Key key, this.song, this.onTap, this.inAlbum, this.onTapMore}) + const SongListTile({Key key, this.song, this.onTap, this.inAlbum = false, this.onTapMore}) : super(key: key); final Song song; diff --git a/lib/system/repositories/music_data_repository_impl.dart b/lib/system/repositories/music_data_repository_impl.dart index da18e4d..c7d7e96 100644 --- a/lib/system/repositories/music_data_repository_impl.dart +++ b/lib/system/repositories/music_data_repository_impl.dart @@ -52,6 +52,13 @@ class MusicDataRepositoryImpl implements MusicDataRepository { Stream> getArtistSongStream(Artist artist) => _musicDataSource.getArtistSongStream(artist as ArtistModel); + @override + Stream> getArtistHighlightedSongStream(Artist artist) { + return _musicDataSource + .getArtistSongStream(artist as ArtistModel) + .map((event) => _sortHighlightedSongs(event).take(5).toList()); + } + @override Stream> getArtistAlbumStream(Artist artist) => _musicDataSource.getArtistAlbumStream(artist as ArtistModel); @@ -137,4 +144,15 @@ class MusicDataRepositoryImpl implements MusicDataRepository { // TODO: implement resetSkipCount throw UnimplementedError(); } + + List _sortHighlightedSongs(List songs) { + return songs + ..sort( + (a, b) { + final r = -a.likeCount.compareTo(b.likeCount); + if (r != 0) return r; + return -a.playCount.compareTo(b.playCount); + }, + ); + } }