Redirect app to login screen when any operation started from a foreground component...
authorDavid A. Velasco <dvelasco@solidgear.es>
Thu, 17 Jan 2013 15:03:59 +0000 (16:03 +0100)
committerDavid A. Velasco <dvelasco@solidgear.es>
Thu, 17 Jan 2013 15:03:59 +0000 (16:03 +0100)
src/com/owncloud/android/operations/RemoteOperation.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

index 6917cb1..79e53a9 100644 (file)
@@ -19,9 +19,15 @@ package com.owncloud.android.operations;
 
 import java.io.IOException;
 
 
 import java.io.IOException;
 
+import org.apache.commons.httpclient.Credentials;
+
+import com.owncloud.android.authenticator.AccountAuthenticator;
+import com.owncloud.android.network.BearerCredentials;
 import com.owncloud.android.network.OwnCloudClientUtils;
 import com.owncloud.android.network.OwnCloudClientUtils;
+import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
 
 import android.accounts.Account;
 
 import android.accounts.Account;
+import android.accounts.AccountManager;
 import android.accounts.AccountsException;
 import android.app.Activity;
 import android.content.Context;
 import android.accounts.AccountsException;
 import android.app.Activity;
 import android.content.Context;
@@ -203,34 +209,52 @@ public abstract class RemoteOperation implements Runnable {
         * Asynchronous execution of the operation 
         * started by {@link RemoteOperation#execute(WebdavClient, OnRemoteOperationListener, Handler)}, 
         * and result posting.
         * Asynchronous execution of the operation 
         * started by {@link RemoteOperation#execute(WebdavClient, OnRemoteOperationListener, Handler)}, 
         * and result posting.
+        * 
+        * TODO refactor && clean the code; now it's a mess
         */
     @Override
     public final void run() {
         RemoteOperationResult result = null;
         */
     @Override
     public final void run() {
         RemoteOperationResult result = null;
-        try{
-            if (mClient == null) {
-                if (mAccount != null && mContext != null) {
-                    if (mCallerActivity != null) {
-                        mClient = OwnCloudClientUtils.createOwnCloudClient(mAccount, mContext, mCallerActivity);
+        boolean repeat = false;
+        do {
+            try{
+                if (mClient == null) {
+                    if (mAccount != null && mContext != null) {
+                        if (mCallerActivity != null) {
+                            mClient = OwnCloudClientUtils.createOwnCloudClient(mAccount, mContext, mCallerActivity);
+                        } else {
+                            mClient = OwnCloudClientUtils.createOwnCloudClient(mAccount, mContext);
+                        }
                     } else {
                     } else {
-                        mClient = OwnCloudClientUtils.createOwnCloudClient(mAccount, mContext);
+                        throw new IllegalStateException("Trying to run a remote operation asynchronously with no client instance or account");
                     }
                     }
-                } else {
-                    throw new IllegalStateException("Trying to run a remote operation asynchronously with no client instance or account");
                 }
                 }
-            }
             
             
-        } catch (IOException e) {
-            Log.e(TAG, "Error while trying to access to " + mAccount.name, new AccountsException("I/O exception while trying to authorize the account", e));
-            result = new RemoteOperationResult(e);
+            } catch (IOException e) {
+                Log.e(TAG, "Error while trying to access to " + mAccount.name, new AccountsException("I/O exception while trying to authorize the account", e));
+                result = new RemoteOperationResult(e);
             
             
-        } catch (AccountsException e) {
-            Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
-            result = new RemoteOperationResult(e);
-        }
+            } catch (AccountsException e) {
+                Log.e(TAG, "Error while trying to access to " + mAccount.name, e);
+                result = new RemoteOperationResult(e);
+            }
        
        
-        if (result == null)
-            result = run(mClient);
+            if (result == null)
+                result = run(mClient);
+        
+            repeat = false;
+            if (mCallerActivity != null && mAccount != null && mContext != null && !result.isSuccess() && result.getCode() == ResultCode.UNAUTHORIZED) {
+                AccountManager am = AccountManager.get(mContext);
+                Credentials cred = mClient.getCredentials();
+                if (cred instanceof BearerCredentials) {
+                    am.invalidateAuthToken(AccountAuthenticator.ACCOUNT_TYPE, ((BearerCredentials)cred).getAccessToken());
+                } else {
+                    am.clearPassword(mAccount);
+                }
+                mClient = null;
+                repeat = true;
+            }
+        } while (repeat);
         
         final RemoteOperationResult resultToSend = result;
         if (mListenerHandler != null && mListener != null) {
         
         final RemoteOperationResult resultToSend = result;
         if (mListenerHandler != null && mListener != null) {
index f6c25e2..5595583 100644 (file)
@@ -933,28 +933,14 @@ public class FileDetailFragment extends SherlockFragment implements
      */\r
     @Override\r
     public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {\r
      */\r
     @Override\r
     public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {\r
-        if (!result.isSuccess() && result.getCode() == ResultCode.UNAUTHORIZED) {\r
-            AccountManager am = AccountManager.get(getSherlockActivity());\r
-            //am.invalidateAuthToken(AccountAuthenticator.ACCOUNT_TYPE, OwnCloudClientUtils.getAuthorizationTokenType(operation.getClient().getCredentials()));\r
-            Credentials cred = operation.getClient().getCredentials();\r
-            if (cred instanceof BearerCredentials) {\r
-                am.invalidateAuthToken(AccountAuthenticator.ACCOUNT_TYPE, ((BearerCredentials)cred).getAccessToken());\r
-            } else {\r
-                am.clearPassword(mAccount);\r
-            }\r
-            operation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());  // need a new client instance, so avoid retry()\r
-                // TODO si el usuario no se autoriza de nuevo, esto genera un bucle infinito; o un error en la creación del objecto cliente\r
-            \r
-        } else {\r
-            if (operation instanceof RemoveFileOperation) {\r
-                onRemoveFileOperationFinish((RemoveFileOperation)operation, result);\r
+        if (operation instanceof RemoveFileOperation) {\r
+            onRemoveFileOperationFinish((RemoveFileOperation)operation, result);\r
                 \r
                 \r
-            } else if (operation instanceof RenameFileOperation) {\r
-                onRenameFileOperationFinish((RenameFileOperation)operation, result);\r
+        } else if (operation instanceof RenameFileOperation) {\r
+            onRenameFileOperationFinish((RenameFileOperation)operation, result);\r
                 \r
                 \r
-            } else if (operation instanceof SynchronizeFileOperation) {\r
-                onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);\r
-            }\r
+        } else if (operation instanceof SynchronizeFileOperation) {\r
+            onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);\r
         }\r
     }\r
     \r
         }\r
     }\r
     \r
index 751de9e..786d98a 100644 (file)
@@ -27,7 +27,6 @@ import com.owncloud.android.datamodel.DataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.network.OwnCloudClientUtils;
 import com.owncloud.android.operations.OnRemoteOperationListener;
 import com.owncloud.android.operations.RemoteOperation;
 import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.OnRemoteOperationListener;
 import com.owncloud.android.operations.RemoteOperation;
 import com.owncloud.android.operations.RemoveFileOperation;
@@ -41,7 +40,6 @@ import com.owncloud.android.ui.dialog.EditNameDialog;
 import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
 import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
 
 import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
 import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
 
-import eu.alefzero.webdav.WebdavClient;
 import eu.alefzero.webdav.WebdavUtils;
 
 import android.accounts.Account;
 import eu.alefzero.webdav.WebdavUtils;
 
 import android.accounts.Account;