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 java
.util
.Stack
; 
  21 import java
.util
.Vector
; 
  23 import android
.accounts
.Account
; 
  24 import android
.content
.ClipData
; 
  25 import android
.content
.ClipDescription
; 
  26 import android
.content
.Intent
; 
  27 import android
.os
.Bundle
; 
  28 import android
.support
.v4
.app
.FragmentTransaction
; 
  29 import android
.util
.Log
; 
  30 import android
.view
.View
; 
  31 import android
.widget
.AdapterView
; 
  32 import android
.widget
.Toast
; 
  33 import eu
.alefzero
.owncloud
.AccountUtils
; 
  34 import eu
.alefzero
.owncloud
.FileDownloader
; 
  35 import eu
.alefzero
.owncloud
.R
; 
  36 import eu
.alefzero
.owncloud
.datamodel
.DataStorageManager
; 
  37 import eu
.alefzero
.owncloud
.datamodel
.FileDataStorageManager
; 
  38 import eu
.alefzero
.owncloud
.datamodel
.OCFile
; 
  39 import eu
.alefzero
.owncloud
.ui
.FragmentListView
; 
  40 import eu
.alefzero
.owncloud
.ui
.activity
.FileDetailActivity
; 
  41 import eu
.alefzero
.owncloud
.ui
.activity
.FileDisplayActivity
; 
  42 import eu
.alefzero
.owncloud
.ui
.adapter
.FileListListAdapter
; 
  45  * A Fragment that lists all files and folders in a given path. 
  47  * @author Bartek Przybylski 
  50 public class FileListFragment 
