Implements context popup of music list item 79/138379/4
authorJH Choi <jjie.choi@samsung.com>
Wed, 12 Jul 2017 04:34:39 +0000 (13:34 +0900)
committerJH Choi <jjie.choi@samsung.com>
Wed, 12 Jul 2017 08:07:42 +0000 (17:07 +0900)
Changed no album cover image

Change-Id: I43467486822cb7e982e37c3907329211573b33f1
Signed-off-by: JH Choi <jjie.choi@samsung.com>
TVMediaHub/TVMediaHub.Tizen/TVMediaHub.Tizen.csproj
TVMediaHub/TVMediaHub.Tizen/TVMediaHub.Tizen.nuget.targets [changed mode: 0755->0644]
TVMediaHub/TVMediaHub.Tizen/Views/MusicGroup.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicItem.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicTab.xaml
TVMediaHub/TVMediaHub.Tizen/Views/MusicTab.xaml.cs
TVMediaHub/TVMediaHub.Tizen/res/img_music_nocover.png [new file with mode: 0644]

index a8cb4bb..b362460 100755 (executable)
     <Content Include="res\img_media_no_contents.png" />
     <Content Include="res\img_movie_unavailable.png" />
     <Content Include="res\img_music_list_focused_shadow.9.png" />
+    <Content Include="res\img_music_nocover.png" />
     <Content Include="res\img_photozoom_gradient.9.png" />
     <Content Include="res\img_stroke.9.png" />
     <Content Include="res\img_stroke2.9.png" />
index 2cb3fdd..0e221f6 100755 (executable)
  * limitations under the License.
  */
 
-using System;
 using System.Collections.Generic;
 using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows.Input;
+using TVMediaHub.Tizen.DataModels;
 using TVMediaHub.Tizen.Models;
 using TVMediaHub.Tizen.Utils;
 using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
 using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
+using Xamarin.Forms.Xaml;
+using static TVMediaHub.Tizen.Views.MusicItem;
 
 namespace TVMediaHub.Tizen.Views
 {
@@ -83,6 +81,24 @@ namespace TVMediaHub.Tizen.Views
         public List<Button> RightFocusList { get; protected set; }
 
         /// <summary>
+        /// A delegate will be executed when the context popup item selected
+        /// </summary>
+        /// <param name="info">A clicked item's MediaInformation</param>
+        /// <param name="item">A clicked context popup item</param>
+        public delegate void ContextPopupItemSelectedEventHandler(MediaInformationEx info, MusicContextPopupItem item);
+
+        /// <summary>
+        /// A ContextPopupItemSelectedEventHandler for select event of context popup
+        /// </summary>
+        public ContextPopupItemSelectedEventHandler ContextPopupItemSelectedHandler;
+
+
+        /// <summary>
+        /// The focused MusicItem in this group
+        /// </summary>
+        private MusicItem focusedItem;
+
+        /// <summary>
         /// A constructor
         /// </summary>
         public MusicGroup()
@@ -150,11 +166,20 @@ namespace TVMediaHub.Tizen.Views
                     itemView.OnFocusedEventHandler += (se, ev) =>
                     {
                         GroupContentArea.RaiseChild(itemView);
+                        focusedItem = itemView;
+                    };
+                    itemView.OnUnfocusedEventHandler += (se, ev) =>
+                    {
+                        focusedItem = null;
                     };
                     itemView.OnItemClickedHandler += (info) =>
                     {
                         ItemClickCommand?.Execute(info);
                     };
+                    itemView.ContextPopupItemSelectedHandler += (info, selectedItem) =>
+                    {
+                        ContextPopupItemSelectedHandler?.Invoke(info, selectedItem);
+                    };
 
                     GroupContentArea.Children.Add(itemView, index / 4, index % 4);
                     ChildrenFocusList.Add(itemView.GetFocusArea());
@@ -263,5 +288,20 @@ namespace TVMediaHub.Tizen.Views
                 }
             }
         }
+
+        /// <summary>
+        /// If there is focused image item, notify the menu key pressed event to focused music item for show context popup
+        /// </summary>
+        /// <returns>If group has a focused item, true; otherwise, false</returns>
+        public bool NotifyMenuKeyPressedToFocusedItem()
+        {
+            if (focusedItem != null)
+            {
+                focusedItem.ShowContextPopup();
+                return true;
+            }
+
+            return false;
+        }
     }
 }
