Reformat code using new Kotlin formatting rule

This commit is contained in:
Julian Raufelder 2021-05-17 18:26:07 +02:00
parent bb07076ba8
commit 5c024dbda9
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
122 changed files with 2235 additions and 2008 deletions

View File

@ -88,7 +88,8 @@ public class CryptoCloudFactory {
case MASTERKEY_SCHEME: { case MASTERKEY_SCHEME: {
return new MasterkeyCryptoCloudProvider(cloudContentRepository, cryptoCloudContentRepositoryFactory, secureRandom); return new MasterkeyCryptoCloudProvider(cloudContentRepository, cryptoCloudContentRepositoryFactory, secureRandom);
} }
default: throw new IllegalStateException(String.format("Provider with scheme %s not supported", unverifiedVaultConfigOptional.get().getKeyId().getScheme())); default:
throw new IllegalStateException(String.format("Provider with scheme %s not supported", unverifiedVaultConfigOptional.get().getKeyId().getScheme()));
} }
} else { } else {
return new MasterkeyCryptoCloudProvider(cloudContentRepository, cryptoCloudContentRepositoryFactory, secureRandom); return new MasterkeyCryptoCloudProvider(cloudContentRepository, cryptoCloudContentRepositoryFactory, secureRandom);

View File

@ -33,6 +33,30 @@ class S3ClientFactory {
return new HttpLoggingInterceptor(message -> Timber.tag("OkHttp").d(message), context); return new HttpLoggingInterceptor(message -> Timber.tag("OkHttp").d(message), context);
} }
private static Interceptor provideOfflineCacheInterceptor(final Context context) {
return chain -> {
Request request = chain.request();
if (isNetworkAvailable(context)) {
final CacheControl cacheControl = new CacheControl.Builder() //
.maxAge(0, TimeUnit.DAYS) //
.build();
request = request.newBuilder() //
.cacheControl(cacheControl) //
.build();
}
return chain.proceed(request);
};
}
private static boolean isNetworkAvailable(final Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
public MinioClient getClient(S3Cloud cloud, Context context) { public MinioClient getClient(S3Cloud cloud, Context context) {
if (apiClient == null) { if (apiClient == null) {
apiClient = createApiClient(cloud, context); apiClient = createApiClient(cloud, context);
@ -66,30 +90,6 @@ class S3ClientFactory {
.build(); .build();
} }
private static Interceptor provideOfflineCacheInterceptor(final Context context) {
return chain -> {
Request request = chain.request();
if (isNetworkAvailable(context)) {
final CacheControl cacheControl = new CacheControl.Builder() //
.maxAge(0, TimeUnit.DAYS) //
.build();
request = request.newBuilder() //
.cacheControl(cacheControl) //
.build();
}
return chain.proceed(request);
};
}
private static boolean isNetworkAvailable(final Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private String decrypt(String password, Context context) { private String decrypt(String password, Context context) {
return CredentialCryptor // return CredentialCryptor //
.getInstance(context) // .getInstance(context) //

View File

@ -1,14 +1,7 @@
package org.cryptomator.data.cloud.s3; package org.cryptomator.data.cloud.s3;
public enum S3CloudApiErrorCodes { public enum S3CloudApiErrorCodes {
ACCESS_DENIED("AccessDenied"), ACCESS_DENIED("AccessDenied"), ACCOUNT_PROBLEM("AccountProblem"), INTERNAL_ERROR("InternalError"), INVALID_ACCESS_KEY_ID("InvalidAccessKeyId"), INVALID_BUCKET_NAME("InvalidBucketName"), INVALID_OBJECT_STATE("InvalidObjectState"), NO_SUCH_BUCKET("NoSuchBucket"), NO_SUCH_KEY("NoSuchKey");
ACCOUNT_PROBLEM("AccountProblem"),
INTERNAL_ERROR("InternalError"),
INVALID_ACCESS_KEY_ID("InvalidAccessKeyId"),
INVALID_BUCKET_NAME("InvalidBucketName"),
INVALID_OBJECT_STATE("InvalidObjectState"),
NO_SUCH_BUCKET("NoSuchBucket"),
NO_SUCH_KEY("NoSuchKey");
private final String value; private final String value;

View File

@ -3,9 +3,7 @@ package org.cryptomator.data.cloud.s3;
public class S3CloudApiExceptions { public class S3CloudApiExceptions {
public static boolean isAccessProblem(String errorCode) { public static boolean isAccessProblem(String errorCode) {
return errorCode.equals(S3CloudApiErrorCodes.ACCESS_DENIED.getValue()) return errorCode.equals(S3CloudApiErrorCodes.ACCESS_DENIED.getValue()) || errorCode.equals(S3CloudApiErrorCodes.ACCOUNT_PROBLEM.getValue()) || errorCode.equals(S3CloudApiErrorCodes.INVALID_ACCESS_KEY_ID.getValue());
|| errorCode.equals(S3CloudApiErrorCodes.ACCOUNT_PROBLEM.getValue())
|| errorCode.equals(S3CloudApiErrorCodes.INVALID_ACCESS_KEY_ID.getValue());
} }
public static boolean isNoSuchBucketException(String errorCode) { public static boolean isNoSuchBucketException(String errorCode) {

View File

@ -26,8 +26,7 @@ public class UpdateCheckEntity extends DatabaseEntity {
} }
@Generated(hash = 67239496) @Generated(hash = 67239496)
public UpdateCheckEntity(Long id, String licenseToken, String releaseNote, String version, String urlToApk, String apkSha256, public UpdateCheckEntity(Long id, String licenseToken, String releaseNote, String version, String urlToApk, String apkSha256, String urlToReleaseNote) {
String urlToReleaseNote) {
this.id = id; this.id = id;
this.licenseToken = licenseToken; this.licenseToken = licenseToken;
this.releaseNote = releaseNote; this.releaseNote = releaseNote;

View File

@ -182,7 +182,9 @@ public class VaultEntity extends DatabaseEntity {
this.position = position; this.position = position;
} }
/** called by internal mechanisms, do not call yourself. */ /**
* called by internal mechanisms, do not call yourself.
*/
@Generated(hash = 674742652) @Generated(hash = 674742652)
public void __setDaoSession(DaoSession daoSession) { public void __setDaoSession(DaoSession daoSession) {
this.daoSession = daoSession; this.daoSession = daoSession;

View File

@ -3,4 +3,5 @@ package org.cryptomator.domain.exception.vaultconfig;
import org.cryptomator.domain.exception.BackendException; import org.cryptomator.domain.exception.BackendException;
public class VaultKeyInvalidException extends BackendException { public class VaultKeyInvalidException extends BackendException {
} }

View File

@ -20,7 +20,8 @@ class ChangePassword {
private final Vault vault; private final Vault vault;
private final Optional<UnverifiedVaultConfig> unverifiedVaultConfig; private final Optional<UnverifiedVaultConfig> unverifiedVaultConfig;
private final String oldPassword; private final String oldPassword;
private final String newPassword;; private final String newPassword;
;
public ChangePassword(CloudRepository cloudRepository, // public ChangePassword(CloudRepository cloudRepository, //
@Parameter Vault vault, // @Parameter Vault vault, //

View File

@ -14,9 +14,8 @@ class UnlockVaultUsingMasterkey {
private final CloudRepository cloudRepository; private final CloudRepository cloudRepository;
private final VaultOrUnlockToken vaultOrUnlockToken; private final VaultOrUnlockToken vaultOrUnlockToken;
private Optional<UnverifiedVaultConfig> unverifiedVaultConfig;
private final String password; private final String password;
private Optional<UnverifiedVaultConfig> unverifiedVaultConfig;
private volatile boolean cancelled; private volatile boolean cancelled;
private final Flag cancelledFlag = new Flag() { private final Flag cancelledFlag = new Flag() {
@Override @Override

View File

@ -67,7 +67,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
private val getCloudsUseCase: GetCloudsUseCase, // private val getCloudsUseCase: GetCloudsUseCase, //
private val getUsernameUseCase: GetUsernameUseCase, // private val getUsernameUseCase: GetUsernameUseCase, //
private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, //
private val createNewVaultWorkflow: CreateNewVaultWorkflow) : Presenter<AuthenticateCloudView>(exceptionHandlers) { private val createNewVaultWorkflow: CreateNewVaultWorkflow
) : Presenter<AuthenticateCloudView>(exceptionHandlers) {
private val strategies = arrayOf( // private val strategies = arrayOf( //
DropboxAuthStrategy(), // DropboxAuthStrategy(), //
@ -182,7 +183,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
getUsernameAndSuceedAuthentication( // getUsernameAndSuceedAuthentication( //
DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) // DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) //
.withAccessToken(encrypt(authToken)) // .withAccessToken(encrypt(authToken)) //
.build()) .build()
)
} }
} }
} }
@ -200,10 +202,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) { fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) {
if (result.isResultOk) { if (result.isResultOk) {
val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME) val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME)
succeedAuthenticationWith(GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) // succeedAuthenticationWith(
GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) //
.withUsername(accountName) // .withUsername(accountName) //
.withAccessToken(accountName) // .withAccessToken(accountName) //
.build()) .build()
)
} else { } else {
failAuthentication(cloud.name()) failAuthentication(cloud.name())
} }
@ -247,7 +251,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
getUsernameAndSuceedAuthentication( // getUsernameAndSuceedAuthentication( //
OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
.withAccessToken(accessToken) // .withAccessToken(accessToken) //
.build()) .build()
)
} }
} }
@ -267,7 +272,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
Toast.makeText( Toast.makeText(
context(), context(),
String.format(getString(R.string.error_authentication_failed_re_authenticate), intent.cloud().username()), String.format(getString(R.string.error_authentication_failed_re_authenticate), intent.cloud().username()),
Toast.LENGTH_LONG).show() Toast.LENGTH_LONG
).show()
} }
} }
else -> { else -> {
@ -286,9 +292,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
.setClientId(BuildConfig.PCLOUD_CLIENT_ID) .setClientId(BuildConfig.PCLOUD_CLIENT_ID)
.setForceAccessApproval(true) .setForceAccessApproval(true)
.addPermission("manageshares") .addPermission("manageshares")
.build()) .build()
requestActivityResult(ActivityResultCallbacks.pCloudReAuthenticationFinished(), // )
authIntent) requestActivityResult(
ActivityResultCallbacks.pCloudReAuthenticationFinished(), //
authIntent
)
} }
} }
@ -338,10 +347,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
(it as PCloud).username() == cloud.username() (it as PCloud).username() == cloud.username()
}?.let { }?.let {
it as PCloud it as PCloud
succeedAuthenticationWith(PCloud.aCopyOf(it) // succeedAuthenticationWith(
PCloud.aCopyOf(it) //
.withUrl(cloud.url()) .withUrl(cloud.url())
.withAccessToken(cloud.accessToken()) .withAccessToken(cloud.accessToken())
.build()) .build()
)
} ?: succeedAuthenticationWith(cloud) } ?: succeedAuthenticationWith(cloud)
} }
}) })
@ -394,9 +405,11 @@ class AuthenticateCloudPresenter @Inject constructor( //
val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) // val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) //
.withCertificate(X509CertificateHelper.convertToPem(certificate)) // .withCertificate(X509CertificateHelper.convertToPem(certificate)) //
.build() .build()
finishWithResultAndExtra(cloudModelMapper.toModel(webDavCloudWithAcceptedCert), // finishWithResultAndExtra(
cloudModelMapper.toModel(webDavCloudWithAcceptedCert), //
WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, // WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, //
true) true
)
} catch (e: CertificateEncodingException) { } catch (e: CertificateEncodingException) {
Timber.tag("AuthicateCloudPrester").e(e) Timber.tag("AuthicateCloudPrester").e(e)
throw FatalBackendException(e) throw FatalBackendException(e)
@ -423,7 +436,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
Toast.makeText( Toast.makeText(
context(), context(),
String.format(getString(R.string.error_authentication_failed), intent.cloud().username()), String.format(getString(R.string.error_authentication_failed), intent.cloud().username()),
Toast.LENGTH_LONG).show() Toast.LENGTH_LONG
).show()
} }
} }
else -> { else -> {
@ -454,10 +468,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) { private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true authenticationStarted = true
requestPermissions(PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), // requestPermissions(
PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), //
R.string.permission_snackbar_auth_local_vault, // R.string.permission_snackbar_auth_local_vault, //
Manifest.permission.READ_EXTERNAL_STORAGE, // Manifest.permission.READ_EXTERNAL_STORAGE, //
Manifest.permission.WRITE_EXTERNAL_STORAGE) Manifest.permission.WRITE_EXTERNAL_STORAGE
)
} }
} }

