X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7018ae7e1f3989779bf47b86e762b7521b7df20e..7ffe1196d33079965a65cf7bf23bebdb6bfac5b0:/src/com/owncloud/android/ui/fragment/FileDetailFragment.java diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 4d6fb483..e90dbf71 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -28,6 +28,7 @@ import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.entity.FileEntity; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; @@ -39,9 +40,11 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.ServiceConnection; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; @@ -50,20 +53,25 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.Display; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; +import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.webkit.MimeTypeMap; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; +import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; +import android.widget.VideoView; import com.actionbarsherlock.app.SherlockFragment; import com.owncloud.android.AccountUtils; @@ -77,6 +85,7 @@ import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.media.MediaService; +import com.owncloud.android.media.MediaServiceBinder; import com.owncloud.android.network.OwnCloudClientUtils; import com.owncloud.android.operations.OnRemoteOperationListener; import com.owncloud.android.operations.RemoteOperation; @@ -88,7 +97,9 @@ import com.owncloud.android.operations.SynchronizeFileOperation; import com.owncloud.android.ui.activity.ConflictsResolveActivity; import com.owncloud.android.ui.activity.FileDetailActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.ui.OnSwipeTouchListener; import com.owncloud.android.ui.activity.TransferServiceGetter; +import com.owncloud.android.ui.activity.VideoActivity; import com.owncloud.android.ui.dialog.EditNameDialog; import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener; import com.owncloud.android.utils.OwnCloudVersion; @@ -101,10 +112,12 @@ import eu.alefzero.webdav.WebdavUtils; * This Fragment is used to display the details about a file. * * @author Bartek Przybylski - * + * @author David A. Velasco */ public class FileDetailFragment extends SherlockFragment implements - OnClickListener, ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener { + OnClickListener, OnTouchListener, + ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener, + FileFragment { public static final String EXTRA_FILE = "FILE"; public static final String EXTRA_ACCOUNT = "ACCOUNT"; @@ -124,6 +137,10 @@ public class FileDetailFragment extends SherlockFragment implements private Handler mHandler; private RemoteOperation mLastRemoteOperation; private DialogFragment mCurrentDialog; + + private MediaServiceBinder mMediaServiceBinder = null; + private MediaController mMediaController = null; + private MediaServiceConnection mMediaServiceConnection = null; private static final String TAG = FileDetailFragment.class.getSimpleName(); public static final String FTAG = "FileDetails"; @@ -192,6 +209,7 @@ public class FileDetailFragment extends SherlockFragment implements mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this); //mView.findViewById(R.id.fdShareBtn).setOnClickListener(this); mPreview = (ImageView)mView.findViewById(R.id.fdPreview); + mPreview.setOnTouchListener(this); } updateFileDetails(false); @@ -207,6 +225,7 @@ public class FileDetailFragment extends SherlockFragment implements super.onAttach(activity); try { mContainerActivity = (ContainerActivity) activity; + } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement " + FileDetailFragment.ContainerActivity.class.getSimpleName()); } @@ -221,6 +240,7 @@ public class FileDetailFragment extends SherlockFragment implements super.onActivityCreated(savedInstanceState); if (mAccount != null) { mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());; + mView.setOnTouchListener(new OnSwipeTouchListener(getActivity())); } } @@ -234,6 +254,13 @@ public class FileDetailFragment extends SherlockFragment implements Log.i(getClass().toString(), "onSaveInstanceState() end"); } + @Override + public void onStart() { + super.onStart(); + if (mFile != null && mFile.isAudio()) { + bindMediaService(); + } + } @Override public void onResume() { @@ -247,10 +274,12 @@ public class FileDetailFragment extends SherlockFragment implements mUploadFinishReceiver = new UploadFinishReceiver(); filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE); getActivity().registerReceiver(mUploadFinishReceiver, filter); + + mPreview = (ImageView)mView.findViewById(R.id.fdPreview); // this is here just because it is nullified in onPause() - mPreview = (ImageView)mView.findViewById(R.id.fdPreview); } + @Override public void onPause() { super.onPause(); @@ -261,18 +290,37 @@ public class FileDetailFragment extends SherlockFragment implements getActivity().unregisterReceiver(mUploadFinishReceiver); mUploadFinishReceiver = null; - if (mPreview != null) { + if (mPreview != null) { // why? mPreview = null; } + } + + @Override + public void onStop() { + super.onStop(); + if (mMediaServiceConnection != null) { + Log.d(TAG, "Unbinding from MediaService ..."); + if (mMediaServiceBinder != null && mMediaController != null) { + mMediaServiceBinder.unregisterMediaController(mMediaController); + } + getActivity().unbindService(mMediaServiceConnection); + mMediaServiceBinder = null; + if (mMediaController != null) { + mMediaController.hide(); + mMediaController = null; + } + } + } + + @Override public View getView() { return super.getView() == null ? mView : super.getView(); } - @Override public void onClick(View v) { switch (v.getId()) { @@ -374,18 +422,88 @@ public class FileDetailFragment extends SherlockFragment implements }*/ } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if (v == mPreview && event.getAction() == MotionEvent.ACTION_DOWN && mFile != null && mFile.isDown()) { + if (mFile.isVideo()) { + startVideoActivity(); + } + } + return false; + } + + + private void startVideoActivity() { + Intent i = new Intent(getActivity(), VideoActivity.class); + i.putExtra(VideoActivity.EXTRA_FILE, mFile); + i.putExtra(VideoActivity.EXTRA_ACCOUNT, mAccount); + startActivity(i); + } + + + private void bindMediaService() { + Log.d(TAG, "Binding to MediaService..."); + if (mMediaServiceConnection == null) { + mMediaServiceConnection = new MediaServiceConnection(); + } + getActivity().bindService( new Intent(getActivity(), + MediaService.class), + mMediaServiceConnection, + Context.BIND_AUTO_CREATE); + // follow the flow in MediaServiceConnection#onServiceConnected(...) + } + + /** Defines callbacks for service binding, passed to bindService() */ + private class MediaServiceConnection implements ServiceConnection { + + @Override + public void onServiceConnected(ComponentName component, IBinder service) { + if (component.equals(new ComponentName(getActivity(), MediaService.class))) { + Log.d(TAG, "Media service connected"); + mMediaServiceBinder = (MediaServiceBinder) service; + if (mMediaServiceBinder != null) { + if (mMediaController == null) { + mMediaController = new MediaController(getSherlockActivity()); + } + prepareMediaController(); + + Log.d(TAG, "Successfully bound to MediaService, MediaController ready"); + + } else { + Log.e(TAG, "Unexpected response from MediaService while binding"); + } + } + } + + private void prepareMediaController() { + mMediaServiceBinder.registerMediaController(mMediaController); + mMediaController.setMediaPlayer(mMediaServiceBinder); + mMediaController.setAnchorView(getView()); + mMediaController.setEnabled(mMediaServiceBinder.isInPlaybackState()); + } + + @Override + public void onServiceDisconnected(ComponentName component) { + if (component.equals(new ComponentName(getActivity(), MediaService.class))) { + Log.e(TAG, "Media service suddenly disconnected"); + if (mMediaController != null) { + mMediaController.hide(); + mMediaController.setMediaPlayer(null); + mMediaController = null; + } + mMediaServiceBinder = null; + mMediaServiceConnection = null; + } + } + } + + /** * Opens mFile. */ private void openFile() { - Intent i = new Intent(getActivity(), MediaService.class); - i.putExtra(MediaService.EXTRA_ACCOUNT, mAccount); - i.putExtra(MediaService.EXTRA_FILE, mFile); - i.setAction(MediaService.ACTION_PLAY_FILE); - getActivity().startService(i); - - /* String storagePath = mFile.getStoragePath(); String encodedStoragePath = WebdavUtils.encodePath(storagePath); try { @@ -406,7 +524,7 @@ public class FileDetailFragment extends SherlockFragment implements i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType); } else { // desperate try - i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*-/*"); + i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*/*"); } i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivity(i); @@ -428,7 +546,7 @@ public class FileDetailFragment extends SherlockFragment implements } } - }*/ + } } @@ -482,10 +600,9 @@ public class FileDetailFragment extends SherlockFragment implements /** - * Can be used to get the file that is currently being displayed. - * @return The file on the screen. + * {@inheritDoc} */ - public OCFile getDisplayedFile(){ + public OCFile getFile(){ return mFile; } @@ -512,6 +629,8 @@ public class FileDetailFragment extends SherlockFragment implements * * TODO Remove parameter when the transferring state of files is kept in database. * + * TODO REFACTORING! this method called 5 times before every time the fragment is shown! + * * @param transferring Flag signaling if the file should be considered as downloading or uploading, * although {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and * {@link FileUploaderBinder#isUploading(Account, OCFile)} return false. @@ -519,7 +638,7 @@ public class FileDetailFragment extends SherlockFragment implements */ public void updateFileDetails(boolean transferring) { - if (mFile != null && mAccount != null && mLayout == R.layout.file_details_fragment) { + if (readyToShow()) { // set file details setFilename(mFile.getFileName()); @@ -560,6 +679,17 @@ public class FileDetailFragment extends SherlockFragment implements /** + * Checks if the fragment is ready to show details of a OCFile + * + * @return 'True' when the fragment is ready to show details of a file + */ + private boolean readyToShow() { + return (mFile != null && mAccount != null && mLayout == R.layout.file_details_fragment); + } + + + + /** * Updates the filename in view * @param filename to set */ @@ -1074,4 +1204,5 @@ public class FileDetailFragment extends SherlockFragment implements } } + }