X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/bea36f23b0a22070891f534fa9007d0548d04e37..8fa5936eb04ebf9bb06e3dac6e21983c55a96fbc:/src/com/owncloud/android/ui/activity/FileActivity.java diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index a19a362b..7f48b9e6 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -1,6 +1,9 @@ -/* ownCloud Android client application +/** + * ownCloud Android client application + * + * @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, @@ -22,6 +25,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; +import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.ComponentName; import android.content.Context; @@ -39,6 +43,7 @@ import com.actionbarsherlock.app.SherlockFragmentActivity; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileOperationsHelper; @@ -50,31 +55,37 @@ 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.lib.common.utils.Log_OC; import com.owncloud.android.operations.CreateShareOperation; +import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; - import com.owncloud.android.services.OperationsService; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.LoadingDialog; -import com.owncloud.android.utils.Log_OC; +import com.owncloud.android.ui.dialog.SharePasswordDialogFragment; +import com.owncloud.android.utils.ErrorMessageAdapter; /** * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud {@link Account}s . - * - * @author David A. Velasco */ -public class FileActivity extends SherlockFragmentActivity -implements OnRemoteOperationListener, ComponentsGetter { +public class FileActivity extends SherlockFragmentActivity + implements OnRemoteOperationListener, ComponentsGetter { public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE"; public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT"; public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW"; - public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; + public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; public static final String TAG = FileActivity.class.getSimpleName(); private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; + private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID"; + private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD"; + private static final String KEY_TRY_SHARE_AGAIN = "TRY_SHARE_AGAIN"; + + protected static final long DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS = 200; /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */ @@ -110,6 +121,8 @@ implements OnRemoteOperationListener, ComponentsGetter { protected FileDownloaderBinder mDownloaderBinder = null; protected FileUploaderBinder mUploaderBinder = null; private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null; + + private boolean mTryShareAgain = false; /** @@ -129,6 +142,10 @@ implements OnRemoteOperationListener, ComponentsGetter { account = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT); mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE); mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION); + mFileOperationsHelper.setOpIdWaitingFor( + savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE) + ); + mTryShareAgain = savedInstanceState.getBoolean(KEY_TRY_SHARE_AGAIN); } else { account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT); mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE); @@ -148,7 +165,7 @@ implements OnRemoteOperationListener, ComponentsGetter { if (mUploadServiceConnection != null) { bindService(new Intent(this, FileUploader.class), mUploadServiceConnection, Context.BIND_AUTO_CREATE); } - + } @@ -174,26 +191,31 @@ implements OnRemoteOperationListener, ComponentsGetter { if (mAccountWasSet) { onAccountSet(mAccountWasRestored); } + } + + @Override + protected void onResume() { + super.onResume(); + if (mOperationsServiceBinder != null) { - mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler); + doOnResumeAndBound(); } + } - - @Override - protected void onStop() { - + @Override + protected void onPause() { + if (mOperationsServiceBinder != null) { mOperationsServiceBinder.removeOperationListener(this); } - super.onStop(); + super.onPause(); } @Override protected void onDestroy() { - super.onDestroy(); if (mOperationsServiceConnection != null) { unbindService(mOperationsServiceConnection); mOperationsServiceBinder = null; @@ -206,6 +228,8 @@ implements OnRemoteOperationListener, ComponentsGetter { unbindService(mUploadServiceConnection); mUploadServiceConnection = null; } + + super.onDestroy(); } @@ -240,8 +264,6 @@ implements OnRemoteOperationListener, ComponentsGetter { * to create a new ownCloud {@link Account}. * * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}. - * - * @return 'True' if the checked {@link Account} was valid. */ private void swapToDefaultAccount() { // default to the most recently used account @@ -285,6 +307,8 @@ implements OnRemoteOperationListener, ComponentsGetter { outState.putParcelable(FileActivity.EXTRA_FILE, mFile); outState.putParcelable(FileActivity.EXTRA_ACCOUNT, mAccount); outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification); + outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor()); + outState.putBoolean(KEY_TRY_SHARE_AGAIN, mTryShareAgain); } @@ -330,7 +354,14 @@ implements OnRemoteOperationListener, ComponentsGetter { protected boolean isRedirectingToSetupAccount() { return mRedirectingToSetupAccount; } - + + public boolean isTryShareAgain(){ + return mTryShareAgain; + } + + public void setTryShareAgain(boolean tryShareAgain) { + mTryShareAgain = tryShareAgain; + } public OperationsServiceBinder getOperationsServiceBinder() { return mOperationsServiceBinder; @@ -339,15 +370,12 @@ implements OnRemoteOperationListener, ComponentsGetter { protected ServiceConnection newTransferenceServiceConnection() { return null; } - /** * Helper class handling a callback from the {@link AccountManager} after the creation of * a new ownCloud {@link Account} finished, successfully or not. * * At this moment, only called after the creation of the first account. - * - * @author David A. Velasco */ public class AccountCreationCallback implements AccountManagerCallback { @@ -424,31 +452,80 @@ implements OnRemoteOperationListener, ComponentsGetter { @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities "); - if (operation instanceof CreateShareOperation) { + + mFileOperationsHelper.setOpIdWaitingFor(Long.MAX_VALUE); + + if (!result.isSuccess() && ( + result.getCode() == ResultCode.UNAUTHORIZED || + result.isIdPRedirection() || + (result.isException() && result.getException() instanceof AuthenticatorException) + )) { + + requestCredentialsUpdate(); + + if (result.getCode() == ResultCode.UNAUTHORIZED) { + dismissLoadingDialog(); + Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, + operation, getResources()), + Toast.LENGTH_LONG); + t.show(); + } + mTryShareAgain = false; + + } else if (operation instanceof CreateShareOperation) { onCreateShareOperationFinish((CreateShareOperation) operation, result); } else if (operation instanceof UnshareLinkOperation) { onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result); - } + } else if (operation instanceof SynchronizeFolderOperation) { + onSynchronizeFolderOperationFinish((SynchronizeFolderOperation)operation, result); + + } + } + + protected void requestCredentialsUpdate() { + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); + updateAccountCredentials.putExtra( + AuthenticatorActivity.EXTRA_ACTION, + AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); + updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + startActivity(updateAccountCredentials); } + - private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { + private void onCreateShareOperationFinish(CreateShareOperation operation, + RemoteOperationResult result) { dismissLoadingDialog(); if (result.isSuccess()) { + mTryShareAgain = false; updateFileFromDB(); Intent sendIntent = operation.getSendIntent(); startActivity(sendIntent); - - } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND - Toast t = Toast.makeText(this, getString(R.string.share_link_file_no_exist), Toast.LENGTH_LONG); + } else { + // Detect Failure (403) --> needs Password + if (result.getCode() == ResultCode.SHARE_FORBIDDEN) { + if (!isTryShareAgain()) { + SharePasswordDialogFragment dialog = + SharePasswordDialogFragment.newInstance(new OCFile(operation.getPath()), + operation.getSendIntent()); + dialog.show(getSupportFragmentManager(), DIALOG_SHARE_PASSWORD); + } else { + Toast t = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + t.show(); + mTryShareAgain = false; + } + } else { + Toast t = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); t.show(); - } else { // Generic error - // Show a Message, operation finished without success - Toast t = Toast.makeText(this, getString(R.string.share_link_file_error), Toast.LENGTH_LONG); - t.show(); - } + } + } } @@ -458,23 +535,27 @@ implements OnRemoteOperationListener, ComponentsGetter { if (result.isSuccess()){ updateFileFromDB(); - } else if (result.getCode() == ResultCode.SHARE_NOT_FOUND) { // Error --> SHARE_NOT_FOUND - Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_no_exist), Toast.LENGTH_LONG); + } else { + Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); t.show(); - } else { // Generic error - // Show a Message, operation finished without success - Toast t = Toast.makeText(this, getString(R.string.unshare_link_file_error), Toast.LENGTH_LONG); + } + } + + private void onSynchronizeFolderOperationFinish(SynchronizeFolderOperation operation, RemoteOperationResult result) { + if (!result.isSuccess() && result.getCode() != ResultCode.CANCELLED){ + Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); t.show(); } - } - - private void updateFileFromDB(){ - OCFile file = getStorageManager().getFileByPath(getFile().getRemotePath()); - if (file != null) { - setFile(file); - } + protected void updateFileFromDB(){ + OCFile file = getFile(); + if (file != null) { + file = getStorageManager().getFileByPath(file.getRemotePath()); + setFile(file); + } } /** @@ -502,6 +583,18 @@ implements OnRemoteOperationListener, ComponentsGetter { } + private void doOnResumeAndBound() { + mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler); + long waitingForOpId = mFileOperationsHelper.getOpIdWaitingFor(); + if (waitingForOpId <= Integer.MAX_VALUE) { + boolean wait = mOperationsServiceBinder.dispatchResultIfFinished((int)waitingForOpId, this); + if (!wait ) { + dismissLoadingDialog(); + } + } + } + + /** * Implements callback methods for service binding. Passed as a parameter to { */ @@ -512,10 +605,10 @@ implements OnRemoteOperationListener, ComponentsGetter { if (component.equals(new ComponentName(FileActivity.this, OperationsService.class))) { Log_OC.d(TAG, "Operations service connected"); mOperationsServiceBinder = (OperationsServiceBinder) service; - mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler); - if (!mOperationsServiceBinder.isPerformingBlockingOperation()) { + /*if (!mOperationsServiceBinder.isPerformingBlockingOperation()) { dismissLoadingDialog(); - } + }*/ + doOnResumeAndBound(); } else { return; @@ -543,7 +636,7 @@ implements OnRemoteOperationListener, ComponentsGetter { @Override public FileUploaderBinder getFileUploaderBinder() { return mUploaderBinder; - }; + } }