View File

@ -97,9 +97,10 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".ui.activity.UnlockVaultActivity" <activity
android:theme="@style/TransparentAlertDialogCustom" android:name=".ui.activity.UnlockVaultActivity"
android:label=""/> android:label=""
android:theme="@style/TransparentAlertDialogCustom" />
<activity android:name=".ui.activity.EmptyDirIdFileInfoActivity" /> <activity android:name=".ui.activity.EmptyDirIdFileInfoActivity" />
<!-- Settings --> <!-- Settings -->

View File

@ -51,10 +51,12 @@ class CryptomatorApp : MultiDexApplication(), HasComponent<ApplicationComponent>
} }
else -> "Google Play Edition" else -> "Google Play Edition"
} }
Timber.tag("App").i("Cryptomator v%s (%d) \"%s\" started on android %s / API%d using a %s", // Timber.tag("App").i(
"Cryptomator v%s (%d) \"%s\" started on android %s / API%d using a %s", //
BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, flavor, // BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, flavor, //
Build.VERSION.RELEASE, Build.VERSION.SDK_INT, // Build.VERSION.RELEASE, Build.VERSION.SDK_INT, //
Build.MODEL) Build.MODEL
)
Timber.tag("App").d("appId %s", BuildConfig.APPLICATION_ID) Timber.tag("App").d("appId %s", BuildConfig.APPLICATION_ID)
launchServices() launchServices()
@ -108,7 +110,8 @@ class CryptomatorApp : MultiDexApplication(), HasComponent<ApplicationComponent>
applicationComponent.cloudContentRepository(), // applicationComponent.cloudContentRepository(), //
applicationComponent.fileUtil(), // applicationComponent.fileUtil(), //
applicationComponent.contentResolverUtil(), // applicationComponent.contentResolverUtil(), //
Companion.applicationContext) Companion.applicationContext
)
} }
override fun onServiceDisconnected(name: ComponentName) { override fun onServiceDisconnected(name: ComponentName) {

View File

@ -12,10 +12,7 @@ public interface UnlockVaultIntent {
VaultAction vaultAction(); VaultAction vaultAction();
enum VaultAction { enum VaultAction {
UNLOCK, UNLOCK, UNLOCK_FOR_BIOMETRIC_AUTH, ENCRYPT_PASSWORD, CHANGE_PASSWORD
UNLOCK_FOR_BIOMETRIC_AUTH,
ENCRYPT_PASSWORD,
CHANGE_PASSWORD
} }
} }

View File

@ -6,38 +6,52 @@ import org.cryptomator.presentation.R
enum class CloudTypeModel(builder: Builder) { enum class CloudTypeModel(builder: Builder) {
CRYPTO(Builder("CRYPTO", R.string.cloud_names_crypto)), // CRYPTO(Builder("CRYPTO", R.string.cloud_names_crypto)), //
DROPBOX(Builder("DROPBOX", R.string.cloud_names_dropbox) // DROPBOX(
Builder("DROPBOX", R.string.cloud_names_dropbox) //
.withCloudImageResource(R.drawable.dropbox) // .withCloudImageResource(R.drawable.dropbox) //
.withVaultImageResource(R.drawable.dropbox_vault) // .withVaultImageResource(R.drawable.dropbox_vault) //
.withVaultSelectedImageResource(R.drawable.dropbox_vault_selected)), // .withVaultSelectedImageResource(R.drawable.dropbox_vault_selected)
GOOGLE_DRIVE(Builder("GOOGLE_DRIVE", R.string.cloud_names_google_drive) // ), //
GOOGLE_DRIVE(
Builder("GOOGLE_DRIVE", R.string.cloud_names_google_drive) //
.withCloudImageResource(R.drawable.google_drive) // .withCloudImageResource(R.drawable.google_drive) //
.withVaultImageResource(R.drawable.google_drive_vault) // .withVaultImageResource(R.drawable.google_drive_vault) //
.withVaultSelectedImageResource(R.drawable.google_drive_vault_selected)), // .withVaultSelectedImageResource(R.drawable.google_drive_vault_selected)
ONEDRIVE(Builder("ONEDRIVE", R.string.cloud_names_onedrive) // ), //
ONEDRIVE(
Builder("ONEDRIVE", R.string.cloud_names_onedrive) //
.withCloudImageResource(R.drawable.onedrive) // .withCloudImageResource(R.drawable.onedrive) //
.withVaultImageResource(R.drawable.onedrive_vault) // .withVaultImageResource(R.drawable.onedrive_vault) //
.withVaultSelectedImageResource(R.drawable.onedrive_vault_selected)), // .withVaultSelectedImageResource(R.drawable.onedrive_vault_selected)
PCLOUD(Builder("PCLOUD", R.string.cloud_names_pcloud) // ), //
PCLOUD(
Builder("PCLOUD", R.string.cloud_names_pcloud) //
.withCloudImageResource(R.drawable.pcloud) // .withCloudImageResource(R.drawable.pcloud) //
.withVaultImageResource(R.drawable.pcloud_vault) // .withVaultImageResource(R.drawable.pcloud_vault) //
.withVaultSelectedImageResource(R.drawable.pcloud_vault_selected) // .withVaultSelectedImageResource(R.drawable.pcloud_vault_selected) //
.withMultiInstances()), // .withMultiInstances()
WEBDAV(Builder("WEBDAV", R.string.cloud_names_webdav) // ), //
WEBDAV(
Builder("WEBDAV", R.string.cloud_names_webdav) //
.withCloudImageResource(R.drawable.webdav) // .withCloudImageResource(R.drawable.webdav) //
.withVaultImageResource(R.drawable.webdav_vault) // .withVaultImageResource(R.drawable.webdav_vault) //
.withVaultSelectedImageResource(R.drawable.webdav_vault_selected) // .withVaultSelectedImageResource(R.drawable.webdav_vault_selected) //
.withMultiInstances()), // .withMultiInstances()
S3(Builder("S3", R.string.cloud_names_s3) // ), //
S3(
Builder("S3", R.string.cloud_names_s3) //
.withCloudImageResource(R.drawable.s3) // .withCloudImageResource(R.drawable.s3) //
.withVaultImageResource(R.drawable.s3_vault) // .withVaultImageResource(R.drawable.s3_vault) //
.withVaultSelectedImageResource(R.drawable.s3_vault_selected) // .withVaultSelectedImageResource(R.drawable.s3_vault_selected) //
.withMultiInstances()), // .withMultiInstances()
LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) // ), //
LOCAL(
Builder("LOCAL", R.string.cloud_names_local_storage) //
.withCloudImageResource(R.drawable.local_fs) // .withCloudImageResource(R.drawable.local_fs) //
.withVaultImageResource(R.drawable.local_fs_vault) // .withVaultImageResource(R.drawable.local_fs_vault) //
.withVaultSelectedImageResource(R.drawable.local_fs_vault_selected) // .withVaultSelectedImageResource(R.drawable.local_fs_vault_selected) //
.withMultiInstances()); .withMultiInstances()
);
val cloudName: String = builder.cloudName val cloudName: String = builder.cloudName
val displayNameResource: Int = builder.displayNameResource val displayNameResource: Int = builder.displayNameResource

View File

@ -31,21 +31,29 @@ class ProgressStateModelMapper @Inject internal constructor(private val fileUtil
fun toModel(state: UploadState): ProgressStateModel { fun toModel(state: UploadState): ProgressStateModel {
return if (state.isUpload) { return if (state.isUpload) {
FileProgressStateModel(state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.UPLOAD, ProgressStateModel.image(R.drawable.ic_file_upload), FileProgressStateModel(
ProgressStateModel.text(R.string.dialog_progress_upload_file)) state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.UPLOAD, ProgressStateModel.image(R.drawable.ic_file_upload),
ProgressStateModel.text(R.string.dialog_progress_upload_file)
)
} else { } else {
FileProgressStateModel(state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.ENCRYPTION, ProgressStateModel.image(R.drawable.ic_lock_closed), FileProgressStateModel(
ProgressStateModel.text(R.string.dialog_progress_encryption)) state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.ENCRYPTION, ProgressStateModel.image(R.drawable.ic_lock_closed),
ProgressStateModel.text(R.string.dialog_progress_encryption)
)
} }
} }
fun toModel(state: DownloadState): ProgressStateModel { fun toModel(state: DownloadState): ProgressStateModel {
return if (state.isDownload) { return if (state.isDownload) {
FileProgressStateModel(state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.DOWNLOAD, ProgressStateModel.image(R.drawable.ic_file_download), FileProgressStateModel(
ProgressStateModel.text(R.string.dialog_progress_download_file)) state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.DOWNLOAD, ProgressStateModel.image(R.drawable.ic_file_download),
ProgressStateModel.text(R.string.dialog_progress_download_file)
)
} else { } else {
FileProgressStateModel(state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.DECRYPTION, ProgressStateModel.image(R.drawable.ic_lock_open), FileProgressStateModel(
ProgressStateModel.text(R.string.dialog_progress_decryption)) state.file(), FileIcon.fileIconFor(state.file().name, fileUtil), FileProgressStateModel.DECRYPTION, ProgressStateModel.image(R.drawable.ic_lock_open),
ProgressStateModel.text(R.string.dialog_progress_decryption)
)
} }
} }
} }

View File

@ -32,7 +32,8 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
private val cloudFolderModelMapper: CloudFolderModelMapper, // private val cloudFolderModelMapper: CloudFolderModelMapper, //
private val sharedPreferencesHandler: SharedPreferencesHandler, // private val sharedPreferencesHandler: SharedPreferencesHandler, //
private val authenticationExceptionHandler: AuthenticationExceptionHandler, // private val authenticationExceptionHandler: AuthenticationExceptionHandler, //
exceptionMappings: ExceptionHandlers) : Presenter<AutoUploadChooseVaultView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<AutoUploadChooseVaultView>(exceptionMappings) {
private var selectedVault: VaultModel? = null private var selectedVault: VaultModel? = null
private var location: CloudFolderModel? = null private var location: CloudFolderModel? = null
@ -80,7 +81,8 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
if (!isPaused) { if (!isPaused) {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.vaultUnlockedAutoUpload(), // ActivityResultCallbacks.vaultUnlockedAutoUpload(), //
Intents.unlockVaultIntent().withVaultModel(VaultModel(authenticatedVault)).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)) Intents.unlockVaultIntent().withVaultModel(VaultModel(authenticatedVault)).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)
)
} }
} }
} }
@ -95,7 +97,6 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
} }
private fun decryptedCloudFor(vault: Vault) { private fun decryptedCloudFor(vault: Vault) {
getDecryptedCloudForVaultUseCase // getDecryptedCloudForVaultUseCase //
.withVault(vault) // .withVault(vault) //
@ -108,7 +109,9 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
if (!authenticationExceptionHandler.handleAuthenticationException( // if (!authenticationExceptionHandler.handleAuthenticationException( //
this@AutoUploadChooseVaultPresenter, // this@AutoUploadChooseVaultPresenter, //
e, // e, //
ActivityResultCallbacks.decryptedCloudForAfterAuthInAutoPhotoUpload(vault))) { ActivityResultCallbacks.decryptedCloudForAfterAuthInAutoPhotoUpload(vault)
)
) {
super.onError(e) super.onError(e)
} }
} }
@ -149,7 +152,9 @@ class AutoUploadChooseVaultPresenter @Inject constructor( //
.withExtraToolbarIcon(R.drawable.ic_clear) // .withExtraToolbarIcon(R.drawable.ic_clear) //
.withButtonText(context().getString(R.string.screen_file_browser_share_button_text)) // .withButtonText(context().getString(R.string.screen_file_browser_share_button_text)) //
.selectingFolders() // .selectingFolders() //
.build())) .build()
)
)
} }
@Callback @Callback

View File

