package com.dappervision.wearscript.ui; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ProgressBar; import com.dappervision.wearscript.Log; import com.dappervision.wearscript.R; import com.dappervision.wearscript.Utils; import com.dappervision.wearscript.events.MediaActionEvent; import com.google.android.glass.touchpad.Gesture; import java.io.IOException; public class MediaPlayerFragment extends GestureFragment implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener { public static final String ARG_URL = "ARG_URL"; public static final String ARG_LOOP = "ARG_LOOP"; private static final String TAG = "MediaPlayerFragment"; private MediaPlayer mp; private Uri mediaUri; private SurfaceHolder holder; private ProgressBar progressBar; private SurfaceView surfaceView; public static MediaPlayerFragment newInstance(Uri uri, boolean looping) { Bundle args = new Bundle(); args.putParcelable(ARG_URL, uri); args.putBoolean(ARG_LOOP, looping); MediaPlayerFragment f = new MediaPlayerFragment(); f.setArguments(args); return f; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Utils.getEventBus().register(this); setRetainInstance(true); mediaUri = getArguments().getParcelable(ARG_URL); createMediaPlayer(); } private void createMediaPlayer(){ if(progressBar != null) progressBar.setVisibility(View.VISIBLE); mp = new MediaPlayer(); try { mp.setDataSource(getActivity(), mediaUri); } catch (IOException e) { e.printStackTrace(); } mp.setOnErrorListener(this); mp.setOnPreparedListener(this); if (getArguments().getBoolean(ARG_LOOP)) mp.setLooping(true); mp.prepareAsync(); } public void onEvent(MediaActionEvent e) { String action = e.getAction(); if (action.equals("play")) { mp.start(); } else if (action.equals("stop")) { mp.stop(); getActivity().finish(); } else if (action.equals("pause")) { mp.pause(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_media_player, container, false); surfaceView = (SurfaceView) v.findViewById(R.id.media_surface); progressBar = (ProgressBar) v.findViewById(R.id.video_progressBar); holder = surfaceView.getHolder(); holder.addCallback(new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { if (mp != null) { mp.setDisplay(holder); } } public void surfaceDestroyed(SurfaceHolder holder) { if (mp != null) { mp.setDisplay(null); } } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { } }); return v; } @Override public void onPause() { super.onPause(); Log.d(TAG, "onPause"); getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getActivity().finish(); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); if (mp.isPlaying()) mp.stop(); mp.release(); mp = null; Utils.getEventBus().unregister(this); } @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i2) { Log.e(TAG, "MediaPlayer Error: "); if(i == MediaPlayer.MEDIA_ERROR_SERVER_DIED) { Log.w(TAG, "Server Died"); mediaPlayer.release(); mp = null; createMediaPlayer(); }else if (i == MediaPlayer.MEDIA_ERROR_UNKNOWN) { Log.w(TAG, "Unknown Error, resetting"); mediaPlayer.release(); mp = null; createMediaPlayer(); } return false; } @Override public void onPrepared(MediaPlayer mediaPlayer) { if(progressBar != null){ progressBar.setVisibility(View.GONE); } surfaceView.setVisibility(View.VISIBLE); mediaPlayer.start(); } @Override public boolean onGesture(Gesture gesture) { if (gesture == Gesture.TAP) { if (mp.isPlaying()) { mp.pause(); } else { mp.start(); } return true; } return false; } @Override public boolean onScroll(float v, float v2, float v3) { if(mp.isPlaying()) return false; int newPosition = mp.getCurrentPosition() + (int)(v * 10); if(newPosition < 0) newPosition = 0; if(newPosition > mp.getDuration()) newPosition = mp.getDuration() - 5; mp.seekTo(newPosition); return true; } }