Fix the issue that Context is null in case of standalone mode and Synchronize with...
author유리나/Common Platform Lab(SR)/Staff Engineer/삼성전자 <rina6350.you@samsung.com>
Wed, 20 May 2020 07:04:02 +0000 (16:04 +0900)
committer윤정현/Common Platform Lab(SR)/Staff Engineer/삼성전자 <jh0506.yun@samsung.com>
Wed, 20 May 2020 07:04:02 +0000 (16:04 +0900)
* Fixed the issue that Context is null in case of standalone mode

* Fix Shell NavigationView (#420)

* [Tizen] Fix IndicatorView (#419)

* [Tizen] Fix Indicator center

* [Tizen] Hide CarouselView scroll bar

* [Tizen] Fix ViewHolder for CarouselView

* Fix collectionview focus issue (#421)

* Fix Page Focus issue (#422)

* [Tizen] Fix ListView header padding on watch (#423)

* Fixed the aligment

* Synchronize with 4.6.0 branch of X.F

* Update NamedPlatformColor.cs (#10677)

* Fix flag check for theme (#10714)

fixes #10712

* Fix Native.ListView Header/Footer padding issue (#424)

* [Tizen] Load image sync in case of FileImageSource (#425)

* Update the WatchListView with PR #311 (https://github.com/Samsung/Tizen.CircularUI/pull/311)

19 files changed:
src/XSF/Tizen.Wearable.CircularUI.Forms.Renderer/WatchListView.cs
src/XSF/Xamarin.Forms.Core/Application.cs
src/XSF/Xamarin.Forms.Core/NamedPlatformColor.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Forms.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/CollectionView/CarouselView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/CollectionView/CollectionView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/CollectionView/IndicatorView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/ListView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/Watch/FormsMoreOptionItem.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/Watch/WatchDateTimePicker.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/Watch/WatchDateTimePickerDialog.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/Watch/WatchListView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Native/Watch/WatchScroller.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Renderers/ButtonRenderer.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Renderers/ImageButtonRenderer.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Renderers/ListViewRenderer.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Renderers/StepperRenderer.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Shell/Watch/NavigationView.cs
src/XSF/Xamarin.Forms.Platform.Tizen/Shell/Watch/ShellSectionNavigationRenderer.cs

index 007261a..5f3aa5c 100644 (file)
@@ -3,7 +3,6 @@ using ElmSharp.Wearable;
 using Xamarin.Forms;
 using Xamarin.Forms.Platform.Tizen;
 using XForms = Xamarin.Forms.Forms;
-using CForms = Tizen.Wearable.CircularUI.Forms;
 
 namespace Tizen.Wearable.CircularUI.Forms.Renderer
 {
@@ -18,18 +17,18 @@ namespace Tizen.Wearable.CircularUI.Forms.Renderer
                public override void SetHeader(VisualElement header)
                {
                        base.SetHeader(header);
-                       if (HasHeader() && CForms.CircleListView.GetCancelEffect(header))
+                       if (header != null && CircleListView.GetCancelEffect(header))
                        {
-                               FirstItem.UpdateItemClass(GetCancelEffectTemplete(), header);
+                               FirstItem.UpdateItemClass(GetCancelEffectTemplete(), HeaderItemContext);
                        }
                }
 
                public override void SetFooter(VisualElement footer)
                {
                        base.SetFooter(footer);
-                       if (HasFooter() && CForms.CircleListView.GetCancelEffect(footer))
+                       if (footer != null && CircleListView.GetCancelEffect(footer))
                        {
-                               LastItem.UpdateItemClass(GetCancelEffectTemplete(), footer);
+                               LastItem.UpdateItemClass(GetCancelEffectTemplete(), FooterItemContext);
                        }
                }
 
@@ -41,18 +40,21 @@ namespace Tizen.Wearable.CircularUI.Forms.Renderer
                        {
                                GetContentHandler = (data, part) =>
                                {
-                                       VisualElement element = data as VisualElement;
-                                       var renderer = Platform.GetOrCreateRenderer(element);
+                                       var context = data as HeaderFooterItemContext;
+                                       if (context == null || context.Element == null)
+                                               return null;
 
-                                       if (element.MinimumHeightRequest == -1)
+                                       var renderer = Platform.GetOrCreateRenderer(context.Element);
+                                       if (context.Element.MinimumHeightRequest == -1)
                                        {
-                                               SizeRequest request = element.Measure(double.PositiveInfinity, double.PositiveInfinity);
+                                               SizeRequest request = context.Element.Measure(double.PositiveInfinity, double.PositiveInfinity);
                                                renderer.NativeView.MinimumHeight = XForms.ConvertToScaledPixel(request.Request.Height);
                                        }
                                        else
                                        {
-                                               renderer.NativeView.MinimumHeight = XForms.ConvertToScaledPixel(element.MinimumHeightRequest);
+                                               renderer.NativeView.MinimumHeight = XForms.ConvertToScaledPixel(context.Element.MinimumHeightRequest);
                                        }
+
                                        (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
 
                                        return renderer.NativeView;
index cd4cf9b..97bde7c 100644 (file)
@@ -169,7 +169,7 @@ namespace Xamarin.Forms
                [EditorBrowsable(EditorBrowsableState.Never)]
                public void OnRequestedThemeChanged(AppThemeChangedEventArgs args)
                {
-                       if (Device.Flags.IndexOf(ExperimentalFlags.AppThemeExperimental) == -1)
+                       if (Device.Flags == null || Device.Flags.IndexOf(ExperimentalFlags.AppThemeExperimental) == -1)
                                return;
 
                        // On iOS the event is triggered more than once.
index 0393d7c..69d4b33 100644 (file)
@@ -20,7 +20,7 @@
                public const string Label = "label";
                public const string SecondaryLabel = "secondaryLabel";
                public const string TertiaryLabel = "tertiaryLabel";
-               public const string QuaternaryLabel = "quaternaryLabellabel";
+               public const string QuaternaryLabel = "quaternaryLabel";
                public const string PlaceholderText = "placeholderText";
                public const string Separator = "separator";
                public const string OpaqueSeparator = "opaqueSeparator";
index 52686bf..fca91da 100644 (file)
@@ -9,13 +9,13 @@ using Xamarin.Forms.Platform.Tizen;
 using ElmSharp;
 using Tizen.Applications;
 using TSystemInfo = Tizen.System.Information;
-using TSystemSetting = Tizen.System.SystemSettings;
-using EWindow = ElmSharp.Window;
 using ELayout = ElmSharp.Layout;
 using DeviceOrientation = Xamarin.Forms.Internals.DeviceOrientation;
+using ElmSharp.Wearable;
 using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
 using PTizen = Xamarin.Forms.Platform.Tizen;
-using ElmSharp.Wearable;
+using TSystemSetting = Tizen.System.SystemSettings;
+using EWindow = ElmSharp.Window;
 using Tizen.Wearable.CircularUI.Forms;
 
 namespace Xamarin.Forms
@@ -289,7 +289,7 @@ namespace Xamarin.Forms
                }
 
                static IReadOnlyList<string> s_flags;
-               public static IReadOnlyList<string> Flags => s_flags ?? (s_flags = new string[0]);
+               public static IReadOnlyList<string> Flags => s_flags ?? (s_flags = new List<string>().AsReadOnly());
 
                public static void SetFlags(params string[] flags)
                {
@@ -298,9 +298,7 @@ namespace Xamarin.Forms
                                throw new InvalidOperationException($"{nameof(SetFlags)} must be called before {nameof(Init)}");
                        }
 
-                       s_flags = (string[])flags.Clone();
-                       if (s_flags.Contains("Profile"))
-                               Profile.Enable();
+                       s_flags = flags.ToList().AsReadOnly();
                }
 
                public static void SetTitleBarVisibility(TizenTitleBarVisibility visibility)
@@ -384,7 +382,7 @@ namespace Xamarin.Forms
 
                public static void Init(InitializationOptions options)
                {
-                       SetupInit(Context, options);
+                       SetupInit(options.Context, options);
                }
 
                static void SetupInit(CoreApplication application, InitializationOptions options = null)
@@ -398,6 +396,7 @@ namespace Xamarin.Forms
                                {
                                        TizenSynchronizationContext.Initialize();
                                }
+
                                Elementary.Initialize();
                                Elementary.ThemeOverlay();
                                Utility.AppendGlobalFontPath(@"/usr/share/fonts");
@@ -497,11 +496,6 @@ namespace Xamarin.Forms
                                                }
                                                else
                                                {
-                                                       // In .NETCore, AppDomain feature is not supported.
-                                                       // The list of assemblies returned by AppDomain.GetAssemblies() method should be registered manually.
-                                                       // The assembly of the executing application and referenced assemblies of it are added into the list here.
-                                                       TizenPlatformServices.AppDomain.CurrentDomain.RegisterAssemblyRecursively(application.GetType().GetTypeInfo().Assembly);
-
                                                        Registrar.RegisterAll(new Type[]
                                                        {
                                                                typeof(ExportRendererAttribute),
@@ -550,6 +544,10 @@ namespace Xamarin.Forms
 
                        Color.SetAccent(GetAccentColor(profile));
                        ExpressionSearch.Default = new TizenExpressionSearch();
+
+                       if (application is WatchApplication)
+                               s_platformType = PlatformType.Lightweight;
+
                        IsInitialized = true;
                }
 
index fa13e97..5839ffb 100644 (file)
@@ -13,10 +13,21 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        Scroll.HorizontalPageScrollLimit = 1;
                        Scroll.VerticalPageScrollLimit = 1;
                        Scroll.SetPageSize(1.0, 1.0);
+                       Scroll.HorizontalScrollBarVisiblePolicy = ScrollBarVisiblePolicy.Invisible;
+                       Scroll.VerticalScrollBarVisiblePolicy = ScrollBarVisiblePolicy.Invisible;
                }
 
                public EScroller Scroll => base.Scroller;
 
+               protected override ViewHolder CreateViewHolder()
+               {
+                       return new ViewHolder(this)
+                       {
+                               FocusedColor = ElmSharp.Color.Transparent,
+                               SelectedColor = ElmSharp.Color.Transparent,
+                       };
+               }
+
                ESize ICollectionViewController.GetItemSize(int widthConstraint, int heightConstraint)
                {
                        return AllocatedSize;
index 6eaa096..0f5cc4c 100644 (file)
@@ -32,6 +32,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native
 
                public CollectionView(EvasObject parent) : base(parent)
                {
+                       AllowFocus(true);
                        SetLayoutCallback(OnLayout);
                        Scroller = CreateScroller(parent);
                        Scroller.Show();
@@ -248,6 +249,11 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        return Adaptor.MeasureItem(index, widthConstraint, heightConstraint);
                }
 
+               protected virtual ViewHolder CreateViewHolder()
+               {
+                       return new ViewHolder(this);
+               }
+
                ViewHolder ICollectionViewController.RealizeView(int index)
                {
                        if (Adaptor == null)
@@ -261,7 +267,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        else
                        {
                                var content = Adaptor.CreateNativeView(index, this);
-                               holder = new ViewHolder(this);
+                               holder = CreateViewHolder();
                                holder.RequestSelected += OnRequestItemSelection;
                                holder.Content = content;
                                holder.ViewCategory = Adaptor.GetViewCategory(index);
index 1020350..01e2789 100644 (file)
@@ -6,6 +6,8 @@ namespace Xamarin.Forms.Platform.Tizen.Native
 {
        public class IndicatorView : Index
        {
+               const int OddMiddleItem = 10;
+               const int EvenMiddleItem = 11;
                List<IndexItem> _list = new List<IndexItem>();
 
                public IndicatorView(EvasObject parent) : base(parent)
@@ -53,17 +55,15 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                {
                        foreach (var item in _list)
                        {
-                               int center = 10;
-                               int start = center - (_list.Count / 2);
-                               int index = _list.IndexOf(item);
-                               int position = start + index;
                                if (_list.Count % 2 == 0)
                                {
+                                       int position = EvenMiddleItem - (_list.Count / 2) + _list.IndexOf(item);
                                        string itemStyle = "item/even_" + position;
                                        item.Style = itemStyle;
                                }
                                else
                                {
+                                       int position = OddMiddleItem - (_list.Count / 2) + _list.IndexOf(item);
                                        string itemStyle = "item/odd_" + position;
                                        item.Style = itemStyle;
                                }
@@ -77,4 +77,4 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        UpdateSelectedIndex(index);
                }
        }
-}
+}
\ No newline at end of file
index c7b39e3..1b5192c 100644 (file)
@@ -4,9 +4,7 @@ using System.Collections.Generic;
 using System.ComponentModel;
 using Xamarin.Forms.Internals;
 using ElmSharp;
-using ElmSharp.Wearable;
 using EScroller = ElmSharp.Scroller;
-using EColor = ElmSharp.Color;
 
 namespace Xamarin.Forms.Platform.Tizen.Native
 {
@@ -18,7 +16,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native
        /// <summary>
        /// Native ListView implementation for Xamarin renderer
        /// </summary>
-       /// <remarks>
+       /// <remarks> 
        /// This internally uses GenList class.
        /// One should note that it is optimized for displaying many elements which may be
        /// unavailable at first. This means that only currently visible elements will be constructed.
@@ -48,6 +46,11 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        internal TemplatedItemsList<ItemsView<Cell>, Cell> ListOfSubItems;
                }
 
+               public class HeaderFooterItemContext : ItemContext
+               {
+                       public VisualElement Element;
+               }
+
                class ScrollerExtension : EScroller
                {
                        public ScrollerExtension(GenList scrollableLayout) : base(scrollableLayout)
@@ -76,19 +79,10 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                protected readonly IDictionary<Type, CellRenderer> _groupCellRendererCache = new Dictionary<Type, CellRenderer>();
 
                /// <summary>
-               /// The header context.
-               /// </summary>
-               ItemContext _headerContext;
-
-               /// <summary>
                /// The header element.
                /// </summary>
                VisualElement _headerElement;
 
-               /// <summary>
-               /// The footer context.
-               /// </summary>
-               ItemContext _footerContext;
 
                /// <summary>
                /// The footer element.
@@ -105,6 +99,10 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// </summary>
                protected virtual EScroller Scroller { get; set; }
 
+               protected HeaderFooterItemContext HeaderItemContext { get; set; }
+
+               protected HeaderFooterItemContext FooterItemContext { get; set; }
+
                /// <summary>
                /// Gets or sets a value indicating whether this instance has grouping enabled.
                /// </summary>
@@ -199,7 +197,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// Adds elements to the list and defines its presentation based on Cell type.
                /// </summary>
                /// <param name="source">IEnumerable on Cell collection.</param>
-               /// <param name="beforeCell">Cell before which new items will be placed.
+               /// <param name="beforeCell">Cell before which new items will be placed. 
                /// Null value may also be passed as this parameter, which results in appending new items to the end.
                /// </param>
                public virtual void AddSource(IEnumerable source, Cell beforeCell = null)
@@ -311,31 +309,53 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// <param name="header">Header of the list.</param>
                public virtual void SetHeader(VisualElement header)
                {
-                       if (header == null)
+                       _headerElement = header;
+                       UpdateHeader();
+               }
+
+               protected virtual void UpdateHeader()
+               {
+                       if (GetHeader() == null)
                        {
-                               if (HasHeader())
+                               if (HasHeaderContext())
                                {
-                                       RemoveHeader();
+                                       RemoveHeaderItemContext();
                                }
-
                                return;
                        }
 
-                       GenItemClass headerTemplate = GetHeaderFooterItemClass();
+                       var headerTemplate = GetHeaderFooterItemClass();
+                       if (!HasHeaderContext())
+                       {
+                               InitializeHeaderItemContext(headerTemplate);
+                       }
+                       else
+                       {
+                               HeaderItemContext.Element = GetHeader();
+                               (HeaderItemContext.Item as GenListItem).UpdateItemClass(headerTemplate, HeaderItemContext);
+                       }
+               }
 
-                       _headerElement = header;
-                       if (HasHeader())
+               protected void InitializeHeaderItemContext(GenItemClass headerTemplate)
+               {
+                       var context = new HeaderFooterItemContext();
+                       context.Element = GetHeader();
+                       if (FirstItem != null)
                        {
-                               FirstItem.UpdateItemClass(headerTemplate, header);
+                               context.Item = InsertBefore(headerTemplate, context, FirstItem);
                        }
                        else
                        {
-                               _headerContext = new ItemContext();
-                               _headerContext.Item = _itemContextList.Count > 0 ? InsertBefore(headerTemplate, header, FirstItem) : Append(headerTemplate, header);
-                               _headerContext.Item.SelectionMode = GenItemSelectionMode.None;
-                               _headerContext.Item.Deleted += HeaderDeletedHandler;
-                               _itemContextList.Insert(0, _headerContext);
+                               context.Item = Append(headerTemplate, context);
                        }
+                       context.Item.SelectionMode = GenItemSelectionMode.None;
+                       context.Item.Deleted += OnHeaderItemDeleted;
+                       HeaderItemContext = context;
+               }
+
+               void OnHeaderItemDeleted(object sender, EventArgs e)
+               {
+                       HeaderItemContext = null;
                }
 
                /// <summary>
@@ -344,70 +364,68 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// <param name="footer">Footer of the list.</param>
                public virtual void SetFooter(VisualElement footer)
                {
-                       if (footer == null)
+                       _footerElement = footer;
+                       UpdateFooter();
+               }
+
+               protected virtual void UpdateFooter()
+               {
+                       if (GetFooter() == null)
                        {
-                               if (HasFooter())
+                               if (HasFooterContext())
                                {
-                                       RemoveFooter();
+                                       RemoveFooterItemContext();
                                }
                                return;
                        }
 
-                       GenItemClass footerTemplate = GetHeaderFooterItemClass();
-
-                       _footerElement = footer;
-                       if (HasFooter())
+                       var footerTemplate = GetHeaderFooterItemClass();
+                       if (!HasFooterContext())
                        {
-                               (_footerContext.Item as GenListItem).UpdateItemClass(footerTemplate, footer);
+                               InitializeFooterItemContext(footerTemplate);
                        }
                        else
                        {
-                               _footerContext = new ItemContext();
-                               _footerContext.Item = Append(footerTemplate, footer);
-                               _footerContext.Item.SelectionMode = GenItemSelectionMode.None;
-                               _footerContext.Item.Deleted += FooterDeletedHandler;
-                               _itemContextList.Add(_footerContext);
+                               FooterItemContext.Element = GetFooter();
+                               (HeaderItemContext.Item as GenListItem).UpdateItemClass(footerTemplate, HeaderItemContext);
                        }
                }
 
-               /// <summary>
-               /// Removes the header.
-               /// </summary>
-               public void RemoveHeader()
+               protected void InitializeFooterItemContext(GenItemClass headerTemplate)
                {
-                       _itemContextList.Remove(_headerContext);
-                       _headerContext?.Item?.Delete();
-                       _headerContext = null;
-                       _headerElement = null;
+                       var context = new HeaderFooterItemContext();
+                       context.Element = GetFooter();
+                       context.Item = Append(headerTemplate, context);
+                       context.Item.SelectionMode = GenItemSelectionMode.None;
+                       context.Item.Deleted += OnFooterItemDeleted;
+                       FooterItemContext = context;
                }
 
-               /// <summary>
-               /// Removes the footer.
-               /// </summary>
-               public void RemoveFooter()
+               void OnFooterItemDeleted(object sender, EventArgs e)
                {
-                       _itemContextList.Remove(_footerContext);
-                       _footerContext?.Item?.Delete();
-                       _footerContext = null;
-                       _footerElement = null;
+                       FooterItemContext = null;
                }
 
-               /// <summary>
-               /// Determines whether this instance has a header.
-               /// </summary>
-               /// <returns><c>true</c> if the header is present.</returns>
-               public bool HasHeader()
+               protected void RemoveHeaderItemContext()
                {
-                       return _headerContext != null;
+                       HeaderItemContext?.Item?.Delete();
+                       HeaderItemContext = null;
                }
 
-               /// <summary>
-               /// Determines whether this instance has a footer.
-               /// </summary>
-               /// <returns><c>true</c> if the footer is present.</returns>
-               public bool HasFooter()
+               protected void RemoveFooterItemContext()
+               {
+                       FooterItemContext?.Item?.Delete();
+                       FooterItemContext = null;
+               }
+
+               public bool HasHeaderContext()
                {
-                       return _footerContext != null;
+                       return HeaderItemContext != null;
+               }
+
+               public bool HasFooterContext()
+               {
+                       return FooterItemContext != null;
                }
 
                /// <summary>
@@ -434,28 +452,6 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                }
 
                /// <summary>
-               /// Handles the header deleted event.
-               /// </summary>
-               /// <param name="sender">Sender of the event.</param>
-               /// <param name="e">Empty argument.</param>
-               void HeaderDeletedHandler(object sender, EventArgs e)
-               {
-                       _itemContextList.Remove(_headerContext);
-                       _headerContext = null;
-               }
-
-               /// <summary>
-               /// Handles the footer deleted event.
-               /// </summary>
-               /// <param name="sender">Sender of the event.</param>
-               /// <param name="e">Empty argument.</param>
-               void FooterDeletedHandler(object sender, EventArgs e)
-               {
-                       _itemContextList.Remove(_footerContext);
-                       _footerContext = null;
-               }
-
-               /// <summary>
                /// Called every time an object gets realized.
                /// </summary>
                /// <param name="sender">Sender of the event.</param>
@@ -593,6 +589,10 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                                GenListItem beforeItem = GetItemContext(beforeCell)?.Item as GenListItem;
                                itemContext.Item = InsertBefore(renderer.Class, itemContext, beforeItem, GenListItemType.Normal, parentItem);
                        }
+                       else if (HasFooterContext())
+                       {
+                               itemContext.Item = InsertBefore(renderer.Class, itemContext, FooterItemContext.Item as GenListItem, GenListItemType.Normal, parentItem);
+                       }
                        else
                        {
                                itemContext.Item = Append(renderer.Class, itemContext, GenListItemType.Normal, parentItem);
@@ -649,7 +649,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                /// Gets the item class used for header and footer cells.
                /// </summary>
                /// <returns>The header and footer item class.</returns>
-               GenItemClass GetHeaderFooterItemClass()
+               protected GenItemClass GetHeaderFooterItemClass()
                {
                        if (_headerFooterItemClass == null)
                        {
@@ -657,17 +657,19 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                                {
                                        GetContentHandler = (data, part) =>
                                        {
-                                               VisualElement element = data as VisualElement;
-                                               var renderer = Platform.GetOrCreateRenderer(element);
+                                               var context = data as HeaderFooterItemContext;
+                                               if (context == null || context.Element == null)
+                                                       return null;
 
-                                               if (element.MinimumHeightRequest == -1)
+                                               var renderer = Platform.GetOrCreateRenderer(context.Element);
+                                               if (context.Element.MinimumHeightRequest == -1)
                                                {
-                                                       SizeRequest request = element.Measure(double.PositiveInfinity, double.PositiveInfinity);
+                                                       SizeRequest request = context.Element.Measure(double.PositiveInfinity, double.PositiveInfinity);
                                                        renderer.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(request.Request.Height);
                                                }
                                                else
                                                {
-                                                       renderer.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(element.MinimumHeightRequest);
+                                                       renderer.NativeView.MinimumHeight = Forms.ConvertToScaledPixel(context.Element.MinimumHeightRequest);
                                                }
 
                                                (renderer as LayoutRenderer)?.RegisterOnLayoutUpdated();
@@ -679,4 +681,4 @@ namespace Xamarin.Forms.Platform.Tizen.Native
                        return _headerFooterItemClass;
                }
        }
-}
\ No newline at end of file
+}
index 4eb64aa..7b79790 100644 (file)
@@ -6,4 +6,4 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
        {
                public ToolbarItem ToolbarItem { get; set; }
        }
-}
+}
\ No newline at end of file
index 57968c6..1a7e786 100644 (file)
@@ -17,7 +17,7 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
 
                public DateTimePickerMode Mode
                {
-                       get 
+                       get
                        {
                                return _mode;
                        }
index fce55fd..5b01083 100644 (file)
@@ -136,4 +136,4 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
                        PickerOpened?.Invoke(this, EventArgs.Empty);
                }
        }
-}
+}
\ No newline at end of file
index 2a11401..5cabf2e 100644 (file)
@@ -10,9 +10,6 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
                CircleGenList _circleGenList;
                CircleSurface _surface;
 
-               GenItem _headerPadding;
-               GenItem _footerPadding;
-
                public IntPtr CircleHandle => _circleGenList.CircleHandle;
 
                public CircleGenList CircleGenList => _circleGenList;
@@ -21,6 +18,9 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
 
                public IRotaryActionWidget RotaryWidget { get => this; }
 
+               GenItemClass _paddingItemClass;
+               protected GenItemClass PaddingItemTemplate => _paddingItemClass ?? (_paddingItemClass = new PaddingItemClass());
+
                public override ScrollBarVisiblePolicy VerticalScrollBarVisibility
                {
                        get => _circleGenList.VerticalScrollBarVisiblePolicy;
@@ -36,63 +36,54 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
                        Scroller.Scrolled += OnScrolled;
                }
 
-               public override void SetHeader(VisualElement header)
-               {
-                       if (_headerPadding != null)
-                               RemovePaddingItem(_headerPadding);
-                       
-                       base.SetHeader(header);
-
-                       if (!HasHeader())
-                               AddHeaderPadding();
-               }
-
-               public override void SetFooter(VisualElement footer)
-               {
-                       if(_footerPadding != null)
-                               RemovePaddingItem(_footerPadding);
-
-                       base.SetFooter(footer);
-
-                       if (!HasFooter())
-                               AddFooterPadding();
-               }
-
-               protected override IntPtr CreateHandle(EvasObject parent)
-               {
-                       _circleGenList = new CircleGenList(parent, _surface);
-                       RealHandle = _circleGenList.RealHandle;
-                       return _circleGenList.Handle;
-               }
-
-               void RemovePaddingItem(GenItem item)
+               protected override void UpdateHeader()
                {
-                       item?.Delete();
-                       item = null;
+                       if (GetHeader() != null)
+                       {
+                               base.UpdateHeader();
+                       }
+                       else
+                       {
+                               var paddingTemplate = PaddingItemTemplate;
+                               if (!HasHeaderContext())
+                               {
+                                       InitializeHeaderItemContext(PaddingItemTemplate);
+                               }
+                               else
+                               {
+                                       (HeaderItemContext.Item as GenListItem).UpdateItemClass(paddingTemplate, HeaderItemContext);
+                               }
+                               HeaderItemContext.Element = null;
+                       }
                }
 
-               void AddHeaderPadding()
+               protected override void UpdateFooter()
                {
-                       var cls = new WatchListView.PaddingItemClass();
-
-                       if (FirstItem == null)
+                       if (GetHeader() != null)
                        {
-                               _headerPadding = Append(cls, null);
+                               base.UpdateFooter();
                        }
                        else
                        {
-                               _headerPadding = InsertBefore(cls, null, FirstItem);
+                               var paddingTemplate = PaddingItemTemplate;
+                               if (!HasFooterContext())
+                               {
+                                       InitializeFooterItemContext(PaddingItemTemplate);
+                               }
+                               else
+                               {
+                                       (FooterItemContext.Item as GenListItem).UpdateItemClass(paddingTemplate, FooterItemContext);
+                               }
+                               FooterItemContext.Element = null;
                        }
                }
 
-               void AddFooterPadding()
-               {
-                       var cls = new WatchListView.PaddingItemClass();
 
-                       if (Count > 1)
-                       {
-                               _footerPadding = Append(cls, null);
-                       }
+               protected override IntPtr CreateHandle(EvasObject parent)
+               {
+                       _circleGenList = new CircleGenList(parent, _surface);
+                       RealHandle = _circleGenList.RealHandle;
+                       return _circleGenList.Handle;
                }
 
                class PaddingItemClass : GenItemClass
index 3c953d5..db54775 100644 (file)
@@ -45,4 +45,4 @@ namespace Xamarin.Forms.Platform.Tizen.Native.Watch
                        return _circleScroller.Handle;
                }
        }
-}
+}
\ No newline at end of file
index 4f47939..8ef72b9 100644 (file)
@@ -15,6 +15,9 @@ namespace Xamarin.Forms.Platform.Tizen
                        RegisterPropertyHandler(Button.FontAttributesProperty, UpdateFontAttributes);
                        RegisterPropertyHandler(Button.TextColorProperty, UpdateTextColor);
                        RegisterPropertyHandler(Button.ImageSourceProperty, UpdateBitmap);
+                       RegisterPropertyHandler(Button.BorderColorProperty, UpdateBorder);
+                       RegisterPropertyHandler(Button.CornerRadiusProperty, UpdateBorder);
+                       RegisterPropertyHandler(Button.BorderWidthProperty, UpdateBorder);
                }
 
                protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
@@ -41,7 +44,7 @@ namespace Xamarin.Forms.Platform.Tizen
                protected override Size MinimumSize()
                {
                        Size measured;
-                       if(Control is IMeasurable im)
+                       if (Control is IMeasurable im)
                        {
                                measured = im.Measure(Control.MinimumWidth, Control.MinimumHeight).ToDP();
                        }
@@ -137,7 +140,14 @@ namespace Xamarin.Forms.Platform.Tizen
                                if (Element.ImageSource != null)
                                {
                                        ib.Image = new Native.Image(Control);
-                                       var task = ib.Image.LoadFromImageSourceAsync(Element.ImageSource);
+                                       if (Element.ImageSource is FileImageSource fis)
+                                       {
+                                               ib.Image.LoadFromFile(fis.File);
+                                       }
+                                       else
+                                       {
+                                               var task = ib.Image.LoadFromImageSourceAsync(Element.ImageSource);
+                                       }
                                }
                                else
                                {
@@ -145,5 +155,13 @@ namespace Xamarin.Forms.Platform.Tizen
                                }
                        }
                }
+
+               void UpdateBorder()
+               {
+                       /* The simpler way is to create some specialized theme for button in
+                        * tizen-theme
+                        */
+                       // TODO: implement border handling
+               }
        }
 }
\ No newline at end of file
index 6c71117..b03480b 100644 (file)
@@ -50,7 +50,8 @@ namespace Xamarin.Forms.Platform.Tizen
 
                protected virtual void UpdateAfterLoading()
                {
-                       _image.IsOpaque = Element.IsOpaque;
+                       if (_image.IsOpaque != Element.IsOpaque)
+                               _image.IsOpaque = Element.IsOpaque;
                }
 
                protected override ElmSharp.Size Measure(int availableWidth, int availableHeight)
@@ -123,7 +124,16 @@ namespace Xamarin.Forms.Platform.Tizen
 
                        if (Control != null)
                        {
-                               bool success = await _image.LoadFromImageSourceAsync(source);
+                               bool success;
+                               if (source is FileImageSource fis)
+                               {
+                                       success = _image.LoadFromFile(fis.File);
+                               }
+                               else
+                               {
+                                       success = await _image.LoadFromImageSourceAsync(source);
+                               }
+
                                if (!IsDisposed && success)
                                {
                                        (Element as IVisualElementController)?.NativeSizeChanged();
index 3fda591..fb27b31 100644 (file)
@@ -40,8 +40,8 @@ namespace Xamarin.Forms.Platform.Tizen
                        RegisterPropertyHandler(ListView.RowHeightProperty, UpdateRowHeight);
                        RegisterPropertyHandler(ListView.SelectedItemProperty, UpdateSelectedItem);
                        RegisterPropertyHandler(ListView.ItemsSourceProperty, UpdateSource);
-                       RegisterPropertyHandler("HeaderElement", UpdateHeader);
-                       RegisterPropertyHandler("FooterElement", UpdateFooter);
+                       RegisterPropertyHandler(nameof(Element.HeaderElement), UpdateHeader);
+                       RegisterPropertyHandler(nameof(Element.FooterElement), UpdateFooter);
                        RegisterPropertyHandler(ListView.SelectionModeProperty, UpdateSelectionMode);
                        RegisterPropertyHandler(ListView.VerticalScrollBarVisibilityProperty, UpdateVerticalScrollBarVisibility);
                        RegisterPropertyHandler(ListView.HorizontalScrollBarVisibilityProperty, UpdateHorizontalScrollBarVisibility);
@@ -216,42 +216,6 @@ namespace Xamarin.Forms.Platform.Tizen
                }
 
                /// <summary>
-               /// Helper class for managing proper postion of Header and Footer element.
-               /// Since both elements need to be implemented with ordinary list elements,
-               /// both header and footer are removed at first, then the list is being modified
-               /// and finally header and footer are prepended and appended to the list, respectively.
-               /// </summary>
-               class HeaderAndFooterHandler : IDisposable
-               {
-                       VisualElement headerElement;
-                       VisualElement footerElement;
-
-                       Native.ListView Control;
-
-                       public HeaderAndFooterHandler(Widget control)
-                       {
-                               Control = control as Native.ListView;
-
-                               if (Control.HasHeader())
-                               {
-                                       headerElement = Control.GetHeader();
-                                       Control.RemoveHeader();
-                               }
-                               if (Control.HasFooter())
-                               {
-                                       footerElement = Control.GetFooter();
-                                       Control.RemoveFooter();
-                               }
-                       }
-
-                       public void Dispose()
-                       {
-                                       Control.SetHeader(headerElement);
-                                       Control.SetFooter(footerElement);
-                               }
-                       }
-
-               /// <summary>
                /// This method is called whenever something changes in list view data model.
                /// Method will not be invoked for grouping mode, but for example event with
                /// action reset will be handled here when switching between group and no-group mode.
@@ -260,8 +224,6 @@ namespace Xamarin.Forms.Platform.Tizen
                /// <param name="e">NotifyCollectionChangedEventArgs.</param>
                void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
                {
-                       using (new HeaderAndFooterHandler(Control))
-                       {
                                if (e.Action == NotifyCollectionChangedAction.Add)
                                {
                                        Cell before = null;
@@ -280,7 +242,6 @@ namespace Xamarin.Forms.Platform.Tizen
                                        UpdateSource();
                                }
                        }
-               }
 
                /// <summary>
                /// This method is called whenever something changes in list view data model.
@@ -291,8 +252,6 @@ namespace Xamarin.Forms.Platform.Tizen
                /// <param name="e">NotifyCollectionChangedEventArgs.</param>
                void OnGroupedCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
                {
-                       using (new HeaderAndFooterHandler(Control))
-                       {
                                if (e.Action == NotifyCollectionChangedAction.Add)
                                {
                                        TemplatedItemsList<ItemsView<Cell>, Cell> itemsGroup = sender as TemplatedItemsList<ItemsView<Cell>, Cell>;
@@ -312,39 +271,36 @@ namespace Xamarin.Forms.Platform.Tizen
                                        Control.ResetGroup(sender as TemplatedItemsList<ItemsView<Cell>, Cell>);
                                }
                        }
-               }
 
                /// <summary>
                /// Updates the source.
                /// </summary>
                void UpdateSource()
                {
-                       bool hasHeader = Control.HasHeader();
-                       bool hasFooter = Control.HasFooter();
-
                        Control.Clear();
+                       UpdateHeader(false);
                        Control.AddSource(Element.TemplatedItems);
+                       UpdateFooter(false);
                        UpdateSelectedItem();
-
-                       if (hasHeader)
-                               UpdateHeader();
-                       if (hasFooter)
-                               UpdateFooter();
                }
 
                /// <summary>
                /// Updates the header.
                /// </summary>
-               void UpdateHeader()
+               void UpdateHeader(bool initialize)
                {
+                       if (initialize)
+                               return;
                        Control.SetHeader(((IListViewController)Element).HeaderElement as VisualElement);
                }
 
                /// <summary>
                /// Updates the footer.
                /// </summary>
-               void UpdateFooter()
+               void UpdateFooter(bool initialize)
                {
+                       if (initialize)
+                               return;
                        Control.SetFooter(((IListViewController)Element).FooterElement as VisualElement);
                }
 
@@ -389,6 +345,10 @@ namespace Xamarin.Forms.Platform.Tizen
                                        _lastSelectedItem.IsSelected = false;
                                        _lastSelectedItem = null;
                                }
+                               if (Control.SelectedItem != null)
+                               {
+                                       Control.SelectedItem.IsSelected = false;
+                               }
                        }
                        else
                        {
index f54eb1e..765af7b 100644 (file)
@@ -29,7 +29,7 @@ namespace Xamarin.Forms.Platform.Tizen
                {
                        if (Device.Idiom == TargetIdiom.Watch)
                        {
-                               return new WatchSpinner(Forms.NativeParent.Parent, Forms.CircleSurface);
+                               return new WatchSpinner(Forms.NativeParent, Forms.CircleSurface);
                        }
                        else
                        {
index 630f18f..9d7f1b7 100644 (file)
@@ -154,7 +154,6 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
                                                data.Icon = (menuItem.IconImageSource as FileImageSource)?.ToAbsPath();
                                        }
                                        var genitem = _naviMenu.Append(_defaultClass, data, GenListItemType.Normal);
-                                       genitem.SetPartColor("bg", _backgroundColor);
                                        _items.Add(genitem);
                                        data.PropertyChanged += OnItemPropertyChanged;
                                }
@@ -223,7 +222,7 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
 
                        _surfaceLayout.StackAbove(_naviMenu);
 
-                       _defaultClass = new GenItemClass("1icon_1text")
+                       _defaultClass = new GenItemClass("1icon_2text")
                        {
                                GetTextHandler = (obj, part) =>
                                {
@@ -276,10 +275,6 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
                void UpdateBackgroundColor()
                {
                        _naviMenu.BackgroundColor = _backgroundColor;
-                       foreach (var item in _items)
-                       {
-                               item.SetPartColor("bg", _backgroundColor);
-                       }
                }
 
                void UpdateForegroundColor()
index b7e7d45..5617eeb 100644 (file)
@@ -81,6 +81,7 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
                                _lastTop?.Hide();
                                _lastTop = InternalStack.LastOrDefault();
                                _lastTop.Show();
+                               (_lastTop as Widget)?.SetFocus(true);
                        }
                }
 
@@ -134,6 +135,11 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
 
                        _rootPageRenderer = ShellRendererFactory.Default.CreateItemRenderer(ShellSection);
                        _viewStack.Push(_rootPageRenderer.NativeView);
+
+                       Device.BeginInvokeOnMainThread(() =>
+                       {
+                               (_rootPageRenderer.NativeView as Widget)?.SetFocus(true);
+                       });
                }
 
                void OnInsertRequest(NavigationRequestedEventArgs request)
@@ -154,6 +160,10 @@ namespace Xamarin.Forms.Platform.Tizen.Watch
                        var renderer = Platform.GetOrCreateRenderer(request.Page);
                        _viewStack.Push(renderer.NativeView);
                        request.Task = Task.FromResult(true);
+                       Device.BeginInvokeOnMainThread(() =>
+                       {
+                               (renderer.NativeView as Widget)?.SetFocus(true);
+                       });
                }
 
                void OnPopRequest(NavigationRequestedEventArgs request)