@ -26,7 +26,8 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
private val saveVaultUseCase: SaveVaultUseCase, // private val saveVaultUseCase: SaveVaultUseCase, //
private val lockVaultUseCase: LockVaultUseCase, // private val lockVaultUseCase: LockVaultUseCase, //
exceptionMappings: ExceptionHandlers, // exceptionMappings: ExceptionHandlers, //
private val sharedPreferencesHandler: SharedPreferencesHandler) : Presenter<BiometricAuthSettingsView>(exceptionMappings) { private val sharedPreferencesHandler: SharedPreferencesHandler
) : Presenter<BiometricAuthSettingsView>(exceptionMappings) {
fun loadVaultList() { fun loadVaultList() {
updateVaultListView() updateVaultListView()
@ -56,7 +57,8 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
if (vaultModel.isLocked) { if (vaultModel.isLocked) {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.vaultUnlockedBiometricAuthPres(vaultModel), // ActivityResultCallbacks.vaultUnlockedBiometricAuthPres(vaultModel), //
Intents.unlockVaultIntent().withVaultModel(vaultModel).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK_FOR_BIOMETRIC_AUTH)) Intents.unlockVaultIntent().withVaultModel(vaultModel).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK_FOR_BIOMETRIC_AUTH)
)
} else { } else {
lockVaultUseCase lockVaultUseCase
.withVault(vaultModel.toVault()) .withVault(vaultModel.toVault())
@ -65,7 +67,8 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
super.onSuccess(vault) super.onSuccess(vault)
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.vaultUnlockedBiometricAuthPres(vaultModel), // ActivityResultCallbacks.vaultUnlockedBiometricAuthPres(vaultModel), //
Intents.unlockVaultIntent().withVaultModel(vaultModel).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK_FOR_BIOMETRIC_AUTH)) Intents.unlockVaultIntent().withVaultModel(vaultModel).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK_FOR_BIOMETRIC_AUTH)
)
} }
}) })
} }
@ -79,7 +82,8 @@ class BiometricAuthSettingsPresenter @Inject constructor( //
when { when {
result.isResultOk -> requestActivityResult( // result.isResultOk -> requestActivityResult( //
ActivityResultCallbacks.encryptVaultPassword(vaultModel), // ActivityResultCallbacks.encryptVaultPassword(vaultModel), //
Intents.unlockVaultIntent().withVaultModel(VaultModel(vault)).withVaultAction(UnlockVaultIntent.VaultAction.ENCRYPT_PASSWORD)) Intents.unlockVaultIntent().withVaultModel(VaultModel(vault)).withVaultAction(UnlockVaultIntent.VaultAction.ENCRYPT_PASSWORD)
)
else -> TODO("Not yet implemented") else -> TODO("Not yet implemented")
} }
} }

View File

