#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 {
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
WebDavCloudModel webDavCloud();
@Optional
String preFilledURL();
}

View File

@ -15,24 +15,36 @@ enum class CloudTypeModel(builder: Builder) {
ONEDRIVE(Builder("ONEDRIVE", R.string.cloud_names_onedrive) //
.withCloudImageResource(R.drawable.cloud_type_onedrive) //
.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) //
.withCloudImageResource(R.drawable.cloud_type_webdav) //
.withCloudImageLargeResource(R.drawable.cloud_type_webdav_large) //
.withMultiInstances()), //
LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) //
.withCloudImageResource(R.drawable.storage_type_local) //
.withCloudImageLargeResource(R.drawable.storage_type_local_large));
WEB_DE(Builder("WEB", R.string.cloud_names_webde) //
.withCloudImageResource(R.drawable.cloud_type_webdav) //
.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 displayNameResource: Int = builder.displayNameResource
val cloudImageResource: Int = builder.cloudImageResource
val cloudImageLargeResource: Int = builder.cloudImageLargeResource
val isMultiInstance: Boolean = builder.multiInstances
val preFilledURL: String = builder.preFilledURL
private class Builder(val cloudName: String, val displayNameResource: Int) {
var cloudImageResource = 0
var cloudImageLargeResource = 0
var multiInstances = false
var preFilledURL = ""
fun withCloudImageResource(cloudImageResource: Int): Builder {
this.cloudImageResource = cloudImageResource
@ -48,6 +60,11 @@ enum class CloudTypeModel(builder: Builder) {
multiInstances = true
return this
}
fun withPreFilledURL(preFilledURL: String): Builder {
this.preFilledURL = preFilledURL
return this
}
}
companion object {

View File

@ -18,7 +18,7 @@ class CloudModelMapper @Inject constructor() : ModelMapper<CloudModel, Cloud>()
CloudTypeModel.ONEDRIVE -> OnedriveCloudModel(domainObject)
CloudTypeModel.CRYPTO -> CryptoCloudModel(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.widget.Toast
import androidx.annotation.RequiresApi
import org.cryptomator.domain.Cloud
import org.cryptomator.domain.LocalStorageCloud
import org.cryptomator.domain.Vault
import org.cryptomator.domain.*
import org.cryptomator.domain.di.PerView
import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
@ -48,8 +46,13 @@ class CloudConnectionListPresenter @Inject constructor( //
}
fun loadCloudList() {
val cloudTypeFilter = when(selectedCloudType.get()) {
CloudTypeModel.WEB_DE, CloudTypeModel.MAILBOX_ORG -> CloudTypeModel.WEBDAV
else -> selectedCloudType.get()
}
getCloudsUseCase //
.withCloudType(CloudTypeModel.valueOf(selectedCloudType.get())) //
.withCloudType(CloudTypeModel.valueOf(cloudTypeFilter)) //
.run(object : DefaultResultHandler<List<Cloud>>() {
override fun onSuccess(clouds: List<Cloud>) {
val cloudModels: MutableList<CloudModel> = ArrayList()
@ -60,6 +63,18 @@ class CloudConnectionListPresenter @Inject constructor( //
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))
}
view?.showCloudModels(cloudModels)
@ -123,6 +138,8 @@ class CloudConnectionListPresenter @Inject constructor( //
CloudTypeModel.WEBDAV -> requestActivityResult(ActivityResultCallbacks.addChangeWebDavCloud(), //
Intents.webDavAddOrChangeIntent())
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)
}
override fun createFragment(): Fragment? = ChooseCloudServiceFragment()
override fun createFragment(): Fragment = ChooseCloudServiceFragment()
override fun getCustomMenuResource(): Int = R.menu.menu_cloud_services

View File

@ -31,7 +31,7 @@ class WebDavAddOrChangeActivity : BaseActivity(),
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?) {
webDavAddOrChangeFragment().hideKeyboard()

View File

@ -23,6 +23,9 @@ class WebDavAddOrChangeFragment : BaseFragment() {
private val webDavCloudModel: 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() {
createCloudButton.setOnClickListener { createCloud() }
createCloudButton.setOnEditorActionListener { _, actionId, _ ->
@ -32,12 +35,16 @@ class WebDavAddOrChangeFragment : BaseFragment() {
false
}
preFilledPath?.let {
urlPortEditText.setText(it)
}
urlPortEditText.text?.length?.let { urlPortEditText.setSelection(it) }
showEditableCloudContent(webDavCloudModel)
}
private fun showEditableCloudContent(webDavCloudModel: WebDavCloudModel?) {
if (webDavCloudModel != null) {
webDavCloudModel?.let {
urlPortEditText.setText(webDavCloudModel.url())
userNameEditText.setText(webDavCloudModel.username())
passwordEditText.setText(getPassword(webDavCloudModel.accessToken()))
@ -74,11 +81,13 @@ class WebDavAddOrChangeFragment : BaseFragment() {
companion object {
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 args = Bundle()
args.putSerializable(ARG_WEBDAV_CLOUD, cloudModel)
args.putSerializable(ARG_PRE_FILLED_PATH, preFilledURL)
result.arguments = args
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_webdav" translatable="false">WebDAV</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 -->