*/\r
package eu.alefzero.owncloud.ui.fragment;\r
\r
+import android.accounts.Account;\r
+import android.accounts.AccountManager;\r
import android.content.BroadcastReceiver;\r
import android.content.Context;\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
import android.graphics.Bitmap;\r
import android.graphics.BitmapFactory;\r
+import android.net.Uri;\r
import android.os.Bundle;\r
+import android.util.Log;\r
import android.view.LayoutInflater;\r
import android.view.View;\r
import android.view.View.OnClickListener;\r
import eu.alefzero.owncloud.DisplayUtils;\r
import eu.alefzero.owncloud.FileDownloader;\r
import eu.alefzero.owncloud.R;\r
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
import eu.alefzero.owncloud.datamodel.OCFile;\r
+import eu.alefzero.owncloud.utils.OwnCloudVersion;\r
\r
/**\r
* This Fragment is used to display the details about a file.\r
public class FileDetailFragment extends SherlockFragment implements\r
OnClickListener {\r
\r
- public static final String FILE = "FILE";\r
+ public static final String EXTRA_FILE = "FILE";\r
\r
private DownloadFinishReceiver mDownloadFinishReceiver;\r
private Intent mIntent;\r
private int mLayout;\r
private View mView;\r
private OCFile mFile;\r
+ private static final String TAG = "FileDetailFragment";\r
\r
/**\r
* Default constructor - contains real layout\r
mDownloadFinishReceiver = null;\r
}\r
\r
+ @Override\r
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+ Bundle savedInstanceState) {\r
+ View view = null;\r
+ view = inflater.inflate(mLayout, container, false);\r
+ mView = view;\r
+ if(mLayout == R.layout.file_details_fragment){\r
+ // Phones will launch an activity with this intent\r
+ if(mIntent == null){\r
+ mIntent = getActivity().getIntent();\r
+ }\r
+ updateFileDetails();\r
+ }\r
+ \r
+ return view;\r
+ }\r
+\r
+ @Override\r
+ public View getView() {\r
+ return super.getView() == null ? mView : super.getView();\r
+ }\r
+\r
+ @Override\r
+ public void onClick(View v) {\r
+ Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
+ Intent i = new Intent(getActivity(), FileDownloader.class);\r
+ i.putExtra(FileDownloader.EXTRA_ACCOUNT,\r
+ mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT));\r
+ i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getRemotePath());\r
+ getActivity().startService(i);\r
+ }\r
+\r
+ /**\r
+ * Can be used to get the file that is currently being displayed.\r
+ * @return The file on the screen.\r
+ */\r
+ public OCFile getDisplayedFile(){\r
+ return mFile;\r
+ }\r
+ \r
/**\r
* Use this method to signal this Activity that it shall update its view.\r
* \r
* this file The intent needs to have these extras:\r
* <p>\r
* \r
- * {@link FileDetailFragment#FILE}: An {@link OCFile}\r
+ * {@link FileDetailFragment#EXTRA_FILE}: An {@link OCFile}\r
* {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file\r
* belongs to (required for downloading)\r
*/\r
updateFileDetails();\r
}\r
\r
+ /**\r
+ * Updates the view with all relevant details about that file.\r
+ */\r
private void updateFileDetails() {\r
- mFile = mIntent.getParcelableExtra(FILE);\r
+ mFile = mIntent.getParcelableExtra(EXTRA_FILE);\r
+ Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
\r
if (mFile != null) {\r
// set file details\r
setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mFile\r
.getMimetype()));\r
setFilesize(mFile.getFileLength());\r
+ if(ocVersionSupportsTimeCreated()){\r
+ setTimeCreated(mFile.getCreationTimestamp());\r
+ }\r
+ \r
+ setTimeModified(mFile.getModificationTimestamp());\r
\r
// Update preview\r
if (mFile.getStoragePath() != null) {\r
- if (mFile.getMimetype().startsWith("image/")) {\r
- ImageView preview = (ImageView) getView().findViewById(\r
- R.id.fdPreview);\r
- Bitmap bmp = BitmapFactory.decodeFile(mFile.getStoragePath());\r
- preview.setImageBitmap(bmp);\r
+ try {\r
+ if (mFile.getMimetype().startsWith("image/")) {\r
+ ImageView preview = (ImageView) getView().findViewById(\r
+ R.id.fdPreview);\r
+ Bitmap bmp = BitmapFactory.decodeFile(mFile.getStoragePath());\r
+ preview.setImageBitmap(bmp);\r
+ }\r
+ } catch (OutOfMemoryError e) {\r
+ Log.e(TAG, "Out of memory occured for file with size " + mFile.getFileLength());\r
}\r
+ downloadButton.setText(R.string.filedetails_open);\r
+ downloadButton.setOnClickListener(new OnClickListener() {\r
+ @Override\r
+ public void onClick(View v) {\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ i.setDataAndType(Uri.parse("file://"+mFile.getStoragePath()), mFile.getMimetype());\r
+ startActivity(i);\r
+ }\r
+ });\r
+ } else {\r
+ // Make download button effective\r
+ downloadButton.setOnClickListener(this);\r
}\r
- \r
- // Make download button effective\r
- Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
- downloadButton.setOnClickListener(this);\r
}\r
}\r
\r
+ /**\r
+ * Updates the filename in view\r
+ * @param filename to set\r
+ */\r
private void setFilename(String filename) {\r
TextView tv = (TextView) getView().findViewById(R.id.fdFilename);\r
if (tv != null)\r
tv.setText(filename);\r
}\r
\r
+ /**\r
+ * Updates the MIME type in view\r
+ * @param mimetype to set\r
+ */\r
private void setFiletype(String mimetype) {\r
TextView tv = (TextView) getView().findViewById(R.id.fdType);\r
if (tv != null)\r
tv.setText(mimetype);\r
}\r
\r
+ /**\r
+ * Updates the file size in view\r
+ * @param filesize in bytes to set\r
+ */\r
private void setFilesize(long filesize) {\r
TextView tv = (TextView) getView().findViewById(R.id.fdSize);\r
if (tv != null)\r
- tv.setText(DisplayUtils.bitsToHumanReadable(filesize));\r
+ tv.setText(DisplayUtils.bytesToHumanReadable(filesize));\r
}\r
-\r
- @Override\r
- public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
- Bundle savedInstanceState) {\r
- View view = null;\r
- view = inflater.inflate(mLayout, container, false);\r
- mView = view;\r
- if(mLayout == R.layout.file_details_fragment){\r
- // Phones will launch an activity with this intent\r
- if(mIntent == null){\r
- mIntent = getActivity().getIntent();\r
- }\r
- updateFileDetails();\r
+ \r
+ /**\r
+ * Updates the time that the file was created in view\r
+ * @param milliseconds Unix time to set\r
+ */\r
+ private void setTimeCreated(long milliseconds){\r
+ TextView tv = (TextView) getView().findViewById(R.id.fdCreated);\r
+ TextView tvLabel = (TextView) getView().findViewById(R.id.fdCreatedLabel);\r
+ if(tv != null){\r
+ tv.setText(DisplayUtils.unixTimeToHumanReadable(milliseconds));\r
+ tv.setVisibility(View.VISIBLE);\r
+ tvLabel.setVisibility(View.VISIBLE);\r
}\r
- \r
- return view;\r
}\r
\r
- \r
-\r
- @Override\r
- public View getView() {\r
- return super.getView() == null ? mView : super.getView();\r
+ /**\r
+ * Updates the time that the file was last modified\r
+ * @param milliseconds Unix time to set\r
+ */\r
+ private void setTimeModified(long milliseconds){\r
+ TextView tv = (TextView) getView().findViewById(R.id.fdModified);\r
+ if(tv != null){\r
+ tv.setText(DisplayUtils.unixTimeToHumanReadable(milliseconds));\r
+ }\r
}\r
-\r
- @Override\r
- public void onClick(View v) {\r
- Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
- Intent i = new Intent(getActivity(), FileDownloader.class);\r
- i.putExtra(FileDownloader.EXTRA_ACCOUNT,\r
- mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT));\r
- i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getPath());\r
- getActivity().startService(i);\r
+ \r
+ /**\r
+ * In ownCloud 3.0.3 and 4.0.0 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
+ * ownCloud has this fix.\r
+ * @return True, if ownCloud the ownCloud version is > 3.0.4 and 4.0.1\r
+ */\r
+ private boolean ocVersionSupportsTimeCreated(){\r
+ if(mIntent != null){\r
+ Account ocAccount = mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT);\r
+ if(ocAccount != null){\r
+ AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);\r
+ OwnCloudVersion ocVersion = new OwnCloudVersion(accManager\r
+ .getUserData(ocAccount, AccountAuthenticator.KEY_OC_VERSION));\r
+ if(ocVersion.compareTo(new OwnCloudVersion(0x030004)) >= 0 || ocVersion.compareTo(new OwnCloudVersion(0x040001)) >= 0){\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ return false;\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