Added Play/Pause icon for TrackView and PlaylistDetails. 59/269459/2 accepted/tizen/unified/20220117.134938 submit/tizen/20220114.150346
authorshivamv <shivam.v2@samsung.com>
Fri, 14 Jan 2022 13:08:30 +0000 (18:38 +0530)
committershivamv <shivam.v2@samsung.com>
Fri, 14 Jan 2022 13:55:46 +0000 (19:25 +0530)
Change-Id: I83157c3bea9e9c23454600d90d94471eae9a7385
Signed-off-by: shivamv <shivam.v2@samsung.com>
13 files changed:
music-player/Core/CurrentPlayingTrack.cs
music-player/Core/PlaybackHelper.cs
music-player/Models/Track.cs
music-player/ViewModels/PlayerViewModel.cs
music-player/ViewModels/PlaylistDetailViewModel.cs
music-player/ViewModels/TrackViewModel.cs
music-player/Views/ListItemLayout.cs
music-player/Views/PlayingListView.cs
music-player/Views/PlaylistDetailView.cs
music-player/Views/TrackView.cs
music-player/res/images/pause_icon.png [new file with mode: 0755]
music-player/res/images/play_icon.png [new file with mode: 0755]
packaging/org.tizen.MusicPlayer-1.0.0.tpk

index 41dd087c028f4ceb034cec3d4a2290f98a726f78..c32a9d4d1793220ef83d5b56726018981fdbdb2e 100755 (executable)
@@ -17,15 +17,28 @@ namespace MusicPlayer.Core
 
         public string CurrentTrackId { get; private set; }
     }
+
+    class PlayingStatusEventHandlerArgs : EventArgs
+    {
+        public PlayingStatusEventHandlerArgs(bool playingStatus)
+        {
+            CurrentPlayingStatus = playingStatus;
+        }
+
+        public bool CurrentPlayingStatus { get; private set; }
+    }
+
     class CurrentPlayingTrack
     {
         private static readonly CurrentPlayingTrack instance = new CurrentPlayingTrack();
 
         public event EventHandler<PlayingTrackEventHandlerArgs> PlayingTrackChanged;
+        public event EventHandler<PlayingStatusEventHandlerArgs> PlayingStatusChanged;
 
         public CurrentPlayingTrack()
         {
             MediaId = null;
+            PlayingStatus = false;
         }
 
         public static CurrentPlayingTrack Instance
@@ -35,11 +48,20 @@ namespace MusicPlayer.Core
 
         public string MediaId { get; private set; }
 
+        public bool PlayingStatus { get; private set; }
+
         public void SetMediaId(string id)
         {
             MediaId = id;
             Tizen.Log.Info(AppConstants.LogTag, "Updating Current track");
             PlayingTrackChanged?.Invoke(this, new PlayingTrackEventHandlerArgs(id));
         }
+
+        public void SetPlayingStatus(bool newStatus)
+        {
+            PlayingStatus = newStatus;
+            Tizen.Log.Info(AppConstants.LogTag, "Updating Current track playing status");
+            PlayingStatusChanged?.Invoke(this, new PlayingStatusEventHandlerArgs(newStatus));
+        }
     }
 }
index 9b294025c5604846c3f6a01a02f19bc2f096abba..344239ab7726e8709b8b7eb95e3887a5a660d17f 100755 (executable)
@@ -104,6 +104,11 @@ namespace MusicPlayer.Core
             playerViewModel.SetRepeatAndShuffle(Common.RepeatMode.Off, Common.ShuffleMode.Off);
         }
 
+        public void ChangePlayingStatus()
+        {
+            playerViewModel.PlayingStatusChanged();
+        }
+
         private void OnBackKeyPressed(object sender, EventArgs e)
         {
             HidePlayer();
index 982f6f53c23729227b7dbddd2ec5b19496e5003e..c72e1f8c52ea819cca6060ec78c97c800671165f 100755 (executable)
@@ -122,5 +122,13 @@ namespace MusicPlayer.Models
             get => isPlaying;\r
             set => SetProperty(ref isPlaying, value);\r
         }\r
+\r
+        private bool playingStatus;\r
+\r
+        public bool PlayingStatus\r
+        {\r
+            get => playingStatus;\r
+            set => SetProperty(ref playingStatus, value);\r
+        }\r
     }\r
 }\r
