Skip to content

Commit

Permalink
Update target API to 30 (Android 11)
Browse files Browse the repository at this point in the history
Write external storage got removed due to forced scoped storage. Local storage cloud is now only available using the storage access framework implementation. Migration still needs to be implemented as well as how to recover when the authentications fails in the LocalStorageAuthStrategy.

Fixes #251
  • Loading branch information
SailReal committed Oct 22, 2021
1 parent 3b641a2 commit 91d1a65
Show file tree
Hide file tree
Showing 45 changed files with 89 additions and 660 deletions.
4 changes: 2 additions & 2 deletions buildsystem/dependencies.gradle
Expand Up @@ -8,8 +8,8 @@ allprojects {
ext {
androidBuildToolsVersion = "30.0.2"
androidMinSdkVersion = 24
androidTargetSdkVersion = 29
androidCompileSdkVersion = 29
androidTargetSdkVersion = 30
androidCompileSdkVersion = 30

// android and java libs
androidVersion = '4.1.1.4'
Expand Down
Expand Up @@ -31,11 +31,6 @@ private boolean configurationMatches(CryptoCloud cloud) {
return vault.equals(cloud.vault);
}

@Override
public boolean predefined() {
return false;
}

@Override
public boolean persistent() {
return false;
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.util.LruCache
import org.cryptomator.domain.CloudFolder
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.net.Uri
import org.cryptomator.domain.Cloud
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.net.Uri
import org.cryptomator.domain.Cloud
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.content.Context
import org.cryptomator.domain.LocalStorageCloud
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.content.ContentResolver
import android.content.Context
Expand All @@ -7,10 +7,10 @@ import android.net.Uri
import android.os.Build
import android.provider.DocumentsContract
import androidx.documentfile.provider.DocumentFile
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.file
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.folder
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.from
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkNodeFactory.getNodePath
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.file
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.folder
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.from
import org.cryptomator.data.cloud.local.LocalStorageAccessFrameworkNodeFactory.getNodePath
import org.cryptomator.data.util.CopyStream
import org.cryptomator.data.util.TransferredBytesAwareInputStream
import org.cryptomator.data.util.TransferredBytesAwareOutputStream
Expand Down Expand Up @@ -243,7 +243,8 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
private fun rename(source: LocalStorageAccessNode, name: String): LocalStorageAccessNode {
source.parent?.let { parent ->
var newUri = try {
DocumentsContract.renameDocument(contentResolver(), source.uri, name)
requireNotNull(source.uri)
DocumentsContract.renameDocument(contentResolver(), source.uri!!, name)
} catch (e: FileNotFoundException) {
/* Bug in Android 9 see #460 TLDR; In this renameDocument-method, Android 9 throws
a `FileNotFoundException` although the file exists and is also renamed. */
Expand Down Expand Up @@ -336,11 +337,13 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim

private fun createNewDocumentSupplier(file: LocalStorageAccessFile): Supplier<Uri?> {
return Supplier {
val mimeType = if (mimeTypes.fromFilename(file.name) == null) MimeType.APPLICATION_OCTET_STREAM else mimeTypes.fromFilename(file.name)
try {
DocumentsContract.createDocument(contentResolver(), file.parent.uri, mimeType.toString(), file.name) // FIXME
} catch (e: FileNotFoundException) {
null
file.parent.uri?.let {
val mimeType = if (mimeTypes.fromFilename(file.name) == null) MimeType.APPLICATION_OCTET_STREAM else mimeTypes.fromFilename(file.name)
try {
DocumentsContract.createDocument(contentResolver(), it, mimeType.toString(), file.name) // FIXME
} catch (e: FileNotFoundException) {
null
}
}
}
}
Expand Down Expand Up @@ -372,7 +375,7 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
fun delete(node: LocalStorageAccessNode) {
requireNotNull(node.uri)
try {
DocumentsContract.deleteDocument(contentResolver(), node.uri)
DocumentsContract.deleteDocument(contentResolver(), node.uri!!)
} catch (e: FileNotFoundException) {
throw NoSuchCloudFileException(node.name)
}
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.database.Cursor
import android.provider.DocumentsContract
Expand Down
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.net.Uri
import org.cryptomator.domain.CloudNode
Expand Down
@@ -1,25 +1,22 @@
package org.cryptomator.data.cloud.local;

import static org.cryptomator.domain.CloudType.LOCAL;

import android.content.Context;
import android.content.UriPermission;

import org.cryptomator.data.cloud.local.file.LocalStorageContentRepository;
import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkContentRepository;
import org.cryptomator.data.repository.CloudContentRepositoryFactory;
import org.cryptomator.domain.Cloud;
import org.cryptomator.domain.LocalStorageCloud;
import org.cryptomator.domain.exception.authentication.NoAuthenticationProvidedException;
import org.cryptomator.domain.repository.CloudContentRepository;
import org.cryptomator.util.file.MimeTypes;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Singleton;

import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static androidx.core.content.ContextCompat.checkSelfPermission;
import static org.cryptomator.domain.CloudType.LOCAL;

@Singleton
public class LocalStorageContentRepositoryFactory implements CloudContentRepositoryFactory {

Expand All @@ -39,23 +36,14 @@ public boolean supports(Cloud cloud) {

@Override
public CloudContentRepository cloudContentRepositoryFor(Cloud cloud) {
if (!hasPermissions(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE)) {
throw new NoAuthenticationProvidedException(cloud);
}
if (((LocalStorageCloud) cloud).rootUri() != null) {
return new LocalStorageAccessFrameworkContentRepository(context, mimeTypes, (LocalStorageCloud) cloud);
} else {
return new LocalStorageContentRepository(context, (LocalStorageCloud) cloud);
}
}

private boolean hasPermissions(String... permissions) {
for (String permission : permissions) {
if (checkSelfPermission(context, permission) != PERMISSION_GRANTED) {
return false;
List<UriPermission> permissions = context.getContentResolver().getPersistedUriPermissions();
for (UriPermission permission : permissions) {
if(permission.getUri().toString().equals(((LocalStorageCloud) cloud).rootUri())) {
return new LocalStorageAccessFrameworkContentRepository(context, mimeTypes, (LocalStorageCloud) cloud);
}
}
return true;

throw new NoAuthenticationProvidedException(cloud);
}

}
@@ -1,4 +1,4 @@
package org.cryptomator.data.cloud.local.storageaccessframework
package org.cryptomator.data.cloud.local

import android.net.Uri
import android.provider.DocumentsContract
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit 91d1a65

Please sign in to comment.