Created preview fragment to show previews for audio, video and images; shown when...
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / fragment / FileDetailFragment.java
index 0d07c44..e90dbf7 100644 (file)
@@ -71,6 +71,7 @@ import android.widget.ImageView;
 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
@@ -96,7 +97,9 @@ import com.owncloud.android.operations.SynchronizeFileOperation;
 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
@@ -109,11 +112,12 @@ import eu.alefzero.webdav.WebdavUtils;
  * 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
@@ -133,6 +137,7 @@ public class FileDetailFragment extends SherlockFragment implements
     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
@@ -220,6 +225,7 @@ public class FileDetailFragment extends SherlockFragment implements
         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
@@ -234,6 +240,7 @@ public class FileDetailFragment extends SherlockFragment implements
         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
@@ -270,9 +277,6 @@ public class FileDetailFragment extends SherlockFragment implements
 \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
@@ -290,9 +294,6 @@ public class FileDetailFragment extends SherlockFragment implements
             mPreview = null;\r
         }\r
         \r
-        if (mMediaController != null) {\r
-            mMediaController.hide();\r
-        }\r
     }\r
 \r
 \r
@@ -301,9 +302,15 @@ public class FileDetailFragment extends SherlockFragment implements
         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
@@ -418,25 +425,23 @@ public class FileDetailFragment extends SherlockFragment implements
     \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
@@ -446,6 +451,7 @@ public class FileDetailFragment extends SherlockFragment implements
                                     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
@@ -460,9 +466,7 @@ public class FileDetailFragment extends SherlockFragment implements
                     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
@@ -472,13 +476,20 @@ public class FileDetailFragment extends SherlockFragment implements
             }\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
@@ -589,10 +600,9 @@ public class FileDetailFragment extends SherlockFragment implements
 \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