/* 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
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
\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
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
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
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
mProgressListener = new ProgressListener(progressBar);\r
}\r
\r
- updateFileDetails(false);\r
+ updateFileDetails(false, false);\r
return view;\r
}\r
\r
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
@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
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
}\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
mStorageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver());\r
}\r
mAccount = ocAccount;\r
- updateFileDetails(false);\r
+ updateFileDetails(false, false);\r
}\r
\r
\r
* @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
\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
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