[Tizen] Creates the GestureDetector on demand (#141)
author부정균/Common Platform Lab(SR)/Staff Engineer/삼성전자 <jk.pu@samsung.com>
Thu, 16 Jan 2020 01:34:45 +0000 (10:34 +0900)
committer윤정현/Common Platform Lab(SR)/Staff Engineer/삼성전자 <jh0506.yun@samsung.com>
Thu, 16 Jan 2020 01:34:45 +0000 (10:34 +0900)
Xamarin.Forms/Xamarin.Forms.Platform.Tizen/GestureDetector.cs
Xamarin.Forms/Xamarin.Forms.Platform.Tizen/Renderers/LayoutRenderer.cs
Xamarin.Forms/Xamarin.Forms.Platform.Tizen/Renderers/ViewRenderer.cs

index ccd5cdf..28e17cf 100644 (file)
@@ -1,7 +1,4 @@
-using System;
 using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Collections.Specialized;
 using System.Linq;
 using ElmSharp;
 using EGestureType = ElmSharp.GestureLayer.GestureType;
@@ -10,7 +7,7 @@ namespace Xamarin.Forms.Platform.Tizen
 {
        internal class GestureDetector
        {
-               readonly IDictionary<EGestureType, List<GestureHandler>> _handlerCache = new Dictionary<EGestureType, List<GestureHandler>>();
+               readonly IDictionary<EGestureType, List<GestureHandler>> _handlerCache;
 
                readonly IVisualElementRenderer _renderer;
                GestureLayer _gestureLayer;
@@ -49,17 +46,10 @@ namespace Xamarin.Forms.Platform.Tizen
 
                public GestureDetector(IVisualElementRenderer renderer)
                {
+                       _handlerCache = new Dictionary<EGestureType, List<GestureHandler>>();
                        _renderer = renderer;
                        _isEnabled = View.IsEnabled;
                        _inputTransparent = View.InputTransparent;
-
-                       (View.GestureRecognizers as ObservableCollection<IGestureRecognizer>).CollectionChanged += OnGestureRecognizerCollectionChanged;
-
-                       if (View.GestureRecognizers.Count > 0)
-                       {
-                               CreateGestureLayer();
-                               AddGestures(View.GestureRecognizers);
-                       }
                }
 
                public void Clear()
@@ -77,6 +67,23 @@ namespace Xamarin.Forms.Platform.Tizen
                        _handlerCache.Clear();
                }
 
+               public void AddGestures(IEnumerable<IGestureRecognizer> recognizers)
+               {
+                       if (_gestureLayer == null)
+                       {
+                               CreateGestureLayer();
+                       }
+
+                       foreach (var item in recognizers)
+                               AddGesture(item);
+               }
+
+               public void RemoveGestures(IEnumerable<IGestureRecognizer> recognizers)
+               {
+                       foreach (var item in recognizers)
+                               RemoveGesture(item);
+               }
+
                void CreateGestureLayer()
                {
                        _gestureLayer = new GestureLayer(_renderer.NativeView);
@@ -97,19 +104,6 @@ namespace Xamarin.Forms.Platform.Tizen
                        }
                }
 
-
-               void AddGestures(IEnumerable<IGestureRecognizer> recognizers)
-               {
-                       foreach (var item in recognizers)
-                               AddGesture(item);
-               }
-
-               void RemoveGestures(IEnumerable<IGestureRecognizer> recognizers)
-               {
-                       foreach (var item in recognizers)
-                               RemoveGesture(item);
-               }
-
                void AddGesture(IGestureRecognizer recognizer)
                {
                        var handler = CreateHandler(recognizer);
@@ -556,31 +550,5 @@ namespace Xamarin.Forms.Platform.Tizen
                                }
                        }
                }
-
-               void OnGestureRecognizerCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
-               {
-                       // Gestures will be registered/unregistered according to changes in the GestureRecognizers list
-                       switch (e.Action)
-                       {
-                               case NotifyCollectionChangedAction.Add:
-                                       if (_gestureLayer == null)
-                                               CreateGestureLayer();
-                                       AddGestures(e.NewItems.OfType<IGestureRecognizer>());
-                                       break;
-
-                               case NotifyCollectionChangedAction.Replace:
-                                       RemoveGestures(e.OldItems.OfType<IGestureRecognizer>());
-                                       AddGestures(e.NewItems.OfType<IGestureRecognizer>());
-                                       break;
-
-                               case NotifyCollectionChangedAction.Remove:
-                                       RemoveGestures(e.OldItems.OfType<IGestureRecognizer>());
-                                       break;
-
-                               case NotifyCollectionChangedAction.Reset:
-                                       Clear();
-                                       break;
-                       }
-               }
        }
 }
