diff --git a/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageAccessFrameworkImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageAccessFrameworkImpl.kt
index 904f8b15..762018bf 100644
--- a/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageAccessFrameworkImpl.kt
+++ b/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageAccessFrameworkImpl.kt
@@ -340,7 +340,7 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
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
+ DocumentsContract.createDocument(contentResolver(), it, mimeType.toString(), file.name)
} catch (e: FileNotFoundException) {
null
}
diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
index 07bce89b..eac080bf 100644
--- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
+++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
@@ -1,6 +1,9 @@
package org.cryptomator.presentation.presenter
import android.accounts.AccountManager
+import android.content.Intent
+import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
+import android.provider.DocumentsContract
import android.widget.Toast
import com.dropbox.core.android.Auth
import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory
@@ -432,6 +435,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
private inner class LocalStorageAuthStrategy : AuthStrategy {
private var authenticationStarted = false
+
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.LOCAL
}
@@ -444,19 +448,43 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
+
+ val uri = (cloud as LocalStorageModel).uri()
+
val permissions = context().contentResolver.persistedUriPermissions
for (permission in permissions) {
- if (permission.uri.toString() == (cloud as LocalStorageModel).uri()) {
+ if (permission.uri.toString() == uri) {
succeedAuthenticationWith(cloud.toCloud())
}
}
- // FIXME think about how to re-request permission
- // FIXME change in the FOSS variant too
- failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
+ Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")
+
+ Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()
+
+ val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
+ putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
+ }
+
+ requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
}
}
+ @Callback
+ fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
+ val rootTreeUriOfLocalStorage = result.intent().data
+ rootTreeUriOfLocalStorage?.let {
+ context() //
+ .contentResolver //
+ .takePersistableUriPermission( //
+ it, //
+ Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ )
+ }
+ Timber.tag("AuthicateCloudPrester").e("Permission granted again")
+ succeedAuthenticationWith(cloud.toCloud())
+ }
+
private fun encrypt(password: String): String {
return CredentialCryptor //
.getInstance(context()) //
diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
index ba4ab6a3..0a5bbc51 100644
--- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
+++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt
@@ -289,10 +289,6 @@ class CloudConnectionListPresenter @Inject constructor( //
}
}
- fun onDefaultLocalCloudConnectionClicked() {
- finishWithResult(SELECTED_CLOUD, defaultLocalStorageCloud)
- }
-
companion object {
const val SELECTED_CLOUD = "selectedCloudConnection"
diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml
index af52051e..8ed2c79e 100644
--- a/presentation/src/main/res/values/strings.xml
+++ b/presentation/src/main/res/values/strings.xml
@@ -61,6 +61,8 @@
Cryptomator needs storage access to upload files
Cryptomator needs storage access to share files
+ Cryptomator has lost permission to access this location. Please select this folder again to restore the permission.
+
Settings
Search
Previous
diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
index f542dd4d..7e12859b 100644
--- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
+++ b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt
@@ -2,6 +2,9 @@ package org.cryptomator.presentation.presenter
import android.accounts.AccountManager
import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
+import android.provider.DocumentsContract
import android.widget.Toast
import com.dropbox.core.android.Auth
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
@@ -478,6 +481,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
private inner class LocalStorageAuthStrategy : AuthStrategy {
private var authenticationStarted = false
+
override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.LOCAL
}
@@ -490,19 +494,43 @@ class AuthenticateCloudPresenter @Inject constructor( //
private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true
+
+ val uri = (cloud as LocalStorageModel).uri()
+
val permissions = context().contentResolver.persistedUriPermissions
for (permission in permissions) {
- if (permission.uri.toString() == (cloud as LocalStorageModel).uri()) {
+ if (permission.uri.toString() == uri) {
succeedAuthenticationWith(cloud.toCloud())
}
}
- // FIXME think about how to re-request permission
- // FIXME change in the FOSS variant too
- failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
+ Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")
+
+ Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()
+
+ val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
+ putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
+ }
+
+ requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
}
}
+ @Callback
+ fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
+ val rootTreeUriOfLocalStorage = result.intent().data
+ rootTreeUriOfLocalStorage?.let {
+ context() //
+ .contentResolver //
+ .takePersistableUriPermission( //
+ it, //
+ Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ )
+ }
+ Timber.tag("AuthicateCloudPrester").e("Permission granted again")
+ succeedAuthenticationWith(cloud.toCloud())
+ }
+
private fun encrypt(password: String): String {
return CredentialCryptor //
.getInstance(context()) //