Add 'add to playlist' feature to player view and fix some crash issues 13/264713/2 accepted/tizen_6.5_unified tizen_6.5 accepted/tizen/6.5/unified/20211029.015810 accepted/tizen/unified/20211001.001333 submit/tizen/20210929.055951 submit/tizen_6.5/20211028.163901 tizen_6.5.m2_release
authoraman.jeph <aman.jeph@samsung.com>
Tue, 28 Sep 2021 13:03:02 +0000 (18:33 +0530)
committerAman Jeph <aman.jeph@samsung.com>
Tue, 28 Sep 2021 13:11:52 +0000 (13:11 +0000)
Change-Id: I7d0103cb6eb03123b6220754e507fe49593cf7f6
Signed-off-by: aman.jeph <aman.jeph@samsung.com>
music-player/Common/PlayerCommon.cs
music-player/ViewModels/PlayerViewModel.cs
music-player/ViewModels/PlaylistSelectorViewModel.cs
music-player/ViewModels/SelectorViewModel.cs
music-player/Views/PlayerView.cs
music-player/Views/PlaylistSelectorView.cs
music-player/Views/PlaylistView.cs
music-player/Views/SelectorView.cs
packaging/org.tizen.MusicPlayer-1.0.0.tpk

index 360ee2ea1b95ae5fab5330fbf8b711f677cc42c3..b82aafdf9aba391af81a3a2972d8bf2d43025229 100755 (executable)
@@ -42,6 +42,12 @@ namespace MusicPlayer.Common
         PlaybackCompleted,
     }
 
+    public enum PlaylistMemberAddStatus
+    {
+        Added,
+        Cancelled,
+    };
+
     public class PlayerEventArgs : EventArgs
     {
         private readonly EventType type;
index e1ea1a1027a2c7fa6266b4c73f0e7f96438d7b7e..4f062bbf244fc583bad93b2b33f04dbfaf124203 100755 (executable)
@@ -264,22 +264,6 @@ namespace MusicPlayer.ViewModels
             }
         }
 
-        private void UpdatePlayingStatus(PlayingStatus status)
-        {
-            playingStatus = status;
-            switch (status)
-            {
-                case PlayingStatus.Playing:
-                    PlayButtonState = PauseState;
-                    break;
-                case PlayingStatus.Paused:  // Fall Through
-                case PlayingStatus.Stopped: // Fall Through
-                case PlayingStatus.None:
-                    PlayButtonState = PlayState;
-                    break;
-            }
-        }
-
         public void OnCurrentTrackShare()
         {
             List<string> trackIdList = new List<string>()
@@ -304,6 +288,34 @@ namespace MusicPlayer.ViewModels
             }
         }
 
