X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b08e9e35e6817188bfa802bb3b8397bbb98b7548..00482b6dcb1e98da39df54374f7098b51d66bee5:/src/com/owncloud/android/services/OperationsService.java diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index 2c30ae04..7667e90a 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -1,5 +1,7 @@ -/* ownCloud Android client application - * Copyright (C) 2012-2014 ownCloud Inc. +/** + * ownCloud Android client application + * + * 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, @@ -38,6 +40,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation; import com.owncloud.android.operations.common.SyncOperation; import com.owncloud.android.operations.CreateFolderOperation; @@ -52,6 +55,7 @@ import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; import android.accounts.Account; +import android.accounts.AccountManager; import android.accounts.AccountsException; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; @@ -83,6 +87,7 @@ public class OperationsService extends Service { public static final String EXTRA_RESULT = "RESULT"; public static final String EXTRA_NEW_PARENT_PATH = "NEW_PARENT_PATH"; public static final String EXTRA_FILE = "FILE"; + public static final String EXTRA_PASSWORD_SHARE = "PASSWORD_SHARE"; public static final String EXTRA_COOKIE = "COOKIE"; @@ -95,11 +100,13 @@ public class OperationsService extends Service { public static final String ACTION_REMOVE = "REMOVE"; public static final String ACTION_CREATE_FOLDER = "CREATE_FOLDER"; public static final String ACTION_SYNC_FILE = "SYNC_FILE"; - public static final String ACTION_SYNC_FOLDER = "SYNC_FOLDER"; // for the moment, just to download + public static final String ACTION_SYNC_FOLDER = "SYNC_FOLDER";//for the moment, just to download public static final String ACTION_MOVE_FILE = "MOVE_FILE"; - public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED"; - public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED"; + public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + + ".OPERATION_ADDED"; + public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + + ".OPERATION_FINISHED"; private ConcurrentMap> @@ -132,7 +139,8 @@ public class OperationsService extends Service { Log_OC.d(TAG, "Creating service"); /// First worker thread for most of operations - HandlerThread thread = new HandlerThread("Operations thread", Process.THREAD_PRIORITY_BACKGROUND); + HandlerThread thread = new HandlerThread("Operations thread", + Process.THREAD_PRIORITY_BACKGROUND); thread.start(); mOperationsHandler = new ServiceHandler(thread.getLooper(), this); mOperationsBinder = new OperationsServiceBinder(mOperationsHandler); @@ -169,7 +177,8 @@ public class OperationsService extends Service { Pair itemToQueue = newOperation(intent); if (itemToQueue != null) { - mSyncFolderHandler.add(account, remotePath, (SynchronizeFolderOperation)itemToQueue.second); + mSyncFolderHandler.add(account, remotePath, + (SynchronizeFolderOperation)itemToQueue.second); Message msg = mSyncFolderHandler.obtainMessage(); msg.arg1 = startId; msg.obj = itemSyncKey; @@ -246,7 +255,8 @@ public class OperationsService extends Service { public class OperationsServiceBinder extends Binder /* implements OnRemoteOperationListener */ { /** - * Map of listeners that will be reported about the end of operations from a {@link OperationsServiceBinder} instance + * Map of listeners that will be reported about the end of operations from a + * {@link OperationsServiceBinder} instance */ private ConcurrentMap mBoundListeners = new ConcurrentHashMap(); @@ -279,9 +289,11 @@ public class OperationsService extends Service { * Adds a listener interested in being reported about the end of operations. * * @param listener Object to notify about the end of operations. - * @param callbackHandler {@link Handler} to access the listener without breaking Android threading protection. + * @param callbackHandler {@link Handler} to access the listener without + * breaking Android threading protection. */ - public void addOperationListener (OnRemoteOperationListener listener, Handler callbackHandler) { + public void addOperationListener (OnRemoteOperationListener listener, + Handler callbackHandler) { synchronized (mBoundListeners) { mBoundListeners.put(listener, callbackHandler); } @@ -289,7 +301,8 @@ public class OperationsService extends Service { /** - * Removes a listener from the list of objects interested in the being reported about the end of operations. + * Removes a listener from the list of objects interested in the being reported about + * the end of operations. * * @param listener Object to notify about progress of transfer. */ @@ -303,7 +316,8 @@ public class OperationsService extends Service { /** * TODO - IMPORTANT: update implementation when more operations are moved into the service * - * @return 'True' when an operation that enforces the user to wait for completion is in process. + * @return 'True' when an operation that enforces the user to wait for completion is + * in process. */ public boolean isPerformingBlockingOperation() { return (!mServiceHandler.mPendingOperations.isEmpty()); @@ -331,7 +345,8 @@ public class OperationsService extends Service { } - public boolean dispatchResultIfFinished(int operationId, OnRemoteOperationListener listener) { + public boolean dispatchResultIfFinished(int operationId, + OnRemoteOperationListener listener) { Pair undispatched = mUndispatchedFinishedOperations.remove(operationId); if (undispatched != null) { @@ -339,26 +354,21 @@ public class OperationsService extends Service { return true; //Log_OC.wtf(TAG, "Sending callback later"); } else { - if (!mServiceHandler.mPendingOperations.isEmpty()) { - return true; - } else { - return false; - } - //Log_OC.wtf(TAG, "Not finished yet"); + return (!mServiceHandler.mPendingOperations.isEmpty()); } } /** - * Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or waiting - * to download. + * Returns True when the file described by 'file' in the ownCloud account 'account' is + * downloading or waiting to download. * - * If 'file' is a directory, returns 'true' if some of its descendant files is downloading or waiting - * to download. + * If 'file' is a directory, returns 'true' if some of its descendant files is downloading + * or waiting to download. * * @param account ownCloud account where the remote file is stored. - * @param remotePath Path of the folder to check if something is synchronizing / downloading / uploading - * inside. + * @param remotePath Path of the folder to check if something is synchronizing + * / downloading / uploading inside. */ public boolean isSynchronizing(Account account, String remotePath) { return mSyncFolderHandler.isSynchronizing(account, remotePath); @@ -373,7 +383,8 @@ public class OperationsService extends Service { * Created with the Looper of a new thread, started in {@link OperationsService#onCreate()}. */ private static class ServiceHandler extends Handler { - // don't make it a final class, and don't remove the static ; lint will warn about a possible memory leak + // don't make it a final class, and don't remove the static ; lint will warn about a p + // ossible memory leak OperationsService mService; @@ -424,9 +435,16 @@ public class OperationsService extends Service { if (mLastTarget == null || !mLastTarget.equals(next.first)) { mLastTarget = next.first; if (mLastTarget.mAccount != null) { - OwnCloudAccount ocAccount = new OwnCloudAccount(mLastTarget.mAccount, mService); + OwnCloudAccount ocAccount = new OwnCloudAccount(mLastTarget.mAccount, + mService); mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton(). getClientFor(ocAccount, mService); + + OwnCloudVersion version = com.owncloud.android.authentication.AccountUtils.getServerVersion( + mLastTarget.mAccount + ); + mOwnCloudClient.setOwnCloudVersion(version); + mStorageManager = new FileDataStorageManager( mLastTarget.mAccount, mService.getContentResolver() @@ -436,7 +454,8 @@ public class OperationsService extends Service { if (mLastTarget.mCookie != null && mLastTarget.mCookie.length() > 0) { // just used for GetUserName - // TODO refactor to run GetUserName as AsyncTask in the context of AuthenticatorActivity + // TODO refactor to run GetUserName as AsyncTask in the context of + // AuthenticatorActivity credentials = OwnCloudCredentialsFactory.newSamlSsoCredentials( mLastTarget.mCookie); // SAML SSO } @@ -450,24 +469,29 @@ public class OperationsService extends Service { /// perform the operation if (mCurrentOperation instanceof SyncOperation) { - result = ((SyncOperation)mCurrentOperation).execute(mOwnCloudClient, mStorageManager); + 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); + 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); + 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); + 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); + Log_OC.e(TAG, "Error while trying to get authorization for " + + mLastTarget.mAccount.name, e); } result = new RemoteOperationResult(e); } catch (Exception e) { @@ -500,7 +524,8 @@ public class OperationsService extends Service { * 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. + * @return Pair with the new operation object and the information about its + * target server. */ private Pair newOperation(Intent operationIntent) { RemoteOperation operation = null; @@ -523,11 +548,12 @@ public class OperationsService extends Service { String action = operationIntent.getAction(); if (action.equals(ACTION_CREATE_SHARE)) { // Create Share String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH); + String password = operationIntent.getStringExtra(EXTRA_PASSWORD_SHARE); Intent sendIntent = operationIntent.getParcelableExtra(EXTRA_SEND_INTENT); if (remotePath.length() > 0) { operation = new CreateShareOperation(OperationsService.this, remotePath, ShareType.PUBLIC_LINK, - "", false, "", 1, sendIntent); + "", false, password, 1, sendIntent); } } else if (action.equals(ACTION_UNSHARE)) { // Unshare file @@ -565,19 +591,22 @@ public class OperationsService extends Service { } 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); + 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); + 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); + boolean syncFileContents = + operationIntent.getBooleanExtra(EXTRA_SYNC_FILE_CONTENTS, true); operation = new SynchronizeFileOperation( remotePath, account, syncFileContents, getApplicationContext() ); @@ -586,7 +615,7 @@ public class OperationsService extends Service { // Sync file String remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH); operation = new SynchronizeFolderOperation( - this, // TODO remove this dependency from construction time + this, // TODO remove this dependency from construction time remotePath, account, System.currentTimeMillis() // TODO remove this dependency from construction time @@ -617,7 +646,8 @@ public class OperationsService extends Service { /** * Sends a broadcast when a new operation is added to the queue. * - * Local broadcasts are only delivered to activities in the same process, but can't be done sticky :\ + * Local broadcasts are only delivered to activities in the same process, but can't be + * done sticky :\ * * @param target Account or URL pointing to an OC server. * @param operation Added operation. @@ -638,7 +668,8 @@ public class OperationsService extends Service { // TODO - maybe add a notification for real start of operations /** - * Sends a LOCAL broadcast when an operations finishes in order to the interested activities can update their view + * Sends a LOCAL broadcast when an operations finishes in order to the interested activities c + * an update their view * * Local broadcasts are only delivered to activities in the same process. * @@ -646,7 +677,8 @@ public class OperationsService extends Service { * @param operation Finished operation. * @param result Result of the operation. */ - private void sendBroadcastOperationFinished(Target target, RemoteOperation operation, RemoteOperationResult result) { + private void sendBroadcastOperationFinished(Target target, RemoteOperation operation, + RemoteOperationResult result) { Intent intent = new Intent(ACTION_OPERATION_FINISHED); intent.putExtra(EXTRA_RESULT, result); if (target.mAccount != null) { @@ -670,7 +702,8 @@ public class OperationsService extends Service { final RemoteOperation operation, final RemoteOperationResult result ) { int count = 0; - Iterator listeners = mOperationsBinder.mBoundListeners.keySet().iterator(); + Iterator listeners = + mOperationsBinder.mBoundListeners.keySet().iterator(); while (listeners.hasNext()) { final OnRemoteOperationListener listener = listeners.next(); final Handler handler = mOperationsBinder.mBoundListeners.get(listener);