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