+        public PlaylistSelectorViewModel GetPlaylistSelectorViewModel()
+        {
+            Track currentTrack = playerModel.CurrentTrack;
+            if(currentTrack == null)
+            {
+                Tizen.Log.Error(AppConstants.LogTag, "Current track is null, so can't create PlaylistSelectorViewModel");
+                return null;
+            }
+            List<string> trackList = new List<string>() { currentTrack.Id };
+            return new PlaylistSelectorViewModel(trackList);
+        }
+
+        private void UpdatePlayingStatus(PlayingStatus status)
+        {
+            playingStatus = status;
+            switch (status)
+            {
+                case PlayingStatus.Playing:
+                    PlayButtonState = PauseState;
+                    break;
+                case PlayingStatus.Paused:  // Fall Through
+                case PlayingStatus.Stopped: // Fall Through
+                case PlayingStatus.None:
+                    PlayButtonState = PlayState;
+                    break;
+            }
+        }
+
         private void OnPlayingListItemSelected(object sender, PlayingListItemSelectedEvent e)
         {
             SetCurrentTrack((Track)e.CurrentSelectedItem);
index 11c23d55ccea1e40b98e94a05c4d8fbbaff80f84..c44c67db16644bcc44ceee0ac25f59b1fce401ea 100755 (executable)
@@ -6,11 +6,12 @@ using MusicPlayer.Common;
 
 namespace MusicPlayer.ViewModels
 {
-    class PlaylistSelectorViewModel
+    class PlaylistSelectorViewModel : PropertyNotifier
     {
-        public PlaylistSelectorViewModel()
+        private List<string> addingTrackList;
+        public PlaylistSelectorViewModel(List<string> trackList)
         {
-            PlaylistManager.Instance.PlaylistDataChanged += OnPlaylistDataChanged;
+            addingTrackList = trackList;
             List<PlaylistData> dataList = GeneratePlaylistData();
             listViewModel = new ListViewModel<PlaylistModel>();
             if (dataList.Count > 0)
@@ -28,8 +29,10 @@ namespace MusicPlayer.ViewModels
                 length = UpdateLength(length, count);
                 newName = newName.Substring(0, length);
                 newName += count.ToString();
-                if (CheckPlayListName(newName) == true)
+                if (IsPlaylistExists(newName) == false)
+                {
                     NewPlayListName = newName;
+                }
             }
         }
 
@@ -40,6 +43,49 @@ namespace MusicPlayer.ViewModels
             get => listViewModel;
         }
 
+        public string NewPlayListName { get; set; }
+
+        private object playlistSelectedItem;
+
+        public object PlaylistSelectedItem
+        {
+            get => playlistSelectedItem;
+            set => SetProperty(ref playlistSelectedItem, value);
+        }
+
+        public bool CreatePlaylist(string playlistName)
+        {
+            Playlist playlist = PlaylistManager.Instance.GetPlaylist(playlistName);
+            if (playlist == null)
+            {
+                Playlist createdPlaylist = PlaylistManager.Instance.AddPlaylist(playlistName);
+                if(createdPlaylist != null)
+                {
+                    PlaylistModel playlistModel = new PlaylistModel(new PlaylistData(createdPlaylist.Id, createdPlaylist.Name, GetTrackCountForPlaylist(createdPlaylist.Id), createdPlaylist.ThumbnailPath));
+                    listViewModel.Add(playlistModel);
+                    PlaylistSelectedItem = playlistModel;
+                }
+                return true;
+            }
+            return false;
+        }
+
+        public bool AddTracksToPlaylist(object selectedItemData)
+        {
+            PlaylistModel playlistModel = (PlaylistModel)selectedItemData;
+            if(addingTrackList == null || addingTrackList.Count <= 0)
+            {
+                return false;
+            }
+            return PlaylistManager.Instance.AddTracks(playlistModel.PlaylistId, addingTrackList);
+        }
+
+        public bool IsPlaylistExists(string playlistName)
+        {
+            Playlist playlist = PlaylistManager.Instance.GetPlaylist(playlistName);
+            return playlist == null ? false : true;
+        }
+
         private List<PlaylistData> GeneratePlaylistData()
         {
             List<PlaylistData> dataList = new List<PlaylistData>();
@@ -52,17 +98,15 @@ namespace MusicPlayer.ViewModels
                 {
                     continue;
                 }
-                Tizen.Log.Debug(AppConstants.LogTag, playlist.Id + ": " + playlist.Name);
                 dataList.Add(new PlaylistData(playlist.Id, playlist.Name, GetTrackCountForPlaylist(playlist.Id), playlist.ThumbnailPath));
             }
             return dataList;
         }
 
-        private void UpdatePlaylistData()
+        private string GetTrackCountForPlaylist(int playlistId)
         {
-            listViewModel.Clear();
-            List<PlaylistData> dataList = GeneratePlaylistData();
-            listViewModel.CreateData(dataList);
+            int trackCount = PlaylistManager.Instance.PlaylistTrackCount(playlistId);
+            return trackCount > 1 ? trackCount.ToString() + " tracks" : trackCount.ToString() + " track";
         }
 
         private int UpdateLength(int length, int count)
@@ -81,31 +125,5 @@ namespace MusicPlayer.ViewModels
             }
             return length;
         }
