From 8c90e6a79d970279fe542806c468985aebb0290b Mon Sep 17 00:00:00 2001 From: "Heonjae.Jang" Date: Wed, 6 Sep 2017 18:05:39 +0900 Subject: [PATCH] Fix Issue : Focusing is not working according to the TC Change-Id: I5e411da70814ac7f2154541462eab0e217b0095a Signed-off-by: Heonjae.Jang --- TVApps/TVApps/Controls/AppListView.xaml | 3 +- TVApps/TVApps/Controls/AppListView.xaml.cs | 64 ++++++++++++++------------ TVApps/TVApps/Views/FooterNormalStatus.xaml.cs | 31 +++++-------- TVApps/TVApps/Views/MainPage.xaml | 13 ++---- TVApps/TVApps/Views/MainPage.xaml.cs | 44 ++++++++++++------ TVHome/TVHome/ViewModels/MainPageViewModel.cs | 1 + 6 files changed, 83 insertions(+), 73 deletions(-) diff --git a/TVApps/TVApps/Controls/AppListView.xaml b/TVApps/TVApps/Controls/AppListView.xaml index ec0576c..a78fca8 100755 --- a/TVApps/TVApps/Controls/AppListView.xaml +++ b/TVApps/TVApps/Controls/AppListView.xaml @@ -10,7 +10,8 @@ + RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0}" + HorizontalOptions="Start"> - /// Identifies the ItemTemplate bindable property - /// - public static readonly BindableProperty ItemTemplateProperty = BindableProperty.Create("ItemTemplate", typeof(DataTemplate), typeof(AppListView), default(DataTemplate)); - - /// - /// Gets or sets template of list items - /// - public DataTemplate ItemTemplate - { - get { return (DataTemplate)GetValue(ItemTemplateProperty); } - set { SetValue(ItemTemplateProperty, value); } - } - - /// /// A count of items in list /// private int AppCount; @@ -106,6 +92,8 @@ namespace TVApps.Controls /// public ICommand OnChangeFocusChainingCommand { get; set; } + public EventHandler ScrollPositionChanged; + /// /// A constructor /// Adds PropertyChanged event handler @@ -170,11 +158,33 @@ namespace TVApps.Controls AppCount = 0; AppUpperList.Children.Clear(); AppLowerList.Children.Clear(); - if (ItemTemplate == null || ItemsSource == null) + + foreach (var item in ItemsSource) { - return; - } + var viewCell = new AppItemCell(); + viewCell.BindingContext = item; + viewCell.OnClickedCommand = new Command(() => + { + item.DoAction(); + }); + var index = AppCount / 2; + viewCell.OnFocusedCommand = new Command(() => + { + ScrollToIndex(index); + }); + + if (AppCount % 2 == 0) + { + Device.BeginInvokeOnMainThread(() => AppUpperList.Children.Add(viewCell)); + } + else + { + Device.BeginInvokeOnMainThread(() => AppLowerList.Children.Add(viewCell)); + } + AppCount = AppCount + 1; + + } foreach (var item in ItemsSource) { var viewCell = new AppItemCell(); @@ -191,14 +201,15 @@ namespace TVApps.Controls if (AppCount % 2 == 0) { - AppUpperList.Children.Add(viewCell); + Device.BeginInvokeOnMainThread(() => AppUpperList.Children.Add(viewCell)); } else { - AppLowerList.Children.Add(viewCell); + Device.BeginInvokeOnMainThread(() => AppLowerList.Children.Add(viewCell)); } AppCount = AppCount + 1; + } if (AppCount > 0) @@ -240,16 +251,11 @@ namespace TVApps.Controls var lowerDistance = Math.Abs(ScrollX - lowerScrollX); var upperDistance = Math.Abs(ScrollX - upperScrollX); - if (lowerDistance > upperDistance) - { - await Task.Delay(1); - await ScrollToAsync(upperScrollX, 0, true); - } - else - { - await Task.Delay(1); - await ScrollToAsync(lowerScrollX, 0, true); - } + var scrollPositionX = lowerDistance > upperDistance ? upperScrollX : lowerScrollX; + ScrollPositionChanged?.Invoke(this, new ScrolledEventArgs(scrollPositionX, 0)); + + await Task.Delay(1); + await ScrollToAsync(scrollPositionX, 0, true); } } diff --git a/TVApps/TVApps/Views/FooterNormalStatus.xaml.cs b/TVApps/TVApps/Views/FooterNormalStatus.xaml.cs index 766699a..07bc4fd 100755 --- a/TVApps/TVApps/Views/FooterNormalStatus.xaml.cs +++ b/TVApps/TVApps/Views/FooterNormalStatus.xaml.cs @@ -36,12 +36,12 @@ namespace TVApps.Views /// /// The drop down list of sort options /// - private DropdownList SortButton; + public DropdownList SortList { get; private set; } /// /// The Option button object /// - private Button OptionButton; + public Button OptionButton { get; private set; } /// /// Identifies the PinAppCommand bindable property @@ -114,15 +114,6 @@ namespace TVApps.Views } /// - /// Gets Sort DropdownList - /// - /// Returns Sort DropdownList - public DropdownList GetSortDropdownList() - { - return SortButton; - } - - /// /// Creates Option Button /// private void CreateOptionButton() @@ -148,21 +139,21 @@ namespace TVApps.Views { List SortList = new List { "NEWEST", "A - Z", "Z - A" }; - SortButton = new DropdownList(); - SortButton.ItemsSource = SortList; - SortButton.SelectedItem = SortList[0]; + this.SortList = new DropdownList(); + this.SortList.ItemsSource = SortList; + this.SortList.SelectedItem = SortList[0]; - SortButton.Expanded += (s, e) => + this.SortList.Expanded += (s, e) => { - ChangeBackKeyInfoCommand?.Execute(SortButton.IsExpanded); + ChangeBackKeyInfoCommand?.Execute(this.SortList.IsExpanded); }; - SortButton.Collapsed += (s, e) => + this.SortList.Collapsed += (s, e) => { - ChangeBackKeyInfoCommand?.Execute(SortButton.IsExpanded); + ChangeBackKeyInfoCommand?.Execute(this.SortList.IsExpanded); }; - SortButton.ItemSelected += (s, e) => + this.SortList.ItemSelected += (s, e) => { if (SortList.Contains(e.SelectedItem.ToString())) { @@ -170,7 +161,7 @@ namespace TVApps.Views } }; - this.Children.Add(SortButton, + this.Children.Add(this.SortList, heightConstraint: Constraint.Constant(SizeUtils.GetHeightSize(80)), widthConstraint: Constraint.Constant(SizeUtils.GetWidthSize(300)), yConstraint: Constraint.Constant(SizeUtils.GetHeightSize(662)), diff --git a/TVApps/TVApps/Views/MainPage.xaml b/TVApps/TVApps/Views/MainPage.xaml index 1d3823a..b132946 100755 --- a/TVApps/TVApps/Views/MainPage.xaml +++ b/TVApps/TVApps/Views/MainPage.xaml @@ -109,18 +109,13 @@ - - - - - - - + ItemsSource="{Binding InstalledAppList}"/> - /// A custom view for displaying main page of TV Apps @@ -180,6 +181,8 @@ namespace TVApps.Views AppList.InitializeFocus(); }); + AppList.ScrollPositionChanged += OnScrollPositionChanged; + FooterNormal.ChangeBackKeyInfoCommand = new Command((isShowingPopup) => { if (isShowingPopup) @@ -193,6 +196,11 @@ namespace TVApps.Views }); } + private void OnScrollPositionChanged(object sender, ScrolledEventArgs e) + { + SetFocusChainingWithCurrentStatus(CurrentStatus, e.ScrollX); + } + /// /// A method for customizing behavior immediately prior to the Page becoming visible /// Sets focus chain and Moves focus to first App icon @@ -289,7 +297,7 @@ namespace TVApps.Views } } - SetFocusChainingWithCurrentStatus(CurrentStatus); + SetFocusChainingWithCurrentStatus(CurrentStatus, 0); } /// @@ -306,22 +314,30 @@ namespace TVApps.Views /// /// A method for setting focus chain list with FooterNormalStatus /// - private void SetFocusChainingUpAndDownForDefaultMode() + private void SetFocusChainingUpAndDownForDefaultMode(double scrollX) { - List lowerList = AppList.GetAppsLowerList().ToList(); - DropdownList sortList = FooterNormal.GetSortDropdownList(); - - foreach (var item in lowerList) + var FocusableList = AppList.GetAppsLowerList().ToList().FindAll((item) => + { + return scrollX <= item.X && (scrollX + 1920) >= item.X + item.Width; + }); + DebuggingUtils.Dbg("FOCUSTEST" + FocusableList.Count + " // "); + foreach (var item in FocusableList) { Button button = item.FindByName /// The TVApps Application status - private void SetFocusChainingWithCurrentStatus(AppsStatus status) + private void SetFocusChainingWithCurrentStatus(AppsStatus status, double scrollX) { switch (status) { case AppsStatus.Pin: - SetFocusChainingUpAndDownForPinMode(); + SetFocusChainingUpAndDownForPinMode(scrollX); break; case AppsStatus.Delete: - SetFocusChainingUpAndDownForDeleteMode(); + SetFocusChainingUpAndDownForDeleteMode(scrollX); break; default: - SetFocusChainingUpAndDownForDefaultMode(); + SetFocusChainingUpAndDownForDefaultMode(scrollX); break; } } @@ -472,7 +488,7 @@ namespace TVApps.Views return true; } - DropdownList sortList = FooterNormal.GetSortDropdownList(); + DropdownList sortList = FooterNormal.SortList; if (sortList.IsExpanded) { diff --git a/TVHome/TVHome/ViewModels/MainPageViewModel.cs b/TVHome/TVHome/ViewModels/MainPageViewModel.cs index 11452ee..e371045 100755 --- a/TVHome/TVHome/ViewModels/MainPageViewModel.cs +++ b/TVHome/TVHome/ViewModels/MainPageViewModel.cs @@ -88,6 +88,7 @@ namespace TVHome.ViewModels sub.OnStateChanged(currentState); } + OnPropertyChanged("CurrentState"); } } -- 2.7.4