diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.java b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.java index 37ceb3bd..d502576d 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.java +++ b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.java @@ -5,42 +5,97 @@ import java.util.HashSet; public class PCloudApiError { + public static final HashSet ignoreExistsSet = new HashSet<>( // + Arrays.asList( // + PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue(), // + PCloudApiErrorCodes.FILE_NOT_FOUND.getValue(), // + PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue(), // + PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue(), // + PCloudApiErrorCodes.INVALID_FILE_OR_FOLDER_NAME.getValue() // + )); + public static final HashSet ignoreMoveSet = new HashSet<>( // + Arrays.asList( // + PCloudApiErrorCodes.FILE_OR_FOLDER_ALREADY_EXISTS.getValue(), // + PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue(), // + PCloudApiErrorCodes.FILE_NOT_FOUND.getValue(), // + PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue(), // + PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue() // + ) // + ); + + public static boolean isCloudNodeAlreadyExistsException(int errorCode) { + return errorCode == PCloudApiErrorCodes.FILE_OR_FOLDER_ALREADY_EXISTS.getValue(); + } + + public static boolean isFatalBackendException(int errorCode) { + return errorCode == PCloudApiErrorCodes.INTERNAL_UPLOAD_ERROR.getValue() // + || errorCode == PCloudApiErrorCodes.INTERNAL_UPLOAD_ERROR.getValue() // + || errorCode == PCloudApiErrorCodes.UPLOAD_NOT_FOUND.getValue() // + || errorCode == PCloudApiErrorCodes.TRANSFER_NOT_FOUND.getValue(); + } + + public static boolean isForbiddenException(int errorCode) { + return errorCode == PCloudApiErrorCodes.ACCESS_DENIED.getValue(); + } + + public static boolean isNetworkConnectionException(int errorCode) { + return errorCode == PCloudApiErrorCodes.CONNECTION_BROKE.getValue(); + } + + public static boolean isNoSuchCloudFileException(int errorCode) { + return errorCode == PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue() // + || errorCode == PCloudApiErrorCodes.FILE_NOT_FOUND.getValue() // + || errorCode == PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue() // + || errorCode == PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue(); + } + + public static boolean isWrongCredentialsException(int errorCode) { + return errorCode == PCloudApiErrorCodes.INVALID_ACCESS_TOKEN.getValue() // + || errorCode == PCloudApiErrorCodes.ACCESS_TOKEN_REVOKED.getValue(); + } + + public static boolean isUnauthorizedException(int errorCode) { + return errorCode == PCloudApiErrorCodes.LOGIN_FAILED.getValue() // + || errorCode == PCloudApiErrorCodes.LOGIN_REQUIRED.getValue() // + || errorCode == PCloudApiErrorCodes.TOO_MANY_LOGIN_TRIES_FROM_IP.getValue(); + } + public enum PCloudApiErrorCodes { - LOGIN_REQUIRED(1000), - NO_FULL_PATH_OR_NAME_FOLDER_ID_PROVIDED(1001), - NO_FULL_PATH_OR_FOLDER_ID_PROVIDED(1002), - NO_FILE_ID_OR_PATH_PROVIDED(1004), - INVALID_DATE_TIME_FORMAT(1013), - NO_DESTINATION_PROVIDED(1016), - INVALID_FOLDER_ID(1017), - INVALID_DESTINATION(1037), - PROVIDE_URL(1040), - UPLOAD_NOT_FOUND(1900), - TRANSFER_NOT_FOUND(1902), - LOGIN_FAILED(2000), - INVALID_FILE_OR_FOLDER_NAME(2001), - COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST(2002), - ACCESS_DENIED(2003), - FILE_OR_FOLDER_ALREADY_EXISTS(2004), - DIRECTORY_DOES_NOT_EXIST(2005), - FOLDER_NOT_EMPTY(2006), - CANNOT_DELETE_ROOT_FOLDER(2007), - USER_OVER_QUOTA(2008), - FILE_NOT_FOUND(2009), - INVALID_PATH(2010), - SHARED_FOLDER_IN_SHARED_FOLDER(2023), - ACTIVE_SHARES_OR_SHAREREQUESTS_PRESENT(2028), - CONNECTION_BROKE(2041), - CANNOT_RENAME_ROOT_FOLDER(2042), - CANNOT_MOVE_FOLDER_INTO_SUBFOLDER_OF_ITSELF(2043), - FILE_OR_FOLDER_NOT_FOUND(2055), - NO_FILE_UPLOAD_DETECTED(2088), - INVALID_ACCESS_TOKEN(2094), - ACCESS_TOKEN_REVOKED(2095), - TRANSFER_OVER_QUOTA(2097), - TARGET_FOLDER_DOES_NOT_EXIST(2208), - TOO_MANY_LOGIN_TRIES_FROM_IP(4000), - INTERNAL_ERROR(5000), + LOGIN_REQUIRED(1000), // + NO_FULL_PATH_OR_NAME_FOLDER_ID_PROVIDED(1001), // + NO_FULL_PATH_OR_FOLDER_ID_PROVIDED(1002), // + NO_FILE_ID_OR_PATH_PROVIDED(1004), // + INVALID_DATE_TIME_FORMAT(1013), // + NO_DESTINATION_PROVIDED(1016), // + INVALID_FOLDER_ID(1017), // + INVALID_DESTINATION(1037), // + PROVIDE_URL(1040), // + UPLOAD_NOT_FOUND(1900), // + TRANSFER_NOT_FOUND(1902), // + LOGIN_FAILED(2000), // + INVALID_FILE_OR_FOLDER_NAME(2001), // + COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST(2002), // + ACCESS_DENIED(2003), // + FILE_OR_FOLDER_ALREADY_EXISTS(2004), // + DIRECTORY_DOES_NOT_EXIST(2005), // + FOLDER_NOT_EMPTY(2006), // + CANNOT_DELETE_ROOT_FOLDER(2007), // + USER_OVER_QUOTA(2008), // + FILE_NOT_FOUND(2009), // + INVALID_PATH(2010), // + SHARED_FOLDER_IN_SHARED_FOLDER(2023), // + ACTIVE_SHARES_OR_SHAREREQUESTS_PRESENT(2028), // + CONNECTION_BROKE(2041), // + CANNOT_RENAME_ROOT_FOLDER(2042), // + CANNOT_MOVE_FOLDER_INTO_SUBFOLDER_OF_ITSELF(2043), // + FILE_OR_FOLDER_NOT_FOUND(2055), // + NO_FILE_UPLOAD_DETECTED(2088), // + INVALID_ACCESS_TOKEN(2094), // + ACCESS_TOKEN_REVOKED(2095), // + TRANSFER_OVER_QUOTA(2097), // + TARGET_FOLDER_DOES_NOT_EXIST(2208), // + TOO_MANY_LOGIN_TRIES_FROM_IP(4000), // + INTERNAL_ERROR(5000), // INTERNAL_UPLOAD_ERROR(5001); private final int value; @@ -54,61 +109,4 @@ public class PCloudApiError { } } - public static final HashSet ignoreExistsSet = new HashSet<>( - Arrays.asList( - PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue(), - PCloudApiErrorCodes.FILE_NOT_FOUND.getValue(), - PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue(), - PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue(), - PCloudApiErrorCodes.INVALID_FILE_OR_FOLDER_NAME.getValue() - ) - ); - - public static final HashSet ignoreMoveSet = new HashSet<>( - Arrays.asList( - PCloudApiErrorCodes.FILE_OR_FOLDER_ALREADY_EXISTS.getValue(), - PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue(), - PCloudApiErrorCodes.FILE_NOT_FOUND.getValue(), - PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue(), - PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue() - ) - ); - - public static boolean isCloudNodeAlreadyExistsException(int errorCode) { - return errorCode == PCloudApiErrorCodes.FILE_OR_FOLDER_ALREADY_EXISTS.getValue(); - } - - public static boolean isFatalBackendException(int errorCode) { - return errorCode == PCloudApiErrorCodes.INTERNAL_UPLOAD_ERROR.getValue() - || errorCode == PCloudApiErrorCodes.INTERNAL_UPLOAD_ERROR.getValue() - || errorCode == PCloudApiErrorCodes.UPLOAD_NOT_FOUND.getValue() - || errorCode == PCloudApiErrorCodes.TRANSFER_NOT_FOUND.getValue(); - } - - public static boolean isForbiddenException(int errorCode) { - return errorCode == PCloudApiErrorCodes.ACCESS_DENIED.getValue(); - } - - public static boolean isNetworkConnectionException(int errorCode) { - return errorCode == PCloudApiErrorCodes.CONNECTION_BROKE.getValue(); - } - - public static boolean isNoSuchCloudFileException(int errorCode) { - return errorCode == PCloudApiErrorCodes.COMPONENT_OF_PARENT_DIRECTORY_DOES_NOT_EXIST.getValue() - || errorCode == PCloudApiErrorCodes.FILE_NOT_FOUND.getValue() - || errorCode == PCloudApiErrorCodes.FILE_OR_FOLDER_NOT_FOUND.getValue() - || errorCode == PCloudApiErrorCodes.DIRECTORY_DOES_NOT_EXIST.getValue(); - } - - public static boolean isWrongCredentialsException(int errorCode) { - return errorCode == PCloudApiErrorCodes.INVALID_ACCESS_TOKEN.getValue() - || errorCode == PCloudApiErrorCodes.ACCESS_TOKEN_REVOKED.getValue(); - } - - public static boolean isUnauthorizedException(int errorCode) { - return errorCode == PCloudApiErrorCodes.LOGIN_FAILED.getValue() - || errorCode == PCloudApiErrorCodes.LOGIN_REQUIRED.getValue() - || errorCode == PCloudApiErrorCodes.TOO_MANY_LOGIN_TRIES_FROM_IP.getValue(); - } - -} \ No newline at end of file +} diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.java b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.java index 9c93ddcd..20d1d62a 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.java +++ b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.java @@ -47,8 +47,8 @@ class PCloudContentRepository extends InterceptingCloudContentRepository size) throws BackendException { try { return cloud.file(parent, name, size); - } catch(IOException ex) { + } catch (IOException ex) { throw new FatalBackendException(ex); } } @@ -98,7 +98,7 @@ class PCloudContentRepository extends InterceptingCloudContentRepository progressAware, boolean replace, long size) - throws IOException, BackendException { + public PCloudFile write(PCloudFile file, DataSource data, final ProgressAware progressAware, boolean replace, long size) throws IOException, BackendException { if (!replace && exists(file)) { throw new CloudNodeAlreadyExistsException("CloudNode already exists and replace is false"); } @@ -202,11 +200,11 @@ class PCloudImpl { private RemoteFile uploadFile(final PCloudFile file, DataSource data, final ProgressAware progressAware, UploadOptions uploadOptions, final long size) // throws IOException, BackendException { - ProgressListener listener = (done, total) -> progressAware.onProgress( // - progress(UploadState.upload(file)) // - .between(0) // - .and(size) // - .withValue(done)); + ProgressListener listener = (done, total) -> progressAware.onProgress( // + progress(UploadState.upload(file)) // + .between(0) // + .and(size) // + .withValue(done)); com.pcloud.sdk.DataSource pCloudDataSource = new com.pcloud.sdk.DataSource() { @Override @@ -244,7 +242,7 @@ class PCloudImpl { try { remoteFile = client().loadFile(file.getPath()).execute().asFile(); cacheKey = Optional.of(remoteFile.fileId() + remoteFile.hash()); - } catch(ApiError ex) { + } catch (ApiError ex) { handleApiError(ex, file.getName()); } @@ -288,7 +286,7 @@ class PCloudImpl { }; client().download(fileLink, sink, listener).execute(); - } catch(ApiError ex) { + } catch (ApiError ex) { handleApiError(ex, file.getName()); } @@ -311,7 +309,7 @@ class PCloudImpl { client() // .deleteFile(node.getPath()).execute(); } - } catch(ApiError ex) { + } catch (ApiError ex) { handleApiError(ex, node.getName()); } } @@ -322,7 +320,7 @@ class PCloudImpl { .getUserInfo() // .execute(); return currentAccount.email(); - } catch(ApiError ex) { + } catch (ApiError ex) { handleApiError(ex); throw new FatalBackendException(ex); } @@ -350,11 +348,11 @@ class PCloudImpl { } private void handleApiError(ApiError ex, Set errorCodes, String name) throws BackendException { - if (errorCodes == null || !errorCodes.contains(ex.errorCode())) { + if (errorCodes == null || !errorCodes.contains(ex.errorCode())) { int errorCode = ex.errorCode(); if (PCloudApiError.isCloudNodeAlreadyExistsException(errorCode)) { throw new CloudNodeAlreadyExistsException(name); - } else if (PCloudApiError.isForbiddenException(errorCode)){ + } else if (PCloudApiError.isForbiddenException(errorCode)) { throw new ForbiddenException(); } else if (PCloudApiError.isNetworkConnectionException(errorCode)) { throw new NetworkConnectionException(ex); diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade2To3.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade2To3.kt index 183f7333..e87528eb 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade2To3.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade2To3.kt @@ -17,7 +17,7 @@ internal class Upgrade2To3 @Inject constructor(private val context: Context) : D .columns(listOf("ACCESS_TOKEN")) .where("TYPE", Sql.eq("DROPBOX")) .executeOn(db).use { - if(it.moveToFirst()) { + if (it.moveToFirst()) { Sql.update("CLOUD_ENTITY") .set("ACCESS_TOKEN", Sql.toString(encrypt(it.getString(it.getColumnIndex("ACCESS_TOKEN"))))) .where("TYPE", Sql.eq("DROPBOX")); diff --git a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java index b8d683fc..af12e1ef 100644 --- a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java +++ b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java @@ -182,7 +182,9 @@ public class VaultEntity extends DatabaseEntity { this.position = position; } - /** called by internal mechanisms, do not call yourself. */ + /** + * called by internal mechanisms, do not call yourself. + */ @Generated(hash = 674742652) public void __setDaoSession(DaoSession daoSession) { this.daoSession = daoSession; diff --git a/data/src/main/java/org/cryptomator/data/db/mappers/CloudEntityMapper.java b/data/src/main/java/org/cryptomator/data/db/mappers/CloudEntityMapper.java index 5644d6c6..4b637b25 100644 --- a/data/src/main/java/org/cryptomator/data/db/mappers/CloudEntityMapper.java +++ b/data/src/main/java/org/cryptomator/data/db/mappers/CloudEntityMapper.java @@ -4,10 +4,10 @@ import org.cryptomator.data.db.entities.CloudEntity; import org.cryptomator.domain.Cloud; import org.cryptomator.domain.CloudType; import org.cryptomator.domain.DropboxCloud; -import org.cryptomator.domain.PCloud; import org.cryptomator.domain.GoogleDriveCloud; import org.cryptomator.domain.LocalStorageCloud; import org.cryptomator.domain.OnedriveCloud; +import org.cryptomator.domain.PCloud; import org.cryptomator.domain.WebDavCloud; import javax.inject.Inject; diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt index 9efa046a..e5cab69e 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -4,7 +4,6 @@ import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri import android.os.Build -import android.util.Log import android.widget.Toast import androidx.annotation.RequiresApi import com.pcloud.sdk.AuthorizationActivity @@ -228,7 +227,8 @@ class CloudConnectionListPresenter @Inject constructor( // override fun onSuccess(clouds: List) { clouds.firstOrNull { (it as PCloud).username() == cloud.username() - }?.let { it as PCloud + }?.let { + it as PCloud saveCloud(PCloud.aCopyOf(it) // .withUrl(cloud.url()) .withAccessToken(cloud.accessToken()) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt index f44a24f8..35d65634 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt @@ -207,7 +207,7 @@ class ImagePreviewActivity : BaseActivity(), ImagePreviewView, ConfirmDeleteClou presenter.pageIndexes.size.let { when { it == 0 -> { - showMessage(getString(R.string.dialog_no_more_images_to_display )) + showMessage(getString(R.string.dialog_no_more_images_to_display)) finish() } it > index -> updateTitle(index) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt index 40793409..a632a3ac 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudConnectionListAdapter.kt @@ -74,8 +74,8 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter