Fixed undesired video loop after completion, caused by bugs in GINGERBREAD
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / fragment / FileDetailFragment.java
index 148c9f2..80dc426 100644 (file)
@@ -1,9 +1,10 @@
 /* ownCloud Android client application\r
  *   Copyright (C) 2011  Bartek Przybylski\r
+ *   Copyright (C) 2012-2013 ownCloud Inc.\r
  *\r
  *   This program is free software: you can redistribute it and/or modify\r
  *   it under the terms of the GNU General Public License as published by\r
- *   the Free Software Foundation, either version 3 of the License, or\r
+ *   the Free Software Foundation, either version 2 of the License, or\r
  *   (at your option) any later version.\r
  *\r
  *   This program is distributed in the hope that it will be useful,\r
@@ -29,7 +30,6 @@ import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
 import org.apache.http.HttpStatus;\r
 import org.apache.http.NameValuePair;\r
 import org.apache.http.client.utils.URLEncodedUtils;\r
-import org.apache.http.entity.FileEntity;\r
 import org.apache.http.message.BasicNameValuePair;\r
 import org.apache.http.protocol.HTTP;\r
 import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
@@ -37,44 +37,28 @@ import org.json.JSONObject;
 \r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
-import android.annotation.SuppressLint;\r
 import android.app.Activity;\r
 import android.content.ActivityNotFoundException;\r
 import android.content.BroadcastReceiver;\r
-import android.content.ComponentName;\r
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
-import android.content.ServiceConnection;\r
-import android.graphics.Bitmap;\r
-import android.graphics.BitmapFactory;\r
-import android.graphics.BitmapFactory.Options;\r
-import android.graphics.Point;\r
 import android.net.Uri;\r
-import android.os.AsyncTask;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
-import android.os.IBinder;\r
-import android.support.v4.app.DialogFragment;\r
 import android.support.v4.app.FragmentTransaction;\r
 import android.util.Log;\r
-import android.view.Display;\r
 import android.view.LayoutInflater;\r
-import android.view.MotionEvent;\r
 import android.view.View;\r
 import android.view.View.OnClickListener;\r
-import android.view.View.OnTouchListener;\r
 import android.view.ViewGroup;\r
 import android.webkit.MimeTypeMap;\r
-import android.webkit.WebView.FindListener;\r
 import android.widget.Button;\r
 import android.widget.CheckBox;\r
 import android.widget.ImageView;\r
-import android.widget.MediaController;\r
 import android.widget.ProgressBar;\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
@@ -82,13 +66,10 @@ import com.owncloud.android.DisplayUtils;
 import com.owncloud.android.authenticator.AccountAuthenticator;\r
 import com.owncloud.android.datamodel.FileDataStorageManager;\r
 import com.owncloud.android.datamodel.OCFile;\r
-import com.owncloud.android.files.services.FileDownloader;\r
 import com.owncloud.android.files.services.FileObserverService;\r
 import com.owncloud.android.files.services.FileUploader;\r
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
-import com.owncloud.android.media.MediaService;\r
-import com.owncloud.android.media.MediaServiceBinder;\r
 import com.owncloud.android.network.OwnCloudClientUtils;\r
 import com.owncloud.android.operations.OnRemoteOperationListener;\r
 import com.owncloud.android.operations.RemoteOperation;\r
@@ -100,9 +81,6 @@ 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
@@ -135,17 +113,12 @@ public class FileDetailFragment extends SherlockFragment implements
     private Account mAccount;\r
     private FileDataStorageManager mStorageManager;\r
     \r
-    private DownloadFinishReceiver mDownloadFinishReceiver;\r
     private UploadFinishReceiver mUploadFinishReceiver;\r
     public ProgressListener mProgressListener;\r
     \r
     private Handler mHandler;\r
     private RemoteOperation mLastRemoteOperation;\r
     \r
-    private MediaServiceBinder mMediaServiceBinder = null;\r
-    private MediaController mMediaController = null;\r
-    private MediaServiceConnection mMediaServiceConnection = null;\r
-\r
     private static final String TAG = FileDetailFragment.class.getSimpleName();\r
     public static final String FTAG = "FileDetails"; \r
     public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";\r
@@ -218,7 +191,7 @@ public class FileDetailFragment extends SherlockFragment implements
             mProgressListener = new ProgressListener(progressBar);\r
         }\r
         \r
-        updateFileDetails(false);\r
+        updateFileDetails(false, false);\r
         return view;\r
     }\r
     \r
@@ -245,41 +218,29 @@ public class FileDetailFragment extends SherlockFragment implements
     public void onActivityCreated(Bundle savedInstanceState) {\r
         super.onActivityCreated(savedInstanceState);\r
         if (mAccount != null) {\r
-            mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());;\r
-            mView.setOnTouchListener(new OnSwipeTouchListener(getActivity()));            \r
+            mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());\r
         }\r
     }\r
         \r
 \r
     @Override\r
     public void onSaveInstanceState(Bundle outState) {\r
-        Log.i(getClass().toString(), "onSaveInstanceState() start");\r
         super.onSaveInstanceState(outState);\r
         outState.putParcelable(FileDetailFragment.EXTRA_FILE, mFile);\r
         outState.putParcelable(FileDetailFragment.EXTRA_ACCOUNT, mAccount);\r
-        Log.i(getClass().toString(), "onSaveInstanceState() end");\r
     }\r
 \r
     @Override\r
     public void onStart() {\r
         super.onStart();\r
-        if (mFile != null && mFile.isAudio()) {\r
-            bindMediaService();\r
-        }\r
         listenForTransferProgress();\r
     }\r
     \r
     @Override\r
     public void onResume() {\r
         super.onResume();\r
-        \r
-        mDownloadFinishReceiver = new DownloadFinishReceiver();\r
-        IntentFilter filter = new IntentFilter(\r
-                FileDownloader.DOWNLOAD_FINISH_MESSAGE);\r
-        getActivity().registerReceiver(mDownloadFinishReceiver, filter);\r
-        \r
         mUploadFinishReceiver = new UploadFinishReceiver();\r
-        filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);\r
+        IntentFilter filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);\r
         getActivity().registerReceiver(mUploadFinishReceiver, filter);\r
 \r
     }\r
@@ -288,34 +249,19 @@ public class FileDetailFragment extends SherlockFragment implements
     @Override\r
     public void onPause() {\r
         super.onPause();\r
-        \r
-        getActivity().unregisterReceiver(mDownloadFinishReceiver);\r
-        mDownloadFinishReceiver = null;\r
-        \r
-        getActivity().unregisterReceiver(mUploadFinishReceiver);\r
-        mUploadFinishReceiver = null;\r
-        \r
+        if (mUploadFinishReceiver != null) {\r
+            getActivity().unregisterReceiver(mUploadFinishReceiver);\r
+            mUploadFinishReceiver = null;\r
+        }\r
     }\r
 \r
-\r
+    \r
     @Override\r
     public void onStop() {\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
-            if (mMediaController != null) {\r
-                mMediaController.hide();\r
-                mMediaController = null;\r
-            }\r
-        }\r
         leaveTransferProgress();\r
     }\r
-    \r
+\r
     \r
     @Override\r
     public View getView() {\r
@@ -384,7 +330,6 @@ public class FileDetailFragment extends SherlockFragment implements
                                    FileObserverService.CMD_DEL_OBSERVED_FILE));\r
                 intent.putExtra(FileObserverService.KEY_CMD_ARG_FILE, mFile);\r
                 intent.putExtra(FileObserverService.KEY_CMD_ARG_ACCOUNT, mAccount);\r
-                Log.e(TAG, "starting observer service");\r
                 getActivity().startService(intent);\r
                 \r
                 if (mFile.keepInSync()) {\r
@@ -423,71 +368,6 @@ public class FileDetailFragment extends SherlockFragment implements
     }\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
-            mMediaServiceConnection = new MediaServiceConnection();\r
-        }\r
-        getActivity().bindService(  new Intent(getActivity(), \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
-    private class MediaServiceConnection implements ServiceConnection {\r
-\r
-        @Override\r
-        public void onServiceConnected(ComponentName component, IBinder service) {\r
-            if (component.equals(new ComponentName(getActivity(), MediaService.class))) {\r
-                Log.d(TAG, "Media service connected");\r
-                mMediaServiceBinder = (MediaServiceBinder) service;\r
-                if (mMediaServiceBinder != null) {\r
-                    if (mMediaController == null) {\r
-                        mMediaController = new MediaController(getSherlockActivity());\r
-                    }\r
-                    prepareMediaController();\r
-                    \r
-                    Log.d(TAG, "Successfully bound to MediaService, MediaController ready");\r
-                    \r
-                } else {\r
-                    Log.e(TAG, "Unexpected response from MediaService while binding");\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.e(TAG, "Media service suddenly disconnected");\r
-                if (mMediaController != null) {\r
-                    mMediaController.hide();\r
-                    mMediaController.setMediaPlayer(null);\r
-                    mMediaController = null;\r
-                }\r
-                mMediaServiceBinder = null;\r
-                mMediaServiceConnection = null;\r
-            }\r
-        }\r
-    }    \r
-\r
-\r
     /**\r
      * Opens mFile.\r
      */\r
@@ -603,7 +483,7 @@ public class FileDetailFragment extends SherlockFragment implements
             mStorageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver());\r
         }\r
         mAccount = ocAccount;\r
-        updateFileDetails(false);\r
+        updateFileDetails(false, false);\r
     }\r
     \r
 \r
@@ -617,12 +497,17 @@ public class FileDetailFragment extends SherlockFragment implements
      * @param transferring      Flag signaling if the file should be considered as downloading or uploading, \r
      *                          although {@link FileDownloaderBinder#isDownloading(Account, OCFile)}  and \r
      *                          {@link FileUploaderBinder#isUploading(Account, OCFile)} return false.\r
-     * \r
+     *                          \r
+     * @param refresh           If 'true', try to refresh the hold file from the database\r
      */\r
-    public void updateFileDetails(boolean transferring) {\r
+    public void updateFileDetails(boolean transferring, boolean refresh) {\r
 \r
         if (readyToShow()) {\r
             \r
+            if (refresh && mStorageManager != null) {\r
+                mFile = mStorageManager.getFileByPath(mFile.getRemotePath());\r
+            }\r
+            \r
             // set file details\r
             setFilename(mFile.getFileName());\r
             setFiletype(mFile.getMimetype());\r
@@ -823,29 +708,6 @@ public class FileDetailFragment extends SherlockFragment implements
     \r
     \r
     /**\r
-     * Once the file download has finished -> update view\r
-     * @author Bartek Przybylski\r
-     */\r
-    private class DownloadFinishReceiver extends BroadcastReceiver {\r
-        @Override\r
-        public void onReceive(Context context, Intent intent) {\r
-            String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);\r
-\r
-            if (!isEmpty() && accountName.equals(mAccount.name)) {\r
-                boolean downloadWasFine = intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false);\r
-                String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);\r
-                if (mFile.getRemotePath().equals(downloadedRemotePath)) {\r
-                    if (downloadWasFine) {\r
-                        mFile = mStorageManager.getFileByPath(downloadedRemotePath);\r
-                    }\r
-                    updateFileDetails(false);    // it updates the buttons; must be called although !downloadWasFine\r
-                }\r
-            }\r
-        }\r
-    }\r
-    \r
-    \r
-    /**\r
      * Once the file upload has finished -> update view\r
      * \r
      * Being notified about the finish of an upload is necessary for the next sequence:\r
@@ -875,7 +737,7 @@ public class FileDetailFragment extends SherlockFragment implements
                         msg.show();\r
                     }\r
                     getSherlockActivity().removeStickyBroadcast(intent);    // not the best place to do this; a small refactorization of BroadcastReceivers should be done\r
-                    updateFileDetails(false);    // it updates the buttons; must be called although !uploadWasFine; interrupted uploads still leave an incomplete file in the server\r
+                    updateFileDetails(false, false);    // it updates the buttons; must be called although !uploadWasFine; interrupted uploads still leave an incomplete file in the server\r
                 }\r
             }\r
         }\r