X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b86059bf83c77a9b033dffbeda38c3e9e4fd538e..ff82b51e49f40155e7c340090f5ee759af2bf3ad:/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 0fcf6839..4f099e49 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -1,6 +1,10 @@ -/* 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, @@ -18,13 +22,14 @@ 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; @@ -33,34 +38,26 @@ import android.widget.ImageView; 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; @@ -70,12 +67,35 @@ public class FileDetailFragment extends FileFragment implements 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(); @@ -84,24 +104,9 @@ public class FileDetailFragment extends FileFragment implements 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); } @@ -110,8 +115,10 @@ public class FileDetailFragment extends FileFragment implements @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); @@ -121,9 +128,7 @@ public class FileDetailFragment extends FileFragment implements 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); @@ -131,26 +136,10 @@ public class FileDetailFragment extends FileFragment implements 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) { @@ -167,8 +156,8 @@ public class FileDetailFragment extends FileFragment implements @Override public void onStop() { - super.onStop(); leaveTransferProgress(); + super.onStop(); } @@ -185,26 +174,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); - - } - } - } + } /** @@ -214,80 +184,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, + 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); } } @@ -311,11 +229,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: @@ -335,7 +255,7 @@ public class FileDetailFragment extends FileFragment implements ((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile()); } else { - ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(getFile()); + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile()); } return true; } @@ -367,72 +287,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. * @@ -459,8 +327,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. @@ -468,7 +334,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) { @@ -478,12 +343,9 @@ 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()); - } - + setTimeModified(file.getModificationTimestamp()); CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync); @@ -492,7 +354,10 @@ public class FileDetailFragment extends FileFragment implements // 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()) { @@ -500,7 +365,8 @@ public class FileDetailFragment extends FileFragment implements 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(); } } @@ -529,17 +395,18 @@ public class FileDetailFragment extends FileFragment implements /** * 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)); } } @@ -554,20 +421,6 @@ public class FileDetailFragment extends FileFragment implements } /** - * 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 */ @@ -592,6 +445,7 @@ public class FileDetailFragment extends FileFragment implements 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())) { @@ -629,42 +483,15 @@ public class FileDetailFragment extends FileFragment implements } - /** - * 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()); } } } @@ -673,10 +500,12 @@ public class FileDetailFragment extends FileFragment implements 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()); } } } @@ -684,9 +513,8 @@ public class FileDetailFragment extends FileFragment implements /** - * 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; @@ -697,7 +525,8 @@ public class FileDetailFragment extends FileFragment implements } @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(); @@ -709,6 +538,6 @@ public class FileDetailFragment extends FileFragment implements mLastPercent = percent; } - }; + } }