extends FragmentListView 
{ 
  51     private Account mAccount
; 
  52     private Stack
<String
> mDirNames
; 
  53     private Vector
<OCFile
> mFiles
; 
  54     private DataStorageManager mStorageManager
; 
  55     private boolean mIsLargeDevice 
= false
; 
  57     public FileListFragment() { 
  58         mDirNames 
= new Stack
<String
>(); 
  62     public void onCreate(Bundle savedInstanceState
) { 
  63         super.onCreate(savedInstanceState
); 
  65         mAccount 
= AccountUtils
.getCurrentOwnCloudAccount(getActivity()); 
  66         getListView().setDivider(getResources().getDrawable(R
.drawable
.uploader_list_separator
)); 
  67         getListView().setDividerHeight(1); 
  73     public void onStart() { 
  75         // Create a placeholder upon launch 
  76         View fragmentContainer 
= getActivity().findViewById(R
.id
.file_details_container
); 
  77         if (fragmentContainer 
!= null
) { 
  78             mIsLargeDevice 
= true
; 
  79             FragmentTransaction transaction 
= getFragmentManager().beginTransaction(); 
  80             transaction
.replace(R
.id
.file_details_container
, new FileDetailFragment(true
)); 
  87     public void onItemClick(AdapterView
<?
> l
, View v
, int position
, long id
) { 
  88         if (mFiles
.size() <= position
) { 
  89             throw new IndexOutOfBoundsException("Incorrect item selected"); 
  91         OCFile file 
= mFiles
.get(position
); 
  93         // Update ActionBarPath 
  94         if (file
.getMimetype().equals("DIR")) { 
  95             String dirname 
= file
.getFileName(); 
  97             mDirNames
.push(dirname
); 
  98             ((FileDisplayActivity
) getActivity()).pushPath(dirname
); 
 106         Intent showDetailsIntent 
= new Intent(getActivity(), FileDetailActivity
.class); 
 107         showDetailsIntent
.putExtra(FileDetailFragment
.FILE
, file
); 
 108         showDetailsIntent
.putExtra(FileDownloader
.EXTRA_ACCOUNT
, mAccount
); 
 110         // If we are on a large device -> update fragment 
 111         if (mIsLargeDevice
) { 
 112             FileDetailFragment fileDetails 
= (FileDetailFragment
) getFragmentManager().findFragmentByTag("FileDetails"); 
 113             if (fileDetails 
== null
) { 
 114                 FragmentTransaction transaction 
= getFragmentManager().beginTransaction(); 
 115                 transaction
.replace(R
.id
.file_details_container
, new FileDetailFragment(showDetailsIntent
), "FileDetails"); 
 116                 transaction
.setTransition(FragmentTransaction
.TRANSIT_FRAGMENT_FADE
); 
 117                 transaction
.commit(); 
 119                 fileDetails
.updateFileDetails(showDetailsIntent
); 
 122             startActivity(showDetailsIntent
); 
 127      * Resets the FileDetailsFragment on Tablets so that it always displays 
 128      * "Tab on a file to display it's details" 
 130     private void resetFileFragment() { 
 131         FileDetailFragment fileDetails 
= (FileDetailFragment
) getFragmentManager().findFragmentByTag("FileDetails"); 
 132         if (fileDetails 
!= null
) { 
 133             FragmentTransaction transaction 
= getFragmentManager().beginTransaction(); 
 134             transaction
.remove(fileDetails
); 
 135             transaction
.add(R
.id
.file_details_container
, new FileDetailFragment(true
)); 
 136             transaction
.commit(); 
 141     public boolean onItemLongClick(AdapterView
<?
> arg0
, View arg1
, int arg2
, long arg3
) { 
 142         ClipData
.Item item 
= new ClipData
.Item("ASD"); 
 143         ClipDescription cd 
= new ClipDescription("ASD", new String
[] { ClipDescription
.MIMETYPE_TEXT_PLAIN 
}); 
 144         ClipData dragData 
= new ClipData(cd
, item
); 
 145         arg1
.startDrag(dragData
, new View
.DragShadowBuilder(arg0
.getChildAt(arg2
)), null
, 0); 
 150      * Call this, when the user presses the up button 
 152     public void onNavigateUp() { 
 159      * Lists the directory 
 161     public void populateFileList() { 
 163         for (String a 
: mDirNames
) 
 167         mStorageManager 
= new FileDataStorageManager(mAccount
, getActivity().getContentResolver()); 
 168         OCFile file 
= mStorageManager
.getFileByPath(s
); 
 169         mFiles 
= mStorageManager
.getDirectoryContent(file
); 
 170         if (mFiles 
== null 
|| mFiles
.size() == 0) { 
 171             Toast
.makeText(getActivity(), "There are no files here", Toast
.LENGTH_LONG
).show(); 
 173         setListAdapter(new FileListListAdapter(file
, mStorageManager
, getActivity())); 
 177     public void onSaveInstanceState(Bundle outState
) { 
 178         super.onSaveInstanceState(outState
); 
 179         outState
.putParcelable("ACCOUNT", mAccount
); 
 182     // TODO: Delete this testing stuff. 
 184      * private void addContact(Account account, String name, String username) { 
 185      * Log.i("ASD", "Adding contact: " + name); 
 186      * ArrayList<ContentProviderOperation> operationList = new 
 187      * ArrayList<ContentProviderOperation>(); 
 189      * //Create our RawContact ContentProviderOperation.Builder builder = 
 190      * ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); 
 191      * builder.withValue(RawContacts.ACCOUNT_NAME, account.name); 
 192      * builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); 
 193      * builder.withValue(RawContacts.SYNC1, username); 
 194      * operationList.add(builder.build()); 
 196      * //Create a Data record of common type 'StructuredName' for our RawContact 
 198      * ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
 200      * .withValueBackReference(ContactsContract.CommonDataKinds.StructuredName 
 201      * .RAW_CONTACT_ID, 0); builder.withValue(ContactsContract.Data.MIMETYPE, 
 202      * ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
 204      * .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 
 205      * name); operationList.add(builder.build()); 
 207      * //Create a Data record of custom type 
 208      * "vnd.android.cursor.item/vnd.fm.last.android.profile" to display a link 
 209      * to the Last.fm profile builder = 
 210      * ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
 211      * builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); 
 212      * builder.withValue(ContactsContract.Data.MIMETYPE, 
 213      * "vnd.android.cursor.item/vnd.owncloud.contact.profile"); 
 214      * builder.withValue(ContactsContract.Data.DATA1, username); 
 215      * builder.withValue(ContactsContract.Data.DATA2, "Last.fm Profile"); 
 216      * builder.withValue(ContactsContract.Data.DATA3, "View profile"); 
 217      * operationList.add(builder.build()); 
 220      * getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, 
 221      * operationList); } catch (Exception e) { Log.e("ASD", 
 222      * "Something went wrong during creation! " + e); e.printStackTrace(); } }