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

Commit bbced1b9 authored by Gil Dobjanschi's avatar Gil Dobjanschi Committed by Android (Google) Code Review
Browse files

Merge "Transition invalidation bug fix."

parents a9d02bf6 75159247
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.
     */