-
-        private void OnPlaylistDataChanged(object sender, System.EventArgs e)
-        {
-            UpdatePlaylistData();
-        }
-
-        public string GetTrackCountForPlaylist(int playlistId)
-        {
-            int trackCount = PlaylistManager.Instance.PlaylistTrackCount(playlistId);
-            return trackCount > 1 ? trackCount.ToString() + " tracks" : trackCount.ToString() + " track";
-        }
-
-        public string NewPlayListName { get; set; }
-
-        public bool CheckPlayListName(string playlistName)
-        {
-            Playlist playlist = PlaylistManager.Instance.GetPlaylist(playlistName);
-            if (playlist == null)
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
     }
 }
index 8433f7256d0dd20782f0f3e1f24b007a72f0d27c..3e91a0cbcd0c64501e250fa33dcdbd90a0cc8119 100755 (executable)
@@ -41,9 +41,9 @@ namespace MusicPlayer.ViewModels
             return tracksShared;
         }
 
-        public PlaylistSelectorViewModel GetPlaylistSelectorViewModel()
+        public PlaylistSelectorViewModel GetPlaylistSelectorViewModel(List<string> addedTrackList)
         {
-            return playlistSelectorViewModel ?? new PlaylistSelectorViewModel();
+            return playlistSelectorViewModel ?? new PlaylistSelectorViewModel(addedTrackList);
         }
     }
 }
index b66ae8b8b50d3b23c8c4045ca43120b37665422c..e08fe963623ebc269d76e16b2af5d7eff4f1c184 100755 (executable)
@@ -61,6 +61,7 @@ namespace MusicPlayer.Views
         private PlayerViewModel viewModel;
 
         private PlayerViewState viewState;
+        private bool isPlaylistAddViewCreated = false;
 
         public PlayerView(PlayerViewModel viewModel) : base()
         {
@@ -761,6 +762,10 @@ namespace MusicPlayer.Views
                 ThemeChangeSensitive = true,
             };
             actionButtonView.Add(playlistButton);
+            playlistButton.Clicked += (object o, ClickedEventArgs e) =>
+            {
+                OnPlaylistAdd();
+            };
 
             favouriteButton = new MultiStateButton()
             {
@@ -819,6 +824,27 @@ namespace MusicPlayer.Views
             };
         }
 
