blob: 4f1512620c7e976922c4b0b8fb1437b301a395cb [file] [log] [blame]
/*
* Copyright (C) 2008 Esmertec AG.
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.mms.ui;
import com.android.mms.R;
import com.android.mms.dom.smil.SmilDocumentImpl;
import com.android.mms.dom.smil.SmilPlayer;
import com.android.mms.dom.smil.parser.SmilXmlSerializer;
import com.android.mms.model.SlideshowModel;
import com.android.mms.model.SmilHelper;
import com.google.android.mms.MmsException;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.smil.SMILDocument;
import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Config;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.widget.MediaController;
import android.widget.MediaController.MediaPlayerControl;
import java.io.ByteArrayOutputStream;
/**
* Plays the given slideshow in full-screen mode with a common controller.
*/
public class SlideshowActivity extends Activity implements EventListener {
private static final String TAG = "SlideshowActivity";
private static final boolean DEBUG = false;
private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
private MediaController mMediaController;
private SmilPlayer mSmilPlayer;
private Handler mHandler;
private SMILDocument mSmilDoc;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mHandler = new Handler();
// Play slide-show in full-screen mode.
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.slideshow);
Intent intent = getIntent();
Uri msg = intent.getData();
final SlideshowModel model;
try {
model = SlideshowModel.createFromMessageUri(this, msg);
} catch (MmsException e) {
Log.e(TAG, "Cannot present the slide show.", e);
finish();
return;
}
SlideView view = (SlideView) findViewById(R.id.slide_view);
PresenterFactory.getPresenter("SlideshowPresenter", this, view, model);
mHandler.post(new Runnable() {
private boolean isRotating() {
return mSmilPlayer.isPausedState()
|| mSmilPlayer.isPlayingState()
|| mSmilPlayer.isPlayedState();
}
public void run() {
mSmilPlayer = SmilPlayer.getPlayer();
initMediaController();
// Use SmilHelper.getDocument() to ensure rebuilding the
// entire SMIL document.
mSmilDoc = SmilHelper.getDocument(model);
if (DEBUG) {
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
SmilXmlSerializer.serialize(mSmilDoc, ostream);
if (LOCAL_LOGV) {
Log.v(TAG, ostream.toString());
}
}
// Add event listener.
((EventTarget) mSmilDoc).addEventListener(
SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT,
SlideshowActivity.this, false);
mSmilPlayer.init(mSmilDoc);
if (isRotating()) {
mSmilPlayer.reload();
} else {
mSmilPlayer.play();
}
}
});
}
private void initMediaController() {
mMediaController = new MediaController(SlideshowActivity.this, false);
mMediaController.setMediaPlayer(new SmilPlayerController(mSmilPlayer));
mMediaController.setAnchorView(findViewById(R.id.slide_view));
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if ((mSmilPlayer != null) && (mMediaController != null)) {
mMediaController.show();
}
return false;
}
@Override
protected void onPause() {
super.onPause();
if (mSmilDoc != null) {
((EventTarget) mSmilDoc).removeEventListener(
SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, this, false);
}
}
@Override
protected void onStop() {
super.onStop();
if ((null != mSmilPlayer)) {
if (isFinishing()) {
mSmilPlayer.stop();
} else {
mSmilPlayer.stopWhenReload();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
break;
default:
if ((mSmilPlayer != null) && (mMediaController != null)) {
mMediaController.show();
}
}
return super.onKeyDown(keyCode, event);
}
private class SmilPlayerController implements MediaPlayerControl {
private final SmilPlayer mPlayer;
public SmilPlayerController(SmilPlayer player) {
mPlayer = player;
}
public int getBufferPercentage() {
// We don't need to buffer data, always return 100%.
return 100;
}
public int getCurrentPosition() {
return mPlayer.getCurrentPosition();
}
public int getDuration() {
return mPlayer.getDuration();
}
public boolean isPlaying() {
return mPlayer != null ? mPlayer.isPlayingState() : false;
}
public void pause() {
if (mPlayer != null) {
mPlayer.pause();
}
}
public void seekTo(int pos) {
// Don't need to support.
}
public void start() {
if (mPlayer != null) {
mPlayer.start();
}
}
}
public void handleEvent(Event evt) {
final Event event = evt;
mHandler.post(new Runnable() {
public void run() {
String type = event.getType();
if(type.equals(SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT)) {
finish();
}
}
});
}
}