SlideshowActivity.java revision 150c4179995cc0a75f934ef194372f9295957ca2
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
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
21d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport com.android.mms.dom.AttrImpl;
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.smil.SmilDocumentImpl;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.smil.SmilPlayer;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.smil.parser.SmilXmlSerializer;
25d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport com.android.mms.model.LayoutModel;
26d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport com.android.mms.model.RegionModel;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SmilHelper;
29f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.MmsException;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport org.w3c.dom.NamedNodeMap;
32d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport org.w3c.dom.Node;
33d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport org.w3c.dom.NodeList;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.Event;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventListener;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.EventTarget;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILDocument;
38d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport org.w3c.dom.smil.SMILElement;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.Activity;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.PixelFormat;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.KeyEvent;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.MotionEvent;
49d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport android.view.View;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
51d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Taoimport android.view.View.OnClickListener;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.MediaController;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.MediaController.MediaPlayerControl;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.io.ByteArrayOutputStream;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Plays the given slideshow in full-screen mode with a common controller.
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class SlideshowActivity extends Activity implements EventListener {
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "SlideshowActivity";
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
63150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato    private static final boolean LOCAL_LOGV = false;
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private MediaController mMediaController;
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private SmilPlayer mSmilPlayer;
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Handler mHandler;
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private SMILDocument mSmilDoc;
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
72d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao    private SlideView mSlideView;
73d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao
74d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao    /**
75d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao     * @return whether the Smil has MMS conformance layout.
76d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao     * Refer to MMS Conformance Document OMA-MMS-CONF-v1_2-20050301-A
77d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao     */
78d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao    private static final boolean isMMSConformance(SMILDocument smilDoc) {
79d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        SMILElement head = smilDoc.getHead();
80d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        if (head == null) {
81d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // No 'head' element
82d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            return false;
83d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
84d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        NodeList children = head.getChildNodes();
85d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        if (children == null || children.getLength() != 1) {
86d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // The 'head' element should have only one child.
87d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            return false;
88d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
89d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        Node layout = children.item(0);
90d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        if (layout == null || !"layout".equals(layout.getNodeName())) {
91d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // The child is not layout element
92d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            return false;
93d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
94d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        NodeList layoutChildren = layout.getChildNodes();
95d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        if (layoutChildren == null) {
96d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // The 'layout' element has no child.
97d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            return false;
98d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
99d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        int num = layoutChildren.getLength();
100d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        if (num <= 0) {
101d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            // The 'layout' element has no child.
102d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            return false;
103d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
104d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        for (int i = 0; i < num; i++) {
105d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            Node layoutChild = layoutChildren.item(i);
106d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            if (layoutChild == null) {
107d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                // The 'layout' child is null.
108d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                return false;
109d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            }
110d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            String name = layoutChild.getNodeName();
111d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            if ("root-layout".equals(name)) {
112d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                continue;
113d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            } else if ("region".equals(name)) {
114d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                NamedNodeMap map = layoutChild.getAttributes();
115d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                for (int j = 0; j < map.getLength(); j++) {
116d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    Node node = map.item(j);
117d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    if (node == null) {
118d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        return false;
119d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    }
120d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    String attrName = node.getNodeName();
121d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    // The attr should be one of left, top, height, width, fit and id
122d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    if ("left".equals(attrName) || "top".equals(attrName) ||
123d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            "height".equals(attrName) || "width".equals(attrName) ||
124d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            "fit".equals(attrName)) {
125d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        continue;
126d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    } else if ("id".equals(attrName)) {
127d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        String value;
128d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        if (node instanceof AttrImpl) {
129d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            value = ((AttrImpl)node).getValue();
130d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        } else {
131d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            return false;
132d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        }
133d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        if ("Text".equals(value) || "Image".equals(value)) {
134d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            continue;
135d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        } else {
136d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            // The id attr is not 'Text' or 'Image'
137d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            return false;
138d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        }
139d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    } else {
140d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        return false;
141d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    }
142d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                }
143d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            } else {
144d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                // The 'layout' element has the child other than 'root-layout' or 'region'
145d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                return false;
146d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            }
147d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        }
148d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        return true;
149d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao    }
150d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onCreate(Bundle icicle) {
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(icicle);
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mHandler = new Handler();
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Play slide-show in full-screen mode.
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        getWindow().setFormat(PixelFormat.TRANSLUCENT);
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setContentView(R.layout.slideshow);
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Intent intent = getIntent();
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Uri msg = intent.getData();
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final SlideshowModel model;
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            model = SlideshowModel.createFromMessageUri(this, msg);
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } catch (MmsException e) {
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.e(TAG, "Cannot present the slide show.", e);
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            finish();
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return;
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
173d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        mSlideView = (SlideView) findViewById(R.id.slide_view);
174d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        PresenterFactory.getPresenter("SlideshowPresenter", this, mSlideView, model);
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mHandler.post(new Runnable() {
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            private boolean isRotating() {
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return mSmilPlayer.isPausedState()
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        || mSmilPlayer.isPlayingState()
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        || mSmilPlayer.isPlayedState();
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public void run() {
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSmilPlayer = SmilPlayer.getPlayer();
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                initMediaController();
186d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                mSlideView.setMediaController(mMediaController);
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Use SmilHelper.getDocument() to ensure rebuilding the
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // entire SMIL document.
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSmilDoc = SmilHelper.getDocument(model);
190d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                if (isMMSConformance(mSmilDoc)) {
191d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    int imageLeft = 0;
192d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    int imageTop = 0;
193d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    int textLeft = 0;
194d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    int textTop = 0;
195d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    LayoutModel layout = model.getLayout();
196d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    if (layout != null) {
197d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        RegionModel imageRegion = layout.getImageRegion();
198d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        if (imageRegion != null) {
199d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            imageLeft = imageRegion.getLeft();
200d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            imageTop = imageRegion.getTop();
201d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        }
202d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        RegionModel textRegion = layout.getTextRegion();
203d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        if (textRegion != null) {
204d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            textLeft = textRegion.getLeft();
205d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                            textTop = textRegion.getTop();
206d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                        }
207d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    }
208d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                    mSlideView.enableMMSConformanceMode(textLeft, textTop, imageLeft, imageTop);
209d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                }
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (DEBUG) {
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    ByteArrayOutputStream ostream = new ByteArrayOutputStream();
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    SmilXmlSerializer.serialize(mSmilDoc, ostream);
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    if (LOCAL_LOGV) {
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        Log.v(TAG, ostream.toString());
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // Add event listener.
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                ((EventTarget) mSmilDoc).addEventListener(
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT,
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        SlideshowActivity.this, false);
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSmilPlayer.init(mSmilDoc);
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (isRotating()) {
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mSmilPlayer.reload();
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                } else {
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mSmilPlayer.play();
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        });
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initMediaController() {
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaController = new MediaController(SlideshowActivity.this, false);
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaController.setMediaPlayer(new SmilPlayerController(mSmilPlayer));
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMediaController.setAnchorView(findViewById(R.id.slide_view));
237d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao        mMediaController.setPrevNextListeners(
238d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            new OnClickListener() {
239d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao              public void onClick(View v) {
240d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                  mSmilPlayer.next();
241d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao              }
242d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            },
243d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            new OnClickListener() {
244d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao              public void onClick(View v) {
245d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao                  mSmilPlayer.prev();
246d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao              }
247d7a1ec4c8a007f707cc3115ed6e558f839f875eaBai Tao            });
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onTouchEvent(MotionEvent ev) {
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((mSmilPlayer != null) && (mMediaController != null)) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mMediaController.show();
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return false;
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onPause() {
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onPause();
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mSmilDoc != null) {
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ((EventTarget) mSmilDoc).removeEventListener(
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, this, false);
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onStop() {
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onStop();
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ((null != mSmilPlayer)) {
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (isFinishing()) {
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSmilPlayer.stop();
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } else {
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mSmilPlayer.stopWhenReload();
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
276ff408aa9dd640912cf94ae37739d76722b1d2806Tom Taylor            if (mMediaController != null) {
277ff408aa9dd640912cf94ae37739d76722b1d2806Tom Taylor                // Must do this so we don't leak a window.
278ff408aa9dd640912cf94ae37739d76722b1d2806Tom Taylor                mMediaController.hide();
279ff408aa9dd640912cf94ae37739d76722b1d2806Tom Taylor            }
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (keyCode) {
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_VOLUME_DOWN:
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_VOLUME_UP:
28860cbbe405bffddf13ed723b6d2181d7b93e71fe1Jeff Brown            case KeyEvent.KEYCODE_VOLUME_MUTE:
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_UP:
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_DOWN:
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_LEFT:
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case KeyEvent.KEYCODE_DPAD_RIGHT:
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                break;
294bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B            case KeyEvent.KEYCODE_BACK:
295bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B            case KeyEvent.KEYCODE_MENU:
296bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                if ((mSmilPlayer != null) &&
297bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                        (mSmilPlayer.isPausedState()
298bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                        || mSmilPlayer.isPlayingState()
299bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                        || mSmilPlayer.isPlayedState())) {
300bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                    mSmilPlayer.stop();
301bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                }
302bdf926782d291baf6f6b96dd71ad883deb77582fMadhav B                break;
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if ((mSmilPlayer != null) && (mMediaController != null)) {
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mMediaController.show();
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return super.onKeyDown(keyCode, event);
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private class SmilPlayerController implements MediaPlayerControl {
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final SmilPlayer mPlayer;
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public SmilPlayerController(SmilPlayer player) {
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPlayer = player;
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public int getBufferPercentage() {
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // We don't need to buffer data, always return 100%.
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return 100;
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public int getCurrentPosition() {
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mPlayer.getCurrentPosition();
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public int getDuration() {
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mPlayer.getDuration();
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean isPlaying() {
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mPlayer != null ? mPlayer.isPlayingState() : false;
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void pause() {
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mPlayer != null) {
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mPlayer.pause();
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void seekTo(int pos) {
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Don't need to support.
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public void start() {
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mPlayer != null) {
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mPlayer.start();
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
350020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen
351020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        public boolean canPause() {
352020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen            return true;
353020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        }
354020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen
355020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        public boolean canSeekBackward() {
356020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen            return true;
357020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        }
358020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen
359020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        public boolean canSeekForward() {
360020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen            return true;
361020411c42adb2b7968872d43f5594535aa3acaf4Marco Nelissen        }
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void handleEvent(Event evt) {
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final Event event = evt;
36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mHandler.post(new Runnable() {
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public void run() {
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                String type = event.getType();
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if(type.equals(SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT)) {
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    finish();
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        });
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
376