X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5611205f1d5bc06bc89a73ac27f70098a09bd9ae..185aae4bc345f453479f94e2a78da62e8c9930b0:/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 81a4adee..ce80b57e 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -34,9 +34,13 @@ import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation; import com.owncloud.android.operations.common.SyncOperation; +import com.owncloud.android.operations.CreateFolderOperation; import com.owncloud.android.operations.CreateShareOperation; import com.owncloud.android.operations.GetServerInfoOperation; import com.owncloud.android.operations.OAuth2GetAccessToken; +import com.owncloud.android.operations.RemoveFileOperation; +import com.owncloud.android.operations.RenameFileOperation; +import com.owncloud.android.operations.SynchronizeFileOperation; import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.utils.Log_OC; @@ -64,6 +68,10 @@ public class OperationsService extends Service { public static final String EXTRA_OAUTH2_QUERY_PARAMETERS = "OAUTH2_QUERY_PARAMETERS"; public static final String EXTRA_REMOTE_PATH = "REMOTE_PATH"; public static final String EXTRA_SEND_INTENT = "SEND_INTENT"; + public static final String EXTRA_NEWNAME = "NEWNAME"; + public static final String EXTRA_REMOVE_ONLY_LOCAL = "REMOVE_LOCAL_COPY"; + public static final String EXTRA_CREATE_FULL_PATH = "CREATE_FULL_PATH"; + public static final String EXTRA_SYNC_FILE_CONTENTS = "SYNC_FILE_CONTENTS"; public static final String EXTRA_RESULT = "RESULT"; // TODO review if ALL OF THEM are necessary @@ -81,25 +89,30 @@ public class OperationsService extends Service { public static final String ACTION_OAUTH2_GET_ACCESS_TOKEN = "OAUTH2_GET_ACCESS_TOKEN"; public static final String ACTION_EXISTENCE_CHECK = "EXISTENCE_CHECK"; public static final String ACTION_GET_USER_NAME = "GET_USER_NAME"; + public static final String ACTION_RENAME = "RENAME"; + 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_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED"; public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED"; private ConcurrentLinkedQueue> mPendingOperations = new ConcurrentLinkedQueue>(); - - private ConcurrentMap mOperationResults = - new ConcurrentHashMap(); + + private ConcurrentMap> + mUndispatchedFinishedOperations = + new ConcurrentHashMap>(); private static class Target { public Uri mServerUrl = null; public Account mAccount = null; - public String mWebDavUrl = ""; - public String mUsername = ""; - public String mPassword = ""; - public String mAuthToken = ""; + public String mWebDavUrl = null; + public String mUsername = null; + public String mPassword = null; + public String mAuthToken = null; public boolean mFollowRedirects = true; - public String mCookie = ""; + public String mCookie = null; public Target(Account account, Uri serverUrl, String webdavUrl, String username, String password, String authToken, boolean followRedirects, String cookie) { @@ -148,22 +161,31 @@ public class OperationsService extends Service { */ @Override public int onStartCommand(Intent intent, int flags, int startId) { - //Log.wtf(TAG, "onStartCommand init" ); + //Log_OC.wtf(TAG, "onStartCommand init" ); Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; mServiceHandler.sendMessage(msg); - //Log.wtf(TAG, "onStartCommand end" ); + //Log_OC.wtf(TAG, "onStartCommand end" ); return START_NOT_STICKY; } - + @Override + public void onDestroy() { + //Log_OC.wtf(TAG, "onDestroy init" ); + //Log_OC.wtf(TAG, "Clear mUndispatchedFinisiedOperations" ); + mUndispatchedFinishedOperations.clear(); + //Log_OC.wtf(TAG, "onDestroy end" ); + super.onDestroy(); + } + + /** * Provides a binder object that clients can use to perform actions on the queue of operations, * except the addition of new operations. */ @Override public IBinder onBind(Intent intent) { - //Log.wtf(TAG, "onBind" ); + //Log_OC.wtf(TAG, "onBind" ); return mBinder; } @@ -246,9 +268,9 @@ public class OperationsService extends Service { * Creates and adds to the queue a new operation, as described by operationIntent * * @param operationIntent Intent describing a new operation to queue and execute. - * @return Identifier of the operation created, or -1 if failed. + * @return Identifier of the operation created, or null if failed. */ - public int newOperation(Intent operationIntent) { + public long newOperation(Intent operationIntent) { RemoteOperation operation = null; Target target = null; try { @@ -269,12 +291,12 @@ public class OperationsService extends Service { target = new Target( account, (serverUrl == null) ? null : Uri.parse(serverUrl), - ((webDavPath == null) || (serverUrl == null)) ? "" : webDavUrl, - (username == null) ? "" : username, - (password == null) ? "" : password, - (authToken == null) ? "" : authToken, + ((webDavPath == null) || (serverUrl == null)) ? null : webDavUrl, + username, + password, + authToken, followRedirects, - (cookie == null) ? "" : cookie + cookie ); String action = operationIntent.getAction(); @@ -320,7 +342,32 @@ public class OperationsService extends Service { } 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, account, 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()); } + } } catch (IllegalArgumentException e) { @@ -331,16 +378,31 @@ public class OperationsService extends Service { if (operation != null) { mPendingOperations.add(new Pair(target, operation)); startService(new Intent(OperationsService.this, OperationsService.class)); + //Log_OC.wtf(TAG, "New operation added, opId: " + operation.hashCode()); + // better id than hash? ; should be good enough by the time being return operation.hashCode(); } else { - return -1; + //Log_OC.wtf(TAG, "New operation failed, returned Long.MAX_VALUE"); + return Long.MAX_VALUE; } } - public RemoteOperationResult getOperationResultIfFinished(int mDetectAuthOpId) { - //Log_OC.wtf(TAG, "Searching result for operation with id " + mDetectAuthOpId); - return mOperationResults.remove(mDetectAuthOpId); + public boolean dispatchResultIfFinished(int operationId, OnRemoteOperationListener listener) { + Pair undispatched = + mUndispatchedFinishedOperations.remove(operationId); + if (undispatched != null) { + listener.onRemoteOperationFinish(undispatched.first, undispatched.second); + return true; + //Log_OC.wtf(TAG, "Sending callback later"); + } else { + if (!mPendingOperations.isEmpty()) { + return true; + } else { + return false; + } + //Log_OC.wtf(TAG, "Not finished yet"); + } } } @@ -375,7 +437,7 @@ public class OperationsService extends Service { */ private void nextOperation() { - //Log.wtf(TAG, "nextOperation init" ); + //Log_OC.wtf(TAG, "nextOperation init" ); Pair next = null; synchronized(mPendingOperations) { @@ -396,14 +458,14 @@ public class OperationsService extends Service { } else { mOwnCloudClient = OwnCloudClientFactory.createOwnCloudClient(mLastTarget.mServerUrl, getApplicationContext(), mLastTarget.mFollowRedirects); // this is not good enough - if (mLastTarget.mWebDavUrl != "") { + if (mLastTarget.mWebDavUrl != null) { mOwnCloudClient.setWebdavUri(Uri.parse(mLastTarget.mWebDavUrl)); } - if (mLastTarget.mUsername != "" && mLastTarget.mPassword != "") { + if (mLastTarget.mUsername != null && mLastTarget.mPassword != null) { mOwnCloudClient.setBasicCredentials(mLastTarget.mUsername, mLastTarget.mPassword); - } else if (mLastTarget.mAuthToken != "") { + } else if (mLastTarget.mAuthToken != null) { mOwnCloudClient.setBearerCredentials(mLastTarget.mAuthToken); - } else if (mLastTarget.mCookie != "") { + } else if (mLastTarget.mCookie != null) { mOwnCloudClient.setSsoSessionCookie(mLastTarget.mCookie); } mStorageManager = null; @@ -416,20 +478,20 @@ public class OperationsService extends Service { } else { result = mCurrentOperation.execute(mOwnCloudClient); } - + } catch (AccountsException e) { if (mLastTarget.mAccount == null) { - Log_OC.e(TAG, "Error while trying to get autorization 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 autorization 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 autorization 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 autorization 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) { @@ -443,12 +505,11 @@ public class OperationsService extends Service { } finally { synchronized(mPendingOperations) { mPendingOperations.poll(); - mOperationResults.put(mCurrentOperation.hashCode(), result); } } //sendBroadcastOperationFinished(mLastTarget, mCurrentOperation, result); - callbackOperationListeners(mLastTarget, mCurrentOperation, result); + dispatchResultToOperationListeners(mLastTarget, mCurrentOperation, result); } } @@ -506,7 +567,7 @@ public class OperationsService extends Service { * @param operation Finished operation. * @param result Result of the operation. */ - private void callbackOperationListeners( + private void dispatchResultToOperationListeners( Target target, final RemoteOperation operation, final RemoteOperationResult result) { int count = 0; Iterator listeners = mBinder.mBoundListeners.keySet().iterator(); @@ -523,6 +584,12 @@ public class OperationsService extends Service { count += 1; } } + if (count == 0) { + //mOperationResults.put(operation.hashCode(), result); + Pair undispatched = + new Pair(operation, result); + mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched); + } Log_OC.d(TAG, "Called " + count + " listeners"); }