diff --git a/domain/src/main/java/org/cryptomator/domain/CloudType.java b/domain/src/main/java/org/cryptomator/domain/CloudType.java index 5161e418..ba2470c2 100644 --- a/domain/src/main/java/org/cryptomator/domain/CloudType.java +++ b/domain/src/main/java/org/cryptomator/domain/CloudType.java @@ -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 } diff --git a/presentation/src/main/java/org/cryptomator/presentation/intent/WebDavAddOrChangeIntent.java b/presentation/src/main/java/org/cryptomator/presentation/intent/WebDavAddOrChangeIntent.java index 55f1f516..92074195 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/intent/WebDavAddOrChangeIntent.java +++ b/presentation/src/main/java/org/cryptomator/presentation/intent/WebDavAddOrChangeIntent.java @@ -10,4 +10,8 @@ public interface WebDavAddOrChangeIntent { @Optional WebDavCloudModel webDavCloud(); + + @Optional + String preFilledURL(); + } diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt index 74f9d2b6..da83a2ad 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt @@ -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 { diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/mappers/CloudModelMapper.kt b/presentation/src/main/java/org/cryptomator/presentation/model/mappers/CloudModelMapper.kt index 9beca39f..b955e7a0 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/mappers/CloudModelMapper.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/mappers/CloudModelMapper.kt @@ -18,7 +18,7 @@ class CloudModelMapper @Inject constructor() : ModelMapper() 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) } } } 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 b4a11094..0957f097 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -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>() { override fun onSuccess(clouds: List) { val cloudModels: MutableList = 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)) } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ChooseCloudServiceActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ChooseCloudServiceActivity.kt index 1ef30889..55df6694 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ChooseCloudServiceActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ChooseCloudServiceActivity.kt @@ -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 diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/WebDavAddOrChangeActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/WebDavAddOrChangeActivity.kt index 15715be8..ea0257b1 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/WebDavAddOrChangeActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/WebDavAddOrChangeActivity.kt @@ -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() diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/WebDavAddOrChangeFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/WebDavAddOrChangeFragment.kt index 3285b987..1af409e8 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/WebDavAddOrChangeFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/WebDavAddOrChangeFragment.kt @@ -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 } diff --git a/presentation/src/main/res/drawable-xhdpi/cloud_type_webde_large.png b/presentation/src/main/res/drawable-xhdpi/cloud_type_webde_large.png new file mode 100644 index 00000000..48bf0714 Binary files /dev/null and b/presentation/src/main/res/drawable-xhdpi/cloud_type_webde_large.png differ diff --git a/presentation/src/main/res/drawable-xxhdpi/cloud_type_webde_large.png b/presentation/src/main/res/drawable-xxhdpi/cloud_type_webde_large.png new file mode 100644 index 00000000..62d5c959 Binary files /dev/null and b/presentation/src/main/res/drawable-xxhdpi/cloud_type_webde_large.png differ diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 240d713f..daf287a5 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -41,6 +41,8 @@ OneDrive WebDAV Local storage + WEB.DE + Mailbox.org