X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7a9149a66ab8caffbec4f0eaf46cd5615e19e1e4..a6afe6efd24d35d02dc9720432a2daa47b58ffdd:/src/com/owncloud/android/ui/activity/FileDisplayActivity.java diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 867e4cfe..da6eb527 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -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, @@ -19,7 +19,12 @@ package com.owncloud.android.ui.activity; import java.io.File; +import java.io.IOException; + import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@ -43,7 +48,7 @@ import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; -//import android.support.v4.content.LocalBroadcastManager; +import android.support.v4.widget.SwipeRefreshLayout; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -61,35 +66,40 @@ import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; -import com.owncloud.android.files.services.FileObserverService; -import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; +import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; -import com.owncloud.android.operations.CreateFolderOperation; - +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.OwnCloudCredentials; +import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; import com.owncloud.android.lib.common.network.CertificateCombinedException; 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.CreateFolderOperation; import com.owncloud.android.operations.CreateShareOperation; +import com.owncloud.android.operations.MoveFileOperation; import com.owncloud.android.operations.RemoveFileOperation; import com.owncloud.android.operations.RenameFileOperation; import com.owncloud.android.operations.SynchronizeFileOperation; import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; -import com.owncloud.android.services.OperationsService; +import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; -import com.owncloud.android.ui.dialog.EditNameDialog; +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; -import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.ui.preview.PreviewImageActivity; +import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewVideoActivity; import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.Log_OC; @@ -101,17 +111,14 @@ import com.owncloud.android.utils.Log_OC; */ public class FileDisplayActivity extends HookActivity implements -OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener, EditNameDialogListener { - +FileFragment.ContainerActivity, OnNavigationListener, +OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener { + private ArrayAdapter mDirectories; private SyncBroadcastReceiver mSyncBroadcastReceiver; private UploadFinishReceiver mUploadFinishReceiver; private DownloadFinishReceiver mDownloadFinishReceiver; - //private OperationsServiceReceiver mOperationsServiceReceiver; - private FileDownloaderBinder mDownloaderBinder = null; - private FileUploaderBinder mUploaderBinder = null; - private ServiceConnection mDownloadConnection = null, mUploadConnection = null; private RemoteOperationResult mLastSslUntrustedServerResult = null; private boolean mDualPane; @@ -120,18 +127,17 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"; - //private static final String KEY_REFRESH_SHARES_IN_PROGRESS = "SHARES_IN_PROGRESS"; private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND"; public static final int DIALOG_SHORT_WAIT = 0; private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1; - //private static final int DIALOG_SSL_VALIDATOR = 2; private static final int DIALOG_CERT_NOT_SAVED = 2; public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS"; private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1; private static final int ACTION_SELECT_MULTIPLE_FILES = 2; + public static final int ACTION_MOVE_FILES = 3; private static final String TAG = FileDisplayActivity.class.getSimpleName(); @@ -141,7 +147,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private OCFile mWaitingToPreview; private boolean mSyncInProgress = false; - //private boolean mRefreshSharesInProgress = false; private String DIALOG_UNTRUSTED_CERT; @@ -154,12 +159,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid - /// bindings to transference services - mUploadConnection = new ListServiceConnection(); - mDownloadConnection = new ListServiceConnection(); - bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE); - bindService(new Intent(this, FileDownloader.class), mDownloadConnection, Context.BIND_AUTO_CREATE); - // PIN CODE request ; best location is to decide, let's try this first if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) { requestPinCode(); @@ -167,22 +166,21 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa requestPinCode(); } - /// file observer - Intent observer_intent = new Intent(this, FileObserverService.class); - observer_intent.putExtra(FileObserverService.KEY_FILE_CMD, FileObserverService.CMD_INIT_OBSERVED_LIST); - startService(observer_intent); - + /// grant that FileObserverService is watching favourite files + if (savedInstanceState == null) { + Intent initObserversIntent = FileObserverService.makeInitIntent(this); + startService(initObserversIntent); + } + /// Load of saved instance state if(savedInstanceState != null) { mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - //mRefreshSharesInProgress = savedInstanceState.getBoolean(KEY_REFRESH_SHARES_IN_PROGRESS); mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND); } else { mWaitingToPreview = null; mSyncInProgress = false; - //mRefreshSharesInProgress = false; mWaitingToSend = null; } @@ -195,11 +193,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa mRightFragmentContainer = findViewById(R.id.right_fragment_container); if (savedInstanceState == null) { createMinFragments(); - } else { - Log_OC.d(TAG, "Init the secondFragment again"); - if (mDualPane) { - initFragmentsWithFile(); - } } // Action bar setup @@ -207,6 +200,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); // always AFTER setContentView(...) ; to work around bug in its implementation + setBackgroundText(); + Log_OC.d(TAG, "onCreate() end"); } @@ -214,16 +209,11 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa protected void onStart() { super.onStart(); getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId()); - refeshListOfFilesFragment(); } @Override protected void onDestroy() { super.onDestroy(); - if (mDownloadConnection != null) - unbindService(mDownloadConnection); - if (mUploadConnection != null) - unbindService(mUploadConnection); } /** @@ -396,7 +386,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa return null; } - protected FileFragment getSecondFragment() { + public FileFragment getSecondFragment() { Fragment second = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT); if (second != null) { return (FileFragment)second; @@ -404,7 +394,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa return null; } - public void cleanSecondFragment() { + protected void cleanSecondFragment() { Fragment second = getSecondFragment(); if (second != null) { FragmentTransaction tr = getSupportFragmentManager().beginTransaction(); @@ -415,7 +405,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa updateNavigationElementsInActionBar(null); } - protected void refeshListOfFilesFragment() { + protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { fileListFragment.listDirectory(); @@ -447,7 +437,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa startMediaPreview(mWaitingToPreview, 0, true); detailsFragmentChanged = true; } else { - getFileOperationsHelper().openFile(mWaitingToPreview, this); + getFileOperationsHelper().openFile(mWaitingToPreview); } } mWaitingToPreview = null; @@ -471,7 +461,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa boolean retval = true; switch (item.getItemId()) { case R.id.action_create_dir: { - EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.uploader_info_dirname), "", -1, -1, this); + CreateFolderDialogFragment dialog = + CreateFolderDialogFragment.newInstance(getCurrentDir()); dialog.show(getSupportFragmentManager(), "createdirdialog"); break; } @@ -563,6 +554,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { requestMultipleUpload(data, resultCode); + } else if (requestCode == ACTION_MOVE_FILES && (resultCode == RESULT_OK || + resultCode == MoveActivity.RESULT_OK_AND_MOVE)){ + requestMoveOperation(data, resultCode); } } @@ -643,6 +637,17 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa startService(i); } + /** + * Request the operation for moving the file/folder from one path to another + * + * @param data Intent received + * @param resultCode Result code received + */ + private void requestMoveOperation(Intent data, int resultCode) { + OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(MoveActivity.EXTRA_CURRENT_FOLDER); + getFileOperationsHelper().moveFile(folderToMoveAt, getCurrentDir()); + } + @Override public void onBackPressed() { OCFileListFragment listOfFiles = getListOfFilesFragment(); @@ -684,11 +689,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa protected void onResume() { super.onResume(); Log_OC.e(TAG, "onResume() start"); + + // refresh list of files + refreshListOfFilesFragment(); // Listen for sync messages IntentFilter syncIntentFilter = new IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START); syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_END); - //syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_SIZE_SYNCED); syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED); syncIntentFilter.addAction(SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED); syncIntentFilter.addAction(SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED); @@ -707,21 +714,12 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa mDownloadFinishReceiver = new DownloadFinishReceiver(); registerReceiver(mDownloadFinishReceiver, downloadIntentFilter); - // Listen for messages from the OperationsService - /* - IntentFilter operationsIntentFilter = new IntentFilter(OperationsService.ACTION_OPERATION_ADDED); - operationsIntentFilter.addAction(OperationsService.ACTION_OPERATION_FINISHED); - mOperationsServiceReceiver = new OperationsServiceReceiver(); - LocalBroadcastManager.getInstance(this).registerReceiver(mOperationsServiceReceiver, operationsIntentFilter); - */ - Log_OC.d(TAG, "onResume() end"); } @Override protected void onPause() { - super.onPause(); Log_OC.e(TAG, "onPause() start"); if (mSyncBroadcastReceiver != null) { unregisterReceiver(mSyncBroadcastReceiver); @@ -736,13 +734,10 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa unregisterReceiver(mDownloadFinishReceiver); mDownloadFinishReceiver = null; } - /* - if (mOperationsServiceReceiver != null) { - LocalBroadcastManager.getInstance(this).unregisterReceiver(mOperationsServiceReceiver); - mOperationsServiceReceiver = null; - } - */ + + Log_OC.d(TAG, "onPause() end"); + super.onPause(); } @@ -762,23 +757,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } case DIALOG_CHOOSE_UPLOAD_SOURCE: { - String[] items = null; String[] allTheItems = { getString(R.string.actionbar_upload_files), - getString(R.string.actionbar_upload_from_apps), - getString(R.string.actionbar_failed_instant_upload) }; - - String[] commonItems = { getString(R.string.actionbar_upload_files), getString(R.string.actionbar_upload_from_apps) }; - if (InstantUploadActivity.IS_ENABLED) - items = allTheItems; - else - items = commonItems; - builder = new AlertDialog.Builder(this); builder.setTitle(R.string.actionbar_upload); - builder.setItems(items, new DialogInterface.OnClickListener() { + builder.setItems(allTheItems, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { if (item == 0) { // if (!mDualPane) { @@ -794,10 +779,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)), ACTION_SELECT_CONTENT_FROM_APPS); - } else if (item == 2 && InstantUploadActivity.IS_ENABLED) { - Intent action = new Intent(FileDisplayActivity.this, InstantUploadActivity.class); - action.putExtra(FileUploader.KEY_ACCOUNT, FileDisplayActivity.this.getAccount()); - startActivity(action); } } }); @@ -939,7 +920,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa cleanSecondFragment(); currentFile = currentDir; } - + if (synchFolderRemotePath != null && currentDir.getRemotePath().equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { @@ -951,23 +932,57 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event)); - /* - if (synchResult != null && - synchResult.isSuccess() && - (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) || - FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED.equals(event) - ) && - !mRefreshSharesInProgress && - getFileOperationsHelper().isSharedSupported(FileDisplayActivity.this) - ) { - startGetShares(); - } - */ + if (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED. + equals(event) && + /// TODO refactor and make common + synchResult != null && !synchResult.isSuccess() && + (synchResult.getCode() == ResultCode.UNAUTHORIZED || + synchResult.isIdPRedirection() || + (synchResult.isException() && synchResult.getException() + instanceof AuthenticatorException))) { + + OwnCloudClient client = null; + try { + OwnCloudAccount ocAccount = + new OwnCloudAccount(getAccount(), context); + client = (OwnCloudClientManagerFactory.getDefaultSingleton(). + removeClientFor(ocAccount)); + // TODO get rid of these exceptions + } catch (AccountNotFoundException e) { + e.printStackTrace(); + } catch (AuthenticatorException e) { + e.printStackTrace(); + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (client != null) { + OwnCloudCredentials cred = client.getCredentials(); + if (cred != null) { + AccountManager am = AccountManager.get(context); + if (cred.authTokenExpires()) { + am.invalidateAuthToken( + getAccount().type, + cred.getAuthToken() + ); + } else { + am.clearPassword(getAccount()); + } + } + } + + requestCredentialsUpdate(); } - removeStickyBroadcast(intent); - Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress); - setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); + } + removeStickyBroadcast(intent); + Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress); + setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); + + setBackgroundText(); + } if (synchResult != null) { @@ -983,7 +998,27 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } } + /** + * Show a text message on screen view for notifying user if content is + * loading or folder is empty + */ + private void setBackgroundText() { + OCFileListFragment ocFileListFragment = getListOfFilesFragment(); + if (ocFileListFragment != null) { + int message = R.string.file_list_loading; + if (!mSyncInProgress) { + // In case file list is empty + message = R.string.file_list_empty; + } + ocFileListFragment.setMessageForEmptyList(getString(message)); + } else { + Log.e(TAG, "OCFileListFragment is null"); + } + } + /** + * Once the file upload has finished -> update view + */ private class UploadFinishReceiver extends BroadcastReceiver { /** * Once the file upload has finished -> update view @@ -992,16 +1027,61 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa */ @Override public void onReceive(Context context, Intent intent) { - String uploadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH); - String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME); - boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name); - OCFile currentDir = getCurrentDir(); - boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) && (uploadedRemotePath.startsWith(currentDir.getRemotePath())); - if (sameAccount && isDescendant) { - refeshListOfFilesFragment(); + try { + String uploadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH); + String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME); + boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name); + OCFile currentDir = getCurrentDir(); + boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) && + (uploadedRemotePath.startsWith(currentDir.getRemotePath())); + + if (sameAccount && isDescendant) { + refreshListOfFilesFragment(); + } + + boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false); + boolean renamedInUpload = getFile().getRemotePath(). + equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH)); + boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) || + renamedInUpload; + FileFragment details = getSecondFragment(); + boolean detailFragmentIsShown = (details != null && + details instanceof FileDetailFragment); + + if (sameAccount && sameFile && detailFragmentIsShown) { + if (uploadWasFine) { + setFile(getStorageManager().getFileByPath(uploadedRemotePath)); + } + if (renamedInUpload) { + String newName = (new File(uploadedRemotePath)).getName(); + Toast msg = Toast.makeText( + context, + String.format( + getString(R.string.filedetails_renamed_in_upload_msg), + newName), + Toast.LENGTH_LONG); + msg.show(); + } + if (uploadWasFine || getFile().fileExists()) { + ((FileDetailFragment)details).updateFileDetails(false, true); + } else { + cleanSecondFragment(); + } + + // Force the preview if the file is an image + if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) { + startImagePreview(getFile()); + } // TODO what about other kind of previews? + } + + } finally { + if (intent != null) { + removeStickyBroadcast(intent); + } } + } - + } @@ -1014,23 +1094,28 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private class DownloadFinishReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - boolean sameAccount = isSameAccount(context, intent); - String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH); - boolean isDescendant = isDescendant(downloadedRemotePath); - - if (sameAccount && isDescendant) { - refeshListOfFilesFragment(); - refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)); - } - - if (mWaitingToSend != null) { - mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send - if (mWaitingToSend.isDown()) { - sendDownloadedFile(); + try { + boolean sameAccount = isSameAccount(context, intent); + String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH); + boolean isDescendant = isDescendant(downloadedRemotePath); + + if (sameAccount && isDescendant) { + refreshListOfFilesFragment(); + refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)); + } + + if (mWaitingToSend != null) { + mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send + if (mWaitingToSend.isDown()) { + sendDownloadedFile(); + } } - } - removeStickyBroadcast(intent); + } finally { + if (intent != null) { + removeStickyBroadcast(intent); + } + } } private boolean isDescendant(String downloadedRemotePath) { @@ -1045,44 +1130,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } - /** - * Class waiting for broadcast events from the {@link OperationsService}. - * - * Updates the list of files when a get for shares is finished; at this moment the refresh of shares is the only - * operation performed in {@link OperationsService}. - * - * In the future will handle the progress or finalization of all the operations performed in {@link OperationsService}, - * probably all the operations associated to the app model. - */ - private class OperationsServiceReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - if (OperationsService.ACTION_OPERATION_ADDED.equals(intent.getAction())) { - - } else if (OperationsService.ACTION_OPERATION_FINISHED.equals(intent.getAction())) { - //mRefreshSharesInProgress = false; - - Account account = intent.getParcelableExtra(OperationsService.EXTRA_ACCOUNT); - RemoteOperationResult getSharesResult = (RemoteOperationResult)intent.getSerializableExtra(OperationsService.EXTRA_RESULT); - if (getAccount() != null && account.name.equals(getAccount().name) - && getStorageManager() != null - ) { - refeshListOfFilesFragment(); - } - if ((getSharesResult != null) && - RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED.equals(getSharesResult.getCode())) { - mLastSslUntrustedServerResult = getSharesResult; - showUntrustedCertDialog(mLastSslUntrustedServerResult); - } - - //setSupportProgressBarIndeterminateVisibility(mRefreshSharesInProgress || mSyncInProgress); - } - - } - - } - public void browseToRoot() { OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { // should never be null, indeed @@ -1131,54 +1178,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } /** - * Opens the image gallery showing the image {@link OCFile} received as parameter. - * - * @param file Image {@link OCFile} to show. - */ - @Override - public void startImagePreview(OCFile file) { - Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); - showDetailsIntent.putExtra(EXTRA_FILE, file); - showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount()); - startActivity(showDetailsIntent); - } - - /** - * Stars the preview of an already down media {@link OCFile}. - * - * @param file Media {@link OCFile} to preview. - * @param startPlaybackPosition Media position where the playback will be started, in milliseconds. - * @param autoplay When 'true', the playback will start without user interactions. - */ - @Override - public void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay) { - Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay); - setSecondFragment(mediaFragment); - updateFragmentsVisibility(true); - updateNavigationElementsInActionBar(file); - setFile(file); - } - - /** - * Requests the download of the received {@link OCFile} , updates the UI - * to monitor the download progress and prepares the activity to preview - * or open the file when the download finishes. - * - * @param file {@link OCFile} to download and preview. - */ - @Override - public void startDownloadForPreview(OCFile file) { - Fragment detailFragment = new FileDetailFragment(file, getAccount()); - setSecondFragment(detailFragment); - mWaitingToPreview = file; - requestForDownload(); - updateFragmentsVisibility(true); - updateNavigationElementsInActionBar(file); - setFile(file); - } - - - /** * Shows the information of the {@link OCFile} received as a * parameter in the second fragment. * @@ -1220,34 +1219,11 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } - /** - * {@inheritDoc} - */ - @Override - public void onFileStateChanged() { - refeshListOfFilesFragment(); - updateNavigationElementsInActionBar(getSecondFragment().getFile()); - } - - - /** - * {@inheritDoc} - */ - @Override - public FileDownloaderBinder getFileDownloaderBinder() { - return mDownloaderBinder; - } - - - /** - * {@inheritDoc} - */ @Override - public FileUploaderBinder getFileUploaderBinder() { - return mUploaderBinder; + protected ServiceConnection newTransferenceServiceConnection() { + return new ListServiceConnection(); } - /** Defines callbacks for service binding, passed to bindService() */ private class ListServiceConnection implements ServiceConnection { @@ -1256,8 +1232,12 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa if (component.equals(new ComponentName(FileDisplayActivity.this, FileDownloader.class))) { Log_OC.d(TAG, "Download service connected"); mDownloaderBinder = (FileDownloaderBinder) service; - if (mWaitingToPreview != null) { - requestForDownload(); + if (mWaitingToPreview != null) + if (getStorageManager() != null) { + mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); // update the file + if (!mWaitingToPreview.isDown()) { + requestForDownload(); + } } } else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) { @@ -1353,7 +1333,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } else if (operation instanceof UnshareLinkOperation) { onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result); - } + } else if (operation instanceof MoveFileOperation) { + onMoveFileOperationFinish((MoveFileOperation)operation, result); + } } @@ -1361,7 +1343,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { if (result.isSuccess()) { refreshShowDetails(); - refeshListOfFilesFragment(); + refreshListOfFilesFragment(); } } @@ -1369,10 +1351,11 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) { if (result.isSuccess()) { refreshShowDetails(); - refeshListOfFilesFragment(); + refreshListOfFilesFragment(); + } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { cleanSecondFragment(); - refeshListOfFilesFragment(); + refreshListOfFilesFragment(); } } @@ -1402,53 +1385,56 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa */ private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) { dismissLoadingDialog(); + + Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + msg.show(); + if (result.isSuccess()) { - Toast msg = Toast.makeText(this, R.string.remove_success_msg, Toast.LENGTH_LONG); - msg.show(); OCFile removedFile = operation.getFile(); - getSecondFragment(); FileFragment second = getSecondFragment(); if (second != null && removedFile.equals(second.getFile())) { + if (second instanceof PreviewMediaFragment) { + ((PreviewMediaFragment)second).stopPreview(true); + } + setFile(getStorageManager().getFileById(removedFile.getParentId())); cleanSecondFragment(); } if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) { - refeshListOfFilesFragment(); + refreshListOfFilesFragment(); } - + invalidateOptionsMenu(); } else { - Toast msg = Toast.makeText(this, R.string.remove_fail_msg, Toast.LENGTH_LONG); - msg.show(); if (result.isSslRecoverableException()) { mLastSslUntrustedServerResult = result; showUntrustedCertDialog(mLastSslUntrustedServerResult); } } } - + + /** - * Updates the view associated to the activity after the finish of an operation trying create a new folder + * Updates the view associated to the activity after the finish of an operation trying to move a + * file. * - * @param operation Creation operation performed. - * @param result Result of the creation. + * @param operation Move operation performed. + * @param result Result of the move operation. */ - private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) { + private void onMoveFileOperationFinish(MoveFileOperation operation, RemoteOperationResult result) { if (result.isSuccess()) { dismissLoadingDialog(); - refeshListOfFilesFragment(); - + refreshListOfFilesFragment(); } else { dismissLoadingDialog(); - if (result.getCode() == ResultCode.INVALID_CHARACTER_IN_NAME) { - Toast.makeText(FileDisplayActivity.this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG).show(); - } else { try { - Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG); + Toast msg = Toast.makeText(FileDisplayActivity.this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); msg.show(); } catch (NotFoundException e) { Log_OC.e(TAG, "Error while trying to show fail message " , e); } - } } } @@ -1464,36 +1450,39 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa dismissLoadingDialog(); OCFile renamedFile = operation.getFile(); if (result.isSuccess()) { - if (mDualPane) { - FileFragment details = getSecondFragment(); - if (details != null && details instanceof FileDetailFragment && renamedFile.equals(details.getFile()) ) { + FileFragment details = getSecondFragment(); + if (details != null) { + if (details instanceof FileDetailFragment && renamedFile.equals(details.getFile()) ) { ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount()); + showDetails(renamedFile); + + } else if (details instanceof PreviewMediaFragment && renamedFile.equals(details.getFile())) { + ((PreviewMediaFragment) details).updateFile(renamedFile); + if (PreviewMediaFragment.canBePreviewed(renamedFile)) { + int position = ((PreviewMediaFragment)details).getPosition(); + startMediaPreview(renamedFile, position, true); + } else { + getFileOperationsHelper().openFile(renamedFile); + } } } + if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) { - refeshListOfFilesFragment(); + refreshListOfFilesFragment(); } } else { - if (result.getCode().equals(ResultCode.INVALID_LOCAL_FILE_NAME)) { - Toast msg = Toast.makeText(this, 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(this, R.string.filename_forbidden_characters, Toast.LENGTH_LONG); - msg.show(); - } else { - Toast msg = Toast.makeText(this, R.string.rename_server_fail_msg, Toast.LENGTH_LONG); - msg.show(); - if (result.isSslRecoverableException()) { - mLastSslUntrustedServerResult = result; - showUntrustedCertDialog(mLastSslUntrustedServerResult); - } + Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + msg.show(); + + if (result.isSslRecoverableException()) { + mLastSslUntrustedServerResult = result; + showUntrustedCertDialog(mLastSslUntrustedServerResult); } } } - private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) { dismissLoadingDialog(); OCFile syncedFile = operation.getLocalFile(); @@ -1505,57 +1494,63 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa startActivity(i); } - + } else { if (operation.transferWasRequested()) { - refeshListOfFilesFragment(); onTransferStateChanged(syncedFile, true, true); - + } else { - Toast msg = Toast.makeText(this, R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG); + Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); msg.show(); } } } + /** + * Updates the view associated to the activity after the finish of an operation trying create a new folder + * + * @param operation Creation operation performed. + * @param result Result of the creation. + */ + private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) { + if (result.isSuccess()) { + dismissLoadingDialog(); + refreshListOfFilesFragment(); + } else { + dismissLoadingDialog(); + try { + Toast msg = Toast.makeText(FileDisplayActivity.this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + msg.show(); + + } catch (NotFoundException e) { + Log_OC.e(TAG, "Error while trying to show fail message " , e); + } + } + } + /** * {@inheritDoc} */ @Override public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { - if (mDualPane) { - FileFragment details = getSecondFragment(); - if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile()) ) { - if (downloading || uploading) { - ((FileDetailFragment)details).updateFileDetails(file, getAccount()); + refreshListOfFilesFragment(); + FileFragment details = getSecondFragment(); + if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile()) ) { + if (downloading || uploading) { + ((FileDetailFragment)details).updateFileDetails(file, getAccount()); + } else { + if (!file.fileExists()) { + cleanSecondFragment(); } else { ((FileDetailFragment)details).updateFileDetails(false, true); } } } - } - - - public void onDismiss(EditNameDialog dialog) { - if (dialog.getResult()) { - String newDirectoryName = dialog.getNewFilename().trim(); - Log_OC.d(TAG, "'create directory' dialog dismissed with new name " + newDirectoryName); - if (newDirectoryName.length() > 0) { - String path = getCurrentDir().getRemotePath(); - - // Create directory - path += newDirectoryName + OCFile.PATH_SEPARATOR; - RemoteOperation operation = new CreateFolderOperation(path, false, getStorageManager()); - operation.execute( getAccount(), - FileDisplayActivity.this, - FileDisplayActivity.this, - getHandler(), - FileDisplayActivity.this); - - showLoadingDialog(); - } - } + } @@ -1592,27 +1587,18 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa RemoteOperation synchFolderOp = new SynchronizeFolderOperation( folder, currentSyncTime, false, - getFileOperationsHelper().isSharedSupported(this), + getFileOperationsHelper().isSharedSupported(), getStorageManager(), getAccount(), getApplicationContext() ); - synchFolderOp.execute(getAccount(), this, null, null, this); + synchFolderOp.execute(getAccount(), this, null, null); setSupportProgressBarIndeterminateVisibility(true); - } - /* - private void startGetShares() { - // Get shared files/folders - Intent intent = new Intent(this, OperationsService.class); - intent.putExtra(OperationsService.EXTRA_ACCOUNT, getAccount()); - startService(intent); - - mRefreshSharesInProgress = true; + setBackgroundText(); } - */ - + /** * Show untrusted cert dialog */ @@ -1624,6 +1610,22 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa dialog.show(ft, DIALOG_UNTRUSTED_CERT); } + private void requestForDownload(OCFile file) { + Account account = getAccount(); + if (!mDownloaderBinder.isDownloading(account, file)) { + Intent i = new Intent(this, FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); + i.putExtra(FileDownloader.EXTRA_FILE, file); + startService(i); + } + } + + private void sendDownloadedFile(){ + getFileOperationsHelper().sendDownloadedFile(mWaitingToSend); + mWaitingToSend = null; + } + + /** * Requests the download of the received {@link OCFile} , updates the UI * to monitor the download progress and prepares the activity to send the file @@ -1631,7 +1633,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa * * @param file {@link OCFile} to download and preview. */ - @Override public void startDownloadForSending(OCFile file) { mWaitingToSend = file; requestForDownload(mWaitingToSend); @@ -1639,19 +1640,76 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa updateFragmentsVisibility(hasSecondFragment); } - private void requestForDownload(OCFile file) { - Account account = getAccount(); - if (!mDownloaderBinder.isDownloading(account, file)) { - Intent i = new Intent(this, FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, account); - i.putExtra(FileDownloader.EXTRA_FILE, file); - startService(i); + /** + * Opens the image gallery showing the image {@link OCFile} received as parameter. + * + * @param file Image {@link OCFile} to show. + */ + public void startImagePreview(OCFile file) { + Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); + showDetailsIntent.putExtra(EXTRA_FILE, file); + showDetailsIntent.putExtra(EXTRA_ACCOUNT, getAccount()); + startActivity(showDetailsIntent); + + } + + /** + * Stars the preview of an already down media {@link OCFile}. + * + * @param file Media {@link OCFile} to preview. + * @param startPlaybackPosition Media position where the playback will be started, in milliseconds. + * @param autoplay When 'true', the playback will start without user interactions. + */ + public void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay) { + Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay); + setSecondFragment(mediaFragment); + updateFragmentsVisibility(true); + updateNavigationElementsInActionBar(file); + setFile(file); + } + + /** + * Requests the download of the received {@link OCFile} , updates the UI + * to monitor the download progress and prepares the activity to preview + * or open the file when the download finishes. + * + * @param file {@link OCFile} to download and preview. + */ + public void startDownloadForPreview(OCFile file) { + Fragment detailFragment = new FileDetailFragment(file, getAccount()); + setSecondFragment(detailFragment); + mWaitingToPreview = file; + requestForDownload(); + updateFragmentsVisibility(true); + updateNavigationElementsInActionBar(file); + setFile(file); + } + + + public void cancelTransference(OCFile file) { + getFileOperationsHelper().cancelTransference(file); + if (mWaitingToPreview != null && + mWaitingToPreview.getRemotePath().equals(file.getRemotePath())) { + mWaitingToPreview = null; + } + if (mWaitingToSend != null && + mWaitingToSend.getRemotePath().equals(file.getRemotePath())) { + mWaitingToSend = null; } + onTransferStateChanged(file, false, false); } - - private void sendDownloadedFile(){ - getFileOperationsHelper().sendDownloadedFile(mWaitingToSend, this); - mWaitingToSend = null; + + @Override + public void onRefresh() { + OCFileListFragment listOfFiles = getListOfFilesFragment(); + if (listOfFiles != null) { + OCFile folder = listOfFiles.getCurrentFile(); + if (folder != null) { + /*mFile = mContainerActivity.getStorageManager().getFileById(mFile.getFileId()); + listDirectory(mFile);*/ + startSyncFolderOperation(folder); + } + } } - + }