Implements focus chain in Music Tab (without footer) 64/138164/1
authorhjjang <heonjae.jang@samsung.com>
Tue, 11 Jul 2017 09:57:02 +0000 (18:57 +0900)
committerhjjang <heonjae.jang@samsung.com>
Tue, 11 Jul 2017 09:57:02 +0000 (18:57 +0900)
Change-Id: Iad2e706a18e4fc692366dcd1679815ee937f6968
Signed-off-by: hjjang <heonjae.jang@samsung.com>
TVMediaHub/TVMediaHub.Tizen/Views/MusicGroup.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicItem.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicPlayer.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicTab.xaml.cs

index 34ea731..2cb3fdd 100755 (executable)
@@ -25,6 +25,7 @@ using TVMediaHub.Tizen.Models;
 using TVMediaHub.Tizen.Utils;
 using Xamarin.Forms;
 using Xamarin.Forms.Xaml;
+using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
 
 namespace TVMediaHub.Tizen.Views
 {
@@ -59,6 +60,29 @@ namespace TVMediaHub.Tizen.Views
         private ICommand ItemClickCommand;
 
         /// <summary>
+        /// A list of children's button objects of group
+        /// </summary>
+        private List<Button> ChildrenFocusList;
+
+        /// <summary>
+        /// Gets TitleFocusArea for focus chain
+        /// </summary>
+        public Button GetTitleFocusArea()
+        {
+            return TitleFocusArea;
+        }
+
+        /// <summary>
+        /// left side items for focus chain
+        /// </summary>
+        public List<Button> LeftFocusList { get; protected set; }
+
+        /// <summary>
+        /// right side items for focus chain
+        /// </summary>
+        public List<Button> RightFocusList { get; protected set; }
+
+        /// <summary>
         /// A constructor
         /// </summary>
         public MusicGroup()
@@ -74,6 +98,9 @@ namespace TVMediaHub.Tizen.Views
         /// </summary>
         private void Init()
         {
+            ChildrenFocusList = new List<Button>();
+            LeftFocusList = new List<Button>();
+            RightFocusList = new List<Button>();
             MusicItemList = new List<MusicItem>();
         }
 
@@ -130,8 +157,110 @@ namespace TVMediaHub.Tizen.Views
                     };
 
                     GroupContentArea.Children.Add(itemView, index / 4, index % 4);
+                    ChildrenFocusList.Add(itemView.GetFocusArea());
                     index++;
                 }
+
+                SetFocusChain();
+            }
+        }
+
+        /// <summary>
+        /// A method for making focus chain among items
+        /// </summary>
+        private void SetFocusChain()
+        {
+            if (ChildrenFocusList.Count < 1)
+            {
+                return;
+            }
+
+            var lastColumn = (ChildrenFocusList.Count - 1) / 4;
+            SetFocusList();
+
+            TitleFocusArea.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusDownView(ChildrenFocusList[0]);
+            TitleFocusArea.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(TitleFocusArea);
+            TitleFocusArea.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(TitleFocusArea);
+
+            for (var i = 0; i < ChildrenFocusList.Count; i++)
+            {
+                var target = ChildrenFocusList[i];
+                var row = i % 4;
+                var column = i / 4;
+
+                // Left
+                if (column != 0)
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(ChildrenFocusList[i - 4]);
+                }
+                else
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(target);
+                }
+
+                // Right
+                if (column != lastColumn && (i + 4) < ChildrenFocusList.Count)
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(ChildrenFocusList[i + 4]);
+                }
+                else
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(target);
+                }
+
+                // Up
+                if (row != 0)
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusUpView(ChildrenFocusList[i - 1]);
+                }
+                else
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusUpView(TitleFocusArea);
+                }
+
+                // Down
+                if (row != 3 && (i + 1) < ChildrenFocusList.Count)
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusDownView(ChildrenFocusList[i + 1]);
+                }
+                else
+                {
+                    target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusDownView(target);
+                    //var targetX = column * SizeUtils.GetWidthSize(322);
+                    //BottomFocusList.Add(new KeyValuePair<double, Button>(targetX, target));
+                }
+            }
+        }
+        private void SetFocusList()
+        {
+            var totalCount = ChildrenFocusList.Count - 1;
+            var lastItemColumn = totalCount / 4;
+            var lastItemRow = totalCount % 4;
+
+            var leftFocusFrom = 0;
+            var leftFocusTo = lastItemColumn > 0 ? 3 : lastItemRow;
+
+            var rightFocusFrom = lastItemColumn * 4;
+            var rightFocusTo = rightFocusFrom + lastItemRow;
+
+            for (var i = leftFocusFrom; i <= leftFocusTo; i++)
+            {
+                LeftFocusList.Add(ChildrenFocusList[i]);
+            }
+
+            for (var i = rightFocusFrom; i <= rightFocusTo; i++)
+            {
+                RightFocusList.Add(ChildrenFocusList[i]);
+            }
+
+            if (lastItemColumn != 0 && lastItemRow != 3)
+            {
+                var tempFrom = (lastItemColumn - 1) * 4 + lastItemRow + 1;
+                var tempTo = (lastItemColumn - 1) * 4 + 4;
+                for (var i = tempFrom; i <= tempTo; i++)
+                {
+                    RightFocusList.Add(ChildrenFocusList[i]);
+                }
             }
         }
     }
