X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/c6edcab5a2f81773f05b8f796f2c356c2c2aeb4d..e901b609baa4dd5f681e2a5257c9e504997e3377:/src/com/owncloud/android/ui/fragment/FileDetailFragment.java diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 8d6ad641..2ff29250 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -1,6 +1,6 @@ /* ownCloud Android client application * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2012-2014 ownCloud Inc. + * Copyright (C) 2012-2013 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -17,16 +17,10 @@ */ package com.owncloud.android.ui.fragment; -import java.io.File; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; import android.accounts.Account; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -36,7 +30,6 @@ import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import android.widget.Toast; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; @@ -44,19 +37,17 @@ import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.files.services.FileObserverService; -import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.files.FileMenuFilter; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; -import com.owncloud.android.ui.dialog.EditNameDialog; -import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener; -import com.owncloud.android.ui.preview.PreviewImageFragment; +import com.owncloud.android.ui.dialog.RemoveFileDialogFragment; +import com.owncloud.android.ui.dialog.RenameFileDialogFragment; import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.Log_OC; /** @@ -65,21 +56,17 @@ import com.owncloud.android.utils.Log_OC; * @author Bartek Przybylski * @author David A. Velasco */ -public class FileDetailFragment extends FileFragment implements - OnClickListener, - ConfirmationDialogFragment.ConfirmationDialogFragmentListener, EditNameDialogListener { +public class FileDetailFragment extends FileFragment implements OnClickListener { - private FileFragment.ContainerActivity mContainerActivity; - private int mLayout; private View mView; private Account mAccount; - private UploadFinishReceiver mUploadFinishReceiver; public ProgressListener mProgressListener; private static final String TAG = FileDetailFragment.class.getSimpleName(); public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT"; + public static final String FTAG_RENAME_FILE = "RENAME_FILE_FRAGMENT"; /** @@ -111,7 +98,7 @@ public class FileDetailFragment extends FileFragment implements @Override - public void onCreate(Bundle savedInstanceState) { + public void onActivityCreated(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @@ -120,7 +107,6 @@ public class FileDetailFragment extends FileFragment implements @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - //super.onCreateView(inflater, container, savedInstanceState); if (savedInstanceState != null) { setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE)); @@ -145,23 +131,6 @@ public class FileDetailFragment extends FileFragment implements updateFileDetails(false, false); return view; } - - /** - * {@inheritDoc} - */ - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - // TODO: Remove this code. (Updated no needed) -// if (mAccount != null) { -// OCFile file = mContainerActivity.getStorageManager(). -// getFileByPath(getFile().getRemotePath()); -// if (file != null) { -// setFile(file); -// } -// } - } - @Override public void onSaveInstanceState(Bundle outState) { @@ -177,29 +146,9 @@ public class FileDetailFragment extends FileFragment implements } @Override - public void onResume() { - super.onResume(); - mUploadFinishReceiver = new UploadFinishReceiver(); - IntentFilter filter = new IntentFilter(FileUploader.getUploadFinishMessage()); - getActivity().registerReceiver(mUploadFinishReceiver, filter); - - } - - - @Override - public void onPause() { - super.onPause(); - if (mUploadFinishReceiver != null) { - getActivity().unregisterReceiver(mUploadFinishReceiver); - mUploadFinishReceiver = null; - } - } - - - @Override public void onStop() { - super.onStop(); leaveTransferProgress(); + super.onStop(); } @@ -216,26 +165,7 @@ public class FileDetailFragment extends FileFragment implements public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.file_actions_menu, menu); - MenuItem item = menu.findItem(R.id.action_see_details); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - - // Send file - item = menu.findItem(R.id.action_send_file); - boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on"); - if (item != null) { - if (sendEnabled) { - item.setVisible(true); - item.setEnabled(true); - } else { - item.setVisible(false); - item.setEnabled(false); - - } - } - } + } /** @@ -245,80 +175,28 @@ public class FileDetailFragment extends FileFragment implements public void onPrepareOptionsMenu (Menu menu) { super.onPrepareOptionsMenu(menu); - List toHide = new ArrayList(); - List toShow = new ArrayList(); - OCFile file = getFile(); - - FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); - boolean downloading = downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file); - FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); - boolean uploading = uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile()); - - if (downloading || uploading) { - toHide.add(R.id.action_download_file); - toHide.add(R.id.action_rename_file); - toHide.add(R.id.action_remove_file); - toHide.add(R.id.action_open_file_with); - if (!downloading) { - toHide.add(R.id.action_cancel_download); - toShow.add(R.id.action_cancel_upload); - } else { - toHide.add(R.id.action_cancel_upload); - toShow.add(R.id.action_cancel_download); - } - - } else if (file != null && file.isDown()) { - toHide.add(R.id.action_download_file); - toHide.add(R.id.action_cancel_download); - toHide.add(R.id.action_cancel_upload); - - toShow.add(R.id.action_rename_file); - toShow.add(R.id.action_remove_file); - toShow.add(R.id.action_open_file_with); - toShow.add(R.id.action_sync_file); - - } else if (file != null) { - toHide.add(R.id.action_open_file_with); - toHide.add(R.id.action_cancel_download); - toHide.add(R.id.action_cancel_upload); - toHide.add(R.id.action_sync_file); - - toShow.add(R.id.action_rename_file); - toShow.add(R.id.action_remove_file); - toShow.add(R.id.action_download_file); - - } else { - toHide.add(R.id.action_open_file_with); - toHide.add(R.id.action_cancel_download); - toHide.add(R.id.action_cancel_upload); - toHide.add(R.id.action_sync_file); - toHide.add(R.id.action_download_file); - toHide.add(R.id.action_rename_file); - toHide.add(R.id.action_remove_file); - - } - - // Options shareLink - if (!file.isShareByLink()) { - toHide.add(R.id.action_unshare_file); - } else { - toShow.add(R.id.action_unshare_file); + if (mContainerActivity.getStorageManager() != null) { + FileMenuFilter mf = new FileMenuFilter( + getFile(), + mContainerActivity.getStorageManager().getAccount(), + mContainerActivity, + getSherlockActivity() + ); + mf.filter(menu); } - MenuItem item = null; - for (int i : toHide) { - item = menu.findItem(i); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } + // additional restriction for this fragment + MenuItem item = menu.findItem(R.id.action_see_details); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); } - for (int i : toShow) { - item = menu.findItem(i); - if (item != null) { - item.setVisible(true); - item.setEnabled(true); - } + + // additional restriction for this fragment + item = menu.findItem(R.id.action_move); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); } } @@ -342,11 +220,13 @@ public class FileDetailFragment extends FileFragment implements return true; } case R.id.action_remove_file: { - showDialogToRemoveFile(); + RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(getFile()); + dialog.show(getFragmentManager(), FTAG_CONFIRMATION); return true; } case R.id.action_rename_file: { - showDialogToRenameFile(); + RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(getFile()); + dialog.show(getFragmentManager(), FTAG_RENAME_FILE); return true; } case R.id.action_cancel_download: @@ -366,7 +246,7 @@ public class FileDetailFragment extends FileFragment implements ((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile()); } else { - ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(getFile()); + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile()); } return true; } @@ -398,72 +278,20 @@ public class FileDetailFragment extends FileFragment implements file.setKeepInSync(cb.isChecked()); mContainerActivity.getStorageManager().saveFile(file); - /// register the OCFile instance in the observer service to monitor local updates; - /// if necessary, the file is download - Intent intent = new Intent(getActivity().getApplicationContext(), - FileObserverService.class); - intent.putExtra(FileObserverService.KEY_FILE_CMD, - (cb.isChecked()? - FileObserverService.CMD_ADD_OBSERVED_FILE: - FileObserverService.CMD_DEL_OBSERVED_FILE)); - intent.putExtra(FileObserverService.KEY_CMD_ARG_FILE, file); - intent.putExtra(FileObserverService.KEY_CMD_ARG_ACCOUNT, mAccount); - getActivity().startService(intent); + /// register the OCFile instance in the observer service to monitor local updates + Intent observedFileIntent = FileObserverService.makeObservedFileIntent( + getActivity(), + file, + mAccount, + cb.isChecked()); + getActivity().startService(observedFileIntent); + /// immediate content synchronization if (file.keepInSync()) { mContainerActivity.getFileOperationsHelper().syncFile(getFile()); } } - private void showDialogToRemoveFile() { - OCFile file = getFile(); - ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance( - R.string.confirmation_remove_alert, - new String[]{file.getFileName()}, - file.isDown() ? R.string.confirmation_remove_remote_and_local : R.string.confirmation_remove_remote, - file.isDown() ? R.string.confirmation_remove_local : -1, - R.string.common_cancel); - confDialog.setOnConfirmationListener(this); - confDialog.show(getFragmentManager(), FTAG_CONFIRMATION); - } - - - private void showDialogToRenameFile() { - OCFile file = getFile(); - String fileName = file.getFileName(); - int extensionStart = file.isFolder() ? -1 : fileName.lastIndexOf("."); - int selectionEnd = (extensionStart >= 0) ? extensionStart : fileName.length(); - EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.rename_dialog_title), fileName, 0, selectionEnd, this); - dialog.show(getFragmentManager(), "nameeditdialog"); - } - - - @Override - public void onConfirmation(String callerTag) { - OCFile file = getFile(); - if (callerTag.equals(FTAG_CONFIRMATION)) { - if (mContainerActivity.getStorageManager().getFileById(file.getFileId()) != null) { - mContainerActivity.getFileOperationsHelper().removeFile(file, true); - } - } - } - - @Override - public void onNeutral(String callerTag) { - OCFile file = getFile(); - mContainerActivity.getStorageManager().removeFile(file, false, true); // TODO perform in background task / new thread - if (file.getStoragePath() != null) { - file.setStoragePath(null); - updateFileDetails(file, mAccount); - } - } - - @Override - public void onCancel(String callerTag) { - Log_OC.d(TAG, "REMOVAL CANCELED"); - } - - /** * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be replaced. * @@ -490,8 +318,6 @@ public class FileDetailFragment extends FileFragment implements * * TODO Remove parameter when the transferring state of files is kept in database. * - * TODO REFACTORING! this method called 5 times before every time the fragment is shown! - * * @param transferring Flag signaling if the file should be considered as downloading or uploading, * although {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and * {@link FileUploaderBinder#isUploading(Account, OCFile)} return false. @@ -499,7 +325,6 @@ public class FileDetailFragment extends FileFragment implements * @param refresh If 'true', try to refresh the whole file from the database */ public void updateFileDetails(boolean transferring, boolean refresh) { - if (readyToShow()) { FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (refresh && storageManager != null) { @@ -509,7 +334,7 @@ public class FileDetailFragment extends FileFragment implements // set file details setFilename(file.getFileName()); - setFiletype(file.getMimetype()); + setFiletype(file.getMimetype(), file.getFileName()); setFilesize(file.getFileLength()); if(ocVersionSupportsTimeCreated()){ setTimeCreated(file.getCreationTimestamp()); @@ -561,8 +386,9 @@ public class FileDetailFragment extends FileFragment implements /** * Updates the MIME type in view * @param mimetype to set + * @param filename */ - private void setFiletype(String mimetype) { + private void setFiletype(String mimetype, String filename) { TextView tv = (TextView) getView().findViewById(R.id.fdType); if (tv != null) { String printableMimetype = DisplayUtils.convertMIMEtoPrettyPrint(mimetype);; @@ -570,7 +396,7 @@ public class FileDetailFragment extends FileFragment implements } ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon); if (iv != null) { - iv.setImageResource(DisplayUtils.getResourceId(mimetype)); + iv.setImageResource(DisplayUtils.getResourceId(mimetype, filename)); } } @@ -680,58 +506,6 @@ public class FileDetailFragment extends FileFragment implements } - /** - * Once the file upload has finished -> update view - * - * Being notified about the finish of an upload is necessary for the next sequence: - * 1. Upload a big file. - * 2. Force a synchronization; if it finished before the upload, the file in transfer will be included in the local database and in the file list - * of its containing folder; the the server includes it in the PROPFIND requests although it's not fully upload. - * 3. Click the file in the list to see its details. - * 4. Wait for the upload finishes; at this moment, the details view must be refreshed to enable the action buttons. - */ - private class UploadFinishReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME); - - if (!isEmpty() && accountName.equals(mAccount.name)) { - boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false); - String uploadRemotePath = intent.getStringExtra(FileUploader.EXTRA_REMOTE_PATH); - boolean renamedInUpload = getFile().getRemotePath().equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH)); - if (getFile().getRemotePath().equals(uploadRemotePath) || - renamedInUpload) { - if (uploadWasFine) { - setFile(mContainerActivity.getStorageManager().getFileByPath(uploadRemotePath)); - } - if (renamedInUpload) { - String newName = (new File(uploadRemotePath)).getName(); - Toast msg = Toast.makeText(getActivity().getApplicationContext(), String.format(getString(R.string.filedetails_renamed_in_upload_msg), newName), Toast.LENGTH_LONG); - msg.show(); - } - getSherlockActivity().removeStickyBroadcast(intent); // not the best place to do this; a small refactorization of BroadcastReceivers should be done - - updateFileDetails(false, false); // it updates the buttons; must be called although !uploadWasFine; interrupted uploads still leave an incomplete file in the server - - // Force the preview if the file is an image - if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) { - ((FileDisplayActivity)mContainerActivity).startImagePreview(getFile()); - } - } - } - } - } - - - public void onDismiss(EditNameDialog dialog) { - if (dialog.getResult()) { - String newFilename = dialog.getNewFilename(); - Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename); - mContainerActivity.getFileOperationsHelper().renameFile(getFile(), newFilename); - } - } - - public void listenForTransferProgress() { if (mProgressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) {