#192 create first two sample assisted WebDAV clouds

This commit is contained in:
Julian Raufelder 2021-02-14 10:48:25 +01:00
parent 5b1d7cfefb
commit 56ec2e204f
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
11 changed files with 62 additions and 13 deletions

View File

@ -2,6 +2,6 @@ package org.cryptomator.domain;
public enum CloudType { public enum CloudType {
DROPBOX, GOOGLE_DRIVE, ONEDRIVE, WEBDAV, LOCAL, CRYPTO DROPBOX, GOOGLE_DRIVE, ONEDRIVE, LOCAL, CRYPTO, WEBDAV, WEB_DE, MAILBOX_ORG
} }

View File

@ -10,4 +10,8 @@ public interface WebDavAddOrChangeIntent {
@Optional @Optional
WebDavCloudModel webDavCloud(); WebDavCloudModel webDavCloud();
@Optional
String preFilledURL();
} }

View File

@ -15,24 +15,36 @@ enum class CloudTypeModel(builder: Builder) {
ONEDRIVE(Builder("ONEDRIVE", R.string.cloud_names_onedrive) // ONEDRIVE(Builder("ONEDRIVE", R.string.cloud_names_onedrive) //
.withCloudImageResource(R.drawable.cloud_type_onedrive) // .withCloudImageResource(R.drawable.cloud_type_onedrive) //
.withCloudImageLargeResource(R.drawable.cloud_type_onedrive_large)), // .withCloudImageLargeResource(R.drawable.cloud_type_onedrive_large)), //
LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) //
.withCloudImageResource(R.drawable.storage_type_local) //
.withCloudImageLargeResource(R.drawable.storage_type_local_large)), //
WEBDAV(Builder("WEBDAV", R.string.cloud_names_webdav) // WEBDAV(Builder("WEBDAV", R.string.cloud_names_webdav) //
.withCloudImageResource(R.drawable.cloud_type_webdav) // .withCloudImageResource(R.drawable.cloud_type_webdav) //
.withCloudImageLargeResource(R.drawable.cloud_type_webdav_large) // .withCloudImageLargeResource(R.drawable.cloud_type_webdav_large) //
.withMultiInstances()), // .withMultiInstances()), //
LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) // WEB_DE(Builder("WEB", R.string.cloud_names_webde) //
.withCloudImageResource(R.drawable.storage_type_local) // .withCloudImageResource(R.drawable.cloud_type_webdav) //
.withCloudImageLargeResource(R.drawable.storage_type_local_large)); .withCloudImageLargeResource(R.drawable.cloud_type_webde_large) //
.withMultiInstances()
.withPreFilledURL("https://webdav.smartdrive.web.de")), //
MAILBOX_ORG(Builder("MAILBOX", R.string.cloud_names_mailboxorg) //
.withCloudImageResource(R.drawable.cloud_type_webdav) //
.withCloudImageLargeResource(R.drawable.cloud_type_webdav_large) //
.withMultiInstances()
.withPreFilledURL("https://dav.mailbox.org/servlet/webdav.infostore"));
val cloudName: String = builder.cloudName val cloudName: String = builder.cloudName
val displayNameResource: Int = builder.displayNameResource val displayNameResource: Int = builder.displayNameResource
val cloudImageResource: Int = builder.cloudImageResource val cloudImageResource: Int = builder.cloudImageResource
val cloudImageLargeResource: Int = builder.cloudImageLargeResource val cloudImageLargeResource: Int = builder.cloudImageLargeResource
val isMultiInstance: Boolean = builder.multiInstances val isMultiInstance: Boolean = builder.multiInstances
val preFilledURL: String = builder.preFilledURL
private class Builder(val cloudName: String, val displayNameResource: Int) { private class Builder(val cloudName: String, val displayNameResource: Int) {
var cloudImageResource = 0 var cloudImageResource = 0
var cloudImageLargeResource = 0 var cloudImageLargeResource = 0
var multiInstances = false var multiInstances = false
var preFilledURL = ""
fun withCloudImageResource(cloudImageResource: Int): Builder { fun withCloudImageResource(cloudImageResource: Int): Builder {
this.cloudImageResource = cloudImageResource this.cloudImageResource = cloudImageResource
@ -48,6 +60,11 @@ enum class CloudTypeModel(builder: Builder) {
multiInstances = true multiInstances = true
return this return this
} }
fun withPreFilledURL(preFilledURL: String): Builder {
this.preFilledURL = preFilledURL
return this
}
} }
companion object { companion object {

View File

@ -18,7 +18,7 @@ class CloudModelMapper @Inject constructor() : ModelMapper<CloudModel, Cloud>()
CloudTypeModel.ONEDRIVE -> OnedriveCloudModel(domainObject) CloudTypeModel.ONEDRIVE -> OnedriveCloudModel(domainObject)
CloudTypeModel.CRYPTO -> CryptoCloudModel(domainObject) CloudTypeModel.CRYPTO -> CryptoCloudModel(domainObject)
CloudTypeModel.LOCAL -> LocalStorageModel(domainObject) CloudTypeModel.LOCAL -> LocalStorageModel(domainObject)
CloudTypeModel.WEBDAV -> WebDavCloudModel(domainObject) CloudTypeModel.WEBDAV, CloudTypeModel.WEB_DE, CloudTypeModel.MAILBOX_ORG -> WebDavCloudModel(domainObject)
} }
} }
} }

