Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75159247 authored by Gil Dobjanschi's avatar Gil Dobjanschi
Browse files

Transition invalidation bug fix.

Change-Id: I2ca901a805e377fb7d3374281a986b82bcf02590
parent 83e40921
Loading
Loading
Loading
Loading
+96 −47
Original line number Diff line number Diff line
@@ -162,62 +162,41 @@ public class MediaImageItem extends MediaItem {
     * @param durationMs The duration of the image in the storyboard timeline
     */
    public void setDuration(long durationMs) {
        // Invalidate the beginning and end transitions if necessary
        if (mBeginTransition != null) {
            final long transitionDurationMs = mBeginTransition.getDuration();

            // The begin transition must be invalidated if it overlaps with
            // an effect. To optimize this code we could invalidate the
            // begin transition only for a Ken Burns effect (color effects
            // should not affect the begin transition) however when new effects
            // will be added this code would have to be modified... so we
            // opted to always invalidate the transition if there is an
            // overlap.
            final List<Effect> effects = getAllEffects();
            for (Effect effect : effects) {
                // Check if the effect overlaps with the begin transition
                if (effect.getStartTime() < transitionDurationMs) {
                    mBeginTransition.invalidate();
                    break;
                }
            }
        if (durationMs == mDurationMs) {
            return;
        }

        if (mEndTransition != null) {
            final long transitionDurationMs = mEndTransition.getDuration();

            // The end transition must be invalidated if it overlaps with
            // an effect
            final List<Effect> effects = getAllEffects();
            for (Effect effect : effects) {
                // Check if the effect overlaps with the end transition
                if (effect.getStartTime() + effect.getDuration() >
                            mDurationMs - transitionDurationMs) {
                    mEndTransition.invalidate();
                    break;
                }
            }
        // Invalidate the end transitions if necessary.
        // This invalidation is necessary for the case in which an effect or
        // an overlay is overlapping with the end transition
        // (before the duration is changed) and it no longer overlaps with the
        // transition after the duration is increased.

            if (mEndTransition.isGenerated()) {
                // The end transition must be invalidated if it overlaps with
                // an overlay
                final List<Overlay> overlays = getAllOverlays();
                for (Overlay overlay : overlays) {
                    // Check if the overlay overlaps with the end transition
                    if (overlay.getStartTime() + overlay.getDuration() >
                                mDurationMs - transitionDurationMs) {
                        mEndTransition.invalidate();
                        break;
                    }
                }
            }
        }
        // The beginning transition does not need to be invalidated at this time
        // because an effect or an overlay overlaps with the beginning
        // transition, the begin transition is unaffected by a media item
        // duration change.
        invalidateEndTransition();

        final long oldDurationMs = mDurationMs;
        mDurationMs = durationMs;

        adjustTransitions();
        adjustOverlays();
        adjustEffects();

        // Invalidate the beginning and end transitions after adjustments.
        // This invalidation is necessary for the case in which an effect or
        // an overlay was not overlapping with the beginning or end transitions
        // before the setDuration reduces the duration of the media item and
        // causes an overlap of the beginning and/or end transition with the
        // effect.
        // If the duration is growing, the begin transition does not need to
        // be invalidated since the effects, overlays are not adjusted.
        if (mDurationMs < oldDurationMs) {
            invalidateBeginTransition();
        }
        invalidateEndTransition();
    }

    /*
@@ -277,6 +256,76 @@ public class MediaImageItem extends MediaItem {
        }
    }

    /**
     * Invalidate the begin transition if any effects and overlays overlap
     * with the begin transition.
     */
    private void invalidateBeginTransition() {
        if (mBeginTransition != null && mBeginTransition.isGenerated()) {
            final long transitionDurationMs = mBeginTransition.getDuration();

            // The begin transition must be invalidated if it overlaps with
            // an effect.
            final List<Effect> effects = getAllEffects();
            for (Effect effect : effects) {
                // Check if the effect overlaps with the begin transition
                if (effect.getStartTime() < transitionDurationMs) {
                    mBeginTransition.invalidate();
                    break;
                }
            }

            if (mBeginTransition.isGenerated()) {
                // The end transition must be invalidated if it overlaps with
                // an overlay.
                final List<Overlay> overlays = getAllOverlays();
                for (Overlay overlay : overlays) {
                    // Check if the overlay overlaps with the end transition
                    if (overlay.getStartTime() < transitionDurationMs) {
                        mBeginTransition.invalidate();
                        break;
                    }
                }
            }
        }
    }

    /**
     * Invalidate the end transition if any effects and overlays overlap
     * with the end transition.
     */
    private void invalidateEndTransition() {
        if (mEndTransition != null && mEndTransition.isGenerated()) {
            final long transitionDurationMs = mEndTransition.getDuration();

            // The end transition must be invalidated if it overlaps with
            // an effect.
            final List<Effect> effects = getAllEffects();
            for (Effect effect : effects) {
                // Check if the effect overlaps with the end transition
                if (effect.getStartTime() + effect.getDuration() >
                            mDurationMs - transitionDurationMs) {
                    mEndTransition.invalidate();
                    break;
                }
            }

            if (mEndTransition.isGenerated()) {
                // The end transition must be invalidated if it overlaps with
                // an overlay.
                final List<Overlay> overlays = getAllOverlays();
                for (Overlay overlay : overlays) {
                    // Check if the overlay overlaps with the end transition
                    if (overlay.getStartTime() + overlay.getDuration() >
                                mDurationMs - transitionDurationMs) {
                        mEndTransition.invalidate();
                        break;
                    }
                }
            }
        }
    }

    /**
     * Adjust the start time and/or duration of effects.
     */