From: aman.jeph Date: Wed, 15 Sep 2021 13:51:59 +0000 (+0530) Subject: Update or Added Following Changes X-Git-Tag: submit/tizen/20210915.141722^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bbdcb86d0478a4cb150ee7a35aaea768353d792a;p=profile%2Fiot%2Fapps%2Fdotnet%2Fmusic-player.git Update or Added Following Changes 1. Intergrated tabs and detail views 2. Added More options Change-Id: I243066062e39816d298eb9142766e2b5c1ebb337 Signed-off-by: aman.jeph --- diff --git a/music-player/Common/AppConstants.cs b/music-player/Common/AppConstants.cs index 104322b..7ddc6c6 100755 --- a/music-player/Common/AppConstants.cs +++ b/music-player/Common/AppConstants.cs @@ -12,5 +12,7 @@ public const string TimeFormat = @"mm\:ss"; public const string LightPlatformThemeId = "org.tizen.default-light-theme"; public const string DarkPlatformThemeId = "org.tizen.default-dark-theme"; + public const string FavouritePlaylist = "Favourite"; + public const string RecentlyAddedPlaylist = "Recently Added"; } } diff --git a/music-player/Common/PlayerCommon.cs b/music-player/Common/PlayerCommon.cs index 04ba5a2..360ee2e 100755 --- a/music-player/Common/PlayerCommon.cs +++ b/music-player/Common/PlayerCommon.cs @@ -62,4 +62,15 @@ namespace MusicPlayer.Common get => description; } } + + public class PlayingListItemSelectedEvent : EventArgs + { + + internal PlayingListItemSelectedEvent(object selectedItem) + { + CurrentSelectedItem = selectedItem; + } + + public object CurrentSelectedItem { get; private set; } + } } diff --git a/music-player/Common/UIColors.cs b/music-player/Common/UIColors.cs index dd3026a..3bf5a21 100755 --- a/music-player/Common/UIColors.cs +++ b/music-player/Common/UIColors.cs @@ -10,6 +10,7 @@ namespace MusicPlayer.Common public static readonly Color HEX000209 = new Color(0.0f, 0.0078f, 0.0353f, 1.0f); public static readonly Color HEX001447 = new Color(0.0f, 0.0784f, 0.2784f, 1.0f); public static readonly Color HEXEEEFF1 = new Color(0.9333f, 0.9373f, 0.9450f, 1.0f); + public static readonly Color HEX000C2B = new Color(0.0f, 0.0471f, 0.1686f, 1.0f); public static readonly Color LyricsBackground = new Color(0.0f, 0.0f, 0.0f, 0.85f); public static readonly Color ItemSeperator = new Color(0.75f, 0.79f, 0.82f, 1.0f); diff --git a/music-player/Common/UIFontStyles.cs b/music-player/Common/UIFontStyles.cs new file mode 100755 index 0000000..00ff34c --- /dev/null +++ b/music-player/Common/UIFontStyles.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Tizen.NUI; + +namespace MusicPlayer.Common +{ + class UIFontStyles + { + public static readonly PropertyMap NormalLight = new PropertyMap(). + Add("width", new PropertyValue("normal")). + Add("weight", new PropertyValue("light")); + + public static readonly PropertyMap AllNormal = new PropertyMap(). + Add("width", new PropertyValue("normal")). + Add("weight", new PropertyValue("normal")). + Add("slant", new PropertyValue("normal")); + } +} diff --git a/music-player/Core/PlaybackHelper.cs b/music-player/Core/PlaybackHelper.cs new file mode 100755 index 0000000..a593a16 --- /dev/null +++ b/music-player/Core/PlaybackHelper.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MusicPlayer.Views; +using MusicPlayer.ViewModels; +using Tizen.NUI; +using MusicPlayer.Models; + +namespace MusicPlayer.Core +{ + class PlaybackHelper + { + + private static PlaybackHelper instance = new PlaybackHelper(); + + private PlayerView playerView; + private PlayerViewModel playerViewModel; + + private PlaybackHelper() + { + playerViewModel = new PlayerViewModel(); + playerView = new PlayerView(playerViewModel); + } + + public static PlaybackHelper Instance + { + get => instance; + } + + public void ShowPlayer() + { + Window.Instance.Add(playerView); + playerView.ShowView(); + } + + public void HidePlayer() + { + Window.Instance.Remove(playerView); + playerView.HideView(); + } + + public void PlayAll(ListViewModel trackList, Track startingTrack) + { + ShowPlayer(); + playerViewModel.SetPlayingList(trackList); + playerViewModel.SetCurrentTrack(startingTrack); + playerViewModel.SetRepeatAndShuffle(Common.RepeatMode.RepeatAll, Common.ShuffleMode.Off); + } + + public void PlayAllWithShuffle(ListViewModel trackList) + { + ShowPlayer(); + playerViewModel.SetPlayingList(trackList); + playerViewModel.SetRepeatAndShuffle(Common.RepeatMode.RepeatAll, Common.ShuffleMode.On); + playerViewModel.StartShuffledTrack(); + } + + public void PlayCurrent(ListViewModel trackList, Track currentTrack) + { + ShowPlayer(); + playerViewModel.SetPlayingList(trackList); + playerViewModel.SetCurrentTrack(currentTrack); + playerViewModel.SetRepeatAndShuffle(Common.RepeatMode.Off, Common.ShuffleMode.Off); + } + } +} diff --git a/music-player/Core/PlaylistManager.cs b/music-player/Core/PlaylistManager.cs new file mode 100755 index 0000000..65cb5db --- /dev/null +++ b/music-player/Core/PlaylistManager.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Tizen.Content.MediaContent; +using MusicPlayer.Common; +using MusicPlayer.Media; + + +namespace MusicPlayer.Core +{ + class PlaylistManager + { + public event EventHandler PlaylistDataChanged; + private static PlaylistManager instance = new PlaylistManager(); + private PlaylistManager() + { + Contents.MusicDBUpdate += OnMusicDBUpdate; + Contents.MusicItemUpdate += OnMusicItemDBUpdate; + } + + public static PlaylistManager Instance + { + get => instance; + } + + public List Playlists + { + get => Contents.GetPlaylists(); + } + + public Playlist GetPlaylist(int playlistId) + { + return Contents.GetPlaylistById(playlistId); + } + + public Playlist GetPlaylist(string name) + { + return Contents.GetPlaylistByName(name); + } + + public Playlist AddPlaylist(string name) + { + return Contents.CreatePlaylist(name); + } + + public Playlist AddPlaylist(string name, string thumbnailPath) + { + return Contents.CreatePlaylist(name, thumbnailPath); + } + + public int PlaylistTrackCount(int playlistId) + { + return Contents.GetMemberCount(playlistId); + } + + public bool Delete(int playlistId) + { + return Contents.DeletePlaylist(playlistId); + } + + // TODO untill we refactor the SelectorView this is requiered + public int DeletePlaylists(List playlistIdList) + { + int count = 0; + foreach(string playlistId in playlistIdList) + { + if(Contents.DeletePlaylist(Int32.Parse(playlistId))) + { + count++; + } + } + return count; + } + + public int DeletePlaylists(List playlistIdList) + { + int count = 0; + foreach (int playlistId in playlistIdList) + { + if (Contents.DeletePlaylist(playlistId)) + { + count++; + } + } + return count; + } + + public List GetMemberList(int playlistId) + { + return Contents.GetPlaylistMembers(playlistId); + } + + public bool AddTrack(int playlistId, string trackId) + { + return Contents.AddMedia(playlistId, trackId); + } + + public bool UpdateValues(int playlistId, PlaylistUpdateValues updatedValues) + { + return Contents.UpdatePlaylistValues(playlistId, updatedValues); + } + + public bool DeleteTrack(int playlistId, int memberId) + { + return Contents.DeletePlaylistMember(playlistId, memberId); + } + + public bool DeleteTrackList(int playlistId, List memberList) + { + return Contents.DeletePlaylistMembers(playlistId, memberList); + } + + private void OnMusicItemDBUpdate(object sender, MusicItemUpdateEventArgs e) + { + PlaylistDataChanged?.Invoke(this, new EventArgs()); + } + + private void OnMusicDBUpdate(object sender, MusicDBUpdateEventArgs e) + { + PlaylistDataChanged?.Invoke(this, new EventArgs()); + } + + } +} diff --git a/music-player/MediaContent/AlbumContents.cs b/music-player/MediaContent/AlbumContents.cs index 2e86e50..e61e753 100755 --- a/music-player/MediaContent/AlbumContents.cs +++ b/music-player/MediaContent/AlbumContents.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Specialized; +using System.Collections.Generic; using Tizen.Content.MediaContent; using MusicPlayer.Common; @@ -7,20 +7,21 @@ namespace MusicPlayer.Media { public static partial class Contents { - public static OrderedDictionary GetAlbumList() + public static List GetAlbumList() { - OrderedDictionary albumList = new OrderedDictionary(); + List albumList = new List(); SelectArguments albumSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = albumInfo.Select(albumSelectArguments); while (dataReader.Read()) { - Album info = dataReader.Current; + Album album = dataReader.Current; SelectArguments audioSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); - MediaDataReader albumDataReader = albumInfo.SelectMember(info.Id, audioSelectArguments); + // TODO use countmember instead of select memeber. + MediaDataReader albumDataReader = albumInfo.SelectMember(album.Id, audioSelectArguments); if (albumDataReader.Read()) - albumList.Add(info.Id, info); + albumList.Add(album); } Tizen.Log.Debug(AppConstants.LogTag, "Total album retrived from database: " + albumList.Count); dataReader.Dispose(); @@ -32,16 +33,15 @@ namespace MusicPlayer.Media return albumInfo.CountMember(albumId); } - public static OrderedDictionary GetAlbumMemberList(int albumId) + public static List GetAlbumMemberList(int albumId) { - OrderedDictionary mediaList = new OrderedDictionary(); - SelectArguments audioSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); + List mediaList = new List(); + SelectArguments audioSelectArguments = CreateSelectArgument(MEDIA_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = albumInfo.SelectMember(albumId, audioSelectArguments); while (dataReader.Read()) { - MediaInfo info = dataReader.Current; - mediaList.Add(info.Id, info); + mediaList.Add((AudioInfo)dataReader.Current); } Tizen.Log.Debug(AppConstants.LogTag, "Total track retrived from currentAlbum: " + mediaList.Count); dataReader.Dispose(); @@ -62,5 +62,26 @@ namespace MusicPlayer.Media dataReader.Dispose(); return path; } + + public static List FindMatchingAlbums(string searchText) + { + List albumList = new List(); + string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + AlbumColumns.Name + " LIKE "+ "'%" + searchText + "%' COLLATE NOCASE"; + SelectArguments albumSelectArguments = CreateSelectArgument(expression, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC); + MediaDataReader dataReader = albumInfo.Select(albumSelectArguments); + + while (dataReader.Read()) + { + Album info = dataReader.Current; + SelectArguments audioSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); + MediaDataReader albumDataReader = albumInfo.SelectMember(info.Id, audioSelectArguments); + if (albumDataReader.Read()) + albumList.Add(info); + albumDataReader.Dispose(); + } + Tizen.Log.Debug(AppConstants.LogTag, "Total album retrived from database that match text: " + searchText + " are : " + albumList.Count); + dataReader.Dispose(); + return albumList; + } } } diff --git a/music-player/MediaContent/ArtistContents.cs b/music-player/MediaContent/ArtistContents.cs index f6da163..2cdc778 100755 --- a/music-player/MediaContent/ArtistContents.cs +++ b/music-player/MediaContent/ArtistContents.cs @@ -12,13 +12,12 @@ namespace MusicPlayer.Media public static List GetArtistList() { List artistList = new List(); - - SelectArguments artistSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Artist + MEDIA_SORT_ORDER_ASC); + SelectArguments artistSelectArguments = CreateSelectArgument(MEDIA_TYPE_QUERY, MediaInfoColumns.Artist + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = mediaInfo.SelectGroupBy(MediaInfoColumnKey.Artist, artistSelectArguments); while (dataReader.Read()) { - string info = (string)dataReader.Current; + string info = dataReader.Current; artistList.Add(info); } Tizen.Log.Debug(AppConstants.LogTag, "Total artists retrived from database: " + artistList.Count); @@ -26,9 +25,9 @@ namespace MusicPlayer.Media return artistList; } - public static OrderedDictionary GetAlbumListForArtist(string artistName) + public static List GetAlbumListForArtist(string artistName) { - OrderedDictionary albumList = new OrderedDictionary(); + List albumList = new List(); string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + AlbumColumns.Artist + "=\"" + artistName + "\""; SelectArguments albumSelectArguments = CreateSelectArgument(expression, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = albumInfo.Select(albumSelectArguments); @@ -39,16 +38,16 @@ namespace MusicPlayer.Media SelectArguments audioSelectArguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); MediaDataReader albumDataReader = albumInfo.SelectMember(info.Id, audioSelectArguments); if(albumDataReader.Read()) - albumList.Add(info.Id, info); + albumList.Add(info); } dataReader.Dispose(); Tizen.Log.Debug(AppConstants.LogTag, "Total Albums retrived from Artist: " + albumList.Count); return albumList; } - public static OrderedDictionary GetTrackListForArtist(string artistName) + public static List GetTrackListForArtist(string artistName) { - OrderedDictionary mediaList = new OrderedDictionary(); + List mediaList = new List(); string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + AlbumColumns.Artist + "=\"" + artistName + "\""; SelectArguments albumSelectArguments = CreateSelectArgument(expression, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = albumInfo.Select(albumSelectArguments); @@ -62,7 +61,7 @@ namespace MusicPlayer.Media while (albumDataReader.Read()) { MediaInfo mediaInfo = albumDataReader.Current; - mediaList.Add(mediaInfo.Id, mediaInfo); + mediaList.Add((AudioInfo)mediaInfo); } albumDataReader.Dispose(); } @@ -141,5 +140,22 @@ namespace MusicPlayer.Media return count; } + + public static List FindMatchingArtists(string searchText) + { + List artistList = new List(); + string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + MediaInfoColumns.Artist + " LIKE " + "'%" + searchText + "%' COLLATE NOCASE"; + SelectArguments artistSelectArguments = CreateSelectArgument(expression, MediaInfoColumns.Artist + MEDIA_SORT_ORDER_ASC); + MediaDataReader dataReader = mediaInfo.SelectGroupBy(MediaInfoColumnKey.Artist, artistSelectArguments); + + while (dataReader.Read()) + { + string info = (string)dataReader.Current; + artistList.Add(info); + } + Tizen.Log.Debug(AppConstants.LogTag, "Total artists retrived from database that match text: " + searchText + " are : " + artistList.Count); + dataReader.Dispose(); + return artistList; + } } } diff --git a/music-player/MediaContent/MediaContents.cs b/music-player/MediaContent/MediaContents.cs index 6ae5a12..8f0f363 100755 --- a/music-player/MediaContent/MediaContents.cs +++ b/music-player/MediaContent/MediaContents.cs @@ -52,6 +52,7 @@ namespace MusicPlayer.Media private static PlaylistCommand playlistInfo; private const string MEDIA_STORAGE_TYPE_QUERY = " (( MEDIA_STORAGE_TYPE IS NOT 101 ) AND (MEDIA_TYPE = 3)) "; private const string MEDIA_SORT_ORDER_ASC = " COLLATE NOCASE ASC "; + private static readonly string MEDIA_TYPE_QUERY = $"{MediaInfoColumns.MediaType}={(int)Media​Type.Music}"; public static event EventHandler MusicItemUpdate; public static event EventHandler MusicDBUpdate; diff --git a/music-player/MediaContent/PlaylistContents.cs b/music-player/MediaContent/PlaylistContents.cs index d3e69ff..3f00642 100755 --- a/music-player/MediaContent/PlaylistContents.cs +++ b/music-player/MediaContent/PlaylistContents.cs @@ -10,7 +10,7 @@ namespace MusicPlayer.Media { List playlists = new List(); SelectArguments arguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, PlaylistColumns.Name + MEDIA_SORT_ORDER_ASC); - MediaDataReader dataReader = playlistInfo.Select(arguments); + MediaDataReader dataReader = playlistInfo.Select(); while(dataReader.Read()) { @@ -23,7 +23,7 @@ namespace MusicPlayer.Media public static Playlist GetPlaylistByName(string name) { - string filterExpression = MEDIA_STORAGE_TYPE_QUERY + " AND " + PlaylistColumns.Name + "=\"" + name + "\""; + string filterExpression = PlaylistColumns.Name + "=\"" + name + "\""; SelectArguments arguments = CreateSelectArgument(filterExpression, PlaylistColumns.Name + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = playlistInfo.Select(arguments); @@ -42,5 +42,62 @@ namespace MusicPlayer.Media return list; } + public static Playlist CreatePlaylist(string name) + { + return playlistInfo.Insert(name); + } + + public static Playlist CreatePlaylist(string name, string thumbnailPath) + { + return playlistInfo.Insert(name, thumbnailPath); + } + + public static void AddMediaList(int id, IEnumerable trackList) + { + playlistInfo.AddMembers(id, trackList); + } + + public static bool AddMedia(int id, string mediaId) + { + return playlistInfo.AddMember(id, mediaId); + } + + public static List GetPlaylistMembers(int playlistId) + { + List memberList = new List(); + MediaDataReader dataReader = playlistInfo.SelectMember(playlistId); + while (dataReader.Read()) + { + PlaylistMember playlist = dataReader.Current; + memberList.Add(playlist); + } + return memberList; + } + + public static int GetMemberCount(int playlistId) + { + return playlistInfo.CountMember(playlistId); + } + + public static bool DeletePlaylist(int playlistId) + { + return playlistInfo.Delete(playlistId); + } + + public static bool UpdatePlaylistValues(int playlistId, PlaylistUpdateValues values) + { + return playlistInfo.Update(playlistId, values); + } + + public static bool DeletePlaylistMember(int playlistId, int mediaId) + { + return playlistInfo.RemoveMember(playlistId, mediaId); + } + + public static bool DeletePlaylistMembers(int playlistId, List memberIdList) + { + return playlistInfo.RemoveMembers(playlistId, memberIdList); + } + } } diff --git a/music-player/MediaContent/TrackContents.cs b/music-player/MediaContent/TrackContents.cs index 551a80c..97b3b18 100755 --- a/music-player/MediaContent/TrackContents.cs +++ b/music-player/MediaContent/TrackContents.cs @@ -1,26 +1,131 @@ -using System.Collections.Specialized; +using System; +using System.IO; +using System.Collections.Generic; using Tizen.Content.MediaContent; +using Tizen.Applications; using MusicPlayer.Common; namespace MusicPlayer.Media { public static partial class Contents { - public static OrderedDictionary GetTrackList() + public static List GetTrackList() { - OrderedDictionary mediaList = new OrderedDictionary(); - - SelectArguments argument = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); + List mediaList = new List(); + SelectArguments argument = CreateSelectArgument(MEDIA_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); MediaDataReader dataReader = mediaInfo.SelectMedia(argument); while (dataReader.Read()) { MediaInfo info = dataReader.Current; - mediaList.Add(info.Id, info); + mediaList.Add((AudioInfo)info); } Tizen.Log.Debug(AppConstants.LogTag, "Total track retrived from database: " + mediaList.Count); dataReader.Dispose(); return mediaList; } + + public static bool IsTrackFavourite(string mediaId) + { + MediaInfo media = mediaInfo.SelectMedia(mediaId); + if (media == null) + return false; + return media.IsFavorite; + } + + public static void SetFavourite(string mediaId, bool favourite) + { + mediaInfo.UpdateFavorite(mediaId, favourite); + } + + public static int DeleteTracks(List trackList) + { + int n = 0; + foreach (string id in trackList) + { + MediaInfo info = mediaInfo.SelectMedia(id); + string filePath = @info.Path; + try + { + FileInfo file = new FileInfo(filePath); + Tizen.Log.Debug(AppConstants.LogTag, "FileName: " + file.FullName); + file.Delete(); + mediaInfo.Delete(id); + n++; + } + catch (Exception e) + { + Tizen.Log.Debug(AppConstants.LogTag, "The deletion failed: " + e.Message); + } + } + Tizen.Log.Debug(AppConstants.LogTag, "Total tracks deleted from database: " + n); + return n; + } + + //TODO need to create Seperate App control operation class + public static int ShareTracks(List trackList) + { + int n = 0; + string shareOption; + List shareList = new List(); + + //TODO use const for all string literals + if (trackList.Count > 1) + shareOption = "http://tizen.org/appcontrol/operation/multi_share"; + else + shareOption = "http://tizen.org/appcontrol/operation/share"; + + string key = "http://tizen.org/appcontrol/data/path"; + + AppControl appControl = new AppControl(); + appControl.ApplicationId = "org.tizen.share-panel"; + Tizen.Log.Debug(AppConstants.LogTag, "ApplicationId: " + appControl.ApplicationId); + appControl.Operation = shareOption; + + foreach (string id in trackList) + { + MediaInfo info = mediaInfo.SelectMedia(id); + Tizen.Log.Debug(AppConstants.LogTag, "Track Path: " + info.Path); + string filePath = @info.Path; + try + { + FileInfo file = new FileInfo(filePath); + Tizen.Log.Debug(AppConstants.LogTag, "FileName: " + file.FullName); + shareList.Add(file.FullName); + n++; + } + catch (Exception e) + { + Tizen.Log.Debug(AppConstants.LogTag, "The sharing list creation failed: " + e.Message); + } + } + + if (n > 1) + appControl.ExtraData.Add(key, shareList); + else + appControl.Uri = shareList[0]; + + AppControl.SendLaunchRequest(appControl); + + Tizen.Log.Debug(AppConstants.LogTag, "Total tracks send to share " + n); + return n; + } + + public static List FindMatchingTracks(string searchText) + { + List mediaList = new List(); + string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + MediaInfoColumns.Title + " LIKE " + "'%" + searchText + "%' COLLATE NOCASE"; + SelectArguments argument = CreateSelectArgument(expression, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC); + MediaDataReader dataReader = mediaInfo.SelectMedia(argument); + + while (dataReader.Read()) + { + MediaInfo info = dataReader.Current; + mediaList.Add((AudioInfo)info); + } + Tizen.Log.Debug(AppConstants.LogTag, "Total track retrived from database that match text: " + searchText + " are : " + mediaList.Count); + dataReader.Dispose(); + return mediaList; + } } } diff --git a/music-player/Models/AlbumDataProvider.cs b/music-player/Models/AlbumDataProvider.cs index 9116246..abdece3 100755 --- a/music-player/Models/AlbumDataProvider.cs +++ b/music-player/Models/AlbumDataProvider.cs @@ -1,11 +1,15 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Generic; using MusicPlayer.Media; +using Tizen.Content.MediaContent; namespace MusicPlayer.Models { public static class AlbumDataProvider { - private static OrderedDictionary albumsList; + private static List albumsList; + + public static event EventHandler AlbumDataChanged; static AlbumDataProvider() { @@ -14,32 +18,40 @@ namespace MusicPlayer.Models Contents.MusicDBUpdate += OnMusicDatabaseUpdate; } - private static void OnMusicDatabaseUpdate(object sender, MusicDBUpdateEventArgs e) + public static List CurrentAlbumList() { - albumsList = Contents.GetAlbumList(); - // TODO implement database update event handler - return; + return albumsList; } - private static void OnMusicItemUpdate(object sender, MusicItemUpdateEventArgs e) + public static List GetAlbumTrackList(int albumId) { - // TODO implement database item update event handler - return; + return Contents.GetAlbumMemberList(albumId); } - public static OrderedDictionary CurrentAlbumList() + public static string GetAlbumArtFromTracks(int albumId) { - return albumsList; + return Contents.GetAlbumArtPath(albumId); } - public static OrderedDictionary GetAlbumTrackList(int albumId) + public static List GetSearchedAlbumList(string searchText) { - return Contents.GetAlbumMemberList(albumId); + return Contents.FindMatchingAlbums(searchText); } - public static string GetAlbumArtFromTracks(int albumId) + private static void OnMusicDatabaseUpdate(object sender, MusicDBUpdateEventArgs e) { - return Contents.GetAlbumArtPath(albumId); + UpdateAlbumList(); + } + + private static void OnMusicItemUpdate(object sender, MusicItemUpdateEventArgs e) + { + UpdateAlbumList(); + } + + private static void UpdateAlbumList() + { + albumsList = Contents.GetAlbumList(); + AlbumDataChanged?.Invoke(null, new EventArgs()); } } } diff --git a/music-player/Models/ArtistDataProvider.cs b/music-player/Models/ArtistDataProvider.cs index 3bd29d1..7457ed4 100755 --- a/music-player/Models/ArtistDataProvider.cs +++ b/music-player/Models/ArtistDataProvider.cs @@ -1,5 +1,7 @@ +using System; using System.Collections.Specialized; using System.Collections.Generic; +using Tizen.Content.MediaContent; using MusicPlayer.Media; namespace MusicPlayer.Models @@ -8,6 +10,8 @@ namespace MusicPlayer.Models { private static List artistsList; + public static event EventHandler ArtistDataChanged; + static ArtistDataProvider() { artistsList = Contents.GetArtistList(); @@ -15,19 +19,6 @@ namespace MusicPlayer.Models Contents.MusicDBUpdate += OnMusicDatabaseUpdate; } - private static void OnMusicDatabaseUpdate(object sender, MusicDBUpdateEventArgs e) - { - artistsList = Contents.GetArtistList(); - // TODO implement database update event handler - return; - } - - private static void OnMusicItemUpdate(object sender, MusicItemUpdateEventArgs e) - { - // TODO implement database item update event handler - return; - } - public static List CurrentArtistList() { return artistsList; @@ -48,14 +39,36 @@ namespace MusicPlayer.Models return Contents.GetAlbumArtPathForArtist(artistName); } - public static OrderedDictionary GetArtistAlbumList(string artistName) + public static List GetArtistAlbumList(string artistName) { return Contents.GetAlbumListForArtist(artistName); } - public static OrderedDictionary GetArtistTrackList(string artistName) + public static List GetArtistTrackList(string artistName) { return Contents.GetTrackListForArtist(artistName); } + + public static List GetSearchedArtistList(string searchText) + { + return Contents.FindMatchingArtists(searchText); + } + + private static void OnMusicDatabaseUpdate(object sender, MusicDBUpdateEventArgs e) + { + UpdateArtistList(); + } + + private static void OnMusicItemUpdate(object sender, MusicItemUpdateEventArgs e) + { + UpdateArtistList(); + } + + private static void UpdateArtistList() + { + artistsList = Contents.GetArtistList(); + ArtistDataChanged?.Invoke(null, new EventArgs()); + } + } } \ No newline at end of file diff --git a/music-player/Models/PlaylistModel.cs b/music-player/Models/PlaylistModel.cs new file mode 100755 index 0000000..c9f2af3 --- /dev/null +++ b/music-player/Models/PlaylistModel.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MusicPlayer.Common; + +namespace MusicPlayer.Models +{ + struct PlaylistData + { + public PlaylistData(int id, string name, string count, string thumbPath) + { + Id = id; + Name = name; + Count = count; + ThumbPath = thumbPath; + } + public int Id { get; private set; } + + public string Name { get; private set; } + + public string Count { get; private set; } + + public string ThumbPath { get; private set; } + } + + class PlaylistModel : PropertyNotifier + { + // No Parameter constructor is required for Activator.CreateInstance + public PlaylistModel() + { + } + + public PlaylistModel(PlaylistData data) + { + PlaylistId = data.Id; + PlaylistName = data.Name; + PlaylistTrackCount = data.Count; + PlaylistThumbnailPath = data.ThumbPath; + } + + private int playlistId; + + public int PlaylistId + { + get => playlistId; + private set => playlistId = value; + } + + private string playlistName; + + public string PlaylistName + { + get => playlistName; + set => SetProperty(ref playlistName, value); + } + + private string playlistTrackCount; + + public string PlaylistTrackCount + { + get => playlistTrackCount; + set => SetProperty(ref playlistTrackCount, value); + } + + private string playlistThumbnailPath; + + public string PlaylistThumbnailPath + { + get => playlistThumbnailPath; + set => SetProperty(ref playlistThumbnailPath, value); + } + + private bool playlistIsSelected; + + public bool PlaylistIsSelected + { + get => playlistIsSelected; + set => SetProperty(ref playlistIsSelected, value); + } + } +} diff --git a/music-player/Models/TrackDataProvider.cs b/music-player/Models/TrackDataProvider.cs index 1809008..083c8aa 100755 --- a/music-player/Models/TrackDataProvider.cs +++ b/music-player/Models/TrackDataProvider.cs @@ -1,11 +1,15 @@ -using System.Collections.Specialized; +using System; +using System.Collections.Generic; using MusicPlayer.Media; +using Tizen.Content.MediaContent; namespace MusicPlayer.Models { public static class TrackDataProvider { - private static OrderedDictionary tracksList; + private static List tracksList; + + public static event EventHandler TrackDataChanged; static TrackDataProvider() { @@ -14,22 +18,50 @@ namespace MusicPlayer.Models Contents.MusicDBUpdate += OnMusicDatabaseUpdate; } + public static List CurrentTrackList() + { + return tracksList; + } + private static void OnMusicDatabaseUpdate(object sender, MusicDBUpdateEventArgs e) { - tracksList = Contents.GetTrackList(); - // TODO implement database update event handler - return; + UpdateTrackList(); } private static void OnMusicItemUpdate(object sender, MusicItemUpdateEventArgs e) { - // TODO implement database item update event handler - return; + UpdateTrackList(); } - public static OrderedDictionary CurrentTrackList() + private static void UpdateTrackList() { - return tracksList; + tracksList = Contents.GetTrackList(); + TrackDataChanged?.Invoke(null, new EventArgs()); + } + + public static bool GetFavouriteStatus(string mediaId) + { + return Contents.IsTrackFavourite(mediaId); + } + + public static void SetFavouriteStatus(string mediaId, bool favourite) + { + Contents.SetFavourite(mediaId, favourite); + } + + public static int DeleteTrackList(List trackList) + { + return Contents.DeleteTracks(trackList); + } + + public static int ShareTrackList(List trackList) + { + return Contents.ShareTracks(trackList); + } + + public static List GetSearchedTrackList(string searchText) + { + return Contents.FindMatchingTracks(searchText); } } } diff --git a/music-player/ViewModels/AlbumDetailViewModel.cs b/music-player/ViewModels/AlbumDetailViewModel.cs index 5117bc8..f5a90f0 100755 --- a/music-player/ViewModels/AlbumDetailViewModel.cs +++ b/music-player/ViewModels/AlbumDetailViewModel.cs @@ -1,6 +1,9 @@ -using System.Collections.Specialized; +using Tizen.Content.MediaContent; +using System.Collections.Generic; +using System.Collections.Specialized; using MusicPlayer.Models; using MusicPlayer.Common; +using MusicPlayer.Core; namespace MusicPlayer.ViewModels { @@ -9,21 +12,16 @@ namespace MusicPlayer.ViewModels { public AlbumDetailViewModel(MusicAlbum album) { + AlbumDataProvider.AlbumDataChanged += OnAlbumDetailChanged; Id = album.Id; AlbumName = album.AlbumName; ArtistName = album.ArtistName; AlbumArtPath = album.AlbumArtPath; - OrderedDictionary trackList = AlbumDataProvider.GetAlbumTrackList(album.Id); - listViewModel = new ListViewModel(); - listViewModel.CreateData(trackList); - listViewModel.CollectionChanged += OnAlbumDetailListChanges; - TotalTracks = listViewModel.Count.ToString(); - } - private void OnAlbumDetailListChanges(object sender, NotifyCollectionChangedEventArgs e) - { - //TODO + listViewModel = new ListViewModel(); + UpdateAlbumDetailData(); TotalTracks = listViewModel.Count.ToString(); + listViewModel.CollectionChanged += OnCollectionChanged; } private int id; @@ -84,5 +82,46 @@ namespace MusicPlayer.ViewModels SetProperty(ref totalTracks, value + text); } } + + // TODO do we really need this ? + public void OnViewDeleted() + { + AlbumDataProvider.AlbumDataChanged -= OnAlbumDetailChanged; + ListViewModel.CollectionChanged -= OnCollectionChanged; + ListViewModel.Clear(); + } + + public void PlayAll() + { + PlaybackHelper.Instance.PlayAll(ListViewModel, ListViewModel[0]); + } + + public void PlayAllWithShuffle() + { + PlaybackHelper.Instance.PlayAllWithShuffle(ListViewModel); + } + + public void PlayCurrent(object currentTrack) + { + PlaybackHelper.Instance.PlayCurrent(ListViewModel, (Track)currentTrack); + } + + private void OnAlbumDetailChanged(object sender, System.EventArgs e) + { + UpdateAlbumDetailData(); + } + + private void UpdateAlbumDetailData() + { + listViewModel.Clear(); + List trackList = AlbumDataProvider.GetAlbumTrackList(Id); + listViewModel.CreateData(trackList); + } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + TotalTracks = listViewModel.Count.ToString(); + } + } } diff --git a/music-player/ViewModels/AlbumViewModel.cs b/music-player/ViewModels/AlbumViewModel.cs index a396076..8c595a2 100755 --- a/music-player/ViewModels/AlbumViewModel.cs +++ b/music-player/ViewModels/AlbumViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.Specialized; +using System.Collections.Generic; using MusicPlayer.Models; using MusicPlayer.Common; @@ -7,31 +8,15 @@ namespace MusicPlayer.ViewModels using Album = Tizen.Content.MediaContent.Album; class AlbumViewModel : PropertyNotifier { - private AlbumDetailViewModel albumDetailViewModel; - public AlbumViewModel() { - OrderedDictionary albumList = AlbumDataProvider.CurrentAlbumList(); + AlbumDataProvider.AlbumDataChanged += OnAlbumDataChanged; listViewModel = new ListViewModel(); - listViewModel.CreateData(albumList); - listViewModel.CollectionChanged += OnAlbumListChanges; - AlbumCount = listViewModel.Count.ToString(); - } - - private void OnAlbumListChanges(object sender, NotifyCollectionChangedEventArgs e) - { + CreateAlbumData(); + listViewModel.CollectionChanged += OnCollectionChanged; AlbumCount = listViewModel.Count.ToString(); } - public AlbumDetailViewModel getDetailViewModel(MusicAlbum musicAlbum) - { - if(albumDetailViewModel == null) - albumDetailViewModel = new AlbumDetailViewModel(musicAlbum); - else if (albumDetailViewModel.Id != musicAlbum.Id) - albumDetailViewModel = new AlbumDetailViewModel(musicAlbum); - return albumDetailViewModel; - } - private ListViewModel listViewModel; public ListViewModel ListViewModel @@ -50,5 +35,22 @@ namespace MusicPlayer.ViewModels SetProperty(ref albumCount, value + text); } } + + private void CreateAlbumData() + { + listViewModel.Clear(); + List albumList = AlbumDataProvider.CurrentAlbumList(); + listViewModel.CreateData(albumList); + } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + AlbumCount = listViewModel.Count.ToString(); + } + + private void OnAlbumDataChanged(object sender, System.EventArgs e) + { + CreateAlbumData(); + } } } diff --git a/music-player/ViewModels/ArtistDetailViewModel.cs b/music-player/ViewModels/ArtistDetailViewModel.cs index 6d09ba3..cdc0a38 100755 --- a/music-player/ViewModels/ArtistDetailViewModel.cs +++ b/music-player/ViewModels/ArtistDetailViewModel.cs @@ -1,6 +1,8 @@ using System.Collections.Specialized; using MusicPlayer.Models; using MusicPlayer.Common; +using MusicPlayer.Core; +using System.Collections.Generic; namespace MusicPlayer.ViewModels { @@ -8,33 +10,16 @@ namespace MusicPlayer.ViewModels using AudioInfo = Tizen.Content.MediaContent.AudioInfo; class ArtistDetailViewModel : PropertyNotifier { - public ArtistDetailViewModel(Artist artist) { + ArtistDataProvider.ArtistDataChanged += OnArtistDetailChanged; + ArtistName = artist.ArtistName; TotalCount = artist.TotalCount; - string text = string.Equals(ArtistName, "Unknown") ? "" : ArtistName; - OrderedDictionary albumList = ArtistDataProvider.GetArtistAlbumList(text); albumListViewModel = new ListViewModel(); - albumListViewModel.CreateData(albumList); - - OrderedDictionary trackList = ArtistDataProvider.GetArtistTrackList(text); trackListViewModel = new ListViewModel(); - trackListViewModel.CreateData(trackList); - groupListViewModel = new ListViewModel(); - - foreach(MusicAlbum album in albumListViewModel) - { - ArtistDetailAlbum artistAlbum = new ArtistDetailAlbum(album); - OrderedDictionary albumTrackList = AlbumDataProvider.GetAlbumTrackList(album.Id); - ListViewModel albumTrackListViewModel = new ListViewModel(); - albumTrackListViewModel.CreateData(albumTrackList); - foreach (Track track in albumTrackListViewModel) - artistAlbum.Add(track); - groupListViewModel.Add(artistAlbum); - } } private string artistName; @@ -53,6 +38,30 @@ namespace MusicPlayer.ViewModels set => SetProperty(ref totalCount, value); } + // TODO do we really need this ? + public void OnViewDeleted() + { + ArtistDataProvider.ArtistDataChanged += OnArtistDetailChanged; + trackListViewModel.Clear(); + albumListViewModel.Clear(); + groupListViewModel.Clear(); + } + + public void PlayAll() + { + PlaybackHelper.Instance.PlayAll(TrackListViewModel, TrackListViewModel[0]); + } + + public void PlayAllWithShuffle() + { + PlaybackHelper.Instance.PlayAllWithShuffle(TrackListViewModel); + } + + public void PlayCurrent(object currentTrack) + { + PlaybackHelper.Instance.PlayCurrent(TrackListViewModel, (Track)currentTrack); + } + private readonly ListViewModel groupListViewModel; public ListViewModel GroupListViewModel => groupListViewModel; @@ -61,5 +70,37 @@ namespace MusicPlayer.ViewModels private readonly ListViewModel trackListViewModel; public ListViewModel TrackListViewModel => trackListViewModel; + + private void OnArtistDetailChanged(object sender, System.EventArgs e) + { + UpdateArtistDetailView(); + } + + //TODO update function to update count when change occured + private void UpdateArtistDetailView() + { + trackListViewModel.Clear(); + albumListViewModel.Clear(); + groupListViewModel.Clear(); + + string text = string.Equals(ArtistName, "Unknown") ? "" : ArtistName; + + List albumList = ArtistDataProvider.GetArtistAlbumList(text); + albumListViewModel.CreateData(albumList); + + List trackList = ArtistDataProvider.GetArtistTrackList(text); + trackListViewModel.CreateData(trackList); + + foreach (MusicAlbum album in albumListViewModel) + { + ArtistDetailAlbum artistAlbum = new ArtistDetailAlbum(album); + List albumTrackList = AlbumDataProvider.GetAlbumTrackList(album.Id); + ListViewModel albumTrackListViewModel = new ListViewModel(); + albumTrackListViewModel.CreateData(albumTrackList); + foreach (Track track in albumTrackListViewModel) + artistAlbum.Add(track); + groupListViewModel.Add(artistAlbum); + } + } } } diff --git a/music-player/ViewModels/ArtistViewModel.cs b/music-player/ViewModels/ArtistViewModel.cs index 49d1092..58f40bc 100755 --- a/music-player/ViewModels/ArtistViewModel.cs +++ b/music-player/ViewModels/ArtistViewModel.cs @@ -7,31 +7,15 @@ namespace MusicPlayer.ViewModels { class ArtistViewModel : PropertyNotifier { - private ArtistDetailViewModel artistDetailViewModel; - public ArtistViewModel() { - List artistList = ArtistDataProvider.CurrentArtistList(); + ArtistDataProvider.ArtistDataChanged += OnArtistDataChanged; listViewModel = new ListViewModel(); - listViewModel.CreateData(artistList); - listViewModel.CollectionChanged += OnArtistListChanges; + CreateArtistData(); + listViewModel.CollectionChanged += OnCollectionChanged; ArtistCount = listViewModel.Count.ToString(); } - private void OnArtistListChanges(object sender, NotifyCollectionChangedEventArgs e) - { - artistCount = listViewModel.Count.ToString(); - } - - public ArtistDetailViewModel getDetailViewModel(Artist artist) - { - if (artistDetailViewModel == null) - artistDetailViewModel = new ArtistDetailViewModel(artist); - else if (artistDetailViewModel.ArtistName != artist.ArtistName) - artistDetailViewModel = new ArtistDetailViewModel(artist); - return artistDetailViewModel; - } - private ListViewModel listViewModel; public ListViewModel ListViewModel @@ -50,5 +34,23 @@ namespace MusicPlayer.ViewModels SetProperty(ref artistCount, value + text); } } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + ArtistCount = listViewModel.Count.ToString(); + } + + private void CreateArtistData() + { + listViewModel.Clear(); + List artistList = ArtistDataProvider.CurrentArtistList(); + listViewModel.CreateData(artistList); + } + + private void OnArtistDataChanged(object sender, System.EventArgs e) + { + CreateArtistData(); + } + } } \ No newline at end of file diff --git a/music-player/ViewModels/ListViewModel.cs b/music-player/ViewModels/ListViewModel.cs index 24ea54e..654e40c 100755 --- a/music-player/ViewModels/ListViewModel.cs +++ b/music-player/ViewModels/ListViewModel.cs @@ -1,8 +1,6 @@ using System.Collections; using System.Collections.Specialized; using System.Collections.ObjectModel; -using MusicPlayer.Models; -using Tizen.Content.MediaContent; using MusicPlayer.Common; using System; using System.Collections.Generic; @@ -32,7 +30,5 @@ namespace MusicPlayer.ViewModels } Tizen.Log.Debug(AppConstants.LogTag, "Observable list item count: " + this.Count); } - - } } diff --git a/music-player/ViewModels/LyricsViewModel.cs b/music-player/ViewModels/LyricsViewModel.cs old mode 100644 new mode 100755 index 6307f28..6ffff18 --- a/music-player/ViewModels/LyricsViewModel.cs +++ b/music-player/ViewModels/LyricsViewModel.cs @@ -46,9 +46,22 @@ namespace MusicPlayer.ViewModels private string GetLyrics(string path) { - var metadataExtractor = new MetadataExtractor(path); - Metadata metadata = metadataExtractor.GetMetadata(); - string lyrics = metadata.UnsyncLyrics; + string lyrics = string.Empty; + try + { + var metadataExtractor = new MetadataExtractor(path); + Metadata metadata = metadataExtractor.GetMetadata(); + lyrics = metadata.UnsyncLyrics; + } + catch(System.IO.FileNotFoundException ex) + { + Tizen.Log.Error(AppConstants.LogTag, "File might be in external storage or, " + ex.Message); + } + catch(System.InvalidOperationException ex) + { + Tizen.Log.Error(AppConstants.LogTag, "Invalid operation: " + ex.Message); + } + if(string.IsNullOrEmpty(lyrics)) { LyricsBackgroundColor = Color.Transparent; diff --git a/music-player/ViewModels/PlayerViewModel.cs b/music-player/ViewModels/PlayerViewModel.cs index 0b53d16..d4ab854 100755 --- a/music-player/ViewModels/PlayerViewModel.cs +++ b/music-player/ViewModels/PlayerViewModel.cs @@ -26,6 +26,7 @@ namespace MusicPlayer.ViewModels { lyricsViewModel = new LyricsViewModel(); playingListViewModel = new PlayingListViewModel(); + playingListViewModel.ItemSelected += OnPlayingListItemSelected; playerModel = new PlayerModel(); playerModel.ElapsedTime = 0.0f; PlayingStatus = PlayingStatus.None; @@ -37,6 +38,7 @@ namespace MusicPlayer.ViewModels AudioManager.VolumeController.Changed += OnVolumeLevelChanged; HasPreviousTrack = playingListViewModel.HasPrev(); HasNextTrack = playingListViewModel.HasNext(); + FavouriteButtonState = Favourite.Off.ToString(); } internal PlayingListViewModel playingListViewModel; @@ -46,6 +48,14 @@ namespace MusicPlayer.ViewModels get => playingListViewModel; } + private string favouriteButtonState; + + public string FavouriteButtonState + { + get => favouriteButtonState; + set => SetProperty(ref favouriteButtonState, value); + } + private string playButtonState; public string PlayButtonState @@ -118,6 +128,10 @@ namespace MusicPlayer.ViewModels // SetBackground SetExtractedBackground(track.ThumbnailPath); + // Set Favourite Status + bool favouriteStatus = TrackDataProvider.GetFavouriteStatus(track.Id); + FavouriteButtonState = favouriteStatus ? Favourite.On.ToString() : Favourite.Off.ToString(); + PlayerController.Instance.Uri = track.FilePath; StartPlayback(); } @@ -178,6 +192,19 @@ namespace MusicPlayer.ViewModels playingListViewModel.RepeatMode = new_mode; } + public void FavouriteStatusChanged() + { + bool favouriteStatus = !(TrackDataProvider.GetFavouriteStatus(playerModel.CurrentTrack.Id)); + FavouriteButtonState = favouriteStatus ? Favourite.On.ToString() : Favourite.Off.ToString(); + TrackDataProvider.SetFavouriteStatus(playerModel.CurrentTrack.Id, favouriteStatus); + } + + public void SetRepeatAndShuffle(RepeatMode repeatMode, ShuffleMode shuffleMode) + { + playingListViewModel.RepeatMode = repeatMode; + playingListViewModel.ShuffleMode = shuffleMode; + } + public void PlayingStatusChanged() { if (PlayingStatus == PlayingStatus.Playing) @@ -228,6 +255,11 @@ namespace MusicPlayer.ViewModels AudioManager.VolumeController.Level[AudioVolumeType.Media] = value; } + public void StartShuffledTrack() + { + SetCurrentTrack(playingListViewModel.FirstShuffledTrack()); + } + private void UpdatePlayingStatus(PlayingStatus status) { playingStatus = status; @@ -244,6 +276,11 @@ namespace MusicPlayer.ViewModels } } + private void OnPlayingListItemSelected(object sender, PlayingListItemSelectedEvent e) + { + SetCurrentTrack((Track)e.CurrentSelectedItem); + } + private bool OnPlaybackTimerTick(object source, Timer.TickEventArgs e) { UpdatePlayingTime(); diff --git a/music-player/ViewModels/PlayingListViewModel.cs b/music-player/ViewModels/PlayingListViewModel.cs index d84e547..fa683da 100755 --- a/music-player/ViewModels/PlayingListViewModel.cs +++ b/music-player/ViewModels/PlayingListViewModel.cs @@ -47,6 +47,8 @@ namespace MusicPlayer.ViewModels private string shuffleButtonUrl; private string repeatButtonUrl; + public event EventHandler ItemSelected; + public PlayingListViewModel() { shuffleList = new List(); @@ -116,15 +118,30 @@ namespace MusicPlayer.ViewModels set => SetProperty(ref repeatButtonUrl, value); } - public RepeatMode RepeatMode - { + public RepeatMode RepeatMode + { get => repeatMode; set { repeatMode = value; RepeatButtonState = repeatMode.ToString(); } - } + } + + public Track FirstShuffledTrack() + { + if(shuffleList.Count > 0) + { + return tracklistViewModel[shuffleList[0]]; + } + return null; + } + + public void OnItemSelected(object selectedItem) + { + SetPlayingTrack((Track)selectedItem); + ItemSelected?.Invoke(this, new PlayingListItemSelectedEvent(selectedItem)); + } public Track Next() { diff --git a/music-player/ViewModels/PlaylistDetailViewModel.cs b/music-player/ViewModels/PlaylistDetailViewModel.cs new file mode 100755 index 0000000..b072d79 --- /dev/null +++ b/music-player/ViewModels/PlaylistDetailViewModel.cs @@ -0,0 +1,113 @@ +using System.Collections.Specialized; +using System.Collections.Generic; +using Tizen.Content.MediaContent; +using MusicPlayer.Models; +using MusicPlayer.Common; +using MusicPlayer.Core; + + +namespace MusicPlayer.ViewModels +{ + class PlaylistDetailViewModel : PropertyNotifier + { + private Playlist playlist; + private bool isDefaultPlaylist; + public PlaylistDetailViewModel(int playlistId) + { + PlaylistManager.Instance.PlaylistDataChanged += OnPlaylistDetailChanged; + playlist = PlaylistManager.Instance.GetPlaylist(playlistId); + PlaylistName = playlist.Name; + isDefaultPlaylist = false; + if(PlaylistName == AppConstants.RecentlyAddedPlaylist || PlaylistName == AppConstants.FavouritePlaylist) + { + isDefaultPlaylist = true; + } + listViewModel = new ListViewModel(); + UpdatePlaylistDetails(); + PlaylistTrackCount = listViewModel.Count.ToString(); + ListViewModel.CollectionChanged += OnCollectionChanged; + } + + public string PlaylistName { get; set; } + + private ListViewModel listViewModel; + + public ListViewModel ListViewModel + { + get => listViewModel; + } + + private string playlistTrackCount; + + public string PlaylistTrackCount + { + get => playlistTrackCount; + set + { + string count = string.Equals(value, "1") ? value + " Track" : value + " Tracks"; + SetProperty(ref playlistTrackCount, count); + } + } + + // TODO do we really need this ? + public void OnViewDeleted() + { + PlaylistManager.Instance.PlaylistDataChanged -= OnPlaylistDetailChanged; + ListViewModel.CollectionChanged -= OnCollectionChanged; + ListViewModel.Clear(); + } + + public void PlayAll() + { + PlaybackHelper.Instance.PlayAll(ListViewModel, ListViewModel[0]); + } + + public void PlayAllWithShuffle() + { + PlaybackHelper.Instance.PlayAllWithShuffle(ListViewModel); + } + + public void PlayCurrent(object currentTrack) + { + PlaybackHelper.Instance.PlayCurrent(ListViewModel, (Track)currentTrack); + } + + private void OnPlaylistDetailChanged(object sender, System.EventArgs e) + { + UpdatePlaylistDetails(); + } + + private List CreatePlaylistAudioData(int playlistId) + { + List playlistMembers = PlaylistManager.Instance.GetMemberList(playlistId); + List audioList = new List(); + foreach (PlaylistMember member in playlistMembers) + { + MediaInfo mediaInfo = member.MediaInfo; + if (mediaInfo.MediaType == MediaType.Music) + { + audioList.Add((AudioInfo)mediaInfo); + } + } + return audioList; + } + + private void UpdatePlaylistDetails() + { + // This is required because we delete and recreate default playlists on every database change event + if(isDefaultPlaylist) + { + Playlist updatedPlaylist = PlaylistManager.Instance.GetPlaylist(PlaylistName); + playlist = updatedPlaylist; + } + listViewModel.Clear(); + listViewModel.CreateData(CreatePlaylistAudioData(playlist.Id)); + } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + PlaylistTrackCount = ListViewModel.Count.ToString(); + } + + } +} diff --git a/music-player/ViewModels/PlaylistViewModel.cs b/music-player/ViewModels/PlaylistViewModel.cs new file mode 100755 index 0000000..dd28972 --- /dev/null +++ b/music-player/ViewModels/PlaylistViewModel.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Specialized; +using System.Collections.Generic; +using Tizen.Content.MediaContent; +using MusicPlayer.Models; +using MusicPlayer.Core; +using MusicPlayer.Common; +using MusicPlayer.Media; + +namespace MusicPlayer.ViewModels +{ + class PlaylistViewModel : PropertyNotifier + { + public PlaylistViewModel() + { + PlaylistManager.Instance.PlaylistDataChanged += OnPlaylistDataChanged; + listViewModel = new ListViewModel(); + UpdatePlaylistData(); + PlaylistCount = listViewModel.Count.ToString(); + ListViewModel.CollectionChanged += OnCollectionChanged; + } + + private ListViewModel listViewModel; + + public ListViewModel ListViewModel + { + get => listViewModel; + } + + public ListViewModel UserPlaylistViewModel + { + get => CreateUserPlayListViewModel(); + } + + private string playlistCount; + + public string PlaylistCount + { + get => playlistCount; + set + { + string countText = string.Equals(value, "1") ? value+" Playlist" : value+" Playlists"; + SetProperty(ref playlistCount, countText); + } + } + + private Playlist CreateDefaultPlaylist(string name, string thumbPath) + { + Playlist playlist = PlaylistManager.Instance.GetPlaylist(name); + if (playlist != null) + { + PlaylistManager.Instance.Delete(playlist.Id); + playlist = null; + } + playlist = PlaylistManager.Instance.AddPlaylist(name, thumbPath); + return playlist; + } + + + private Tuple AddMemberToDefaultList(Playlist favourite, Playlist recentlyAdded) + { + List trackList = Contents.GetTrackList(); + int recentAddedCount = trackList.Count; + int favouriteCount = 0; + foreach(AudioInfo track in trackList) + { + PlaylistManager.Instance.AddTrack(recentlyAdded.Id, track.Id); + if(track.IsFavorite) + { + PlaylistManager.Instance.AddTrack(favourite.Id, track.Id); + favouriteCount++; + } + } + return new Tuple(recentAddedCount, favouriteCount); + } + + private string GetTrackCountForPlaylist(int playlistId) + { + int trackCount = PlaylistManager.Instance.PlaylistTrackCount(playlistId); + return GetTrackCountText(trackCount); + } + + private string GetTrackCountText(int trackCount) + { + return trackCount > 1 ? trackCount.ToString() + " tracks" : trackCount.ToString() + " track"; + } + + private void AddDefaultPlaylist(List list) + { + // Deleting the Favourite and Recently Added first always so that we can add member correctly again. + Playlist favouritePlaylist = CreateDefaultPlaylist(AppConstants.FavouritePlaylist, Resources.GetImagePath() + "favourite_playlist.png"); + Playlist recentlyAddedPlaylist = CreateDefaultPlaylist(AppConstants.RecentlyAddedPlaylist, Resources.GetImagePath() + "recently_added_playlist.png"); + Tuple memberCounts = AddMemberToDefaultList(favouritePlaylist, recentlyAddedPlaylist); + list.Add(new PlaylistData(recentlyAddedPlaylist.Id, recentlyAddedPlaylist.Name, GetTrackCountText(memberCounts.Item1), recentlyAddedPlaylist.ThumbnailPath)); + list.Add(new PlaylistData(favouritePlaylist.Id, favouritePlaylist.Name, GetTrackCountText(memberCounts.Item2), favouritePlaylist.ThumbnailPath)); + } + + private List GeneratePlaylistData() + { + List dataList = new List(); + AddDefaultPlaylist(dataList); + + List playlists = PlaylistManager.Instance.Playlists; + Tizen.Log.Error(AppConstants.LogTag, "Retrived playlistcount: " + playlists.Count); + + foreach(Playlist playlist in playlists) + { + if (playlist.Name == AppConstants.FavouritePlaylist || playlist.Name == AppConstants.RecentlyAddedPlaylist) + continue; + Tizen.Log.Error(AppConstants.LogTag, playlist.Id + ": "+playlist.Name); + dataList.Add(new PlaylistData(playlist.Id, playlist.Name, GetTrackCountForPlaylist(playlist.Id), playlist.ThumbnailPath)); + } + return dataList; + } + + private void UpdatePlaylistData() + { + listViewModel.Clear(); + List dataList = GeneratePlaylistData(); + listViewModel.CreateData(dataList); + } + + private void OnPlaylistDataChanged(object sender, System.EventArgs e) + { + UpdatePlaylistData(); + } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + PlaylistCount = ListViewModel.Count.ToString(); + } + + private ListViewModel CreateUserPlayListViewModel() + { + ListViewModel userListViewModel = new ListViewModel(); + if (ListViewModel.Count <= 2) + return userListViewModel; + for(int i = 2; i(); - listViewModel.CreateData(trackList); - listViewModel.CollectionChanged += OnTrackListChanges; - TrackCount = listViewModel.Count.ToString(); - } - - private void OnTrackListChanges(object sender, NotifyCollectionChangedEventArgs e) - { + CreateTrackData(); + listViewModel.CollectionChanged += OnCollectionChanged; TrackCount = listViewModel.Count.ToString(); } @@ -39,5 +36,37 @@ namespace MusicPlayer.ViewModels SetProperty(ref trackCount, value + text); } } + + public void OnTrackSelected(object selectedItem) + { + PlaybackHelper.Instance.PlayCurrent(ListViewModel, (Track)selectedItem); + } + + public void PlayAll() + { + PlaybackHelper.Instance.PlayAll(ListViewModel, ListViewModel[0]); + } + + public void PlayAllWithShuffle() + { + PlaybackHelper.Instance.PlayAllWithShuffle(ListViewModel); + } + + private void OnTrackDataChanged(object sender, System.EventArgs e) + { + CreateTrackData(); + } + + private void CreateTrackData() + { + List trackList = TrackDataProvider.CurrentTrackList(); + listViewModel.Clear(); + listViewModel.CreateData(trackList); + } + + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + TrackCount = listViewModel.Count.ToString(); + } } } diff --git a/music-player/Views/AlbumDetailLayout.cs b/music-player/Views/AlbumDetailLayout.cs index cb549af..02f24bb 100755 --- a/music-player/Views/AlbumDetailLayout.cs +++ b/music-player/Views/AlbumDetailLayout.cs @@ -37,15 +37,16 @@ namespace MusicPlayer.Views private TextLabel CreateTitleLabel() { - TextLabel titleLabel = new TextLabel() + TextLabel titleLabel = new TextLabel("ItemLabel") { + ThemeChangeSensitive = true, Size2D = new Size2D(596, 40), - TextColor = UIColors.HEX001447, PixelSize = 32, FontFamily = "BreezeSans", + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, Padding=new Extents(LayoutPadding,0,0,0), - IsCreateByXaml = true, + FontStyle = UIFontStyles.NormalLight, Position2D = new Position2D(X , LayoutMargin), }; base.Add(titleLabel); @@ -54,15 +55,16 @@ namespace MusicPlayer.Views private TextLabel CreateSubTitleLabel() { - TextLabel subtitleLabel = new TextLabel() + TextLabel subtitleLabel = new TextLabel("ItemLabel") { + ThemeChangeSensitive = true, Size2D= new Size2D(596,36), - TextColor = UIColors.HEX001447, PixelSize = 28, FontFamily = "BreezeSans", + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, Padding = new Extents(LayoutPadding, 0, 0, 0), - IsCreateByXaml = true, + FontStyle = UIFontStyles.AllNormal, Position2D = new Position2D(X , LayoutMargin + 40) }; base.Add(subtitleLabel); @@ -71,15 +73,15 @@ namespace MusicPlayer.Views private TextLabel CreateAdditionalLabel(int width) { - TextLabel additionalLabel = new TextLabel() + TextLabel additionalLabel = new TextLabel("ItemLabel") { + ThemeChangeSensitive = true, Size2D= new Size2D(108,36), - TextColor = UIColors.HEX001447, PixelSize = 28, FontFamily = "BreezeSans", VerticalAlignment = VerticalAlignment.Center, - HorizontalAlignment =HorizontalAlignment.End, - IsCreateByXaml = true, + HorizontalAlignment = HorizontalAlignment.End, + FontStyle = UIFontStyles.AllNormal, Position2D = new Position2D(width-LayoutPadding-LeftPadding-108, 36) }; base.Add(additionalLabel); diff --git a/music-player/Views/AlbumDetailView.cs b/music-player/Views/AlbumDetailView.cs index b39e11f..54c8e86 100755 --- a/music-player/Views/AlbumDetailView.cs +++ b/music-player/Views/AlbumDetailView.cs @@ -1,106 +1,85 @@ -using MusicPlayer.ViewModels; +using Tizen.NUI; +using Tizen.NUI.Binding; using Tizen.NUI.Components; using Tizen.NUI.BaseComponents; -using Tizen.NUI; -using Tizen.NUI.Binding; using MusicPlayer.Common; +using MusicPlayer.ViewModels; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { - class AlbumDetailView : View + class AlbumDetailView : BaseSubContentView { - private const int LayoutPadding = 64; - private const int IconSize = 48; private const int AlbumArtSize = 520; - private const int ControlViewWidth = 960; private const int ControlViewHeight = 60; - private const int ControlViewMargin = 6; - private BaseView baseView; - private View contentView; private View leftView; private View rightView; private ImageView albumArtIcon; private TextLabel albumNameLabel; private TextLabel albumArtistLabel; - private View controlsView; - private TextLabel trackCountLabel; - private Button playAllIcon; // TODO need to implement playall feature - private Button shuffleAndPlayAllIcon; // TODO need to implement playlist manager - private CollectionView collectionView; private AlbumDetailViewModel viewModel; public AlbumDetailView(AlbumDetailViewModel viewModel) : base() { + Name = "AlbumDetailView"; this.viewModel = viewModel; - BindingContext = viewModel; - BackgroundColor = UIColors.HEXEEEFF1; - WidthResizePolicy = ResizePolicyType.FillToParent; - HeightResizePolicy = ResizePolicyType.FillToParent; - - //TODO need to change this part after implementation of Command Interface - baseView = new BaseView() - { - Title = viewModel.AlbumName, - BackButton = true, - MoreButton = true, - SearchButton = true, - BackgroundColor = UIColors.HEXEEEFF1, - }; - base.Add(baseView); - contentView = new View() - { - WidthSpecification = LayoutParamPolicies.MatchParent, - HeightSpecification = 876, - Layout = new FlexLayout() - { - Direction = FlexLayout.FlexDirection.Row, - ItemsAlignment = FlexLayout.AlignmentType.FlexStart, - Justification = FlexLayout.FlexJustification.FlexStart, - }, - }; - baseView.SetContent = contentView; - leftView = CreateLeftView(); rightView = CreateRightView(); - controlsView = AddControlView(); - AddControlElements(); - collectionView = AddCollectionView(); + rightView.Add(listContainer); + countLabel.BindingContext = viewModel; + countLabel.SetBinding(TextLabel.TextProperty, "TotalTracks"); + UpdateCollectionView(); AddAlbumArt(); AddAlbumInfo(); } - private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + public override void UpdateSubContentMoreButtonItems(Menu moreMenu) { + var addtoPlaylist = new MenuItem { Text = "Add to playlist" }; + addtoPlaylist.Clicked += OnAddToPlaylistClick; + var share = new MenuItem { Text = "Share" }; + share.Clicked += OnShareClick; + + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { addtoPlaylist, share, delete }; } - private Button CreateButton(string url, int x, int y) + public override void DeleteSubView() { - ButtonStyle buttonStyle = new ButtonStyle() - { - Icon = new ImageViewStyle() - { - ResourceUrl = url, - }, - IsSelectable = false, - IsEnabled = true, - }; + base.DeleteSubView(); + viewModel.OnViewDeleted(); + } - Button button = new Button(buttonStyle) - { - Size2D = new Size2D(IconSize, IconSize), - Position2D = new Position2D(x, y), - }; - return button; + protected override void OnPlayAllClicked() + { + base.OnPlayAllClicked(); + Tizen.Log.Error(AppConstants.LogTag, "AlbumDetailView OnPlayAllClicked"); + viewModel.PlayAll(); + } + + protected override void OnPlayAllWithShuffleClicked() + { + base.OnPlayAllWithShuffleClicked(); + Tizen.Log.Error(AppConstants.LogTag, "AlbumDetailView OnPlayAllWithShuffleClicked"); + viewModel.PlayAllWithShuffle(); + } + + private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + { + viewModel.PlayCurrent(collectionView.SelectedItem); } private View CreateLeftView() { View leftView = new View() { - BackgroundColor = UIColors.HEXEEEFF1, - Size2D = new Size2D(Window.Instance.WindowSize.Width / 2, 752), + BackgroundColor = Color.Transparent, + SizeWidth = Window.Instance.WindowSize.Width / 2, + HeightResizePolicy = ResizePolicyType.FillToParent, Position2D = new Position2D(0, 0), Layout = new FlexLayout { @@ -110,7 +89,7 @@ namespace MusicPlayer.Views }, Padding = new Extents(0, 0, ControlViewHeight, 42), }; - contentView.Add(leftView); + base.Add(leftView); return leftView; } @@ -118,8 +97,9 @@ namespace MusicPlayer.Views { View rightView = new View() { - BackgroundColor = UIColors.HEXEEEFF1, - Size2D = new Size2D(Window.Instance.WindowSize.Width / 2, 752), + BackgroundColor = Color.Transparent, + SizeWidth = Window.Instance.WindowSize.Width / 2, + HeightResizePolicy = ResizePolicyType.FillToParent, Position2D = new Position2D(Window.Instance.WindowSize.Width / 2, 0), Layout = new FlexLayout { @@ -128,7 +108,7 @@ namespace MusicPlayer.Views Justification = FlexLayout.FlexJustification.FlexStart, }, }; - contentView.Add(rightView); + base.Add(rightView); return rightView; } @@ -139,105 +119,72 @@ namespace MusicPlayer.Views BackgroundColor = UIColors.HEXEEEFF1, Size2D = new Size2D(AlbumArtSize, AlbumArtSize), }; + albumArtIcon.BindingContext = viewModel; albumArtIcon.SetBinding(ImageView.ResourceUrlProperty, "AlbumArtPath"); leftView.Add(albumArtIcon); } private void AddAlbumInfo() { - albumNameLabel = new TextLabel() + albumNameLabel = new TextLabel("LabelText") { - Text = "ALBUM NAME", Size2D = new Size2D(640, 48), PixelSize = 36, Margin = new Extents(0, 0, 32, 0), FontFamily = "BreezeSans", - TextColor = UIColors.HEX001447, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Ellipsis = true, + FontStyle = UIFontStyles.NormalLight, }; + albumNameLabel.BindingContext = viewModel; albumNameLabel.SetBinding(TextLabel.TextProperty, "AlbumName"); leftView.Add(albumNameLabel); - albumArtistLabel = new TextLabel() + albumArtistLabel = new TextLabel("LabelText") { - Text = "ARTIST NAME", Size2D = new Size2D(640, 36), PixelSize = 28, Margin = new Extents(0, 0, 14, 0), FontFamily = "BreezeSans", - TextColor = UIColors.HEX000209, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Ellipsis = true, + FontStyle = UIFontStyles.AllNormal, }; + albumArtistLabel.BindingContext = viewModel; albumArtistLabel.SetBinding(TextLabel.TextProperty, "ArtistName"); leftView.Add(albumArtistLabel); - } - private View AddControlView() + + private void UpdateCollectionView() { - View controlsView = new View() + collectionView.ItemTemplate = new DataTemplate(() => { - BackgroundColor = UIColors.HEXEEEFF1, - Size2D = new Size2D(ControlViewWidth, ControlViewHeight), - Padding = new Extents(LayoutPadding, LayoutPadding, ControlViewMargin, ControlViewMargin), - }; - rightView.Add(controlsView); - return controlsView; + AlbumDetailLayout layout = new AlbumDetailLayout(); + layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle"); + layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName"); + layout.AdditionalLabel.SetBinding(TextLabel.TextProperty, "Duration"); + return layout; + }); + collectionView.ItemsSource = viewModel.ListViewModel; + collectionView.SelectionChanged += OnTrackSelection; } - private void AddControlElements() + private void OnDeleteClick(object sender, ClickedEventArgs e) { - trackCountLabel = new TextLabel() - { - Text = "TRACK COUNT", - Size2D = new Size2D(664, 36), - Position2D = new Position2D(LayoutPadding, 12), - PixelSize = 28, - Margin = new Extents(0, 0, ControlViewMargin, ControlViewMargin), - FontFamily = "BreezeSans", - TextColor = UIColors.HEX001447, - HorizontalAlignment = HorizontalAlignment.Begin, - VerticalAlignment = VerticalAlignment.Center, - }; - trackCountLabel.SetBinding(TextLabel.TextProperty, "TotalTracks"); - controlsView.Add(trackCountLabel); - - playAllIcon = CreateButton(Resources.GetImagePath() + "playlist_active.png.png", Window.Instance.WindowSize.Width / 2 - LayoutPadding - IconSize, ControlViewMargin); - playAllIcon.Margin = new Extents(40, 0, 0, 0); - controlsView.Add(playAllIcon); - - shuffleAndPlayAllIcon = CreateButton(Resources.GetImagePath() + "shuffle_on.png", Window.Instance.WindowSize.Width / 2 - LayoutPadding - 2 * IconSize - 40, ControlViewMargin); - playAllIcon.Margin = new Extents(32, 0, 0, 0); - controlsView.Add(shuffleAndPlayAllIcon); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + private void OnShareClick(object sender, ClickedEventArgs e) + { + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Share, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); } - private CollectionView AddCollectionView() + private void OnAddToPlaylistClick(object sender, ClickedEventArgs e) { - CollectionView collectionView = new CollectionView() - { - Size2D = new Size2D(832, 108), - BackgroundImage = Resources.GetImagePath() + "list_view_bg.png", - ItemsLayouter = new LinearLayouter(), - ItemTemplate = new DataTemplate(() => - { - AlbumDetailLayout layout = new AlbumDetailLayout(); - layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle"); - layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName"); - layout.AdditionalLabel.SetBinding(TextLabel.TextProperty, "Duration"); - return layout; - }), - ScrollingDirection = ScrollableBase.Direction.Vertical, - HeightSpecification = LayoutParamPolicies.WrapContent, - SelectionMode = ItemSelectionMode.Single, - }; - rightView.Add(collectionView); - FlexLayout.SetFlexGrow(collectionView, 1); - FlexLayout.SetFlexShrink(collectionView, 1); - collectionView.ItemsSource = viewModel.ListViewModel; - collectionView.SelectionChanged += OnTrackSelection; - return collectionView; + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); } } } diff --git a/music-player/Views/AlbumView.cs b/music-player/Views/AlbumView.cs index 16bddc9..d4e590d 100755 --- a/music-player/Views/AlbumView.cs +++ b/music-player/Views/AlbumView.cs @@ -5,6 +5,7 @@ using Tizen.NUI; using Tizen.NUI.Binding; using MusicPlayer.Common; using MusicPlayer.Models; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { @@ -13,10 +14,10 @@ namespace MusicPlayer.Views private AlbumViewModel viewModel; private TextLabel albumCountLabel; - public AlbumView(AlbumViewModel viewModel) + public AlbumView(AlbumViewModel viewModel) : base() { + Name = "AlbumView"; this.viewModel = viewModel; - BindingContext = viewModel; collectionView.ItemsSource = viewModel.ListViewModel; collectionView.ItemTemplate = new DataTemplate(() => { @@ -26,34 +27,54 @@ namespace MusicPlayer.Views layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName"); return layout; }); - collectionView.ScrollingDirection = ScrollableBase.Direction.Vertical; - collectionView.WidthSpecification = LayoutParamPolicies.WrapContent; collectionView.SelectionMode = ItemSelectionMode.Single; collectionView.SelectionChanged += OnAlbumSelection; - albumCountLabel = new TextLabel() + albumCountLabel = new TextLabel("LabelText") { + ThemeChangeSensitive = true, PixelSize = 28, Text = "ALBUM COUNT", - TextColor = UIColors.HEX001447, + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, FontFamily = "BreezeSans", - IsCreateByXaml = true, + FontStyle = UIFontStyles.AllNormal }; titleView.Add(albumCountLabel); + albumCountLabel.BindingContext = viewModel; albumCountLabel.SetBinding(TextLabel.TextProperty, "AlbumCount"); RelativeLayout.SetLeftTarget(albumCountLabel, titleView); RelativeLayout.SetLeftRelativeOffset(albumCountLabel, 1.0f); RelativeLayout.SetRightRelativeOffset(albumCountLabel, 0.0f); RelativeLayout.SetFillHorizontal(albumCountLabel, true); + + Tizen.Log.Error(AppConstants.LogTag, "AlbumView Exit <=="); } - private void OnAlbumSelection(object sender, SelectionChangedEventArgs e) + + public override void ShowView() + { + Tizen.Log.Debug(AppConstants.LogTag, "AlbumView Show View"); + albumCountLabel.Show(); + base.ShowView(); + } + + public override void HideView() { - MusicAlbum currentAlbum= (MusicAlbum)collectionView.SelectedItem; - // viewModel.getDetailViewModel(currentAlbum) => need to replace direct function call on viewModel class with command interface - AlbumDetailView view = new AlbumDetailView(viewModel.getDetailViewModel(currentAlbum)); - Window.Instance.Add(view); + Tizen.Log.Debug(AppConstants.LogTag, "AlbumView Hide View"); + albumCountLabel.Hide(); + base.HideView(); } + + protected override void UpdateContentMoreButtonItems(Menu moreMenu) + { + var addToPlaylist = new MenuItem { Text = "Add to Playlist" }; + addToPlaylist.Clicked += OnAddToPlaylistClick; + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { addToPlaylist, delete }; + } + protected override void Dispose(DisposeTypes type) { if (Disposed) @@ -68,5 +89,29 @@ namespace MusicPlayer.Views } base.Dispose(type); } + + private void OnAlbumSelection(object sender, SelectionChangedEventArgs e) + { + Tizen.Log.Error(AppConstants.LogTag, "OnAlbumSelection Enter ==>"); + MusicAlbum currentAlbum = (MusicAlbum)collectionView.SelectedItem; + SubContentViewAddEventArgs albumDetailViewArgs = new SubContentViewAddEventArgs(SubContentViewType.AlbumDetails, currentAlbum.AlbumName, currentAlbum); + OnSubViewAdd(albumDetailViewArgs); + Tizen.Log.Error(AppConstants.LogTag, "OnAlbumSelection Exit <=="); + } + + private void OnDeleteClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Album, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + private void OnAddToPlaylistClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Album, viewModel.ListViewModel); + //OnOperationViewAdd(operationEventArgs); + } + } } diff --git a/music-player/Views/ArtistDetailItemLayout.cs b/music-player/Views/ArtistDetailItemLayout.cs index 95907ba..a63eeb1 100755 --- a/music-player/Views/ArtistDetailItemLayout.cs +++ b/music-player/Views/ArtistDetailItemLayout.cs @@ -53,15 +53,15 @@ namespace MusicPlayer.Views private TextLabel CreateTitleLabel() { - TextLabel titleLabel = new TextLabel() + TextLabel titleLabel = new TextLabel("ItemLabel") { WidthSpecification = 1272, HeightSpecification = 40, - TextColor = UIColors.HEX001447, PixelSize = 32, FontFamily = "BreezeSans", + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, - IsCreateByXaml = true, + FontStyle = UIFontStyles.NormalLight, Position2D = new Position2D(x, 34), }; base.Add(titleLabel); @@ -70,16 +70,15 @@ namespace MusicPlayer.Views private TextLabel CreateExtraLabel() { - TextLabel extraLabel = new TextLabel() + TextLabel extraLabel = new TextLabel("ItemLabel") { WidthSpecification = 360, HeightSpecification = 36, - TextColor = UIColors.HEX001447, PixelSize = 28, FontFamily = "BreezeSans", VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.End, - IsCreateByXaml = true, + FontStyle = UIFontStyles.AllNormal, Position2D = new Position2D((x + 1272 + LayoutPadding), 36) }; base.Add(extraLabel); diff --git a/music-player/Views/ArtistDetailView.cs b/music-player/Views/ArtistDetailView.cs index 91a143a..05a7eb6 100755 --- a/music-player/Views/ArtistDetailView.cs +++ b/music-player/Views/ArtistDetailView.cs @@ -1,160 +1,107 @@ using MusicPlayer.ViewModels; using Tizen.NUI.Components; using Tizen.NUI.BaseComponents; -using Tizen.NUI; using Tizen.NUI.Binding; using MusicPlayer.Common; -using MusicPlayer.Models; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { - class ArtistDetailView : View //BaseContentView + class ArtistDetailView : BaseSubContentView { - private const int LayoutPadding = 64; - private const int IconSize = 48; - - private BaseView baseView; - private View contentView; - private View topView; - private TextLabel totalCountLabel; - private Button playAllIcon; // TODO need to implement playall feature - private Button shuffleAndPlayAllIcon; // TODO need to implement playlist manager - private CollectionView collectionView; - private ArtistDetailViewModel viewModel; public ArtistDetailView(ArtistDetailViewModel viewModel) : base() { this.viewModel = viewModel; - BindingContext = viewModel; - BackgroundColor = UIColors.HEXEEEFF1; - WidthResizePolicy = ResizePolicyType.FillToParent; - HeightResizePolicy = ResizePolicyType.FillToParent; + countLabel.BindingContext = viewModel; + countLabel.SetBinding(TextLabel.TextProperty, "TotalCount"); + UpdateCollectionView(); + Add(listContainer); + } - //TODO need to change this part after implementation of Command Interface - baseView = new BaseView() - { - Title = viewModel.ArtistName, - BackButton = true, - MoreButton = true, - SearchButton = true, - BackgroundColor = UIColors.HEXEEEFF1, - }; - base.Add(baseView); - contentView = new View() - { - WidthSpecification = LayoutParamPolicies.MatchParent, - HeightSpecification = 876, - Layout = new FlexLayout() - { - Direction = FlexLayout.FlexDirection.Column, - Padding = new Extents(LayoutPadding, LayoutPadding, 0, 0), - }, - }; - baseView.SetContent = contentView; + public override void UpdateSubContentMoreButtonItems(Menu moreMenu) + { + var addtoPlaylist = new MenuItem { Text = "Add to playlist" }; + addtoPlaylist.Clicked += OnAddToPlaylistClick; + + var share = new MenuItem { Text = "Share" }; + share.Clicked += OnShareClick; - topView = CreateTopView(); - AddTitle(); - AddButtons(); - collectionView = AddCollectionView(); + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { addtoPlaylist, share, delete }; } - private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + public override void DeleteSubView() { - + base.DeleteSubView(); + viewModel.OnViewDeleted(); } - private Button CreateButton(string url, int x, int y) + // TODO this needs to be done in viewmodel + protected override void OnPlayAllClicked() { - ButtonStyle buttonStyle = new ButtonStyle() - { - Icon = new ImageViewStyle() - { - ResourceUrl = url, - }, - IsSelectable = false, - IsEnabled = true, - }; + Tizen.Log.Debug(AppConstants.LogTag, "ArtistDetailView OnPlayAllClicked"); + base.OnPlayAllClicked(); + viewModel.PlayAll(); + } - Button button = new Button(buttonStyle) - { - Size2D = new Size2D(IconSize, IconSize), - Position2D = new Position2D(x, y), - }; - return button; + protected override void OnPlayAllWithShuffleClicked() + { + Tizen.Log.Debug(AppConstants.LogTag, "ArtistDetailView OnPlayAllWithShuffleClicked"); + base.OnPlayAllWithShuffleClicked(); + viewModel.PlayAllWithShuffle(); } - private View CreateTopView() + private void OnTrackSelection(object sender, SelectionChangedEventArgs e) { - View topView = new View() - { - BackgroundColor = UIColors.HEXEEEFF1, - Size2D = new Size2D(Window.Instance.WindowSize.Width - 2 * LayoutPadding, 60), - }; - contentView.Add(topView); - return topView; + viewModel.PlayCurrent(collectionView.SelectedItem); } - private void AddTitle() + private void UpdateCollectionView() { - totalCountLabel = new TextLabel() + collectionView.ItemsLayouter = new LinearLayouter(); + collectionView.ItemTemplate = new DataTemplate(() => { - Size2D = new Size2D(1624, 36), - Position2D = new Position2D(0, 12), - PixelSize = 28, - Text = "TOTAL COUNT", - TextColor = UIColors.HEX001447, - VerticalAlignment = VerticalAlignment.Center, - FontFamily = "BreezeSans", - IsCreateByXaml = true, - }; - topView.Add(totalCountLabel); - totalCountLabel.SetBinding(TextLabel.TextProperty, "TotalCount"); + ArtistDetailItemLayout layout = new ArtistDetailItemLayout(); + layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle"); + layout.ExtraLabel.SetBinding(TextLabel.TextProperty, "Duration"); + return layout; + }); + collectionView.GroupHeaderTemplate = new DataTemplate(() => + { + ArtistDetailGroupLayout group = new ArtistDetailGroupLayout(); + group.Icon.SetBinding(ImageView.ResourceUrlProperty, "AlbumArtPath"); + group.TitleLabel.SetBinding(TextLabel.TextProperty, "AlbumName"); + return group; + }); + collectionView.IsGrouped = true; + collectionView.ScrollingDirection = ScrollableBase.Direction.Vertical; + collectionView.HeightSpecification = LayoutParamPolicies.WrapContent; + collectionView.SelectionMode = ItemSelectionMode.Single; + + collectionView.ItemsSource = viewModel.GroupListViewModel; + collectionView.SelectionChanged += OnTrackSelection; } - private void AddButtons() + private void OnDeleteClick(object sender, ClickedEventArgs e) { - playAllIcon = CreateButton(Resources.GetImagePath() + "playlist_active.png", Window.Instance.WindowSize.Width - 2 * LayoutPadding - IconSize, 6); - playAllIcon.Margin = new Extents(40, 0, 0, 0); - topView.Add(playAllIcon); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Track, viewModel.TrackListViewModel); + OnOperationViewAdd(operationEventArgs); + } - shuffleAndPlayAllIcon = CreateButton(Resources.GetImagePath() + "shuffle_on.png", Window.Instance.WindowSize.Width - 2 * LayoutPadding - 2 * IconSize - 40, 6); - playAllIcon.Margin = new Extents(32, 0, 0, 0); - topView.Add(shuffleAndPlayAllIcon); + private void OnShareClick(object sender, ClickedEventArgs e) + { + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Share, ContentViewType.Track, viewModel.TrackListViewModel); + OnOperationViewAdd(operationEventArgs); } - private CollectionView AddCollectionView() + private void OnAddToPlaylistClick(object sender, ClickedEventArgs e) { - CollectionView collectionView = new CollectionView() - { - Size2D = new Size2D(1792, 108), - BackgroundImage = Resources.GetImagePath() + "list_view_bg.png", - ItemsLayouter = new LinearLayouter(), - ItemTemplate = new DataTemplate(() => - { - ArtistDetailItemLayout layout = new ArtistDetailItemLayout(); - layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle"); - layout.ExtraLabel.SetBinding(TextLabel.TextProperty, "Duration"); - return layout; - }), - GroupHeaderTemplate = new DataTemplate(() => - { - ArtistDetailGroupLayout group = new ArtistDetailGroupLayout(); - group.Icon.SetBinding(ImageView.ResourceUrlProperty, "AlbumArtPath"); - group.TitleLabel.SetBinding(TextLabel.TextProperty, "AlbumName"); - return group; - }), - IsGrouped = true, - ScrollingDirection = ScrollableBase.Direction.Vertical, - HeightSpecification = LayoutParamPolicies.WrapContent, - SelectionMode = ItemSelectionMode.Single, - }; - contentView.Add(collectionView); - FlexLayout.SetFlexGrow(collectionView, 1); - FlexLayout.SetFlexShrink(collectionView, 1); - collectionView.ItemsSource = viewModel.GroupListViewModel; - collectionView.SelectionChanged += OnTrackSelection; - return collectionView; + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Track, viewModel.TrackListViewModel); + OnOperationViewAdd(operationEventArgs); } } } diff --git a/music-player/Views/ArtistView.cs b/music-player/Views/ArtistView.cs index f74e075..b6fea73 100755 --- a/music-player/Views/ArtistView.cs +++ b/music-player/Views/ArtistView.cs @@ -5,6 +5,7 @@ using Tizen.NUI; using Tizen.NUI.Binding; using MusicPlayer.Common; using MusicPlayer.Models; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { @@ -16,7 +17,6 @@ namespace MusicPlayer.Views public ArtistView(ArtistViewModel viewModel) { this.viewModel = viewModel; - BindingContext = viewModel; collectionView.ItemsSource = viewModel.ListViewModel; collectionView.ItemTemplate = new DataTemplate(() => { @@ -27,19 +27,22 @@ namespace MusicPlayer.Views return layout; }); collectionView.ScrollingDirection = ScrollableBase.Direction.Vertical; - collectionView.WidthSpecification = LayoutParamPolicies.WrapContent; + collectionView.WidthSpecification = LayoutParamPolicies.MatchParent; + collectionView.HeightSpecification = LayoutParamPolicies.WrapContent; collectionView.SelectionMode = ItemSelectionMode.Single; collectionView.SelectionChanged += OnArtistSelection; - artistCountLabel = new TextLabel() + artistCountLabel = new TextLabel("LabelText") { + ThemeChangeSensitive = true, PixelSize = 28, Text = "ARTIST COUNT", - TextColor = UIColors.HEX001447, + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, FontFamily = "BreezeSans", - IsCreateByXaml = true, + FontStyle = UIFontStyles.AllNormal, }; + artistCountLabel.BindingContext = viewModel; titleView.Add(artistCountLabel); artistCountLabel.SetBinding(TextLabel.TextProperty, "ArtistCount"); RelativeLayout.SetLeftTarget(artistCountLabel, titleView); @@ -47,12 +50,17 @@ namespace MusicPlayer.Views RelativeLayout.SetRightRelativeOffset(artistCountLabel, 0.0f); RelativeLayout.SetFillHorizontal(artistCountLabel, true); } - private void OnArtistSelection(object sender, SelectionChangedEventArgs e) + + protected override void UpdateContentMoreButtonItems(Menu moreMenu) { - Artist currentArtist = (Artist)collectionView.SelectedItem; - ArtistDetailView view = new ArtistDetailView(viewModel.getDetailViewModel(currentArtist)); - Window.Instance.Add(view); + var addToPlaylist = new MenuItem { Text = "Add to Playlist" }; + addToPlaylist.Clicked += OnAddToPlaylistClick; + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { addToPlaylist, delete }; } + protected override void Dispose(DisposeTypes type) { if (Disposed) @@ -67,5 +75,29 @@ namespace MusicPlayer.Views } base.Dispose(type); } + + private void OnArtistSelection(object sender, SelectionChangedEventArgs e) + { + Tizen.Log.Error(AppConstants.LogTag, "Artist Selection Started"); + Artist currentArtist = (Artist)collectionView.SelectedItem; + SubContentViewAddEventArgs artistDetailViewArgs = new SubContentViewAddEventArgs(SubContentViewType.ArtistDetails, currentArtist.ArtistName, currentArtist); + OnSubViewAdd(artistDetailViewArgs); + Tizen.Log.Error(AppConstants.LogTag, "Artist Selection Ended"); + } + + private void OnDeleteClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Artist, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + private void OnAddToPlaylistClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Artist, viewModel.ListViewModel); + //OnOperationViewAdd(operationEventArgs); + } + } } \ No newline at end of file diff --git a/music-player/Views/BaseContentView.cs b/music-player/Views/BaseContentView.cs index 5aa5c44..1af6067 100755 --- a/music-player/Views/BaseContentView.cs +++ b/music-player/Views/BaseContentView.cs @@ -1,24 +1,45 @@ -using MusicPlayer.Common; +using System; using Tizen.NUI; using Tizen.NUI.BaseComponents; using Tizen.NUI.Components; +using MusicPlayer.Common; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { - class BaseContentView : View + class BaseContentView : View, IViewStatus, IMoreButtonItems { + protected BaseSubContentView subcontentView; protected View titleView; protected CollectionView collectionView; + protected View subContentViewContainer; + protected View contentViewContainer; + + protected Menu moreMenu = null; + + public event EventHandler SubContentViewAdded; + + public event EventHandler OperationViewAdded; + public BaseContentView() : base() { ThemeChangeSensitive = true; WidthResizePolicy = ResizePolicyType.FillToParent; HeightResizePolicy = ResizePolicyType.FillToParent; - Layout = new FlexLayout() + contentViewContainer = new View() { - Direction = FlexLayout.FlexDirection.Column, - Padding = new Extents(64, 64, 0, 0), + WidthResizePolicy = ResizePolicyType.FillToParent, + HeightResizePolicy = ResizePolicyType.FillToParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + WidthSpecification = LayoutParamPolicies.MatchParent, + Layout = new FlexLayout() + { + Direction = FlexLayout.FlexDirection.Column, + Padding = new Extents(64, 64, 0, 0), + }, }; + base.Add(contentViewContainer); + titleView = new View() { ThemeChangeSensitive = true, @@ -26,10 +47,10 @@ namespace MusicPlayer.Views HeightSpecification = 60, Layout = new RelativeLayout() { - Padding = new Extents(0, 0, 13, 13), + Padding = new Extents(0, 0, 6, 6), }, }; - base.Add(titleView); + contentViewContainer.Add(titleView); FlexLayout.SetFlexGrow(titleView, 0); FlexLayout.SetFlexShrink(titleView, 0); @@ -45,21 +66,103 @@ namespace MusicPlayer.Views HeightSpecification = LayoutParamPolicies.WrapContent, SelectionMode = ItemSelectionMode.Single, }; - base.Add(collectionView); + contentViewContainer.Add(collectionView); FlexLayout.SetFlexGrow(collectionView, 1); FlexLayout.SetFlexShrink(collectionView, 1); + + subContentViewContainer = new View() + { + WidthResizePolicy = ResizePolicyType.FillToParent, + HeightResizePolicy = ResizePolicyType.FillToParent, + }; + base.Add(subContentViewContainer); + subContentViewContainer.Hide(); + subcontentView = null; } - private string GetBackgroundImagePath(string platformThemeId) + public void AddSubContentView(BaseSubContentView baseSubContentView) { - if(platformThemeId.Equals(AppConstants.DarkPlatformThemeId)) + if (baseSubContentView == null) { - return Resources.GetImagePath() + "dark/list_view_bg.png"; + Tizen.Log.Error(AppConstants.LogTag, "SubContentView object is null"); + return; } - else + if(subcontentView != null) { - return Resources.GetImagePath() + "light/list_view_bg.png"; + Tizen.Log.Error(AppConstants.LogTag, "subcontent view already added , remove it first"); + return; + } + subContentViewContainer.Show(); + subContentViewContainer.Add(baseSubContentView); + subcontentView = baseSubContentView; + subcontentView.SubContentOperationViewAdd += OnSubContentOperationViewAdd; + } + + public void RemoveSubContentView() + { + if (subcontentView == null) + { + Tizen.Log.Error(AppConstants.LogTag, "SubContentView object is null"); + return; + } + subContentViewContainer.Remove(subcontentView); + subContentViewContainer.Hide(); + subcontentView.SubContentOperationViewAdd -= OnSubContentOperationViewAdd; + subcontentView.DeleteSubView(); + subcontentView = null; + } + + public virtual void ShowView() + { + titleView.Show(); + collectionView.Show(); + contentViewContainer.Show(); + Show(); + } + + public virtual void HideView() + { + titleView.Hide(); + collectionView.Hide(); + contentViewContainer.Hide(); + Hide(); + } + + public void UpdateButtonMoreItems(Menu moreMenu) + { + this.moreMenu = moreMenu; + if(subcontentView != null) + { + subcontentView.UpdateSubContentMoreButtonItems(moreMenu); + return; } + UpdateContentMoreButtonItems(moreMenu); + } + + protected virtual void UpdateContentMoreButtonItems(Menu moreMenu) + { + + } + + protected void DismissMoreMenu() + { + if (moreMenu == null) + { + Tizen.Log.Error(AppConstants.LogTag, "Moremenu object is null"); + return; + } + moreMenu.Dismiss(); + moreMenu = null; + } + + protected void OnSubViewAdd(SubContentViewAddEventArgs args) + { + SubContentViewAdded?.Invoke(this, args); + } + + protected void OnOperationViewAdd(OperationViewAddEventArgs args) + { + OperationViewAdded?.Invoke(this, args); } protected override void OnThemeChanged(object sender, ThemeChangedEventArgs e) @@ -75,15 +178,45 @@ namespace MusicPlayer.Views { if (type == DisposeTypes.Explicit) { - base.Remove(titleView); + base.Remove(contentViewContainer); + contentViewContainer.Remove(titleView); titleView.Dispose(); titleView = null; - base.Remove(collectionView); + contentViewContainer.Remove(collectionView); collectionView.Dispose(); collectionView = null; + + contentViewContainer.Dispose(); + contentViewContainer = null; + + base.Remove(subContentViewContainer); + subContentViewContainer.Dispose(); + subContentViewContainer = null; + + subcontentView = null; + + moreMenu?.Dismiss(); + moreMenu = null; } base.Dispose(type); } + + private string GetBackgroundImagePath(string platformThemeId) + { + if (platformThemeId.Equals(AppConstants.DarkPlatformThemeId)) + { + return Resources.GetImagePath() + "dark/list_view_bg.png"; + } + else + { + return Resources.GetImagePath() + "light/list_view_bg.png"; + } + } + private void OnSubContentOperationViewAdd(object sender, OperationViewAddEventArgs e) + { + DismissMoreMenu(); + OnOperationViewAdd(e); + } } } diff --git a/music-player/Views/BaseSubContentView.cs b/music-player/Views/BaseSubContentView.cs new file mode 100755 index 0000000..dbbb075 --- /dev/null +++ b/music-player/Views/BaseSubContentView.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using Tizen.NUI; +using MusicPlayer.Views.Utils; +using MusicPlayer.Common; + +namespace MusicPlayer.Views +{ + class BaseSubContentView : View, ISubViewStatus + { + protected View listContainer; + protected View topView; + protected TextLabel countLabel; + protected Button playAll; + protected Button playAllWithShuffle; + protected CollectionView collectionView; + + public event EventHandler SubContentOperationViewAdd; + + public BaseSubContentView():base() + { + Tizen.Log.Error(AppConstants.LogTag, "BaseSubContentView Enter ==>"); + WidthResizePolicy = ResizePolicyType.FillToParent; + HeightResizePolicy = ResizePolicyType.FillToParent; + StyleName = "AppBackground"; + + listContainer = new View() + { + Layout = new LinearLayout() + { + LinearOrientation = LinearLayout.Orientation.Vertical, + LinearAlignment = LinearLayout.Alignment.Top, + Padding = new Extents(64, 64, 0, 0), + }, + BackgroundColor = Color.Transparent, + WidthResizePolicy = ResizePolicyType.FillToParent, + HeightResizePolicy = ResizePolicyType.FillToParent, + //HeightSpecification = LayoutParamPolicies.MatchParent, + }; + + topView = new View() + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = 60, + Layout = new RelativeLayout() + { + Padding = new Extents(0, 0, 6, 6), + }, + }; + listContainer.Add(topView); + + countLabel = new TextLabel("LabelText") + { + ThemeChangeSensitive = true, + PixelSize = 28, + Text = "TRACK COUNT", + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Center, + FontFamily = "BreezeSans", + FontStyle = UIFontStyles.AllNormal, + }; + topView.Add(countLabel); + RelativeLayout.SetLeftTarget(countLabel, topView); + RelativeLayout.SetLeftRelativeOffset(countLabel, 0.0f); + RelativeLayout.SetRightRelativeOffset(countLabel, 0.0f); + RelativeLayout.SetFillHorizontal(countLabel, true); + + playAll = new Button("PlayAll") + { + ThemeChangeSensitive = true, + }; + topView.Add(playAll); + playAll.Clicked += (object sender, ClickedEventArgs e) => + { + OnPlayAllClicked(); + }; + RelativeLayout.SetLeftRelativeOffset(playAll, 1.0f); + RelativeLayout.SetRightRelativeOffset(playAll, 1.0f); + RelativeLayout.SetHorizontalAlignment(playAll, RelativeLayout.Alignment.End); + + playAllWithShuffle = new Button("ShuffleButton") + { + ThemeChangeSensitive = true, + Margin = new Extents(32, 40, 0, 0), + }; + topView.Add(playAllWithShuffle); + playAllWithShuffle.Clicked += (object sender, ClickedEventArgs e) => + { + OnPlayAllWithShuffleClicked(); + }; + RelativeLayout.SetRightTarget(playAllWithShuffle, playAll); + RelativeLayout.SetRightRelativeOffset(playAllWithShuffle, 0.0f); + RelativeLayout.SetHorizontalAlignment(playAllWithShuffle, RelativeLayout.Alignment.End); + + collectionView = new CollectionView() + { + ThemeChangeSensitive = true, + //Size2D = new Size2D(1792, 108), + Margin = new Extents(0, 0, 0, 2), + BackgroundImage = GetBackgroundImagePath(ThemeManager.PlatformThemeId), + ItemsLayouter = new LinearLayouter(), + ScrollingDirection = ScrollableBase.Direction.Vertical, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + SelectionMode = ItemSelectionMode.Single, + }; + listContainer.Add(collectionView); + Tizen.Log.Error(AppConstants.LogTag, "BaseSubContentView Exit <=="); + } + + public virtual void UpdateSubContentMoreButtonItems(Menu moreMenu) + { + + } + + public virtual void DeleteSubView() + { + Dispose(DisposeTypes.Explicit); + } + + protected void OnOperationViewAdd(OperationViewAddEventArgs eventArgs) + { + SubContentOperationViewAdd?.Invoke(this, eventArgs); + } + + protected virtual void OnPlayAllClicked() + { + + } + + protected virtual void OnPlayAllWithShuffleClicked() + { + + } + + private string GetBackgroundImagePath(string platformThemeId) + { + if (platformThemeId.Equals(AppConstants.DarkPlatformThemeId)) + { + return Resources.GetImagePath() + "dark/list_view_bg.png"; + } + else + { + return Resources.GetImagePath() + "light/list_view_bg.png"; + } + } + + protected override void Dispose(DisposeTypes type) + { + if (type == DisposeTypes.Explicit) + { + topView.Remove(countLabel); + topView.Remove(playAllWithShuffle); + topView.Remove(playAll); + + listContainer.Remove(topView); + listContainer.Remove(collectionView); + + countLabel.Dispose(); + countLabel = null; + playAllWithShuffle.Dispose(); + playAllWithShuffle = null; + playAll.Dispose(); + playAll = null; + topView.Dispose(); + topView = null; + collectionView.Dispose(); + collectionView = null; + listContainer.Dispose(); + listContainer = null; + } + base.Dispose(type); + } + } +} diff --git a/music-player/Views/BaseView.cs b/music-player/Views/BaseView.cs index 1cddb26..e8a6bcf 100755 --- a/music-player/Views/BaseView.cs +++ b/music-player/Views/BaseView.cs @@ -17,6 +17,7 @@ namespace MusicPlayer.Views private Button moreButton; private Button searchButton; private Tab tabs; + private BaseContentView baseContentView; // TODO these name strings are temporary...once the po files are added // need to use Translatable names. @@ -51,16 +52,16 @@ namespace MusicPlayer.Views base.Add(topView); FlexLayout.SetFlexGrow(topView, 0); FlexLayout.SetFlexShrink(topView, 0); - titleLabel = new TextLabel() + titleLabel = new TextLabel("PageLabel") { ThemeChangeSensitive = true, Text = "Music", PixelSize = 40, FontFamily = "BreezeSans", - TextColor = UIColors.HEX000209, HorizontalAlignment = HorizontalAlignment.Begin, - Margin = new Extents(0, 0, 6, 6), + VerticalAlignment = VerticalAlignment.Center, Ellipsis = true, + FontStyle = UIFontStyles.NormalLight, }; topView.Add(titleLabel); titleLabel.SetBinding(TextLabel.TextProperty, "Title"); @@ -127,24 +128,19 @@ namespace MusicPlayer.Views { if (value) { - ButtonStyle buttonStyle = new ButtonStyle() + if (backButton == null) { - Icon = new ImageViewStyle() + backButton = new Button("BackButton") { - ResourceUrl = Resources.GetImagePath() + "back_button.png", - }, - IsSelectable = false, - IsEnabled = true, - }; + ThemeChangeSensitive = true, + Size2D = new Size2D(48, 48), + Margin = new Extents(0, 24, 6, 6), + }; - backButton = new Button(buttonStyle) - { - ThemeChangeSensitive = true, - Size2D = new Size2D(48, 48), - Margin = new Extents(0, 24, 6, 6), - }; + backButton.Clicked += OnBackButtonClicked; + } topView.Add(backButton); - + backButton.Show(); RelativeLayout.SetLeftRelativeOffset(backButton, 0.0f); RelativeLayout.SetRightRelativeOffset(backButton, 0.0f); RelativeLayout.SetHorizontalAlignment(backButton, RelativeLayout.Alignment.Start); @@ -152,6 +148,17 @@ namespace MusicPlayer.Views RelativeLayout.SetLeftTarget(titleLabel, backButton); RelativeLayout.SetLeftRelativeOffset(titleLabel, 1.0f); } + else + { + if(backButton) + { + topView.Remove(backButton); + backButton.Hide(); + RelativeLayout.SetLeftTarget(titleLabel, topView); + RelativeLayout.SetLeftRelativeOffset(titleLabel, 0.0f); + } + } + Tizen.Log.Error(AppConstants.LogTag, "BackButton Exit <=="); } } @@ -159,31 +166,19 @@ namespace MusicPlayer.Views { set { - if (value) + moreButton = new Button("MoreButton") { - ButtonStyle buttonStyle = new ButtonStyle() - { - Icon = new ImageViewStyle() - { - ResourceUrl = Resources.GetImagePath() + "more.png", - }, - IsSelectable = false, - IsEnabled = true, - }; - moreButton = new Button(buttonStyle) - { - ThemeChangeSensitive = true, - Size2D = new Size2D(48, 48), - Margin = new Extents(32, 0, 6, 6), - }; - topView.Add(moreButton); - RelativeLayout.SetLeftRelativeOffset(moreButton, 1.0f); - RelativeLayout.SetRightRelativeOffset(moreButton, 1.0f); - RelativeLayout.SetHorizontalAlignment(moreButton, RelativeLayout.Alignment.End); + ThemeChangeSensitive = true, + Margin = new Extents(32, 0, 6, 6), + }; + topView.Add(moreButton); + RelativeLayout.SetLeftRelativeOffset(moreButton, 1.0f); + RelativeLayout.SetRightRelativeOffset(moreButton, 1.0f); + RelativeLayout.SetHorizontalAlignment(moreButton, RelativeLayout.Alignment.End); - RelativeLayout.SetRightTarget(titleLabel, moreButton); - RelativeLayout.SetRightRelativeOffset(titleLabel, 0.0f); - } + RelativeLayout.SetRightTarget(titleLabel, moreButton); + RelativeLayout.SetRightRelativeOffset(titleLabel, 0.0f); + moreButton.Clicked += OnMoreButtonClicked; } } @@ -222,11 +217,48 @@ namespace MusicPlayer.Views } } - public View SetContent + public Button GetSearchButton() { - set + return searchButton; + } + + public void SetContent(BaseContentView view) + { + if(view == null) { - contentView.Add(value); + Tizen.Log.Error(AppConstants.LogTag, "BaseContentView is null, provide correct object"); + return; + } + + if(baseContentView != null) + { + Tizen.Log.Error(AppConstants.LogTag, "ContentView is already added, remove it first"); + return; + } + BackButton = false; + Title = "Music"; + contentView.Add(view); + baseContentView = view; + } + + public void RemoveContent(BaseContentView view) + { + if(view == null) + { + Tizen.Log.Error(AppConstants.LogTag, "BaseContentView is null, provide correct object"); + return; + } + contentView.Remove(view); + baseContentView = null; + } + + public void AddSubViewContent(string titleText, BaseSubContentView subContentView) + { + if(baseContentView != null) + { + baseContentView.AddSubContentView(subContentView); + BackButton = true; + Title = titleText; } } @@ -264,5 +296,45 @@ namespace MusicPlayer.Views base.Dispose(type); } + + private void RemoveSubViewContent() + { + if (baseContentView != null) + { + BackButton = false; + Title = "Music"; + baseContentView.RemoveSubContentView(); + } + } + + private void OnBackButtonClicked(object sender, ClickedEventArgs e) + { + RemoveSubViewContent(); + } + + private Menu CreateMenu() + { + Menu moreMenu = new Menu() + { + Anchor = moreButton, + HorizontalPositionToAnchor = Menu.RelativePosition.End, + VerticalPositionToAnchor = Menu.RelativePosition.End, + }; + return moreMenu; + } + + private void OnMoreButtonClicked(object sender, ClickedEventArgs e) + { + Menu moreMenu = CreateMenu(); + if(baseContentView != null) + { + baseContentView.UpdateButtonMoreItems(moreMenu); + moreMenu.Post(); + } + else + { + moreMenu.Dismiss(); + } + } } } \ No newline at end of file diff --git a/music-player/Views/ListItemLayout.cs b/music-player/Views/ListItemLayout.cs index 071523f..cbe9ecf 100755 --- a/music-player/Views/ListItemLayout.cs +++ b/music-player/Views/ListItemLayout.cs @@ -61,14 +61,9 @@ namespace MusicPlayer.Views PixelSize = 32, FontFamily = "BreezeSans", VerticalAlignment = VerticalAlignment.Center, - IsCreateByXaml = true, Position2D = new Position2D((x + IconSize + LayoutPadding), LayoutMargin), }; - // ToDo need to make this a readonly const - PropertyMap titleFontStyle = new PropertyMap(); - titleFontStyle.Add("width", new PropertyValue("normal")); - titleFontStyle.Add("weight", new PropertyValue("light")); - titleLabel.FontStyle = titleFontStyle; + titleLabel.FontStyle = UIFontStyles.NormalLight; base.Add(titleLabel); subtitleLabel = new TextLabel("ItemLabel") @@ -79,15 +74,9 @@ namespace MusicPlayer.Views PixelSize = 28, FontFamily = "BreezeSans", VerticalAlignment = VerticalAlignment.Center, - IsCreateByXaml = true, Position2D = new Position2D((x + IconSize + LayoutPadding), LayoutMargin + 40) }; - // ToDo need to make this a readonly const - PropertyMap subtitleFontStyle = new PropertyMap(); - subtitleFontStyle.Add("width", new PropertyValue("normal")); - subtitleFontStyle.Add("weight", new PropertyValue("normal")); - subtitleFontStyle.Add("slant", new PropertyValue("normal")); - subtitleLabel.FontStyle = subtitleFontStyle; + subtitleLabel.FontStyle = UIFontStyles.AllNormal; base.Add(subtitleLabel); IsCreateByXaml = true; } diff --git a/music-player/Views/PlayerView.cs b/music-player/Views/PlayerView.cs index b0a5883..6531bab 100755 --- a/music-player/Views/PlayerView.cs +++ b/music-player/Views/PlayerView.cs @@ -1,4 +1,5 @@ -using Tizen.NUI; +using System; +using Tizen.NUI; using Tizen.Multimedia; using Tizen.NUI.Components; using Tizen.NUI.BaseComponents; @@ -10,7 +11,7 @@ using System.Collections.Generic; namespace MusicPlayer.Views { - class PlayerView : View + class PlayerView : View, IViewStatus { private enum PlayerViewState { @@ -86,6 +87,16 @@ namespace MusicPlayer.Views AddLyricsView(); } + public void ShowView() + { + Show(); + } + + public void HideView() + { + Hide(); + } + private void AddPlayerBackground() { playerBackgroundView = new View(); @@ -158,6 +169,11 @@ namespace MusicPlayer.Views backButton.ThemeChangeSensitive = true; backButton.Position2D = new Position2D(LayoutPadding, TopBarButtonsY); leftView.Add(backButton); + backButton.Clicked += (object sender, ClickedEventArgs clickedEventArgs) => + { + Unparent(); + HideView(); + }; moreButton = new Button("MoreButton"); moreButton.ThemeChangeSensitive = true; @@ -717,8 +733,13 @@ namespace MusicPlayer.Views } }, }; - favouriteButton.CusotmState = Favourite.Off.ToString(); + favouriteButton.BindingContext = viewModel; + favouriteButton.SetBinding(MultiStateButton.CustomStateProperty, "FavouriteButtonState"); actionButtonView.Add(favouriteButton); + favouriteButton.Clicked += (object sender, ClickedEventArgs e) => + { + viewModel.FavouriteStatusChanged(); + }; } private void AddThumbnail() diff --git a/music-player/Views/PlayingListView.cs b/music-player/Views/PlayingListView.cs index cab9516..f3f4ef3 100755 --- a/music-player/Views/PlayingListView.cs +++ b/music-player/Views/PlayingListView.cs @@ -38,6 +38,12 @@ namespace MusicPlayer.Views }; base.Add(collectionView); viewModel.ItemsSourceChanged += ItemSourceChanged; + collectionView.SelectionChanged += OnItemSelected; + } + + private void OnItemSelected(object sender, SelectionChangedEventArgs e) + { + viewModel.OnItemSelected(collectionView.SelectedItem); } private void ItemSourceChanged(object sender, EventArgs e) diff --git a/music-player/Views/PlaylistDetailView.cs b/music-player/Views/PlaylistDetailView.cs new file mode 100755 index 0000000..28cc564 --- /dev/null +++ b/music-player/Views/PlaylistDetailView.cs @@ -0,0 +1,82 @@ +using System; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Binding; +using Tizen.NUI.Components; +using MusicPlayer.Common; +using MusicPlayer.ViewModels; +using MusicPlayer.Views.Utils; + +namespace MusicPlayer.Views +{ + class PlaylistDetailView : BaseSubContentView + { + private PlaylistDetailViewModel viewModel; + + public PlaylistDetailView(PlaylistDetailViewModel playlistViewModel) + { + viewModel = playlistViewModel; + collectionView.ItemsSource = viewModel.ListViewModel; + collectionView.ItemTemplate = new DataTemplate(() => + { + ListItemLayout layout = new ListItemLayout(); + layout.Icon.SetBinding(ImageView.ResourceUrlProperty, "ThumbnailPath"); + layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle"); + layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName"); + return layout; + }); + collectionView.SelectionChanged += OnTrackSelection; + countLabel.BindingContext = viewModel; + countLabel.SetBinding(TextLabel.TextProperty, "PlaylistTrackCount"); + Add(listContainer); + } + + public override void DeleteSubView() + { + base.DeleteSubView(); + viewModel.OnViewDeleted(); + } + + public override void UpdateSubContentMoreButtonItems(Menu moreMenu) + { + var share = new MenuItem { Text = "Share" }; + share.Clicked += OnShareClick; + + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { share, delete }; + } + + protected override void OnPlayAllClicked() + { + Tizen.Log.Debug(AppConstants.LogTag, "PlaylistDetailView OnPlayAllClicked"); + base.OnPlayAllClicked(); + viewModel.PlayAll(); + } + + protected override void OnPlayAllWithShuffleClicked() + { + Tizen.Log.Debug(AppConstants.LogTag, "PlaylistDetailView OnPlayAllWithShuffleClicked"); + base.OnPlayAllWithShuffleClicked(); + viewModel.PlayAllWithShuffle(); + } + + private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + { + viewModel.PlayCurrent(collectionView.SelectedItem); + } + + private void OnDeleteClick(object sender, ClickedEventArgs e) + { + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + private void OnShareClick(object sender, ClickedEventArgs e) + { + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Share, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + } +} diff --git a/music-player/Views/PlaylistView.cs b/music-player/Views/PlaylistView.cs new file mode 100755 index 0000000..c274d19 --- /dev/null +++ b/music-player/Views/PlaylistView.cs @@ -0,0 +1,147 @@ +using Tizen.NUI; +using Tizen.NUI.Binding; +using Tizen.NUI.Components; +using Tizen.NUI.BaseComponents; +using MusicPlayer.Models; +using MusicPlayer.ViewModels; +using MusicPlayer.Common; +using MusicPlayer.Views.Utils; +using System.Collections.Generic; + +namespace MusicPlayer.Views +{ + class PlaylistView : BaseContentView + { + private TextLabel playlistCountLabel; + private Button playlistCreateButton; + private PlaylistViewModel viewModel; + + public PlaylistView(PlaylistViewModel viewModel) + { + Name = "PlaylistView"; + this.viewModel = viewModel; + collectionView.ItemsSource = viewModel.ListViewModel; + collectionView.ItemTemplate = new DataTemplate(() => + { + ListItemLayout layout = new ListItemLayout(); + layout.Icon.SetBinding(ImageView.ResourceUrlProperty, "PlaylistThumbnailPath"); + layout.TitleLabel.SetBinding(TextLabel.TextProperty, "PlaylistName"); + layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "PlaylistTrackCount"); + return layout; + }); + collectionView.SelectionChanged += OnPlaylistSelectionChange; + + playlistCountLabel = new TextLabel("LabelText") + { + ThemeChangeSensitive = true, + PixelSize = 28, + Text = "Playlist COUNT", + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Center, + FontFamily = "BreezeSans", + FontStyle = UIFontStyles.AllNormal, + }; + playlistCountLabel.BindingContext = viewModel; + titleView.Add(playlistCountLabel); + playlistCountLabel.SetBinding(TextLabel.TextProperty, "PlaylistCount"); + RelativeLayout.SetLeftTarget(playlistCountLabel, titleView); + RelativeLayout.SetLeftRelativeOffset(playlistCountLabel, 0.0f); + RelativeLayout.SetFillHorizontal(playlistCountLabel, true); + RelativeLayout.SetHorizontalAlignment(playlistCountLabel, RelativeLayout.Alignment.Start); + + playlistCreateButton = new Button("PlaylistAdd") + { + ThemeChangeSensitive = true, + Margin = new Extents(40, 0, 0, 0), + }; + titleView.Add(playlistCreateButton); + RelativeLayout.SetLeftRelativeOffset(playlistCreateButton, 1.0f); + RelativeLayout.SetRightRelativeOffset(playlistCreateButton, 1.0f); + RelativeLayout.SetHorizontalAlignment(playlistCreateButton, RelativeLayout.Alignment.End); + + RelativeLayout.SetRightTarget(playlistCountLabel, playlistCreateButton); + RelativeLayout.SetRightRelativeOffset(playlistCountLabel, 0.0f); + + playlistCreateButton.Clicked += OnPlaylistCreate; + } + + protected override void UpdateContentMoreButtonItems(Menu moreMenu) + { + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + moreMenu.Items = new MenuItem[] { delete }; + } + + private void OnPlaylistCreate(object sender, ClickedEventArgs e) + { + CreatePlaylistPopup(); + } + + private void OnPlaylistSelectionChange(object sender, SelectionChangedEventArgs e) + { + PlaylistModel playlistModel = (PlaylistModel)collectionView.SelectedItem; + SubContentViewAddEventArgs playlistDetailViewArgs = new SubContentViewAddEventArgs(SubContentViewType.PlaylistDetails, playlistModel.PlaylistName, playlistModel.PlaylistId); + OnSubViewAdd(playlistDetailViewArgs); + } + + private void CreatePlaylistPopup() + { + TextLabel titleLabel = new TextLabel("LabelText") + { + ThemeChangeSensitive = true, + PixelSize = 40, + FontFamily = "BreezeSans", + FontStyle = UIFontStyles.AllNormal, + Text = "Create playlist", + }; + + View contentArea = new View() + { + SizeHeight = 144, + WidthResizePolicy = ResizePolicyType.FillToParent, + BackgroundColor = Color.Transparent, + }; + + TextLabel contentLabel = new TextLabel("LabelText") + { + ThemeChangeSensitive = true, + PixelSize = 32, + FontFamily = "BreezeSans", + FontStyle = UIFontStyles.NormalLight, + Text = "Allow AMAN to mirror on this device", + WidthResizePolicy = ResizePolicyType.FillToParent, + HorizontalAlignment = HorizontalAlignment.Begin, + PositionY = 40, + }; + contentArea.Add(contentLabel); + + Button cancelbutton = new Button("CancelButton") + { + ThemeChangeSensitive = true, + }; + cancelbutton.TextLabel.FontStyle = UIFontStyles.AllNormal; + //cancelbutton.Clicked += OnCanelClicked; + + Button allowButton = new Button() + { + Text = "Allow", + }; + //allowButton.Clicked += OnAllowClicked; + + AlertDialog alertDialog = new AlertDialog() + { + TitleContent = titleLabel, + Content = contentArea, + Actions = new List { cancelbutton, allowButton }, + }; + Window.Instance.Add(alertDialog); + } + + private void OnDeleteClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Playlist, viewModel.UserPlaylistViewModel); + OnOperationViewAdd(operationEventArgs); + } + } +} diff --git a/music-player/Views/TrackView.cs b/music-player/Views/TrackView.cs index daa7df1..120bdea 100755 --- a/music-player/Views/TrackView.cs +++ b/music-player/Views/TrackView.cs @@ -1,9 +1,10 @@ -using MusicPlayer.ViewModels; -using Tizen.NUI.Components; -using Tizen.NUI.BaseComponents; -using Tizen.NUI; +using Tizen.NUI; using Tizen.NUI.Binding; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; using MusicPlayer.Common; +using MusicPlayer.ViewModels; +using MusicPlayer.Views.Utils; namespace MusicPlayer.Views { @@ -11,10 +12,12 @@ namespace MusicPlayer.Views { private TrackViewModel viewModel; private TextLabel trackCountLabel; - private Button playAllIcon; // TODO need to implement playall feature - private Button addToPlaylistIcon; // TODO need to implement playlist manager - public TrackView(TrackViewModel viewModel) + private Button playAllWithShuffle; + private Button playAll; + + public TrackView(TrackViewModel viewModel) : base() { + Name = "TrackView"; this.viewModel = viewModel; collectionView.ItemsSource = viewModel.ListViewModel; collectionView.ItemTemplate = new DataTemplate(() => @@ -26,7 +29,7 @@ namespace MusicPlayer.Views return layout; }); collectionView.ScrollingDirection = ScrollableBase.Direction.Vertical; - collectionView.WidthSpecification = LayoutParamPolicies.WrapContent; + //collectionView.WidthSpecification = LayoutParamPolicies.WrapContent; collectionView.SelectionMode = ItemSelectionMode.Single; collectionView.SelectionChanged += OnTrackSelection; @@ -35,46 +38,77 @@ namespace MusicPlayer.Views ThemeChangeSensitive = true, PixelSize = 28, Text = "TRACK COUNT", + HorizontalAlignment = HorizontalAlignment.Begin, VerticalAlignment = VerticalAlignment.Center, FontFamily = "BreezeSans", + FontStyle = UIFontStyles.AllNormal, }; trackCountLabel.BindingContext = viewModel; titleView.Add(trackCountLabel); trackCountLabel.SetBinding(TextLabel.TextProperty, "TrackCount"); RelativeLayout.SetLeftTarget(trackCountLabel, titleView); - RelativeLayout.SetLeftRelativeOffset(trackCountLabel, 1.0f); - RelativeLayout.SetRightRelativeOffset(trackCountLabel, 0.0f); + RelativeLayout.SetLeftRelativeOffset(trackCountLabel, 0.0f); RelativeLayout.SetFillHorizontal(trackCountLabel, true); - playAllIcon = new Button("PlayAll") + playAll = new Button("PlayAll") { ThemeChangeSensitive = true, }; - titleView.Add(playAllIcon); - RelativeLayout.SetLeftRelativeOffset(playAllIcon, 1.0f); - RelativeLayout.SetRightRelativeOffset(playAllIcon, 1.0f); - RelativeLayout.SetHorizontalAlignment(playAllIcon, RelativeLayout.Alignment.End); + titleView.Add(playAll); + playAll.Clicked += (object sender, ClickedEventArgs e) => + { + viewModel.PlayAll(); + }; + RelativeLayout.SetLeftRelativeOffset(playAll, 1.0f); + RelativeLayout.SetRightRelativeOffset(playAll, 1.0f); + RelativeLayout.SetHorizontalAlignment(playAll, RelativeLayout.Alignment.End); - addToPlaylistIcon = new Button("PlaylistAdd") + playAllWithShuffle = new Button("ShuffleButton") { ThemeChangeSensitive = true, Margin = new Extents(32, 40, 0, 0), }; - titleView.Add(addToPlaylistIcon); - RelativeLayout.SetRightTarget(addToPlaylistIcon, playAllIcon); - RelativeLayout.SetRightRelativeOffset(addToPlaylistIcon, 0.0f); - RelativeLayout.SetHorizontalAlignment(addToPlaylistIcon, RelativeLayout.Alignment.End); + titleView.Add(playAllWithShuffle); + playAllWithShuffle.Clicked += (object sender, ClickedEventArgs e) => + { + viewModel.PlayAllWithShuffle(); + }; + RelativeLayout.SetRightTarget(playAllWithShuffle, playAll); + RelativeLayout.SetRightRelativeOffset(playAllWithShuffle, 0.0f); + RelativeLayout.SetHorizontalAlignment(playAllWithShuffle, RelativeLayout.Alignment.End); + + RelativeLayout.SetRightTarget(trackCountLabel, playAllWithShuffle); + RelativeLayout.SetRightRelativeOffset(trackCountLabel, 0.0f); } - private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + public override void ShowView() { - //TODO + trackCountLabel.Show(); + playAllWithShuffle.Show(); + playAll.Show(); + base.ShowView(); } - protected override void OnThemeChanged(object sender, ThemeChangedEventArgs e) + public override void HideView() { - base.OnThemeChanged(sender, e); + trackCountLabel.Hide(); + playAllWithShuffle.Hide(); + playAll.Hide(); + base.HideView(); } + + protected override void UpdateContentMoreButtonItems(Menu moreMenu) + { + var addToPlaylist = new MenuItem { Text = "Add to Playlist" }; + addToPlaylist.Clicked += OnAddToPlaylistClick; + var share = new MenuItem { Text = "Share" }; + share.Clicked += OnShareClick; + var delete = new MenuItem { Text = "Delete" }; + delete.Clicked += OnDeleteClick; + + moreMenu.Items = new MenuItem[] { addToPlaylist, share, delete }; + } + protected override void Dispose(DisposeTypes type) { if(Disposed) @@ -87,16 +121,41 @@ namespace MusicPlayer.Views trackCountLabel.Dispose(); trackCountLabel = null; - // TODO Uncomment after implementation is completed - titleView.Remove(playAllIcon); - playAllIcon.Dispose(); - playAllIcon = null; + titleView.Remove(playAllWithShuffle); + playAllWithShuffle.Dispose(); + playAllWithShuffle = null; - //titleView.Remove(addToPlaylistIcon); - addToPlaylistIcon.Dispose(); - addToPlaylistIcon = null; + titleView.Remove(playAll); + playAll.Dispose(); + playAll = null; + moreMenu?.Dismiss(); + moreMenu = null; } base.Dispose(type); } + + private void OnTrackSelection(object sender, SelectionChangedEventArgs e) + { + viewModel.OnTrackSelected(collectionView.SelectedItem); + } + + private void OnDeleteClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Delete, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + private void OnShareClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.Share, ContentViewType.Track, viewModel.ListViewModel); + OnOperationViewAdd(operationEventArgs); + } + + private void OnAddToPlaylistClick(object sender, ClickedEventArgs e) + { + DismissMoreMenu(); + } } } diff --git a/music-player/Views/Utils/ContentViewFactory.cs b/music-player/Views/Utils/ContentViewFactory.cs new file mode 100755 index 0000000..d7a09f8 --- /dev/null +++ b/music-player/Views/Utils/ContentViewFactory.cs @@ -0,0 +1,56 @@ +using System.Diagnostics; +using MusicPlayer.ViewModels; +using MusicPlayer.Common; + +namespace MusicPlayer.Views.Utils +{ + public enum ContentViewType + { + Playlist = 0, + Track = 1, + Album = 2, + Artist = 3, + }; + + abstract class ContentViewFactory + { + public abstract BaseContentView GetContentView(ContentViewType type); + } + + class ConcreteContentViewFactory : ContentViewFactory + { + public override BaseContentView GetContentView(ContentViewType type) + { + Tizen.Log.Debug(AppConstants.LogTag, "Getting content view of type: " + type.ToString()); + BaseContentView contentView = null; + switch(type) + { + case ContentViewType.Playlist: + Tizen.Log.Info(AppConstants.LogTag, "Creating Artist View"); + PlaylistViewModel viewModel = new PlaylistViewModel(); + PlaylistView playlistView = new PlaylistView(viewModel); + contentView = playlistView; + break; + case ContentViewType.Track: + Tizen.Log.Info(AppConstants.LogTag, "Creating Track View"); + TrackViewModel trackViewModel = new TrackViewModel(); + TrackView trackView = new TrackView(trackViewModel); + contentView = trackView; + break; + case ContentViewType.Album: + Tizen.Log.Info(AppConstants.LogTag, "Creating album View"); + AlbumViewModel albumViewModel = new AlbumViewModel(); + AlbumView albumView = new AlbumView(albumViewModel); + contentView = albumView; + break; + case ContentViewType.Artist: + Tizen.Log.Error(AppConstants.LogTag, "Creating Arist View"); + ArtistViewModel artistViewModel = new ArtistViewModel(); + ArtistView artistView = new ArtistView(artistViewModel); + contentView = artistView; + break; + } + return contentView; + } + } +} diff --git a/music-player/Views/Utils/IMoreButtonItems.cs b/music-player/Views/Utils/IMoreButtonItems.cs new file mode 100755 index 0000000..351ccb9 --- /dev/null +++ b/music-player/Views/Utils/IMoreButtonItems.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MusicPlayer.Views.Utils +{ + interface IMoreButtonItems + { + void UpdateButtonMoreItems(Tizen.NUI.Components.Menu moreMenu); + } +} diff --git a/music-player/Views/Utils/ISubViewStatus.cs b/music-player/Views/Utils/ISubViewStatus.cs new file mode 100755 index 0000000..639a22a --- /dev/null +++ b/music-player/Views/Utils/ISubViewStatus.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MusicPlayer.Views.Utils +{ + interface ISubViewStatus + { + void DeleteSubView(); + } +} diff --git a/music-player/Views/Utils/IViewStatus.cs b/music-player/Views/Utils/IViewStatus.cs new file mode 100755 index 0000000..37d6e1a --- /dev/null +++ b/music-player/Views/Utils/IViewStatus.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MusicPlayer.Views.Utils +{ + interface IViewStatus + { + void ShowView(); + void HideView(); + } +} diff --git a/music-player/Views/Utils/OperationViewAddEventArgs.cs b/music-player/Views/Utils/OperationViewAddEventArgs.cs new file mode 100755 index 0000000..348ef7f --- /dev/null +++ b/music-player/Views/Utils/OperationViewAddEventArgs.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MusicPlayer.Views.Utils +{ + class OperationViewAddEventArgs : EventArgs + { + public OperationViewAddEventArgs(OperationViewType type, ContentViewType contentType, object creationDetails) + { + OperationViewType = type; + ContentViewType = contentType; + ViewModelData = creationDetails; + } + + public OperationViewType OperationViewType { get; private set; } + + public ContentViewType ContentViewType { get; private set; } + + public object ViewModelData { get; private set; } + } +} diff --git a/music-player/Views/Utils/OperationViewFactory.cs b/music-player/Views/Utils/OperationViewFactory.cs new file mode 100755 index 0000000..f198680 --- /dev/null +++ b/music-player/Views/Utils/OperationViewFactory.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Tizen.NUI.BaseComponents; +using MusicPlayer.ViewModels; +using MusicPlayer.Common; +using MusicPlayer.Models; + +namespace MusicPlayer.Views.Utils +{ + public enum OperationViewType + { + Delete = 0, + Search = 1, + Share = 2, + AddToPlaylist = 3, + } + + abstract class OperationViewFactory + { + public abstract View AddOperationView(OperationViewType type, ContentViewType viewType, object viewModelData); + } + class ConcreteOperationViewFactory : OperationViewFactory + { + public override View AddOperationView(OperationViewType type, ContentViewType viewType, object viewModelData) + { + Tizen.Log.Debug(AppConstants.LogTag, "Getting operation view of type: " + type.ToString()); + View view = null; + switch (type) + { + case OperationViewType.Delete: + Tizen.Log.Info(AppConstants.LogTag, "Creationg Delete View"); + view = CreateDeleteView(viewType, viewModelData); + break; + case OperationViewType.Search: + Tizen.Log.Info(AppConstants.LogTag, "Creationg Search View"); + break; + case OperationViewType.Share: + Tizen.Log.Info(AppConstants.LogTag, "Creationg Share View"); + SelectorViewModel shareViewModel = new SelectorViewModel((ListViewModel)viewModelData); + SelectorView seachView = new SelectorView(OperationViewType.Share, shareViewModel); + view = seachView; + break; + case OperationViewType.AddToPlaylist: + Tizen.Log.Info(AppConstants.LogTag, "Creationg AddtoPlaylist View"); + break; + } + return view; + } + + private View CreateDeleteView(ContentViewType type, object viewModelData) + { + View deleteView = null; + switch (type) + { + case ContentViewType.Playlist: + SelectorViewModel viewModel = new SelectorViewModel((ListViewModel)viewModelData); + deleteView = new SelectorView(OperationViewType.Delete, viewModel); + break; + case ContentViewType.Track: + SelectorViewModel trackViewModel = new SelectorViewModel((ListViewModel)viewModelData); + deleteView = new SelectorView(OperationViewType.Delete, trackViewModel); + break; + case ContentViewType.Album: + SelectorViewModel albumViewModel = new SelectorViewModel((ListViewModel)viewModelData); + deleteView = new SelectorView(OperationViewType.Delete, albumViewModel); + break; + case ContentViewType.Artist: + SelectorViewModel artistViewModel = new SelectorViewModel((ListViewModel)viewModelData); + deleteView = new SelectorView(OperationViewType.Delete, artistViewModel); + break; + } + return deleteView; + } + + public SearchView CreateSeachView() + { + SearchViewModel viewModel = new SearchViewModel(); + SearchView searchView = new SearchView(viewModel); + return searchView; + } + + } +} diff --git a/music-player/Views/Utils/SubContentViewFactory.cs b/music-player/Views/Utils/SubContentViewFactory.cs new file mode 100755 index 0000000..6d32004 --- /dev/null +++ b/music-player/Views/Utils/SubContentViewFactory.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MusicPlayer.Common; +using MusicPlayer.Models; +using MusicPlayer.ViewModels; + +namespace MusicPlayer.Views.Utils +{ + public enum SubContentViewType + { + PlaylistDetails = 0, + AlbumDetails = 1, + ArtistDetails = 2, + }; + + abstract class SubContentViewFactory + { + public abstract BaseSubContentView GetSubContentView(SubContentViewType type, object creationDetails); + } + class ConcreteSubContentViewFactory : SubContentViewFactory + { + public override BaseSubContentView GetSubContentView(SubContentViewType type, object creationDetails) + { + Tizen.Log.Info(AppConstants.LogTag, "Getting sub content view of type: " + type.ToString()); + BaseSubContentView subcontentView = null; + switch (type) + { + case SubContentViewType.PlaylistDetails: + Tizen.Log.Info(AppConstants.LogTag, "Creating Playlist Detail View"); + PlaylistDetailViewModel playlistDetailViewModel = new PlaylistDetailViewModel((int)creationDetails); + PlaylistDetailView playlistDetailView = new PlaylistDetailView(playlistDetailViewModel); + subcontentView = playlistDetailView; + break; + case SubContentViewType.AlbumDetails: + Tizen.Log.Info(AppConstants.LogTag, "Creating album details view"); + AlbumDetailViewModel albumDetailViewModel = new AlbumDetailViewModel((MusicAlbum)creationDetails); + AlbumDetailView albumDetailsView = new AlbumDetailView(albumDetailViewModel); + subcontentView = albumDetailsView; + break; + case SubContentViewType.ArtistDetails: + Tizen.Log.Info(AppConstants.LogTag, "Creating Arist details view"); + ArtistDetailViewModel artistDetailViewModel = new ArtistDetailViewModel((Artist)creationDetails); + ArtistDetailView artistDetailView = new ArtistDetailView(artistDetailViewModel); + subcontentView = artistDetailView; + break; + } + return subcontentView; + } + } +} diff --git a/music-player/Views/Utils/SubViewAddEventArgs.cs b/music-player/Views/Utils/SubViewAddEventArgs.cs new file mode 100755 index 0000000..8a4fddb --- /dev/null +++ b/music-player/Views/Utils/SubViewAddEventArgs.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using MusicPlayer.Common; + +namespace MusicPlayer.Views.Utils +{ + class SubContentViewAddEventArgs : EventArgs + { + public SubContentViewAddEventArgs(SubContentViewType subViewType, string titleText, object viewModelData) + { + SubViewType = subViewType; + TitleText = titleText; + ViewModelData = viewModelData; + } + + public string TitleText { get; private set; } + + public object ViewModelData { get; private set; } + + public SubContentViewType SubViewType { get; private set; } + } +} diff --git a/music-player/Views/Utils/ViewLibrary.cs b/music-player/Views/Utils/ViewLibrary.cs new file mode 100755 index 0000000..e88c211 --- /dev/null +++ b/music-player/Views/Utils/ViewLibrary.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using MusicPlayer.Common; + +namespace MusicPlayer.Views.Utils +{ + class ViewLibrary + { + private IDictionary contentViewDictionary; + private ConcreteContentViewFactory contentViewFactory; + private ConcreteSubContentViewFactory subContentViewFactory; + private ConcreteOperationViewFactory operationViewFactory; + + public ViewLibrary() + { + contentViewDictionary = new Dictionary(); + foreach(int i in Enum.GetValues(typeof(ContentViewType))) + { + contentViewDictionary[i] = null; + } + + contentViewFactory = new ConcreteContentViewFactory(); + subContentViewFactory = new ConcreteSubContentViewFactory(); + operationViewFactory = new ConcreteOperationViewFactory(); + } + + public BaseContentView GetContentView(ContentViewType type) + { + if(contentViewDictionary[(int)type] == null) + { + contentViewDictionary[(int)type] = contentViewFactory.GetContentView(type); + } + return contentViewDictionary[(int)type]; + } + + public BaseSubContentView GetSubContentView(SubContentViewType type, object viewModelData) + { + BaseSubContentView view = subContentViewFactory.GetSubContentView(type, viewModelData); + return view; + } + + public void AddOperationView(OperationViewType type, ContentViewType contentType, object viewModelData) + { + operationViewFactory.AddOperationView(type, contentType, viewModelData); + } + + public SearchView CreateSearchView() + { + return operationViewFactory.CreateSeachView(); + } + + } +} diff --git a/music-player/Views/ViewManager.cs b/music-player/Views/ViewManager.cs new file mode 100755 index 0000000..e296e0c --- /dev/null +++ b/music-player/Views/ViewManager.cs @@ -0,0 +1,179 @@ +using System; +using System.IO; +using System.Diagnostics; +using Tizen.NUI; +using Tizen.NUI.Xaml; +using Tizen.NUI.Components; +using Tizen.NUI.BaseComponents; +using MusicPlayer.Views.Utils; +using MusicPlayer.Common; + + +namespace MusicPlayer.Views +{ + public class ViewManager + { + private Window window; + private ViewLibrary viewLibrary; + private View rootView; + private BaseView baseView; + private static string[] TabNames = new string[] + { + "Playlists", + "Tracks", + "Albums", + "Artists", + }; + + public ViewManager(Window win) + { + window = win; + viewLibrary = new ViewLibrary(); + UpdateTheme(ThemeManager.PlatformThemeId); + InitializeRootView(win); + InitializeBaseView(rootView); + ThemeManager.ThemeChanged += (object sender, ThemeChangedEventArgs e) => + { + if (e.IsPlatformThemeChanged) + { + Tizen.Log.Error(AppConstants.LogTag, "Theme Changed: " + e.ThemeId); + UpdateTheme(e.PlatformThemeId); + } + }; + } + + private void SetTheme(string path) + { + try + { + Theme lightTheme = new Theme(path); + ThemeManager.ApplyTheme(lightTheme); + } + catch (ArgumentNullException e) + { + Tizen.Log.Error(AppConstants.LogTag, "ArgumentNullException: " + e.ParamName); + } + catch (IOException e) + { + Tizen.Log.Error(AppConstants.LogTag, "IOException: " + e.Message); + } + catch (XamlParseException e) + { + Tizen.Log.Error(AppConstants.LogTag, "XamlParseException: " + e.Message); + if (e.XmlInfo != null) + { + Tizen.Log.Error(AppConstants.LogTag, "XamlParseException, LineNo." + e.XmlInfo.LineNumber + " Pos: " + e.XmlInfo.LinePosition + " HasInfo: " + e.XmlInfo.HasLineInfo().ToString()); + } + } + } + + private void UpdateTheme(string platformThemeId) + { + if(platformThemeId == null) + { + Tizen.Log.Error(AppConstants.LogTag, "Platform theme id is null"); + return; + } + if(platformThemeId.Equals(AppConstants.LightPlatformThemeId)) + { + SetTheme(Resources.GetThemePath() + "light.xaml"); + } + else if(platformThemeId.Equals(AppConstants.DarkPlatformThemeId)) + { + SetTheme(Resources.GetThemePath() + "dark.xaml"); + } + } + + private void InitializeRootView(Window win) + { + rootView = new View() + { + StyleName = "AppBackground", + Size = new Size(win.Size), + ThemeChangeSensitive = true, + Layout = new FlexLayout() + { + Direction = FlexLayout.FlexDirection.Column, + ItemsAlignment = FlexLayout.AlignmentType.FlexStart, + Justification = FlexLayout.FlexJustification.FlexStart + } + }; + win.Add(rootView); + } + + private void InitializeBaseView(View rootview) + { + baseView = new BaseView() + { + Title = "Music", + MoreButton = true, + SearchButton = true, + }; + rootview.Add(baseView); + FlexLayout.SetFlexGrow(baseView, 1); + FlexLayout.SetFlexShrink(baseView, 1); + baseView.Tabs.SelectedItemIndex = (int)ContentViewType.Playlist; + baseView.Tabs.ItemChangedEvent += OnTabItemSelect; + baseView.GetSearchButton().Clicked += OnSearchIconClicked; + SetTabItem(-1, (int)ContentViewType.Playlist); + } + + private void OnSearchIconClicked(object sender, ClickedEventArgs e) + { + SearchView searchView = viewLibrary.CreateSearchView(); + searchView.LaunchDetailView += OnSubViewAdded; + } + + private void OnSubViewAdded(object sender, SubContentViewAddEventArgs subViewAddEventArgs) + { + BaseSubContentView baseSubContentView = viewLibrary.GetSubContentView(subViewAddEventArgs.SubViewType, subViewAddEventArgs.ViewModelData); + baseView.AddSubViewContent(subViewAddEventArgs.TitleText, baseSubContentView); + } + + private void OnOpeationViewAdded(object sender, OperationViewAddEventArgs e) + { + viewLibrary.AddOperationView(e.OperationViewType, e.ContentViewType, e.ViewModelData); + } + + private void SetTabItem(int previousIndex, int currentIndex) + { + Tizen.Log.Debug(AppConstants.LogTag, "SetTabItem item " + previousIndex + ", " + currentIndex); + if(previousIndex >= (int)ContentViewType.Playlist && previousIndex <= (int)ContentViewType.Artist) + { + BaseContentView previousContentView = viewLibrary.GetContentView((ContentViewType)previousIndex); + baseView.RemoveContent(previousContentView); + previousContentView?.HideView(); + if(previousContentView != null) + { + previousContentView.SubContentViewAdded -= OnSubViewAdded; + previousContentView.OperationViewAdded -= OnOpeationViewAdded; + } + Tizen.Log.Error(AppConstants.LogTag, "Removing " + previousContentView.Name); + } + + if(currentIndex >= (int)ContentViewType.Playlist && currentIndex <= (int)ContentViewType.Artist) + { + BaseContentView currentContentView = viewLibrary.GetContentView((ContentViewType)currentIndex); + currentContentView?.ShowView(); + baseView.SetContent(currentContentView); + if (currentContentView != null) + { + currentContentView.SubContentViewAdded += OnSubViewAdded; + currentContentView.OperationViewAdded += OnOpeationViewAdded; + } + Tizen.Log.Error(AppConstants.LogTag, "Adding " + currentContentView.Name); + } + } + + private void OnTabItemSelect(object sender, Tab.ItemChangedEventArgs e) + { + Tizen.Log.Debug(AppConstants.LogTag, "Tab Item selected: " + TabNames[e.CurrentIndex]); + Tizen.Log.Debug(AppConstants.LogTag, "Tab Item selected: " + "Prev Index: "+e.PreviousIndex+", Curr Index"+e.CurrentIndex); + if(e.PreviousIndex == e.CurrentIndex) + { + return; + } + SetTabItem(e.PreviousIndex, e.CurrentIndex); + } + } +} diff --git a/music-player/music-player.csproj b/music-player/music-player.csproj index 782f6b6..d9ebc62 100755 --- a/music-player/music-player.csproj +++ b/music-player/music-player.csproj @@ -26,9 +26,9 @@ - + - + diff --git a/music-player/res/images/addtoplaylist_disabled.png b/music-player/res/images/addtoplaylist_disabled.png new file mode 100755 index 0000000..2dd4ecf Binary files /dev/null and b/music-player/res/images/addtoplaylist_disabled.png differ diff --git a/music-player/res/images/addtoplaylist_pressed.png b/music-player/res/images/addtoplaylist_pressed.png new file mode 100755 index 0000000..a55866c Binary files /dev/null and b/music-player/res/images/addtoplaylist_pressed.png differ diff --git a/music-player/res/images/back.png b/music-player/res/images/back.png new file mode 100755 index 0000000..e44b1a2 Binary files /dev/null and b/music-player/res/images/back.png differ diff --git a/music-player/res/images/back_pressed.png b/music-player/res/images/back_pressed.png new file mode 100755 index 0000000..ebabcb0 Binary files /dev/null and b/music-player/res/images/back_pressed.png differ diff --git a/music-player/res/images/check_off.png b/music-player/res/images/check_off.png new file mode 100755 index 0000000..ab7eb52 Binary files /dev/null and b/music-player/res/images/check_off.png differ diff --git a/music-player/res/images/check_on.png b/music-player/res/images/check_on.png new file mode 100755 index 0000000..b654380 Binary files /dev/null and b/music-player/res/images/check_on.png differ diff --git a/music-player/res/images/cross_button.png b/music-player/res/images/cross_button.png new file mode 100755 index 0000000..2c9e1c3 Binary files /dev/null and b/music-player/res/images/cross_button.png differ diff --git a/music-player/res/images/dark/addtoplaylist.png b/music-player/res/images/dark/addtoplaylist.png new file mode 100755 index 0000000..668d5bc Binary files /dev/null and b/music-player/res/images/dark/addtoplaylist.png differ diff --git a/music-player/res/images/dark/back.png b/music-player/res/images/dark/back.png new file mode 100755 index 0000000..b6e3472 Binary files /dev/null and b/music-player/res/images/dark/back.png differ diff --git a/music-player/res/images/dark/cancel_button_bg.png b/music-player/res/images/dark/cancel_button_bg.png new file mode 100755 index 0000000..3c4f884 Binary files /dev/null and b/music-player/res/images/dark/cancel_button_bg.png differ diff --git a/music-player/res/images/dark/empty track.png b/music-player/res/images/dark/empty track.png new file mode 100755 index 0000000..76807ef Binary files /dev/null and b/music-player/res/images/dark/empty track.png differ diff --git a/music-player/res/images/dark/favourite_off.png b/music-player/res/images/dark/favourite_off.png new file mode 100755 index 0000000..da62509 Binary files /dev/null and b/music-player/res/images/dark/favourite_off.png differ diff --git a/music-player/res/images/dark/favourite_on.png b/music-player/res/images/dark/favourite_on.png new file mode 100755 index 0000000..8578c4d Binary files /dev/null and b/music-player/res/images/dark/favourite_on.png differ diff --git a/music-player/res/images/dark/left_sound_icon.png b/music-player/res/images/dark/left_sound_icon.png new file mode 100755 index 0000000..8027774 Binary files /dev/null and b/music-player/res/images/dark/left_sound_icon.png differ diff --git a/music-player/res/images/dark/list_view_bg.png b/music-player/res/images/dark/list_view_bg.png new file mode 100755 index 0000000..73628a6 Binary files /dev/null and b/music-player/res/images/dark/list_view_bg.png differ diff --git a/music-player/res/images/dark/more.png b/music-player/res/images/dark/more.png new file mode 100755 index 0000000..a1a661a Binary files /dev/null and b/music-player/res/images/dark/more.png differ diff --git a/music-player/res/images/dark/next.png b/music-player/res/images/dark/next.png new file mode 100755 index 0000000..a797166 Binary files /dev/null and b/music-player/res/images/dark/next.png differ diff --git a/music-player/res/images/dark/nomal_slider_handler.png b/music-player/res/images/dark/nomal_slider_handler.png new file mode 100755 index 0000000..8cc7da3 Binary files /dev/null and b/music-player/res/images/dark/nomal_slider_handler.png differ diff --git a/music-player/res/images/dark/pause.png b/music-player/res/images/dark/pause.png new file mode 100755 index 0000000..1c053b4 Binary files /dev/null and b/music-player/res/images/dark/pause.png differ diff --git a/music-player/res/images/dark/play.png b/music-player/res/images/dark/play.png new file mode 100755 index 0000000..19d5f98 Binary files /dev/null and b/music-player/res/images/dark/play.png differ diff --git a/music-player/res/images/dark/playall.png b/music-player/res/images/dark/playall.png new file mode 100755 index 0000000..13f09a2 Binary files /dev/null and b/music-player/res/images/dark/playall.png differ diff --git a/music-player/res/images/dark/playing_list_bg.png b/music-player/res/images/dark/playing_list_bg.png new file mode 100755 index 0000000..dafbc0f Binary files /dev/null and b/music-player/res/images/dark/playing_list_bg.png differ diff --git a/music-player/res/images/dark/playing_queue.png b/music-player/res/images/dark/playing_queue.png new file mode 100755 index 0000000..5745f95 Binary files /dev/null and b/music-player/res/images/dark/playing_queue.png differ diff --git a/music-player/res/images/dark/prev.png b/music-player/res/images/dark/prev.png new file mode 100755 index 0000000..633863f Binary files /dev/null and b/music-player/res/images/dark/prev.png differ diff --git a/music-player/res/images/dark/progress_track.png b/music-player/res/images/dark/progress_track.png new file mode 100755 index 0000000..9d45664 Binary files /dev/null and b/music-player/res/images/dark/progress_track.png differ diff --git a/music-player/res/images/dark/repeat_all.png b/music-player/res/images/dark/repeat_all.png new file mode 100755 index 0000000..f905fb1 Binary files /dev/null and b/music-player/res/images/dark/repeat_all.png differ diff --git a/music-player/res/images/dark/repeat_off.png b/music-player/res/images/dark/repeat_off.png new file mode 100755 index 0000000..2c601a8 Binary files /dev/null and b/music-player/res/images/dark/repeat_off.png differ diff --git a/music-player/res/images/dark/repeat_one.png b/music-player/res/images/dark/repeat_one.png new file mode 100755 index 0000000..2d62801 Binary files /dev/null and b/music-player/res/images/dark/repeat_one.png differ diff --git a/music-player/res/images/dark/right_sound_icon.png b/music-player/res/images/dark/right_sound_icon.png new file mode 100755 index 0000000..5b57435 Binary files /dev/null and b/music-player/res/images/dark/right_sound_icon.png differ diff --git a/music-player/res/images/dark/selectall_bg.png b/music-player/res/images/dark/selectall_bg.png new file mode 100755 index 0000000..9aa4b8a Binary files /dev/null and b/music-player/res/images/dark/selectall_bg.png differ diff --git a/music-player/res/images/dark/shuffle_off.png b/music-player/res/images/dark/shuffle_off.png new file mode 100755 index 0000000..737cd67 Binary files /dev/null and b/music-player/res/images/dark/shuffle_off.png differ diff --git a/music-player/res/images/dark/shuffle_on.png b/music-player/res/images/dark/shuffle_on.png new file mode 100755 index 0000000..9ce9d8b Binary files /dev/null and b/music-player/res/images/dark/shuffle_on.png differ diff --git a/music-player/res/images/empty_track.png b/music-player/res/images/empty_track.png new file mode 100755 index 0000000..76807ef Binary files /dev/null and b/music-player/res/images/empty_track.png differ diff --git a/music-player/res/images/favourite_off.png b/music-player/res/images/favourite_off.png new file mode 100755 index 0000000..4e87fdd Binary files /dev/null and b/music-player/res/images/favourite_off.png differ diff --git a/music-player/res/images/favourite_on.png b/music-player/res/images/favourite_on.png new file mode 100755 index 0000000..762abeb Binary files /dev/null and b/music-player/res/images/favourite_on.png differ diff --git a/music-player/res/images/favourite_playlist.png b/music-player/res/images/favourite_playlist.png new file mode 100755 index 0000000..121d249 Binary files /dev/null and b/music-player/res/images/favourite_playlist.png differ diff --git a/music-player/res/images/gradient_music_light.png b/music-player/res/images/gradient_music_light.png new file mode 100755 index 0000000..ceb1deb Binary files /dev/null and b/music-player/res/images/gradient_music_light.png differ diff --git a/music-player/res/images/light/addtoplaylist.png b/music-player/res/images/light/addtoplaylist.png new file mode 100755 index 0000000..03fdb90 Binary files /dev/null and b/music-player/res/images/light/addtoplaylist.png differ diff --git a/music-player/res/images/light/back.png b/music-player/res/images/light/back.png new file mode 100755 index 0000000..e44b1a2 Binary files /dev/null and b/music-player/res/images/light/back.png differ diff --git a/music-player/res/images/light/cancel_button_bg.png b/music-player/res/images/light/cancel_button_bg.png new file mode 100755 index 0000000..c867370 Binary files /dev/null and b/music-player/res/images/light/cancel_button_bg.png differ diff --git a/music-player/res/images/light/favourite_off.png b/music-player/res/images/light/favourite_off.png new file mode 100755 index 0000000..4e87fdd Binary files /dev/null and b/music-player/res/images/light/favourite_off.png differ diff --git a/music-player/res/images/light/favourite_on.png b/music-player/res/images/light/favourite_on.png new file mode 100755 index 0000000..762abeb Binary files /dev/null and b/music-player/res/images/light/favourite_on.png differ diff --git a/music-player/res/images/light/left_sound_icon.png b/music-player/res/images/light/left_sound_icon.png new file mode 100755 index 0000000..f9f1540 Binary files /dev/null and b/music-player/res/images/light/left_sound_icon.png differ diff --git a/music-player/res/images/light/list_view_bg.png b/music-player/res/images/light/list_view_bg.png new file mode 100755 index 0000000..cee5613 Binary files /dev/null and b/music-player/res/images/light/list_view_bg.png differ diff --git a/music-player/res/images/light/more.png b/music-player/res/images/light/more.png new file mode 100755 index 0000000..c16a9ec Binary files /dev/null and b/music-player/res/images/light/more.png differ diff --git a/music-player/res/images/light/next.png b/music-player/res/images/light/next.png new file mode 100755 index 0000000..c08effa Binary files /dev/null and b/music-player/res/images/light/next.png differ diff --git a/music-player/res/images/light/nomal_slider_handler.png b/music-player/res/images/light/nomal_slider_handler.png new file mode 100755 index 0000000..84238df Binary files /dev/null and b/music-player/res/images/light/nomal_slider_handler.png differ diff --git a/music-player/res/images/light/pause.png b/music-player/res/images/light/pause.png new file mode 100755 index 0000000..80f6267 Binary files /dev/null and b/music-player/res/images/light/pause.png differ diff --git a/music-player/res/images/light/play.png b/music-player/res/images/light/play.png new file mode 100755 index 0000000..099238a Binary files /dev/null and b/music-player/res/images/light/play.png differ diff --git a/music-player/res/images/light/playall.png b/music-player/res/images/light/playall.png new file mode 100755 index 0000000..b64e25d Binary files /dev/null and b/music-player/res/images/light/playall.png differ diff --git a/music-player/res/images/light/playing_list_bg.png b/music-player/res/images/light/playing_list_bg.png new file mode 100755 index 0000000..df0ad4f Binary files /dev/null and b/music-player/res/images/light/playing_list_bg.png differ diff --git a/music-player/res/images/light/playing_queue.png b/music-player/res/images/light/playing_queue.png new file mode 100755 index 0000000..51af2d0 Binary files /dev/null and b/music-player/res/images/light/playing_queue.png differ diff --git a/music-player/res/images/light/popup_bg.png b/music-player/res/images/light/popup_bg.png new file mode 100755 index 0000000..f422a98 Binary files /dev/null and b/music-player/res/images/light/popup_bg.png differ diff --git a/music-player/res/images/light/prev.png b/music-player/res/images/light/prev.png new file mode 100755 index 0000000..1e7298b Binary files /dev/null and b/music-player/res/images/light/prev.png differ diff --git a/music-player/res/images/light/progress_track.png b/music-player/res/images/light/progress_track.png new file mode 100755 index 0000000..27f8622 Binary files /dev/null and b/music-player/res/images/light/progress_track.png differ diff --git a/music-player/res/images/light/repeat_all.png b/music-player/res/images/light/repeat_all.png new file mode 100755 index 0000000..448b3cc Binary files /dev/null and b/music-player/res/images/light/repeat_all.png differ diff --git a/music-player/res/images/light/repeat_off.png b/music-player/res/images/light/repeat_off.png new file mode 100755 index 0000000..08daedf Binary files /dev/null and b/music-player/res/images/light/repeat_off.png differ diff --git a/music-player/res/images/light/repeat_one.png b/music-player/res/images/light/repeat_one.png new file mode 100755 index 0000000..fc7bfb4 Binary files /dev/null and b/music-player/res/images/light/repeat_one.png differ diff --git a/music-player/res/images/light/right_sound_icon.png b/music-player/res/images/light/right_sound_icon.png new file mode 100755 index 0000000..b054ea7 Binary files /dev/null and b/music-player/res/images/light/right_sound_icon.png differ diff --git a/music-player/res/images/light/search_button_bg.png b/music-player/res/images/light/search_button_bg.png new file mode 100755 index 0000000..b969e8a Binary files /dev/null and b/music-player/res/images/light/search_button_bg.png differ diff --git a/music-player/res/images/light/search_icon.png b/music-player/res/images/light/search_icon.png new file mode 100755 index 0000000..bb06301 Binary files /dev/null and b/music-player/res/images/light/search_icon.png differ diff --git a/music-player/res/images/light/selectall_bg.png b/music-player/res/images/light/selectall_bg.png new file mode 100755 index 0000000..7603349 Binary files /dev/null and b/music-player/res/images/light/selectall_bg.png differ diff --git a/music-player/res/images/light/shuffle_off.png b/music-player/res/images/light/shuffle_off.png new file mode 100755 index 0000000..cf9013b Binary files /dev/null and b/music-player/res/images/light/shuffle_off.png differ diff --git a/music-player/res/images/light/shuffle_on.png b/music-player/res/images/light/shuffle_on.png new file mode 100755 index 0000000..ff6a204 Binary files /dev/null and b/music-player/res/images/light/shuffle_on.png differ diff --git a/music-player/res/images/light/slider_effect.png b/music-player/res/images/light/slider_effect.png new file mode 100755 index 0000000..80ffad5 Binary files /dev/null and b/music-player/res/images/light/slider_effect.png differ diff --git a/music-player/res/images/list_view_bg.png b/music-player/res/images/list_view_bg.png new file mode 100755 index 0000000..cee5613 Binary files /dev/null and b/music-player/res/images/list_view_bg.png differ diff --git a/music-player/res/images/more.png b/music-player/res/images/more.png new file mode 100755 index 0000000..c16a9ec Binary files /dev/null and b/music-player/res/images/more.png differ diff --git a/music-player/res/images/more_pressed.png b/music-player/res/images/more_pressed.png new file mode 100755 index 0000000..83bd6b4 Binary files /dev/null and b/music-player/res/images/more_pressed.png differ diff --git a/music-player/res/images/next_disabled.png b/music-player/res/images/next_disabled.png new file mode 100755 index 0000000..1489e6f Binary files /dev/null and b/music-player/res/images/next_disabled.png differ diff --git a/music-player/res/images/next_pressed.png b/music-player/res/images/next_pressed.png new file mode 100755 index 0000000..9883b19 Binary files /dev/null and b/music-player/res/images/next_pressed.png differ diff --git a/music-player/res/images/no_results_found.png b/music-player/res/images/no_results_found.png new file mode 100755 index 0000000..93aa2bf Binary files /dev/null and b/music-player/res/images/no_results_found.png differ diff --git a/music-player/res/images/nomal_slider_handler.png b/music-player/res/images/nomal_slider_handler.png new file mode 100755 index 0000000..84238df Binary files /dev/null and b/music-player/res/images/nomal_slider_handler.png differ diff --git a/music-player/res/images/pause.png b/music-player/res/images/pause.png new file mode 100755 index 0000000..80f6267 Binary files /dev/null and b/music-player/res/images/pause.png differ diff --git a/music-player/res/images/pause_disabled.png b/music-player/res/images/pause_disabled.png new file mode 100755 index 0000000..a311814 Binary files /dev/null and b/music-player/res/images/pause_disabled.png differ diff --git a/music-player/res/images/pause_pressed.png b/music-player/res/images/pause_pressed.png new file mode 100755 index 0000000..f175bc5 Binary files /dev/null and b/music-player/res/images/pause_pressed.png differ diff --git a/music-player/res/images/play.png b/music-player/res/images/play.png new file mode 100755 index 0000000..099238a Binary files /dev/null and b/music-player/res/images/play.png differ diff --git a/music-player/res/images/play_disabled.png b/music-player/res/images/play_disabled.png new file mode 100755 index 0000000..a7b5cad Binary files /dev/null and b/music-player/res/images/play_disabled.png differ diff --git a/music-player/res/images/play_pressed.png b/music-player/res/images/play_pressed.png new file mode 100755 index 0000000..bdb5126 Binary files /dev/null and b/music-player/res/images/play_pressed.png differ diff --git a/music-player/res/images/playall_disabled.png b/music-player/res/images/playall_disabled.png new file mode 100755 index 0000000..d61112e Binary files /dev/null and b/music-player/res/images/playall_disabled.png differ diff --git a/music-player/res/images/playall_pressed.png b/music-player/res/images/playall_pressed.png new file mode 100755 index 0000000..9533039 Binary files /dev/null and b/music-player/res/images/playall_pressed.png differ diff --git a/music-player/res/images/playing_list_bg.png b/music-player/res/images/playing_list_bg.png new file mode 100755 index 0000000..df0ad4f Binary files /dev/null and b/music-player/res/images/playing_list_bg.png differ diff --git a/music-player/res/images/playing_queue_disabled.png b/music-player/res/images/playing_queue_disabled.png new file mode 100755 index 0000000..a1eeb7c Binary files /dev/null and b/music-player/res/images/playing_queue_disabled.png differ diff --git a/music-player/res/images/playing_queue_pressed.png b/music-player/res/images/playing_queue_pressed.png new file mode 100755 index 0000000..36d7938 Binary files /dev/null and b/music-player/res/images/playing_queue_pressed.png differ diff --git a/music-player/res/images/prev_disabled.png b/music-player/res/images/prev_disabled.png new file mode 100755 index 0000000..2456138 Binary files /dev/null and b/music-player/res/images/prev_disabled.png differ diff --git a/music-player/res/images/prev_pressed.png b/music-player/res/images/prev_pressed.png new file mode 100755 index 0000000..f285fc9 Binary files /dev/null and b/music-player/res/images/prev_pressed.png differ diff --git a/music-player/res/images/recently_added_playlist.png b/music-player/res/images/recently_added_playlist.png new file mode 100755 index 0000000..ed5cf03 Binary files /dev/null and b/music-player/res/images/recently_added_playlist.png differ diff --git a/music-player/res/images/repeat_all.png b/music-player/res/images/repeat_all.png new file mode 100755 index 0000000..448b3cc Binary files /dev/null and b/music-player/res/images/repeat_all.png differ diff --git a/music-player/res/images/repeat_off.png b/music-player/res/images/repeat_off.png new file mode 100755 index 0000000..08daedf Binary files /dev/null and b/music-player/res/images/repeat_off.png differ diff --git a/music-player/res/images/repeat_one.png b/music-player/res/images/repeat_one.png new file mode 100755 index 0000000..fc7bfb4 Binary files /dev/null and b/music-player/res/images/repeat_one.png differ diff --git a/music-player/res/images/right_sound_icon.png b/music-player/res/images/right_sound_icon.png new file mode 100755 index 0000000..b054ea7 Binary files /dev/null and b/music-player/res/images/right_sound_icon.png differ diff --git a/music-player/res/images/search_box_bg.png b/music-player/res/images/search_box_bg.png new file mode 100755 index 0000000..a5a146a Binary files /dev/null and b/music-player/res/images/search_box_bg.png differ diff --git a/music-player/res/images/search_button_bg.png b/music-player/res/images/search_button_bg.png new file mode 100755 index 0000000..b969e8a Binary files /dev/null and b/music-player/res/images/search_button_bg.png differ diff --git a/music-player/res/images/search_icon.png b/music-player/res/images/search_icon.png new file mode 100755 index 0000000..bb06301 Binary files /dev/null and b/music-player/res/images/search_icon.png differ diff --git a/music-player/res/images/shuffle_off.png b/music-player/res/images/shuffle_off.png new file mode 100755 index 0000000..cf9013b Binary files /dev/null and b/music-player/res/images/shuffle_off.png differ diff --git a/music-player/res/images/shuffle_on.png b/music-player/res/images/shuffle_on.png new file mode 100755 index 0000000..ff6a204 Binary files /dev/null and b/music-player/res/images/shuffle_on.png differ diff --git a/music-player/res/images/shuffle_on_disabled.png b/music-player/res/images/shuffle_on_disabled.png new file mode 100755 index 0000000..b3efd17 Binary files /dev/null and b/music-player/res/images/shuffle_on_disabled.png differ diff --git a/music-player/res/images/shuffle_on_pressed.png b/music-player/res/images/shuffle_on_pressed.png new file mode 100755 index 0000000..ec70479 Binary files /dev/null and b/music-player/res/images/shuffle_on_pressed.png differ diff --git a/music-player/res/images/slider_effect.png b/music-player/res/images/slider_effect.png new file mode 100755 index 0000000..80ffad5 Binary files /dev/null and b/music-player/res/images/slider_effect.png differ diff --git a/music-player/res/images/thumbnail.png b/music-player/res/images/thumbnail.png new file mode 100755 index 0000000..5760c91 Binary files /dev/null and b/music-player/res/images/thumbnail.png differ diff --git a/music-player/res/themes/dark.xaml b/music-player/res/themes/dark.xaml old mode 100644 new mode 100755 index 1ad5b52..529f73d --- a/music-player/res/themes/dark.xaml +++ b/music-player/res/themes/dark.xaml @@ -31,7 +31,7 @@ Id="LightTheme"> - + @@ -81,7 +81,7 @@ Id="LightTheme"> - + @@ -91,7 +91,7 @@ Id="LightTheme"> - + @@ -149,6 +149,25 @@ Id="LightTheme"> - + ] + + + + + + + *Resource*/images/dark/cancel_button_bg.png + + + + + + + + + + + + \ No newline at end of file diff --git a/music-player/res/themes/light.xaml b/music-player/res/themes/light.xaml old mode 100644 new mode 100755 index 552ec81..8ae333a --- a/music-player/res/themes/light.xaml +++ b/music-player/res/themes/light.xaml @@ -31,7 +31,7 @@ Id="LightTheme"> - + @@ -81,7 +81,7 @@ Id="LightTheme"> - + @@ -91,7 +91,7 @@ Id="LightTheme"> - + @@ -151,4 +151,23 @@ Id="LightTheme"> + + + + + + *Resource*/images/light/cancel_button_bg.png + + + + + + + + + + + + + \ No newline at end of file diff --git a/music-player/tizen-manifest.xml b/music-player/tizen-manifest.xml old mode 100644 new mode 100755 index 03c8036..b9e070c --- a/music-player/tizen-manifest.xml +++ b/music-player/tizen-manifest.xml @@ -5,10 +5,20 @@ MusicPlayer.png + - + + http://tizen.org/privilege/volume.set + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/externalstorage + http://tizen.org/privilege/externalstorage.appdata + http://tizen.org/privilege/notification + http://tizen.org/privilege/display + http://tizen.org/privilege/content.write + http://tizen.org/privilege/appmanager.launch + diff --git a/packaging/org.tizen.MusicPlayer-1.0.0.tpk b/packaging/org.tizen.MusicPlayer-1.0.0.tpk index caae972..915a5a8 100755 Binary files a/packaging/org.tizen.MusicPlayer-1.0.0.tpk and b/packaging/org.tizen.MusicPlayer-1.0.0.tpk differ