View File

@ -6,9 +6,7 @@ import android.net.Uri
import android.os.Build import android.os.Build
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import org.cryptomator.domain.Cloud import org.cryptomator.domain.*
import org.cryptomator.domain.LocalStorageCloud
import org.cryptomator.domain.Vault
import org.cryptomator.domain.di.PerView import org.cryptomator.domain.di.PerView
import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
@ -48,8 +46,13 @@ class CloudConnectionListPresenter @Inject constructor( //
} }
fun loadCloudList() { fun loadCloudList() {
val cloudTypeFilter = when(selectedCloudType.get()) {
CloudTypeModel.WEB_DE, CloudTypeModel.MAILBOX_ORG -> CloudTypeModel.WEBDAV
else -> selectedCloudType.get()
}
getCloudsUseCase // getCloudsUseCase //
.withCloudType(CloudTypeModel.valueOf(selectedCloudType.get())) // .withCloudType(CloudTypeModel.valueOf(cloudTypeFilter)) //
.run(object : DefaultResultHandler<List<Cloud>>() { .run(object : DefaultResultHandler<List<Cloud>>() {
override fun onSuccess(clouds: List<Cloud>) { override fun onSuccess(clouds: List<Cloud>) {
val cloudModels: MutableList<CloudModel> = ArrayList() val cloudModels: MutableList<CloudModel> = ArrayList()
@ -60,6 +63,18 @@ class CloudConnectionListPresenter @Inject constructor( //
return@forEach return@forEach
} }
} }
// WebDAV but WEB.DE, MAILBOX_ORG, or ...
if(cloud.type() == CloudType.WEBDAV && selectedCloudType.get() != cloud.type()) {
when (selectedCloudType.get()) {
CloudTypeModel.WEB_DE, CloudTypeModel.MAILBOX_ORG -> {
if(!(cloud as WebDavCloud).url().startsWith(selectedCloudType.get().preFilledURL)) {
return@forEach
}
}
}
}
cloudModels.add(cloudModelMapper.toModel(cloud)) cloudModels.add(cloudModelMapper.toModel(cloud))
} }
view?.showCloudModels(cloudModels) view?.showCloudModels(cloudModels)
@ -123,6 +138,8 @@ class CloudConnectionListPresenter @Inject constructor( //
CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeWebDavCloud(), // CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeWebDavCloud(), //
Intents.webDavAddOrChangeIntent()) Intents.webDavAddOrChangeIntent())
CloudTypeModel.LOCAL -> openDocumentTree() CloudTypeModel.LOCAL -> openDocumentTree()
CloudTypeModel.WEB_DE, CloudTypeModel.MAILBOX_ORG -> requestActivityResult(ActivityResultCallbacks.addChangeWebDavCloud(), //
Intents.webDavAddOrChangeIntent().withPreFilledURL(selectedCloudType.get().preFilledURL))
} }
} }

View File

@ -29,7 +29,7 @@ class ChooseCloudServiceActivity : BaseActivity(), ChooseCloudServiceView {
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
} }
override fun createFragment(): Fragment? = ChooseCloudServiceFragment() override fun createFragment(): Fragment = ChooseCloudServiceFragment()
override fun getCustomMenuResource(): Int = R.menu.menu_cloud_services override fun getCustomMenuResource(): Int = R.menu.menu_cloud_services

View File

