Search in sources :

Example 21 with RemoteOperation

use of com.owncloud.android.lib.common.operations.RemoteOperation in project android by nextcloud.

the class FetchRemoteFileTask method doInBackground.

@Override
protected String doInBackground(Void... voids) {
    SearchRemoteOperation searchRemoteOperation = new SearchRemoteOperation(fileId, FILE_ID_SEARCH, false, fileDisplayActivity.getCapabilities());
    RemoteOperationResult remoteOperationResult = searchRemoteOperation.execute(user.toPlatformAccount(), fileDisplayActivity);
    if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null) {
        if (remoteOperationResult.getData().isEmpty()) {
            return fileDisplayActivity.getString(R.string.remote_file_fetch_failed);
        }
        String remotePath = ((RemoteFile) remoteOperationResult.getData().get(0)).getRemotePath();
        ReadFileRemoteOperation operation = new ReadFileRemoteOperation(remotePath);
        RemoteOperationResult result = operation.execute(user.toPlatformAccount(), fileDisplayActivity);
        if (!result.isSuccess()) {
            Exception exception = result.getException();
            String message = "Fetching file " + remotePath + " fails with: " + result.getLogMessage();
            if (exception != null) {
                return exception.getMessage();
            } else {
                return message;
            }
        }
        RemoteFile remoteFile = (RemoteFile) result.getData().get(0);
        OCFile ocFile = FileStorageUtils.fillOCFile(remoteFile);
        FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.getAccountName());
        ocFile = storageManager.saveFileWithParent(ocFile, fileDisplayActivity);
        // also sync folder content
        OCFile toSync;
        if (ocFile.isFolder()) {
            toSync = ocFile;
        } else {
            toSync = storageManager.getFileById(ocFile.getParentId());
        }
        long currentSyncTime = System.currentTimeMillis();
        RemoteOperation refreshFolderOperation = new RefreshFolderOperation(toSync, currentSyncTime, true, true, storageManager, user, fileDisplayActivity);
        refreshFolderOperation.execute(user.toPlatformAccount(), fileDisplayActivity);
        fileDisplayActivity.setFile(ocFile);
    } else {
        return remoteOperationResult.getLogMessage();
    }
    return "";
}
Also used : OCFile(com.owncloud.android.datamodel.OCFile) RemoteOperation(com.owncloud.android.lib.common.operations.RemoteOperation) ReadFileRemoteOperation(com.owncloud.android.lib.resources.files.ReadFileRemoteOperation) SearchRemoteOperation(com.owncloud.android.lib.resources.files.SearchRemoteOperation) SearchRemoteOperation(com.owncloud.android.lib.resources.files.SearchRemoteOperation) RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) RefreshFolderOperation(com.owncloud.android.operations.RefreshFolderOperation) ReadFileRemoteOperation(com.owncloud.android.lib.resources.files.ReadFileRemoteOperation) RemoteFile(com.owncloud.android.lib.resources.files.model.RemoteFile)

Example 22 with RemoteOperation

use of com.owncloud.android.lib.common.operations.RemoteOperation in project android by nextcloud.

the class OCFileListAdapter method parseVirtuals.

private void parseVirtuals(List<Object> objects, SearchType searchType) {
    VirtualFolderType type;
    boolean onlyMedia = false;
    switch(searchType) {
        case FAVORITE_SEARCH:
            type = VirtualFolderType.FAVORITE;
            break;
        case GALLERY_SEARCH:
            type = VirtualFolderType.GALLERY;
            onlyMedia = true;
            int lastPosition = objects.size() - 1;
            if (lastPosition < 0) {
                lastTimestamp = -1;
                break;
            }
            RemoteFile lastFile = (RemoteFile) objects.get(lastPosition);
            lastTimestamp = lastFile.getModifiedTimestamp() / 1000;
            break;
        default:
            type = VirtualFolderType.NONE;
            break;
    }
    List<ContentValues> contentValues = new ArrayList<>();
    for (Object remoteFile : objects) {
        OCFile ocFile = FileStorageUtils.fillOCFile((RemoteFile) remoteFile);
        FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.getAccountName());
        try {
            ocFile = mStorageManager.saveFileWithParent(ocFile, activity);
            if (SearchType.GALLERY_SEARCH != searchType) {
                // also sync folder content
                if (ocFile.isFolder()) {
                    long currentSyncTime = System.currentTimeMillis();
                    RemoteOperation refreshFolderOperation = new RefreshFolderOperation(ocFile, currentSyncTime, true, false, mStorageManager, user, activity);
                    refreshFolderOperation.execute(user.toPlatformAccount(), activity);
                }
            }
            if (!onlyMedia || MimeTypeUtil.isImage(ocFile) || MimeTypeUtil.isVideo(ocFile)) {
                mFiles.add(ocFile);
            }
            ContentValues cv = new ContentValues();
            cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_TYPE, type.toString());
            cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_OCFILE_ID, ocFile.getFileId());
            contentValues.add(cv);
        } catch (RemoteOperationFailedException e) {
            Log_OC.e(TAG, "Error saving file with parent" + e.getMessage(), e);
        }
    }
    preferences.setPhotoSearchTimestamp(System.currentTimeMillis());
    mStorageManager.saveVirtuals(contentValues);
}
Also used : ContentValues(android.content.ContentValues) RemoteOperation(com.owncloud.android.lib.common.operations.RemoteOperation) ReadFileRemoteOperation(com.owncloud.android.lib.resources.files.ReadFileRemoteOperation) RefreshFolderOperation(com.owncloud.android.operations.RefreshFolderOperation) ArrayList(java.util.ArrayList) VirtualFolderType(com.owncloud.android.datamodel.VirtualFolderType) Point(android.graphics.Point) OCFile(com.owncloud.android.datamodel.OCFile) RemoteOperationFailedException(com.owncloud.android.operations.RemoteOperationFailedException) RemoteFile(com.owncloud.android.lib.resources.files.model.RemoteFile)