index b86cbf670f35c1cff0cfe2d862151fc63b7ec276..4789dbf8eaef2c220de38f54ce1c232bc6189b6e 100755 (executable)
@@ -332,12 +332,14 @@ namespace MusicPlayer.ViewModels
             {
                 case PlayingStatus.Playing:
                     PlayButtonState = PauseState;
+                    CurrentPlayingTrack.Instance.SetPlayingStatus(true);
                     lyricsViewModel.UpdateTrackThumbState(AnimationState.AnimationPlay);
                     break;
                 case PlayingStatus.Paused:  // Fall Through
                 case PlayingStatus.Stopped: // Fall Through
                 case PlayingStatus.None:
                     PlayButtonState = PlayState;
+                    CurrentPlayingTrack.Instance.SetPlayingStatus(false);
                     lyricsViewModel.UpdateTrackThumbState(AnimationState.AnimationPause);
                     break;
             }
index 13fee6401f82472c4af7280e5d45f932c9ca64b2..4ce3281296abe6417768737429bfa2e24b0ea9c7 100755 (executable)
@@ -26,6 +26,22 @@ namespace MusicPlayer.ViewModels
             PlaylistTrackCount = listViewModel.Count.ToString();
             ListViewModel.CollectionChanged += OnCollectionChanged;
             CurrentPlayingTrack.Instance.PlayingTrackChanged += OnPlayingTrackChanged;
+            CurrentPlayingTrack.Instance.PlayingStatusChanged += OnPlayingStatusChanged;
+        }
+
+        private void OnPlayingStatusChanged(object sender, PlayingStatusEventHandlerArgs e)
+        {
+            string currentTrackId = CurrentPlayingTrack.Instance.MediaId;
+            if (currentTrackId != null)
+            {
+                foreach (Track item in listViewModel)
+                {
+                    if (currentTrackId == item.Id)
+                    {
+                        item.PlayingStatus = e.CurrentPlayingStatus;
+                    }
+                }
+            }
         }
 
         private void OnPlayingTrackChanged(object sender, PlayingTrackEventHandlerArgs e)
