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.ui;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.content.Context;
21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.net.Uri;
22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.util.Log;
23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.AudioModel;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.ImageModel;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.RegionModel;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideModel;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.TextModel;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.VideoModel;
31d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.ContentType;
32d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.MmsException;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * An utility to edit contents of a slide.
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class SlideshowEditor {
3886b3e552c250704de7abeab5553bab664fa01f64Wei Huang    private static final String TAG = "Mms:slideshow";
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40f6f761abb71455f79c8cadda94aa15fc15bb6d39Tom Taylor    public static final int MAX_SLIDE_NUM = 10;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final Context mContext;
439abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    private SlideshowModel mModel;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideshowEditor(Context context, SlideshowModel model) {
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mContext = context;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel = model;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
509abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    public void setSlideshow(SlideshowModel model) {
519abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor        mModel = model;
529abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    }
539abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Add a new slide to the end of message.
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return true if success, false if reach the max slide number.
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addNewSlide() {
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int position = mModel.size();
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return addNewSlide(position);
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Add a new slide at the specified position in the message.
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return true if success, false if reach the max slide number.
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @throws IndexOutOfBoundsException - if position is out of range
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *         (position < 0 || position > size()).
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean addNewSlide(int position) {
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int size = mModel.size();
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (size < MAX_SLIDE_NUM) {
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SlideModel slide = new SlideModel(mModel);
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            TextModel text = new TextModel(
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mContext, ContentType.TEXT_PLAIN, "text_" + size + ".txt",
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mModel.getLayout().getTextRegion());
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            slide.add(text);
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mModel.add(position, slide);
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return true;
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.w(TAG, "The limitation of the number of slides is reached.");
859abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor            return false;
869abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor        }
879abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    }
889abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    /**
899abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     * Add an existing slide at the specified position in the message.
909abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     *
919abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     * @return true if success, false if reach the max slide number.
929abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     * @throws IndexOutOfBoundsException - if position is out of range
939abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     *         (position < 0 || position > size()).
949abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor     */
959abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor    public boolean addSlide(int position, SlideModel slide) {
969abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor        int size = mModel.size();
979abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor        if (size < MAX_SLIDE_NUM) {
989abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor            mModel.add(position, slide);
999abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor            return true;
1009abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor        } else {
1019abae049669b8525b28ec4f4adb2e14372b4d931Tom Taylor            Log.w(TAG, "The limitation of the number of slides is reached.");
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return false;
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Remove one slide.
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param position
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void removeSlide(int position) {
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel.remove(position);
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
114fd644551e8506266aad2b76463b51b44154ed62fTom Taylor
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Remove all slides.
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void removeAllSlides() {
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        while (mModel.size() > 0) {
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            removeSlide(0);
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Remove the text of the specified slide.
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     *
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param position index of the slide
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @return true if success, false if no text in the slide.
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeText(int position) {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.get(position).removeText();
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeImage(int position) {
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.get(position).removeImage();
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeVideo(int position) {
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.get(position).removeVideo();
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean removeAudio(int position) {
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.get(position).removeAudio();
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeText(int position, String newText) {
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (newText != null) {
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            SlideModel slide = mModel.get(position);
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            TextModel text = slide.getText();
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (text == null) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                text = new TextModel(mContext,
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        ContentType.TEXT_PLAIN, "text_" + position + ".txt",
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        mModel.getLayout().getTextRegion());
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                text.setText(newText);
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                slide.add(text);
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (!newText.equals(text.getText())) {
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                text.setText(newText);
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeImage(int position, Uri newImage) throws MmsException {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel.get(position).add(new ImageModel(
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mContext, newImage, mModel.getLayout().getImageRegion()));
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeAudio(int position, Uri newAudio) throws MmsException {
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        AudioModel audio = new AudioModel(mContext, newAudio);
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SlideModel slide = mModel.get(position);
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        slide.add(audio);
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        slide.updateDuration(audio.getDuration());
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeVideo(int position, Uri newVideo) throws MmsException {
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        VideoModel video = new VideoModel(mContext, newVideo,
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mModel.getLayout().getImageRegion());
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SlideModel slide = mModel.get(position);
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        slide.add(video);
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        slide.updateDuration(video.getDuration());
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void moveSlideUp(int position) {
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel.add(position - 1, mModel.remove(position));
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void moveSlideDown(int position) {
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel.add(position + 1, mModel.remove(position));
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeDuration(int position, int dur) {
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (dur >= 0) {
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mModel.get(position).setDuration(dur);
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void changeLayout(int layout) {
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mModel.getLayout().changeTo(layout);
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public RegionModel getImageRegion() {
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.getLayout().getImageRegion();
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public RegionModel getTextRegion() {
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mModel.getLayout().getTextRegion();
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
208