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.os.Handler;
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.LayoutModel;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.MediaModel;
28d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.model.MediaModel.MediaAction;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.Model;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.RegionMediaModel;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.RegionModel;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideModel;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.TextModel;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.VideoModel;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ui.AdaptableSlideViewInterface.OnSizeChangedListener;
3751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedCallback;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * A basic presenter of slides.
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class SlideshowPresenter extends Presenter {
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "SlideshowPresenter";
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
45150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato    private static final boolean LOCAL_LOGV = false;
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected int mLocation;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected final int mSlideNumber;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5037880013315d8b7abefd9081b2c36b060083d6faTom Taylor    protected float mWidthTransformRatio = 1.0f;
5137880013315d8b7abefd9081b2c36b060083d6faTom Taylor    protected float mHeightTransformRatio = 1.0f;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // Since only the original thread that created a view hierarchy can touch
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // its views, we have to use Handler to manage the views in the some
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // callbacks such as onModelChanged().
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected final Handler mHandler = new Handler();
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SlideshowPresenter(Context context, ViewInterface view, Model model) {
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, view, model);
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mLocation = 0;
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSlideNumber = ((SlideshowModel) mModel).size();
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (view instanceof AdaptableSlideViewInterface) {
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((AdaptableSlideViewInterface) view).setOnSizeChangedListener(
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mViewSizeChangedListener);
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final OnSizeChangedListener mViewSizeChangedListener =
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        new OnSizeChangedListener() {
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void onSizeChanged(int width, int height) {
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            LayoutModel layout = ((SlideshowModel) mModel).getLayout();
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mWidthTransformRatio = getWidthTransformRatio(
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    width, layout.getLayoutWidth());
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mHeightTransformRatio = getHeightTransformRatio(
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    height, layout.getLayoutHeight());
77d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // The ratio indicates how to reduce the source to match the View,
78d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // so the larger one should be used.
79d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            float ratio = mWidthTransformRatio > mHeightTransformRatio ?
80d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    mWidthTransformRatio : mHeightTransformRatio;
81d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            mWidthTransformRatio = ratio;
82d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            mHeightTransformRatio = ratio;
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (LOCAL_LOGV) {
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.v(TAG, "ratio_w = " + mWidthTransformRatio
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        + ", ratio_h = " + mHeightTransformRatio);
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private float getWidthTransformRatio(int width, int layoutWidth) {
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (width > 0) {
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return (float) layoutWidth / (float) width;
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return 1.0f;
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private float getHeightTransformRatio(int height, int layoutHeight) {
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (height > 0) {
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return (float) layoutHeight / (float) height;
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return 1.0f;
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int transformWidth(int width) {
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (int) (width / mWidthTransformRatio);
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private int transformHeight(int height) {
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (int) (height / mHeightTransformRatio);
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
11351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public void present(ItemLoadedCallback callback) {
11451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        // This is called to show a full-screen slideshow. Presently, all parts of
11551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        // a slideshow (images, sounds, etc.) are loaded and displayed on the UI thread.
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        presentSlide((SlideViewInterface) mView, ((SlideshowModel) mModel).get(mLocation));
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param view
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param model
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentSlide(SlideViewInterface view, SlideModel model) {
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        view.reset();
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1260ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        for (MediaModel media : model) {
1270ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            if (media instanceof RegionMediaModel) {
1280ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                presentRegionMedia(view, (RegionMediaModel) media, true);
1290ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            } else if (media.isAudio()) {
1300ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                presentAudio(view, (AudioModel) media, true);
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param view
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentRegionMedia(SlideViewInterface view,
1390ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            RegionMediaModel rMedia, boolean dataChanged) {
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        RegionModel r = (rMedia).getRegion();
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (rMedia.isText()) {
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            presentText(view, (TextModel) rMedia, r, dataChanged);
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (rMedia.isImage()) {
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            presentImage(view, (ImageModel) rMedia, r, dataChanged);
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (rMedia.isVideo()) {
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            presentVideo(view, (VideoModel) rMedia, r, dataChanged);
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentAudio(SlideViewInterface view, AudioModel audio,
1510ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            boolean dataChanged) {
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Set audio only when data changed.
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (dataChanged) {
1540ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            view.setAudio(audio.getUri(), audio.getSrc(), audio.getExtras());
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MediaAction action = audio.getCurrentAction();
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (action == MediaAction.START) {
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.startAudio();
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.PAUSE) {
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.pauseAudio();
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.STOP) {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.stopAudio();
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.SEEK) {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.seekAudio(audio.getSeekTo());
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentText(SlideViewInterface view, TextModel text,
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            RegionModel r, boolean dataChanged) {
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (dataChanged) {
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.setText(text.getSrc(), text.getText());
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (view instanceof AdaptableSlideViewInterface) {
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((AdaptableSlideViewInterface) view).setTextRegion(
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformWidth(r.getLeft()),
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformHeight(r.getTop()),
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformWidth(r.getWidth()),
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformHeight(r.getHeight()));
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        view.setTextVisibility(text.isVisible());
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param view
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param image
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param r
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentImage(SlideViewInterface view, ImageModel image,
1910ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            RegionModel r, boolean dataChanged) {
19237880013315d8b7abefd9081b2c36b060083d6faTom Taylor        int transformedWidth = transformWidth(r.getWidth());
19337880013315d8b7abefd9081b2c36b060083d6faTom Taylor        int transformedHeight = transformWidth(r.getHeight());
19437880013315d8b7abefd9081b2c36b060083d6faTom Taylor
19537880013315d8b7abefd9081b2c36b060083d6faTom Taylor        if (LOCAL_LOGV) {
19637880013315d8b7abefd9081b2c36b060083d6faTom Taylor            Log.v(TAG, "presentImage r.getWidth: " + r.getWidth()
19737880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    + ", r.getHeight: " + r.getHeight() +
19837880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    " transformedWidth: " + transformedWidth +
19937880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    " transformedHeight: " + transformedHeight);
20037880013315d8b7abefd9081b2c36b060083d6faTom Taylor        }
20137880013315d8b7abefd9081b2c36b060083d6faTom Taylor
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (dataChanged) {
2037459fa20925be3d348dcfd58bd1ecea59798c315Roger Chen            view.setImage(image.getSrc(), image.getBitmap(transformedWidth, transformedHeight));
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (view instanceof AdaptableSlideViewInterface) {
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((AdaptableSlideViewInterface) view).setImageRegion(
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformWidth(r.getLeft()),
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformHeight(r.getTop()),
21037880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    transformedWidth,
21137880013315d8b7abefd9081b2c36b060083d6faTom Taylor                    transformedHeight);
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        view.setImageRegionFit(r.getFit());
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        view.setImageVisibility(image.isVisible());
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param view
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param video
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * @param r
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void presentVideo(SlideViewInterface view, VideoModel video,
2230ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            RegionModel r, boolean dataChanged) {
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (dataChanged) {
2250ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            view.setVideo(video.getSrc(), video.getUri());
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2280ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            if (view instanceof AdaptableSlideViewInterface) {
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((AdaptableSlideViewInterface) view).setVideoRegion(
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformWidth(r.getLeft()),
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformHeight(r.getTop()),
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformWidth(r.getWidth()),
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    transformHeight(r.getHeight()));
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        view.setVideoVisibility(video.isVisible());
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MediaAction action = video.getCurrentAction();
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (action == MediaAction.START) {
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.startVideo();
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.PAUSE) {
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.pauseVideo();
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.STOP) {
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.stopVideo();
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (action == MediaAction.SEEK) {
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            view.seekVideo(video.getSeekTo());
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setLocation(int location) {
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mLocation = location;
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public int getLocation() {
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mLocation;
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void goBackward() {
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mLocation > 0) {
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mLocation--;
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void goForward() {
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mLocation < (mSlideNumber - 1)) {
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mLocation++;
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onModelChanged(final Model model, final boolean dataChanged) {
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final SlideViewInterface view = (SlideViewInterface) mView;
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // FIXME: Should be optimized.
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (model instanceof SlideshowModel) {
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // TODO:
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (model instanceof SlideModel) {
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (((SlideModel) model).isVisible()) {
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mHandler.post(new Runnable() {
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void run() {
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        presentSlide(view, (SlideModel) model);
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                });
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mHandler.post(new Runnable() {
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void run() {
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        goForward();
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                });
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (model instanceof MediaModel) {
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (model instanceof RegionMediaModel) {
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mHandler.post(new Runnable() {
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void run() {
2930ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                        presentRegionMedia(view, (RegionMediaModel) model, dataChanged);
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                });
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else if (((MediaModel) model).isAudio()) {
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mHandler.post(new Runnable() {
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void run() {
2990ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor                        presentAudio(view, (AudioModel) model, dataChanged);
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                });
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (model instanceof RegionModel) {
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // TODO:
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
30751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
30851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    @Override
30951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public void cancelBackgroundLoading() {
31051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        // For now, the SlideshowPresenter does no background loading so there is nothing to cancel.
31151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
313