package com.novoda.spikes.videoplayerservice; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; @SuppressWarnings("ConstantConditions") public class MediaPlayerSwitcherActivity extends Activity { private static final int PICK_VIDEO_REQUEST = 1001; private static final String TAG = "MediaPlayerSwitcherActivity"; private SurfaceHolder mFirstSurface; private SurfaceHolder mSecondSurface; private SurfaceHolder mActiveSurface; private Uri mVideoUri; private Uri mVideoUri2; private VideoPlayerService service; private ServiceConnection conn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mediaplayer_switcher); SurfaceView first = (SurfaceView) findViewById(R.id.firstSurface); first.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Log.d(TAG, "First surface created!"); mFirstSurface = surfaceHolder; playIfPossibleAfterSurfaceCreated(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { Log.d(TAG, "First surface destroyed!"); mFirstSurface = null; } }); SurfaceView second = (SurfaceView) findViewById(R.id.secondSurface); second.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Log.d(TAG, "Second surface created!"); mSecondSurface = surfaceHolder; } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { Log.d(TAG, "Second surface destroyed!"); } }); mVideoUri = Uri.parse("http://www.w3schools.com/html/movie.mp4"); mVideoUri2 = Uri.parse("https://archive.org/download/Windows7WildlifeSampleVideo/Wildlife_512kb.mp4"); startService(); } @Override protected void onPause() { super.onPause(); mFirstSurface = null; mVideoUri = null; if (service != null){ service.setDisplay(null); } } @Override protected void onDestroy() { unbindService(conn); super.onDestroy(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PICK_VIDEO_REQUEST && resultCode == RESULT_OK) { Log.d(TAG, "Got video " + data.getData()); mVideoUri = data.getData(); if (service != null){ service.setVideoData(mVideoUri.toString()); } } } public void doStartStop(View view) { if (service == null || !service.isPlaying()) { Intent pickVideo = new Intent(Intent.ACTION_PICK); pickVideo.setType("video/*"); startActivityForResult(pickVideo, PICK_VIDEO_REQUEST); } else { service.stopPlaying(); service = null; } } public void doSwitchSurface(View view) { if (service != null && service.isPlaying()) { mActiveSurface = mFirstSurface == mActiveSurface ? mSecondSurface : mFirstSurface; service.setDisplay(mActiveSurface); } } public void doStartVideo1(View view) { service.setVideoData(mVideoUri.toString()); } public void doStartVideo2(View view){ service.setVideoData(mVideoUri2.toString()); } public void doPauseResume(View view){ if (service != null){ service.togglePauseResume(); } } public void startService(){ startService(new Intent(this, VideoPlayerService.class)); conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { service = ((VideoPlayerService.Binder) iBinder).getService(); if (mVideoUri != null) { service.setVideoData(mVideoUri.toString()); } playIfPossibleAfterServiceConnected(); } @Override public void onServiceDisconnected(ComponentName componentName) { } }; bindService(new Intent(this, VideoPlayerService.class), conn, BIND_AUTO_CREATE); } private void playIfPossibleAfterServiceConnected() { if (mFirstSurface != null && mSecondSurface != null){ service.setDisplay(mFirstSurface); } } private void playIfPossibleAfterSurfaceCreated(){ if (service != null){ service.setDisplay(mFirstSurface); } } }