172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.model;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ContentRestrictionException;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.smil.SmilParElementImpl;
22f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.ContentType;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.Event;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventListener;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.ElementTime;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
280ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylorimport android.util.Config;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
30d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huangimport android.text.TextUtils;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Collection;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Iterator;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.List;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ListIterator;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
387fa61cafe50deb74beb0819bdf52128239d50201Wei Huangpublic class SlideModel extends Model implements List<MediaModel>, EventListener {
399242286c35743422051d439d7460cd0a1426899cWei Huang    public static final String TAG = "Mms/slideshow";
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
410ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int DEFAULT_SLIDE_DURATION = 5000;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final ArrayList<MediaModel> mMedia = new ArrayList<MediaModel>();
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mText;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mImage;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mAudio;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mVideo;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddImage = true;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddAudio = true;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddVideo = true;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mDuration;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mVisible = true;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private short mFill;
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mSlideSize;
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private SlideshowModel mParent;
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(SlideshowModel slideshow) {
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        this(DEFAULT_SLIDE_DURATION, slideshow);
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(int duration, SlideshowModel slideshow) {
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mParent = slideshow;
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Create a SlideModel with exist media collection.
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param duration The duration of the slide.
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param mediaList The exist media collection.
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws IllegalStateException One or more media in the mediaList cannot
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         be added into the slide due to a slide cannot contain image
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         and video or audio and video at the same time.
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(int duration, ArrayList<MediaModel> mediaList) {
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int maxDur = 0;
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mediaList) {
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            internalAdd(media);
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int mediaDur = media.getDuration();
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mediaDur > maxDur) {
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                maxDur = mediaDur;
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        updateDuration(maxDur);
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void internalAdd(MediaModel media) throws IllegalStateException {
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (media == null) {
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Don't add null value into the list.
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (media.isText()) {
103d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            String contentType = media.getContentType();
1047c8748972faf3078f53ef9ecbe6c95f0903f43f7satok            if (TextUtils.isEmpty(contentType) || ContentType.TEXT_PLAIN.equals(contentType)
1057c8748972faf3078f53ef9ecbe6c95f0903f43f7satok                    || ContentType.TEXT_HTML.equals(contentType)) {
106d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                internalAddOrReplace(mText, media);
107d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                mText = media;
108d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            } else {
109d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
110d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                        " isn't supported (as text)");
111d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            }
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isImage()) {
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddImage) {
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mImage, media);
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mImage = media;
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = false;
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1184ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1194ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add image in this state");
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isAudio()) {
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddAudio) {
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mAudio, media);
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mAudio = media;
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = false;
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1274ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1284ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add audio in this state");
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isVideo()) {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddVideo) {
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mVideo, media);
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mVideo = media;
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddImage = false;
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddAudio = false;
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1374ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1384ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add video in this state");
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void internalAddOrReplace(MediaModel old, MediaModel media) {
14410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // If the media is resizable, at this point consider it to be zero length.
14510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // Just before we send the slideshow, we take the remaining space in the
14610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // slideshow and equally allocate it to all the resizeable media items and resize them.
14710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        int addSize = media.getMediaResizable() ? 0 : media.getMediaSize();
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int removeSize;
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (old == null) {
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (null != mParent) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mParent.checkMessageSize(addSize);
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.add(media);
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            increaseSlideSize(addSize);
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            increaseMessageSize(addSize);
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
1574799c671cd7925c7d8098bc3a743c0e83701bb34Matthias Thomae            removeSize = old.getMediaResizable() ? 0 : old.getMediaSize();
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (addSize > removeSize) {
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (null != mParent) {
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mParent.checkMessageSize(addSize - removeSize);
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                increaseSlideSize(addSize - removeSize);
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                increaseMessageSize(addSize - removeSize);
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseSlideSize(removeSize - addSize);
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseMessageSize(removeSize - addSize);
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.set(mMedia.indexOf(old), media);
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            old.unregisterAllModelChangedObservers();
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (IModelChangedObserver observer : mModelChangedObservers) {
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.registerModelChangedObserver(observer);
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean internalRemove(Object object) {
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMedia.remove(object)) {
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (object instanceof TextModel) {
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mText = null;
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof ImageModel) {
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mImage = null;
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = true;
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof AudioModel) {
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mAudio = null;
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = true;
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof VideoModel) {
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mVideo = null;
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddImage = true;
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddAudio = true;
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
19210eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // If the media is resizable, at this point consider it to be zero length.
19310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // Just before we send the slideshow, we take the remaining space in the
19410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // slideshow and equally allocate it to all the resizeable media items and resize them.
19510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            int decreaseSize = ((MediaModel) object).getMediaResizable() ? 0
19610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor                                        : ((MediaModel) object).getMediaSize();
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            decreaseSlideSize(decreaseSize);
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            decreaseMessageSize(decreaseSize);
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((Model) object).unregisterAllModelChangedObservers();
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mDuration
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getDuration() {
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDuration;
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param duration the mDuration to set
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setDuration(int duration) {
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getSlideSize() {
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSlideSize;
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void increaseSlideSize(int increaseSize) {
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (increaseSize > 0) {
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mSlideSize += increaseSize;
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void decreaseSlideSize(int decreaseSize) {
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (decreaseSize > 0) {
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mSlideSize -= decreaseSize;
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setParent(SlideshowModel parent) {
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mParent = parent;
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void increaseMessageSize(int increaseSize) {
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((increaseSize > 0) && (null != mParent)) {
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int size = mParent.getCurrentMessageSize();
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            size += increaseSize;
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mParent.setCurrentMessageSize(size);
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void decreaseMessageSize(int decreaseSize) {
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((decreaseSize > 0) && (null != mParent)) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int size = mParent.getCurrentMessageSize();
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            size -= decreaseSize;
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mParent.setCurrentMessageSize(size);
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    //
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // Implement List<E> interface.
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    //
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Add a MediaModel to the slide. If the slide has already contained
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * a media object in the same type, the media object will be replaced by
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * the new one.
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param object A media object to be added into the slide.
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return true
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws IllegalStateException One or more media in the mediaList cannot
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         be added into the slide due to a slide cannot contain image
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         and video or audio and video at the same time.
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws ContentRestrictionException when can not add this object.
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean add(MediaModel object) {
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        internalAdd(object);
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return true;
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addAll(Collection<? extends MediaModel> collection) {
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void clear() {
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMedia.size() > 0) {
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            for (MediaModel media : mMedia) {
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                media.unregisterAllModelChangedObservers();
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int decreaseSize = media.getMediaSize();
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseSlideSize(decreaseSize);
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseMessageSize(decreaseSize);
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.clear();
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mText = null;
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mImage = null;
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mAudio = null;
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVideo = null;
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddImage = true;
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddAudio = true;
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddVideo = true;
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean contains(Object object) {
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.contains(object);
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean containsAll(Collection<?> collection) {
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.containsAll(collection);
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isEmpty() {
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.isEmpty();
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Iterator<MediaModel> iterator() {
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.iterator();
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean remove(Object object) {
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((object != null) && (object instanceof MediaModel)
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                && internalRemove(object)) {
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeAll(Collection<?> collection) {
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean retainAll(Collection<?> collection) {
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int size() {
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.size();
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Object[] toArray() {
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.toArray();
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public <T> T[] toArray(T[] array) {
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.toArray(array);
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void add(int location, MediaModel object) {
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addAll(int location,
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Collection<? extends MediaModel> collection) {
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel get(int location) {
3644ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang        if (mMedia.size() == 0) {
3654ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang            return null;
3664ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang        }
3674ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.get(location);
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int indexOf(Object object) {
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.indexOf(object);
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int lastIndexOf(Object object) {
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.lastIndexOf(object);
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ListIterator<MediaModel> listIterator() {
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.listIterator();
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ListIterator<MediaModel> listIterator(int location) {
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.listIterator(location);
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel remove(int location) {
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MediaModel media = mMedia.get(location);
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((media != null) && internalRemove(media)) {
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return media;
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel set(int location, MediaModel object) {
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public List<MediaModel> subList(int start, int end) {
40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.subList(start, end);
40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mVisible
40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isVisible() {
40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mVisible;
40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param visible the mVisible to set
41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setVisible(boolean visible) {
41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mVisible = visible;
41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mFill
42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getFill() {
42272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mFill;
42372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
42472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
42572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
42672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param fill the mFill to set
42772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
42872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setFill(short fill) {
42972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFill = fill;
43072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
43172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void registerModelChangedObserverInDescendants(
43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            IModelChangedObserver observer) {
43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.registerModelChangedObserver(observer);
43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void unregisterModelChangedObserverInDescendants(
44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            IModelChangedObserver observer) {
44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.unregisterModelChangedObserver(observer);
44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
45072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void unregisterAllModelChangedObserversInDescendants() {
45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.unregisterAllModelChangedObservers();
45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // EventListener Interface
45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void handleEvent(Event evt) {
45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (evt.getType().equals(SmilParElementImpl.SMIL_SLIDE_START_EVENT)) {
45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (LOCAL_LOGV) {
46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.v(TAG, "Start to play slide: " + this);
46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = true;
46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (mFill != ElementTime.FILL_FREEZE) {
46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (LOCAL_LOGV) {
46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.v(TAG, "Stop playing slide: " + this);
46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = false;
46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(false);
47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
47372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasText() {
47472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mText != null;
47572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
47672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
47772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasImage() {
47872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mImage != null;
47972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
48072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasAudio() {
48272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mAudio != null;
48372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
48472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasVideo() {
48672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mVideo != null;
48772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
48872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeText() {
49072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return remove(mText);
49172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
49272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
49372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeImage() {
49472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return remove(mImage);
49572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
49672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
49772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeAudio() {
49840421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        boolean result = remove(mAudio);
49940421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        resetDuration();
50040421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        return result;
50172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
50272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeVideo() {
50440421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        boolean result = remove(mVideo);
50540421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        resetDuration();
50640421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        return result;
50772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
50872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
50972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public TextModel getText() {
51072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (TextModel) mText;
51172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
51272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
51372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ImageModel getImage() {
51472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (ImageModel) mImage;
51572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
51672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
51772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public AudioModel getAudio() {
51872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (AudioModel) mAudio;
51972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
52072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
52172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public VideoModel getVideo() {
52272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (VideoModel) mVideo;
52372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
52472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
52540421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor    public void resetDuration() {
52640421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // If we remove all the objects that have duration, reset the slide back to its
52740421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // default duration. If we don't do this, if the user replaces a 10 sec video with
52840421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // a 3 sec audio, the duration will remain at 10 sec (see the way updateDuration() below
52940421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // works).
53040421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        if (!hasAudio() && !hasVideo()) {
53140421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor            mDuration = DEFAULT_SLIDE_DURATION;
53240421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        }
53340421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor    }
53440421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor
53572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void updateDuration(int duration) {
53672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (duration <= 0) {
53772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
53872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
53972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
54072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((duration > mDuration)
54172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                || (mDuration == DEFAULT_SLIDE_DURATION)) {
54272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mDuration = duration;
54372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
54472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
54572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
546