+        private void OnPlaylistAdd()
+        {
+            if(isPlaylistAddViewCreated)
+            {
+                Tizen.Log.Info(AppConstants.LogTag, "Selector view is already created");
+                return;
+            }
+            PlaylistSelectorViewModel playlistselectorviewModel = viewModel.GetPlaylistSelectorViewModel();
+            if(playlistselectorviewModel == null)
+            {
+                Tizen.Log.Error(AppConstants.LogTag, "PlaylistSelectorViewModel is null");
+                return;
+            }
+            PlaylistSelectorView selectorView = new PlaylistSelectorView(playlistselectorviewModel);
+            isPlaylistAddViewCreated = true;
+            selectorView.PlaylistMemberAdd += (object o, PlaylistMemberAddEventArgs e) =>
+            {
+                isPlaylistAddViewCreated = false;
+            };
+        }
+
         private void AddThumbnail()
         {
             thumb = new ImageView()
index 9b3c64fff397e8048b89d0d8c63a8e251bc67fa0..e2232810ea2753c8104cf16a6145c13e2955a640 100755 (executable)
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using Tizen.Content.MediaContent;
 using MusicPlayer.ViewModels;
 using Tizen.NUI.Components;
@@ -11,6 +12,16 @@ using MusicPlayer.Core;
 
 namespace MusicPlayer.Views
 {
+    class PlaylistMemberAddEventArgs: EventArgs
+    {
+        public PlaylistMemberAddEventArgs(PlaylistMemberAddStatus currentAddStatus)
+        {
+            PlaylistAddStatus = currentAddStatus;
+        }
+
+        public PlaylistMemberAddStatus PlaylistAddStatus { get; private set; }
+    }
+
     class PlaylistSelectorView : View
     {
         private View selectPlaylistContentArea;
@@ -29,6 +40,8 @@ namespace MusicPlayer.Views
         private Button crossButton;
         private PlaylistSelectorViewModel viewModel;
 
+        public event EventHandler<PlaylistMemberAddEventArgs> PlaylistMemberAdd;
+
         public PlaylistSelectorView(PlaylistSelectorViewModel viewModel)
         {
             this.viewModel = viewModel;
@@ -102,7 +115,7 @@ namespace MusicPlayer.Views
                 WidthSpecification = LayoutParamPolicies.MatchParent,
                 HeightSpecification = 1,
                 BackgroundColor = UIColors.ItemSeperator,
-                Margin = new Extents(44, 44, 0, 0),
+                Margin = new Extents(64, 64, 0, 0),
             };
             selectPlaylistContentArea.Add(itemSeperator);
             createNewPlaylistButton.Clicked += CreateNewPlaylistButtonClicked;
@@ -143,12 +156,43 @@ namespace MusicPlayer.Views
             collectionView.ItemTemplate = new DataTemplate(() =>
             {
                 DefaultLinearItem layout = new DefaultLinearItem();
+                layout.WidthSpecification = LayoutParamPolicies.MatchParent;
+                layout.HeightSpecification = 108;
+                layout.Seperator.Padding = new Extents(0, 0, 0, 0);
+                layout.Seperator.Margin = new Extents(0, 0, 0, 0);
+                layout.Seperator.WidthSpecification = LayoutParamPolicies.MatchParent;
                 layout.Label.SetBinding(TextLabel.TextProperty, "PlaylistName");
                 layout.Padding = new Extents(0, 0, 0, 0);
                 layout.Margin = new Extents(0, 0, 0, 0);
                 return layout;
             });
             collectionView.ItemsSource = viewModel.ListViewModel;
+            collectionView.BindingContext = viewModel;
+            collectionView.SetBinding(CollectionView.SelectedItemProperty, "PlaylistSelectedItem");
+            collectionView.SelectionChanged += OnSelectionChange;
+        }
+
+        private void OnSelectionChange(object sender, SelectionChangedEventArgs e)
+        {
+            CollectionView collectionView = (CollectionView)sender;
+            object item = collectionView.SelectedItem;
+            if(item == null)
+            {
+                Tizen.Log.Error(AppConstants.LogTag, "Selected item is null");
+                return;
+            }
+            bool isAdded = viewModel.AddTracksToPlaylist(item);
+            if(isAdded == false)
+            {
+                Tizen.Log.Error(AppConstants.LogTag, "Failed to add track to playlist");
+            }
+            if(createPlaylistDialog != null && createPlaylistDialog.IsOnWindow)
+            {
+                RemoveTheCreatePopup();
+            }
+            PlaylistMemberAdd?.Invoke(this, new PlaylistMemberAddEventArgs(PlaylistMemberAddStatus.Added));
+            RemoveTheSelectPopup();
+            DeleteSelectorView();
         }
 
         private void AddNoListText()
@@ -181,7 +225,9 @@ namespace MusicPlayer.Views
 
         private void SelectPlaylistCancelButtonClicked(object sender, ClickedEventArgs e)
         {
+            PlaylistMemberAdd?.Invoke(this, new PlaylistMemberAddEventArgs(PlaylistMemberAddStatus.Cancelled));
             RemoveTheSelectPopup();
+            DeleteSelectorView();
         }
 
         private void AddCreatePlaylistContentArea()
@@ -266,7 +312,10 @@ namespace MusicPlayer.Views
                 ThemeChangeSensitive = true,
                 Position2D = new Position2D(976, 6),
             };
-            crossButton.Clicked += CrossButtonClicked;
+            crossButton.Clicked += (object o, ClickedEventArgs e) =>
+            {
+                textField.Text = string.Empty;
+            };
 
             inputArea.Add(textField);
             inputArea.Add(crossButton);
@@ -292,17 +341,12 @@ namespace MusicPlayer.Views
             }
             if (searchText.Length > 64)
             {
-                Notification.MakeToast("Maximum number of characters reached.", Notification.ToastCenter).Post(Notification.ToastShort);
+                ShowInfoMessage("Maximum number of characters reached");
                 underText.Text = "Can't enter more than 64 characters.";
                 textField.Text = searchText.Substring(0, 63);
             }
         }
 
-        private void CrossButtonClicked(object sender, ClickedEventArgs e)
-        {
-            textField.Text = "";
-        }
-
         private void AddCreatePlaylistButtons()
         {
             createPlaylistCancelButton = new Button("CancelButton")
@@ -325,25 +369,59 @@ namespace MusicPlayer.Views
         private void CreatePlaylistCancelButtonClicked(object sender, ClickedEventArgs e)
         {
             RemoveTheCreatePopup();
+            DeleteTheCreatePopup();
+            ShowTheSelectPopup();
+        }
+
+        private void ShowInfoMessage(string message)
+        {
+            Notification.MakeToast(message, Notification.ToastCenter).Post(Notification.ToastShort);
         }
 
         private void CreatePlaylistCreateButtonClicked(object sender, ClickedEventArgs e)
         {
-            if (viewModel.CheckPlayListName(textField.Text))
+            if(string.IsNullOrEmpty(textField.Text) || string.IsNullOrWhiteSpace(textField.Text))
             {
-                RemoveTheCreatePopup();
-                Window.Instance.Add(selectPlaylistDialog);
-                Playlist playlist = PlaylistManager.Instance.AddPlaylist(textField.Text);
-                PlaylistModel playlistModel = new PlaylistModel(new PlaylistData(playlist.Id, playlist.Name, viewModel.GetTrackCountForPlaylist(playlist.Id), playlist.ThumbnailPath));
-                collectionView.SelectedItem = playlistModel;
+                ShowInfoMessage("Can't create playlist with empty or whitespace only characters");
+                return;
             }
-            else
+            if (viewModel.CreatePlaylist(textField.Text) == false)
             {
-                Notification.MakeToast("Playlist name already in use.", Notification.ToastCenter).Post(Notification.ToastShort);
+                ShowInfoMessage("Playlist name already in use.");
                 underText.Text = "Playlist name already in use.";
             }
         }
 
+        private void DeleteTheCreatePopup()
+        {
+            inputArea?.Remove(textField);
+            textField?.Dispose();
+            textField = null;
+            inputArea?.Remove(crossButton);
+            crossButton?.Dispose();
+            crossButton = null;
+
+            if (createPlaylistContentArea != null)
+            {
+                List<View> children = createPlaylistContentArea.Children;
+                while (children.Count > 0)
+                {
+                    View child = children[0];
+                    createPlaylistContentArea.Remove(child);
+                    child?.Dispose();
+                }
+            }
+            inputArea = null;
+            underText = null;
+            createPlaylistDialog?.Dispose();
+            createPlaylistDialog = null;
+            createPlaylistContentArea = null;
+            createPlaylistCancelButton?.Dispose();
+            createPlaylistCancelButton = null;
+            createPlaylistCreateButton?.Dispose();
+            createPlaylistCreateButton = null;
+        }
+
         protected override void Dispose(DisposeTypes type)
         {
             if (Disposed)
@@ -352,13 +430,7 @@ namespace MusicPlayer.Views
             }
             if (type == DisposeTypes.Explicit)
             {
-                inputArea?.Remove(textField);
-                textField?.Dispose();
-                textField = null;
-                inputArea?.Remove(crossButton);
-                crossButton?.Dispose();
-                crossButton = null;
-
+                DeleteTheCreatePopup();
                 if (selectPlaylistContentArea != null)
                 {
                     List<View> children = selectPlaylistContentArea.Children;
@@ -369,56 +441,42 @@ namespace MusicPlayer.Views
                         child?.Dispose();
                     }
                 }
-                if (createPlaylistContentArea != null)
-                {
-                    List<View> children = createPlaylistContentArea.Children;
-                    while (children.Count > 0)
-                    {
-                        View child = children[0];
-                        createPlaylistContentArea.Remove(child);
-                        child?.Dispose();
-                    }
-                }
+
                 createNewPlaylistButton = null;
                 collectionView = null;
                 noListText = null;
-                inputArea = null;
-                underText = null;
 
                 selectPlaylistDialog?.Dispose();
                 selectPlaylistDialog = null;
-                createPlaylistDialog?.Dispose();
-                createPlaylistDialog = null;
                 selectPlaylistContentArea = null;
-                createPlaylistContentArea = null;
 
                 selectPlaylistCancelButton?.Dispose();
                 selectPlaylistCancelButton = null;
-                createPlaylistCancelButton?.Dispose();
-                createPlaylistCancelButton = null;
-                createPlaylistCreateButton?.Dispose();
-                createPlaylistCreateButton = null;
             }
 
             base.Dispose(type);
         }
 