@ -83,7 +83,8 @@ class BrowseFilesPresenter @Inject constructor( //
private val shareFileHelper: ShareFileHelper, // private val shareFileHelper: ShareFileHelper, //
private val downloadFileUtil: DownloadFileUtil, // private val downloadFileUtil: DownloadFileUtil, //
private val sharedPreferencesHandler: SharedPreferencesHandler, // private val sharedPreferencesHandler: SharedPreferencesHandler, //
exceptionMappings: ExceptionHandlers) : Presenter<BrowseFilesView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<BrowseFilesView>(exceptionMappings) {
private val authenticationExceptionHandler: AuthenticationExceptionHandler private val authenticationExceptionHandler: AuthenticationExceptionHandler
private lateinit var filesForUpload: MutableMap<String, UploadFile> private lateinit var filesForUpload: MutableMap<String, UploadFile>
@ -256,9 +257,14 @@ class BrowseFilesPresenter @Inject constructor( //
} }
private fun readFilesWithProgress(cloudFiles: List<CloudFileModel>, actionAfterDownload: String) { private fun readFilesWithProgress(cloudFiles: List<CloudFileModel>, actionAfterDownload: String) {
view?.showProgress(cloudFiles, // view?.showProgress(
ProgressModel(progressStateModelMapper.toModel( // cloudFiles, //
DownloadState.download(cloudFiles[0].toCloudNode())), 0)) ProgressModel(
progressStateModelMapper.toModel( //
DownloadState.download(cloudFiles[0].toCloudNode())
), 0
)
)
downloadFilesUseCase // downloadFilesUseCase //
.withDownloadFiles(downloadFileUtil.createDownloadFilesFor(this, cloudFiles)) // .withDownloadFiles(downloadFileUtil.createDownloadFilesFor(this, cloudFiles)) //
.run(object : DefaultProgressAwareResultHandler<List<CloudFile>, DownloadState>() { .run(object : DefaultProgressAwareResultHandler<List<CloudFile>, DownloadState>() {
@ -268,8 +274,10 @@ class BrowseFilesPresenter @Inject constructor( //
override fun onProgress(progress: Progress<DownloadState>) { override fun onProgress(progress: Progress<DownloadState>) {
if (!progress.isOverallComplete) { if (!progress.isOverallComplete) {
view?.showProgress(cloudFileModelMapper.toModel(progress.state().file()), // view?.showProgress(
progressModelMapper.toModel(progress)) cloudFileModelMapper.toModel(progress.state().file()), //
progressModelMapper.toModel(progress)
)
} }
} }
@ -419,17 +427,23 @@ class BrowseFilesPresenter @Inject constructor( //
private fun viewFile(cloudFile: CloudFileModel) { private fun viewFile(cloudFile: CloudFileModel) {
val lowerFileName = cloudFile.name.toLowerCase(Locale.getDefault()) val lowerFileName = cloudFile.name.toLowerCase(Locale.getDefault())
if (lowerFileName.endsWith(".txt") || lowerFileName.endsWith(".md") || lowerFileName.endsWith(".todo")) { if (lowerFileName.endsWith(".txt") || lowerFileName.endsWith(".md") || lowerFileName.endsWith(".todo")) {
startIntent(Intents.textEditorIntent() // startIntent(
.withTextFile(cloudFile)) Intents.textEditorIntent() //
.withTextFile(cloudFile)
)
} else if (!lowerFileName.endsWith(".gif") && mimeTypes.fromFilename(cloudFile.name) // } else if (!lowerFileName.endsWith(".gif") && mimeTypes.fromFilename(cloudFile.name) //
.orElse(MimeType.WILDCARD_MIME_TYPE) // .orElse(MimeType.WILDCARD_MIME_TYPE) //
.mediatype == "image") { .mediatype == "image"
) {
val cloudFileNodes = previewCloudFileNodes val cloudFileNodes = previewCloudFileNodes
val imagePreviewStore = ImagePreviewFilesStore( // val imagePreviewStore = ImagePreviewFilesStore( //
cloudFileNodes, // cloudFileNodes, //
cloudFileNodes.indexOf(cloudFile)) cloudFileNodes.indexOf(cloudFile)
startIntent(Intents.imagePreviewIntent() // )
.withWithImagePreviewFiles(fileUtil.storeImagePreviewFiles(imagePreviewStore))) startIntent(
Intents.imagePreviewIntent() //
.withWithImagePreviewFiles(fileUtil.storeImagePreviewFiles(imagePreviewStore))
)
} else { } else {
viewExternalFile(cloudFile) viewExternalFile(cloudFile)
} }
@ -443,7 +457,8 @@ class BrowseFilesPresenter @Inject constructor( //
openedCloudFileMd5 = calculateDigestFromUri(it) openedCloudFileMd5 = calculateDigestFromUri(it)
viewFileIntent.setDataAndType( // viewFileIntent.setDataAndType( //
uriToOpenedFile, // uriToOpenedFile, //
mimeTypes.fromFilename(cloudFile.name).map(MimeType.TO_STRING).orElse(null)) mimeTypes.fromFilename(cloudFile.name).map(MimeType.TO_STRING).orElse(null)
)
viewFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) viewFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
if (sharedPreferencesHandler.keepUnlockedWhileEditing()) { if (sharedPreferencesHandler.keepUnlockedWhileEditing()) {
openWritableFileNotification = Optional.of(OpenWritableFileNotification(context(), it)) openWritableFileNotification = Optional.of(OpenWritableFileNotification(context(), it))
@ -627,7 +642,8 @@ class BrowseFilesPresenter @Inject constructor( //
private fun replacingUploadFile(nodeName: String): UploadFile { private fun replacingUploadFile(nodeName: String): UploadFile {
return UploadFile.aCopyOf( // return UploadFile.aCopyOf( //
filesForUpload[nodeName]) // filesForUpload[nodeName]
) //
.thatIsReplacing(true) // .thatIsReplacing(true) //
.build() .build()
} }
@ -717,13 +733,15 @@ class BrowseFilesPresenter @Inject constructor( //
try { try {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.pickedLocalStorageLocation(nodesToExport, exportOperation), // ActivityResultCallbacks.pickedLocalStorageLocation(nodesToExport, exportOperation), //
Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)) Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
)
} catch (exception: ActivityNotFoundException) { } catch (exception: ActivityNotFoundException) {
Toast // Toast //
.makeText( // .makeText( //
activity().applicationContext, // activity().applicationContext, //
context().getText(R.string.screen_cloud_local_error_no_content_provider), // context().getText(R.string.screen_cloud_local_error_no_content_provider), //
Toast.LENGTH_SHORT) // Toast.LENGTH_SHORT
) //
.show() .show()
Timber.tag("BrowseFilesPresenter").e(exception, "Export file: No ContentProvider on system") Timber.tag("BrowseFilesPresenter").e(exception, "Export file: No ContentProvider on system")
} }
@ -731,23 +749,31 @@ class BrowseFilesPresenter @Inject constructor( //
@Callback @Callback
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
fun pickedLocalStorageLocation(result: ActivityResult, // fun pickedLocalStorageLocation(
result: ActivityResult, //
nodesToExport: ArrayList<CloudNodeModel<*>>, // nodesToExport: ArrayList<CloudNodeModel<*>>, //
exportOperation: ExportOperation) { exportOperation: ExportOperation
) {
val pickedLocalStorageLocation = DocumentsContract.buildChildDocumentsUriUsingTree( // val pickedLocalStorageLocation = DocumentsContract.buildChildDocumentsUriUsingTree( //
Uri.parse(result.intent().data.toString()), // Uri.parse(result.intent().data.toString()), //
DocumentsContract.getTreeDocumentId( // DocumentsContract.getTreeDocumentId( //
Uri.parse(result.intent().data.toString()))) Uri.parse(result.intent().data.toString())
collectNodesToExport(pickedLocalStorageLocation, // )
)
collectNodesToExport(
pickedLocalStorageLocation, //
exportOperation, // exportOperation, //
nodesToExport) nodesToExport
)
disableSelectionMode() disableSelectionMode()
} }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private fun collectNodesToExport(parentUri: Uri, // private fun collectNodesToExport(
parentUri: Uri, //
exportOperation: ExportOperation, // exportOperation: ExportOperation, //
nodesToExport: List<CloudNodeModel<*>>) { nodesToExport: List<CloudNodeModel<*>>
) {
val filesToExport: MutableList<CloudFileModel> = ArrayList() val filesToExport: MutableList<CloudFileModel> = ArrayList()
val foldersForRecursiveDirListing: MutableList<CloudFolderModel> = ArrayList() val foldersForRecursiveDirListing: MutableList<CloudFolderModel> = ArrayList()
nodesToExport.forEach { node -> nodesToExport.forEach { node ->
@ -761,8 +787,10 @@ class BrowseFilesPresenter @Inject constructor( //
} }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private fun collectFolderContentForExport(parentUri: Uri, exportOperation: ExportOperation, folders: List<CloudFolderModel>, // private fun collectFolderContentForExport(
filesToExport: List<CloudFileModel>) { parentUri: Uri, exportOperation: ExportOperation, folders: List<CloudFolderModel>, //
filesToExport: List<CloudFileModel>
) {
view?.showProgress(ProgressModel.GENERIC) view?.showProgress(ProgressModel.GENERIC)
getCloudListRecursiveUseCase // getCloudListRecursiveUseCase //
.withFolders(cloudFolderModelMapper.fromModels(folders)) // .withFolders(cloudFolderModelMapper.fromModels(folders)) //
@ -815,7 +843,8 @@ class BrowseFilesPresenter @Inject constructor( //
context().contentResolver, // context().contentResolver, //
parentUri, // parentUri, //
DocumentsContract.Document.MIME_TYPE_DIR, // DocumentsContract.Document.MIME_TYPE_DIR, //
folderName) folderName
)
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
Timber.tag("BrowseFilesPresenter").e(e) Timber.tag("BrowseFilesPresenter").e(e)
throw IllegalStateException("Creating folder failed") throw IllegalStateException("Creating folder failed")
@ -827,8 +856,11 @@ class BrowseFilesPresenter @Inject constructor( //
return try { return try {
DownloadFile.Builder() // DownloadFile.Builder() //
.setDownloadFile(file) // .setDownloadFile(file) //
.setDataSink(contentResolverUtil.openOutputStream( // .setDataSink(
createNewDocumentUri(documentUri, file.name))) // contentResolverUtil.openOutputStream( //
createNewDocumentUri(documentUri, file.name)
)
) //
.build() .build()
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
showError(e) showError(e)
@ -855,7 +887,8 @@ class BrowseFilesPresenter @Inject constructor( //
context().contentResolver, // context().contentResolver, //
parentUri, // parentUri, //
mimeType.toString(), // mimeType.toString(), //
fileName) fileName
)
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
throw NoSuchCloudFileException(fileName) throw NoSuchCloudFileException(fileName)
} ?: throw IllegalFileNameException() } ?: throw IllegalFileNameException()
@ -863,9 +896,11 @@ class BrowseFilesPresenter @Inject constructor( //
@Callback @Callback
fun exportFileToUserSelectedLocation(result: ActivityResult, fileToExport: CloudFileModel, exportOperation: ExportOperation) { fun exportFileToUserSelectedLocation(result: ActivityResult, fileToExport: CloudFileModel, exportOperation: ExportOperation) {
requestPermissions(PermissionsResultCallbacks.exportFileToUserSelectedLocation(result.intent().dataString, fileToExport, exportOperation), // requestPermissions(
PermissionsResultCallbacks.exportFileToUserSelectedLocation(result.intent().dataString, fileToExport, exportOperation), //
R.string.permission_message_export_file, // R.string.permission_message_export_file, //
Manifest.permission.READ_EXTERNAL_STORAGE) Manifest.permission.READ_EXTERNAL_STORAGE
)
} }
@Callback @Callback
@ -885,9 +920,11 @@ class BrowseFilesPresenter @Inject constructor( //
fun onUploadFilesClicked(folder: CloudFolderModel) { fun onUploadFilesClicked(folder: CloudFolderModel) {
uploadLocation = folder uploadLocation = folder
requestPermissions(PermissionsResultCallbacks.selectFiles(), // requestPermissions(
PermissionsResultCallbacks.selectFiles(), //
R.string.permission_message_upload_file, // R.string.permission_message_upload_file, //
Manifest.permission.READ_EXTERNAL_STORAGE) Manifest.permission.READ_EXTERNAL_STORAGE
)
} }
fun onUploadCanceled() { fun onUploadCanceled() {
@ -937,7 +974,8 @@ class BrowseFilesPresenter @Inject constructor( //
.withExtraToolbarIcon(R.drawable.ic_clear) // .withExtraToolbarIcon(R.drawable.ic_clear) //
.selectingFoldersNotContaining(sourceNodes.map { node -> node.name }) // .selectingFoldersNotContaining(sourceNodes.map { node -> node.name }) //
.excludingFolder(if (foldersToMove.isEmpty()) null else foldersToMove) // .excludingFolder(if (foldersToMove.isEmpty()) null else foldersToMove) //
.build()) .build()
)
} }
private fun effectiveMoveTitle(): String { private fun effectiveMoveTitle(): String {
@ -961,8 +999,10 @@ class BrowseFilesPresenter @Inject constructor( //
} }
fun onMoveNodesClicked(parent: CloudFolderModel, nodesToMove: ArrayList<CloudNodeModel<*>>) { fun onMoveNodesClicked(parent: CloudFolderModel, nodesToMove: ArrayList<CloudNodeModel<*>>) {
requestActivityResult(ActivityResultCallbacks.moveNodes(nodesToMove), // requestActivityResult(
moveIntentFor(parent, nodesToMove)) ActivityResultCallbacks.moveNodes(nodesToMove), //
moveIntentFor(parent, nodesToMove)
)
} }
@Callback @Callback
@ -987,10 +1027,13 @@ class BrowseFilesPresenter @Inject constructor( //
val decryptData = downloadFileUtil.createDecryptedDataFor(this, textFile) val decryptData = downloadFileUtil.createDecryptedDataFor(this, textFile)
downloadFilesUseCase // downloadFilesUseCase //
.withDownloadFiles( // .withDownloadFiles( //
listOf(DownloadFile.Builder() // listOf(
DownloadFile.Builder() //
.setDownloadFile(textFile.toCloudNode()) // .setDownloadFile(textFile.toCloudNode()) //
.setDataSink(decryptData) // .setDataSink(decryptData) //
.build())) // .build()
)
) //
.run(object : DefaultProgressAwareResultHandler<List<CloudFile>, DownloadState>() { .run(object : DefaultProgressAwareResultHandler<List<CloudFile>, DownloadState>() {
override fun onProgress(progress: Progress<DownloadState>) { override fun onProgress(progress: Progress<DownloadState>) {
if (!newlyCreated) { if (!newlyCreated) {
@ -1003,8 +1046,10 @@ class BrowseFilesPresenter @Inject constructor( //
view?.hideProgress(textFile) view?.hideProgress(textFile)
} }
if (internalEditor) { if (internalEditor) {
startIntent(Intents.textEditorIntent() // startIntent(
.withTextFile(textFile)) Intents.textEditorIntent() //
.withTextFile(textFile)
)
} else { } else {
viewExternalFile(textFile) viewExternalFile(textFile)
} }
@ -1105,7 +1150,8 @@ class BrowseFilesPresenter @Inject constructor( //
try { try {
val hashAfterEdit = calculateDigestFromUri(it) val hashAfterEdit = calculateDigestFromUri(it)
if (hashAfterEdit.isPresent && openedCloudFileMd5.isPresent // if (hashAfterEdit.isPresent && openedCloudFileMd5.isPresent //
&& Arrays.equals(hashAfterEdit.get(), openedCloudFileMd5.get())) { && Arrays.equals(hashAfterEdit.get(), openedCloudFileMd5.get())
) {
Timber.tag("BrowseFilesPresenter").i("Opened app finished, file not changed") Timber.tag("BrowseFilesPresenter").i("Opened app finished, file not changed")
} else { } else {
uploadChangedFile() uploadChangedFile()
@ -1224,7 +1270,8 @@ class BrowseFilesPresenter @Inject constructor( //
renameFolderUseCase, // renameFolderUseCase, //
copyDataUseCase, // copyDataUseCase, //
moveFilesUseCase, // moveFilesUseCase, //
moveFoldersUseCase) moveFoldersUseCase
)
this.authenticationExceptionHandler = authenticationExceptionHandler this.authenticationExceptionHandler = authenticationExceptionHandler
} }
} }

View File

@ -24,7 +24,8 @@ class ChooseCloudServicePresenter @Inject constructor( //
private val cloudModelMapper: CloudModelMapper, // private val cloudModelMapper: CloudModelMapper, //
private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, //
private val createNewVaultWorkflow: CreateNewVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, //
exceptionMappings: ExceptionHandlers) : Presenter<ChooseCloudServiceView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<ChooseCloudServiceView>(exceptionMappings) {
override fun workflows(): Iterable<Workflow<*>> { override fun workflows(): Iterable<Workflow<*>> {
return listOf(addExistingVaultWorkflow, createNewVaultWorkflow) return listOf(addExistingVaultWorkflow, createNewVaultWorkflow)
@ -59,7 +60,8 @@ class ChooseCloudServicePresenter @Inject constructor( //
Intents.cloudConnectionListIntent() // Intents.cloudConnectionListIntent() //
.withCloudType(cloudTypeModel) // .withCloudType(cloudTypeModel) //
.withDialogTitle(context().getString(R.string.screen_cloud_connections_title)) // .withDialogTitle(context().getString(R.string.screen_cloud_connections_title)) //
.withFinishOnCloudItemClick(true)) .withFinishOnCloudItemClick(true)
)
} }
@Callback @Callback

View File

@ -49,7 +49,8 @@ class CloudConnectionListPresenter @Inject constructor( //
private val getVaultListUseCase: GetVaultListUseCase, // private val getVaultListUseCase: GetVaultListUseCase, //
private val deleteVaultUseCase: DeleteVaultUseCase, // private val deleteVaultUseCase: DeleteVaultUseCase, //
private val cloudModelMapper: CloudModelMapper, // private val cloudModelMapper: CloudModelMapper, //
exceptionMappings: ExceptionHandlers) : Presenter<CloudConnectionListView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<CloudConnectionListView>(exceptionMappings) {
private val selectedCloudType = AtomicReference<CloudTypeModel>() private val selectedCloudType = AtomicReference<CloudTypeModel>()
private var defaultLocalStorageCloud: LocalStorageCloud? = null private var defaultLocalStorageCloud: LocalStorageCloud? = null
@ -130,8 +131,10 @@ class CloudConnectionListPresenter @Inject constructor( //
fun onAddConnectionClicked() { fun onAddConnectionClicked() {
when (selectedCloudType.get()) { when (selectedCloudType.get()) {
CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), // CloudTypeModel.WEBDAV -> requestActivityResult(
Intents.webDavAddOrChangeIntent()) ActivityResultCallbacks.addChangeMultiCloud(), //
Intents.webDavAddOrChangeIntent()
)
CloudTypeModel.PCLOUD -> { CloudTypeModel.PCLOUD -> {
val authIntent: Intent = AuthorizationActivity.createIntent( val authIntent: Intent = AuthorizationActivity.createIntent(
this.context(), this.context(),
@ -140,12 +143,17 @@ class CloudConnectionListPresenter @Inject constructor( //
.setClientId(BuildConfig.PCLOUD_CLIENT_ID) .setClientId(BuildConfig.PCLOUD_CLIENT_ID)
.setForceAccessApproval(true) .setForceAccessApproval(true)
.addPermission("manageshares") .addPermission("manageshares")
.build()) .build()
requestActivityResult(ActivityResultCallbacks.pCloudAuthenticationFinished(), // )
authIntent) requestActivityResult(
ActivityResultCallbacks.pCloudAuthenticationFinished(), //
authIntent
)
} }
CloudTypeModel.S3 -> requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), // CloudTypeModel.S3 -> requestActivityResult(
Intents.s3AddOrChangeIntent()) ActivityResultCallbacks.addChangeMultiCloud(), //
Intents.s3AddOrChangeIntent()
)
CloudTypeModel.LOCAL -> openDocumentTree() CloudTypeModel.LOCAL -> openDocumentTree()
} }
} }
@ -155,13 +163,15 @@ class CloudConnectionListPresenter @Inject constructor( //
try { try {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.pickedLocalStorageLocation(), // ActivityResultCallbacks.pickedLocalStorageLocation(), //
Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)) Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
)
} catch (exception: ActivityNotFoundException) { } catch (exception: ActivityNotFoundException) {
Toast // Toast //
.makeText( // .makeText( //
activity().applicationContext, // activity().applicationContext, //
context().getText(R.string.screen_cloud_local_error_no_content_provider), // context().getText(R.string.screen_cloud_local_error_no_content_provider), //
Toast.LENGTH_SHORT) // Toast.LENGTH_SHORT
) //
.show() .show()
Timber.tag("CloudConnListPresenter").e(exception, "No ContentProvider on system") Timber.tag("CloudConnListPresenter").e(exception, "No ContentProvider on system")
} }
@ -170,14 +180,18 @@ class CloudConnectionListPresenter @Inject constructor( //
fun onChangeCloudClicked(cloudModel: CloudModel) { fun onChangeCloudClicked(cloudModel: CloudModel) {
when { when {
cloudModel.cloudType() == CloudTypeModel.WEBDAV -> { cloudModel.cloudType() == CloudTypeModel.WEBDAV -> {
requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), // requestActivityResult(
ActivityResultCallbacks.addChangeMultiCloud(), //
Intents.webDavAddOrChangeIntent() // Intents.webDavAddOrChangeIntent() //
.withWebDavCloud(cloudModel as WebDavCloudModel)) .withWebDavCloud(cloudModel as WebDavCloudModel)
)
} }
cloudModel.cloudType() == CloudTypeModel.S3 -> { cloudModel.cloudType() == CloudTypeModel.S3 -> {
requestActivityResult(ActivityResultCallbacks.addChangeMultiCloud(), // requestActivityResult(
ActivityResultCallbacks.addChangeMultiCloud(), //
Intents.s3AddOrChangeIntent() // Intents.s3AddOrChangeIntent() //
.withS3Cloud(cloudModel as S3CloudModel)) .withS3Cloud(cloudModel as S3CloudModel)
)
} }
else -> { else -> {
throw IllegalStateException("Change cloud with type " + cloudModel.cloudType() + " is not supported") throw IllegalStateException("Change cloud with type " + cloudModel.cloudType() + " is not supported")
@ -240,10 +254,12 @@ class CloudConnectionListPresenter @Inject constructor( //
(it as PCloud).username() == cloud.username() (it as PCloud).username() == cloud.username()
}?.let { }?.let {
it as PCloud it as PCloud
saveCloud(PCloud.aCopyOf(it) // saveCloud(
PCloud.aCopyOf(it) //
.withUrl(cloud.url()) .withUrl(cloud.url())
.withAccessToken(cloud.accessToken()) .withAccessToken(cloud.accessToken())
.build()) .build()
)
} ?: saveCloud(cloud) } ?: saveCloud(cloud)
} }
}) })
@ -264,9 +280,11 @@ class CloudConnectionListPresenter @Inject constructor( //
fun pickedLocalStorageLocation(result: ActivityResult) { fun pickedLocalStorageLocation(result: ActivityResult) {
val rootTreeUriOfLocalStorage = result.intent().data val rootTreeUriOfLocalStorage = result.intent().data
persistUriPermission(rootTreeUriOfLocalStorage) persistUriPermission(rootTreeUriOfLocalStorage)
addOrChangeCloudConnectionUseCase.withCloud(LocalStorageCloud.aLocalStorage() // addOrChangeCloudConnectionUseCase.withCloud(
LocalStorageCloud.aLocalStorage() //
.withRootUri(rootTreeUriOfLocalStorage.toString()) // .withRootUri(rootTreeUriOfLocalStorage.toString()) //
.build()) // .build()
) //
.run(object : DefaultResultHandler<Void?>() { .run(object : DefaultResultHandler<Void?>() {
override fun onSuccess(void: Void?) { override fun onSuccess(void: Void?) {
loadCloudList() loadCloudList()
@ -281,7 +299,8 @@ class CloudConnectionListPresenter @Inject constructor( //
.contentResolver // .contentResolver //
.takePersistableUriPermission( // .takePersistableUriPermission( //
it, // it, //
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
} }
} }
@ -291,7 +310,8 @@ class CloudConnectionListPresenter @Inject constructor( //
.contentResolver // .contentResolver //
.releasePersistableUriPermission( // .releasePersistableUriPermission( //
Uri.parse(uri), // Uri.parse(uri), //
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
} }
fun onCloudConnectionClicked(cloudModel: CloudModel) { fun onCloudConnectionClicked(cloudModel: CloudModel) {

View File

@ -33,14 +33,16 @@ class CloudSettingsPresenter @Inject constructor( //
private val getCloudsUseCase: GetCloudsUseCase, // private val getCloudsUseCase: GetCloudsUseCase, //
private val logoutCloudUsecase: LogoutCloudUseCase, // private val logoutCloudUsecase: LogoutCloudUseCase, //
private val cloudModelMapper: CloudModelMapper, // private val cloudModelMapper: CloudModelMapper, //
exceptionMappings: ExceptionHandlers) : Presenter<CloudSettingsView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<CloudSettingsView>(exceptionMappings) {
private val nonSingleLoginClouds: Set<CloudTypeModel> = EnumSet.of( // private val nonSingleLoginClouds: Set<CloudTypeModel> = EnumSet.of( //
CloudTypeModel.CRYPTO, // CloudTypeModel.CRYPTO, //
CloudTypeModel.LOCAL, // CloudTypeModel.LOCAL, //
CloudTypeModel.PCLOUD, // CloudTypeModel.PCLOUD, //
CloudTypeModel.S3, // CloudTypeModel.S3, //
CloudTypeModel.WEBDAV) CloudTypeModel.WEBDAV
)
fun loadClouds() { fun loadClouds() {
getAllCloudsUseCase.run(CloudsSubscriber()) getAllCloudsUseCase.run(CloudsSubscriber())
@ -87,7 +89,8 @@ class CloudSettingsPresenter @Inject constructor( //
Intents.cloudConnectionListIntent() // Intents.cloudConnectionListIntent() //
.withCloudType(cloudTypeModel) // .withCloudType(cloudTypeModel) //
.withDialogTitle(effectiveTitle(cloudTypeModel)) // .withDialogTitle(effectiveTitle(cloudTypeModel)) //
.withFinishOnCloudItemClick(false)) .withFinishOnCloudItemClick(false)
)
} }
private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String { private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String {
@ -110,7 +113,8 @@ class CloudSettingsPresenter @Inject constructor( //
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.onCloudAuthenticated(), // ActivityResultCallbacks.onCloudAuthenticated(), //
Intents.authenticateCloudIntent() // Intents.authenticateCloudIntent() //
.withCloud(cloudModelMapper.toModel(cloud))) .withCloud(cloudModelMapper.toModel(cloud))
)
} }
@Callback @Callback

View File

@ -12,7 +12,8 @@ import javax.inject.Inject
@PerView @PerView
class CreateVaultPresenter @Inject constructor( // class CreateVaultPresenter @Inject constructor( //
private val createNewVaultWorkflow: CreateNewVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, //
exceptionMappings: ExceptionHandlers) : Presenter<CreateVaultView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<CreateVaultView>(exceptionMappings) {
override fun workflows(): Iterable<Workflow<*>> { override fun workflows(): Iterable<Workflow<*>> {
return setOf(createNewVaultWorkflow) return setOf(createNewVaultWorkflow)

View File

@ -50,7 +50,8 @@ class ImagePreviewPresenter @Inject constructor( //
private val deleteNodesUseCase: DeleteNodesUseCase, // private val deleteNodesUseCase: DeleteNodesUseCase, //
private val downloadFileUtil: DownloadFileUtil, // private val downloadFileUtil: DownloadFileUtil, //
private val fileUtil: FileUtil, // private val fileUtil: FileUtil, //
private val cloudFileModelMapper: CloudFileModelMapper) : Presenter<ImagePreviewView>(exceptionMappings) { private val cloudFileModelMapper: CloudFileModelMapper
) : Presenter<ImagePreviewView>(exceptionMappings) {
private var isSystemUiVisible = true private var isSystemUiVisible = true
@ -66,8 +67,10 @@ class ImagePreviewPresenter @Inject constructor( //
} }
private fun copyFileToDownloadDirectory(uri: Uri) { private fun copyFileToDownloadDirectory(uri: Uri) {
requestPermissions(PermissionsResultCallbacks.copyFileToDownloadDirectory(uri.toString()), // requestPermissions(
R.string.permission_message_export_file, Manifest.permission.WRITE_EXTERNAL_STORAGE) PermissionsResultCallbacks.copyFileToDownloadDirectory(uri.toString()), //
R.string.permission_message_export_file, Manifest.permission.WRITE_EXTERNAL_STORAGE
)
} }
@Callback @Callback
@ -114,17 +117,21 @@ class ImagePreviewPresenter @Inject constructor( //
@Callback @Callback
fun copyFileToUserSelectedLocation(result: ActivityResult, sourceUri: String?) { fun copyFileToUserSelectedLocation(result: ActivityResult, sourceUri: String?) {
requestPermissions(PermissionsResultCallbacks.copyFileToUserSelectedLocation(result.intent()?.dataString, sourceUri), // requestPermissions(
PermissionsResultCallbacks.copyFileToUserSelectedLocation(result.intent()?.dataString, sourceUri), //
R.string.permission_message_export_file, // R.string.permission_message_export_file, //
Manifest.permission.READ_EXTERNAL_STORAGE) Manifest.permission.READ_EXTERNAL_STORAGE
)
} }
@Callback @Callback
fun copyFileToUserSelectedLocation(result: PermissionsResult, targetUri: String?, sourceUri: String?) { fun copyFileToUserSelectedLocation(result: PermissionsResult, targetUri: String?, sourceUri: String?) {
if (result.granted()) { if (result.granted()) {
try { try {
copyFile(contentResolverUtil.openInputStream(Uri.parse(sourceUri)), // copyFile(
contentResolverUtil.openOutputStream(Uri.parse(targetUri))) contentResolverUtil.openInputStream(Uri.parse(sourceUri)), //
contentResolverUtil.openOutputStream(Uri.parse(targetUri))
)
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
showError(e) showError(e)
} }

View File

@ -13,7 +13,8 @@ import timber.log.Timber
class LicenseCheckPresenter @Inject internal constructor( class LicenseCheckPresenter @Inject internal constructor(
exceptionHandlers: ExceptionHandlers, // exceptionHandlers: ExceptionHandlers, //
private val doLicenseCheckUsecase: DoLicenseCheckUseCase, // private val doLicenseCheckUsecase: DoLicenseCheckUseCase, //
private val sharedPreferencesHandler: SharedPreferencesHandler) : Presenter<UpdateLicenseView>(exceptionHandlers) { private val sharedPreferencesHandler: SharedPreferencesHandler
) : Presenter<UpdateLicenseView>(exceptionHandlers) {
fun validate(data: Uri?) { fun validate(data: Uri?) {
data?.let { data?.let {

View File

@ -18,7 +18,8 @@ import javax.inject.Inject
class S3AddOrChangePresenter @Inject internal constructor( // class S3AddOrChangePresenter @Inject internal constructor( //
private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, // private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, //
private val connectToS3UseCase: ConnectToS3UseCase, // private val connectToS3UseCase: ConnectToS3UseCase, //
exceptionMappings: ExceptionHandlers) : Presenter<S3AddOrChangeView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<S3AddOrChangeView>(exceptionMappings) {
fun checkUserInput(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String) { fun checkUserInput(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String) {
var statusMessage: String? = null var statusMessage: String? = null

View File

@ -11,7 +11,8 @@ import javax.inject.Inject
@PerView @PerView
class SetPasswordPresenter @Inject constructor( // class SetPasswordPresenter @Inject constructor( //
private val createNewVaultWorkflow: CreateNewVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, //
exceptionMappings: ExceptionHandlers) : Presenter<SetPasswordView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<SetPasswordView>(exceptionMappings) {
override fun workflows(): Iterable<Workflow<*>> { override fun workflows(): Iterable<Workflow<*>> {
return setOf(createNewVaultWorkflow) return setOf(createNewVaultWorkflow)

View File

@ -44,7 +44,8 @@ class SettingsPresenter @Inject internal constructor(
private val networkConnectionCheck: NetworkConnectionCheck, // private val networkConnectionCheck: NetworkConnectionCheck, //
exceptionMappings: ExceptionHandlers, // exceptionMappings: ExceptionHandlers, //
private val fileUtil: FileUtil, // private val fileUtil: FileUtil, //
private val sharedPreferencesHandler: SharedPreferencesHandler) : Presenter<SettingsView>(exceptionMappings) { private val sharedPreferencesHandler: SharedPreferencesHandler
) : Presenter<SettingsView>(exceptionMappings) {
fun onSendErrorReportClicked() { fun onSendErrorReportClicked() {
view?.showProgress(ProgressModel.GENERIC) view?.showProgress(ProgressModel.GENERIC)
@ -86,10 +87,12 @@ class SettingsPresenter @Inject internal constructor(
} }
fun grantLocalStoragePermissionForAutoUpload() { fun grantLocalStoragePermissionForAutoUpload() {
requestPermissions(PermissionsResultCallbacks.onLocalStoragePermissionGranted(), // requestPermissions(
PermissionsResultCallbacks.onLocalStoragePermissionGranted(), //
R.string.permission_snackbar_auth_auto_upload, // R.string.permission_snackbar_auth_auto_upload, //
Manifest.permission.READ_EXTERNAL_STORAGE, // Manifest.permission.READ_EXTERNAL_STORAGE, //
Manifest.permission.WRITE_EXTERNAL_STORAGE) Manifest.permission.WRITE_EXTERNAL_STORAGE
)
} }
@Callback @Callback

View File

@ -42,7 +42,8 @@ class SharedFilesPresenter @Inject constructor( //
private val authenticationExceptionHandler: AuthenticationExceptionHandler, // private val authenticationExceptionHandler: AuthenticationExceptionHandler, //
private val cloudFolderModelMapper: CloudFolderModelMapper, // private val cloudFolderModelMapper: CloudFolderModelMapper, //
private val progressModelMapper: ProgressModelMapper, // private val progressModelMapper: ProgressModelMapper, //
exceptionMappings: ExceptionHandlers) : Presenter<SharedFilesView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<SharedFilesView>(exceptionMappings) {
private val filesForUpload: MutableSet<UploadFile> = HashSet() private val filesForUpload: MutableSet<UploadFile> = HashSet()
private val existingFilesForUpload: MutableSet<UploadFile> = HashSet() private val existingFilesForUpload: MutableSet<UploadFile> = HashSet()
@ -129,7 +130,8 @@ class SharedFilesPresenter @Inject constructor( //
if (!isPaused) { if (!isPaused) {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.vaultUnlockedSharedFiles(), // ActivityResultCallbacks.vaultUnlockedSharedFiles(), //
Intents.unlockVaultIntent().withVaultModel(VaultModel(authenticatedVault)).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)) Intents.unlockVaultIntent().withVaultModel(VaultModel(authenticatedVault)).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)
)
} }
} }
} }
@ -192,9 +194,11 @@ class SharedFilesPresenter @Inject constructor( //
this.location = location this.location = location
} }
private fun uploadFiles(nonReplacing: Set<UploadFile>, // private fun uploadFiles(
nonReplacing: Set<UploadFile>, //
replacing: Set<UploadFile>, // replacing: Set<UploadFile>, //
folder: CloudFolder) { folder: CloudFolder
) {
if (nonReplacing.size + replacing.size == 0) { if (nonReplacing.size + replacing.size == 0) {
view?.finish() view?.finish()
} }
@ -266,7 +270,8 @@ class SharedFilesPresenter @Inject constructor( //
existingFilesForUpload.add( // existingFilesForUpload.add( //
UploadFile.aCopyOf(uploadFileWithName.get()) // UploadFile.aCopyOf(uploadFileWithName.get()) //
.thatIsReplacing(true) // .thatIsReplacing(true) //
.build()) .build()
)
} else { } else {
// remove file when name is used by a folder // remove file when name is used by a folder
filesForUpload.remove(uploadFileWithName.get()) filesForUpload.remove(uploadFileWithName.get())
@ -310,9 +315,11 @@ class SharedFilesPresenter @Inject constructor( //
view?.showMessage(R.string.error_names_contains_invalid_characters) view?.showMessage(R.string.error_names_contains_invalid_characters)
} }
else -> { else -> {
requestPermissions(PermissionsResultCallbacks.saveFilesPermissionCallback(), // requestPermissions(
PermissionsResultCallbacks.saveFilesPermissionCallback(), //
R.string.permission_message_share_file, // R.string.permission_message_share_file, //
Manifest.permission.READ_EXTERNAL_STORAGE) Manifest.permission.READ_EXTERNAL_STORAGE
)
} }
} }
} }
@ -345,7 +352,9 @@ class SharedFilesPresenter @Inject constructor( //
.withExtraToolbarIcon(R.drawable.ic_clear) // .withExtraToolbarIcon(R.drawable.ic_clear) //
.withButtonText(context().getString(R.string.screen_file_browser_share_button_text)) // .withButtonText(context().getString(R.string.screen_file_browser_share_button_text)) //
.selectingFolders() // .selectingFolders() //
.build())) .build()
)
)
} }
@Callback @Callback
@ -408,6 +417,7 @@ class SharedFilesPresenter @Inject constructor( //
getVaultListUseCase, // getVaultListUseCase, //
getDecryptedCloudForVaultUseCase, // getDecryptedCloudForVaultUseCase, //
uploadFilesUseCase, // uploadFilesUseCase, //
getCloudListUseCase) getCloudListUseCase
)
} }
} }

View File

@ -25,7 +25,8 @@ class TextEditorPresenter @Inject constructor( //
private val fileUtil: FileUtil, // private val fileUtil: FileUtil, //
private val contentResolverUtil: ContentResolverUtil, // private val contentResolverUtil: ContentResolverUtil, //
private val uploadFilesUseCase: UploadFilesUseCase, // private val uploadFilesUseCase: UploadFilesUseCase, //
exceptionMappings: ExceptionHandlers) : Presenter<TextEditorView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<TextEditorView>(exceptionMappings) {
private val textFile = AtomicReference<CloudFileModel>() private val textFile = AtomicReference<CloudFileModel>()
@ -73,13 +74,15 @@ class TextEditorPresenter @Inject constructor( //
private fun uploadFile(fileName: String, dataSource: DataSource) { private fun uploadFile(fileName: String, dataSource: DataSource) {
uploadFilesUseCase // uploadFilesUseCase //
.withParent(textFile.get().parent.toCloudNode()) // .withParent(textFile.get().parent.toCloudNode()) //
.andFiles(listOf( // .andFiles(
listOf( //
UploadFile.anUploadFile() // UploadFile.anUploadFile() //
.withFileName(fileName) // .withFileName(fileName) //
.withDataSource(dataSource) // .withDataSource(dataSource) //
.thatIsReplacing(true) // .thatIsReplacing(true) //
.build() // .build() //
)) // )
) //
.run(object : DefaultProgressAwareResultHandler<List<CloudFile?>, UploadState>() { .run(object : DefaultProgressAwareResultHandler<List<CloudFile?>, UploadState>() {
override fun onFinished() { override fun onFinished() {
view?.showProgress(ProgressModel.COMPLETED) view?.showProgress(ProgressModel.COMPLETED)

View File

@ -50,7 +50,8 @@ class UnlockVaultPresenter @Inject constructor(
private val saveVaultUseCase: SaveVaultUseCase, private val saveVaultUseCase: SaveVaultUseCase,
private val authenticationExceptionHandler: AuthenticationExceptionHandler, private val authenticationExceptionHandler: AuthenticationExceptionHandler,
private val sharedPreferencesHandler: SharedPreferencesHandler, private val sharedPreferencesHandler: SharedPreferencesHandler,
exceptionMappings: ExceptionHandlers) : Presenter<UnlockVaultView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<UnlockVaultView>(exceptionMappings) {
private var startedUsingPrepareUnlock = false private var startedUsingPrepareUnlock = false
private var retryUnlockHandler: Handler? = null private var retryUnlockHandler: Handler? = null
@ -317,10 +318,13 @@ class UnlockVaultPresenter @Inject constructor(
view?.showProgress(ProgressModel.COMPLETED) view?.showProgress(ProgressModel.COMPLETED)
view?.showMessage(R.string.screen_vault_list_change_password_successful) view?.showMessage(R.string.screen_vault_list_change_password_successful)
if (canUseBiometricOn(vaultModel)) { if (canUseBiometricOn(vaultModel)) {
view?.getEncryptedPasswordWithBiometricAuthentication(VaultModel( // view?.getEncryptedPasswordWithBiometricAuthentication(
VaultModel( //
Vault.aCopyOf(vaultModel.toVault()) // Vault.aCopyOf(vaultModel.toVault()) //
.withSavedPassword(newPassword) // .withSavedPassword(newPassword) //
.build())) .build()
)
)
} else { } else {
finishWithResult(vaultModel) finishWithResult(vaultModel)
} }
@ -329,7 +333,9 @@ class UnlockVaultPresenter @Inject constructor(
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
if (!authenticationExceptionHandler.handleAuthenticationException( // if (!authenticationExceptionHandler.handleAuthenticationException( //
this@UnlockVaultPresenter, e, // this@UnlockVaultPresenter, e, //
ActivityResultCallbacks.changePasswordAfterAuthentication(vaultModel.toVault(), unverifiedVaultConfig, oldPassword, newPassword))) { ActivityResultCallbacks.changePasswordAfterAuthentication(vaultModel.toVault(), unverifiedVaultConfig, oldPassword, newPassword)
)
) {
showError(e) showError(e)
} }
} }
@ -417,7 +423,8 @@ class UnlockVaultPresenter @Inject constructor(
unlockVaultUsingMasterkeyUseCase, // unlockVaultUsingMasterkeyUseCase, //
prepareUnlockUseCase, // prepareUnlockUseCase, //
removeStoredVaultPasswordsUseCase, // removeStoredVaultPasswordsUseCase, //
saveVaultUseCase) saveVaultUseCase
)
} }
} }

View File

@ -79,7 +79,8 @@ class VaultListPresenter @Inject constructor( //
private val authenticationExceptionHandler: AuthenticationExceptionHandler, // private val authenticationExceptionHandler: AuthenticationExceptionHandler, //
private val cloudFolderModelMapper: CloudFolderModelMapper, // private val cloudFolderModelMapper: CloudFolderModelMapper, //
private val sharedPreferencesHandler: SharedPreferencesHandler, // private val sharedPreferencesHandler: SharedPreferencesHandler, //
exceptionMappings: ExceptionHandlers) : Presenter<VaultListView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<VaultListView>(exceptionMappings) {
private var vaultAction: VaultAction? = null private var vaultAction: VaultAction? = null
@ -214,7 +215,9 @@ class VaultListPresenter @Inject constructor( //
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
if (!authenticationExceptionHandler.handleAuthenticationException( // if (!authenticationExceptionHandler.handleAuthenticationException( //
this@VaultListPresenter, e, // this@VaultListPresenter, e, //
ActivityResultCallbacks.renameVaultAfterAuthentication(vaultModel.toVault(), newVaultName))) { ActivityResultCallbacks.renameVaultAfterAuthentication(vaultModel.toVault(), newVaultName)
)
) {
showError(e) showError(e)
} }
} }
@ -314,7 +317,8 @@ class VaultListPresenter @Inject constructor( //
Intents.cloudConnectionListIntent() // Intents.cloudConnectionListIntent() //
.withCloudType(vault.cloudType) // .withCloudType(vault.cloudType) //
.withDialogTitle(context().getString(R.string.screen_cloud_connections_title)) // .withDialogTitle(context().getString(R.string.screen_cloud_connections_title)) //
.withFinishOnCloudItemClick(true)) .withFinishOnCloudItemClick(true)
)
} }
} }
@ -353,7 +357,8 @@ class VaultListPresenter @Inject constructor( //
if (!isPaused) { if (!isPaused) {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.vaultUnlockedVaultList(), // ActivityResultCallbacks.vaultUnlockedVaultList(), //
Intents.unlockVaultIntent().withVaultModel(authenticatedVault).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)) Intents.unlockVaultIntent().withVaultModel(authenticatedVault).withVaultAction(UnlockVaultIntent.VaultAction.UNLOCK)
)
} }
} else { } else {
browseFilesOf(authenticatedVault) browseFilesOf(authenticatedVault)
@ -495,6 +500,7 @@ class VaultListPresenter @Inject constructor( //
moveVaultPositionUseCase, // moveVaultPositionUseCase, //
licenseCheckUseCase, // licenseCheckUseCase, //
updateCheckUseCase, // updateCheckUseCase, //
updateUseCase) updateUseCase
)
} }
} }