@ -31,7 +31,7 @@ class WebDavAddOrChangeActivity : BaseActivity(),
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
} }
override fun createFragment(): Fragment = WebDavAddOrChangeFragment.newInstance(webDavAddOrChangeIntent.webDavCloud()) override fun createFragment(): Fragment = WebDavAddOrChangeFragment.newInstance(webDavAddOrChangeIntent.webDavCloud(), webDavAddOrChangeIntent.preFilledURL())
override fun onCheckUserInputSucceeded(urlPort: String, username: String, password: String, cloudId: Long?, certificate: String?) { override fun onCheckUserInputSucceeded(urlPort: String, username: String, password: String, cloudId: Long?, certificate: String?) {
webDavAddOrChangeFragment().hideKeyboard() webDavAddOrChangeFragment().hideKeyboard()

View File

@ -23,6 +23,9 @@ class WebDavAddOrChangeFragment : BaseFragment() {
private val webDavCloudModel: WebDavCloudModel? private val webDavCloudModel: WebDavCloudModel?
get() = arguments?.getSerializable(ARG_WEBDAV_CLOUD) as? WebDavCloudModel get() = arguments?.getSerializable(ARG_WEBDAV_CLOUD) as? WebDavCloudModel
private val preFilledPath: String?
get() = arguments?.getSerializable(ARG_PRE_FILLED_PATH) as? String
override fun setupView() { override fun setupView() {
createCloudButton.setOnClickListener { createCloud() } createCloudButton.setOnClickListener { createCloud() }
createCloudButton.setOnEditorActionListener { _, actionId, _ -> createCloudButton.setOnEditorActionListener { _, actionId, _ ->
@ -32,12 +35,16 @@ class WebDavAddOrChangeFragment : BaseFragment() {
false false
} }
preFilledPath?.let {
urlPortEditText.setText(it)
}
urlPortEditText.text?.length?.let { urlPortEditText.setSelection(it) } urlPortEditText.text?.length?.let { urlPortEditText.setSelection(it) }
showEditableCloudContent(webDavCloudModel) showEditableCloudContent(webDavCloudModel)
} }
private fun showEditableCloudContent(webDavCloudModel: WebDavCloudModel?) { private fun showEditableCloudContent(webDavCloudModel: WebDavCloudModel?) {
if (webDavCloudModel != null) { webDavCloudModel?.let {
urlPortEditText.setText(webDavCloudModel.url()) urlPortEditText.setText(webDavCloudModel.url())
userNameEditText.setText(webDavCloudModel.username()) userNameEditText.setText(webDavCloudModel.username())
passwordEditText.setText(getPassword(webDavCloudModel.accessToken())) passwordEditText.setText(getPassword(webDavCloudModel.accessToken()))
@ -74,11 +81,13 @@ class WebDavAddOrChangeFragment : BaseFragment() {
companion object { companion object {
private const val ARG_WEBDAV_CLOUD = "WEBDAV_CLOUD" private const val ARG_WEBDAV_CLOUD = "WEBDAV_CLOUD"
private const val ARG_PRE_FILLED_PATH = "PRE_FILLED_CLOUD_PATH"
fun newInstance(cloudModel: WebDavCloudModel?): WebDavAddOrChangeFragment { fun newInstance(cloudModel: WebDavCloudModel?, preFilledURL: String?): androidx.fragment.app.Fragment {
val result = WebDavAddOrChangeFragment() val result = WebDavAddOrChangeFragment()
val args = Bundle() val args = Bundle()
args.putSerializable(ARG_WEBDAV_CLOUD, cloudModel) args.putSerializable(ARG_WEBDAV_CLOUD, cloudModel)
args.putSerializable(ARG_PRE_FILLED_PATH, preFilledURL)
result.arguments = args result.arguments = args
return result return result
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -41,6 +41,8 @@
<string name="cloud_names_onedrive" translatable="false">OneDrive</string> <string name="cloud_names_onedrive" translatable="false">OneDrive</string>
<string name="cloud_names_webdav" translatable="false">WebDAV</string> <string name="cloud_names_webdav" translatable="false">WebDAV</string>
<string name="cloud_names_local_storage">Local storage</string> <string name="cloud_names_local_storage">Local storage</string>
<string name="cloud_names_webde" translatable="false">WEB.DE</string>
<string name="cloud_names_mailboxorg" translatable="false">Mailbox.org</string>
<!-- # permission --> <!-- # permission -->