index 08ea392..e966e2e 100755 (executable)
@@ -85,6 +85,14 @@ namespace TVMediaHub.Tizen.Views
         private Rectangle TextAreaFocusedBounds;
 
         /// <summary>
+        /// Gets FocusArea for focus chain
+        /// </summary>
+        public Button GetFocusArea()
+        {
+            return FocusArea;
+        }
+
+        /// <summary>
         /// A constructor
         /// Initializes the size of the items that are used in this class
         /// </summary>
index 8c20801..db76955 100644 (file)
@@ -41,6 +41,14 @@ namespace TVMediaHub.Tizen.Views
         private Rectangle AlbumNameBounds;
 
         /// <summary>
+        /// Gets FocusArea for focus chain
+        /// </summary>
+        public Button GetFocusArea()
+        {
+            return MusicPlayerFocusArea;
+        }
+
+        /// <summary>
         /// A constructor
         /// </summary>
         public MusicPlayer()
index 2d5afb0..36bbfb4 100755 (executable)
@@ -296,9 +296,43 @@ namespace TVMediaHub.Tizen.Views
                 MusicGroup groupView = new MusicGroup();
 
                 var groupItem = e.NewItems[0];
+                MusicContentView.Children.Add(groupView);
                 groupView.BindingContext = groupItem;
                 groupView.SetClickCommand(OnClickCommand);
-                MusicContentView.Children.Add(groupView);
+
+                if (MusicContentView.Children.Count > 1)
+                {
+                    var leftGroup = MusicContentView.Children[MusicContentView.Children.Count - 2] as MusicGroup;
+
+                    leftGroup.GetTitleFocusArea().On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(groupView.GetTitleFocusArea());
+                    groupView.GetTitleFocusArea().On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(leftGroup.GetTitleFocusArea());
+
+                    leftGroup.GetTitleFocusArea().Clicked += (se, ev) =>
+                    {
+                        leftGroup.GetTitleFocusArea().On<Xamarin.Forms.PlatformConfiguration.Tizen>().MoveFocusRight();
+                    };
+
+                    var leftList = leftGroup.RightFocusList;
+                    var rightList = groupView.LeftFocusList;
+                    var minCount = leftList.Count > rightList.Count ? rightList.Count : leftList.Count;
+
+                    for (var i = 0; i < minCount; i++)
+                    {
+                        leftList[i].On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(rightList[i]);
+                        rightList[i].On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(leftList[i]);
+                    }
+                }
+                else
+                {
+                    groupView.GetTitleFocusArea().On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(MusicPlayer.GetFocusArea());
+                    MusicPlayer.GetFocusArea().On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusRightView(groupView.GetTitleFocusArea());
+
+                    foreach (var item in groupView.LeftFocusList)
+                    {
+                        item.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusLeftView(MusicPlayer.GetFocusArea());
+                    }
+
+                }
             }
             else if (e.Action.ToString().Equals(NotifyCollectionChangedAction.Reset.ToString()))
             {
@@ -415,4 +449,4 @@ namespace TVMediaHub.Tizen.Views
             FooterDelete.IsVisible = false;
         }
     }
-}
+}
\ No newline at end of file