Example 23 with RemoteOperation

use of com.owncloud.android.lib.common.operations.RemoteOperation in project android by nextcloud.

the class OperationsService method newOperation.

/**
 * Creates a new operation, as described by operationIntent.
 * <p>
 * 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);
            User user = toUser(account);
            String serverUrl = operationIntent.getStringExtra(EXTRA_SERVER_URL);
            target = new Target(account, (serverUrl == null) ? null : Uri.parse(serverUrl));
            String action = operationIntent.getAction();
            String remotePath;
            String password;
            ShareType shareType;
            String newParentPath;
            long shareId;
            FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(user, getContentResolver());
            switch(action) {
                case ACTION_CREATE_SHARE_VIA_LINK:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    password = operationIntent.getStringExtra(EXTRA_SHARE_PASSWORD);
                    if (!TextUtils.isEmpty(remotePath)) {
                        operation = new CreateShareViaLinkOperation(remotePath, password, fileDataStorageManager);
                    }
                    break;
                case ACTION_UPDATE_PUBLIC_SHARE:
                    shareId = operationIntent.getLongExtra(EXTRA_SHARE_ID, -1);
                    if (shareId > 0) {
                        UpdateShareViaLinkOperation updateLinkOperation = new UpdateShareViaLinkOperation(shareId, fileDataStorageManager);
                        password = operationIntent.getStringExtra(EXTRA_SHARE_PASSWORD);
                        updateLinkOperation.setPassword(password);
                        long expirationDate = operationIntent.getLongExtra(EXTRA_SHARE_EXPIRATION_DATE_IN_MILLIS, 0);
                        updateLinkOperation.setExpirationDateInMillis(expirationDate);
                        boolean hideFileDownload = operationIntent.getBooleanExtra(EXTRA_SHARE_HIDE_FILE_DOWNLOAD, false);
                        updateLinkOperation.setHideFileDownload(hideFileDownload);
                        if (operationIntent.hasExtra(EXTRA_SHARE_PUBLIC_LABEL)) {
                            updateLinkOperation.setLabel(operationIntent.getStringExtra(EXTRA_SHARE_PUBLIC_LABEL));
                        }
                        operation = updateLinkOperation;
                    }
                    break;
                case ACTION_UPDATE_USER_SHARE:
                    shareId = operationIntent.getLongExtra(EXTRA_SHARE_ID, -1);
                    if (shareId > 0) {
                        UpdateSharePermissionsOperation updateShare = new UpdateSharePermissionsOperation(shareId, fileDataStorageManager);
                        int permissions = operationIntent.getIntExtra(EXTRA_SHARE_PERMISSIONS, -1);
                        updateShare.setPermissions(permissions);
                        long expirationDateInMillis = operationIntent.getLongExtra(EXTRA_SHARE_EXPIRATION_DATE_IN_MILLIS, 0L);
                        updateShare.setExpirationDateInMillis(expirationDateInMillis);
                        password = operationIntent.getStringExtra(EXTRA_SHARE_PASSWORD);
                        updateShare.setPassword(password);
                        operation = updateShare;
                    }
                    break;
                case ACTION_UPDATE_SHARE_NOTE:
                    shareId = operationIntent.getLongExtra(EXTRA_SHARE_ID, -1);
                    String note = operationIntent.getStringExtra(EXTRA_SHARE_NOTE);
                    if (shareId > 0) {
                        operation = new UpdateNoteForShareOperation(shareId, note, fileDataStorageManager);
                    }
                    break;
                case ACTION_CREATE_SHARE_WITH_SHAREE:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    String shareeName = operationIntent.getStringExtra(EXTRA_SHARE_WITH);
                    shareType = (ShareType) operationIntent.getSerializableExtra(EXTRA_SHARE_TYPE);
                    int permissions = operationIntent.getIntExtra(EXTRA_SHARE_PERMISSIONS, -1);
                    String noteMessage = operationIntent.getStringExtra(EXTRA_SHARE_NOTE);
                    String sharePassword = operationIntent.getStringExtra(EXTRA_SHARE_PASSWORD);
                    long expirationDateInMillis = operationIntent.getLongExtra(EXTRA_SHARE_EXPIRATION_DATE_IN_MILLIS, 0L);
                    boolean hideFileDownload = operationIntent.getBooleanExtra(EXTRA_SHARE_HIDE_FILE_DOWNLOAD, false);
                    if (!TextUtils.isEmpty(remotePath)) {
                        CreateShareWithShareeOperation createShareWithShareeOperation = new CreateShareWithShareeOperation(remotePath, shareeName, shareType, permissions, noteMessage, sharePassword, expirationDateInMillis, hideFileDownload, fileDataStorageManager);
                        if (operationIntent.hasExtra(EXTRA_SHARE_PUBLIC_LABEL)) {
                            createShareWithShareeOperation.setLabel(operationIntent.getStringExtra(EXTRA_SHARE_PUBLIC_LABEL));
                        }
                        operation = createShareWithShareeOperation;
                    }
                    break;
                case ACTION_UPDATE_SHARE_INFO:
                    shareId = operationIntent.getLongExtra(EXTRA_SHARE_ID, -1);
                    if (shareId > 0) {
                        UpdateShareInfoOperation updateShare = new UpdateShareInfoOperation(shareId, fileDataStorageManager);
                        int permissionsToChange = operationIntent.getIntExtra(EXTRA_SHARE_PERMISSIONS, -1);
                        updateShare.setPermissions(permissionsToChange);
                        long expirationDateInMills = operationIntent.getLongExtra(EXTRA_SHARE_EXPIRATION_DATE_IN_MILLIS, 0L);
                        updateShare.setExpirationDateInMillis(expirationDateInMills);
                        password = operationIntent.getStringExtra(EXTRA_SHARE_PASSWORD);
                        updateShare.setPassword(password);
                        boolean fileDownloadHide = operationIntent.getBooleanExtra(EXTRA_SHARE_HIDE_FILE_DOWNLOAD, false);
                        updateShare.setHideFileDownload(fileDownloadHide);
                        if (operationIntent.hasExtra(EXTRA_SHARE_PUBLIC_LABEL)) {
                            updateShare.setLabel(operationIntent.getStringExtra(EXTRA_SHARE_PUBLIC_LABEL));
                        }
                        operation = updateShare;
                    }
                    break;
                case ACTION_UNSHARE:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    shareId = operationIntent.getLongExtra(EXTRA_SHARE_ID, -1);
                    if (shareId > 0) {
                        operation = new UnshareOperation(remotePath, shareId, fileDataStorageManager);
                    }
                    break;
                case ACTION_GET_SERVER_INFO:
                    operation = new GetServerInfoOperation(serverUrl, this);
                    break;
                case ACTION_GET_USER_NAME:
                    operation = new GetUserInfoRemoteOperation();
                    break;
                case ACTION_RENAME:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    String newName = operationIntent.getStringExtra(EXTRA_NEWNAME);
                    operation = new RenameFileOperation(remotePath, newName, fileDataStorageManager);
                    break;
                case ACTION_REMOVE:
                    // Remove file or folder
                    OCFile file = operationIntent.getParcelableExtra(EXTRA_FILE);
                    boolean onlyLocalCopy = operationIntent.getBooleanExtra(EXTRA_REMOVE_ONLY_LOCAL, false);
                    boolean inBackground = operationIntent.getBooleanExtra(EXTRA_IN_BACKGROUND, false);
                    operation = new RemoveFileOperation(file, onlyLocalCopy, account, inBackground, getApplicationContext(), fileDataStorageManager);
                    break;
                case ACTION_CREATE_FOLDER:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    operation = new CreateFolderOperation(remotePath, user, getApplicationContext(), fileDataStorageManager);
                    break;
                case ACTION_SYNC_FILE:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    boolean syncFileContents = operationIntent.getBooleanExtra(EXTRA_SYNC_FILE_CONTENTS, true);
                    operation = new SynchronizeFileOperation(remotePath, user, syncFileContents, getApplicationContext(), fileDataStorageManager);
                    break;
                case ACTION_SYNC_FOLDER:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    operation = new SynchronizeFolderOperation(// TODO remove this dependency from construction time
                    this, remotePath, user, // TODO remove this dependency from construction time
                    System.currentTimeMillis(), fileDataStorageManager);
                    break;
                case ACTION_MOVE_FILE:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    newParentPath = operationIntent.getStringExtra(EXTRA_NEW_PARENT_PATH);
                    operation = new MoveFileOperation(remotePath, newParentPath, fileDataStorageManager);
                    break;
                case ACTION_COPY_FILE:
                    remotePath = operationIntent.getStringExtra(EXTRA_REMOTE_PATH);
                    newParentPath = operationIntent.getStringExtra(EXTRA_NEW_PARENT_PATH);
                    operation = new CopyFileOperation(remotePath, newParentPath, fileDataStorageManager);
                    break;
                case ACTION_CHECK_CURRENT_CREDENTIALS:
                    operation = new CheckCurrentCredentialsOperation(user, fileDataStorageManager);
                    break;
                case ACTION_RESTORE_VERSION:
                    FileVersion fileVersion = operationIntent.getParcelableExtra(EXTRA_FILE_VERSION);
                    operation = new RestoreFileVersionRemoteOperation(fileVersion.getRemoteId(), fileVersion.getFileName());
                    break;
                default:
                    // do nothing
                    break;
            }
        }
    } catch (IllegalArgumentException e) {
        Log_OC.e(TAG, "Bad information provided in intent: " + e.getMessage());
        operation = null;
    }
    if (operation != null) {
        return new Pair<>(target, operation);
    } else {
        return null;
    }
}
Also used : Account(android.accounts.Account) OwnCloudAccount(com.owncloud.android.lib.common.OwnCloudAccount) UnshareOperation(com.owncloud.android.operations.UnshareOperation) User(com.nextcloud.client.account.User) UpdateNoteForShareOperation(com.owncloud.android.operations.UpdateNoteForShareOperation) RemoveFileOperation(com.owncloud.android.operations.RemoveFileOperation) RenameFileOperation(com.owncloud.android.operations.RenameFileOperation) CopyFileOperation(com.owncloud.android.operations.CopyFileOperation) OCFile(com.owncloud.android.datamodel.OCFile) SynchronizeFolderOperation(com.owncloud.android.operations.SynchronizeFolderOperation) UpdateShareViaLinkOperation(com.owncloud.android.operations.UpdateShareViaLinkOperation) FileVersion(com.owncloud.android.lib.resources.files.model.FileVersion) RestoreFileVersionRemoteOperation(com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation) Pair(android.util.Pair) GetUserInfoRemoteOperation(com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation) RestoreFileVersionRemoteOperation(com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation) RemoteOperation(com.owncloud.android.lib.common.operations.RemoteOperation) GetUserInfoRemoteOperation(com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation) CreateShareWithShareeOperation(com.owncloud.android.operations.CreateShareWithShareeOperation) CheckCurrentCredentialsOperation(com.owncloud.android.operations.CheckCurrentCredentialsOperation) CreateShareViaLinkOperation(com.owncloud.android.operations.CreateShareViaLinkOperation) CreateFolderOperation(com.owncloud.android.operations.CreateFolderOperation) UpdateShareInfoOperation(com.owncloud.android.operations.UpdateShareInfoOperation) MoveFileOperation(com.owncloud.android.operations.MoveFileOperation) FileDataStorageManager(com.owncloud.android.datamodel.FileDataStorageManager) GetServerInfoOperation(com.owncloud.android.operations.GetServerInfoOperation) UpdateSharePermissionsOperation(com.owncloud.android.operations.UpdateSharePermissionsOperation) ShareType(com.owncloud.android.lib.resources.shares.ShareType) SynchronizeFileOperation(com.owncloud.android.operations.SynchronizeFileOperation)

Example 24 with RemoteOperation

use of com.owncloud.android.lib.common.operations.RemoteOperation in project android by nextcloud.

the class OperationsService method dispatchResultToOperationListeners.

/**
 * Notifies the currently subscribed listeners about the end of an operation.
 *
 * @param operation Finished operation.
 * @param result    Result of the operation.
 */