View File

@ -24,7 +24,8 @@ class WebDavAddOrChangePresenter @Inject internal constructor( //
private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, // private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, //
private val connectToWebDavUseCase: ConnectToWebDavUseCase, // private val connectToWebDavUseCase: ConnectToWebDavUseCase, //
private val authenticationExceptionHandler: AuthenticationExceptionHandler, // private val authenticationExceptionHandler: AuthenticationExceptionHandler, //
exceptionMappings: ExceptionHandlers) : Presenter<WebDavAddOrChangeView>(exceptionMappings) { exceptionMappings: ExceptionHandlers
) : Presenter<WebDavAddOrChangeView>(exceptionMappings) {
fun checkUserInput(urlPort: String, username: String, password: String, cloudId: Long?, certificate: String?) { fun checkUserInput(urlPort: String, username: String, password: String, cloudId: Long?, certificate: String?) {
var statusMessage: String? = null var statusMessage: String? = null

View File

@ -31,7 +31,8 @@ class AutoUploadNotification(private val context: Context, private val amountOfP
val notificationChannel = NotificationChannel( // val notificationChannel = NotificationChannel( //
NOTIFICATION_CHANNEL_ID, // NOTIFICATION_CHANNEL_ID, //
NOTIFICATION_CHANNEL_NAME, // NOTIFICATION_CHANNEL_NAME, //
IMPORTANCE_LOW) IMPORTANCE_LOW
)
notificationManager?.createNotificationChannel(notificationChannel) notificationManager?.createNotificationChannel(notificationChannel)
} }
@ -68,9 +69,12 @@ class AutoUploadNotification(private val context: Context, private val amountOfP
builder.setContentIntent(startTheActivity()) builder.setContentIntent(startTheActivity())
builder // builder //
.setContentText( // .setContentText( //
String.format(context.getString(R.string.notification_auto_upload_message), // String.format(
context.getString(R.string.notification_auto_upload_message), //
alreadyUploadedPictures + 1, // alreadyUploadedPictures + 1, //
amountOfPictures)) // amountOfPictures
)
) //
.setProgress(100, progress, false) .setProgress(100, progress, false)
show() show()
} }

