/* 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,
*/
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;
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;
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;
/**
* @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";
/**
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@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));
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) {
}
@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();
}
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);
-
- }
- }
- }
+ }
/**
public void onPrepareOptionsMenu (Menu menu) {
super.onPrepareOptionsMenu(menu);
- List<Integer> toHide = new ArrayList<Integer>();
- List<Integer> toShow = new ArrayList<Integer>();
- 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);
}
}
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:
((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile());
} else {
- ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(getFile());
+ mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
}
return true;
}
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.
*
*
* 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.
* @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) {
// set file details
setFilename(file.getFileName());
- setFiletype(file.getMimetype());
+ setFiletype(file.getMimetype(), file.getFileName());
setFilesize(file.getFileLength());
if(ocVersionSupportsTimeCreated()){
setTimeCreated(file.getCreationTimestamp());
/**
* 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);;
}
ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon);
if (iv != null) {
- iv.setImageResource(DisplayUtils.getResourceId(mimetype));
+ iv.setImageResource(DisplayUtils.getResourceId(mimetype, filename));
}
}
}
- /**
- * 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) {