Merge branch 'develop' into download_folder
authorjabarros <jabarros@solidgear.es>
Wed, 7 Jan 2015 13:04:46 +0000 (14:04 +0100)
committerjabarros <jabarros@solidgear.es>
Wed, 7 Jan 2015 13:04:46 +0000 (14:04 +0100)
1  2 
res/values/strings.xml
src/com/owncloud/android/services/OperationsService.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

        <string name="prefs_category_security">Security</string>
  
        <string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
 +    <string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
  
+       <string name="shared_subject_header">shared</string>
+       <string name="with_you_subject_header">with you</string>
+       <string name="subject_token">%1$s %2$s &gt;&gt;%3$s&lt;&lt; %4$s</string>
  </resources>
@@@ -549,241 -443,107 +549,241 @@@ public class OperationsService extends 
  
          @Override
          public void handleMessage(Message msg) {
 -            mService.nextOperation();
 +            nextOperation();
              mService.stopSelf(msg.arg1);
          }
 -    }
 -    
 -
 -    /**
 -     * Performs the next operation in the queue
 -     */
 -    private void nextOperation() {
          
 -        //Log_OC.wtf(TAG, "nextOperation init" );
          
 -        Pair<Target, RemoteOperation> next = null;
 -        synchronized(mPendingOperations) {
 -            next = mPendingOperations.peek();
 -        }
 -
 -        if (next != null) {
 +        /**
 +         * Performs the next operation in the queue
 +         */
 +        private void nextOperation() {
              
 -            mCurrentOperation = next.second;
 -            RemoteOperationResult result = null;
 -            try {
 -                /// prepare client object to send the request to the ownCloud server
 -                if (mLastTarget == null || !mLastTarget.equals(next.first)) {
 -                    mLastTarget = next.first;
 -                    if (mLastTarget.mAccount != null) {
 -                        OwnCloudAccount ocAccount = new OwnCloudAccount(mLastTarget.mAccount, this);
 -                        mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
 -                                getClientFor(ocAccount, this);
 -                        mStorageManager = 
 -                                new FileDataStorageManager(
 -                                        mLastTarget.mAccount, 
 -                                        getContentResolver());
 -                    } else {
 -                        OwnCloudCredentials credentials = null;
 -                        if (mLastTarget.mUsername != null && 
 -                                mLastTarget.mUsername.length() > 0) {
 -                            credentials = OwnCloudCredentialsFactory.newBasicCredentials(
 -                                    mLastTarget.mUsername, 
 -                                    mLastTarget.mPassword);  // basic
 -                            
 -                        } else if (mLastTarget.mAuthToken != null && 
 -                                mLastTarget.mAuthToken.length() > 0) {
 -                            credentials = OwnCloudCredentialsFactory.newBearerCredentials(
 -                                    mLastTarget.mAuthToken);  // bearer token
 -                            
 -                        } else if (mLastTarget.mCookie != null &&
 -                                mLastTarget.mCookie.length() > 0) {
 -                            credentials = OwnCloudCredentialsFactory.newSamlSsoCredentials(
 -                                    mLastTarget.mCookie); // SAML SSO
 +            //Log_OC.wtf(TAG, "nextOperation init" );
 +            
 +            Pair<Target, RemoteOperation> next = null;
 +            synchronized(mPendingOperations) {
 +                next = mPendingOperations.peek();
 +            }
 +
 +            if (next != null) {
 +                
 +                mCurrentOperation = next.second;
 +                RemoteOperationResult result = null;
 +                try {
 +                    /// prepare client object to send the request to the ownCloud server
 +                    if (mLastTarget == null || !mLastTarget.equals(next.first)) {
 +                        mLastTarget = next.first;
 +                        if (mLastTarget.mAccount != null) {
 +                            OwnCloudAccount ocAccount = new OwnCloudAccount(mLastTarget.mAccount, mService);
 +                            mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
 +                                    getClientFor(ocAccount, mService);
 +                            mStorageManager = new FileDataStorageManager(
 +                                    mLastTarget.mAccount, 
 +                                    mService.getContentResolver()
 +                            );
 +                        } else {
 +                            OwnCloudCredentials credentials = null;
 +                            if (mLastTarget.mUsername != null && 
 +                                    mLastTarget.mUsername.length() > 0) {
 +                                credentials = OwnCloudCredentialsFactory.newBasicCredentials(
 +                                        mLastTarget.mUsername, 
 +                                        mLastTarget.mPassword);  // basic
 +                                
 +                            } else if (mLastTarget.mAuthToken != null && 
 +                                    mLastTarget.mAuthToken.length() > 0) {
 +                                credentials = OwnCloudCredentialsFactory.newBearerCredentials(
 +                                        mLastTarget.mAuthToken);  // bearer token
 +                                
 +                            } else if (mLastTarget.mCookie != null &&
 +                                    mLastTarget.mCookie.length() > 0) {
 +                                credentials = OwnCloudCredentialsFactory.newSamlSsoCredentials(
 +                                        mLastTarget.mCookie); // SAML SSO
 +                            }
 +                            OwnCloudAccount ocAccount = new OwnCloudAccount(
 +                                    mLastTarget.mServerUrl, credentials);
 +                            mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
 +                                    getClientFor(ocAccount, mService);
 +                            mStorageManager = null;
                          }
 -                        OwnCloudAccount ocAccount = new OwnCloudAccount(
 -                                mLastTarget.mServerUrl, credentials);
 -                        mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
 -                                getClientFor(ocAccount, this);
 -                        mStorageManager = null;
                      }
 -                }
  
 -                /// perform the operation
 -                if (mCurrentOperation instanceof SyncOperation) {
 -                    result = ((SyncOperation)mCurrentOperation).execute(mOwnCloudClient, mStorageManager);
 -                } else {
 -                    result = mCurrentOperation.execute(mOwnCloudClient);
 -                }
 +                    /// perform the operation
 +                    if (mCurrentOperation instanceof SyncOperation) {
 +                        result = ((SyncOperation)mCurrentOperation).execute(mOwnCloudClient, mStorageManager);
 +                    } else {
 +                        result = mCurrentOperation.execute(mOwnCloudClient);
 +                    }
 +                    
 +                } catch (AccountsException e) {
 +                    if (mLastTarget.mAccount == null) {
 +                        Log_OC.e(TAG, "Error while trying to get authorization for a NULL account", e);
 +                    } else {
 +                        Log_OC.e(TAG, "Error while trying to get authorization for " + mLastTarget.mAccount.name, e);
 +                    }
 +                    result = new RemoteOperationResult(e);
 +                    
 +                } catch (IOException e) {
 +                    if (mLastTarget.mAccount == null) {
 +                        Log_OC.e(TAG, "Error while trying to get authorization for a NULL account", e);
 +                    } else {
 +                        Log_OC.e(TAG, "Error while trying to get authorization for " + mLastTarget.mAccount.name, e);
 +                    }
 +                    result = new RemoteOperationResult(e);
 +                } catch (Exception e) {
 +                    if (mLastTarget.mAccount == null) {
 +                        Log_OC.e(TAG, "Unexpected error for a NULL account", e);
 +                    } else {
 +                        Log_OC.e(TAG, "Unexpected error for " + mLastTarget.mAccount.name, e);
 +                    }
 +                    result = new RemoteOperationResult(e);
                  
 -            } catch (AccountsException e) {
 -                if (mLastTarget.mAccount == null) {
 -                    Log_OC.e(TAG, "Error while trying to get authorization for a NULL account", e);
 -                } else {
 -                    Log_OC.e(TAG, "Error while trying to get authorization for " + mLastTarget.mAccount.name, e);
 +                } finally {
 +                    synchronized(mPendingOperations) {
 +                        mPendingOperations.poll();
 +                    }
                  }
 -                result = new RemoteOperationResult(e);
                  
 -            } catch (IOException e) {
 -                if (mLastTarget.mAccount == null) {
 -                    Log_OC.e(TAG, "Error while trying to get authorization for a NULL account", e);
 -                } else {
 -                    Log_OC.e(TAG, "Error while trying to get authorization for " + mLastTarget.mAccount.name, e);
 -                }
 -                result = new RemoteOperationResult(e);
 -            } catch (Exception e) {
 -                if (mLastTarget.mAccount == null) {
 -                    Log_OC.e(TAG, "Unexpected error for a NULL account", e);
 -                } else {
 -                    Log_OC.e(TAG, "Unexpected error for " + mLastTarget.mAccount.name, e);
 -                }
 -                result = new RemoteOperationResult(e);
 -            
 -            } finally {
 -                synchronized(mPendingOperations) {
 -                    mPendingOperations.poll();
 -                }
 +                //sendBroadcastOperationFinished(mLastTarget, mCurrentOperation, result);
 +                mService.dispatchResultToOperationListeners(mLastTarget, mCurrentOperation, result);
              }
 -            
 -            //sendBroadcastOperationFinished(mLastTarget, mCurrentOperation, result);
 -            dispatchResultToOperationListeners(mLastTarget, mCurrentOperation, result);
          }
 +
 +
 +        
      }
-                         operation = new CreateShareOperation(remotePath, ShareType.PUBLIC_LINK, 
 +    
 +
 +    /**
 +     * Creates a new operation, as described by operationIntent.
 +     * 
 +     * TODO - move to ServiceHandler (probably)
 +     * 
 +     * @param operationIntent       Intent describing a new operation to queue and execute.
 +     * @return                      Pair with the new operation object and the information about its target server.
 +     */
 +    private Pair<Target , RemoteOperation> newOperation(Intent operationIntent) {
 +        RemoteOperation operation = null;
 +        Target target = null;
 +        try {
 +            if (!operationIntent.hasExtra(EXTRA_ACCOUNT) && 
 +                    !operationIntent.hasExtra(EXTRA_SERVER_URL)) {
 +                Log_OC.e(TAG, "Not enough information provided in intent");
 +                
 +            } else {
 +                Account account = operationIntent.getParcelableExtra(EXTRA_ACCOUNT);
 +                String serverUrl = operationIntent.getStringExtra(EXTRA_SERVER_URL);
 +                String username = operationIntent.getStringExtra(EXTRA_USERNAME);
 +                String password = operationIntent.getStringExtra(EXTRA_PASSWORD);
 +                String authToken = operationIntent.getStringExtra(EXTRA_AUTH_TOKEN);
 +                String cookie = operationIntent.getStringExtra(EXTRA_COOKIE);
 +                target = new Target(
 +                        account, 
 +                        (serverUrl == null) ? null : Uri.parse(serverUrl),
 +                        username,
 +                        password,
 +                        authToken,
 +                        cookie
 +                );
 +                
 +                String action = operationIntent.getAction();
 +                if (action.equals(ACTION_CREATE_SHARE)) {  // Create Share
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT);
 +                    if (remotePath.length() > 0) {
++                        operation = new CreateShareOperation(OperationsService.this, remotePath, ShareType.PUBLIC_LINK,
 +                                "", false, "", 1, sendIntent);
 +                    }
 +                    
 +                } else if (action.equals(ACTION_UNSHARE)) {  // Unshare file
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    if (remotePath.length() > 0) {
 +                        operation = new UnshareLinkOperation(
 +                                remotePath, 
 +                                OperationsService.this);
 +                    }
 +                    
 +                } else if (action.equals(ACTION_GET_SERVER_INFO)) { 
 +                    // check OC server and get basic information from it
 +                    operation = new GetServerInfoOperation(serverUrl, OperationsService.this);
 +                    
 +                } else if (action.equals(ACTION_OAUTH2_GET_ACCESS_TOKEN)) {
 +                    /// GET ACCESS TOKEN to the OAuth server
 +                    String oauth2QueryParameters =
 +                            operationIntent.getStringExtra(EXTRA_OAUTH2_QUERY_PARAMETERS);
 +                    operation = new OAuth2GetAccessToken(
 +                            getString(R.string.oauth2_client_id), 
 +                            getString(R.string.oauth2_redirect_uri),       
 +                            getString(R.string.oauth2_grant_type),
 +                            oauth2QueryParameters);
 +                    
 +                } else if (action.equals(ACTION_EXISTENCE_CHECK)) {
 +                    // Existence Check 
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    boolean successIfAbsent = operationIntent.getBooleanExtra(EXTRA_SUCCESS_IF_ABSENT, false);
 +                    operation = new ExistenceCheckRemoteOperation(remotePath, OperationsService.this, successIfAbsent);
 +                    
 +                } else if (action.equals(ACTION_GET_USER_NAME)) {
 +                    // Get User Name
 +                    operation = new GetRemoteUserNameOperation();
 +                    
 +                } else if (action.equals(ACTION_RENAME)) {
 +                    // Rename file or folder
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    String newName = operationIntent.getStringExtra(EXTRA_NEWNAME);
 +                    operation = new RenameFileOperation(remotePath, newName);
 +                    
 +                } else if (action.equals(ACTION_REMOVE)) {
 +                    // Remove file or folder
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    boolean onlyLocalCopy = operationIntent.getBooleanExtra(EXTRA_REMOVE_ONLY_LOCAL, false);
 +                    operation = new RemoveFileOperation(remotePath, onlyLocalCopy);
 +                    
 +                } else if (action.equals(ACTION_CREATE_FOLDER)) {
 +                    // Create Folder
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    boolean createFullPath = operationIntent.getBooleanExtra(EXTRA_CREATE_FULL_PATH, true);
 +                    operation = new CreateFolderOperation(remotePath, createFullPath);
 +                    
 +                } else if (action.equals(ACTION_SYNC_FILE)) {
 +                    // Sync file
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    boolean syncFileContents = operationIntent.getBooleanExtra(EXTRA_SYNC_FILE_CONTENTS, true);
 +                    operation = new SynchronizeFileOperation(
 +                            remotePath, account, syncFileContents, getApplicationContext()
 +                    );
 +                    
 +                } else if (action.equals(ACTION_SYNC_FOLDER)) {
 +                    // Sync file
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    operation = new SynchronizeFolderOperation(
 +                            this,                       // TODO remove this dependency from construction time 
 +                            remotePath,
 +                            account, 
 +                            System.currentTimeMillis()  // TODO remove this dependency from construction time
 +                    );
 +                    
 +                } else if (action.equals(ACTION_MOVE_FILE)) {
 +                    // Move file/folder
 +                    String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
 +                    String newParentPath = operationIntent.getStringExtra(EXTRA_NEW_PARENT_PATH);
 +                    operation = new MoveFileOperation(remotePath,newParentPath,account);
 +                }
 +                
 +            }
 +                
 +        } catch (IllegalArgumentException e) {
 +            Log_OC.e(TAG, "Bad information provided in intent: " + e.getMessage());
 +            operation = null;
 +        }
  
 +        if (operation != null) {
 +            return new Pair<Target , RemoteOperation>(target, operation);  
 +        } else {
 +            return null;
 +        }
 +    }
 +    
  
      /**
       * Sends a broadcast when a new operation is added to the queue.