Add display name to S3 cloud

This commit is contained in:
Julian Raufelder 2021-04-22 14:57:41 +02:00 committed by Manuel Jenny
parent 7f0967ab88
commit e4ad22b00b
No known key found for this signature in database
GPG Key ID: 1C80FE62B2BEAA18
13 changed files with 149 additions and 103 deletions

View File

@ -70,6 +70,7 @@ public class CloudEntityMapper extends EntityMapper<CloudEntity, Cloud> {
.withAccessKey(entity.getAccessToken()) // .withAccessKey(entity.getAccessToken()) //
.withSecretKey(entity.getS3SecretKey()) // .withSecretKey(entity.getS3SecretKey()) //
.withS3Bucket(entity.getS3Bucket()) // .withS3Bucket(entity.getS3Bucket()) //
.withDisplayName(entity.getUsername()) //
.build(); .build();
case WEBDAV: case WEBDAV:
return aWebDavCloudCloud() // return aWebDavCloudCloud() //
@ -116,6 +117,7 @@ public class CloudEntityMapper extends EntityMapper<CloudEntity, Cloud> {
result.setAccessToken(((S3Cloud) domainObject).accessKey()); result.setAccessToken(((S3Cloud) domainObject).accessKey());
result.setS3SecretKey(((S3Cloud) domainObject).secretKey()); result.setS3SecretKey(((S3Cloud) domainObject).secretKey());
result.setS3Bucket(((S3Cloud) domainObject).s3Bucket()); result.setS3Bucket(((S3Cloud) domainObject).s3Bucket());
result.setUsername(((S3Cloud) domainObject).displayName());
break; break;
case WEBDAV: case WEBDAV:
result.setAccessToken(((WebDavCloud) domainObject).password()); result.setAccessToken(((WebDavCloud) domainObject).password());

View File

@ -10,6 +10,7 @@ public class S3Cloud implements Cloud {
private final String s3Bucket; private final String s3Bucket;
private final String s3Endpoint; private final String s3Endpoint;
private final String s3Region; private final String s3Region;
private final String displayName;
private S3Cloud(Builder builder) { private S3Cloud(Builder builder) {
this.id = builder.id; this.id = builder.id;
@ -18,6 +19,7 @@ public class S3Cloud implements Cloud {
this.s3Bucket = builder.s3Bucket; this.s3Bucket = builder.s3Bucket;
this.s3Endpoint = builder.s3Endpoint; this.s3Endpoint = builder.s3Endpoint;
this.s3Region = builder.s3Region; this.s3Region = builder.s3Region;
this.displayName = builder.displayName;
} }
public static Builder aS3Cloud() { public static Builder aS3Cloud() {
@ -31,7 +33,8 @@ public class S3Cloud implements Cloud {
.withSecretKey(s3Cloud.secretKey()) // .withSecretKey(s3Cloud.secretKey()) //
.withS3Bucket(s3Cloud.s3Bucket()) // .withS3Bucket(s3Cloud.s3Bucket()) //
.withS3Endpoint(s3Cloud.s3Endpoint()) // .withS3Endpoint(s3Cloud.s3Endpoint()) //
.withS3Region(s3Cloud.s3Region()); .withS3Region(s3Cloud.s3Region()) //
.withDisplayName(s3Cloud.displayName());
} }
@Override @Override
@ -59,6 +62,10 @@ public class S3Cloud implements Cloud {
return s3Region; return s3Region;
} }
public String displayName() {
return displayName;
}
@Override @Override
public CloudType type() { public CloudType type() {
return CloudType.S3; return CloudType.S3;
@ -124,6 +131,7 @@ public class S3Cloud implements Cloud {
private String s3Bucket; private String s3Bucket;
private String s3Endpoint; private String s3Endpoint;
private String s3Region; private String s3Region;
private String displayName;
private Builder() { private Builder() {
} }
@ -158,6 +166,11 @@ public class S3Cloud implements Cloud {
return this; return this;
} }
public Builder withDisplayName(String displayName) {
this.displayName = displayName;
return this;
}
public S3Cloud build() { public S3Cloud build() {
return new S3Cloud(this); return new S3Cloud(this);
} }

View File

@ -23,13 +23,13 @@ enum class CloudTypeModel(builder: Builder) {
.withVaultImageResource(R.drawable.pcloud_vault) // .withVaultImageResource(R.drawable.pcloud_vault) //
.withVaultSelectedImageResource(R.drawable.pcloud_vault_selected) // .withVaultSelectedImageResource(R.drawable.pcloud_vault_selected) //
.withMultiInstances()), // .withMultiInstances()), //
S3(Builder("S3", R.string.cloud_names_s3) // WEBDAV(Builder("WEBDAV", R.string.cloud_names_webdav) //
.withCloudImageResource(R.drawable.s3) // .withCloudImageResource(R.drawable.webdav) //
.withVaultImageResource(R.drawable.webdav_vault) // .withVaultImageResource(R.drawable.webdav_vault) //
.withVaultSelectedImageResource(R.drawable.webdav_vault_selected) // .withVaultSelectedImageResource(R.drawable.webdav_vault_selected) //
.withMultiInstances()), // .withMultiInstances()), //
WEBDAV(Builder("WEBDAV", R.string.cloud_names_webdav) // S3(Builder("S3", R.string.cloud_names_s3) //
.withCloudImageResource(R.drawable.webdav) // .withCloudImageResource(R.drawable.s3) //
.withVaultImageResource(R.drawable.webdav_vault) // .withVaultImageResource(R.drawable.webdav_vault) //
.withVaultSelectedImageResource(R.drawable.webdav_vault_selected) // .withVaultSelectedImageResource(R.drawable.webdav_vault_selected) //
.withMultiInstances()), // .withMultiInstances()), //

View File

@ -10,8 +10,8 @@ class S3CloudModel(cloud: Cloud) : CloudModel(cloud) {
return R.string.cloud_names_s3 return R.string.cloud_names_s3
} }
override fun username(): String? { override fun username(): String {
return "" // FIXME return cloud().displayName()
} }
override fun cloudType(): CloudTypeModel { override fun cloudType(): CloudTypeModel {

View File

@ -93,8 +93,8 @@ class CloudSettingsPresenter @Inject constructor( //
private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String { private fun effectiveTitle(cloudTypeModel: CloudTypeModel): String {
when (cloudTypeModel) { when (cloudTypeModel) {
CloudTypeModel.PCLOUD -> return context().getString(R.string.screen_cloud_settings_pcloud_connections) CloudTypeModel.PCLOUD -> return context().getString(R.string.screen_cloud_settings_pcloud_connections)
CloudTypeModel.S3 -> return context().getString(R.string.screen_cloud_settings_s3_connections)
CloudTypeModel.WEBDAV -> return context().getString(R.string.screen_cloud_settings_webdav_connections) CloudTypeModel.WEBDAV -> return context().getString(R.string.screen_cloud_settings_webdav_connections)
CloudTypeModel.S3 -> return context().getString(R.string.screen_cloud_settings_s3_connections)
CloudTypeModel.LOCAL -> return context().getString(R.string.screen_cloud_settings_local_storage_locations) CloudTypeModel.LOCAL -> return context().getString(R.string.screen_cloud_settings_local_storage_locations)
} }
return context().getString(R.string.screen_cloud_settings_title) return context().getString(R.string.screen_cloud_settings_title)
@ -127,8 +127,8 @@ class CloudSettingsPresenter @Inject constructor( //
.toMutableList() // .toMutableList() //
.also { .also {
it.add(aPCloud()) it.add(aPCloud())
it.add(aS3Cloud())
it.add(aWebdavCloud()) it.add(aWebdavCloud())
it.add(aS3Cloud())
it.add(aLocalCloud()) it.add(aLocalCloud())
} }
view?.render(cloudModel) view?.render(cloudModel)
@ -138,14 +138,14 @@ class CloudSettingsPresenter @Inject constructor( //
return PCloudModel(PCloud.aPCloud().build()) return PCloudModel(PCloud.aPCloud().build())
} }
private fun aS3Cloud(): S3CloudModel {
return S3CloudModel(S3Cloud.aS3Cloud().build())
}
private fun aWebdavCloud(): WebDavCloudModel { private fun aWebdavCloud(): WebDavCloudModel {
return WebDavCloudModel(WebDavCloud.aWebDavCloudCloud().build()) return WebDavCloudModel(WebDavCloud.aWebDavCloudCloud().build())
} }
private fun aS3Cloud(): S3CloudModel {
return S3CloudModel(S3Cloud.aS3Cloud().build())
}
private fun aLocalCloud(): CloudModel { private fun aLocalCloud(): CloudModel {
return LocalStorageModel(LocalStorageCloud.aLocalStorage().build()) return LocalStorageModel(LocalStorageCloud.aLocalStorage().build())
} }

View File

@ -19,7 +19,7 @@ class S3AddOrChangePresenter @Inject internal constructor( //
private val connectToS3UseCase: ConnectToS3UseCase, // private val connectToS3UseCase: ConnectToS3UseCase, //
exceptionMappings: ExceptionHandlers) : Presenter<S3AddOrChangeView>(exceptionMappings) { exceptionMappings: ExceptionHandlers) : Presenter<S3AddOrChangeView>(exceptionMappings) {
fun checkUserInput(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?) { fun checkUserInput(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String) {
var statusMessage: String? = null var statusMessage: String? = null
/*if (accessKey.isEmpty()) { /*if (accessKey.isEmpty()) {
@ -36,7 +36,7 @@ class S3AddOrChangePresenter @Inject internal constructor( //
// FIXME showError instead of displaying a toast // FIXME showError instead of displaying a toast
Toast.makeText(context(), statusMessage, Toast.LENGTH_SHORT).show() Toast.makeText(context(), statusMessage, Toast.LENGTH_SHORT).show()
} else { } else {
view?.onCheckUserInputSucceeded(encrypt(accessKey), encrypt(secretKey), bucket, endpoint, region, cloudId) view?.onCheckUserInputSucceeded(encrypt(accessKey), encrypt(secretKey), bucket, endpoint, region, cloudId, displayName)
} }
} }
@ -46,22 +46,23 @@ class S3AddOrChangePresenter @Inject internal constructor( //
.encrypt(text) .encrypt(text)
} }
private fun mapToCloud(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?): S3Cloud { private fun mapToCloud(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String): S3Cloud {
var builder = S3Cloud // var builder = S3Cloud //
.aS3Cloud() // .aS3Cloud() //
.withAccessKey(accessKey) // .withAccessKey(accessKey) //
.withSecretKey(secretKey) // .withSecretKey(secretKey) //
.withS3Bucket(bucket) // .withS3Bucket(bucket) //
.withS3Endpoint(endpoint) // .withS3Endpoint(endpoint) //
.withS3Region(region) .withS3Region(region) //
.withDisplayName(displayName)
cloudId?.let { builder = builder.withId(cloudId) } cloudId?.let { builder = builder.withId(cloudId) }
return builder.build() return builder.build()
} }
fun authenticate(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?) { fun authenticate(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String) {
authenticate(mapToCloud(accessKey, secretKey, bucket, endpoint, region, cloudId)) authenticate(mapToCloud(accessKey, secretKey, bucket, endpoint, region, cloudId, displayName))
} }
private fun authenticate(cloud: S3Cloud) { private fun authenticate(cloud: S3Cloud) {

View File

@ -27,9 +27,9 @@ class S3AddOrChangeActivity : BaseActivity(), S3AddOrChangeView {
override fun createFragment(): Fragment = S3AddOrChangeFragment.newInstance(s3AddOrChangeIntent.s3Cloud()) override fun createFragment(): Fragment = S3AddOrChangeFragment.newInstance(s3AddOrChangeIntent.s3Cloud())
override fun onCheckUserInputSucceeded(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?) { override fun onCheckUserInputSucceeded(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String) {
s3AddOrChangeFragment().hideKeyboard() s3AddOrChangeFragment().hideKeyboard()
s3AddOrChangePresenter.authenticate(accessKey, secretKey, bucket, endpoint, region, cloudId) s3AddOrChangePresenter.authenticate(accessKey, secretKey, bucket, endpoint, region, cloudId, displayName)
} }
private fun s3AddOrChangeFragment(): S3AddOrChangeFragment = getCurrentFragment(R.id.fragmentContainer) as S3AddOrChangeFragment private fun s3AddOrChangeFragment(): S3AddOrChangeFragment = getCurrentFragment(R.id.fragmentContainer) as S3AddOrChangeFragment

View File

@ -2,6 +2,6 @@ package org.cryptomator.presentation.ui.activity.view
interface S3AddOrChangeView : View { interface S3AddOrChangeView : View {
fun onCheckUserInputSucceeded(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?) fun onCheckUserInputSucceeded(accessKey: String, secretKey: String, bucket: String, endpoint: String?, region: String?, cloudId: Long?, displayName: String)
} }

View File

@ -87,7 +87,7 @@ internal constructor(context: Context) : RecyclerViewBaseAdapter<CloudModel, Clo
private fun bindS3loudModel(cloudModel: S3CloudModel) { private fun bindS3loudModel(cloudModel: S3CloudModel) {
itemView.cloudText.text = cloudModel.username() // FIXME what to display itemView.cloudText.text = cloudModel.username()
itemView.cloudSubText.visibility = View.GONE itemView.cloudSubText.visibility = View.GONE
} }

View File

@ -70,7 +70,7 @@ class CloudConnectionSettingsBottomSheet : BaseBottomSheet<CloudConnectionSettin
private fun bindViewForS3(cloudModel: S3CloudModel) { private fun bindViewForS3(cloudModel: S3CloudModel) {
change_cloud.visibility = View.VISIBLE change_cloud.visibility = View.VISIBLE
tv_cloud_name.text = cloudModel.username() // FIXME what to display tv_cloud_name.text = cloudModel.username()
} }
companion object { companion object {

View File

@ -14,6 +14,7 @@ import javax.inject.Inject
import kotlinx.android.synthetic.main.fragment_setup_s3.accessKeyEditText import kotlinx.android.synthetic.main.fragment_setup_s3.accessKeyEditText
import kotlinx.android.synthetic.main.fragment_setup_s3.bucketEditText import kotlinx.android.synthetic.main.fragment_setup_s3.bucketEditText
import kotlinx.android.synthetic.main.fragment_setup_s3.createCloudButton import kotlinx.android.synthetic.main.fragment_setup_s3.createCloudButton
import kotlinx.android.synthetic.main.fragment_setup_s3.displayNameEditText
import kotlinx.android.synthetic.main.fragment_setup_s3.endpointEditText import kotlinx.android.synthetic.main.fragment_setup_s3.endpointEditText
import kotlinx.android.synthetic.main.fragment_setup_s3.ll_custom_s3 import kotlinx.android.synthetic.main.fragment_setup_s3.ll_custom_s3
import kotlinx.android.synthetic.main.fragment_setup_s3.regionEditText import kotlinx.android.synthetic.main.fragment_setup_s3.regionEditText
@ -64,6 +65,7 @@ class S3AddOrChangeFragment : BaseFragment() {
private fun showEditableCloudContent(s3CloudModel: S3CloudModel?) { private fun showEditableCloudContent(s3CloudModel: S3CloudModel?) {
s3CloudModel?.let { s3CloudModel?.let {
cloudId = s3CloudModel.id() cloudId = s3CloudModel.id()
displayNameEditText.setText(s3CloudModel.username())
accessKeyEditText.setText(decrypt(s3CloudModel.accessKey())) accessKeyEditText.setText(decrypt(s3CloudModel.accessKey()))
secretKeyEditText.setText(decrypt(s3CloudModel.secretKey())) secretKeyEditText.setText(decrypt(s3CloudModel.secretKey()))
bucketEditText.setText(s3CloudModel.s3Bucket()) bucketEditText.setText(s3CloudModel.s3Bucket())
@ -89,6 +91,7 @@ class S3AddOrChangeFragment : BaseFragment() {
val accessKey = accessKeyEditText.text.toString().trim() val accessKey = accessKeyEditText.text.toString().trim()
val secretKey = secretKeyEditText.text.toString().trim() val secretKey = secretKeyEditText.text.toString().trim()
val bucket = bucketEditText.text.toString().trim() val bucket = bucketEditText.text.toString().trim()
val displayName = displayNameEditText.text.toString().trim()
var endpoint: String? = null var endpoint: String? = null
var region: String? = null var region: String? = null
@ -97,7 +100,7 @@ class S3AddOrChangeFragment : BaseFragment() {
region = regionEditText.text.toString().trim() region = regionEditText.text.toString().trim()
} }
s3AddOrChangePresenter.checkUserInput(accessKey, secretKey, bucket, endpoint, region, cloudId) s3AddOrChangePresenter.checkUserInput(accessKey, secretKey, bucket, endpoint, region, cloudId, displayName)
} }
fun hideKeyboard() { fun hideKeyboard() {

View File

@ -1,113 +1,139 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical"
android:padding="@dimen/activity_vertical_margin">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/accessKeyEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_access_key_label"
android:imeOptions="flagNoPersonalizedLearning"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/secretKeyEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_secret_key_label"
android:imeOptions="flagNoPersonalizedLearning"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/bucketEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_bucket_label"
android:imeOptions="flagNoPersonalizedLearning"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/toggleCustomS3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:checked="true"
android:text="@string/screen_s3_settings_amazon_s3_text" />
<LinearLayout <LinearLayout
android:id="@+id/ll_custom_s3"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> android:padding="@dimen/activity_vertical_margin">
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/endpointEditText" android:id="@+id/displayNameEditText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_endpoint_label" android:hint="@string/screen_s3_settings_display_name_label"
android:imeOptions="flagNoPersonalizedLearning" android:imeOptions="flagNoPersonalizedLearning"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" /> android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/regionEditText" android:id="@+id/accessKeyEditText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_region_label" android:hint="@string/screen_s3_settings_access_key_label"
android:imeOptions="flagNoPersonalizedLearning"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/secretKeyEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_secret_key_label"
android:imeOptions="flagNoPersonalizedLearning"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/bucketEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_bucket_label"
android:imeOptions="flagNoPersonalizedLearning" android:imeOptions="flagNoPersonalizedLearning"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" /> android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/toggleCustomS3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:checked="true"
android:text="@string/screen_s3_settings_amazon_s3_text" />
<LinearLayout
android:id="@+id/ll_custom_s3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:visibility="gone">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/endpointEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_endpoint_label"
android:imeOptions="flagNoPersonalizedLearning"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/regionEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/screen_s3_settings_region_label"
android:imeOptions="flagNoPersonalizedLearning"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<Button
android:id="@+id/createCloudButton"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/screen_webdav_settings_done_button_text"
android:textStyle="bold" />
</LinearLayout> </LinearLayout>
</ScrollView>
<Button
android:id="@+id/createCloudButton"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/screen_webdav_settings_done_button_text"
android:textStyle="bold" />
</LinearLayout>

View File

@ -175,6 +175,7 @@
<!-- ## screen: s3 settings --> <!-- ## screen: s3 settings -->
<string name="screen_s3_settings_title" translatable="false">@string/cloud_names_s3</string> <string name="screen_s3_settings_title" translatable="false">@string/cloud_names_s3</string>
<string name="screen_s3_settings_display_name_label">Display Name</string>
<string name="screen_s3_settings_access_key_label">Access Key</string> <string name="screen_s3_settings_access_key_label">Access Key</string>
<string name="screen_s3_settings_secret_key_label">Secret Key</string> <string name="screen_s3_settings_secret_key_label">Secret Key</string>
<string name="screen_s3_settings_bucket_label">Bucket</string> <string name="screen_s3_settings_bucket_label">Bucket</string>