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
20d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.ArrayList;
21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Collection;
22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Iterator;
23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.List;
24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.ListIterator;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.Event;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventListener;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.ElementTime;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.text.TextUtils;
310ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylorimport android.util.Config;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.ContentRestrictionException;
35ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wenimport com.android.mms.LogTag;
36d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.dom.smil.SmilParElementImpl;
37d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.ContentType;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
397fa61cafe50deb74beb0819bdf52128239d50201Wei Huangpublic class SlideModel extends Model implements List<MediaModel>, EventListener {
40ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen    public static final String TAG = LogTag.TAG;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
420ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final int DEFAULT_SLIDE_DURATION = 5000;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final ArrayList<MediaModel> mMedia = new ArrayList<MediaModel>();
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mText;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mImage;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mAudio;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaModel mVideo;
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddImage = true;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddAudio = true;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mCanAddVideo = true;
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mDuration;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean mVisible = true;
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private short mFill;
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int mSlideSize;
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private SlideshowModel mParent;
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(SlideshowModel slideshow) {
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        this(DEFAULT_SLIDE_DURATION, slideshow);
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(int duration, SlideshowModel slideshow) {
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mParent = slideshow;
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Create a SlideModel with exist media collection.
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param duration The duration of the slide.
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param mediaList The exist media collection.
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws IllegalStateException One or more media in the mediaList cannot
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         be added into the slide due to a slide cannot contain image
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         and video or audio and video at the same time.
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideModel(int duration, ArrayList<MediaModel> mediaList) {
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int maxDur = 0;
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mediaList) {
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            internalAdd(media);
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int mediaDur = media.getDuration();
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mediaDur > maxDur) {
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                maxDur = mediaDur;
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        updateDuration(maxDur);
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void internalAdd(MediaModel media) throws IllegalStateException {
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (media == null) {
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Don't add null value into the list.
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (media.isText()) {
104d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            String contentType = media.getContentType();
1057c8748972faf3078f53ef9ecbe6c95f0903f43f7satok            if (TextUtils.isEmpty(contentType) || ContentType.TEXT_PLAIN.equals(contentType)
1067c8748972faf3078f53ef9ecbe6c95f0903f43f7satok                    || ContentType.TEXT_HTML.equals(contentType)) {
107d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                internalAddOrReplace(mText, media);
108d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                mText = media;
109d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            } else {
110d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
111d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang                        " isn't supported (as text)");
112d130e2e6dc448fd80ecb70f0d31e3affb9888b9aWei Huang            }
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isImage()) {
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddImage) {
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mImage, media);
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mImage = media;
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = false;
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1194ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1204ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add image in this state");
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isAudio()) {
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddAudio) {
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mAudio, media);
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mAudio = media;
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = false;
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1284ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1294ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add audio in this state");
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (media.isVideo()) {
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mCanAddVideo) {
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                internalAddOrReplace(mVideo, media);
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mVideo = media;
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddImage = false;
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddAudio = false;
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
1384ae926d268bb27d260b711a2a136c07441134178Tom Taylor                Log.w(TAG, "[SlideModel] content type " + media.getContentType() +
1394ae926d268bb27d260b711a2a136c07441134178Tom Taylor                    " - can't add video in this state");
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void internalAddOrReplace(MediaModel old, MediaModel media) {
14510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // If the media is resizable, at this point consider it to be zero length.
14610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // Just before we send the slideshow, we take the remaining space in the
14710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        // slideshow and equally allocate it to all the resizeable media items and resize them.
14810eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor        int addSize = media.getMediaResizable() ? 0 : media.getMediaSize();
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int removeSize;
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (old == null) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (null != mParent) {
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mParent.checkMessageSize(addSize);
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.add(media);
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            increaseSlideSize(addSize);
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            increaseMessageSize(addSize);
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
1584799c671cd7925c7d8098bc3a743c0e83701bb34Matthias Thomae            removeSize = old.getMediaResizable() ? 0 : old.getMediaSize();
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (addSize > removeSize) {
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (null != mParent) {
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mParent.checkMessageSize(addSize - removeSize);
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                increaseSlideSize(addSize - removeSize);
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                increaseMessageSize(addSize - removeSize);
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseSlideSize(removeSize - addSize);
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseMessageSize(removeSize - addSize);
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.set(mMedia.indexOf(old), media);
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            old.unregisterAllModelChangedObservers();
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (IModelChangedObserver observer : mModelChangedObservers) {
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.registerModelChangedObserver(observer);
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private boolean internalRemove(Object object) {
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMedia.remove(object)) {
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (object instanceof TextModel) {
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mText = null;
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof ImageModel) {
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mImage = null;
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = true;
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof AudioModel) {
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mAudio = null;
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddVideo = true;
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (object instanceof VideoModel) {
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mVideo = null;
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddImage = true;
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mCanAddAudio = true;
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
19310eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // If the media is resizable, at this point consider it to be zero length.
19410eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // Just before we send the slideshow, we take the remaining space in the
19510eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            // slideshow and equally allocate it to all the resizeable media items and resize them.
19610eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor            int decreaseSize = ((MediaModel) object).getMediaResizable() ? 0
19710eed0e3020e3eb0612747fe39e0f6117222dd95Tom Taylor                                        : ((MediaModel) object).getMediaSize();
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            decreaseSlideSize(decreaseSize);
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            decreaseMessageSize(decreaseSize);
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((Model) object).unregisterAllModelChangedObservers();
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mDuration
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getDuration() {
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mDuration;
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param duration the mDuration to set
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setDuration(int duration) {
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDuration = duration;
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getSlideSize() {
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSlideSize;
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void increaseSlideSize(int increaseSize) {
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (increaseSize > 0) {
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mSlideSize += increaseSize;
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void decreaseSlideSize(int decreaseSize) {
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (decreaseSize > 0) {
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mSlideSize -= decreaseSize;
237c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX            if (mSlideSize < 0) {
238c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX                mSlideSize = 0;
239c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX            }
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setParent(SlideshowModel parent) {
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mParent = parent;
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void increaseMessageSize(int increaseSize) {
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((increaseSize > 0) && (null != mParent)) {
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int size = mParent.getCurrentMessageSize();
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            size += increaseSize;
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mParent.setCurrentMessageSize(size);
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void decreaseMessageSize(int decreaseSize) {
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((decreaseSize > 0) && (null != mParent)) {
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            int size = mParent.getCurrentMessageSize();
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            size -= decreaseSize;
259c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX            if (size < 0) {
260c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX                size = 0;
261c222f543bf642c07b980331faa66281083ab24f9Fang, JiuX            }
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mParent.setCurrentMessageSize(size);
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    //
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // Implement List<E> interface.
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    //
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Add a MediaModel to the slide. If the slide has already contained
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * a media object in the same type, the media object will be replaced by
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * the new one.
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param object A media object to be added into the slide.
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return true
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws IllegalStateException One or more media in the mediaList cannot
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         be added into the slide due to a slide cannot contain image
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         and video or audio and video at the same time.
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws ContentRestrictionException when can not add this object.
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean add(MediaModel object) {
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        internalAdd(object);
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return true;
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addAll(Collection<? extends MediaModel> collection) {
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void clear() {
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMedia.size() > 0) {
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            for (MediaModel media : mMedia) {
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                media.unregisterAllModelChangedObservers();
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                int decreaseSize = media.getMediaSize();
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseSlideSize(decreaseSize);
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                decreaseMessageSize(decreaseSize);
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMedia.clear();
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mText = null;
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mImage = null;
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mAudio = null;
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVideo = null;
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddImage = true;
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddAudio = true;
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mCanAddVideo = true;
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean contains(Object object) {
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.contains(object);
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean containsAll(Collection<?> collection) {
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.containsAll(collection);
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isEmpty() {
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.isEmpty();
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Iterator<MediaModel> iterator() {
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.iterator();
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean remove(Object object) {
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((object != null) && (object instanceof MediaModel)
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                && internalRemove(object)) {
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeAll(Collection<?> collection) {
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean retainAll(Collection<?> collection) {
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int size() {
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.size();
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Object[] toArray() {
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.toArray();
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public <T> T[] toArray(T[] array) {
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.toArray(array);
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void add(int location, MediaModel object) {
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addAll(int location,
36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Collection<? extends MediaModel> collection) {
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel get(int location) {
3714ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang        if (mMedia.size() == 0) {
3724ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang            return null;
3734ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang        }
3744ee7aa9aec45dd564c0e82928fa5a8378e856dcfWei Huang
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.get(location);
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int indexOf(Object object) {
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.indexOf(object);
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int lastIndexOf(Object object) {
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.lastIndexOf(object);
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ListIterator<MediaModel> listIterator() {
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.listIterator();
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ListIterator<MediaModel> listIterator(int location) {
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.listIterator(location);
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel remove(int location) {
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MediaModel media = mMedia.get(location);
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((media != null) && internalRemove(media)) {
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            notifyModelChanged(true);
39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return media;
40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MediaModel set(int location, MediaModel object) {
40372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        throw new UnsupportedOperationException("Operation not supported.");
40472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public List<MediaModel> subList(int start, int end) {
40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mMedia.subList(start, end);
40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mVisible
41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean isVisible() {
41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mVisible;
41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param visible the mVisible to set
41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setVisible(boolean visible) {
42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mVisible = visible;
42272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
42372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
42472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
42572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
42672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return the mFill
42772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
42872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getFill() {
42972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mFill;
43072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
43172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param fill the mFill to set
43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setFill(short fill) {
43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFill = fill;
43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(true);
43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void registerModelChangedObserverInDescendants(
44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            IModelChangedObserver observer) {
44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.registerModelChangedObserver(observer);
44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void unregisterModelChangedObserverInDescendants(
45072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            IModelChangedObserver observer) {
45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.unregisterModelChangedObserver(observer);
45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void unregisterAllModelChangedObserversInDescendants() {
45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MediaModel media : mMedia) {
45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            media.unregisterAllModelChangedObservers();
46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // EventListener Interface
46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void handleEvent(Event evt) {
46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (evt.getType().equals(SmilParElementImpl.SMIL_SLIDE_START_EVENT)) {
46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (LOCAL_LOGV) {
46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.v(TAG, "Start to play slide: " + this);
46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = true;
47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (mFill != ElementTime.FILL_FREEZE) {
47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (LOCAL_LOGV) {
47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.v(TAG, "Stop playing slide: " + this);
47372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
47472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mVisible = false;
47572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
47672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
47772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        notifyModelChanged(false);
47872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
47972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasText() {
48172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mText != null;
48272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
48372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasImage() {
48572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mImage != null;
48672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
48772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
48872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasAudio() {
48972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mAudio != null;
49072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
49172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
49272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean hasVideo() {
49372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mVideo != null;
49472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
49572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
49672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeText() {
49772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return remove(mText);
49872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
49972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
50072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeImage() {
50172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return remove(mImage);
50272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
50472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeAudio() {
50540421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        boolean result = remove(mAudio);
50640421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        resetDuration();
50740421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        return result;
50872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
50972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
51072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeVideo() {
51140421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        boolean result = remove(mVideo);
51240421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        resetDuration();
51340421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        return result;
51472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
51572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
51672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public TextModel getText() {
51772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (TextModel) mText;
51872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
51972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
52072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ImageModel getImage() {
52172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (ImageModel) mImage;
52272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
52372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
52472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public AudioModel getAudio() {
52572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (AudioModel) mAudio;
52672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
52772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
52872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public VideoModel getVideo() {
52972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (VideoModel) mVideo;
53072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
53172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
53240421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor    public void resetDuration() {
53340421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // If we remove all the objects that have duration, reset the slide back to its
53440421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // default duration. If we don't do this, if the user replaces a 10 sec video with
53540421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // a 3 sec audio, the duration will remain at 10 sec (see the way updateDuration() below
53640421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        // works).
53740421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        if (!hasAudio() && !hasVideo()) {
53840421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor            mDuration = DEFAULT_SLIDE_DURATION;
53940421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor        }
54040421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor    }
54140421e0b0316a4bf77e3e5f9a8b734ba6478f1c7Tom Taylor
54272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void updateDuration(int duration) {
54372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (duration <= 0) {
54472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
54572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
54672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
54772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((duration > mDuration)
54872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                || (mDuration == DEFAULT_SLIDE_DURATION)) {
54972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mDuration = duration;
55072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
55172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
55272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
553