*/\r
package eu.alefzero.owncloud.ui.fragment;\r
\r
-import android.accounts.Account;\r
+import android.app.FragmentTransaction;\r
import android.content.BroadcastReceiver;\r
import android.content.Context;\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
-import android.database.Cursor;\r
import android.graphics.Bitmap;\r
import android.graphics.BitmapFactory;\r
-import android.net.Uri;\r
import android.os.Bundle;\r
import android.view.LayoutInflater;\r
import android.view.View;\r
import eu.alefzero.owncloud.DisplayUtils;\r
import eu.alefzero.owncloud.FileDownloader;\r
import eu.alefzero.owncloud.R;\r
-import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\r
+import eu.alefzero.owncloud.datamodel.OCFile;\r
\r
/**\r
* This Fragment is used to display the details about a file.\r
+ * \r
* @author Bartek Przybylski\r
- *\r
+ * \r
*/\r
-public class FileDetailFragment extends SherlockFragment implements OnClickListener {\r
- \r
- private Intent mIntent;\r
- private View mView;\r
- private DownloadFinishReceiver dfr;\r
- \r
- @Override\r
- public void onResume() {\r
- super.onResume();\r
- dfr = new DownloadFinishReceiver();\r
- IntentFilter filter = new IntentFilter(FileDownloader.DOWNLOAD_FINISH_MESSAGE);\r
- getActivity().registerReceiver(dfr, filter);\r
- }\r
- \r
- @Override\r
- public void onPause() {\r
- super.onPause();\r
- getActivity().unregisterReceiver(dfr);\r
- dfr = null;\r
- }\r
- \r
- public void setStuff(Intent intent) {\r
- mIntent = intent;\r
- setStuff(getView());\r
- }\r
- \r
- private void setStuff(View view) {\r
- mView = view;\r
- String id = mIntent.getStringExtra("FILE_ID");\r
- Account account = mIntent.getParcelableExtra("ACCOUNT");\r
- String account_name = account.name;\r
- Cursor c = getActivity().managedQuery(\r
- Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, id),\r
- null,\r
- ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?",\r
- new String[]{account_name},\r
- null);\r
- c.moveToFirst();\r
-\r
- // Retrieve details from DB\r
- String filename = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_NAME));\r
- String mimetype = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE));\r
- String path = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH));\r
- long filesize = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH));\r
-\r
- // set file details\r
- setFilename(filename);\r
- setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mimetype));\r
- setFilesize(filesize);\r
- \r
- // set file preview if available and possible\r
- View w = view.findViewById(R.id.videoView1);\r
- w.setVisibility(View.INVISIBLE);\r
- if (path == null) {\r
- ImageView v = (ImageView) getView().findViewById(R.id.imageView2);\r
- v.setImageResource(R.drawable.download);\r
- v.setOnClickListener(this);\r
- } else {\r
- if (mimetype.startsWith("image/")) {\r
- ImageView v = (ImageView) view.findViewById(R.id.imageView2);\r
- Bitmap bmp = BitmapFactory.decodeFile(path);\r
- v.setImageBitmap(bmp);\r
- } else if (mimetype.startsWith("video/")) {\r
- VideoView v = (VideoView) view.findViewById(R.id.videoView1);\r
- v.setVisibility(View.VISIBLE);\r
- v.setVideoPath(path);\r
- v.start();\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
- Bundle savedInstanceState) {\r
- View v = null;\r
- \r
- if (getActivity().getIntent() != null && getActivity().getIntent().getStringExtra("FILE_ID") != null) {\r
- v = inflater.inflate(R.layout.file_details_fragment, container, false);\r
- mIntent = getActivity().getIntent();\r
- setStuff(v);\r
- } else {\r
- v = inflater.inflate(R.layout.file_details_empty, container, false);\r
- }\r
- return v;\r
- }\r
-\r
- @Override\r
- public View getView() {\r
- return mView == null ? super.getView() : mView;\r
- };\r
- \r
- public void setFilename(String filename) {\r
- TextView tv = (TextView) getView().findViewById(R.id.textView1);\r
- if (tv != null) tv.setText(filename);\r
- }\r
- \r
- public void setFiletype(String mimetype) {\r
- TextView tv = (TextView) getView().findViewById(R.id.textView2);\r
- if (tv != null) tv.setText(mimetype);\r
- }\r
- \r
- public void setFilesize(long filesize) {\r
- TextView tv = (TextView) getView().findViewById(R.id.textView3);\r
- if (tv != null) tv.setText(DisplayUtils.bitsToHumanReadable(filesize));\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, mIntent.getParcelableExtra("ACCOUNT"));\r
- i.putExtra(FileDownloader.EXTRA_FILE_PATH, mIntent.getStringExtra("FULL_PATH"));\r
- getActivity().startService(i);\r
- }\r
- \r
- private class DownloadFinishReceiver extends BroadcastReceiver {\r
- @Override\r
- public void onReceive(Context context, Intent intent) {\r
- setStuff(getView());\r
- }\r
- \r
- }\r
- \r
+public class FileDetailFragment extends SherlockFragment implements\r
+ OnClickListener {\r
+\r
+ public static final String FILE = "FILE";\r
+\r
+ private Intent mIntent;\r
+ private View mView;\r
+ private DownloadFinishReceiver mDownloadFinishReceiver;\r
+ private OCFile mFile;\r
+\r
+ private int mLayout;\r
+ private boolean mEmptyLayout;\r
+\r
+ /**\r
+ * Default constructor. When inflated by android -> display empty layout\r
+ */\r
+ public FileDetailFragment() {\r
+ mLayout = R.layout.file_details_empty;\r
+ mEmptyLayout = true;\r
+ }\r
+\r
+ /**\r
+ * Custom construtor. Use with a {@link FragmentTransaction}.\r
+ * The intent has to contain {@link FileDetailFragment#FILE} with an OCFile\r
+ * and also {@link FileDownloader#EXTRA_ACCOUNT} with the account.\r
+ * \r
+ * @param nonEmptyFragment\r
+ * True, to enable file detail rendering\r
+ */\r
+ public FileDetailFragment(Intent intent) {\r
+ mLayout = R.layout.file_details_fragment;\r
+ mIntent = intent;\r
+ mEmptyLayout = false;\r
+ }\r
+\r
+ @Override\r
+ public void onResume() {\r
+ super.onResume();\r
+ mDownloadFinishReceiver = new DownloadFinishReceiver();\r
+ IntentFilter filter = new IntentFilter(\r
+ FileDownloader.DOWNLOAD_FINISH_MESSAGE);\r
+ getActivity().registerReceiver(mDownloadFinishReceiver, filter);\r
+ }\r
+\r
+ @Override\r
+ public void onPause() {\r
+ super.onPause();\r
+ getActivity().unregisterReceiver(mDownloadFinishReceiver);\r
+ mDownloadFinishReceiver = null;\r
+ }\r
+\r
+ /**\r
+ * Use this method to signal this Activity that it shall update its view.\r
+ * \r
+ * @param intent\r
+ * The {@link Intent} that contains extra information about this\r
+ * file The intent needs to have these extras:\r
+ * <p>\r
+ * \r
+ * {@link FileDetailFragment#FILE}: An {@link OCFile}\r
+ * {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file\r
+ * belongs to (required for downloading)\r
+ */\r
+ public void updateFileDetails(Intent intent) {\r
+ mIntent = intent;\r
+ updateFileDetails();\r
+ }\r
+\r
+ private void updateFileDetails() {\r
+ mFile = mIntent.getParcelableExtra(FILE);\r
+\r
+ if (mFile != null) {\r
+ // set file details\r
+ setFilename(mFile.getFileName());\r
+ setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mFile\r
+ .getMimetype()));\r
+ setFilesize(mFile.getFileLength());\r
+\r
+ // set file preview if available and possible\r
+ VideoView videoView = (VideoView) mView\r
+ .findViewById(R.id.videoView1);\r
+ videoView.setVisibility(View.INVISIBLE);\r
+ if (mFile.getPath() == null) {\r
+ ImageView imageView = (ImageView) getView().findViewById(\r
+ R.id.imageView2);\r
+ imageView.setImageResource(R.drawable.download);\r
+ imageView.setOnClickListener(this);\r
+ } else {\r
+ if (mFile.getMimetype().startsWith("image/")) {\r
+ ImageView imageView = (ImageView) mView\r
+ .findViewById(R.id.imageView2);\r
+ Bitmap bmp = BitmapFactory.decodeFile(mFile.getPath());\r
+ imageView.setImageBitmap(bmp);\r
+ } else if (mFile.getMimetype().startsWith("video/")) {\r
+ videoView.setVisibility(View.VISIBLE);\r
+ videoView.setVideoPath(mFile.getPath());\r
+ videoView.start();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+ Bundle savedInstanceState) {\r
+ View view = null;\r
+\r
+ view = inflater.inflate(mLayout, container, false);\r
+ mIntent = getActivity().getIntent();\r
+ mView = view;\r
+\r
+ // make sure we are not using the empty layout\r
+ if (mEmptyLayout == false) {\r
+ updateFileDetails();\r
+ }\r
+\r
+ return view;\r
+ }\r
+\r
+ @Override\r
+ public View getView() {\r
+ return mView == null ? super.getView() : mView;\r
+ };\r
+\r
+ private void setFilename(String filename) {\r
+ TextView tv = (TextView) getView().findViewById(R.id.textView1);\r
+ if (tv != null)\r
+ tv.setText(filename);\r
+ }\r
+\r
+ private void setFiletype(String mimetype) {\r
+ TextView tv = (TextView) getView().findViewById(R.id.textView2);\r
+ if (tv != null)\r
+ tv.setText(mimetype);\r
+ }\r
+\r
+ private void setFilesize(long filesize) {\r
+ TextView tv = (TextView) getView().findViewById(R.id.textView3);\r
+ if (tv != null)\r
+ tv.setText(DisplayUtils.bitsToHumanReadable(filesize));\r
+ }\r
+\r
+ /**\r
+ * Use this to check if the correct layout is loaded. When android\r
+ * instanciates this class using the default constructor, the layout will be\r
+ * empty.\r
+ * \r
+ * Once a user touches a file for the first time, you must instanciate a new\r
+ * Fragment with the new FileDetailFragment(true) to inflate the actual\r
+ * details\r
+ * \r
+ * @return If the layout is empty, this method will return true, otherwise\r
+ * false\r
+ */\r
+ public boolean isEmptyLayout() {\r
+ return mEmptyLayout;\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,\r
+ mIntent.getStringExtra(FileDownloader.EXTRA_FILE_PATH));\r
+ getActivity().startService(i);\r
+ }\r
+\r
+ private class DownloadFinishReceiver extends BroadcastReceiver {\r
+ @Override\r
+ public void onReceive(Context context, Intent intent) {\r
+ updateFileDetails();\r
+ }\r
+\r
+ }\r
+\r
}\r