View File

@ -28,7 +28,8 @@ class OpenWritableFileNotification(private val context: Context, private val uri
val notificationChannel = NotificationChannel( // val notificationChannel = NotificationChannel( //
NOTIFICATION_CHANNEL_ID, // NOTIFICATION_CHANNEL_ID, //
NOTIFICATION_CHANNEL_NAME, // NOTIFICATION_CHANNEL_NAME, //
IMPORTANCE_LOW) IMPORTANCE_LOW
)
notificationManager?.createNotificationChannel(notificationChannel) notificationManager?.createNotificationChannel(notificationChannel)
} }

View File

@ -75,12 +75,16 @@ class PhotoContentJob : JobService() {
private fun getContentResolvers(ids: Set<String>): Array<Cursor?> { private fun getContentResolvers(ids: Set<String>): Array<Cursor?> {
val selection = buildSelection(ids) val selection = buildSelection(ids)
var resolvers = arrayOf(contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION_IMAGES, selection, null, null), var resolvers = arrayOf(
contentResolver.query(MediaStore.Images.Media.INTERNAL_CONTENT_URI, PROJECTION_IMAGES, selection, null, null)) contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION_IMAGES, selection, null, null),
contentResolver.query(MediaStore.Images.Media.INTERNAL_CONTENT_URI, PROJECTION_IMAGES, selection, null, null)
)
if (SharedPreferencesHandler(applicationContext).autoPhotoUploadIncludingVideos()) { if (SharedPreferencesHandler(applicationContext).autoPhotoUploadIncludingVideos()) {
resolvers += arrayOf(contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, PROJECTION_VIDEOS, selection, null, null), resolvers += arrayOf(
contentResolver.query(MediaStore.Video.Media.INTERNAL_CONTENT_URI, PROJECTION_VIDEOS, selection, null, null)) contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, PROJECTION_VIDEOS, selection, null, null),
contentResolver.query(MediaStore.Video.Media.INTERNAL_CONTENT_URI, PROJECTION_VIDEOS, selection, null, null)
)
} }
return resolvers return resolvers