-        public void DeleteSelectorView()
+        private void DeleteSelectorView()
         {
             Dispose(DisposeTypes.Explicit);
         }
 
-        public CollectionView GetCollectionView()
+
+        private void RemoveTheSelectPopup()
         {
-            return collectionView;
+            Window.Instance.Remove(selectPlaylistDialog);
         }
 
-        public void RemoveTheSelectPopup()
+        private void ShowTheSelectPopup()
         {
-            Window.Instance.Remove(selectPlaylistDialog);
+            if(selectPlaylistDialog != null)
+            {
+                Window.Instance.Add(selectPlaylistDialog);
+            }
         }
 
-        public void RemoveTheCreatePopup()
+        private void RemoveTheCreatePopup()
         {
             Window.Instance.Remove(createPlaylistDialog);
         }
index 6ad637a2e595219c61f85783fb9fc3c18e5c8138..7058165c68d46debd51f792a7dbbb50174423c55 100755 (executable)
@@ -218,7 +218,7 @@ namespace MusicPlayer.Views
             Button createButton = new Button()
             {
                 Name = "AlertDialogCreateButton",
-                Text = "Allow",
+                Text = "Create",
             };
             return createButton;
         }
index 86b77370c7d9807d63a21a8af5154ba22140575e..42b645c300abb4fec7835a673a1787f5ecf28394 100755 (executable)
@@ -183,27 +183,15 @@ namespace MusicPlayer.Views
             }
             else if (currentViewType == OperationViewType.AddToPlaylist)
             {
-                PlaylistSelectorViewModel playlistSelectorViewModel = viewModel.GetPlaylistSelectorViewModel();
+                PlaylistSelectorViewModel playlistSelectorViewModel = viewModel.GetPlaylistSelectorViewModel(SelectedItemList);
                 PlaylistSelectorView playlistSelectorView = new PlaylistSelectorView(playlistSelectorViewModel);
-                if (playlistSelectorView.GetCollectionView() != null)
+                playlistSelectorView.PlaylistMemberAdd += (object o, PlaylistMemberAddEventArgs e) =>
                 {
-                    playlistSelectorView.GetCollectionView().SelectionChanged += (object sender, SelectionChangedEventArgs e) =>
+                    if (e.PlaylistAddStatus == PlaylistMemberAddStatus.Added)
                     {
-                        object item = playlistSelectorView.GetCollectionView().SelectedItem;
-                        PlaylistModel playlist;
-                        if (item is PlaylistModel)
-                        {
-                            playlist = (PlaylistModel)item;
-                            bool additionSuccessful = PlaylistManager.Instance.AddTracks(playlist.PlaylistId, SelectedItemList);
-                            if (additionSuccessful == true)
-                            {
-                                playlistSelectorView.RemoveTheSelectPopup();
-                                playlistSelectorView.DeleteSelectorView();
-                                ClearSelectionAndRemove();
-                            }
-                        }
-                    };
-                }
+                        ClearSelectionAndRemove();
+                    }
+                };
             }
         }
 
index 8783c742cabfe49159fbe59f019bc0c0a87e6b8b..000ef08eaaee86f266375edbf24e2ac7b9d3db73 100755 (executable)
Binary files a/packaging/org.tizen.MusicPlayer-1.0.0.tpk and b/packaging/org.tizen.MusicPlayer-1.0.0.tpk differ