Adding Playlist Selector, Create Playlist and related classes. 66/264466/4
authorshivamv <shivam.v2@samsung.com>
Wed, 22 Sep 2021 14:42:09 +0000 (20:12 +0530)
committershivamv <shivam.v2@samsung.com>
Thu, 23 Sep 2021 10:44:22 +0000 (16:14 +0530)
Change-Id: I8a0c8153f785a9f48969cab3af4b25d9a9b9c224
Signed-off-by: shivamv <shivam.v2@samsung.com>
19 files changed:
music-player/Core/PlaylistManager.cs
music-player/MediaContent/PlaylistContents.cs
music-player/MediaContent/TrackContents.cs
music-player/Models/PlaylistModel.cs
music-player/ViewModels/PlaylistSelectorViewModel.cs [new file with mode: 0755]
music-player/ViewModels/SelectorViewModel.cs
music-player/Views/AlbumView.cs
music-player/Views/ArtistDetailView.cs
music-player/Views/ArtistView.cs
music-player/Views/PlaylistSelectorView.cs [new file with mode: 0755]
music-player/Views/SearchView.cs
music-player/Views/SelectorView.cs
music-player/Views/TrackView.cs
music-player/Views/Utils/OperationViewFactory.cs
music-player/Views/Utils/ViewLibrary.cs
music-player/Views/ViewManager.cs
music-player/res/images/dark/cross_button.png [new file with mode: 0755]
music-player/tizen-manifest.xml
packaging/org.tizen.MusicPlayer-1.0.0.tpk

index 65cb5db74e178fcc5ae4aaa1827223a1d5439953..7a2686dd207e14b7229b962563f9a730f19febeb 100755 (executable)
@@ -90,6 +90,11 @@ namespace MusicPlayer.Core
             return Contents.GetPlaylistMembers(playlistId);
         }
 
+        public bool AddTracks(int playlistId, List<string> trackList)
+        {
+            return Contents.AddMediaList(playlistId, trackList);
+        }
+
         public bool AddTrack(int playlistId, string trackId)
         {
             return Contents.AddMedia(playlistId, trackId);
index cc9396dcc9fa395b3bd38bdd92dc7ac10af1adab..9700a5cc31b2cc7a164a5a9d0b3d47f6baf16a44 100755 (executable)
@@ -51,9 +51,9 @@ namespace MusicPlayer.Media
             return playlistInfo.Insert(name, thumbnailPath);\r
         }\r
 \r
-        public static void AddMediaList(int id, IEnumerable<string> trackList)\r
+        public static bool AddMediaList(int id, IEnumerable<string> trackList)\r
         {\r
-            playlistInfo.AddMembers(id, trackList);\r
+            return playlistInfo.AddMembers(id, trackList);\r
         }\r
 \r
         public static bool AddMedia(int id, string mediaId)\r
index f57e80ed1cd984fa7261a4d03da4873045f35e6b..e063518f10396156da51e101d01adba05dd037ff 100755 (executable)
@@ -62,8 +62,8 @@ namespace MusicPlayer.Media
                     Tizen.Log.Debug(AppConstants.LogTag, "The deletion failed: " + e.Message);\r
                 }\r
             }\r
-                Tizen.Log.Debug(AppConstants.LogTag, "Total tracks deleted from database: " + n);\r
-                return n;\r
+            Tizen.Log.Debug(AppConstants.LogTag, "Total tracks deleted from database: " + n);\r
+            return n;\r
         }\r
 \r
         //TODO need to create Seperate App control operation class\r
index c9f2af3ecb4cf565ce558019e58db29cc6ed747c..7ce04098643d194b225dd1a7f4a09c966d8c62d7 100755 (executable)
@@ -12,7 +12,7 @@ namespace MusicPlayer.Models
             Id = id;
             Name = name;
             Count = count;
-            ThumbPath = thumbPath;
+            ThumbPath = string.IsNullOrEmpty(thumbPath) ? Resources.GetImagePath() + "thumbnail.png" : thumbPath;
         }
         public int Id { get; private set; }
 