View File

@ -377,7 +377,8 @@ abstract class BaseActivity : AppCompatActivity(), View, ActivityCompat.OnReques
val enter: Int, val enter: Int,
val exit: Int, val exit: Int,
val popEnter: Int, val popEnter: Int,
val popExit: Int) { val popExit: Int
) {
NAVIGATE_IN_TO_FOLDER(R.animator.enter_from_right, R.animator.exit_to_left, R.animator.enter_from_left, R.animator.exit_to_right), // NAVIGATE_IN_TO_FOLDER(R.animator.enter_from_right, R.animator.exit_to_left, R.animator.enter_from_left, R.animator.exit_to_right), //
NAVIGATE_OUT_OF_FOLDER(R.animator.enter_from_left, R.animator.exit_to_right, R.animator.enter_from_right, R.animator.exit_to_left) NAVIGATE_OUT_OF_FOLDER(R.animator.enter_from_left, R.animator.exit_to_right, R.animator.enter_from_right, R.animator.exit_to_left)

View File

@ -97,8 +97,10 @@ class BrowseFilesActivity : BaseActivity(), //
get() = browseFilesFragment().folder get() = browseFilesFragment().folder
override fun createFragment(): Fragment = override fun createFragment(): Fragment =
BrowseFilesFragment.newInstance(browseFilesIntent.folder(), BrowseFilesFragment.newInstance(
browseFilesIntent.chooseCloudNodeSettings()) browseFilesIntent.folder(),
browseFilesIntent.chooseCloudNodeSettings()
)
override fun onBackPressed() { override fun onBackPressed() {
browseFilesPresenter.onBackPressed() browseFilesPresenter.onBackPressed()
@ -160,14 +162,17 @@ class BrowseFilesActivity : BaseActivity(), //
true true
} }
R.id.action_move_items -> { R.id.action_move_items -> {
browseFilesPresenter.onMoveNodesClicked(folder, // browseFilesPresenter.onMoveNodesClicked(
browseFilesFragment().selectedCloudNodes as ArrayList<CloudNodeModel<*>>) folder, //
browseFilesFragment().selectedCloudNodes as ArrayList<CloudNodeModel<*>>
)
true true
} }
R.id.action_export_items -> { R.id.action_export_items -> {
browseFilesPresenter.onExportNodesClicked( // browseFilesPresenter.onExportNodesClicked( //
browseFilesFragment().selectedCloudNodes as ArrayList<CloudNodeModel<*>>, // browseFilesFragment().selectedCloudNodes as ArrayList<CloudNodeModel<*>>, //
BrowseFilesPresenter.EXPORT_TRIGGERED_BY_USER) BrowseFilesPresenter.EXPORT_TRIGGERED_BY_USER
)
true true
} }
R.id.action_share_items -> { R.id.action_share_items -> {
@ -398,9 +403,13 @@ class BrowseFilesActivity : BaseActivity(), //
} }
override fun navigateTo(folder: CloudFolderModel) { override fun navigateTo(folder: CloudFolderModel) {
replaceFragment(BrowseFilesFragment.newInstance(folder, replaceFragment(
browseFilesIntent.chooseCloudNodeSettings()), BrowseFilesFragment.newInstance(
FragmentAnimation.NAVIGATE_IN_TO_FOLDER) folder,
browseFilesIntent.chooseCloudNodeSettings()
),
FragmentAnimation.NAVIGATE_IN_TO_FOLDER
)
} }
override fun showAddContentDialog() { override fun showAddContentDialog() {
@ -484,10 +493,14 @@ class BrowseFilesActivity : BaseActivity(), //
} }
private fun createBackStackFor(sourceParent: CloudFolderModel) { private fun createBackStackFor(sourceParent: CloudFolderModel) {
replaceFragment(BrowseFilesFragment.newInstance(sourceParent, replaceFragment(
browseFilesIntent.chooseCloudNodeSettings()), BrowseFilesFragment.newInstance(
sourceParent,
browseFilesIntent.chooseCloudNodeSettings()
),
FragmentAnimation.NAVIGATE_OUT_OF_FOLDER, FragmentAnimation.NAVIGATE_OUT_OF_FOLDER,
false) false
)
} }
override fun onRenameCloudNodeClicked(cloudNodeModel: CloudNodeModel<*>, newCloudNodeName: String) { override fun onRenameCloudNodeClicked(cloudNodeModel: CloudNodeModel<*>, newCloudNodeName: String) {

View File

@ -24,8 +24,10 @@ class EmptyDirIdFileInfoActivity : BaseActivity(), EmptyDirFileView {
} }
private fun setupToolbar() { private fun setupToolbar() {
toolbar.title = getString(R.string.screen_empty_dir_file_info_title, toolbar.title = getString(
emptyDirIdFileInfoIntent.dirName()) R.string.screen_empty_dir_file_info_title,
emptyDirIdFileInfoIntent.dirName()
)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
} }

View File

@ -45,10 +45,12 @@ import kotlinx.android.synthetic.main.view_cloud_folder_content.view.cloudFolder
import kotlinx.android.synthetic.main.view_cloud_folder_content.view.cloudFolderText import kotlinx.android.synthetic.main.view_cloud_folder_content.view.cloudFolderText
class BrowseFilesAdapter @Inject class BrowseFilesAdapter @Inject
constructor(private val dateHelper: DateHelper, // constructor(
private val dateHelper: DateHelper, //
private val fileSizeHelper: FileSizeHelper, // private val fileSizeHelper: FileSizeHelper, //
private val fileUtil: FileUtil, // private val fileUtil: FileUtil, //
private val sharedPreferencesHandler: SharedPreferencesHandler) : RecyclerViewBaseAdapter<CloudNodeModel<*>, BrowseFilesAdapter.ItemClickListener, VaultContentViewHolder>(CloudNodeModelNameAZComparator()), FastScrollRecyclerView.SectionedAdapter { private val sharedPreferencesHandler: SharedPreferencesHandler
) : RecyclerViewBaseAdapter<CloudNodeModel<*>, BrowseFilesAdapter.ItemClickListener, VaultContentViewHolder>(CloudNodeModelNameAZComparator()), FastScrollRecyclerView.SectionedAdapter {
private var chooseCloudNodeSettings: ChooseCloudNodeSettings? = null private var chooseCloudNodeSettings: ChooseCloudNodeSettings? = null
private var navigationMode: ChooseCloudNodeSettings.NavigationMode? = null private var navigationMode: ChooseCloudNodeSettings.NavigationMode? = null

View File

@ -7,4 +7,5 @@ import org.cryptomator.presentation.ui.dialog.CloudNodeRenameDialog
import org.cryptomator.presentation.ui.dialog.CreateFolderDialog import org.cryptomator.presentation.ui.dialog.CreateFolderDialog
import org.cryptomator.presentation.ui.dialog.FileTypeNotSupportedDialog import org.cryptomator.presentation.ui.dialog.FileTypeNotSupportedDialog
interface BrowseFilesCallback : CreateFolderDialog.Callback, VaultContentActionBottomSheet.Callback, FileSettingsBottomSheet.Callback, FolderSettingsBottomSheet.Callback, CloudNodeRenameDialog.Callback, FileTypeNotSupportedDialog.Callback interface BrowseFilesCallback : CreateFolderDialog.Callback, VaultContentActionBottomSheet.Callback, FileSettingsBottomSheet.Callback, FolderSettingsBottomSheet.Callback, CloudNodeRenameDialog.Callback,
FileTypeNotSupportedDialog.Callback

View File

@ -35,13 +35,18 @@ class ChangePasswordDialog : BaseProgressErrorDialog<ChangePasswordDialog.Callba
changePasswordButton?.setOnClickListener { changePasswordButton?.setOnClickListener {
val vaultModel = requireArguments().getSerializable(VAULT_ARG) as VaultModel val vaultModel = requireArguments().getSerializable(VAULT_ARG) as VaultModel
val unverifiedVaultConfig = requireArguments().getSerializable(VAULT_CONFIG_ARG) as UnverifiedVaultConfig? val unverifiedVaultConfig = requireArguments().getSerializable(VAULT_CONFIG_ARG) as UnverifiedVaultConfig?
if (valid(et_old_password.text.toString(), // if (valid(
et_old_password.text.toString(), //
et_new_password.text.toString(), // et_new_password.text.toString(), //
et_new_retype_password.text.toString())) { et_new_retype_password.text.toString()
callback?.onChangePasswordClick(vaultModel, // )
) {
callback?.onChangePasswordClick(
vaultModel, //
unverifiedVaultConfig, // unverifiedVaultConfig, //
et_old_password.text.toString(), // et_old_password.text.toString(), //
et_new_password.text.toString()) et_new_password.text.toString()
)
onWaitForResponse(et_old_password) onWaitForResponse(et_old_password)
} else { } else {
hideKeyboard(et_old_password) hideKeyboard(et_old_password)
@ -58,10 +63,12 @@ class ChangePasswordDialog : BaseProgressErrorDialog<ChangePasswordDialog.Callba
registerOnEditorDoneActionAndPerformButtonClick(et_new_retype_password) { changePasswordButton } registerOnEditorDoneActionAndPerformButtonClick(et_new_retype_password) { changePasswordButton }
PasswordStrengthUtil() // PasswordStrengthUtil() //
.startUpdatingPasswordStrengthMeter(et_new_password, // .startUpdatingPasswordStrengthMeter(
et_new_password, //
progressBarPwStrengthIndicator, // progressBarPwStrengthIndicator, //
textViewPwStrengthIndicator, // textViewPwStrengthIndicator, //
changePasswordButton) changePasswordButton
)
} }
} }

View File

@ -22,9 +22,11 @@ class EnrollSystemBiometricDialog : BaseDialog<EnrollSystemBiometricDialog.Callb
override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog { override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog {
builder // builder //
.setTitle(getString(R.string.dialog_no_biometric_auth_set_up_title)) // .setTitle(getString(R.string.dialog_no_biometric_auth_set_up_title)) //
.setPositiveButton(getString(R.string.dialog_unable_to_share_positive_button) // .setPositiveButton(
getString(R.string.dialog_unable_to_share_positive_button) //
) { _: DialogInterface, _: Int -> callback?.onSetupBiometricAuthInSystemClicked() } ) { _: DialogInterface, _: Int -> callback?.onSetupBiometricAuthInSystemClicked() }
.setNegativeButton(getString(R.string.dialog_button_cancel) // .setNegativeButton(
getString(R.string.dialog_button_cancel) //
) { _: DialogInterface?, _: Int -> callback?.onCancelSetupBiometricAuthInSystemClicked() } ) { _: DialogInterface?, _: Int -> callback?.onCancelSetupBiometricAuthInSystemClicked() }
return builder.create() return builder.create()
} }

View File

@ -38,9 +38,11 @@ class ExportCloudFilesDialog : BaseProgressErrorDialog<ExportCloudFilesDialog.Ca
} }
private fun effectiveTitle(seenFiles: Int): String { private fun effectiveTitle(seenFiles: Int): String {
return String.format(getString(R.string.dialog_export_file_title), // return String.format(
getString(R.string.dialog_export_file_title), //
seenFiles, // seenFiles, //
requireArguments().getInt(ARG_NUMBER_OF_FILES)) requireArguments().getInt(ARG_NUMBER_OF_FILES)
)
} }
override fun setupView() {} override fun setupView() {}

View File