protected void dispatchResultToOperationListeners(final RemoteOperation operation, final RemoteOperationResult result) {
    int count = 0;
    Iterator<OnRemoteOperationListener> listeners = mOperationsBinder.mBoundListeners.keySet().iterator();
    while (listeners.hasNext()) {
        final OnRemoteOperationListener listener = listeners.next();
        final Handler handler = mOperationsBinder.mBoundListeners.get(listener);
        if (handler != null) {
            handler.post(() -> listener.onRemoteOperationFinish(operation, result));
            count += 1;
        }
    }
    if (count == 0) {
        Pair<RemoteOperation, RemoteOperationResult> undispatched = new Pair<>(operation, result);
        mUndispatchedFinishedOperations.put(operation.hashCode(), undispatched);
    }
    Log_OC.d(TAG, "Called " + count + " listeners");
}
Also used : GetUserInfoRemoteOperation(com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation) RestoreFileVersionRemoteOperation(com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation) RemoteOperation(com.owncloud.android.lib.common.operations.RemoteOperation) RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) OnRemoteOperationListener(com.owncloud.android.lib.common.operations.OnRemoteOperationListener) Handler(android.os.Handler) Pair(android.util.Pair)

Example 25 with RemoteOperation

use of com.owncloud.android.lib.common.operations.RemoteOperation in project android by nextcloud.

