blob: e2f971033af631a7e3de3d17d77f20e5a0434b11 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.videoeditor.service;
import java.io.IOException;
import android.content.Context;
import android.media.videoeditor.MediaItem;
import android.media.videoeditor.Transition;
import android.media.videoeditor.TransitionAlpha;
import android.media.videoeditor.TransitionCrossfade;
import android.media.videoeditor.TransitionFadeBlack;
import android.media.videoeditor.TransitionSliding;
import com.android.videoeditor.R;
import com.android.videoeditor.TransitionType;
import com.android.videoeditor.util.FileUtils;
/**
* This class represents a transition in the user interface
*/
public class MovieTransition {
// The unique id of the transition
private final String mUniqueId;
private final Class<?> mTypeClass;
private final int mType;
private final int mBehavior;
private final int mSlidingDirection;
private final String mAlphaMaskFilename;
private final int mAlphaMaskResId;
private final int mAlphaMaskBlendingPercent;
private final boolean mAlphaInvert;
private long mDurationMs;
private long mAppDurationMs;
/**
* Constructor
*
* @param transition The transition
*/
MovieTransition(Transition transition) {
mTypeClass = transition.getClass();
mUniqueId = transition.getId();
mAppDurationMs = mDurationMs = transition.getDuration();
mBehavior = transition.getBehavior();
if (transition instanceof TransitionSliding) {
mSlidingDirection = ((TransitionSliding)transition).getDirection();
} else {
mSlidingDirection = -1;
}
if (transition instanceof TransitionAlpha) {
final TransitionAlpha ta = (TransitionAlpha)transition;
mAlphaMaskFilename = ta.getMaskFilename();
mAlphaMaskResId = 0;
mAlphaMaskBlendingPercent = ta.getBlendingPercent();
mAlphaInvert = ta.isInvert();
} else {
mAlphaMaskFilename = null;
mAlphaMaskResId = 0;
mAlphaMaskBlendingPercent = 0;
mAlphaInvert = false;
}
mType = toType();
}
/**
* Constructor
*
* @param type The transition type
* @param id The transition id
* @param durationMs The duration in milliseconds
* @param behavior The behavior
*/
MovieTransition(Class<?> type, String id, long durationMs, int behavior) {
mTypeClass = type;
mUniqueId = id;
mAppDurationMs = mDurationMs = durationMs;
mBehavior = behavior;
mSlidingDirection = -1;
mAlphaMaskFilename = null;
mAlphaMaskResId = 0;
mAlphaMaskBlendingPercent = 0;
mAlphaInvert = false;
mType = toType();
}
/**
* Constructor for sliding transitions
*
* @param type The transition type
* @param id The transition id
* @param durationMs The duration in milliseconds
* @param behavior The behavior
* @param slidingDirection The sliding direction
*/
MovieTransition(Class<?> type, String id, long durationMs, int behavior,
int slidingDirection) {
mTypeClass = type;
mUniqueId = id;
mAppDurationMs = mDurationMs = durationMs;
mBehavior = behavior;
mSlidingDirection = slidingDirection;
mAlphaMaskFilename = null;
mAlphaMaskResId = 0;
mAlphaMaskBlendingPercent = 0;
mAlphaInvert = false;
mType = toType();
}
/**
* Constructor for alpha transitions
*
* @param type The transition type
* @param id The transition id
* @param durationMs The duration in milliseconds
* @param behavior The behavior
* @param maskResId The mask resource id
* @param blendingPercent The blending (in percentages)
* @param invert true to invert the direction of the alpha blending
*/
MovieTransition(Class<?> type, String id, long durationMs, int behavior,
int maskResId, int blendingPercent, boolean invert) {
mTypeClass = type;
mUniqueId = id;
mAppDurationMs = mDurationMs = durationMs;
mBehavior = behavior;
mSlidingDirection = -1;
mAlphaMaskFilename = null;
mAlphaMaskResId = maskResId;
mAlphaMaskBlendingPercent = blendingPercent;
mAlphaInvert = invert;
mType = toType();
}
/**
* @return The type class of the transition
*/
public Class<?> getTypeClass() {
return mTypeClass;
}
/**
* @return The type of the transition
*/
public int getType() {
return mType;
}
/**
* @return The id of the transition
*/
public String getId() {
return mUniqueId;
}
/**
* Set the duration of the transition.
*
* @param durationMs the duration of the transition in milliseconds
*/
void setDuration(long durationMs) {
mDurationMs = durationMs;
}
/**
* @return the duration of the transition in milliseconds
*/
long getDuration() {
return mDurationMs;
}
/**
* Set the duration of the transition
*
* @param durationMs The duration in milliseconds
*/
public void setAppDuration(long durationMs) {
mAppDurationMs = durationMs;
}
/**
* @return The duration of the transition
*/
public long getAppDuration() {
return mAppDurationMs;
}
/**
* @return The behavior
*/
public int getBehavior() {
return mBehavior;
}
/**
* @return The sliding direction (only for TransitionSliding)
*/
public int getSlidingDirection() {
return mSlidingDirection;
}
/**
* @return The alpha mask filename
*/
public String getAlphaMaskFilename() {
return mAlphaMaskFilename;
}
/**
* @return The alpha mask resource id
*/
public int getAlphaMaskResId() {
return mAlphaMaskResId;
}
/**
* @return The alpha blending percentage
*/
public int getAlphaMaskBlendingPercent() {
return mAlphaMaskBlendingPercent;
}
/**
* @return true if the direction of the alpha blending is inverted
*/
public boolean isAlphaInverted() {
return mAlphaInvert;
}
/**
* Create a VideoEditor transition
*
* @param context the context
* @param afterMediaItem Add the transition after this media item
* @param beforeMediaItem Add the transition before this media item
*
* @return The transition
*/
Transition buildTransition(Context context, MediaItem afterMediaItem,
MediaItem beforeMediaItem) throws IOException {
if (TransitionCrossfade.class.equals(mTypeClass)) {
return new TransitionCrossfade(ApiService.generateId(), afterMediaItem,
beforeMediaItem, mDurationMs, mBehavior);
} else if (TransitionAlpha.class.equals(mTypeClass)) {
return new TransitionAlpha(ApiService.generateId(), afterMediaItem,
beforeMediaItem, mDurationMs, mBehavior,
FileUtils.getMaskFilename(context, mAlphaMaskResId), mAlphaMaskBlendingPercent,
mAlphaInvert);
} else if (TransitionFadeBlack.class.equals(mTypeClass)) {
return new TransitionFadeBlack(ApiService.generateId(), afterMediaItem,
beforeMediaItem, mDurationMs, mBehavior);
} else if (TransitionSliding.class.equals(mTypeClass)) {
return new TransitionSliding(ApiService.generateId(), afterMediaItem,
beforeMediaItem, mDurationMs, mBehavior, mSlidingDirection);
} else {
return null;
}
}
/**
* Convert the type to an integer
*
* @return The type
*/
private int toType() {
if (TransitionCrossfade.class.equals(mTypeClass)) {
return TransitionType.TRANSITION_TYPE_CROSSFADE;
} else if (TransitionAlpha.class.equals(mTypeClass)) {
final int rawId = FileUtils.getMaskRawId(mAlphaMaskFilename);
switch (rawId) {
case R.raw.mask_contour: {
return TransitionType.TRANSITION_TYPE_ALPHA_CONTOUR;
}
case R.raw.mask_diagonal: {
return TransitionType.TRANSITION_TYPE_ALPHA_DIAGONAL;
}
default: {
throw new IllegalArgumentException("Unknown id for: " + mAlphaMaskFilename);
}
}
} else if (TransitionFadeBlack.class.equals(mTypeClass)) {
return TransitionType.TRANSITION_TYPE_FADE_BLACK;
} else if (TransitionSliding.class.equals(mTypeClass)) {
switch (mSlidingDirection) {
case TransitionSliding.DIRECTION_BOTTOM_OUT_TOP_IN: {
return TransitionType.TRANSITION_TYPE_SLIDING_BOTTOM_OUT_TOP_IN;
}
case TransitionSliding.DIRECTION_LEFT_OUT_RIGHT_IN: {
return TransitionType.TRANSITION_TYPE_SLIDING_LEFT_OUT_RIGHT_IN;
}
case TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN: {
return TransitionType.TRANSITION_TYPE_SLIDING_RIGHT_OUT_LEFT_IN;
}
case TransitionSliding.DIRECTION_TOP_OUT_BOTTOM_IN: {
return TransitionType.TRANSITION_TYPE_SLIDING_TOP_OUT_BOTTOM_IN;
}
default: {
throw new IllegalArgumentException("Unknown direction: " + mSlidingDirection);
}
}
} else {
throw new IllegalArgumentException("Unknown type: " + mTypeClass);
}
}
/*
* {@inheritDoc}
*/
@Override
public boolean equals(Object object) {
if (!(object instanceof MovieTransition)) {
return false;
}
return mUniqueId.equals(((MovieTransition)object).mUniqueId);
}
/*
* {@inheritDoc}
*/
@Override
public int hashCode() {
return mUniqueId.hashCode();
}
}