[NUI] Rebase develnui (DevelNUI only patches --> master) (#3910)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / LottieAnimationView.cs
index dce2d47..cef676c 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,27 +19,24 @@ using global::System;
 using global::System.Runtime.InteropServices;
 using System.ComponentModel;
 using System.Collections.Generic;
+using System.Globalization;
 
 namespace Tizen.NUI.BaseComponents
 {
-    #if (NUI_DEBUG_ON)
-    using tlog = Tizen.Log;
-    #endif
-
     /// <summary>
     /// LottieAnimationView renders an animated vector image (Lottie file).
     /// </summary>
     /// <since_tizen> 7 </since_tizen>
-    public class LottieAnimationView : ImageView
+    public partial class LottieAnimationView : ImageView
     {
-        #region Constructor, Distructor, Dispose
+        #region Constructor, Destructor, Dispose
         /// <summary>
         /// LottieAnimationView constructor
         /// </summary>
         /// <param name="scale">The factor of scaling image, default : 1.0f</param>
         /// <param name="shown">false : not displayed (hidden), true : displayed (shown), default : true</param>
         /// <remarks>
-        /// If shown parameter is false, it is not visible even the LottieAnimationView instance is created.
+        /// If the shown parameter is false, the animation is not visible even if the LottieAnimationView instance is created.
         /// </remarks>
         /// <example>
         /// <code>
@@ -51,7 +48,11 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public LottieAnimationView(float scale = 1.0f, bool shown = true) : base()
         {
-            tlog.Fatal(tag, $"< constructor GetId={GetId()} >");
+            ActionPlay = Interop.LottieAnimationView.AnimatedVectorImageVisualActionPlayGet();
+            ActionPause = Interop.LottieAnimationView.AnimatedVectorImageVisualActionPauseGet();
+            ActionStop = Interop.LottieAnimationView.AnimatedVectorImageVisualActionStopGet();
+
+            NUILog.Debug($"< constructor GetId={GetId()} >");
             currentStates.url = "";
             currentStates.frame = -1;
             currentStates.loopCount = 1;
@@ -62,6 +63,7 @@ namespace Tizen.NUI.BaseComponents
             currentStates.changed = false;
             currentStates.totalFrame = -1;
             currentStates.scale = scale;
+            currentStates.redrawInScalingDown = true;
             SetVisible(shown);
         }
 
@@ -78,8 +80,6 @@ namespace Tizen.NUI.BaseComponents
                 return;
             }
 
-            tlog.Fatal(tag, $"<[{GetId()}] type={type}");
-
             //Release your own unmanaged resources here.
             //You should not access any managed member here except static instance.
             //because the execution order of Finalizes is non-deterministic.
@@ -89,13 +89,12 @@ namespace Tizen.NUI.BaseComponents
             {
                 VisualEventSignal().Disconnect(visualEventSignalCallback);
                 finishedEventHandler = null;
-                tlog.Fatal(tag, $"disconnect event signal");
+                NUILog.Debug($"disconnect event signal");
             }
 
             base.Dispose(type);
-            tlog.Fatal(tag, $"[{GetId()}]>");
         }
-        #endregion Constructor, Distructor, Dispose
+        #endregion Constructor, Destructor, Dispose
 
 
         #region Property
@@ -105,13 +104,26 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public string URL
         {
+            get
+            {
+                return GetValue(URLProperty) as string;
+            }
+            set
+            {
+                SetValue(URLProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private string InternalURL
+        {
             set
             {
                 string ret = (value == null ? "" : value);
                 currentStates.url = ret;
                 currentStates.changed = true;
 
-                tlog.Fatal(tag, $"<[{GetId()}]SET url={currentStates.url}");
+                NUILog.Debug($"<[{GetId()}]SET url={currentStates.url}");
 
                 PropertyMap map = new PropertyMap();
                 map.Add(Visual.Property.Type, new PropertyValue((int)DevelVisual.Type.AnimatedVectorImage))
@@ -127,14 +139,14 @@ namespace Tizen.NUI.BaseComponents
                 {
                     Scale = new Vector3(currentStates.scale, currentStates.scale, 0.0f);
                 }
-                tlog.Fatal(tag, $"<[{GetId()}]>");
+                NUILog.Debug($"<[{GetId()}]>");
             }
             get
             {
                 string ret = currentStates.url;
-                tlog.Fatal(tag, $"<[{GetId()}] GET");
+                NUILog.Debug($"<[{GetId()}] GET");
 
-                PropertyMap map = Image;
+                PropertyMap map = base.Image;
                 if (map != null)
                 {
                     PropertyValue val = map.Find(ImageVisualProperty.URL);
@@ -142,7 +154,7 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            tlog.Fatal(tag, $"gotten url={ret} >");
+                            NUILog.Debug($"gotten url={ret} >");
                             return ret;
                         }
                     }
@@ -153,14 +165,14 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Get playing state
+        /// Gets the playing state
         /// </summary>
         /// <since_tizen> 7 </since_tizen>
         public PlayStateType PlayState
         {
             get
             {
-                tlog.Fatal(tag, $"< Get!");
+                NUILog.Debug($"< Get!");
                 PropertyMap map = base.Image;
                 var ret = 0;
                 if (map != null)
@@ -171,7 +183,7 @@ namespace Tizen.NUI.BaseComponents
                         if (val.Get(out ret))
                         {
                             currentStates.playState = (PlayStateType)ret;
-                            tlog.Fatal(tag, $"gotten play state={ret} >");
+                            NUILog.Debug($"gotten play state={ret} >");
                         }
                     }
                 }
@@ -184,7 +196,7 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Get the number of total frame
+        /// Get the number of total frames
         /// </summary>
         /// <since_tizen> 7 </since_tizen>
         public int TotalFrame
@@ -192,7 +204,7 @@ namespace Tizen.NUI.BaseComponents
             get
             {
                 int ret = -1;
-                PropertyMap map = Image;
+                PropertyMap map = base.Image;
                 if (map != null)
                 {
                     PropertyValue val = map.Find(ImageVisualProperty.TotalFrameNumber);
@@ -200,7 +212,7 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            //tlog.Fatal(tag,  $"TotalFrameNumber get! ret={ret}");
+                            //NUILog.Debug( $"TotalFrameNumber get! ret={ret}");
                             currentStates.totalFrame = ret;
                             return ret;
                         }
@@ -212,13 +224,13 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Set or Get current frame. When setting a specific frame, it is displayed as a still image.
+        /// Set or get the current frame. When setting a specific frame, it is displayed as a still image.
         /// </summary>
         /// <remarks>
-        /// Giving user set value when getting. If the out ranged frame is set, it is reset as minimum frame or maximum frame.
+        /// Gets the value set by a user. If the setting value is out-ranged, it is reset as a minimum frame or a maximum frame.
         /// </remarks>
         /// <example>
-        /// Let's say myLottie.json file has 100 frames originally, then it will have 0 ~ 99 range of frame index.
+        /// We assume that the animation in myLottie.json file has 100 frames originally. If so, its frame index will be 0 - 99.
         /// <code>
         /// LottieAnimationView myLottie = new LottieAnimationView();
         /// myLottie.URL = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "myLottie.json"; //myLottie.json's total frame is 100 (frame: 0~99)
@@ -232,16 +244,29 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public int CurrentFrame
         {
+            get
+            {
+                return (int)GetValue(CurrentFrameProperty);
+            }
+            set
+            {
+                SetValue(CurrentFrameProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private int InternalCurrentFrame
+        {
             set
             {
                 currentStates.frame = value;
-                tlog.Fatal(tag, $"<[{GetId()}]SET frame={currentStates.frame}>");
-                DoAction(vectorImageVisualIndex, (int)actionType.jumpTo, new PropertyValue(currentStates.frame));
+                NUILog.Debug($"<[{GetId()}]SET frame={currentStates.frame}>");
+                DoAction(ImageView.Property.IMAGE, ActionJumpTo, new PropertyValue(currentStates.frame));
             }
             get
             {
                 int ret = 0;
-                PropertyMap map = Image;
+                PropertyMap map = base.Image;
                 if (map != null)
                 {
                     PropertyValue val = map.Find(ImageVisualProperty.CurrentFrameNumber);
@@ -249,7 +274,7 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            //tlog.Fatal(tag,  $"CurrentFrameNumber get! val={ret}");
+                            //NUILog.Debug( $"CurrentFrameNumber get! val={ret}");
                             return ret;
                         }
                     }
@@ -260,24 +285,37 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Set or Get looping mode of Lottie animation.
+        /// Sets or gets the looping mode of Lottie animation.
         /// </summary>
         /// <since_tizen> 7 </since_tizen>
         public LoopingModeType LoopingMode
         {
+            get
+            {
+                return (LoopingModeType)GetValue(LoopingModeProperty);
+            }
+            set
+            {
+                SetValue(LoopingModeProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private LoopingModeType InternalLoopingMode
+        {
             set
             {
                 currentStates.loopMode = (LoopingModeType)value;
                 currentStates.changed = true;
 
-                tlog.Fatal(tag, $"<[{GetId()}] SET loopMode={currentStates.loopMode}>");
+                NUILog.Debug($"<[{GetId()}] SET loopMode={currentStates.loopMode}>");
                 PropertyMap map = new PropertyMap();
                 map.Add(ImageVisualProperty.LoopingMode, new PropertyValue((int)currentStates.loopMode));
-                DoAction(vectorImageVisualIndex, (int)actionType.updateProperty, new PropertyValue(map));
+                DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
             }
             get
             {
-                //tlog.Fatal(tag,  $"LoopMode get!");
+                //NUILog.Debug( $"LoopMode get!");
                 PropertyMap map = base.Image;
                 var ret = 0;
                 if (map != null)
@@ -287,10 +325,10 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            //tlog.Fatal(tag,  $"gotten LoopMode={ret}");
+                            //NUILog.Debug( $"gotten LoopMode={ret}");
                             if (ret != (int)currentStates.loopMode && ret > 0)
                             {
-                                tlog.Fatal(tag, $" [ERROR][{GetId()}](LottieAnimationView) different LoopMode! gotten={ret}, loopMode={currentStates.loopMode}");
+                                NUILog.Debug($" [ERROR][{GetId()}](LottieAnimationView) different LoopMode! gotten={ret}, loopMode={currentStates.loopMode}");
                             }
                             currentStates.loopMode = (LoopingModeType)ret;
                             return (LoopingModeType)ret;
@@ -303,10 +341,10 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Set or Get loop count. 
+        /// Sets or gets the loop count.
         /// </summary>
         /// <remarks>
-        /// Minus value means infinite loop count.
+        /// The minus value means the infinite loop count.
         /// </remarks>
         /// <example>
         /// <code>
@@ -323,18 +361,31 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public int LoopCount
         {
+            get
+            {
+                return (int)GetValue(LoopCountProperty);
+            }
+            set
+            {
+                SetValue(LoopCountProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private int InternalLoopCount
+        {
             set
             {
                 currentStates.changed = true;
                 currentStates.loopCount = value;
-                tlog.Fatal(tag, $"<[{GetId()}]SET currentStates.loopCount={currentStates.loopCount}>");
+                NUILog.Debug($"<[{GetId()}]SET currentStates.loopCount={currentStates.loopCount}>");
                 PropertyMap map = new PropertyMap();
                 map.Add(ImageVisualProperty.LoopCount, new PropertyValue(currentStates.loopCount));
-                DoAction(vectorImageVisualIndex, (int)actionType.updateProperty, new PropertyValue(map));
+                DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
             }
             get
             {
-                //tlog.Fatal(tag,  $"LoopCount get!");
+                //NUILog.Debug( $"LoopCount get!");
                 PropertyMap map = base.Image;
                 var ret = 0;
                 if (map != null)
@@ -344,10 +395,10 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            //tlog.Fatal(tag,  $"gotten loop count={ret}");
+                            //NUILog.Debug( $"gotten loop count={ret}");
                             if (ret != currentStates.loopCount && ret > 0)
                             {
-                                tlog.Fatal(tag, $"<[ERROR][{GetId()}](LottieAnimationView) different loop count! gotten={ret}, loopCount={currentStates.loopCount}>");
+                                NUILog.Debug($"<[ERROR][{GetId()}](LottieAnimationView) different loop count! gotten={ret}, loopCount={currentStates.loopCount}>");
                             }
                             currentStates.loopCount = ret;
                             return currentStates.loopCount;
@@ -360,24 +411,37 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Set or Get stop behavior.
+        /// Sets or gets the stop behavior.
         /// </summary>
         /// <since_tizen> 7 </since_tizen>
         public StopBehaviorType StopBehavior
         {
+            get
+            {
+                return (StopBehaviorType)GetValue(StopBehaviorProperty);
+            }
+            set
+            {
+                SetValue(StopBehaviorProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private StopBehaviorType InternalStopBehavior
+        {
             set
             {
                 currentStates.stopEndAction = (StopBehaviorType)value;
                 currentStates.changed = true;
 
-                tlog.Fatal(tag, $"<[{GetId()}]SET val={currentStates.stopEndAction}>");
+                NUILog.Debug($"<[{GetId()}]SET val={currentStates.stopEndAction}>");
                 PropertyMap map = new PropertyMap();
                 map.Add(ImageVisualProperty.StopBehavior, new PropertyValue((int)currentStates.stopEndAction));
-                DoAction(vectorImageVisualIndex, (int)actionType.updateProperty, new PropertyValue(map));
+                DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
             }
             get
             {
-                //tlog.Fatal(tag,  $"StopBehavior get!");
+                //NUILog.Debug( $"StopBehavior get!");
                 PropertyMap map = base.Image;
                 var ret = 0;
                 if (map != null)
@@ -387,10 +451,10 @@ namespace Tizen.NUI.BaseComponents
                     {
                         if (val.Get(out ret))
                         {
-                            //tlog.Fatal(tag,  $"gotten StopBehavior={ret}");
+                            //NUILog.Debug( $"gotten StopBehavior={ret}");
                             if (ret != (int)currentStates.stopEndAction)
                             {
-                                tlog.Fatal(tag, $"<[ERROR][{GetId()}](LottieAnimationView) different StopBehavior! gotten={ret}, StopBehavior={currentStates.stopEndAction}>");
+                                NUILog.Debug($"<[ERROR][{GetId()}](LottieAnimationView) different StopBehavior! gotten={ret}, StopBehavior={currentStates.stopEndAction}>");
                             }
                             currentStates.stopEndAction = (StopBehaviorType)ret;
                             return (StopBehaviorType)ret;
@@ -401,19 +465,84 @@ namespace Tizen.NUI.BaseComponents
                 return currentStates.stopEndAction;
             }
         }
+
+        /// <summary>
+        /// Whether to redraw the image when the visual is scaled down.
+        /// </summary>
+        /// <remarks>
+        /// Inhouse API.
+        /// It is used in the AnimatedVectorImageVisual.The default is true.
+        /// </remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool RedrawInScalingDown
+        {
+            get
+            {
+                return (bool)GetValue(RedrawInScalingDownProperty);
+            }
+            set
+            {
+                SetValue(RedrawInScalingDownProperty, value);
+                NotifyPropertyChanged();
+            }
+        }
+
+        private bool InternalRedrawInScalingDown
+        {
+            set
+            {
+                currentStates.changed = true;
+                currentStates.redrawInScalingDown = value;
+                NUILog.Debug($"<[{GetId()}]SET currentStates.redrawInScalingDown={currentStates.redrawInScalingDown}>");
+                PropertyMap map = new PropertyMap();
+                map.Add(ImageVisualProperty.RedrawInScalingDown, new PropertyValue(currentStates.redrawInScalingDown));
+                DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
+            }
+            get
+            {
+                PropertyMap map = base.Image;
+                var ret = true;
+                if (map != null)
+                {
+                    PropertyValue val = map.Find(ImageVisualProperty.RedrawInScalingDown);
+                    if (val != null)
+                    {
+                        if (val.Get(out ret))
+                        {
+                            if (ret != currentStates.redrawInScalingDown)
+                            {
+                                NUILog.Debug($"<[ERROR][{GetId()}](LottieAnimationView) different redrawInScalingDown! gotten={ret}, redrawInScalingDown={currentStates.redrawInScalingDown}>");
+                            }
+                            currentStates.redrawInScalingDown = ret;
+                            return currentStates.redrawInScalingDown;
+                        }
+                    }
+                }
+                Tizen.Log.Error(tag, $"<[ERROR][{GetId()}](LottieAnimationView) Fail to get redrawInScalingDown from dali currentStates.redrawInScalingDown={currentStates.redrawInScalingDown}>");
+                return currentStates.redrawInScalingDown;
+            }
+        }
+
+
+        /// <summary>
+        /// Actions property value to Jump to the specified frame.
+        /// This property can be redefined by child class if it use different value.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected int ActionJumpTo { get; set; } = Interop.LottieAnimationView.AnimatedVectorImageVisualActionJumpToGet();
         #endregion Property
 
 
         #region Method
         /// <summary>
-        /// Set minimum and maximum frame.
+        /// Set the minimum and the maximum frame.
         /// </summary>
         /// <param name="minFrame">minimum frame</param>
         /// <param name="maxFrame">maximum frame</param>
         /// <since_tizen> 7 </since_tizen>
         public void SetMinMaxFrame(int minFrame, int maxFrame)
         {
-            tlog.Fatal(tag, $"< [{GetId()}] SetPlayRange({minFrame}, {maxFrame})");
+            NUILog.Debug($"< [{GetId()}] SetPlayRange({minFrame}, {maxFrame})");
 
             currentStates.changed = true;
             currentStates.framePlayRangeMin = minFrame;
@@ -425,8 +554,8 @@ namespace Tizen.NUI.BaseComponents
 
             PropertyMap map = new PropertyMap();
             map.Add(ImageVisualProperty.PlayRange, new PropertyValue(array));
-            DoAction(vectorImageVisualIndex, (int)actionType.updateProperty, new PropertyValue(map));
-            tlog.Fatal(tag, $"  [{GetId()}] currentStates.min:({currentStates.framePlayRangeMin}, max:{currentStates.framePlayRangeMax})>");
+            DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
+            NUILog.Debug($"  [{GetId()}] currentStates.min:({currentStates.framePlayRangeMin}, max:{currentStates.framePlayRangeMax})>");
         }
 
         /// <summary>
@@ -435,10 +564,10 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public new void Play()
         {
-            tlog.Fatal(tag, $"<[{GetId()}] Play()");
+            NUILog.Debug($"<[{GetId()}] Play()");
             debugPrint();
             base.Play();
-            tlog.Fatal(tag, $"[{GetId()}]>");
+            NUILog.Debug($"[{GetId()}]>");
         }
 
         /// <summary>
@@ -447,10 +576,10 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public new void Pause()
         {
-            tlog.Fatal(tag, $"<[{GetId()}] Pause()>");
+            NUILog.Debug($"<[{GetId()}] Pause()>");
             debugPrint();
             base.Pause();
-            tlog.Fatal(tag, $"[{GetId()}]>");
+            NUILog.Debug($"[{GetId()}]>");
         }
 
         /// <summary>
@@ -459,20 +588,20 @@ namespace Tizen.NUI.BaseComponents
         /// <since_tizen> 7 </since_tizen>
         public new void Stop()
         {
-            tlog.Fatal(tag, $"<[{GetId()}] Stop()");
+            NUILog.Debug($"<[{GetId()}] Stop()");
             debugPrint();
             base.Stop();
-            tlog.Fatal(tag, $"[{GetId()}]>");
+            NUILog.Debug($"[{GetId()}]>");
         }
 
         /// <summary>
-        /// Get the list of layers' information (start frame, end frame) in Lottie file.
+        /// Get the list of layers' information such as the start frame and the end frame in the Lottie file.
         /// </summary>
         /// <returns>List of Tuple (string of layer name, integer of start frame, integer of end frame)</returns>
         /// <since_tizen> 7 </since_tizen>
         public List<Tuple<string, int, int>> GetContentInfo()
         {
-            tlog.Fatal(tag, $"<");
+            NUILog.Debug($"<");
             if (currentStates.contentInfo != null)
             {
                 return currentStates.contentInfo;
@@ -499,7 +628,7 @@ namespace Tizen.NUI.BaseComponents
                                 arr.GetElementAt(0).Get(out startFrame);
                                 arr.GetElementAt(1).Get(out endFrame);
 
-                                tlog.Fatal(tag, $"[{i}] layer name={key}, startFrame={startFrame}, endFrame={endFrame}");
+                                NUILog.Debug($"[{i}] layer name={key}, startFrame={startFrame}, endFrame={endFrame}");
 
                                 Tuple<string, int, int> item = new Tuple<string, int, int>(key, startFrame, endFrame);
 
@@ -509,12 +638,12 @@ namespace Tizen.NUI.BaseComponents
                     }
                 }
             }
-            tlog.Fatal(tag, $">");
+            NUILog.Debug($">");
             return currentStates.contentInfo;
         }
 
         /// <summary>
-        /// A marker has its start frame and end frame. 
+        /// A marker has its start frame and end frame.
         /// Animation will play between the start frame and the end frame of the marker if one marker is specified.
         /// Or animation will play between the start frame of the first marker and the end frame of the second marker if two markers are specified.   *
         /// </summary>
@@ -524,7 +653,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public void SetMinMaxFrameByMarker(string marker1, string marker2 = null)
         {
-            tlog.Fatal(tag, $"< [{GetId()}] SetMinMaxFrameByMarker({marker1}, {marker2})");
+            NUILog.Debug($"< [{GetId()}] SetMinMaxFrameByMarker({marker1}, {marker2})");
 
             currentStates.changed = true;
             currentStates.mark1 = marker1;
@@ -539,8 +668,8 @@ namespace Tizen.NUI.BaseComponents
 
             PropertyMap map = new PropertyMap();
             map.Add(ImageVisualProperty.PlayRange, new PropertyValue(array));
-            DoAction(vectorImageVisualIndex, (int)actionType.updateProperty, new PropertyValue(map));
-            tlog.Fatal(tag, $"  [{GetId()}] currentStates.mark1:{currentStates.mark1}, mark2:{currentStates.mark2} >");
+            DoAction(ImageView.Property.IMAGE, ActionUpdateProperty, new PropertyValue(map));
+            NUILog.Debug($"  [{GetId()}] currentStates.mark1:{currentStates.mark1}, mark2:{currentStates.mark2} >");
         }
 
         /// <summary>
@@ -551,7 +680,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Tuple<int, int> GetMinMaxFrame()
         {
-            tlog.Fatal(tag, $"< [{GetId()}] GetMinMaxFrame()! total frame={currentStates.totalFrame}");
+            NUILog.Debug($"< [{GetId()}] GetMinMaxFrame()! total frame={currentStates.totalFrame}");
 
             PropertyMap map = Image;
             if (map != null)
@@ -570,7 +699,7 @@ namespace Tizen.NUI.BaseComponents
                             int intRet;
                             if (v.Get(out intRet))
                             {
-                                tlog.Fatal(tag, $"Got play range of string [{i}]: {intRet}");
+                                NUILog.Debug($"Got play range of string [{i}]: {intRet}");
                                 if (i == 0)
                                 {
                                     item1 = intRet;
@@ -585,7 +714,7 @@ namespace Tizen.NUI.BaseComponents
                                 Tizen.Log.Error("NUI", $"[ERR] fail to get play range from dali! case#1");
                             }
                         }
-                        tlog.Fatal(tag, $"  [{GetId()}] GetMinMaxFrame(min:{item1}, max:{item2})! >");
+                        NUILog.Debug($"  [{GetId()}] GetMinMaxFrame(min:{item1}, max:{item2})! >");
                         return new Tuple<int, int>(item1, item2);
                     }
                 }
@@ -607,7 +736,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (finishedEventHandler == null)
                 {
-                    tlog.Fatal(tag, $"<[{GetId()}] Finished eventhandler added>");
+                    NUILog.Debug($"<[{GetId()}] Finished eventhandler added>");
                     visualEventSignalCallback = onVisualEventSignal;
                     VisualEventSignal().Connect(visualEventSignalCallback);
                 }
@@ -615,7 +744,7 @@ namespace Tizen.NUI.BaseComponents
             }
             remove
             {
-                tlog.Fatal(tag, $"<[{GetId()}] Finished eventhandler removed>");
+                NUILog.Debug($"<[{GetId()}] Finished eventhandler removed>");
                 finishedEventHandler -= value;
                 if (finishedEventHandler == null && visualEventSignalCallback != null)
                 {
@@ -761,18 +890,10 @@ namespace Tizen.NUI.BaseComponents
             internal PlayStateType playState;
             internal List<Tuple<string, int, int>> contentInfo;
             internal string mark1, mark2;
+            internal bool redrawInScalingDown;
         };
         private states currentStates;
 
-        private enum actionType
-        {
-            play,
-            pause,
-            stop,
-            jumpTo,
-            updateProperty,
-        };
-
         private struct DevelVisual
         {
             internal enum Type
@@ -783,12 +904,11 @@ namespace Tizen.NUI.BaseComponents
         }
 
         private const string tag = "NUITEST";
-        private const int vectorImageVisualIndex = 10000000 + 1000 + 2;
         private event EventHandler finishedEventHandler;
 
         private void OnFinished()
         {
-            tlog.Fatal(tag, $"<[{GetId()}] OnFinished()>");
+            NUILog.Debug($"<[{GetId()}] OnFinished()>");
             finishedEventHandler?.Invoke(this, null);
         }
 
@@ -801,11 +921,11 @@ namespace Tizen.NUI.BaseComponents
                 View v = Registry.GetManagedBaseHandleFromNativePtr(targetView) as View;
                 if (v != null)
                 {
-                    tlog.Fatal(tag, $"targetView is not null! name={v.Name}");
+                    NUILog.Debug($"targetView is not null! name={v.Name}");
                 }
                 else
                 {
-                    tlog.Fatal(tag, $"target is something created from dali");
+                    NUILog.Debug($"target is something created from dali");
                 }
             }
             VisualEventSignalArgs e = new VisualEventSignalArgs();
@@ -813,7 +933,7 @@ namespace Tizen.NUI.BaseComponents
             e.SignalId = signalId;
             visualEventSignalHandler?.Invoke(this, e);
 
-            tlog.Fatal(tag, $"<[{GetId()}] onVisualEventSignal()! visualIndex={visualIndex}, signalId={signalId}>");
+            NUILog.Debug($"<[{GetId()}] onVisualEventSignal()! visualIndex={visualIndex}, signalId={signalId}>");
         }
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
@@ -824,10 +944,11 @@ namespace Tizen.NUI.BaseComponents
 
         private void debugPrint()
         {
-            tlog.Fatal(tag, $"===================================");
-            tlog.Fatal(tag, $"<[{GetId()}] get currentStates : url={currentStates.url}, loopCount={currentStates.loopCount}, framePlayRangeMin/Max({currentStates.framePlayRangeMin},{currentStates.framePlayRangeMax}) ");
-            tlog.Fatal(tag, $"  get from Property : StopBehavior={StopBehavior}, LoopMode={LoopingMode}, LoopCount={LoopCount}, PlayState={PlayState} >");
-            tlog.Fatal(tag, $"===================================");
+            NUILog.Debug($"===================================");
+            NUILog.Debug($"<[{GetId()}] get currentStates : url={currentStates.url}, loopCount={currentStates.loopCount}, \nframePlayRangeMin/Max({currentStates.framePlayRangeMin},{currentStates.framePlayRangeMax}) ");
+            NUILog.Debug($"  get from Property : StopBehavior={StopBehavior}, LoopMode={LoopingMode}, LoopCount={LoopCount}, PlayState={PlayState}");
+            NUILog.Debug($"  RedrawInScalingDown={RedrawInScalingDown} >");
+            NUILog.Debug($"===================================");
         }
         #endregion Private
     }
@@ -836,7 +957,7 @@ namespace Tizen.NUI.BaseComponents
     /// A class containing frame informations for a LottieAnimationView.
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public class LottieFrameInfo
+    public class LottieFrameInfo : ICloneable
     {
         /// <summary>
         /// Creates a new instance with a playing range.
@@ -875,6 +996,32 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// Create a new instance from string.
+        /// Possible input : "0, 10", "10"
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static implicit operator LottieFrameInfo(string pair)
+        {
+            if (pair == null)
+            {
+                return null;
+            }
+
+            string[] parts = pair.Split(',');
+            if (parts.Length == 1)
+            {
+                return new LottieFrameInfo(Int32.Parse(parts[0].Trim(), CultureInfo.InvariantCulture));
+            }
+            else if (parts.Length == 2)
+            {
+                return new LottieFrameInfo(Int32.Parse(parts[0].Trim(), CultureInfo.InvariantCulture), Int32.Parse(parts[1].Trim(), CultureInfo.InvariantCulture));
+            }
+
+            Tizen.Log.Error("NUI", $"Can not convert string {pair} to LottieFrameInfo");
+            return null;
+        }
+
+        /// <summary>
         /// The start frame of the lottie animation.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
@@ -941,10 +1088,14 @@ namespace Tizen.NUI.BaseComponents
             }
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new LottieFrameInfo(StartFrame, EndFrame);
+
         private bool BeReadyToShow(LottieAnimationView lottieView)
         {
             // Validate input lottieView
-            if (null== lottieView || lottieView.PlayState == LottieAnimationView.PlayStateType.Invalid)
+            if (null == lottieView || lottieView.PlayState == LottieAnimationView.PlayStateType.Invalid)
             {
                 return false;
             }
@@ -958,4 +1109,4 @@ namespace Tizen.NUI.BaseComponents
             return true;
         }
     }
-}
\ No newline at end of file
+}