the class RemoveFileOperation method run.

/**
 * Performs the remove operation
 *
 * @param   client      Client object to communicate with the remote ownCloud server.
 */
@Override
protected RemoteOperationResult run(OwnCloudClient client) {
    RemoteOperationResult result = null;
    RemoteOperation operation;
    if (MimeTypeUtil.isImage(fileToRemove.getMimeType())) {
        // store resized image
        ThumbnailsCacheManager.generateResizedImage(fileToRemove);
    }
    boolean localRemovalFailed = false;
    if (!onlyLocalCopy) {
        if (fileToRemove.isEncrypted()) {
            OCFile parent = getStorageManager().getFileByPath(fileToRemove.getParentRemotePath());
            operation = new RemoveRemoteEncryptedFileOperation(fileToRemove.getRemotePath(), parent.getLocalId(), account, context, fileToRemove.getEncryptedFileName());
        } else {
            operation = new RemoveFileRemoteOperation(fileToRemove.getRemotePath());
        }
        result = operation.execute(client);
        if (result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND) {
            localRemovalFailed = !(getStorageManager().removeFile(fileToRemove, true, true));
        }
    } else {
        localRemovalFailed = !(getStorageManager().removeFile(fileToRemove, false, true));
        if (!localRemovalFailed) {
            result = new RemoteOperationResult(ResultCode.OK);
        }
    }
    if (localRemovalFailed) {
        result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_REMOVED);
    }
    return result;
}
Also used : OCFile(com.owncloud.android.datamodel.OCFile) RemoveFileRemoteOperation(com.owncloud.android.lib.resources.files.RemoveFileRemoteOperation) RemoteOperation(com.owncloud.android.lib.common.operations.RemoteOperation) RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) RemoveFileRemoteOperation(com.owncloud.android.lib.resources.files.RemoveFileRemoteOperation)