@ -32,7 +32,8 @@ class WebDavAskForHttpDialog : BaseDialog<WebDavAskForHttpDialog.Callback>() {
certificate = requireArguments().getString(CERTIFICATE_ARG) certificate = requireArguments().getString(CERTIFICATE_ARG)
builder // builder //
.setTitle(R.string.dialog_http_security_title) // .setTitle(R.string.dialog_http_security_title) //
.setNeutralButton(getString(R.string.dialog_unable_to_share_positive_button) .setNeutralButton(
getString(R.string.dialog_unable_to_share_positive_button)
) { _: DialogInterface, _: Int -> callback?.onAksForHttpFinished(username, password, uriWithDesiredProtocol(cb_select_http.isChecked), cloudId, certificate) } ) { _: DialogInterface, _: Int -> callback?.onAksForHttpFinished(username, password, uriWithDesiredProtocol(cb_select_http.isChecked), cloudId, certificate) }
return builder.create() return builder.create()
} }

View File

@ -78,7 +78,8 @@ class S3AddOrChangeFragment : BaseFragment() {
endpointEditText.text.toString().trim(), // endpointEditText.text.toString().trim(), //
regionEditText.text.toString().trim(), // regionEditText.text.toString().trim(), //
cloudId, // cloudId, //
displayName) displayName
)
} }
fun hideKeyboard() { fun hideKeyboard() {

View File

@ -29,10 +29,12 @@ class SetPasswordFragment : BaseFragment() {
} }
false false
} }
passwordStrengthUtil.startUpdatingPasswordStrengthMeter(passwordEditText, // passwordStrengthUtil.startUpdatingPasswordStrengthMeter(
passwordEditText, //
progressBarPwStrengthIndicator, // progressBarPwStrengthIndicator, //
textViewPwStrengthIndicator, // textViewPwStrengthIndicator, //
createVaultButton) createVaultButton
)
passwordEditText.requestFocus() passwordEditText.requestFocus()
} }

View File

@ -104,7 +104,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) .canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)
if (biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_SUCCESS if (biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_SUCCESS
&& biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) { && biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED
) {
val preference = findPreference(BIOMETRIC_AUTHENTICATION_ITEM_KEY) as Preference? val preference = findPreference(BIOMETRIC_AUTHENTICATION_ITEM_KEY) as Preference?
val generalCategory = findPreference(getString(R.string.screen_settings_section_general)) as PreferenceCategory? val generalCategory = findPreference(getString(R.string.screen_settings_section_general)) as PreferenceCategory?
generalCategory?.removePreference(preference) generalCategory?.removePreference(preference)
@ -120,7 +121,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
val versionName = SpannableString(BuildConfig.VERSION_NAME) val versionName = SpannableString(BuildConfig.VERSION_NAME)
versionName.setSpan( // versionName.setSpan( //
ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), //
0, versionName.length, 0) 0, versionName.length, 0
)
preference?.summary = versionName preference?.summary = versionName
} }
@ -145,7 +147,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
lruCacheSize.setSpan( // lruCacheSize.setSpan( //
ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), //
0, lruCacheSize.length, 0) 0, lruCacheSize.length, 0
)
preference?.summary = lruCacheSize preference?.summary = lruCacheSize
} }
@ -188,7 +191,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
date.setSpan( // date.setSpan( //
ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), //
0, date.length, 0) 0, date.length, 0
)
preference?.summary = date preference?.summary = date
} }

View File

@ -90,7 +90,8 @@ class TextEditorFragment : BaseFragment() {
BackgroundColorSpan(ContextCompat.getColor(context(), R.color.colorPrimaryTransparent)), BackgroundColorSpan(ContextCompat.getColor(context(), R.color.colorPrimaryTransparent)),
index, index,
index + it.length, index + it.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textEditorPresenter.lastFilterLocation = index textEditorPresenter.lastFilterLocation = index

View File

@ -79,10 +79,12 @@ class BiometricAuthentication(val callback: Callback, val context: Context, val
biometricAuthCryptor.decrypt(cipher, vaultModel.password) biometricAuthCryptor.decrypt(cipher, vaultModel.password)
} }
val vaultModelPasswordAware = VaultModel(Vault // val vaultModelPasswordAware = VaultModel(
Vault //
.aCopyOf(vaultModel.toVault()) // .aCopyOf(vaultModel.toVault()) //
.withSavedPassword(transformedPassword) // .withSavedPassword(transformedPassword) //
.build()) .build()
)
callback.onBiometricAuthenticated(vaultModelPasswordAware) callback.onBiometricAuthenticated(vaultModelPasswordAware)
} }
@ -109,7 +111,8 @@ class BiometricAuthentication(val callback: Callback, val context: Context, val
biometricPrompt.authenticate( biometricPrompt.authenticate(
promptInfo, promptInfo,
BiometricPrompt.CryptoObject(cryptoCipher)) BiometricPrompt.CryptoObject(cryptoCipher)
)
} catch (e: KeyPermanentlyInvalidatedException) { } catch (e: KeyPermanentlyInvalidatedException) {
callback.onBiometricKeyInvalidated(vaultModel) callback.onBiometricKeyInvalidated(vaultModel)
} }

View File

@ -16,7 +16,8 @@ class FileSizeHelper @Inject constructor(private val context: Context) {
context.getString(R.string.file_size_unit_kilo_bytes), // context.getString(R.string.file_size_unit_kilo_bytes), //
context.getString(R.string.file_size_unit_mega_bytes), // context.getString(R.string.file_size_unit_mega_bytes), //
context.getString(R.string.file_size_unit_giga_bytes), // context.getString(R.string.file_size_unit_giga_bytes), //
context.getString(R.string.file_size_unit_tera_bytes)) context.getString(R.string.file_size_unit_tera_bytes)
)
fun getFormattedFileSize(size: Optional<Long>): Optional<String> { fun getFormattedFileSize(size: Optional<Long>): Optional<String> {
return when { return when {

View File

@ -13,7 +13,8 @@ import timber.log.Timber
class ShareFileHelper @Inject constructor( // class ShareFileHelper @Inject constructor( //
private val fileUtil: FileUtil, // private val fileUtil: FileUtil, //
private val mimeTypes: MimeTypes, // private val mimeTypes: MimeTypes, //
private val contentResolverUtil: ContentResolverUtil) { private val contentResolverUtil: ContentResolverUtil
) {
fun shareFile(activityHolder: ActivityHolder, cloudFile: CloudFileModel) { fun shareFile(activityHolder: ActivityHolder, cloudFile: CloudFileModel) {
shareFile(activityHolder, fileUtil.contentUriFor(cloudFile), mimeTypeFromFileName(cloudFile.name)) shareFile(activityHolder, fileUtil.contentUriFor(cloudFile), mimeTypeFromFileName(cloudFile.name))

View File

@ -40,6 +40,7 @@ public abstract class Workflow<State extends Serializable> {
this.presenter = presenter; this.presenter = presenter;
setStateFrom(intent); setStateFrom(intent);
} }
private boolean setStateFrom(Intent intent) { private boolean setStateFrom(Intent intent) {
Serializable stateExtra = intent.getSerializableExtra(WORKFLOW_STATE_EXTRA); Serializable stateExtra = intent.getSerializableExtra(WORKFLOW_STATE_EXTRA);
Serializable callbackExtra = intent.getSerializableExtra(WORKFLOW_CALLBACK_EXTRA); Serializable callbackExtra = intent.getSerializableExtra(WORKFLOW_CALLBACK_EXTRA);

View File

@ -70,7 +70,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
private val getCloudsUseCase: GetCloudsUseCase, // private val getCloudsUseCase: GetCloudsUseCase, //
private val getUsernameUseCase: GetUsernameUseCase, // private val getUsernameUseCase: GetUsernameUseCase, //
private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, //
private val createNewVaultWorkflow: CreateNewVaultWorkflow) : Presenter<AuthenticateCloudView>(exceptionHandlers) { private val createNewVaultWorkflow: CreateNewVaultWorkflow
) : Presenter<AuthenticateCloudView>(exceptionHandlers) {
private val strategies = arrayOf( // private val strategies = arrayOf( //
DropboxAuthStrategy(), // DropboxAuthStrategy(), //
@ -186,7 +187,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
getUsernameAndSuceedAuthentication( // getUsernameAndSuceedAuthentication( //
DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) // DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) //
.withAccessToken(encrypt(authToken)) // .withAccessToken(encrypt(authToken)) //
.build()) .build()
)
} }
} }
} }
@ -223,7 +225,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
try { try {
requestActivityResult( // requestActivityResult( //
ActivityResultCallbacks.onGoogleDriveAuthenticated(cloud), // ActivityResultCallbacks.onGoogleDriveAuthenticated(cloud), //
chooseAccountIntent) chooseAccountIntent
)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
view?.showMessage(R.string.error_play_services_not_available) view?.showMessage(R.string.error_play_services_not_available)
finish() finish()
@ -244,10 +247,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) { fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) {
if (result.isResultOk) { if (result.isResultOk) {
val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME) val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME)
succeedAuthenticationWith(GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) // succeedAuthenticationWith(
GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) //
.withUsername(accountName) // .withUsername(accountName) //
.withAccessToken(accountName) // .withAccessToken(accountName) //
.build()) .build()
)
} else { } else {
failAuthentication(cloud.name()) failAuthentication(cloud.name())
} }
@ -291,7 +296,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
getUsernameAndSuceedAuthentication( // getUsernameAndSuceedAuthentication( //
OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) //
.withAccessToken(accessToken) // .withAccessToken(accessToken) //
.build()) .build()
)
} }
} }
@ -311,7 +317,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
Toast.makeText( Toast.makeText(
context(), context(),
String.format(getString(R.string.error_authentication_failed_re_authenticate), intent.cloud().username()), String.format(getString(R.string.error_authentication_failed_re_authenticate), intent.cloud().username()),
Toast.LENGTH_LONG).show() Toast.LENGTH_LONG
).show()
} }
} }
else -> { else -> {
@ -330,9 +337,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
.setClientId(BuildConfig.PCLOUD_CLIENT_ID) .setClientId(BuildConfig.PCLOUD_CLIENT_ID)
.setForceAccessApproval(true) .setForceAccessApproval(true)
.addPermission("manageshares") .addPermission("manageshares")
.build()) .build()
requestActivityResult(ActivityResultCallbacks.pCloudReAuthenticationFinished(), // )
authIntent) requestActivityResult(
ActivityResultCallbacks.pCloudReAuthenticationFinished(), //
authIntent
)
} }
} }
@ -382,10 +392,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
(it as PCloud).username() == cloud.username() (it as PCloud).username() == cloud.username()
}?.let { }?.let {
it as PCloud it as PCloud
succeedAuthenticationWith(PCloud.aCopyOf(it) // succeedAuthenticationWith(
PCloud.aCopyOf(it) //
.withUrl(cloud.url()) .withUrl(cloud.url())
.withAccessToken(cloud.accessToken()) .withAccessToken(cloud.accessToken())
.build()) .build()
)
} ?: succeedAuthenticationWith(cloud) } ?: succeedAuthenticationWith(cloud)
} }
}) })
@ -438,9 +450,11 @@ class AuthenticateCloudPresenter @Inject constructor( //
val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) // val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) //
.withCertificate(X509CertificateHelper.convertToPem(certificate)) // .withCertificate(X509CertificateHelper.convertToPem(certificate)) //
.build() .build()
finishWithResultAndExtra(cloudModelMapper.toModel(webDavCloudWithAcceptedCert), // finishWithResultAndExtra(
cloudModelMapper.toModel(webDavCloudWithAcceptedCert), //
WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, // WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, //
true) true
)
} catch (e: CertificateEncodingException) { } catch (e: CertificateEncodingException) {
Timber.tag("AuthicateCloudPrester").e(e) Timber.tag("AuthicateCloudPrester").e(e)
throw FatalBackendException(e) throw FatalBackendException(e)
@ -467,7 +481,8 @@ class AuthenticateCloudPresenter @Inject constructor( //
Toast.makeText( Toast.makeText(
context(), context(),
String.format(getString(R.string.error_authentication_failed), intent.cloud().username()), String.format(getString(R.string.error_authentication_failed), intent.cloud().username()),
Toast.LENGTH_LONG).show() Toast.LENGTH_LONG
).show()
} }
} }
else -> { else -> {
@ -498,10 +513,12 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) { private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true authenticationStarted = true
requestPermissions(PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), // requestPermissions(
PermissionsResultCallbacks.onLocalStorageAuthenticated(cloud), //
R.string.permission_snackbar_auth_local_vault, // R.string.permission_snackbar_auth_local_vault, //
Manifest.permission.READ_EXTERNAL_STORAGE, // Manifest.permission.READ_EXTERNAL_STORAGE, //
Manifest.permission.WRITE_EXTERNAL_STORAGE) Manifest.permission.WRITE_EXTERNAL_STORAGE
)
} }
} }