package com.iwedia.gui.multimedia; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; import android.media.MediaPlayer; import android.os.Parcel; import android.util.Log; import android.view.Display; import android.view.WindowManager; import android.widget.VideoView; import com.iwedia.gui.multimedia.controller.MediaController; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MultimediaPlayer extends VideoView { private static final String TAG = "MultimediaPlayer"; private static final boolean DEBUG = true; private MediaPlayer mMediaPlayer = null; private Rect mRectangle; MediaPlayer.OnPreparedListener mVideoPreparedListener = new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { if (DEBUG) { Log.d(TAG, "mVideoPreparedListener onPrepared"); } mMediaPlayer = mp; mMediaPlayer .setOnVideoSizeChangedListener(mVideoSizeChangedListener); MediaController.isStopped = false; } }; @Override public void stopPlayback() { Log.e("VideoView", TAG + "*********************************** stopPlayback"); super.stopPlayback(); } @Override public void start() { Log.e("VideoView", TAG + "*********************************** start"); super.start(); } public void stop() { Log.e("VideoView", TAG + "*********************************** stop"); } MediaPlayer.OnVideoSizeChangedListener mVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() { public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { if (null != mMediaPlayer) { scale(); } } }; private MediaPlayer.OnErrorListener mVideoOnErrorListener = new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(TAG, "On error listener - CODE: " + what); if (!MediaController.isStopped) { Log.e(TAG, "On error listener - setting isStopped flag to true"); MediaController.isStopped = true; return false; } return true; } }; private Point getDefaultDisplaySize(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); return size; } public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } public MultimediaPlayer(Context context) { super(context); Point size = getDefaultDisplaySize(context); mRectangle = new Rect(0, 0, size.x, size.y + getStatusBarHeight()); setOnPreparedListener(mVideoPreparedListener); setOnErrorListener(mVideoOnErrorListener); MediaController.isStopped = false; } public void setViewRectangle(int x, int y, int width, int height) { if (DEBUG) { Log.d(TAG, "MultimediaPlayer rectangle: " + mRectangle); } mRectangle.left = x; mRectangle.top = y; mRectangle.bottom = mRectangle.top + height; mRectangle.right = mRectangle.left + width; } public void scale() { Method hiddenInvokeMethod = null; Parcel request = Parcel.obtain(); Parcel reply = Parcel.obtain(); request.writeInterfaceToken("android.media.IMediaPlayer"); try { hiddenInvokeMethod = MediaPlayer.class.getDeclaredMethod("invoke", Parcel.class, Parcel.class); } catch (NoSuchMethodException e) { Log.e(TAG, "Error geting mediaplayer invoke method"); e.printStackTrace(); } request.writeInt(3); request.writeInt(mRectangle.left); request.writeInt(mRectangle.top); request.writeInt(mRectangle.right - mRectangle.left); request.writeInt(mRectangle.bottom - mRectangle.top); Object[] params = new Object[] { request, reply }; try { if (hiddenInvokeMethod != null) { hiddenInvokeMethod.invoke(mMediaPlayer, params); } } catch (IllegalArgumentException e) { Log.e(TAG, "Error calling mediaplayer invoke method (IllegalArgumentException)"); e.printStackTrace(); } catch (IllegalAccessException e) { Log.e(TAG, "Error calling mediaplayer invoke method (IllegalAccessException)"); e.printStackTrace(); } catch (InvocationTargetException e) { Log.e(TAG, "Error calling mediaplayer invoke method (InvocationTargetException)"); e.printStackTrace(); } } }