\ No newline at end of file
index be5452a..a3feaf7 100644 (file)
@@ -80,7 +80,11 @@ namespace Xamarin.Forms.Platform.Tizen
                                NativeView.PassEvents = false;
                                NativeView.RepeatEvents = false;
                        }
-                       GestureDetector.InputTransparent = Element.InputTransparent;
+
+                       if (GestureDetector != null)
+                       {
+                               GestureDetector.InputTransparent = Element.InputTransparent;
+                       }
                }
 
                void OnLayoutUpdated(object sender, Native.LayoutEventArgs e)
index c58734e..664666f 100644 (file)
@@ -1,6 +1,7 @@
-using System;
-using System.ComponentModel;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
 using System.Diagnostics;
+using System.Linq;
 using ElmSharp;
 
 namespace Xamarin.Forms.Platform.Tizen
@@ -12,35 +13,36 @@ namespace Xamarin.Forms.Platform.Tizen
                where TView : View
                where TNativeView : EvasObject
        {
-               readonly Lazy<GestureDetector> _gestureDetector;
+               ObservableCollection<IGestureRecognizer> GestureRecognizers => Element.GestureRecognizers as ObservableCollection<IGestureRecognizer>;
 
-               internal GestureDetector GestureDetector => _gestureDetector.Value;
+               internal GestureDetector GestureDetector { get; private set; }
 
                /// <summary>
-               /// Default constructor.
+               /// Native control associated with this renderer.
                /// </summary>
-               protected ViewRenderer()
+               public TNativeView Control
                {
-                       _gestureDetector = new Lazy<GestureDetector>(() => new GestureDetector(this));
+                       get
+                       {
+                               return (TNativeView)NativeView;
+                       }
                }
 
                protected override void OnElementChanged(ElementChangedEventArgs<TView> e)
                {
                        base.OnElementChanged(e);
-                       if (e.OldElement != null && _gestureDetector.IsValueCreated)
+                       if (GestureDetector != null)
                        {
-                               _gestureDetector.Value.Clear();
+                               GestureRecognizers.CollectionChanged -= OnGestureRecognizerCollectionChanged;
+                               GestureDetector.Clear();
+                               GestureDetector = null;
                        }
-               }
 
-               /// <summary>
-               /// Native control associated with this renderer.
-               /// </summary>
-               public TNativeView Control
-               {
-                       get
+                       GestureRecognizers.CollectionChanged += OnGestureRecognizerCollectionChanged;
+                       if (Element.GestureRecognizers.Count > 0)
                        {
-                               return (TNativeView)NativeView;
+                               GestureDetector = new GestureDetector(this);
+                               GestureDetector.AddGestures(Element.GestureRecognizers);
                        }
                }
 
@@ -53,7 +55,42 @@ namespace Xamarin.Forms.Platform.Tizen
                protected override void UpdateIsEnabled(bool initialize)
                {
                        base.UpdateIsEnabled(initialize);
-                       _gestureDetector.Value.IsEnabled = Element.IsEnabled;
+                       if (initialize && Element.IsEnabled)
+                               return;
+
+                       if (GestureDetector != null)
+                       {
+                               GestureDetector.IsEnabled = Element.IsEnabled;
+                       }
+               }
+
+               void OnGestureRecognizerCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+               {
+                       if (GestureDetector == null)
+                       {
+                               GestureDetector = new GestureDetector(this);
+                       }
+
+                       // Gestures will be registered/unregistered according to changes in the GestureRecognizers list
+                       switch (e.Action)
+                       {
+                               case NotifyCollectionChangedAction.Add:
+                                       GestureDetector.AddGestures(e.NewItems.OfType<IGestureRecognizer>());
+                                       break;
+
+                               case NotifyCollectionChangedAction.Replace:
+                                       GestureDetector.RemoveGestures(e.OldItems.OfType<IGestureRecognizer>());
+                                       GestureDetector.AddGestures(e.NewItems.OfType<IGestureRecognizer>());
+                                       break;
+
+                               case NotifyCollectionChangedAction.Remove:
+                                       GestureDetector.RemoveGestures(e.OldItems.OfType<IGestureRecognizer>());
+                                       break;
+
+                               case NotifyCollectionChangedAction.Reset:
+                                       GestureDetector.Clear();
+                                       break;
+                       }
                }
        }
 }
\ No newline at end of file