From: David A. Velasco Date: Tue, 6 May 2014 08:58:19 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/refactor_update_filelist_from_database' into... X-Git-Tag: oc-android-1.7.0_signed~309^2~57 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/c6edcab5a2f81773f05b8f796f2c356c2c2aeb4d?ds=inline;hp=-c Merge remote-tracking branch 'origin/refactor_update_filelist_from_database' into refactor_update_filelist_from_database --- c6edcab5a2f81773f05b8f796f2c356c2c2aeb4d diff --combined src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 328cce66,7995797d..8d6ad641 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@@ -1,6 -1,6 +1,6 @@@ /* ownCloud Android client application * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2012-2013 ownCloud Inc. + * Copyright (C) 2012-2014 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, @@@ -23,11 -23,13 +23,11 @@@ import java.util.ArrayList import java.util.List; import android.accounts.Account; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; -import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@@ -49,6 -51,14 +49,6 @@@ import com.owncloud.android.files.servi 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.operations.OnRemoteOperationListener; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.operations.RenameFileOperation; -import com.owncloud.android.operations.SynchronizeFileOperation; -import com.owncloud.android.ui.activity.ConflictsResolveActivity; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; @@@ -67,7 -77,7 +67,7 @@@ import com.owncloud.android.utils.Log_O */ public class FileDetailFragment extends FileFragment implements OnClickListener, - ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener { + ConfirmationDialogFragment.ConfirmationDialogFragmentListener, EditNameDialogListener { private FileFragment.ContainerActivity mContainerActivity; @@@ -78,6 -88,9 +78,6 @@@ private UploadFinishReceiver mUploadFinishReceiver; public ProgressListener mProgressListener; - private Handler mHandler; - private RemoteOperation mLastRemoteOperation; - private static final String TAG = FileDetailFragment.class.getSimpleName(); public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT"; @@@ -113,6 -126,7 +113,6 @@@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mHandler = new Handler(); setHasOptionsMenu(true); } @@@ -132,6 -146,7 +132,6 @@@ } View view = null; - //view = inflater.inflate(mLayout, container, false); view = inflater.inflate(mLayout, null); mView = view; @@@ -150,15 -165,31 +150,16 @@@ * {@inheritDoc} */ @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mContainerActivity = (ContainerActivity) activity; - - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + FileDetailFragment.ContainerActivity.class.getSimpleName()); - } - } - - - /** - * {@inheritDoc} - */ - @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (mAccount != null) { - OCFile file = mContainerActivity.getStorageManager(). - getFileByPath(getFile().getRemotePath()); - if (file != null) { - setFile(file); - } - } + // TODO: Remove this code. (Updated no needed) + // if (mAccount != null) { -// OCFile file = ((FileActivity)getActivity()).getStorageManager(). -// getFileByPath(getFile().getRemotePath()); ++// OCFile file = mContainerActivity.getStorageManager(). ++// getFileByPath(getFile().getRemotePath()); + // if (file != null) { + // setFile(file); + // } + // } } @@@ -329,43 -360,44 +330,43 @@@ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_share_file: { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity); + mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile()); return true; } case R.id.action_unshare_file: { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().unshareFileWithLink(getFile(), activity); + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile()); return true; } case R.id.action_open_file_with: { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().openFile(getFile(), activity); + mContainerActivity.getFileOperationsHelper().openFile(getFile()); return true; } case R.id.action_remove_file: { - removeFile(); + showDialogToRemoveFile(); return true; } case R.id.action_rename_file: { - renameFile(); + showDialogToRenameFile(); return true; } - case R.id.action_download_file: case R.id.action_cancel_download: - case R.id.action_cancel_upload: + case R.id.action_cancel_upload: { + ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile()); + return true; + } + case R.id.action_download_file: case R.id.action_sync_file: { - synchronizeFile(); + mContainerActivity.getFileOperationsHelper().syncFile(getFile()); return true; } case R.id.action_send_file: { - FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity(); // Obtain the file if (!getFile().isDown()) { // Download the file Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded"); - activity.startDownloadForSending(getFile()); + ((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile()); } else { - activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity); + ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(getFile()); } return true; } @@@ -382,7 -414,7 +383,7 @@@ break; } case R.id.fdCancelBtn: { - synchronizeFile(); + ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile()); break; } default: @@@ -395,7 -427,7 +396,7 @@@ CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync); OCFile file = getFile(); file.setKeepInSync(cb.isChecked()); - ((FileActivity)getActivity()).getStorageManager().saveFile(file); + mContainerActivity.getStorageManager().saveFile(file); /// register the OCFile instance in the observer service to monitor local updates; /// if necessary, the file is download @@@ -410,11 -442,11 +411,11 @@@ getActivity().startService(intent); if (file.keepInSync()) { - synchronizeFile(); // force an immediate synchronization + mContainerActivity.getFileOperationsHelper().syncFile(getFile()); } } - private void removeFile() { + private void showDialogToRemoveFile() { OCFile file = getFile(); ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance( R.string.confirmation_remove_alert, @@@ -427,7 -459,7 +428,7 @@@ } - private void renameFile() { + private void showDialogToRenameFile() { OCFile file = getFile(); String fileName = file.getFileName(); int extensionStart = file.isFolder() ? -1 : fileName.lastIndexOf("."); @@@ -436,13 -468,59 +437,13 @@@ dialog.show(getFragmentManager(), "nameeditdialog"); } - private void synchronizeFile() { - OCFile file = getFile(); - FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); - FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); - if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { - downloaderBinder.cancel(mAccount, file); - if (file.isDown()) { - setButtonsForDown(); - } else { - setButtonsForRemote(); - } - - } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { - uploaderBinder.cancel(mAccount, file); - if (!file.fileExists()) { - // TODO make something better - ((FileDisplayActivity)getActivity()).cleanSecondFragment(); - - } else if (file.isDown()) { - setButtonsForDown(); - } else { - setButtonsForRemote(); - } - - } else { - mLastRemoteOperation = new SynchronizeFileOperation( - file, - null, - ((FileActivity)getActivity()).getStorageManager(), - mAccount, - true, - getActivity()); - mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity()); - - // update ui - ((FileActivity) getActivity()).showLoadingDialog(); - - } - } - + @Override public void onConfirmation(String callerTag) { OCFile file = getFile(); if (callerTag.equals(FTAG_CONFIRMATION)) { - FileDataStorageManager storageManager = - ((FileActivity)getActivity()).getStorageManager(); - if (storageManager.getFileById(file.getFileId()) != null) { - mLastRemoteOperation = new RemoveFileOperation( file, - true, - storageManager); - mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity()); - - ((FileActivity) getActivity()).showLoadingDialog(); + if (mContainerActivity.getStorageManager().getFileById(file.getFileId()) != null) { + mContainerActivity.getFileOperationsHelper().removeFile(file, true); } } } @@@ -450,7 -528,7 +451,7 @@@ @Override public void onNeutral(String callerTag) { OCFile file = getFile(); - ((FileActivity)getActivity()).getStorageManager().removeFile(file, false, true); // TODO perform in background task / new thread + mContainerActivity.getStorageManager().removeFile(file, false, true); // TODO perform in background task / new thread if (file.getStoragePath() != null) { file.setStoragePath(null); updateFileDetails(file, mAccount); @@@ -480,6 -558,13 +481,6 @@@ */ public void updateFileDetails(OCFile file, Account ocAccount) { setFile(file); - FileDataStorageManager storageManager = ((FileActivity)getActivity()).getStorageManager(); - if (ocAccount != null && ( - storageManager == null || - (mAccount != null && !mAccount.equals(ocAccount)) - )) { - storageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver()); - } mAccount = ocAccount; updateFileDetails(false, false); } @@@ -495,12 -580,13 +496,12 @@@ * although {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and * {@link FileUploaderBinder#isUploading(Account, OCFile)} return false. * - * @param refresh If 'true', try to refresh the hold file from the database + * @param refresh If 'true', try to refresh the whole file from the database */ public void updateFileDetails(boolean transferring, boolean refresh) { if (readyToShow()) { - FileDataStorageManager storageManager = - ((FileActivity)getActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (refresh && storageManager != null) { setFile(storageManager.getFileByPath(getFile().getRemotePath())); } @@@ -520,6 -606,7 +521,6 @@@ cb.setChecked(file.keepInSync()); // configure UI for depending upon local state of the file - //if (FileDownloader.isDownloading(mAccount, mFile.getRemotePath()) || FileUploader.isUploading(mAccount, mFile.getRemotePath())) { FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder(); FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder(); if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))) { @@@ -701,7 -788,7 +702,7 @@@ if (getFile().getRemotePath().equals(uploadRemotePath) || renamedInUpload) { if (uploadWasFine) { - setFile(((FileActivity)getActivity()).getStorageManager().getFileByPath(uploadRemotePath)); + setFile(mContainerActivity.getStorageManager().getFileByPath(uploadRemotePath)); } if (renamedInUpload) { String newName = (new File(uploadRemotePath)).getName(); @@@ -714,7 -801,7 +715,7 @@@ // Force the preview if the file is an image if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) { - ((FileDisplayActivity) mContainerActivity).startImagePreview(getFile()); + ((FileDisplayActivity)mContainerActivity).startImagePreview(getFile()); } } } @@@ -726,11 -813,118 +727,11 @@@ if (dialog.getResult()) { String newFilename = dialog.getNewFilename(); Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename); - mLastRemoteOperation = new RenameFileOperation( getFile(), - mAccount, - newFilename, - new FileDataStorageManager(mAccount, getActivity().getContentResolver())); - mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity()); - ((FileActivity) getActivity()).showLoadingDialog(); + mContainerActivity.getFileOperationsHelper().renameFile(getFile(), newFilename); } } - /** - * {@inheritDoc} - */ - @Override - public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - if (operation.equals(mLastRemoteOperation)) { - if (operation instanceof RemoveFileOperation) { - onRemoveFileOperationFinish((RemoveFileOperation)operation, result); - - } else if (operation instanceof RenameFileOperation) { - onRenameFileOperationFinish((RenameFileOperation)operation, result); - - } else if (operation instanceof SynchronizeFileOperation) { - onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result); - } - } - } - - - private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) { - ((FileActivity) getActivity()).dismissLoadingDialog(); - if (result.isSuccess()) { - Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG); - msg.show(); - ((FileDisplayActivity)getActivity()).cleanSecondFragment(); - - } else { - Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); - msg.show(); - if (result.isSslRecoverableException()) { - // TODO show the SSL warning dialog - } - } - } - - private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) { - ((FileActivity) getActivity()).dismissLoadingDialog(); - - if (result.isSuccess()) { - updateFileDetails(((RenameFileOperation)operation).getFile(), mAccount); - /* TODO WIP COMMENT - mContainerActivity.onFileStateChanged(); - */ - - } else { - if (result.getCode().equals(ResultCode.INVALID_LOCAL_FILE_NAME)) { - Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG); - msg.show(); - // TODO throw again the new rename dialog - } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) { - Toast msg = Toast.makeText(getActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG); - msg.show(); - } else { - Toast msg = Toast.makeText(getActivity(), R.string.rename_server_fail_msg, Toast.LENGTH_LONG); - msg.show(); - if (result.isSslRecoverableException()) { - // TODO show the SSL warning dialog - } - } - } - } - - private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) { - ((FileActivity) getActivity()).dismissLoadingDialog(); - OCFile file = getFile(); - if (!result.isSuccess()) { - if (result.getCode() == ResultCode.SYNC_CONFLICT) { - Intent i = new Intent(getActivity(), ConflictsResolveActivity.class); - i.putExtra(ConflictsResolveActivity.EXTRA_FILE, file); - i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, mAccount); - startActivity(i); - - } - - if (file.isDown()) { - setButtonsForDown(); - - } else { - setButtonsForRemote(); - } - - } else { - if (operation.transferWasRequested()) { - setButtonsForTransferring(); - /* TODO WIP COMMENT - mContainerActivity.onFileStateChanged(); // this is not working; FileDownloader won't do NOTHING at all until this method finishes, so - // checking the service to see if the file is downloading results in FALSE - */ - } else { - Toast msg = Toast.makeText(getActivity(), R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG); - msg.show(); - if (file.isDown()) { - setButtonsForDown(); - - } else { - setButtonsForRemote(); - } - } - } - } - - public void listenForTransferProgress() { if (mProgressListener != null) { if (mContainerActivity.getFileDownloaderBinder() != null) { diff --combined src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 91718da0,58359c11..450f7569 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@@ -29,9 -29,15 +29,9 @@@ import com.owncloud.android.datamodel.O import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.operations.RenameFileOperation; -import com.owncloud.android.operations.SynchronizeFileOperation; -import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.ExtendedListView; -import com.owncloud.android.ui.activity.TransferServiceGetter; import com.owncloud.android.ui.adapter.FileListListAdapter; +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.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; @@@ -45,6 -51,7 +45,6 @@@ import android.app.Activity import android.database.Cursor; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; @@@ -58,11 -65,8 +58,11 @@@ import android.widget.AdapterView.Adapt /** * A Fragment that lists all files and folders in a given path. * - * @author Bartek Przybylski + * TODO refactorize to get rid of direct dependency on FileDisplayActivity * + * @author Bartek Przybylski + * @author masensio + * @author David A. Velasco */ public class OCFileListFragment extends ExtendedListFragment implements EditNameDialogListener, ConfirmationDialogFragmentListener, @@@ -80,13 -84,14 +80,13 @@@ private static final int LOADER_ID = 0; - private OCFileListFragment.ContainerActivity mContainerActivity; + private FileFragment.ContainerActivity mContainerActivity; private OCFile mFile = null; private FileListListAdapter mAdapter; private LoaderManager mLoaderManager; private FileListCursorLoader mCursorLoader; - private Handler mHandler; private OCFile mTargetFile; // Save the state of the scroll in browsing @@@ -104,19 -109,12 +104,19 @@@ super.onAttach(activity); Log_OC.e(TAG, "onAttach"); try { - mContainerActivity = (ContainerActivity) activity; + mContainerActivity = (FileFragment.ContainerActivity) activity; } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + OCFileListFragment.ContainerActivity.class.getSimpleName()); + throw new ClassCastException(activity.toString() + " must implement " + + FileFragment.ContainerActivity.class.getSimpleName()); } } + + @Override + public void onDetach() { + mContainerActivity = null; + super.onDetach(); + } /** * {@inheritDoc} @@@ -134,7 -132,7 +134,7 @@@ mIndexes = savedInstanceState.getIntegerArrayList(KEY_INDEXES); mFirstPositions = savedInstanceState.getIntegerArrayList(KEY_FIRST_POSITIONS); mTops = savedInstanceState.getIntegerArrayList(KEY_TOPS); - mHeightCell = savedInstanceState.getInt(KEY_HEIGHT_CELL); + onCreateLoader(LOADER_ID, null); } else { mIndexes = new ArrayList(); @@@ -152,6 -150,9 +152,6 @@@ registerForContextMenu(getListView()); getListView().setOnCreateContextMenuListener(this); - mHandler = new Handler(); - - } /** @@@ -165,6 -166,7 +165,7 @@@ outState.putIntegerArrayList(KEY_FIRST_POSITIONS, mFirstPositions); outState.putIntegerArrayList(KEY_TOPS, mTops); outState.putInt(KEY_HEIGHT_CELL, mHeightCell); + } /** @@@ -180,7 -182,8 +181,7 @@@ int moveCount = 0; if(mFile != null){ - FileDataStorageManager storageManager = - ((FileActivity)getSherlockActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); String parentPath = null; if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) { @@@ -203,7 -206,7 +204,7 @@@ if (mFile != null) { listDirectory(mFile); - mContainerActivity.startSyncFolderOperation(mFile); + ((FileDisplayActivity)mContainerActivity).startSyncFolderOperation(mFile); // restore index and top position restoreIndexAndTopPosition(); @@@ -270,7 -273,7 +271,7 @@@ @Override public void onItemClick(AdapterView l, View v, int position, long id) { - OCFile file = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance( + OCFile file = mContainerActivity.getStorageManager().createFileInstance( (Cursor) mAdapter.getItem(position)); if (file != null) { if (file.isFolder()) { @@@ -284,19 -287,20 +285,19 @@@ } else { /// Click on a file if (PreviewImageFragment.canBePreviewed(file)) { // preview image - it handles the download, if needed - mContainerActivity.startImagePreview(file); + ((FileDisplayActivity)mContainerActivity).startImagePreview(file); } else if (file.isDown()) { if (PreviewMediaFragment.canBePreviewed(file)) { // media preview - mContainerActivity.startMediaPreview(file, 0, true); + ((FileDisplayActivity)mContainerActivity).startMediaPreview(file, 0, true); } else { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().openFile(file, activity); + ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().openFile(file); } } else { // automatic download, preview on finish - mContainerActivity.startDownloadForPreview(file); + ((FileDisplayActivity)mContainerActivity).startDownloadForPreview(file); } } @@@ -316,7 -320,7 +317,7 @@@ MenuInflater inflater = getSherlockActivity().getMenuInflater(); inflater.inflate(R.menu.file_actions_menu, menu); AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - OCFile targetFile = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance( + OCFile targetFile = mContainerActivity.getStorageManager().createFileInstance( (Cursor) mAdapter.getItem(info.position)); List toHide = new ArrayList(); List toDisable = new ArrayList(); @@@ -402,15 -406,17 +403,15 @@@ @Override public boolean onContextItemSelected (MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - mTargetFile = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance( + mTargetFile = mContainerActivity.getStorageManager().createFileInstance( (Cursor) mAdapter.getItem(info.position)); switch (item.getItemId()) { case R.id.action_share_file: { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity); + mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); return true; } case R.id.action_unshare_file: { - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().unshareFileWithLink(mTargetFile, activity); + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); return true; } case R.id.action_rename_file: { @@@ -444,7 -450,16 +445,7 @@@ return true; } case R.id.action_sync_file: { - Account account = AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()); - RemoteOperation operation = new SynchronizeFileOperation( - mTargetFile, - null, - ((FileActivity)getSherlockActivity()).getStorageManager(), - account, - true, - getSherlockActivity()); - operation.execute(account, getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity()); - ((FileActivity) getSherlockActivity()).showLoadingDialog(); + mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); return true; } case R.id.action_cancel_download: { @@@ -468,17 -483,19 +469,17 @@@ return true; } case R.id.action_see_details: { - ((FileFragment.ContainerActivity)getSherlockActivity()).showDetails(mTargetFile); + mContainerActivity.showDetails(mTargetFile); return true; } case R.id.action_send_file: { // Obtain the file if (!mTargetFile.isDown()) { // Download the file Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); - mContainerActivity.startDownloadForSending(mTargetFile); + ((FileDisplayActivity)mContainerActivity).startDownloadForSending(mTargetFile); } else { - - FileActivity activity = (FileActivity) getSherlockActivity(); - activity.getFileOperationsHelper().sendDownloadedFile(mTargetFile, activity); + ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(mTargetFile); } return true; } @@@ -512,7 -529,7 +513,7 @@@ * @param directory File to be listed */ public void listDirectory(OCFile directory) { - FileDataStorageManager storageManager = ((FileActivity)getSherlockActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager != null) { // Check input parameters for null @@@ -556,6 -573,7 +557,7 @@@ if (storageManager != null) { mAdapter.setStorageManager(storageManager); mCursorLoader.setParentId(parentId); + mCursorLoader.setStorageManager(storageManager); newCursor = mCursorLoader.loadInBackground();//storageManager.getContent(folder.getFileId()); Uri uri = Uri.withAppendedPath( ProviderTableMeta.CONTENT_URI_DIR, @@@ -572,12 -590,63 +574,12 @@@ } - /** - * Interface to implement by any Activity that includes some instance of FileListFragment - * - * @author David A. Velasco - */ - public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener { - - /** - * Callback method invoked when a the user browsed into a different folder through the list of files - * - * @param file - */ - public void onBrowsedDownTo(OCFile folder); - - public void startDownloadForPreview(OCFile file); - - public void startMediaPreview(OCFile file, int i, boolean b); - - public void startImagePreview(OCFile file); - - public void startSyncFolderOperation(OCFile folder); - - /** - * Callback method invoked when a the 'transfer state' of a file changes. - * - * This happens when a download or upload is started or ended for a file. - * - * This method is necessary by now to update the user interface of the double-pane layout in tablets - * because methods {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and {@link FileUploaderBinder#isUploading(Account, OCFile)} - * won't provide the needed response before the method where this is called finishes. - * - * TODO Remove this when the transfer state of a file is kept in the database (other thing TODO) - * - * @param file OCFile which state changed. - * @param downloading Flag signaling if the file is now downloading. - * @param uploading Flag signaling if the file is now uploading. - */ - public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading); - - public void startDownloadForSending(OCFile file); - - } - - @Override public void onDismiss(EditNameDialog dialog) { if (dialog.getResult()) { String newFilename = dialog.getNewFilename(); Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename); - RemoteOperation operation = - new RenameFileOperation( - mTargetFile, - AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), - newFilename, - ((FileActivity)getSherlockActivity()).getStorageManager()); - operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity()); - ((FileActivity) getSherlockActivity()).showLoadingDialog(); + mContainerActivity.getFileOperationsHelper().renameFile(mTargetFile, newFilename); } } @@@ -585,16 -654,22 +587,16 @@@ @Override public void onConfirmation(String callerTag) { if (callerTag.equals(FileDetailFragment.FTAG_CONFIRMATION)) { - FileDataStorageManager storageManager = - ((FileActivity)getSherlockActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager.getFileById(mTargetFile.getFileId()) != null) { - RemoteOperation operation = new RemoveFileOperation( mTargetFile, - true, - storageManager); - operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity()); - - ((FileActivity) getSherlockActivity()).showLoadingDialog(); + mContainerActivity.getFileOperationsHelper().removeFile(mTargetFile, true); } } } @Override public void onNeutral(String callerTag) { - ((FileActivity)getSherlockActivity()).getStorageManager().removeFile(mTargetFile, false, true); // TODO perform in background task / new thread + mContainerActivity.getStorageManager().removeFile(mTargetFile, false, true); // TODO perform in background task / new thread listDirectory(); mContainerActivity.onTransferStateChanged(mTargetFile, false, false); } @@@ -614,9 -689,8 +616,9 @@@ @Override public Loader onCreateLoader(int id, Bundle bundle) { Log_OC.d(TAG, "onCreateLoader start"); - mCursorLoader = new FileListCursorLoader((FileActivity)getSherlockActivity(), - ((FileActivity)getSherlockActivity()).getStorageManager()); + mCursorLoader = new FileListCursorLoader( + getSherlockActivity(), + mContainerActivity.getStorageManager()); if (mFile != null) { mCursorLoader.setParentId(mFile.getFileId()); } else { @@@ -634,7 -708,7 +636,7 @@@ public void onLoadFinished(Loader loader, Cursor cursor) { Log_OC.d(TAG, "onLoadFinished start"); - FileDataStorageManager storageManager = ((FileActivity)getSherlockActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager != null) { mCursorLoader.setStorageManager(storageManager); if (mFile != null) { diff --combined src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 41edc244,90c5c192..eb8af268 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@@ -1,5 -1,5 +1,5 @@@ /* ownCloud Android client application - * Copyright (C) 2012-2013 ownCloud Inc. + * Copyright (C) 2012-2014 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, @@@ -24,21 -24,27 +24,21 @@@ import java.util.List import android.accounts.Account; import android.annotation.SuppressLint; import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Point; -import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Handler; import android.support.v4.app.FragmentStatePagerAdapter; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; -import android.webkit.MimeTypeMap; 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; @@@ -46,6 -52,12 +46,6 @@@ import com.actionbarsherlock.view.MenuI import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.network.WebdavUtils; -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.utils.Log_OC; @@@ -60,8 -72,8 +60,8 @@@ * * @author David A. Velasco */ -public class PreviewImageFragment extends FileFragment implements OnRemoteOperationListener, - ConfirmationDialogFragment.ConfirmationDialogFragmentListener { +public class PreviewImageFragment extends FileFragment implements +ConfirmationDialogFragment.ConfirmationDialogFragmentListener { public static final String EXTRA_FILE = "FILE"; public static final String EXTRA_ACCOUNT = "ACCOUNT"; @@@ -73,12 -85,13 +73,12 @@@ public Bitmap mBitmap = null; - private Handler mHandler; - private RemoteOperation mLastRemoteOperation; - private static final String TAG = PreviewImageFragment.class.getSimpleName(); private boolean mIgnoreFirstSavedState; + private FileFragment.ContainerActivity mContainerActivity; + /** * Creates a fragment to preview an image. @@@ -116,6 -129,7 +116,6 @@@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mHandler = new Handler(); setHasOptionsMenu(true); } @@@ -130,7 -144,7 +130,7 @@@ mView = inflater.inflate(R.layout.preview_image_fragment, container, false); mImageView = (ImageView)mView.findViewById(R.id.image); mImageView.setVisibility(View.GONE); - mView.setOnTouchListener((OnTouchListener)getActivity()); // WATCH OUT THAT CAST + mView.setOnTouchListener((OnTouchListener)getActivity()); mMessageView = (TextView)mView.findViewById(R.id.message); mMessageView.setVisibility(View.GONE); mProgressWheel = (ProgressBar)mView.findViewById(R.id.progressWheel); @@@ -145,10 -159,8 +145,10 @@@ @Override public void onAttach(Activity activity) { super.onAttach(activity); - if (!(activity instanceof FileFragment.ContainerActivity)) - throw new ClassCastException(activity.toString() + " must implement " + FileFragment.ContainerActivity.class.getSimpleName()); + if (!(activity instanceof OnTouchListener)) { + throw new ClassCastException(activity.toString() + + " must implement " + OnTouchListener.class.getSimpleName()); + } } @@@ -161,19 -173,21 +161,21 @@@ if (savedInstanceState != null) { if (!mIgnoreFirstSavedState) { OCFile file = (OCFile)savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE); + setFile(file); mAccount = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_ACCOUNT); - - // Update the file - if (mAccount!= null) { - OCFile updatedFile = mContainerActivity.getStorageManager().getFileByPath(file.getRemotePath()); - if (updatedFile != null) { - setFile(updatedFile); - } else { - setFile(file); - } - } else { - setFile(file); - } + // TODO remove this code: update file no needed + // // Update the file + //// if (mAccount!= null) { -// OCFile updatedFile = ((FileActivity)getSherlockActivity()). -// getStorageManager().getFileByPath(file.getRemotePath()); ++// OCFile updatedFile = ++// mContainerActivity.getStorageManager().getFileByPath(file.getRemotePath()); + // if (updatedFile != null) { + // setFile(updatedFile); + // } else { + // setFile(file); + // } + // } else { + // setFile(file); + // } } else { mIgnoreFirstSavedState = false; @@@ -258,7 -272,8 +260,7 @@@ MenuItem item = menu.findItem(R.id.action_unshare_file); // Options shareLink - OCFile file = ((FileActivity) getSherlockActivity()).getFile(); - if (!file.isShareByLink()) { + if (!getFile().isShareByLink()) { item.setVisible(false); item.setEnabled(false); } else { @@@ -277,11 -292,13 +279,11 @@@ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_share_file: { - FileActivity act = (FileActivity)getSherlockActivity(); - act.getFileOperationsHelper().shareFileWithLink(getFile(), act); + mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile()); return true; } case R.id.action_unshare_file: { - FileActivity act = (FileActivity)getSherlockActivity(); - act.getFileOperationsHelper().unshareFileWithLink(getFile(), act); + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile()); return true; } case R.id.action_open_file_with: { @@@ -297,7 -314,8 +299,7 @@@ return true; } case R.id.action_send_file: { - FileActivity act = (FileActivity)getSherlockActivity(); - act.getFileOperationsHelper().sendDownloadedFile(getFile(), act); + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile()); return true; } @@@ -308,7 -326,7 +310,7 @@@ private void seeDetails() { - ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile()); + mContainerActivity.showDetails(getFile()); } @@@ -335,9 -353,56 +337,9 @@@ /** * Opens the previewed image with an external application. - * - * TODO - improve this; instead of prioritize the actions available for the MIME type in the server, - * we should get a list of available apps for MIME tpye in the server and join it with the list of - * available apps for the MIME type known from the file extension, to let the user choose */ private void openFile() { - OCFile file = getFile(); - String storagePath = file.getStoragePath(); - String encodedStoragePath = WebdavUtils.encodePath(storagePath); - try { - Intent i = new Intent(Intent.ACTION_VIEW); - i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype()); - i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - startActivity(i); - - } catch (Throwable t) { - Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + file.getMimetype()); - boolean toastIt = true; - String mimeType = ""; - try { - Intent i = new Intent(Intent.ACTION_VIEW); - mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1)); - if (mimeType == null || !mimeType.equals(file.getMimetype())) { - if (mimeType != null) { - i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType); - } else { - // desperate try - i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*-/*"); - } - i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - startActivity(i); - toastIt = false; - } - - } catch (IndexOutOfBoundsException e) { - Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath); - - } catch (ActivityNotFoundException e) { - Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension"); - - } catch (Throwable th) { - Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th); - - } finally { - if (toastIt) { - Toast.makeText(getActivity(), "There is no application to handle file " + file.getFileName(), Toast.LENGTH_SHORT).show(); - } - } - - } + mContainerActivity.getFileOperationsHelper().openFile(getFile()); finish(); } @@@ -365,9 -430,15 +367,9 @@@ */ @Override public void onConfirmation(String callerTag) { - FileDataStorageManager storageManager = - ((FileActivity)getSherlockActivity()).getStorageManager(); + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager.getFileById(getFile().getFileId()) != null) { // check that the file is still there; - mLastRemoteOperation = new RemoveFileOperation( getFile(), // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters - true, - storageManager); - mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity()); - - ((FileActivity) getActivity()).showLoadingDialog(); + mContainerActivity.getFileOperationsHelper().removeFile(getFile(), true); } } @@@ -378,7 -449,7 +380,7 @@@ @Override public void onNeutral(String callerTag) { OCFile file = getFile(); - ((FileActivity)getSherlockActivity()).getStorageManager().removeFile(file, false, true); // TODO perform in background task / new thread + mContainerActivity.getStorageManager().removeFile(file, false, true); // TODO perform in background task / new thread finish(); } @@@ -575,6 -646,33 +577,6 @@@ /** - * {@inheritDoc} - */ - @Override - public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - if (operation.equals(mLastRemoteOperation) && operation instanceof RemoveFileOperation) { - onRemoveFileOperationFinish((RemoveFileOperation)operation, result); - } - } - - private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) { - ((FileActivity) getActivity()).dismissLoadingDialog(); - - if (result.isSuccess()) { - Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG); - msg.show(); - finish(); - - } else { - Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); - msg.show(); - if (result.isSslRecoverableException()) { - // TODO show the SSL warning dialog - } - } - } - - /** * Finishes the preview */ private void finish() {