diff --git a/music-player/ViewModels/PlaylistSelectorViewModel.cs b/music-player/ViewModels/PlaylistSelectorViewModel.cs
new file mode 100755 (executable)
index 0000000..11c23d5
--- /dev/null
@@ -0,0 +1,111 @@
+using System.Collections.Generic;
+using Tizen.Content.MediaContent;
+using MusicPlayer.Models;
+using MusicPlayer.Core;
+using MusicPlayer.Common;
+
+namespace MusicPlayer.ViewModels
+{
+    class PlaylistSelectorViewModel
+    {
+        public PlaylistSelectorViewModel()
+        {
+            PlaylistManager.Instance.PlaylistDataChanged += OnPlaylistDataChanged;
+            List<PlaylistData> dataList = GeneratePlaylistData();
+            listViewModel = new ListViewModel<PlaylistModel>();
+            if (dataList.Count > 0)
+            {
+                listViewModel.CreateData(dataList);
+            }
+            int count = 0;
+            string newName = "My playlist 000";
+
+            NewPlayListName = null;
+            while (NewPlayListName == null)
+            {
+                count++;
+                int length = newName.Length;
+                length = UpdateLength(length, count);
+                newName = newName.Substring(0, length);
+                newName += count.ToString();
+                if (CheckPlayListName(newName) == true)
+                    NewPlayListName = newName;
+            }
+        }
+
+        private readonly ListViewModel<PlaylistModel> listViewModel;
+
+        public ListViewModel<PlaylistModel> ListViewModel
+        {
+            get => listViewModel;
+        }
+
+        private List<PlaylistData> GeneratePlaylistData()
+        {
+            List<PlaylistData> dataList = new List<PlaylistData>();
+            List<Playlist> playlists = PlaylistManager.Instance.Playlists;
+            Tizen.Log.Debug(AppConstants.LogTag, "Retrived playlistcount: " + playlists.Count);
+
+            foreach (Playlist playlist in playlists)
+            {
+                if (playlist.Name == AppConstants.FavouritePlaylist || playlist.Name == AppConstants.RecentlyAddedPlaylist)
+                {
+                    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()
+        {
+            listViewModel.Clear();
+            List<PlaylistData> dataList = GeneratePlaylistData();
+            listViewModel.CreateData(dataList);
+        }
+
+        private int UpdateLength(int length, int count)
+        {
+            if (count >= 100)
+            {
+                length -= 3;
+            }
+            else if (count >= 10)
+            {
+                length -= 2;
+            }
+            else
+            {
+                length -= 1;
+            }
+            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 04f93e31a690caf61718b1cd901f132fd34fb0b5..8433f7256d0dd20782f0f3e1f24b007a72f0d27c 100755 (executable)
@@ -6,6 +6,8 @@ namespace MusicPlayer.ViewModels
 {
     class SelectorViewModel<T> : PropertyNotifier where T : new()
     {
+        PlaylistSelectorViewModel playlistSelectorViewModel;
+
         public SelectorViewModel(ListViewModel<T> viewModel)
         {
             listViewModel = viewModel;
@@ -38,5 +40,10 @@ namespace MusicPlayer.ViewModels
             Tizen.Log.Debug(AppConstants.LogTag, "Shared track count: " + tracksShared);
             return tracksShared;
         }
+
+        public PlaylistSelectorViewModel GetPlaylistSelectorViewModel()
+        {
+            return playlistSelectorViewModel ?? new PlaylistSelectorViewModel();
+        }
     }
 }
index 56325b7f073583575bfec30570e000acb8c08114..aad025365d06aa047fba6ea98ecc28ac988260e7 100755 (executable)
@@ -115,7 +115,7 @@ namespace MusicPlayer.Views
         {\r
             DismissMoreMenu();\r
             OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Album, viewModel.ListViewModel);\r
-            //OnOperationViewAdd(operationEventArgs);\r
+            OnOperationViewAdd(operationEventArgs);\r
         }\r
 \r
     }\r
index 3f42b617ca6452466d1c09dccf38141e64e84a93..9cdecb068c0f48fd57079fdda4524c8cdb9f4ad1 100755 (executable)
@@ -3,6 +3,7 @@ using Tizen.NUI.Components;
 using Tizen.NUI.BaseComponents;
 using Tizen.NUI.Binding;
 using MusicPlayer.Common;
+using MusicPlayer.Models;
 using MusicPlayer.Views.Utils;
 
 namespace MusicPlayer.Views
@@ -62,7 +63,7 @@ namespace MusicPlayer.Views
 
         private void OnTrackSelection(object sender, SelectionChangedEventArgs e)
         {
-            if (collectionView.SelectedItem == null)
+            if (collectionView.SelectedItem == null || collectionView.SelectedItem is ArtistDetailAlbum)
             {
                 return;
             }
index aa4fe3ce078d8c54c4dbb8432d47464707a17a8f..47558c6930a3bc1fbbe73d3519e6b2878fc755ce 100755 (executable)
@@ -101,7 +101,7 @@ namespace MusicPlayer.Views
         {
             DismissMoreMenu();
             OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Artist, viewModel.ListViewModel);
-            //OnOperationViewAdd(operationEventArgs);
+            OnOperationViewAdd(operationEventArgs);
         }
 
     }
diff --git a/music-player/Views/PlaylistSelectorView.cs b/music-player/Views/PlaylistSelectorView.cs
new file mode 100755 (executable)
index 0000000..3c6cbea
--- /dev/null
@@ -0,0 +1,438 @@
+using System.Collections.Generic;
+using Tizen.Content.MediaContent;
+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.Core;
+
+namespace MusicPlayer.Views
+{
+    class PlaylistSelectorView : View
+    {
+        private View selectPlaylistContentArea;
+        private View createPlaylistContentArea;
+        private View searchBox;
+        private Button createNewPlaylistButton;
+        private TextLabel noListText;
+        private TextLabel underText;
+        private CollectionView collectionView;
+        private Button selectPlaylistCancelButton;
+        private Button createPlaylistCancelButton;
+        private Button createPlaylistCreateButton;
+        private AlertDialog selectPlaylistDialog;
+        private AlertDialog createPlaylistDialog;
+        private TextField textField;
+        private Button crossButton;
+        private PlaylistSelectorViewModel viewModel;
+
+        public PlaylistSelectorView(PlaylistSelectorViewModel viewModel)
+        {
+            this.viewModel = viewModel;
+            AddSelectPlaylistContentArea();
+            AddSelectPlaylistCancelButton();
+            selectPlaylistDialog = new AlertDialog()
+            {
+                Size2D = new Size2D(1184, 660),
+                Title = "Add to playlist",
+                Content = selectPlaylistContentArea,
+                Actions = new List<View> { selectPlaylistCancelButton},
+                Padding = new Extents(0, 0, 0, 0),
+                Margin = new Extents(0, 0, 0, 0),
+            };
+            TextLabel textLabel = (TextLabel)selectPlaylistDialog.TitleContent;
+            textLabel.FontStyle = UIFontStyles.AllNormal;
+            Window.Instance.Add(selectPlaylistDialog);
+        }
+
+        private void AddSelectPlaylistContentArea()
+        {
+            selectPlaylistContentArea = new View()
+            {
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 340,
+                BackgroundColor = Color.Transparent,
+                Layout = new FlexLayout()
+                {
+                    Direction = FlexLayout.FlexDirection.Column,
+                    ItemsAlignment = FlexLayout.AlignmentType.FlexStart,
+                    Justification = FlexLayout.FlexJustification.FlexStart,
+                },
+            };
+            AddCreatePlayListButton();
+            if (viewModel.ListViewModel.Count == 0)
+            {
+                AddNoListText();
+            }
+            AddCollectionView();
+        }
+
+        private void AddCreatePlayListButton()
+        {
+            ButtonStyle buttonStyle = new ButtonStyle()
+            {
+                Text = new TextLabelStyle()
+                {
+                    Text = "+ Create new playlist",
+                    PixelSize = 32,
+                    FontFamily = "BreezeSans",
+                    TextColor = UIColors.HEX001447,
+                    HorizontalAlignment = HorizontalAlignment.Begin,
+                    VerticalAlignment = VerticalAlignment.Center,
+                },
+                IsSelectable = false,
+            };
+
+            createNewPlaylistButton = new Button(buttonStyle)
+            {
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 108,
+                TextAlignment = HorizontalAlignment.Begin,
+                Padding = new Extents(64, 64, 0, 0),
+                IsEnabled = true,
+                IsSelectable = false,
+                ItemAlignment = LinearLayout.Alignment.CenterVertical,
+            };
+            selectPlaylistContentArea.Add(createNewPlaylistButton);
+            View itemSeperator = new View()
+            {
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 1,
+                BackgroundColor = UIColors.ItemSeperator,
+                Margin = new Extents(44, 44, 0, 0),
+            };
+            selectPlaylistContentArea.Add(itemSeperator);
+            createNewPlaylistButton.Clicked += CreateNewPlaylistButtonClicked;
+        }
+
+        private void CreateNewPlaylistButtonClicked(object sender, ClickedEventArgs e)
+        {
+            RemoveTheSelectPopup();
+            AddCreatePlaylistContentArea();
+            AddCreatePlaylistButtons();
+            createPlaylistDialog = new AlertDialog()
+            {
+                Size2D = new Size2D(1184, 465),
+                Title = "Create playlist",
+                Content = createPlaylistContentArea,
+                Actions = new List<View> { createPlaylistCancelButton , createPlaylistCreateButton },
+                Padding = new Extents(0, 0, 0, 0),
+                Margin = new Extents(0, 0, 0, 0),
+            };
+            TextLabel textLabel = (TextLabel)selectPlaylistDialog.TitleContent;
+            textLabel.FontStyle = UIFontStyles.AllNormal;
+            Window.Instance.Add(createPlaylistDialog);
+        }
+
+        private void AddCollectionView()
+        {
+            collectionView = new CollectionView()
+            {
+                Size2D = new Size2D(1184, 108),
+                ItemsLayouter = new LinearLayouter(),
+                ScrollingDirection = ScrollableBase.Direction.Vertical,
+                HeightSpecification = LayoutParamPolicies.WrapContent,
+                SelectionMode = ItemSelectionMode.Single,
+            };
+            selectPlaylistContentArea.Add(collectionView);
+            FlexLayout.SetFlexGrow(collectionView, 1);
+            FlexLayout.SetFlexShrink(collectionView, 1);
+            collectionView.ItemTemplate = new DataTemplate(() =>
+            {
+                DefaultLinearItem layout = new DefaultLinearItem();
+                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;
+        }
+
+        private void AddNoListText()
+        {
+            noListText = new TextLabel("ItemLabel")
+            {
+                ThemeChangeSensitive = true,
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 108,
+                PixelSize = 32,
+                Text = "No playlists available",
+                HorizontalAlignment = HorizontalAlignment.Begin,
+                VerticalAlignment = VerticalAlignment.Center,
+                FontFamily = "BreezeSans",
+                FontStyle = UIFontStyles.NormalLight,
+                Padding = new Extents(64, 64, 0, 0),
+            };
+            selectPlaylistContentArea.Add(noListText);
+        }
+        private void AddSelectPlaylistCancelButton()
+        {
+            selectPlaylistCancelButton = new Button()
+            {
+                Text = "Cancel",
+            };
+            selectPlaylistCancelButton.TextLabel.FontStyle = UIFontStyles.AllNormal;
+            selectPlaylistCancelButton.IsSelectable = true;
+            selectPlaylistCancelButton.Clicked += SelectPlaylistCancelButtonClicked;
+        }
+
+        private void SelectPlaylistCancelButtonClicked(object sender, ClickedEventArgs e)
+        {
+            RemoveTheSelectPopup();
+        }
+
+        private void AddCreatePlaylistContentArea()
+        {
+            createPlaylistContentArea = new View()
+            {
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 169,
+                BackgroundColor = Color.Transparent,
+                Layout = new FlexLayout()
+                {
+                    Direction = FlexLayout.FlexDirection.Column,
+                    ItemsAlignment = FlexLayout.AlignmentType.FlexStart,
+                    Justification = FlexLayout.FlexJustification.FlexStart,
+                    Padding = new Extents(64, 64, 0, 0),
+                },
+            };
+            TextLabel textLabel = new TextLabel("TitleText")
+            {
+                ThemeChangeSensitive = true,
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 40,
+                PixelSize = 32,
+                Text = "Add playlist name.",
+                HorizontalAlignment = HorizontalAlignment.Center,
+                VerticalAlignment = VerticalAlignment.Center,
+                FontFamily = "BreezeSans",
+                FontStyle = UIFontStyles.NormalLight,
+                Margin = new Extents(0, 0, 0, 24),
+            };
+            createPlaylistContentArea.Add(textLabel);
+            AddSearchBox();
+            View itemSeperator = new View()
+            {
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 1,
+                BackgroundColor = UIColors.HEX001447,
+            };
+            createPlaylistContentArea.Add(itemSeperator);
+            underText = new TextLabel("ItemLabel")
+            {
+                ThemeChangeSensitive = true,
+                WidthSpecification = LayoutParamPolicies.MatchParent,
+                HeightSpecification = 32,
+                PixelSize = 24,
+                Text = "Can't enter more than 64 characters.",
+                HorizontalAlignment = HorizontalAlignment.Begin,
+                VerticalAlignment = VerticalAlignment.Center,
+                FontFamily = "BreezeSans",
+                FontStyle = UIFontStyles.AllNormal,
+            };
+            createPlaylistContentArea.Add(underText);
+        }
+
+        private void AddSearchBox()
+        {
+            searchBox = new View()
+            {
+                Size2D = new Size2D(1024, 48),
+                Layout = new FlexLayout()
+                {
+                    Direction = FlexLayout.FlexDirection.Row,
+                    ItemsAlignment = FlexLayout.AlignmentType.Center,
+                    Justification = FlexLayout.FlexJustification.FlexStart,
+                },
+            };
+            textField = new TextField()
+            {
+                Size2D = new Size2D(928, 48),
+                BackgroundColor = Color.White,
+                Position2D = new Position2D(0, 0),
+                Margin = new Extents(0, 48, 0, 0),
+                TextColor = UIColors.HEX001447,
+                FontStyle = UIFontStyles.NormalLight,
+                MaxLength = 65,
+            };
+            textField.Text = viewModel.NewPlayListName;
+            textField.TextChanged += TextFieldTextChanged;
+
+            ButtonStyle crossButtonStyle = new ButtonStyle()
+            {
+                Icon = new ImageViewStyle()
+                {
+                    ResourceUrl = Resources.GetImagePath() + "cross_button.png",
+                },
+                IsSelectable = true,
+                IsEnabled = true,
+            };
+
+            crossButton = new Button(crossButtonStyle)
+            {
+                Size2D = new Size2D(48, 48),
+                Position2D = new Position2D(976, 6),
+            };
+            crossButton.Clicked += CrossButtonClicked;
+
+            searchBox.Add(textField);
+            searchBox.Add(crossButton);
+            createPlaylistContentArea.Add(searchBox);
+        }
+
+        private void TextFieldTextChanged(object sender, TextField.TextChangedEventArgs e)
+        {
+            string searchText = e.TextField.Text;
+            if (string.IsNullOrEmpty(searchText))
+            {
+                crossButton.Hide();
+                crossButton.IsSelectable = false;
+                createPlaylistCreateButton.IsSelectable = false;
+                createPlaylistCreateButton.IsEnabled = false;
+            }
+            else
+            {
+                crossButton.Show();
+                crossButton.IsSelectable = true;
+                createPlaylistCreateButton.IsSelectable = true;
+                createPlaylistCreateButton.IsEnabled = true;
+            }
+            if(searchText.Length > 64)
+            {
+                Notification.MakeToast("Maximum number of characters reached.", Notification.ToastCenter).Post(Notification.ToastShort);
+                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")
+            {
+                ThemeChangeSensitive = true,
+            };
+            createPlaylistCancelButton.TextLabel.FontStyle = UIFontStyles.AllNormal;
+            createPlaylistCancelButton.IsSelectable = true;
+            createPlaylistCancelButton.Clicked += CreatePlaylistCancelButtonClicked;
+
+            createPlaylistCreateButton = new Button()
+            {
+                Text = "Create",
+            };
+            createPlaylistCreateButton.TextLabel.FontStyle = UIFontStyles.AllNormal;
+            createPlaylistCreateButton.IsSelectable = true;
+            createPlaylistCreateButton.Clicked += CreatePlaylistCreateButtonClicked;
+        }
+
+        private void CreatePlaylistCancelButtonClicked(object sender, ClickedEventArgs e)
+        {
+            RemoveTheCreatePopup();
+        }
+
+        private void CreatePlaylistCreateButtonClicked(object sender, ClickedEventArgs e)
+        {
+            if (viewModel.CheckPlayListName(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;
+            }
+            else
+            {
+                Notification.MakeToast("Playlist name already in use.", Notification.ToastCenter).Post(Notification.ToastShort);
+                underText.Text = "Playlist name already in use.";
+            }
+        }
+
+        protected override void Dispose(DisposeTypes type)
+        {
+            if (Disposed)
+            {
+                return;
+            }
+            if (type == DisposeTypes.Explicit)
+            {
+                selectPlaylistDialog?.Dispose();
+                selectPlaylistDialog = null;
+                createPlaylistDialog?.Dispose();
+                createPlaylistDialog = null;
+
+                searchBox?.Remove(textField);
+                textField?.Dispose();
+                textField = null;
+                searchBox?.Remove(crossButton);
+                crossButton?.Dispose();
+                crossButton = null;
+
+                if(selectPlaylistContentArea != null)
+                {
+                    List<View> children = selectPlaylistContentArea.Children;
+                    foreach(View child in children)
+                    {
+                        selectPlaylistContentArea.Remove(child);
+                        child?.Dispose();
+                    }
+                    selectPlaylistContentArea.Dispose();
+                }
+                if (createPlaylistContentArea != null)
+                {
+                    List<View> children = createPlaylistContentArea.Children;
+                    foreach (View child in children)
+                    {
+                        createPlaylistContentArea.Remove(child);
+                        child?.Dispose();
+                    }
+                    createPlaylistContentArea.Dispose();
+                    createPlaylistContentArea = null;
+                }
+
+                createNewPlaylistButton = null;
+                collectionView?.Dispose();
+                collectionView = null;
+                noListText?.Dispose();
+                noListText = null;
+                searchBox = null;
+                underText = null;
+
+                selectPlaylistCancelButton?.Dispose();
+                selectPlaylistCancelButton = null;
+                createPlaylistCancelButton?.Dispose();
+                createPlaylistCancelButton = null;
+                createPlaylistCreateButton?.Dispose();
+                createPlaylistCreateButton = null;
+
+            }
+            base.Dispose(type);
+        }
+
+        public void DeleteSelectorView()
+        {
+            Dispose(DisposeTypes.Explicit);
+        }
+
+        public CollectionView GetCollectionView()
+        {
+            return collectionView;
+        }
+
+        public void RemoveTheSelectPopup()
+        {
+            Window.Instance.Remove(selectPlaylistDialog);
+        }
+
+        public void RemoveTheCreatePopup()
+        {
+            Window.Instance.Remove(createPlaylistDialog);
+        }
+    }
+}
index 3a6ed41bfffc31dfdd362276b73e51929af9eff7..3cab90c7b39cc107766d7d70dc77df5fb8a8aec5 100755 (executable)
@@ -122,12 +122,14 @@ namespace MusicPlayer.Views
             };
             Button searchButton = new Button(searchButtonStyle)
             {
+                Name = "searchbutton",
                 Size2D = new Size2D(40, 40),
                 Margin = new Extents(24, 0, 10, 10),
                 Position2D = new Position2D(24, 10),
             };
             textField = new TextField()
             {
+                Name="Textfield",
                 Size2D = new Size2D(460, 40),
                 BackgroundColor = Color.White,
                 Position2D = new Position2D(88, 10),
@@ -150,6 +152,7 @@ namespace MusicPlayer.Views
 
             crossButton = new Button(crossButtonStyle)
             {
+                Name = "crossButton",
                 Size2D = new Size2D(48, 48),
                 Margin = new Extents(24, 0, 6, 6),
                 Position2D = new Position2D(572, 6),
@@ -188,6 +191,7 @@ namespace MusicPlayer.Views
         private void BackButtonClicked(object sender, ClickedEventArgs e)
         {
             Window.Instance.Remove(this);
+            //DeleteSearchView();
         }
 
         private void AddCollectionView()
@@ -254,6 +258,7 @@ namespace MusicPlayer.Views
                 {
                     Track currentTrack = searchModel.TrackDetail;
                     viewModel.PlayTrack(currentTrack);
+                    //DeleteSearchView();
                 }
             }
         }
@@ -314,6 +319,11 @@ namespace MusicPlayer.Views
             }
         }
 
+        public void DeleteSearchView()
+        {
+            Dispose(DisposeTypes.Explicit);
+        }
+
         protected override void Dispose(DisposeTypes type)
         {
             if (Disposed)
@@ -327,8 +337,10 @@ namespace MusicPlayer.Views
                     List<View> children = searchBox.Children;
                     foreach (View child in children)
                     {
+                        //TODO CHECK
+                        Tizen.Log.Debug(AppConstants.LogTag, "child info " + child.Name);
                         searchBox.Remove(child);
-                        child.Dispose();
+                        child?.Dispose();
                     }
                     textField = null;
                     crossButton = null;
@@ -340,7 +352,7 @@ namespace MusicPlayer.Views
                     foreach (View child in children)
                     {
                         topView.Remove(child);
-                        child.Dispose();
+                        child?.Dispose();
                     }
                     backButton = null;
                     searchBox = null;
index 903cd30f696f4a55b7596e2a929a545efa1fe185..86b77370c7d9807d63a21a8af5154ba22140575e 100755 (executable)
@@ -62,10 +62,15 @@ namespace MusicPlayer.Views
             AddSelAllViewElements();
             collectionView = AddCollectionView();
             itemCount = 0;
-
+            TouchEvent += SelectorViewTouchEvent;
             Window.Instance.Add(this);
         }
 
+        private bool SelectorViewTouchEvent(object source, TouchEventArgs e)
+        {
+            return false;
+        }
+
         public List<string> SelectedItemList => selectedItemList;
 
         private Button CreateButton(string url, int x, int y)
@@ -160,8 +165,9 @@ namespace MusicPlayer.Views
             {
                 int sharedItems = viewModel.ShareMediaList(SelectedItemList);
                 Tizen.Log.Debug(AppConstants.LogTag, "Total shared items: " + sharedItems);
+                ClearSelectionAndRemove();
             }
-            else
+            else if (currentViewType == OperationViewType.Delete)
             {
                 if (typeof(T) == typeof(PlaylistModel))
                 {
@@ -173,8 +179,32 @@ namespace MusicPlayer.Views
                     int tracksDeleted = TrackDataProvider.DeleteTrackList(SelectedItemList);
                     Tizen.Log.Debug(AppConstants.LogTag, "Total tracks deleted: " + tracksDeleted);
                 }
+                ClearSelectionAndRemove();
+            }
+            else if (currentViewType == OperationViewType.AddToPlaylist)
+            {
+                PlaylistSelectorViewModel playlistSelectorViewModel = viewModel.GetPlaylistSelectorViewModel();
+                PlaylistSelectorView playlistSelectorView = new PlaylistSelectorView(playlistSelectorViewModel);
+                if (playlistSelectorView.GetCollectionView() != null)
+                {
+                    playlistSelectorView.GetCollectionView().SelectionChanged += (object sender, SelectionChangedEventArgs e) =>
+                    {
+                        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();
         }
 
         private void ClearSelectionAndRemove()
index 512d8a1a48ce2e68d6af0925c016857d4c433a79..bca9791c0eedb8bd5fb169c86a2a310c63f59246 100755 (executable)
@@ -162,6 +162,8 @@ namespace MusicPlayer.Views
         private void OnAddToPlaylistClick(object sender, ClickedEventArgs e)\r
         {\r
             DismissMoreMenu();\r
+            OperationViewAddEventArgs operationEventArgs = new OperationViewAddEventArgs(OperationViewType.AddToPlaylist, ContentViewType.Track, viewModel.ListViewModel);\r
+            OnOperationViewAdd(operationEventArgs);\r
         }\r
     }\r
 }\r
index f198680be23fe2f01393f822aed9200082c1fd35..57ad2b03ad957c9ee2ab85b794bf8ab60dd36b65 100755 (executable)
@@ -38,11 +38,12 @@ namespace MusicPlayer.Views.Utils
                 case OperationViewType.Share:
                     Tizen.Log.Info(AppConstants.LogTag, "Creationg Share View");
                     SelectorViewModel<Track> shareViewModel = new SelectorViewModel<Track>((ListViewModel<Track>)viewModelData);
-                    SelectorView<Track> seachView = new SelectorView<Track>(OperationViewType.Share, shareViewModel);
-                    view = seachView;
+                    SelectorView<Track> shareView = new SelectorView<Track>(OperationViewType.Share, shareViewModel);
+                    view = shareView;
                     break;
                 case OperationViewType.AddToPlaylist:
                     Tizen.Log.Info(AppConstants.LogTag, "Creationg AddtoPlaylist View");
+                    view = CreateAddToPlaylistView(viewType, viewModelData);
                     break;
             }
             return view;
@@ -66,14 +67,35 @@ namespace MusicPlayer.Views.Utils
                     deleteView = new SelectorView<MusicAlbum>(OperationViewType.Delete, albumViewModel);
                     break;
                 case ContentViewType.Artist:
-                    SelectorViewModel<PlaylistData> artistViewModel = new SelectorViewModel<PlaylistData>((ListViewModel<PlaylistData>)viewModelData);
-                    deleteView = new SelectorView<PlaylistData>(OperationViewType.Delete, artistViewModel);
+                    SelectorViewModel<Artist> artistViewModel = new SelectorViewModel<Artist>((ListViewModel<Artist>)viewModelData);
+                    deleteView = new SelectorView<Artist>(OperationViewType.Delete, artistViewModel);
                     break;
             }
             return deleteView;
         }
 
-        public SearchView CreateSeachView()
+        private View CreateAddToPlaylistView(ContentViewType type, object viewModelData)
+        {
+            View addToPlaylistView = null;
+            switch (type)
+            {
+                case ContentViewType.Track:
+                    SelectorViewModel<Track> trackViewModel = new SelectorViewModel<Track>((ListViewModel<Track>)viewModelData);
+                    addToPlaylistView = new SelectorView<Track>(OperationViewType.AddToPlaylist, trackViewModel);
+                    break;
+                case ContentViewType.Album:
+                    SelectorViewModel<MusicAlbum> albumViewModel = new SelectorViewModel<MusicAlbum>((ListViewModel<MusicAlbum>)viewModelData);
+                    addToPlaylistView = new SelectorView<MusicAlbum>(OperationViewType.AddToPlaylist, albumViewModel);
+                    break;
+                case ContentViewType.Artist:
+                    SelectorViewModel<Artist> artistViewModel = new SelectorViewModel<Artist>((ListViewModel<Artist>)viewModelData);
+                    addToPlaylistView = new SelectorView<Artist>(OperationViewType.AddToPlaylist, artistViewModel);
+                    break;
+            }
+            return addToPlaylistView;
+        }
+
+        public SearchView CreateSearchView()
         {
             SearchViewModel viewModel = new SearchViewModel();
             SearchView searchView = new SearchView(viewModel);
index e88c21140dcf462ccfa98766af09ed1ae7b669be..937a75b020eedd30e273800baba3981ac57776ea 100755 (executable)
@@ -46,7 +46,7 @@ namespace MusicPlayer.Views.Utils
 
         public SearchView CreateSearchView()
         {
-            return operationViewFactory.CreateSeachView();
+            return operationViewFactory.CreateSearchView();
         }
 
     }
index e296e0ccb9ed3d4dc90822a8b3e0c5d4433548e7..a673ac55d0f623c977f9247fe31dc11b8998e4b1 100755 (executable)
@@ -17,6 +17,7 @@ namespace MusicPlayer.Views
         private ViewLibrary viewLibrary;
         private View rootView;
         private  BaseView baseView;
+        private SearchView searchView;
         private static string[] TabNames = new string[]
         {
             "Playlists",
@@ -120,8 +121,18 @@ namespace MusicPlayer.Views
 
         private void OnSearchIconClicked(object sender, ClickedEventArgs e)
         {
-            SearchView searchView = viewLibrary.CreateSearchView();
-            searchView.LaunchDetailView += OnSubViewAdded;
+            searchView = viewLibrary.CreateSearchView();
+            if (searchView != null)
+            {
+                searchView.LaunchDetailView += OnSubViewAddedFromSearch;
+            }
+        }
+
+        private void OnSubViewAddedFromSearch(object sender, SubContentViewAddEventArgs subViewAddEventArgs)
+        {
+            BaseSubContentView baseSubContentView = viewLibrary.GetSubContentView(subViewAddEventArgs.SubViewType, subViewAddEventArgs.ViewModelData);
+            baseView.AddSubViewContent(subViewAddEventArgs.TitleText, baseSubContentView);
+            //searchView.DeleteSearchView();
         }
 
         private void OnSubViewAdded(object sender, SubContentViewAddEventArgs subViewAddEventArgs)
diff --git a/music-player/res/images/dark/cross_button.png b/music-player/res/images/dark/cross_button.png
new file mode 100755 (executable)
index 0000000..485e376
Binary files /dev/null and b/music-player/res/images/dark/cross_button.png differ
index 10bf4a0060c4a62fb773a64209defc7fa6b365af..4722a1ead4102f40cd3ffa4137f3bce827be77a2 100755 (executable)
@@ -18,6 +18,7 @@
         <privilege>http://tizen.org/privilege/display</privilege>
         <privilege>http://tizen.org/privilege/content.write</privilege>
         <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
+        <privilege>http://tizen.org/privilege/window.priority.set</privilege>
     </privileges>
     <dependencies />
     <provides-appdefined-privileges />
index cd9a4e4cecef48d3e181777788a6e261184e9c69..aff9ba58966ef691796bda868232840f9ac76d86 100755 (executable)
Binary files a/packaging/org.tizen.MusicPlayer-1.0.0.tpk and b/packaging/org.tizen.MusicPlayer-1.0.0.tpk differ