import android.widget.MediaController;\r
import android.widget.TextView;\r
import android.widget.Toast;\r
+import android.widget.VideoView;\r
\r
import com.actionbarsherlock.app.SherlockFragment;\r
import com.owncloud.android.AccountUtils;\r
import com.owncloud.android.ui.activity.ConflictsResolveActivity;\r
import com.owncloud.android.ui.activity.FileDetailActivity;\r
import com.owncloud.android.ui.activity.FileDisplayActivity;\r
+import com.owncloud.android.ui.OnSwipeTouchListener;\r
import com.owncloud.android.ui.activity.TransferServiceGetter;\r
+import com.owncloud.android.ui.activity.VideoActivity;\r
import com.owncloud.android.ui.dialog.EditNameDialog;\r
import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;\r
import com.owncloud.android.utils.OwnCloudVersion;\r
* This Fragment is used to display the details about a file.\r
* \r
* @author Bartek Przybylski\r
- * \r
+ * @author David A. Velasco\r
*/\r
public class FileDetailFragment extends SherlockFragment implements\r
OnClickListener, OnTouchListener, \r
- ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener {\r
+ ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener,\r
+ FileFragment {\r
\r
public static final String EXTRA_FILE = "FILE";\r
public static final String EXTRA_ACCOUNT = "ACCOUNT";\r
private Handler mHandler;\r
private RemoteOperation mLastRemoteOperation;\r
private DialogFragment mCurrentDialog;\r
+ \r
private MediaServiceBinder mMediaServiceBinder = null;\r
private MediaController mMediaController = null;\r
private MediaServiceConnection mMediaServiceConnection = null;\r
super.onAttach(activity);\r
try {\r
mContainerActivity = (ContainerActivity) activity;\r
+ \r
} catch (ClassCastException e) {\r
throw new ClassCastException(activity.toString() + " must implement " + FileDetailFragment.ContainerActivity.class.getSimpleName());\r
}\r
super.onActivityCreated(savedInstanceState);\r
if (mAccount != null) {\r
mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());;\r
+ mView.setOnTouchListener(new OnSwipeTouchListener(getActivity())); \r
}\r
}\r
\r
\r
mPreview = (ImageView)mView.findViewById(R.id.fdPreview); // this is here just because it is nullified in onPause()\r
\r
- if (mMediaController != null) {\r
- mMediaController.show();\r
- }\r
}\r
\r
\r
mPreview = null;\r
}\r
\r
- if (mMediaController != null) {\r
- mMediaController.hide();\r
- }\r
}\r
\r
\r
super.onStop();\r
if (mMediaServiceConnection != null) {\r
Log.d(TAG, "Unbinding from MediaService ...");\r
+ if (mMediaServiceBinder != null && mMediaController != null) {\r
+ mMediaServiceBinder.unregisterMediaController(mMediaController);\r
+ }\r
getActivity().unbindService(mMediaServiceConnection);\r
mMediaServiceBinder = null;\r
- mMediaController = null;\r
+ if (mMediaController != null) {\r
+ mMediaController.hide();\r
+ mMediaController = null;\r
+ }\r
}\r
}\r
\r
\r
@Override\r
public boolean onTouch(View v, MotionEvent event) {\r
- if (v == mPreview && event.getAction() == MotionEvent.ACTION_DOWN && mFile != null && mFile.isDown() && mFile.isAudio()) {\r
- if (!mMediaServiceBinder.isPlaying(mFile)) {\r
- Log.d(TAG, "starting playback of " + mFile.getStoragePath());\r
- mMediaServiceBinder.start(mAccount, mFile);\r
- // this is a patch; need to synchronize this with the onPrepared() coming from MediaPlayer in the MediaService\r
- mMediaController.postDelayed(new Runnable() {\r
- @Override\r
- public void run() {\r
- mMediaController.show(0);\r
- }\r
- } , 300);\r
- } else {\r
- mMediaController.show(0);\r
+ if (v == mPreview && event.getAction() == MotionEvent.ACTION_DOWN && mFile != null && mFile.isDown()) {\r
+ if (mFile.isVideo()) {\r
+ startVideoActivity();\r
}\r
}\r
return false;\r
}\r
\r
\r
+ private void startVideoActivity() {\r
+ Intent i = new Intent(getActivity(), VideoActivity.class);\r
+ i.putExtra(VideoActivity.EXTRA_FILE, mFile);\r
+ i.putExtra(VideoActivity.EXTRA_ACCOUNT, mAccount);\r
+ startActivity(i);\r
+ }\r
+\r
+\r
private void bindMediaService() {\r
Log.d(TAG, "Binding to MediaService...");\r
if (mMediaServiceConnection == null) {\r
MediaService.class),\r
mMediaServiceConnection, \r
Context.BIND_AUTO_CREATE);\r
+ // follow the flow in MediaServiceConnection#onServiceConnected(...)\r
}\r
\r
/** Defines callbacks for service binding, passed to bindService() */\r
if (mMediaController == null) {\r
mMediaController = new MediaController(getSherlockActivity());\r
}\r
- mMediaController.setMediaPlayer(mMediaServiceBinder);\r
- mMediaController.setAnchorView(mPreview);\r
- mMediaController.setEnabled(true);\r
+ prepareMediaController();\r
\r
Log.d(TAG, "Successfully bound to MediaService, MediaController ready");\r
\r
}\r
}\r
\r
+ private void prepareMediaController() {\r
+ mMediaServiceBinder.registerMediaController(mMediaController);\r
+ mMediaController.setMediaPlayer(mMediaServiceBinder);\r
+ mMediaController.setAnchorView(getView());\r
+ mMediaController.setEnabled(mMediaServiceBinder.isInPlaybackState());\r
+ }\r
+\r
@Override\r
public void onServiceDisconnected(ComponentName component) {\r
if (component.equals(new ComponentName(getActivity(), MediaService.class))) {\r
- Log.d(TAG, "Media service suddenly disconnected");\r
+ Log.e(TAG, "Media service suddenly disconnected");\r
if (mMediaController != null) {\r
mMediaController.hide();\r
- mMediaController.setMediaPlayer(null); // TODO check this is not an error\r
+ mMediaController.setMediaPlayer(null);\r
mMediaController = null;\r
}\r
mMediaServiceBinder = null;\r
\r
\r
/**\r
- * Can be used to get the file that is currently being displayed.\r
- * @return The file on the screen.\r
+ * {@inheritDoc}\r
*/\r
- public OCFile getDisplayedFile(){\r
+ public OCFile getFile(){\r
return mFile;\r
}\r
\r