\ No newline at end of file
index e966e2e..d8e6a31 100755 (executable)
@@ -85,6 +85,27 @@ namespace TVMediaHub.Tizen.Views
         private Rectangle TextAreaFocusedBounds;
 
         /// <summary>
+        /// An enumeration for context popup selectable items
+        /// </summary>
+        public enum MusicContextPopupItem
+        {
+            FileInfo = 0,
+            Delete,
+        }
+
+        /// <summary>
+        /// A delegate will be executed when the context popup item selected
+        /// </summary>
+        /// <param name="info">A clicked item's MediaInformation</param>
+        /// <param name="item">A clicked context popup item</param>
+        public delegate void ContextPopupItemSelectedEventHandler(MediaInformationEx info, MusicContextPopupItem item);
+
+        /// <summary>
+        /// A ContextPopupItemSelectedEventHandler for select event of context popup
+        /// </summary>
+        public ContextPopupItemSelectedEventHandler ContextPopupItemSelectedHandler;
+
+        /// <summary>
         /// Gets FocusArea for focus chain
         /// </summary>
         public Button GetFocusArea()
@@ -239,6 +260,7 @@ namespace TVMediaHub.Tizen.Views
             SlideEffect.SetHasSlide(AlbumTitle, false);
             TextBackground.Source = "img_music_list_normal.9.png";
             Shadow.IsVisible = false;
+            OnUnfocusedEventHandler.Invoke(sender, e);
         }
 
         /// <summary>
@@ -251,13 +273,53 @@ namespace TVMediaHub.Tizen.Views
             if (e.PropertyName.Equals("MusicInfo"))
             {
                 AudioInformation info = MusicInfo.MediaContentInformation as AudioInformation;
-                AlbumCover.Source = !(string.IsNullOrEmpty(info.ThumbnailPath)) ? info.ThumbnailPath : "img_media_no_contents.png";
+                AlbumCover.Source = !(string.IsNullOrEmpty(info.ThumbnailPath)) ? info.ThumbnailPath : "img_music_nocover.png";
 
                 SongTitle.Text = info.Title;
                 Artist.Text = info.Artist;
                 AlbumTitle.Text = info.Album;
             }
         }
+        /// <summary>
+        /// A method showing context popup
+        /// </summary>
+        public void ShowContextPopup()
+        {
+            if (!FocusArea.IsFocused)
+            {
+                return;
+            }
+
+            ContextPopup popup = new ContextPopup();
+
+            popup.Items.Add(new ContextPopupItem("FILE INFO"));
+            popup.Items.Add(new ContextPopupItem("DELETE"));
+            popup.SelectedIndexChanged += SelectedIndexChanged;
+            popup.Show(this, this.Width / 2 - SizeUtils.GetWidthSize(290 - 104), this.Height + SizeUtils.GetHeightSize(72));
+
+        }
+
+        /// <summary>
+        /// This method is called when the context popup item selected
+        /// </summary>
+        /// <param name="sender">The source of the event</param>
+        /// <param name="e">Changed event's argument</param>
+        private void SelectedIndexChanged(object sender, EventArgs e)
+        {
+            var ctxPopup = sender as ContextPopup;
+            switch (ctxPopup.SelectedIndex)
+            {
+                case 0:
+                    ContextPopupItemSelectedHandler?.Invoke(MusicInfo, MusicContextPopupItem.FileInfo);
+                    break;
+                case 1:
+                    ContextPopupItemSelectedHandler?.Invoke(MusicInfo, MusicContextPopupItem.Delete);
+                    break;
+            }
+
+            ctxPopup.Dismiss();
+        }
+
 
     }
 }
index 28b6afc..46c8aba 100755 (executable)
                                       SortOptions="{Binding SortOptions}"
                                       OptionList="{Binding OptionList}" />
         </RelativeLayout>
-        
         <StackLayout x:Name="MusicTabContents"
                      RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.855}"
                      RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=1}"
                      Orientation="Horizontal">
-            <Views:MusicPlayer x:Name="MusicPlayer" />            
+            <Views:MusicPlayer x:Name="MusicPlayer" />
             <ScrollView x:Name="MusicTabScrollView"
                         Orientation="Horizontal"
                         IsVisible="False">
index 36bbfb4..ba6ae7e 100755 (executable)
@@ -19,6 +19,7 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Collections.Specialized;
 using System.Windows.Input;
