Tablet fixes. Goal is to get tapping on a file to display its details.
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / ui / fragment / FileDetailFragment.java
index f667204..90f1175 100644 (file)
  */\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
@@ -41,134 +39,189 @@ import com.actionbarsherlock.app.SherlockFragment;
 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