Aggregations

RemoteOperation (com.owncloud.android.lib.common.operations.RemoteOperation)31 RemoteOperationResult (com.owncloud.android.lib.common.operations.RemoteOperationResult)24 Account (android.accounts.Account)7 OCFile (com.owncloud.android.datamodel.OCFile)7 OwnCloudAccount (com.owncloud.android.lib.common.OwnCloudAccount)7 Pair (android.util.Pair)6 OCShare (com.owncloud.android.lib.resources.shares.OCShare)6 ArrayList (java.util.ArrayList)6 RefreshFolderOperation (com.owncloud.android.operations.RefreshFolderOperation)5 Handler (android.os.Handler)4 ExistenceCheckRemoteOperation (com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation)4 GetUserInfoRemoteOperation (com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation)4 User (com.nextcloud.client.account.User)3 FileDataStorageManager (com.owncloud.android.datamodel.FileDataStorageManager)3 ReadFileRemoteOperation (com.owncloud.android.lib.resources.files.ReadFileRemoteOperation)3 RestoreFileVersionRemoteOperation (com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation)3 SearchRemoteOperation (com.owncloud.android.lib.resources.files.SearchRemoteOperation)3 GetShareRemoteOperation (com.owncloud.android.lib.resources.shares.GetShareRemoteOperation)3 UpdateShareRemoteOperation (com.owncloud.android.lib.resources.shares.UpdateShareRemoteOperation)3 AuthenticatorException (android.accounts.AuthenticatorException)2