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
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));
+ }
}
}
playerViewModel.SetRepeatAndShuffle(Common.RepeatMode.Off, Common.ShuffleMode.Off);
}
+ public void ChangePlayingStatus()
+ {
+ playerViewModel.PlayingStatusChanged();
+ }
+
private void OnBackKeyPressed(object sender, EventArgs e)
{
HidePlayer();
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
{
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;
}
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)
private void UpdatePlayingTrack()
{
string currentTrackId = CurrentPlayingTrack.Instance.MediaId;
+ bool currentPlayingStatus = CurrentPlayingTrack.Instance.PlayingStatus;
string oldTrackId = null;
if (PlayingTrack != null)
{
if (currentTrackId == item.Id)
{
item.IsPlaying = true;
+ item.PlayingStatus = currentPlayingStatus;
PlayingTrack = item;
}
}
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
}\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
if (currentTrackId == item.Id)\r
{\r
item.IsPlaying = true;\r
+ item.PlayingStatus = currentPlayingStatus;\r
PlayingTrack = item;\r
break;\r
}\r
using Tizen.NUI;\r
using Tizen.NUI.Binding;\r
using MusicPlayer.Common;\r
+using MusicPlayer.Core;\r
\r
namespace MusicPlayer.Views\r
{\r
{\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
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
},\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
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
{\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
}\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
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");
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;
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