+using Tizen.Xamarin.Forms.Extension;
 using TVMediaHub.Tizen.Controls;
 using TVMediaHub.Tizen.DataModels;
 using TVMediaHub.Tizen.Models;
@@ -26,6 +27,7 @@ using TVMediaHub.Tizen.Utils;
 using TVMediaHub.Tizen.ViewModels;
 using Xamarin.Forms;
 using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
+using static TVMediaHub.Tizen.Views.MusicItem;
 
 namespace TVMediaHub.Tizen.Views
 {
@@ -299,6 +301,10 @@ namespace TVMediaHub.Tizen.Views
                 MusicContentView.Children.Add(groupView);
                 groupView.BindingContext = groupItem;
                 groupView.SetClickCommand(OnClickCommand);
+                groupView.ContextPopupItemSelectedHandler += (info, item) =>
+                {
+                    ShowPopup(info, item);
+                };
 
                 if (MusicContentView.Children.Count > 1)
                 {
@@ -448,5 +454,88 @@ namespace TVMediaHub.Tizen.Views
             FooterNormal.IsVisible = true;
             FooterDelete.IsVisible = false;
         }
+
+        /// <summary>
+        /// this method is for customizing behavior when the Page becoming visible
+        /// </summary>
+        protected override void OnAppearing()
+        {
+            base.OnAppearing();
+            App.MainWindow.KeyGrab(ElmSharp.EvasKeyEventArgs.PlatformMenuButtonName, false);
+            App.MainWindow.KeyUp += MenuKeyListener;
+        }
+
+        /// <summary>
+        /// this method is for customizing behavior when the Page becoming invisible
+        /// </summary>
+        protected override void OnDisappearing()
+        {
+            base.OnDisappearing();
+            App.MainWindow.KeyUp -= MenuKeyListener;
+            App.MainWindow.KeyUngrab(ElmSharp.EvasKeyEventArgs.PlatformMenuButtonName);
+        }
+
+        /// <summary>
+        /// KeyDown will be triggered when key is menu
+        /// </summary>
+        /// <param name="sender">The object that raised the event</param>
+        /// <param name="e">The information about the event</param>
+        private void MenuKeyListener(object sender, ElmSharp.EvasKeyEventArgs e)
+        {
+            if (e.KeyName.Equals(ElmSharp.EvasKeyEventArgs.PlatformMenuButtonName))
+            {
+                NotifyMenuKeyPressed();
+            }
+        }
+
+        /// <summary>
+        /// A method notifies menu key pressed event
+        /// </summary>
+        private void NotifyMenuKeyPressed()
+        {
+            if (MusicContentView.Children.Count > 0)
+            {
+                foreach (MusicGroup group in MusicContentView.Children)
+                {
+                    if (group.NotifyMenuKeyPressedToFocusedItem())
+                    {
+                        break;
+                    }
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// A method displaying pop-ups
+        /// </summary>
+        /// <param name="info">A focused item's MediaInformation</param>
+        /// <param name="item">A clicked context popup item</param>
+        private async void ShowPopup(MediaInformationEx info, MusicContextPopupItem item)
+        {
+            switch (item)
+            {
+                case MusicContextPopupItem.FileInfo:
+                    string message = "File name  : " + info.MediaContentInformation.Title + "\n";
+                    message += "File size : " + info.MediaContentInformation.Size + "\n";
+                    message += "File format : " + info.MediaContentInformation.MimeType + "\n";
+                    message += "File size : " + info.MediaContentInformation.Size + "\n";
+                    message += "File path : " + info.MediaContentInformation.FilePath;
+
+                    await DisplayAlert("File Information", message, "Close");
+                    Dialog dialog = new Dialog();
+                    break;
+                case MusicContextPopupItem.Delete:
+                    bool answer = await DisplayAlert("Delete", "Delete '" + info.MediaContentInformation.Title + "'?", "Yes", "No");
+                    if (answer)
+                    {
+                        DeleteContentCommand?.Execute(info);
+                        GetInformationsCommand?.Execute("");
+                    }
+
+                    break;
+            }
+
+        }
     }
 }
\ No newline at end of file
diff --git a/TVMediaHub/TVMediaHub.Tizen/res/img_music_nocover.png b/TVMediaHub/TVMediaHub.Tizen/res/img_music_nocover.png
new file mode 100644 (file)
index 0000000..c9bd7fe
Binary files /dev/null and b/TVMediaHub/TVMediaHub.Tizen/res/img_music_nocover.png differ