import java.util.ArrayList;\r
import java.util.List;\r
\r
-import org.apache.commons.httpclient.HostConfiguration;\r
import org.apache.commons.httpclient.HttpException;\r
-import org.apache.commons.httpclient.cookie.CookiePolicy;\r
import org.apache.commons.httpclient.methods.GetMethod;\r
import org.apache.commons.httpclient.methods.PostMethod;\r
import org.apache.commons.httpclient.methods.StringRequestEntity;\r
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;\r
-import org.apache.commons.httpclient.params.HttpMethodParams;\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.protocol.HTTP;\r
import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;\r
import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;\r
-import org.apache.jackrabbit.webdav.client.methods.MoveMethod;\r
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
import org.json.JSONException;\r
import org.json.JSONObject;\r
\r
import android.accounts.Account;\r
import android.accounts.AccountManager;\r
-import android.app.AlertDialog;\r
-import android.app.Dialog;\r
import android.content.ActivityNotFoundException;\r
import android.content.BroadcastReceiver;\r
import android.content.Context;\r
-import android.content.DialogInterface;\r
-import android.content.DialogInterface.OnDismissListener;\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
import android.content.res.Resources.NotFoundException;\r
import android.graphics.BitmapFactory;\r
import android.graphics.BitmapFactory.Options;\r
import android.graphics.Point;\r
-import android.graphics.drawable.BitmapDrawable;\r
-import android.graphics.drawable.Drawable;\r
import android.net.Uri;\r
import android.os.AsyncTask;\r
import android.os.Bundle;\r
-import android.os.Environment;\r
import android.os.Handler;\r
-import android.preference.PreferenceActivity.Header;\r
import android.support.v4.app.FragmentTransaction;\r
import android.util.Log;\r
import android.view.Display;\r
import android.webkit.MimeTypeMap;\r
import android.widget.Button;\r
import android.widget.CheckBox;\r
-import android.widget.EditText;\r
import android.widget.ImageView;\r
import android.widget.TextView;\r
import android.widget.Toast;\r
\r
if (mLayout == R.layout.file_details_fragment) {\r
mView.findViewById(R.id.fdKeepInSync).setOnClickListener(this);\r
- //mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
mView.findViewById(R.id.fdRenameBtn).setOnClickListener(this);\r
+ mView.findViewById(R.id.fdDownloadBtn).setOnClickListener(this);\r
+ mView.findViewById(R.id.fdOpenBtn).setOnClickListener(this);\r
mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this);\r
+ //mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
mPreview = (ImageView)mView.findViewById(R.id.fdPreview);\r
}\r
\r
IntentFilter filter = new IntentFilter(\r
FileDownloader.DOWNLOAD_FINISH_MESSAGE);\r
getActivity().registerReceiver(mDownloadFinishReceiver, filter);\r
+ mPreview = (ImageView)mView.findViewById(R.id.fdPreview);\r
}\r
\r
@Override\r
public void onClick(View v) {\r
switch (v.getId()) {\r
case R.id.fdDownloadBtn: {\r
- //Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
Intent i = new Intent(getActivity(), FileDownloader.class);\r
i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getRemotePath());\r
i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
- v.setEnabled(false);\r
+ \r
+ // update ui \r
+ Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
+ setButtonsForDownloading();\r
+ \r
getActivity().startService(i);\r
break;\r
}\r
mFile.setKeepInSync(cb.isChecked());\r
FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());\r
fdsm.saveFile(mFile);\r
- if (mFile.keepInSync() && !mFile.isDownloaded()) {\r
+ if (mFile.keepInSync()) {\r
onClick(getView().findViewById(R.id.fdDownloadBtn));\r
}\r
break;\r
confDialog.show(getFragmentManager(), FTAG_CONFIRMATION);\r
break;\r
}\r
+ case R.id.fdOpenBtn: {\r
+ String storagePath = mFile.getStoragePath();\r
+ String encodedStoragePath = WebdavUtils.encodePath(storagePath);\r
+ try {\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mFile.getMimetype());\r
+ i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
+ startActivity(i);\r
+ \r
+ } catch (Throwable t) {\r
+ Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype());\r
+ boolean toastIt = true; \r
+ String mimeType = "";\r
+ try {\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));\r
+ if (mimeType != null && !mimeType.equals(mFile.getMimetype())) {\r
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);\r
+ i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
+ startActivity(i);\r
+ toastIt = false;\r
+ }\r
+ \r
+ } catch (IndexOutOfBoundsException e) {\r
+ Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);\r
+ \r
+ } catch (ActivityNotFoundException e) {\r
+ Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");\r
+ \r
+ } catch (Throwable th) {\r
+ Log.e(TAG, "Unexpected problem when opening: " + storagePath, th);\r
+ \r
+ } finally {\r
+ if (toastIt) {\r
+ Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();\r
+ }\r
+ }\r
+ \r
+ }\r
+ break;\r
+ }\r
default:\r
Log.e(TAG, "Incorrect view clicked!");\r
}\r
\r
if (mFile != null && mAccount != null && mLayout == R.layout.file_details_fragment) {\r
\r
- Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
// set file details\r
setFilename(mFile.getFileName());\r
setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mFile\r
\r
CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync);\r
cb.setChecked(mFile.keepInSync());\r
- \r
- if (mFile.getStoragePath() != null) {\r
+\r
+ // configure UI for depending upon local state of the file\r
+ if (mFile.isDownloading()) {\r
+ setButtonsForDownloading();\r
+ \r
+ } else if (mFile.isDown()) {\r
// Update preview\r
if (mFile.getMimetype().startsWith("image/")) {\r
BitmapLoader bl = new BitmapLoader();\r
bl.execute(new String[]{mFile.getStoragePath()});\r
}\r
\r
+ setButtonsForDown();\r
+ \r
// Change download button to open button\r
- downloadButton.setText(R.string.filedetails_open);\r
+ /*downloadButton.setText(R.string.filedetails_open);\r
downloadButton.setOnClickListener(new OnClickListener() {\r
@Override\r
public void onClick(View v) {\r
String storagePath = mFile.getStoragePath();\r
+ String encodedStoragePath = WebdavUtils.encodePath(storagePath);\r
try {\r
Intent i = new Intent(Intent.ACTION_VIEW);\r
- i.setDataAndType(Uri.parse("file://"+ storagePath), mFile.getMimetype());\r
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mFile.getMimetype());\r
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
startActivity(i);\r
\r
Intent i = new Intent(Intent.ACTION_VIEW);\r
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));\r
if (mimeType != null && !mimeType.equals(mFile.getMimetype())) {\r
- i.setDataAndType(Uri.parse("file://"+mFile.getStoragePath()), mimeType);\r
+ i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);\r
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
startActivity(i);\r
toastIt = false;\r
\r
}\r
}\r
- });\r
+ });*/\r
} else {\r
- // Make download button effective\r
- downloadButton.setOnClickListener(this);\r
+ setButtonsForRemote();\r
}\r
}\r
}\r
}\r
\r
/**\r
+ * Enables or disables buttons for a file being downloaded\r
+ */\r
+ private void setButtonsForDownloading() {\r
+ if (!isEmpty()) {\r
+ Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
+ downloadButton.setText(R.string.filedetails_download_in_progress);\r
+ downloadButton.setEnabled(false); // TODO replace it with a 'cancel download' button\r
+ \r
+ // let's protect the user from himself ;)\r
+ ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);\r
+ ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(false);\r
+ ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(false);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Enables or disables buttons for a file locally available \r
+ */\r
+ private void setButtonsForDown() {\r
+ if (!isEmpty()) {\r
+ Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
+ downloadButton.setText(R.string.filedetails_redownload);\r
+ downloadButton.setEnabled(true);\r
+ \r
+ ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(true);\r
+ ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);\r
+ ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Enables or disables buttons for a file not locally available \r
+ */\r
+ private void setButtonsForRemote() {\r
+ if (!isEmpty()) {\r
+ Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
+ downloadButton.setText(R.string.filedetails_download);\r
+ downloadButton.setEnabled(true);\r
+ \r
+ ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);\r
+ ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);\r
+ ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);\r
+ }\r
+ }\r
+ \r
+\r
+ /**\r
* In ownCloud 3.X.X and 4.X.X there is a bug that SabreDAV does not return\r
* the time that the file was created. There is a chance that this will\r
* be fixed in future versions. Use this method to check if this version of\r
private class DownloadFinishReceiver extends BroadcastReceiver {\r
@Override\r
public void onReceive(Context context, Intent intent) {\r
- if (getView()!=null && getView().findViewById(R.id.fdDownloadBtn) != null) \r
- getView().findViewById(R.id.fdDownloadBtn).setEnabled(true);\r
- \r
- if (intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)) {\r
- mFile.setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH));\r
- updateFileDetails();\r
- } else if (intent.getAction().equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {\r
- Toast.makeText(context, R.string.downloader_download_failed , Toast.LENGTH_SHORT).show();\r
+ if (mFile != null) {\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.setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH));\r
+ }\r
+ updateFileDetails(); // it updates the buttons; must be called although !downloadWasFine\r
+ }\r
}\r
}\r
- \r
}\r
\r
// this is a temporary class for sharing purposes, it need to be replaced in transfer service\r
}\r
\r
public void onDismiss(EditNameFragment dialog) {\r
- Log.e("ASD","ondismiss");\r
if (dialog instanceof EditNameFragment) {\r
if (((EditNameFragment)dialog).getResult()) {\r
String newFilename = ((EditNameFragment)dialog).getNewFilename();\r
newFile.setMimetype(mFile.getMimetype());\r
newFile.setModificationTimestamp(mFile.getModificationTimestamp());\r
newFile.setParentId(mFile.getParentId());\r
- newFile.setStoragePath(mFile.getStoragePath());\r
+ if (mFile.isDown()) {\r
+ File f = new File(mFile.getStoragePath());\r
+ Log.e(TAG, f.getAbsolutePath());\r
+ f.renameTo(new File(f.getParent()+"/"+newFilename));\r
+ Log.e(TAG, f.getAbsolutePath());\r
+ newFile.setStoragePath(f.getAbsolutePath());\r
+ }\r
\r
new Thread(new RenameRunnable(mFile, newFile, mAccount, new Handler())).start();\r
\r
}\r
}\r
} else {\r
- Log.e(TAG, "Unknown dialog intance passed to onDismissDalog: " + dialog.getClass().getCanonicalName());\r
+ Log.e(TAG, "Unknown dialog instance passed to onDismissDalog: " + dialog.getClass().getCanonicalName());\r
}\r
\r
}\r
String baseUrl = am.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL);\r
OwnCloudVersion ocv = new OwnCloudVersion(am.getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));\r
String webdav_path = AccountUtils.getWebdavPath(ocv);\r
- Log.d("ASD", ""+baseUrl + webdav_path + WebdavUtils.encode(mOld.getRemotePath()));\r
+ Log.d("ASD", ""+baseUrl + webdav_path + WebdavUtils.encodePath(mOld.getRemotePath()));\r
\r
- Log.e("ASD", Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + WebdavUtils.encode(mNew.getRemotePath()));\r
- LocalMoveMethod move = new LocalMoveMethod(baseUrl + webdav_path + WebdavUtils.encode(mOld.getRemotePath()),\r
- Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + WebdavUtils.encode(mNew.getRemotePath()));\r
+ Log.e("ASD", Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + WebdavUtils.encodePath(mNew.getRemotePath()));\r
+ LocalMoveMethod move = new LocalMoveMethod(baseUrl + webdav_path + WebdavUtils.encodePath(mOld.getRemotePath()),\r
+ Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + WebdavUtils.encodePath(mNew.getRemotePath()));\r
\r
try {\r
int status = wc.executeMethod(move);\r
\r
}\r
\r
- \r
private class RemoveRunnable implements Runnable {\r
\r
+ /** Arbitrary timeout for deletion */\r
+ public final static int DELETION_TIMEOUT = 5000;\r
+ \r
Account mAccount;\r
OCFile mFileToRemove;\r
Handler mHandler;\r
String baseUrl = am.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL);\r
OwnCloudVersion ocv = new OwnCloudVersion(am.getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));\r
String webdav_path = AccountUtils.getWebdavPath(ocv);\r
- Log.d("ASD", ""+baseUrl + webdav_path + WebdavUtils.encode(mFileToRemove.getRemotePath()));\r
+ Log.d("ASD", ""+baseUrl + webdav_path + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));\r
\r
- DeleteMethod delete = new DeleteMethod(baseUrl + webdav_path + WebdavUtils.encode(mFileToRemove.getRemotePath()));\r
- HttpMethodParams params = delete.getParams();\r
- params.setSoTimeout(1000);\r
- delete.setParams(params);\r
+ DeleteMethod delete = new DeleteMethod(baseUrl + webdav_path + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));\r
\r
boolean success = false;\r
try {\r
- int status = wc.executeMethod(delete);\r
+ int status = wc.executeMethod(delete, DELETION_TIMEOUT);\r
if (delete.succeeded()) {\r
FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
fdsm.removeFile(mFileToRemove);\r
}\r
@Override\r
protected void onPostExecute(Bitmap result) {\r
- if (result != null) {\r
+ if (result != null && mPreview != null) {\r
mPreview.setImageBitmap(result);\r
}\r
}\r