Skip to content

Commit

Permalink
[NUI] Remove old frame range if we set marker + Minor fix up when mar…
Browse files Browse the repository at this point in the history
…ker invalid

LottieAnimationView cache both frame range as int, and marker.
But two API set same property - PlayRange.

So if some code like below thing was not working well

```
  // Let "marker" frame range is 10~20

  lottieView.SetMinMaxFrame(30, 40); // play range become 30~40
  lottieView.SetMinMaxFrameByMarker(marker); // play range become 10~20
  lottieView.SetMinMaxFrame(30, 40); // play range need to be 30~40 again, but it didn't due to the cache.
```

To avoid like above case, let we clean cache explicit parameter.

Also, Let we add some more error check if app use invalid marker
(Lottie file not loaded, or marker is invalid.)

In this case, let we just follow minMaxSetTypes.NotSetByUser logic then.

Signed-off-by: Eunki Hong <[email protected]>
  • Loading branch information
Eunki Hong authored and hinohie committed Nov 15, 2023
1 parent ad1085d commit d3ce0ab
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 12 deletions.
63 changes: 56 additions & 7 deletions src/Tizen.NUI/src/public/BaseComponents/AnimatedVectorImageView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ private int InternalRepeatCount

/// <summary>
/// TotalFrame of animation.
/// If resouce is still not be loaded, or invalid resource, the value is 0.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public new int TotalFrame
Expand Down Expand Up @@ -318,6 +319,10 @@ public void SetMinAndMaxFrame(int minFrame, int maxFrame)
maximumFrame = (maxFrame) > 0 ? maxFrame : 0;
isMinMaxFrameSet = minMaxSetTypes.SetByMinAndMaxFrameMethod;

// Remove marker information.
minimumFrameMarker = null;
maximumFrameMarker = null;

if (minimumFrame > maximumFrame)
{
NUILog.Debug($" [{GetId()}] minimumFrame:{minimumFrame} > maximumFrame:{maximumFrame}) ]AnimatedVectorImageView END]");
Expand All @@ -332,6 +337,10 @@ public void SetMinAndMaxFrame(int minFrame, int maxFrame)
/// 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>
/// <remarks>
/// If we use invaliad markers, or we load image asynchronous and load is not finished yet,
/// CurrentFrame might not be matched with real value.
/// </remarks>
/// <param name="marker1">First marker</param>
/// <param name="marker2">Second marker</param>
[EditorBrowsable(EditorBrowsableState.Never)]
Expand All @@ -343,6 +352,10 @@ public void SetMinAndMaxFrameByMarker(string marker1, string marker2 = null)
maximumFrameMarker = marker2;
isMinMaxFrameSet = minMaxSetTypes.SetByMinAndMaxFrameByMarkerMethod;

// Remove frame information.
minimumFrame = -1;
maximumFrame = -1;

NUILog.Debug($" [{GetId()}] minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker}) ]AnimatedVectorImageView END]");
}

Expand All @@ -360,6 +373,10 @@ public void SetMinAndMaxFrameByMarker(string marker1, string marker2 = null)
maximumFrame = (maxFrame) > 0 ? maxFrame : 0;
isMinMaxFrameSet = minMaxSetTypes.SetByBaseSetMinMaxFrameMethod;

// Remove marker information.
minimumFrameMarker = null;
maximumFrameMarker = null;

if (minimumFrame >= totalFrameNum)
{
minimumFrame = totalFrameNum - 1;
Expand All @@ -384,7 +401,15 @@ public void SetMinAndMaxFrameByMarker(string marker1, string marker2 = null)
public new void SetMinMaxFrameByMarker(string marker1, string marker2 = null)
{
NUILog.Debug($"SetMinMaxFrameByMarker({marker1}, {marker2})");

minimumFrameMarker = marker1;
maximumFrameMarker = marker2;
isMinMaxFrameSet = minMaxSetTypes.SetByMarker;

// Remove frame information.
minimumFrame = -1;
maximumFrame = -1;

base.SetMinMaxFrameByMarker(marker1, marker2);
}

Expand Down Expand Up @@ -416,6 +441,12 @@ public void SetMinAndMaxFrameByMarker(string marker1, string marker2 = null)
base.CurrentFrame = minimumFrame;
innerCurrentFrame = minimumFrame;
}
else
{
Tizen.Log.Error("NUI", $"[Warning] Play with invalid marker! Current frame become 0\n");
base.CurrentFrame = 0;
innerCurrentFrame = 0;
}
break;

case minMaxSetTypes.SetByMinAndMaxFrameMethod:
Expand Down Expand Up @@ -522,8 +553,28 @@ public void Stop(EndActions endAction = EndActions.Cancel)
break;

