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
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
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
\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
newFile.setMimetype(mFile.getMimetype());\r
newFile.setModificationTimestamp(mFile.getModificationTimestamp());\r
newFile.setParentId(mFile.getParentId());\r
- if (mFile.isDownloaded()) {\r
+ if (mFile.isDown()) {\r
File f = new File(mFile.getStoragePath());\r
- Log.e(TAG, f.getAbsolutePath()+"");\r
+ Log.e(TAG, f.getAbsolutePath());\r
f.renameTo(new File(f.getParent()+"/"+newFilename));\r
- Log.e(TAG, f.getAbsolutePath()+"");\r
+ Log.e(TAG, f.getAbsolutePath());\r
newFile.setStoragePath(f.getAbsolutePath());\r
}\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