-/* ownCloud Android client application
+/**
+ * ownCloud Android client application
+ *
+ * @author Bartek Przybylski
+ * @author David A. Velasco
* Copyright (C) 2011 Bartek Przybylski
- * Copyright (C) 2012-2013 ownCloud Inc.
+ * Copyright (C) 2015 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.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
import android.accounts.Account;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-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.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.dialog.RemoveFileDialogFragment;
+import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.Log_OC;
/**
* This Fragment is used to display the details about a file.
- *
- * @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 int mLayout;
private View mView;
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";
+
+ private static final String ARG_FILE = "FILE";
+ private static final String ARG_ACCOUNT = "ACCOUNT";
+
+
+ /**
+ * Public factory method to create new FileDetailFragment instances.
+ *
+ * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).
+ *
+ * @param fileToDetail An {@link OCFile} to show in the fragment
+ * @param account An ownCloud account; needed to start downloads
+ * @return New fragment with arguments set
+ */
+ public static FileDetailFragment newInstance(OCFile fileToDetail, Account account) {
+ FileDetailFragment frag = new FileDetailFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_FILE, fileToDetail);
+ args.putParcelable(ARG_ACCOUNT, account);
+ frag.setArguments(args);
+ return frag;
+ }
/**
* Creates an empty details fragment.
*
- * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically.
+ * It's necessary to keep a public constructor without parameters; the system uses it when tries
+ * to reinstantiate a fragment automatically.
*/
public FileDetailFragment() {
super();
mProgressListener = null;
}
- /**
- * Creates a details fragment.
- *
- * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).
- *
- * @param fileToDetail An {@link OCFile} to show in the fragment
- * @param ocAccount An ownCloud account; needed to start downloads
- */
- public FileDetailFragment(OCFile fileToDetail, Account ocAccount) {
- super(fileToDetail);
- mAccount = ocAccount;
- mLayout = R.layout.file_details_empty;
- mProgressListener = null;
- }
-
-
+
@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);
-
+
+ setFile((OCFile) getArguments().getParcelable(ARG_FILE));
+ mAccount = getArguments().getParcelable(ARG_ACCOUNT);
+
if (savedInstanceState != null) {
setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
mLayout = R.layout.file_details_fragment;
}
- View view = null;
- view = inflater.inflate(mLayout, null);
- mView = view;
+ mView = inflater.inflate(mLayout, null);
if (mLayout == R.layout.file_details_fragment) {
mView.findViewById(R.id.fdKeepInSync).setOnClickListener(this);
mProgressListener = new ProgressListener(progressBar);
mView.findViewById(R.id.fdCancelBtn).setOnClickListener(this);
}
-
+
updateFileDetails(false, false);
- return view;
+ return mView;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (mAccount != null) {
- OCFile file = ((FileActivity)getActivity()).getStorageManager().
- getFileByPath(getFile().getRemotePath());
- if (file != null) {
- setFile(file);
- }
- }
- }
-
@Override
public void onSaveInstanceState(Bundle outState) {
@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,
+ getActivity()
+ );
+ 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());
- }
-
+
setTimeModified(file.getModificationTimestamp());
CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync);
// configure UI for depending upon local state of the file
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
- if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))) {
+ if (transferring ||
+ (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) ||
+ (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))
+ ) {
setButtonsForTransferring();
} else if (file.isDown()) {
setButtonsForDown();
} else {
- // TODO load default preview image; when the local file is removed, the preview remains there
+ // TODO load default preview image; when the local file is removed, the preview
+ // remains there
setButtonsForRemote();
}
}
/**
* Updates the MIME type in view
- * @param mimetype to set
+ * @param mimetype MIME type to set
+ * @param filename Name of the file, to deduce the icon to use in case the MIME type is not precise enough
*/
- 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);;
+ String printableMimetype = DisplayUtils.convertMIMEtoPrettyPrint(mimetype);
tv.setText(printableMimetype);
}
ImageView iv = (ImageView) getView().findViewById(R.id.fdIcon);
if (iv != null) {
- iv.setImageResource(DisplayUtils.getResourceId(mimetype));
+ iv.setImageResource(DisplayUtils.getFileTypeIconId(mimetype, filename));
}
}
}
/**
- * 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);
- TextView tvLabel = (TextView) getView().findViewById(R.id.fdCreatedLabel);
- if(tv != null){
- tv.setText(DisplayUtils.unixTimeToHumanReadable(milliseconds));
- tv.setVisibility(View.VISIBLE);
- tvLabel.setVisibility(View.VISIBLE);
- }
- }
-
- /**
* Updates the time that the file was last modified
* @param milliseconds Unix time to set
*/
progressText.setVisibility(View.VISIBLE);
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
+ //if (getFile().isDownloading()) {
if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, getFile())) {
progressText.setText(R.string.downloader_download_in_progress_ticker);
} else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, getFile())) {
}
- /**
- * In ownCloud 3.X.X and 4.X.X there is a bug that SabreDAV does not return
- * the time that the file was created. There is a chance that this will
- * be fixed in future versions. Use this method to check if this version of
- * ownCloud has this fix.
- * @return True, if ownCloud the ownCloud version is supporting creation time
- */
- private boolean ocVersionSupportsTimeCreated(){
- /*if(mAccount != null){
- AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);
- OwnCloudVersion ocVersion = new OwnCloudVersion(accManager
- .getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));
- if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) {
- return true;
- }
- }*/
- return false;
- }
-
-
- 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) {
- mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().
+ addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileUploaderBinder().
+ addDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
public void leaveTransferProgress() {
if (mProgressListener != null) {
if (mContainerActivity.getFileDownloaderBinder() != null) {
- mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileDownloaderBinder().
+ removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
if (mContainerActivity.getFileUploaderBinder() != null) {
- mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
+ mContainerActivity.getFileUploaderBinder().
+ removeDatatransferProgressListener(mProgressListener, mAccount, getFile());
}
}
}
/**
- * Helper class responsible for updating the progress bar shown for file uploading or downloading
- *
- * @author David A. Velasco
+ * Helper class responsible for updating the progress bar shown for file uploading or
+ * downloading
*/
private class ProgressListener implements OnDatatransferProgressListener {
int mLastPercent = 0;
}
@Override
- public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String filename) {
+ public void onTransferProgress(long progressRate, long totalTransferredSoFar,
+ long totalToTransfer, String filename) {
int percent = (int)(100.0*((double)totalTransferredSoFar)/((double)totalToTransfer));
if (percent != mLastPercent) {
ProgressBar pb = mProgressBar.get();
mLastPercent = percent;
}
- };
+ }
}