case minMaxSetTypes.SetByMinAndMaxFrameByMarkerMethod:
GetFrameValueFromMarkerInfo();
goto case minMaxSetTypes.SetByMinAndMaxFrameMethod;
if (GetFrameValueFromMarkerInfo())
{
goto case minMaxSetTypes.SetByMinAndMaxFrameMethod;
}
else
{
switch (endAction)
{
case EndActions.Cancel:
innerCurrentFrame = base.CurrentFrame;
break;
case EndActions.Discard:
Tizen.Log.Error("NUI", $"[Warning] Stop(Discard) with invalid marker! Current frame become 0\n");
base.CurrentFrame = innerCurrentFrame = 0;
break;
case EndActions.StopFinal:
Tizen.Log.Error("NUI", $"[Warning] Stop(StopFinal) with invalid marker! Current frame become {totalFrameNum - 1}\n");
base.CurrentFrame = innerCurrentFrame = totalFrameNum - 1;
break;
}
break;
}

case minMaxSetTypes.SetByMinAndMaxFrameMethod:
switch (endAction)
Expand Down Expand Up @@ -630,7 +681,7 @@ internal bool GetFrameValueFromMarkerInfo()
{
if (markerInfo.Item1 == minimumFrameMarker)
{
if (maximumFrameMarker == null)
if (string.IsNullOrEmpty(maximumFrameMarker))
{
minimumMarkerFoundSuccess = true;
maximumMarkerFoundSuccess = true;
Expand Down Expand Up @@ -662,16 +713,14 @@ internal bool GetFrameValueFromMarkerInfo()
}

// Note : let we insure to get marker frame value only one time per each frame marker setter
minimumFrameMarker = maximumFrameMarker = null;
minimumFrameMarker = null;
maximumFrameMarker = null;
isMinMaxFrameSet = minMaxSetTypes.SetByMinAndMaxFrameMethod;
return true;
}
else
{
Tizen.Log.Error("NUI", $"Fail to get frame from marker = (minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker}). Maybe file is not loaded yet, or invalid marker used. url : {resourceUrl}\n");

minimumFrame = 0;
maximumFrame = totalFrameNum - 1;
NUILog.Debug($" [{GetId()}] GetFrameValueFromMarkerInfo Failed! frame set as {minimumFrame} ~ {maximumFrame} : marker = (minimumFrameMarker:{minimumFrameMarker}, maximumFrameMarker:{maximumFrameMarker})");
return false;
}
Expand Down
20 changes: 15 additions & 5 deletions src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,8 @@ public PlayStateType PlayState
}

/// <summary>
/// Get the number of total frames
/// Get the number of total frames.
/// If resouce is still not be loaded, or invalid resource, the value is 0.
/// </summary>
/// <since_tizen> 7 </since_tizen>
public int TotalFrame
Expand Down Expand Up @@ -552,6 +553,10 @@ public void SetMinMaxFrame(int minFrame, int maxFrame)
currentStates.framePlayRangeMin = minFrame;
currentStates.framePlayRangeMax = maxFrame;

// Remove marker information.
currentStates.mark1 = null;
currentStates.mark2 = null;

Interop.View.InternalUpdateVisualPropertyIntPair(this.SwigCPtr, ImageView.Property.IMAGE, ImageVisualProperty.PlayRange, currentStates.framePlayRangeMin, currentStates.framePlayRangeMax);

NUILog.Debug($" [{GetId()}] currentStates.min:({currentStates.framePlayRangeMin}, max:{currentStates.framePlayRangeMax})>");
Expand Down Expand Up @@ -714,22 +719,27 @@ public List<Tuple<string, int, int>> GetMarkerInfo()
/// <summary>
/// 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. *
/// 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>
/// <param name="marker1">First marker</param>
/// <param name="marker2">Second marker</param>
// This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
[EditorBrowsable(EditorBrowsableState.Never)]
public void SetMinMaxFrameByMarker(string marker1, string marker2 = null)
{
if (currentStates.mark1 != marker1 || currentStates.mark2 != marker2)
string marker1OrEmpty = marker1 ?? ""; // mark1 should not be null
if (currentStates.mark1 != marker1OrEmpty || currentStates.mark2 != marker2)
{
NUILog.Debug($"< [{GetId()}] SetMinMaxFrameByMarker({marker1}, {marker2})");
NUILog.Debug($"< [{GetId()}] SetMinMaxFrameByMarker({marker1OrEmpty}, {marker2})");

currentStates.changed = true;
currentStates.mark1 = marker1;
currentStates.mark1 = marker1OrEmpty;
currentStates.mark2 = marker2;

// Remove frame information.
currentStates.framePlayRangeMin = -1;
currentStates.framePlayRangeMax = -1;

if (string.IsNullOrEmpty(currentStates.mark2))
{
Interop.View.InternalUpdateVisualPropertyString(this.SwigCPtr, ImageView.Property.IMAGE, ImageVisualProperty.PlayRange, currentStates.mark1);
Expand Down

0 comments on commit d3ce0ab

Please sign in to comment.