From: Lennart Rosam Date: Wed, 23 May 2012 17:59:29 +0000 (+0200) Subject: Filelisting using intents and OCFile.getId() instead of string matching X-Git-Tag: oc-android-1.4.3~396 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/e8c9e5b09a18d1fa8a764046b7da1402fada46f1?ds=inline;hp=-c Filelisting using intents and OCFile.getId() instead of string matching in db which can be very very slow if there are lots of files --- e8c9e5b09a18d1fa8a764046b7da1402fada46f1 diff --git a/res/values/strings.xml b/res/values/strings.xml index afec7543..c33e085f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -54,6 +54,7 @@ Created: Modified: Download + Open Yes No OK diff --git a/src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java b/src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java index cb899f68..f5664ead 100644 --- a/src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java +++ b/src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java @@ -17,11 +17,13 @@ */ package eu.alefzero.owncloud.ui.activity; +import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; -import android.view.Window; +import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.actionbarsherlock.view.MenuItem; import eu.alefzero.owncloud.R; import eu.alefzero.owncloud.ui.fragment.FileDetailFragment; @@ -38,11 +40,12 @@ public class FileDetailActivity extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { - // TODO Auto-generated method stub super.onCreate(savedInstanceState); - getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.file_activity_details); + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); mFileDetail = new FileDetailFragment(); ft.add(R.id.fragment, mFileDetail, "FileDetails"); @@ -51,6 +54,25 @@ public class FileDetailActivity extends SherlockFragmentActivity { } @Override + public boolean onOptionsItemSelected(MenuItem item) { + boolean returnValue = false; + + switch(item.getItemId()){ + case android.R.id.home: + Intent intent = new Intent(this, FileDisplayActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra(FileDetailFragment.EXTRA_FILE, mFileDetail.getDisplayedFile()); + startActivity(intent); + finish(); + returnValue = true; + } + + return returnValue; + } + + + + @Override protected void onResume() { super.onResume(); mFileDetail.updateFileDetails(getIntent()); diff --git a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java index bdc146cc..832ccae8 100644 --- a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java +++ b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java @@ -20,8 +20,6 @@ package eu.alefzero.owncloud.ui.activity; import java.io.File; import java.net.URLDecoder; -import java.net.URLEncoder; - import android.accounts.Account; import android.accounts.AccountManager; import android.app.AlertDialog; @@ -62,7 +60,6 @@ import eu.alefzero.owncloud.datamodel.OCFile; import eu.alefzero.owncloud.files.services.FileUploader; import eu.alefzero.owncloud.syncadapter.FileSyncService; import eu.alefzero.owncloud.ui.fragment.FileListFragment; -import eu.alefzero.owncloud.utils.OwnCloudVersion; import eu.alefzero.webdav.WebdavClient; /** @@ -84,8 +81,6 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements private static final int DIALOG_SETUP_ACCOUNT = 0; private static final int DIALOG_CREATE_DIR = 1; - - private static final int REQUEST_ACCOUNT_SETUP = 0; private static final int ACTION_SELECT_FILE = 1; public void pushPath(String path) { @@ -175,8 +170,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarIndeterminateVisibility(false); - // if (getSupportFragmentManager().findFragmentById(R.id.fileList) == - // null) + setContentView(R.layout.files); } @@ -282,7 +276,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements mDirectories.insert(s, 0); FileListFragment fileListFramgent = (FileListFragment) getSupportFragmentManager() .findFragmentById(R.id.fileList); - if (fileListFramgent != null) fileListFramgent.populateFileList(); + if (fileListFramgent != null) fileListFramgent.listDirectory(); } mStorageManager = new FileDataStorageManager( @@ -466,7 +460,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements FileListFragment fileListFramgent = (FileListFragment) getSupportFragmentManager() .findFragmentById(R.id.fileList); if (fileListFramgent != null) - fileListFramgent.populateFileList(); + fileListFramgent.listDirectory(); } } diff --git a/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java b/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java index f76c2b2a..45ec0a9a 100644 --- a/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java +++ b/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java @@ -51,7 +51,7 @@ import eu.alefzero.owncloud.datamodel.OCFile; public class FileDetailFragment extends SherlockFragment implements OnClickListener { - public static final String FILE = "FILE"; + public static final String EXTRA_FILE = "FILE"; private DownloadFinishReceiver mDownloadFinishReceiver; private Intent mIntent; @@ -109,6 +109,46 @@ public class FileDetailFragment extends SherlockFragment implements mDownloadFinishReceiver = null; } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = null; + view = inflater.inflate(mLayout, container, false); + mView = view; + if(mLayout == R.layout.file_details_fragment){ + // Phones will launch an activity with this intent + if(mIntent == null){ + mIntent = getActivity().getIntent(); + } + updateFileDetails(); + } + + return view; + } + + @Override + public View getView() { + return super.getView() == null ? mView : super.getView(); + } + + @Override + public void onClick(View v) { + Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show(); + Intent i = new Intent(getActivity(), FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, + mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT)); + i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getPath()); + getActivity().startService(i); + } + + /** + * Can be used to get the file that is currently being displayed. + * @return The file on the screen. + */ + public OCFile getDisplayedFile(){ + return mFile; + } + /** * Use this method to signal this Activity that it shall update its view. * @@ -116,7 +156,7 @@ public class FileDetailFragment extends SherlockFragment implements * this file The intent needs to have these extras: *

* - * {@link FileDetailFragment#FILE}: An {@link OCFile} + * {@link FileDetailFragment#EXTRA_FILE}: An {@link OCFile} * {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file * belongs to (required for downloading) */ @@ -125,8 +165,11 @@ public class FileDetailFragment extends SherlockFragment implements updateFileDetails(); } + /** + * Updates the view with all relevant details about that file. + */ private void updateFileDetails() { - mFile = mIntent.getParcelableExtra(FILE); + mFile = mIntent.getParcelableExtra(EXTRA_FILE); Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn); if (mFile != null) { @@ -150,7 +193,7 @@ public class FileDetailFragment extends SherlockFragment implements } catch (OutOfMemoryError e) { Log.e(TAG, "Out of memory occured for file with size " + mFile.getFileLength()); } - downloadButton.setText("Open file"); + downloadButton.setText(R.string.filedetails_open); downloadButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -166,24 +209,40 @@ public class FileDetailFragment extends SherlockFragment implements } } + /** + * Updates the filename in view + * @param filename to set + */ private void setFilename(String filename) { TextView tv = (TextView) getView().findViewById(R.id.fdFilename); if (tv != null) tv.setText(filename); } + /** + * Updates the MIME type in view + * @param mimetype to set + */ private void setFiletype(String mimetype) { TextView tv = (TextView) getView().findViewById(R.id.fdType); if (tv != null) tv.setText(mimetype); } + /** + * Updates the file size in view + * @param filesize in bytes to set + */ private void setFilesize(long filesize) { TextView tv = (TextView) getView().findViewById(R.id.fdSize); if (tv != null) tv.setText(DisplayUtils.bytesToHumanReadable(filesize)); } + /** + * Updates the time that the file was created in view + * @param milliseconds Unix time to set + */ private void setTimeCreated(long milliseconds){ TextView tv = (TextView) getView().findViewById(R.id.fdCreated); if(tv != null){ @@ -191,6 +250,10 @@ public class FileDetailFragment extends SherlockFragment implements } } + /** + * Updates the time that the file was last modified + * @param milliseconds Unix time to set + */ private void setTimeModified(long milliseconds){ TextView tv = (TextView) getView().findViewById(R.id.fdModified); if(tv != null){ @@ -198,40 +261,10 @@ public class FileDetailFragment extends SherlockFragment implements } } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = null; - view = inflater.inflate(mLayout, container, false); - mView = view; - if(mLayout == R.layout.file_details_fragment){ - // Phones will launch an activity with this intent - if(mIntent == null){ - mIntent = getActivity().getIntent(); - } - updateFileDetails(); - } - - return view; - } - - - - @Override - public View getView() { - return super.getView() == null ? mView : super.getView(); - } - - @Override - public void onClick(View v) { - Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show(); - Intent i = new Intent(getActivity(), FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, - mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT)); - i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getPath()); - getActivity().startService(i); - } - + /** + * Once the file download has finished -> update view + * @author Bartek Przybylski + */ private class DownloadFinishReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/src/eu/alefzero/owncloud/ui/fragment/FileListFragment.java b/src/eu/alefzero/owncloud/ui/fragment/FileListFragment.java index 5879298d..e3267309 100644 --- a/src/eu/alefzero/owncloud/ui/fragment/FileListFragment.java +++ b/src/eu/alefzero/owncloud/ui/fragment/FileListFragment.java @@ -48,10 +48,12 @@ import eu.alefzero.owncloud.ui.adapter.FileListListAdapter; * */ public class FileListFragment extends FragmentListView { + private static final String TAG = "FileListFragment"; private Account mAccount; private Stack mDirNames; private Vector mFiles; private DataStorageManager mStorageManager; + private OCFile mFile; private boolean mIsLargeDevice = false; public FileListFragment() { @@ -63,15 +65,19 @@ public class FileListFragment extends FragmentListView { super.onCreate(savedInstanceState); mAccount = AccountUtils.getCurrentOwnCloudAccount(getActivity()); + mStorageManager = new FileDataStorageManager(mAccount, getActivity().getContentResolver()); getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator)); getListView().setDividerHeight(1); - populateFileList(); + Intent intent = getActivity().getIntent(); + OCFile directory = intent.getParcelableExtra(FileDetailFragment.EXTRA_FILE); + mFile = directory; + + listDirectory(directory); } @Override public void onStart() { - // Create a placeholder upon launch View fragmentContainer = getActivity().findViewById(R.id.file_details_container); if (fragmentContainer != null) { @@ -89,22 +95,23 @@ public class FileListFragment extends FragmentListView { throw new IndexOutOfBoundsException("Incorrect item selected"); } OCFile file = mFiles.get(position); - + mFile = file; + // Update ActionBarPath if (file.getMimetype().equals("DIR")) { String dirname = file.getFileName(); mDirNames.push(dirname); ((FileDisplayActivity) getActivity()).pushPath(dirname); - - populateFileList(); + + listDirectory(file); resetFileFragment(); return; } Intent showDetailsIntent = new Intent(getActivity(), FileDetailActivity.class); - showDetailsIntent.putExtra(FileDetailFragment.FILE, file); + showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file); showDetailsIntent.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); // If we are on a large device -> update fragment @@ -151,26 +158,53 @@ public class FileListFragment extends FragmentListView { */ public void onNavigateUp() { mDirNames.pop(); - populateFileList(); + OCFile parentDir = null; + + if(mFile != null){ + parentDir = mStorageManager.getFileById(mFile.getParentId()); + mFile = parentDir; + } + + listDirectory(parentDir); resetFileFragment(); } /** - * Lists the directory + * Calls {@link FileListFragment#listDirectory(OCFile)} with a null parameter */ - public void populateFileList() { - String s = "/"; - for (String a : mDirNames) - s += a + "/"; - Log.e("ASD", s); - - mStorageManager = new FileDataStorageManager(mAccount, getActivity().getContentResolver()); - OCFile file = mStorageManager.getFileByPath(s); - mFiles = mStorageManager.getDirectoryContent(file); + public void listDirectory(){ + listDirectory(null); + } + + /** + * Lists the given directory on the view. When the input parameter is null, + * it will either refresh the last known directory, or list the root + * if there never was a directory. + * + * @param directory File to be listed + */ + public void listDirectory(OCFile directory) { + + // Check input parameters for null + if(directory == null){ + if(mFile != null){ + directory = mFile; + } else { + directory = mStorageManager.getFileByPath("/"); + } + } + + // If that's not a directory -> List its parent + if(!directory.isDirectory()){ + Log.w(TAG, "You see, that is not a directory -> " + directory.toString()); + directory = mStorageManager.getFileById(directory.getParentId()); + } + + mFiles = mStorageManager.getDirectoryContent(directory); if (mFiles == null || mFiles.size() == 0) { Toast.makeText(getActivity(), "There are no files here", Toast.LENGTH_LONG).show(); } - setListAdapter(new FileListListAdapter(file, mStorageManager, getActivity())); + setListAdapter(new FileListListAdapter(directory, mStorageManager, getActivity())); } @Override @@ -178,48 +212,5 @@ public class FileListFragment extends FragmentListView { super.onSaveInstanceState(outState); outState.putParcelable("ACCOUNT", mAccount); } - - // TODO: Delete this testing stuff. - /* - * private void addContact(Account account, String name, String username) { - * Log.i("ASD", "Adding contact: " + name); - * ArrayList operationList = new - * ArrayList(); - * - * //Create our RawContact ContentProviderOperation.Builder builder = - * ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); - * builder.withValue(RawContacts.ACCOUNT_NAME, account.name); - * builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); - * builder.withValue(RawContacts.SYNC1, username); - * operationList.add(builder.build()); - * - * //Create a Data record of common type 'StructuredName' for our RawContact - * builder = - * ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); - * builder - * .withValueBackReference(ContactsContract.CommonDataKinds.StructuredName - * .RAW_CONTACT_ID, 0); builder.withValue(ContactsContract.Data.MIMETYPE, - * ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - * builder - * .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, - * name); operationList.add(builder.build()); - * - * //Create a Data record of custom type - * "vnd.android.cursor.item/vnd.fm.last.android.profile" to display a link - * to the Last.fm profile builder = - * ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); - * builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); - * builder.withValue(ContactsContract.Data.MIMETYPE, - * "vnd.android.cursor.item/vnd.owncloud.contact.profile"); - * builder.withValue(ContactsContract.Data.DATA1, username); - * builder.withValue(ContactsContract.Data.DATA2, "Last.fm Profile"); - * builder.withValue(ContactsContract.Data.DATA3, "View profile"); - * operationList.add(builder.build()); - * - * try { - * getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, - * operationList); } catch (Exception e) { Log.e("ASD", - * "Something went wrong during creation! " + e); e.printStackTrace(); } } - */ }