1 /* ownCloud Android client application 
   2  *   Copyright (C) 2011  Bartek Przybylski 
   4  *   This program is free software: you can redistribute it and/or modify 
   5  *   it under the terms of the GNU General Public License as published by 
   6  *   the Free Software Foundation, either version 3 of the License, or 
   7  *   (at your option) any later version. 
   9  *   This program is distributed in the hope that it will be useful, 
  10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
  11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  12  *   GNU General Public License for more details. 
  14  *   You should have received a copy of the GNU General Public License 
  15  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
  18 package eu
.alefzero
.owncloud
.ui
.fragment
; 
  20 import android
.app
.FragmentTransaction
; 
  21 import android
.content
.BroadcastReceiver
; 
  22 import android
.content
.Context
; 
  23 import android
.content
.Intent
; 
  24 import android
.content
.IntentFilter
; 
  25 import android
.graphics
.Bitmap
; 
  26 import android
.graphics
.BitmapFactory
; 
  27 import android
.os
.Bundle
; 
  28 import android
.view
.LayoutInflater
; 
  29 import android
.view
.View
; 
  30 import android
.view
.View
.OnClickListener
; 
  31 import android
.view
.ViewGroup
; 
  32 import android
.widget
.ImageView
; 
  33 import android
.widget
.TextView
; 
  34 import android
.widget
.Toast
; 
  35 import android
.widget
.VideoView
; 
  37 import com
.actionbarsherlock
.app
.SherlockFragment
; 
  39 import eu
.alefzero
.owncloud
.DisplayUtils
; 
  40 import eu
.alefzero
.owncloud
.FileDownloader
; 
  41 import eu
.alefzero
.owncloud
.R
; 
  42 import eu
.alefzero
.owncloud
.datamodel
.OCFile
; 
  45  * This Fragment is used to display the details about a file. 
  47  * @author Bartek Przybylski 
  50 public class FileDetailFragment 
extends SherlockFragment 
implements 
  53     public static final String FILE 
= "FILE"; 
  55     private Intent mIntent
; 
  57     private DownloadFinishReceiver mDownloadFinishReceiver
; 
  61     private boolean mEmptyLayout
; 
  64      * Default constructor. When inflated by android -> display empty layout 
  66     public FileDetailFragment() { 
  67         mLayout 
= R
.layout
.file_details_empty
; 
  72      * Custom construtor. Use with a {@link FragmentTransaction}. The intent has 
  73      * to contain {@link FileDetailFragment#FILE} with an OCFile and also 
  74      * {@link FileDownloader#EXTRA_ACCOUNT} with the account. 
  76      * @param nonEmptyFragment 
  77      *            True, to enable file detail rendering 
  79     public FileDetailFragment(Intent intent
) { 
  80         mLayout 
= R
.layout
.file_details_fragment
; 
  86     public void onResume() { 
  88         mDownloadFinishReceiver 
= new DownloadFinishReceiver(); 
  89         IntentFilter filter 
= new IntentFilter( 
  90                 FileDownloader
.DOWNLOAD_FINISH_MESSAGE
); 
  91         getActivity().registerReceiver(mDownloadFinishReceiver
, filter
); 
  95     public void onPause() { 
  97         getActivity().unregisterReceiver(mDownloadFinishReceiver
); 
  98         mDownloadFinishReceiver 
= null
; 
 102      * Use this method to signal this Activity that it shall update its view. 
 105      *            The {@link Intent} that contains extra information about this 
 106      *            file The intent needs to have these extras: 
 109      *            {@link FileDetailFragment#FILE}: An {@link OCFile} 
 110      *            {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file 
 111      *            belongs to (required for downloading) 
 113     public void updateFileDetails(Intent intent
) { 
 118     private void updateFileDetails() { 
 119         mFile 
= mIntent
.getParcelableExtra(FILE
); 
 123             setFilename(mFile
.getFileName()); 
 124             setFiletype(DisplayUtils
.convertMIMEtoPrettyPrint(mFile
 
 126             setFilesize(mFile
.getFileLength()); 
 128             // set file preview if available and possible 
 129             VideoView videoView 
= (VideoView
) mView
 
 130                     .findViewById(R
.id
.videoView1
); 
 131             videoView
.setVisibility(View
.INVISIBLE
); 
 132             if (mFile
.getPath() == null
) { 
 133                 ImageView imageView 
= (ImageView
) getView().findViewById( 
 135                 imageView
.setImageResource(R
.drawable
.download
); 
 136                 imageView
.setOnClickListener(this); 
 138                 if (mFile
.getMimetype().startsWith("image/")) { 
 139                     ImageView imageView 
= (ImageView
) mView
 
 140                             .findViewById(R
.id
.imageView2
); 
 141                     Bitmap bmp 
= BitmapFactory
.decodeFile(mFile
.getPath()); 
 142                     imageView
.setImageBitmap(bmp
); 
 143                 } else if (mFile
.getMimetype().startsWith("video/")) { 
 144                     videoView
.setVisibility(View
.VISIBLE
); 
 145                     videoView
.setVideoPath(mFile
.getPath()); 
 153     public View 
onCreateView(LayoutInflater inflater
, ViewGroup container
, 
 154             Bundle savedInstanceState
) { 
 157         view 
= inflater
.inflate(mLayout
, container
, false
); 
 158         mIntent 
= getActivity().getIntent(); 
 161         // make sure we are not using the empty layout 
 162         if (mEmptyLayout 
== false
) { 
 170     public View 
getView() { 
 171         return mView 
== null ? 
super.getView() : mView
; 
 174     private void setFilename(String filename
) { 
 175         TextView tv 
= (TextView
) getView().findViewById(R
.id
.textView1
); 
 177             tv
.setText(filename
); 
 180     private void setFiletype(String mimetype
) { 
 181         TextView tv 
= (TextView
) getView().findViewById(R
.id
.textView2
); 
 183             tv
.setText(mimetype
); 
 186     private void setFilesize(long filesize
) { 
 187         TextView tv 
= (TextView
) getView().findViewById(R
.id
.textView3
); 
 189             tv
.setText(DisplayUtils
.bitsToHumanReadable(filesize
)); 
 193      * Use this to check if the correct layout is loaded. When android 
 194      * instanciates this class using the default constructor, the layout will be 
 197      * Once a user touches a file for the first time, you must instanciate a new 
 198      * Fragment with the new FileDetailFragment(true) to inflate the actual 
 201      * @return If the layout is empty, this method will return true, otherwise 
 204     public boolean isEmptyLayout() { 
 209     public void onClick(View v
) { 
 210         Toast
.makeText(getActivity(), "Downloading", Toast
.LENGTH_LONG
).show(); 
 211         Intent i 
= new Intent(getActivity(), FileDownloader
.class); 
 212         i
.putExtra(FileDownloader
.EXTRA_ACCOUNT
, 
 213                 mIntent
.getParcelableExtra(FileDownloader
.EXTRA_ACCOUNT
)); 
 214         i
.putExtra(FileDownloader
.EXTRA_FILE_PATH
, 
 215                 mIntent
.getStringExtra(FileDownloader
.EXTRA_FILE_PATH
)); 
 216         getActivity().startService(i
); 
 219     private class DownloadFinishReceiver 
extends BroadcastReceiver 
{ 
 221         public void onReceive(Context context
, Intent intent
) {