• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 Esmertec AG.
3  * Copyright (C) 2008 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.mms.ui;
19 
20 import com.android.mms.R;
21 import com.android.mms.dom.smil.SmilDocumentImpl;
22 import com.android.mms.dom.smil.SmilPlayer;
23 import com.android.mms.dom.smil.parser.SmilXmlSerializer;
24 import com.android.mms.model.SlideshowModel;
25 import com.android.mms.model.SmilHelper;
26 import com.google.android.mms.MmsException;
27 
28 import org.w3c.dom.events.Event;
29 import org.w3c.dom.events.EventListener;
30 import org.w3c.dom.events.EventTarget;
31 import org.w3c.dom.smil.SMILDocument;
32 
33 import android.app.Activity;
34 import android.content.Intent;
35 import android.graphics.PixelFormat;
36 import android.net.Uri;
37 import android.os.Bundle;
38 import android.os.Handler;
39 import android.util.Config;
40 import android.util.Log;
41 import android.view.KeyEvent;
42 import android.view.MotionEvent;
43 import android.view.Window;
44 import android.widget.MediaController;
45 import android.widget.MediaController.MediaPlayerControl;
46 
47 import java.io.ByteArrayOutputStream;
48 
49 /**
50  * Plays the given slideshow in full-screen mode with a common controller.
51  */
52 public class SlideshowActivity extends Activity implements EventListener {
53     private static final String TAG = "SlideshowActivity";
54     private static final boolean DEBUG = false;
55     private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
56 
57     private MediaController mMediaController;
58     private SmilPlayer mSmilPlayer;
59 
60     private Handler mHandler;
61 
62     private SMILDocument mSmilDoc;
63 
64     @Override
onCreate(Bundle icicle)65     public void onCreate(Bundle icicle) {
66         super.onCreate(icicle);
67         mHandler = new Handler();
68 
69         // Play slide-show in full-screen mode.
70         requestWindowFeature(Window.FEATURE_NO_TITLE);
71         getWindow().setFormat(PixelFormat.TRANSLUCENT);
72         setContentView(R.layout.slideshow);
73 
74         Intent intent = getIntent();
75         Uri msg = intent.getData();
76         final SlideshowModel model;
77 
78         try {
79             model = SlideshowModel.createFromMessageUri(this, msg);
80         } catch (MmsException e) {
81             Log.e(TAG, "Cannot present the slide show.", e);
82             finish();
83             return;
84         }
85 
86         SlideView view = (SlideView) findViewById(R.id.slide_view);
87         PresenterFactory.getPresenter("SlideshowPresenter", this, view, model);
88 
89         mHandler.post(new Runnable() {
90             private boolean isRotating() {
91                 return mSmilPlayer.isPausedState()
92                         || mSmilPlayer.isPlayingState()
93                         || mSmilPlayer.isPlayedState();
94             }
95 
96             public void run() {
97                 mSmilPlayer = SmilPlayer.getPlayer();
98                 initMediaController();
99 
100                 // Use SmilHelper.getDocument() to ensure rebuilding the
101                 // entire SMIL document.
102                 mSmilDoc = SmilHelper.getDocument(model);
103                 if (DEBUG) {
104                     ByteArrayOutputStream ostream = new ByteArrayOutputStream();
105                     SmilXmlSerializer.serialize(mSmilDoc, ostream);
106                     if (LOCAL_LOGV) {
107                         Log.v(TAG, ostream.toString());
108                     }
109                 }
110 
111                 // Add event listener.
112                 ((EventTarget) mSmilDoc).addEventListener(
113                         SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT,
114                         SlideshowActivity.this, false);
115 
116                 mSmilPlayer.init(mSmilDoc);
117                 if (isRotating()) {
118                     mSmilPlayer.reload();
119                 } else {
120                     mSmilPlayer.play();
121                 }
122             }
123         });
124     }
125 
initMediaController()126     private void initMediaController() {
127         mMediaController = new MediaController(SlideshowActivity.this, false);
128         mMediaController.setMediaPlayer(new SmilPlayerController(mSmilPlayer));
129         mMediaController.setAnchorView(findViewById(R.id.slide_view));
130     }
131 
132     @Override
onTouchEvent(MotionEvent ev)133     public boolean onTouchEvent(MotionEvent ev) {
134         if ((mSmilPlayer != null) && (mMediaController != null)) {
135             mMediaController.show();
136         }
137         return false;
138     }
139 
140     @Override
onPause()141     protected void onPause() {
142         super.onPause();
143         if (mSmilDoc != null) {
144             ((EventTarget) mSmilDoc).removeEventListener(
145                     SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, this, false);
146         }
147     }
148 
149     @Override
onStop()150     protected void onStop() {
151         super.onStop();
152         if ((null != mSmilPlayer)) {
153             if (isFinishing()) {
154                 mSmilPlayer.stop();
155             } else {
156                 mSmilPlayer.stopWhenReload();
157             }
158             if (mMediaController != null) {
159                 // Must do this so we don't leak a window.
160                 mMediaController.hide();
161             }
162         }
163     }
164 
165     @Override
onKeyDown(int keyCode, KeyEvent event)166     public boolean onKeyDown(int keyCode, KeyEvent event) {
167         switch (keyCode) {
168             case KeyEvent.KEYCODE_VOLUME_DOWN:
169             case KeyEvent.KEYCODE_VOLUME_UP:
170             case KeyEvent.KEYCODE_DPAD_UP:
171             case KeyEvent.KEYCODE_DPAD_DOWN:
172             case KeyEvent.KEYCODE_DPAD_LEFT:
173             case KeyEvent.KEYCODE_DPAD_RIGHT:
174                 break;
175             case KeyEvent.KEYCODE_BACK:
176             case KeyEvent.KEYCODE_MENU:
177                 if ((mSmilPlayer != null) &&
178                         (mSmilPlayer.isPausedState()
179                         || mSmilPlayer.isPlayingState()
180                         || mSmilPlayer.isPlayedState())) {
181                     mSmilPlayer.stop();
182                 }
183                 break;
184             default:
185                 if ((mSmilPlayer != null) && (mMediaController != null)) {
186                     mMediaController.show();
187                 }
188         }
189         return super.onKeyDown(keyCode, event);
190     }
191 
192     private class SmilPlayerController implements MediaPlayerControl {
193         private final SmilPlayer mPlayer;
194 
SmilPlayerController(SmilPlayer player)195         public SmilPlayerController(SmilPlayer player) {
196             mPlayer = player;
197         }
198 
getBufferPercentage()199         public int getBufferPercentage() {
200             // We don't need to buffer data, always return 100%.
201             return 100;
202         }
203 
getCurrentPosition()204         public int getCurrentPosition() {
205             return mPlayer.getCurrentPosition();
206         }
207 
getDuration()208         public int getDuration() {
209             return mPlayer.getDuration();
210         }
211 
isPlaying()212         public boolean isPlaying() {
213             return mPlayer != null ? mPlayer.isPlayingState() : false;
214         }
215 
pause()216         public void pause() {
217             if (mPlayer != null) {
218                 mPlayer.pause();
219             }
220         }
221 
seekTo(int pos)222         public void seekTo(int pos) {
223             // Don't need to support.
224         }
225 
start()226         public void start() {
227             if (mPlayer != null) {
228                 mPlayer.start();
229             }
230         }
231 
canPause()232         public boolean canPause() {
233             return true;
234         }
235 
canSeekBackward()236         public boolean canSeekBackward() {
237             return true;
238         }
239 
canSeekForward()240         public boolean canSeekForward() {
241             return true;
242         }
243     }
244 
handleEvent(Event evt)245     public void handleEvent(Event evt) {
246         final Event event = evt;
247         mHandler.post(new Runnable() {
248             public void run() {
249                 String type = event.getType();
250                 if(type.equals(SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT)) {
251                     finish();
252                 }
253             }
254         });
255     }
256 }
257