@@ -126,6 +142,7 @@ namespace MusicPlayer.ViewModels
         private void UpdatePlayingTrack()
         {
             string currentTrackId = CurrentPlayingTrack.Instance.MediaId;
+            bool currentPlayingStatus = CurrentPlayingTrack.Instance.PlayingStatus;
             string oldTrackId = null;
             if (PlayingTrack != null)
             {
@@ -143,6 +160,7 @@ namespace MusicPlayer.ViewModels
                     if (currentTrackId == item.Id)
                     {
                         item.IsPlaying = true;
+                        item.PlayingStatus = currentPlayingStatus;
                         PlayingTrack = item;
                     }
                 }
index 88d013c35a4f4f34e1cee1b5f7d4064a253c4aa7..39eb881820c73798c83135101d7b7ec6eac8af8f 100755 (executable)
@@ -17,6 +17,23 @@ namespace MusicPlayer.ViewModels
             listViewModel.CollectionChanged += OnCollectionChanged;\r
             TrackCount = listViewModel.Count.ToString();\r
             CurrentPlayingTrack.Instance.PlayingTrackChanged += OnPlayingTrackChanged;\r
+            CurrentPlayingTrack.Instance.PlayingStatusChanged += OnPlayingStatusChanged;\r
+        }\r
+\r
+        private void OnPlayingStatusChanged(object sender, PlayingStatusEventHandlerArgs e)\r
+        {\r
+            string currentTrackId = CurrentPlayingTrack.Instance.MediaId;\r
+            if (currentTrackId != null)\r
+            {\r
+                foreach (Track item in listViewModel)\r
+                {\r
+                    if (currentTrackId == item.Id)\r
+                    {\r
+                        item.PlayingStatus = e.CurrentPlayingStatus;\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
         }\r
 \r
         private void OnPlayingTrackChanged(object sender, PlayingTrackEventHandlerArgs e)\r
@@ -82,6 +99,7 @@ namespace MusicPlayer.ViewModels
             }\r
             PlayingTrack = null;\r
             string currentTrackId = CurrentPlayingTrack.Instance.MediaId;\r
+            bool currentPlayingStatus = CurrentPlayingTrack.Instance.PlayingStatus;\r
             if (currentTrackId != null)\r
             {\r
                 foreach (Track item in listViewModel)\r
@@ -89,6 +107,7 @@ namespace MusicPlayer.ViewModels
                     if (currentTrackId == item.Id)\r
                     {\r
                         item.IsPlaying = true;\r
+                        item.PlayingStatus = currentPlayingStatus;\r
                         PlayingTrack = item;\r
                         break;\r
                     }\r
index 982cdd604b988534a2dc7348c3c8dcf72305e4f6..1fe5f06c4285e7d54d3f1dfabad6267649af4fa0 100755 (executable)
@@ -3,6 +3,7 @@ using Tizen.NUI.BaseComponents;
 using Tizen.NUI;\r
 using Tizen.NUI.Binding;\r
 using MusicPlayer.Common;\r
+using MusicPlayer.Core;\r
 \r
 namespace MusicPlayer.Views\r
 {\r
@@ -10,6 +11,7 @@ namespace MusicPlayer.Views
     {\r
         private static int Width = 1792;\r
         private static int Height = 108;\r
+        private static bool AnimationRequired;\r
 \r
         private const int IconSize = 64;\r
         private const int LayoutMargin = 16;\r
@@ -22,7 +24,9 @@ namespace MusicPlayer.Views
         private TextLabel titleLabel;\r
         private TextLabel subtitleLabel;\r
         private ImageView icon;\r
+        private Button playPauseIcon;\r
         private bool isAnimating = false;\r
+        private bool isPlayingStatus = false;\r
 \r
         public static readonly BindableProperty IsPlayingProperty = BindableProperty.Create(nameof(IsPlaying), typeof(bool), typeof(ListItemLayout), false, propertyChanged: (bindable, oldValue, newValue) =>\r
         {\r
@@ -39,11 +43,27 @@ namespace MusicPlayer.Views
         },\r
         defaultValueCreator: (bindable) => ((ListItemLayout)bindable).isPlaying);\r
 \r
-        public ListItemLayout(int width = 1792, int height = 108) : base()\r
+        public static readonly BindableProperty PlayingStatusProperty = BindableProperty.Create(nameof(PlayingStatus), typeof(bool), typeof(ListItemLayout), false, propertyChanged: (bindable, oldValue, newValue) =>\r
+        {\r
+            var instance = (ListItemLayout)bindable;\r
+            if (newValue != null)\r
+            {\r
+                bool newPlayingStatus = (bool)newValue;\r
+                bool oldPlayingStatus = (bool)oldValue;\r
+                if (oldPlayingStatus != newPlayingStatus)\r
+                {\r
+                    instance.UpdatePlayingStatus(newPlayingStatus);\r
+                }\r
+            }\r
+        },\r
+defaultValueCreator: (bindable) => ((ListItemLayout)bindable).playingStatus);\r
+\r
+        public ListItemLayout(bool animationRequired = false, int width = 1792, int height = 108) : base()\r
         {\r
             base.OnInitialize();\r
             Width = width;\r
             Height = height;\r
+            AnimationRequired = animationRequired;\r
             WidthSpecification = Width;\r
             HeightSpecification = Height;\r
             Size2D = new Size2D(Width, Height);\r
@@ -111,6 +131,14 @@ namespace MusicPlayer.Views
             set => SetValue(IsPlayingProperty, value);\r
         }\r
 \r
+        private bool playingStatus = false;\r
+\r
+        public bool PlayingStatus\r
+        {\r
+            get => (bool)GetValue(PlayingStatusProperty);\r
+            set => SetValue(PlayingStatusProperty, value);\r
+        }\r
+\r
         protected override void Dispose(DisposeTypes type)\r
         {\r
             if(Disposed)\r
@@ -144,30 +172,48 @@ namespace MusicPlayer.Views
         {\r
             if(currentValue)\r
             {\r
-                Tizen.Log.Error(AppConstants.LogTag, "Adding animation and setting highlight color");\r
+                Tizen.Log.Error(AppConstants.LogTag, "Adding animation/play-pause icon and setting highlight color");\r
                 if(titleLabel != null && subtitleLabel != null)\r
                 {\r
                     titleLabel.TextColor = UIColors.HEX1473E6;\r
                     subtitleLabel.TextColor = UIColors.HEX1473E6;\r
                 }\r
-                if(isAnimating == false)\r
+                if(AnimationRequired == true && isAnimating == false)\r
                 {\r
                     isAnimating = AddAnimation();\r
                 }\r
+                else if(AnimationRequired == false && isPlayingStatus == false )\r
+                {\r
+                    isPlayingStatus = AddPlayingStatus();\r
+                }\r
             }\r
             else\r
             {\r
-                Tizen.Log.Error(AppConstants.LogTag, "Remove animation and setting normal color");\r
+                Tizen.Log.Error(AppConstants.LogTag, "Remove animation/play-pause icon and setting normal color");\r
                 UpdateLabelColors();\r
-                if(isAnimating)\r
+                if(AnimationRequired == true && isAnimating)\r
                 {\r
                     RemoveAnimation();\r
                     isAnimating = false;\r
                 }\r
+                else if(AnimationRequired == false && isPlayingStatus == true)\r
+                {\r
+                    RemovePlayingStatus();\r
+                    isPlayingStatus = false;\r
+                }\r
             }\r
             isPlaying = currentValue;\r
         }\r
 \r
+        private void UpdatePlayingStatus(bool currentValue)\r
+        {\r
+            if (isPlayingStatus == true)\r
+            {\r
+                playPauseIcon.IconURL = currentValue ? Resources.GetImagePath() + "pause_icon.png" : Resources.GetImagePath() + "play_icon.png";\r
+            }\r
+            playingStatus = currentValue;\r
+        }\r
+\r
         private void OnThemeUpdated(object sender, ThemeChangedEventArgs e)\r
         {\r
             if(e.IsPlatformThemeChanged && IsPlaying == false)\r
@@ -228,5 +274,41 @@ namespace MusicPlayer.Views
                 }\r
             }\r
         }\r
+\r
+        private bool AddPlayingStatus()\r
+        {\r
+            if (icon == null)\r
+            {\r
+                return false;\r
+            }\r
+            ButtonStyle buttonStyle = new ButtonStyle()\r
+            {\r
+                Icon = new ImageViewStyle()\r
+                {\r
+                    ResourceUrl = Resources.GetImagePath() + "play_icon.png",\r
+                },\r
+            };\r
+            playPauseIcon = new Button(buttonStyle);\r
+            playPauseIcon.Clicked += (object sender, ClickedEventArgs e) =>\r
+            {\r
+                PlaybackHelper.Instance.ChangePlayingStatus();\r
+            };\r
+            icon.Add(playPauseIcon);\r
+            return true;\r
+        }\r
+\r
+        private void RemovePlayingStatus()\r
+        {\r
+            if (icon != null)\r
+            {\r
+                View child = icon.GetChildAt(0);\r
+                if (child != null && child is Button)\r
+                {\r
+                    icon.Remove(child);\r
+                    Button playPauseIcon = child as Button;\r
+                    playPauseIcon.Dispose();\r
+                }\r
+            }\r
+        }\r
     }\r
 }\r
index 6d43bfe2d014363af036344cdebc19040fbd106f..4e56f5eb334af1a182920a9045e4f071aeda870e 100755 (executable)
@@ -26,7 +26,7 @@ namespace MusicPlayer.Views
                 ItemsLayouter = new LinearLayouter(),
                 ItemTemplate = new DataTemplate(() =>
                 {
-                    ListItemLayout layout = new ListItemLayout(832, 108);
+                    ListItemLayout layout = new ListItemLayout(true, 832, 108);
                     layout.Icon.SetBinding(ImageView.ResourceUrlProperty, "ThumbnailPath");
                     layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle");
                     layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName");
index 17198785acc47d153bbf28fbb0d7c34cdc3cdf3b..aa84874f5d7216becd4b84a6d9e2d61de6062bf0 100755 (executable)
@@ -27,6 +27,7 @@ namespace MusicPlayer.Views
                 layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle");
                 layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName");
                 layout.SetBinding(ListItemLayout.IsPlayingProperty, "IsPlaying");
+                layout.SetBinding(ListItemLayout.PlayingStatusProperty, "PlayingStatus");
                 return layout;
             });
             collectionView.SelectionChanged += OnTrackSelection;
index be45689bb48cf22e4a3f3eabe541f05e02fa0f8c..07d38fe137a1b0e15c2bf5846430edac6d68cf8a 100755 (executable)
@@ -30,6 +30,7 @@ namespace MusicPlayer.Views
                 layout.TitleLabel.SetBinding(TextLabel.TextProperty, "TrackTitle");\r
                 layout.SubtitleLabel.SetBinding(TextLabel.TextProperty, "ArtistName");\r
                 layout.SetBinding(ListItemLayout.IsPlayingProperty, "IsPlaying");\r
+                layout.SetBinding(ListItemLayout.PlayingStatusProperty, "PlayingStatus");\r
                 return layout;\r
             });\r
             collectionView.ScrollingDirection = ScrollableBase.Direction.Vertical;\r
diff --git a/music-player/res/images/pause_icon.png b/music-player/res/images/pause_icon.png
new file mode 100755 (executable)
index 0000000..a1a3d69
Binary files /dev/null and b/music-player/res/images/pause_icon.png differ
diff --git a/music-player/res/images/play_icon.png b/music-player/res/images/play_icon.png
new file mode 100755 (executable)
index 0000000..bc99c17
Binary files /dev/null and b/music-player/res/images/play_icon.png differ
index 483101e0fc92687722d02493c5ff27ecaa017613..592e63f3ca7c1c6887ec61026c12b5b1ff493345 100755 (executable)
Binary files a/packaging/org.tizen.MusicPlayer-1.0.0.tpk and b/packaging/org.tizen.MusicPlayer-1.0.0.tpk differ