From 2accfd071262182a560f35c6b438e8640e5a76df Mon Sep 17 00:00:00 2001 From: UlrichKu Date: Tue, 6 Dec 2022 19:28:44 +0100 Subject: [PATCH] 2890 show warning on missing description (#2919) * issue 2890: Show a warning icon if media description is missing * issue 2890: Remove disturbing additional signs * issue 2890: Add another icon; use a snackbar; change wording; use orange as color * issue 2890: Remove now unneeded new resource * issue 2890: Use a toast (also) to avoid elevation problems * issue 2890: Use snackbar with elevation again; refactor a bit --- .../components/compose/ComposeActivity.kt | 33 +++++++++++++------ .../drawable/ic_missing_description_24dp.xml | 5 +++ app/src/main/res/layout/activity_compose.xml | 16 ++++++++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/ic_missing_description_24dp.xml diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt index 3a827e9b..c8b138b0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt @@ -188,7 +188,7 @@ class ComposeActivity : Log.w("ComposeActivity", "Edit image cancelled by user") } else { Log.w("ComposeActivity", "Edit image failed: " + result.error) - displayTransientError(R.string.error_image_edit_failed) + displayTransientMessage(R.string.error_image_edit_failed) } viewModel.cropImageItemOld = null } @@ -470,9 +470,9 @@ class ComposeActivity : lifecycleScope.launch { viewModel.uploadError.collect { throwable -> if (throwable is UploadServerError) { - displayTransientError(throwable.errorMessage) + displayTransientMessage(throwable.errorMessage) } else { - displayTransientError(R.string.error_media_upload_sending) + displayTransientMessage(R.string.error_media_upload_sending) } } } @@ -500,6 +500,9 @@ class ComposeActivity : binding.composeScheduleView.setListener(this) binding.atButton.setOnClickListener { atButtonClicked() } binding.hashButton.setOnClickListener { hashButtonClicked() } + binding.descriptionMissingWarningButton.setOnClickListener { + displayTransientMessage(R.string.hint_media_description_missing) + } val textColor = ThemeUtils.getColor(this, android.R.attr.textColorTertiary) @@ -656,15 +659,15 @@ class ComposeActivity : super.onSaveInstanceState(outState) } - private fun displayTransientError(errorMessage: String) { - val bar = Snackbar.make(binding.activityCompose, errorMessage, Snackbar.LENGTH_LONG) + private fun displayTransientMessage(message: String) { + val bar = Snackbar.make(binding.activityCompose, message, Snackbar.LENGTH_LONG) // necessary so snackbar is shown over everything bar.view.elevation = resources.getDimension(R.dimen.compose_activity_snackbar_elevation) bar.setAnchorView(R.id.composeBottomBar) bar.show() } - private fun displayTransientError(@StringRes stringId: Int) { - displayTransientError(getString(stringId)) + private fun displayTransientMessage(@StringRes stringId: Int) { + displayTransientMessage(getString(stringId)) } private fun toggleHideMedia() { @@ -674,6 +677,7 @@ class ComposeActivity : private fun updateSensitiveMediaToggle(markMediaSensitive: Boolean, contentWarningShown: Boolean) { if (viewModel.media.value.isEmpty()) { binding.composeHideMediaButton.hide() + binding.descriptionMissingWarningButton.hide() } else { binding.composeHideMediaButton.show() @ColorInt val color = if (contentWarningShown) { @@ -691,6 +695,15 @@ class ComposeActivity : } } binding.composeHideMediaButton.drawable.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) + + var oneMediaWithoutDescription = false + for (media in viewModel.media.value) { + if (media.description == null || media.description.isEmpty()) { + oneMediaWithoutDescription = true + break + } + } + binding.descriptionMissingWarningButton.visibility = if (oneMediaWithoutDescription) View.VISIBLE else View.GONE } } @@ -760,7 +773,7 @@ class ComposeActivity : binding.emojiView.adapter?.let { if (it.itemCount == 0) { val errorMessage = getString(R.string.error_no_custom_emojis, accountManager.activeAccount!!.domain) - Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show() + displayTransientMessage(errorMessage) } else { if (emojiBehavior.state == BottomSheetBehavior.STATE_HIDDEN || emojiBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) { emojiBehavior.state = BottomSheetBehavior.STATE_EXPANDED @@ -980,7 +993,7 @@ class ComposeActivity : val photoFile: File = try { createNewImageFile(this) } catch (ex: IOException) { - displayTransientError(R.string.error_media_upload_opening) + displayTransientMessage(R.string.error_media_upload_opening) return } @@ -1050,7 +1063,7 @@ class ComposeActivity : is VideoOrImageException -> getString(R.string.error_media_upload_image_or_video) else -> getString(R.string.error_media_upload_opening) } - displayTransientError(errorString) + displayTransientMessage(errorString) } } } diff --git a/app/src/main/res/drawable/ic_missing_description_24dp.xml b/app/src/main/res/drawable/ic_missing_description_24dp.xml new file mode 100644 index 00000000..19d78d19 --- /dev/null +++ b/app/src/main/res/drawable/ic_missing_description_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml index 902bae40..367d88ba 100644 --- a/app/src/main/res/layout/activity_compose.xml +++ b/app/src/main/res/layout/activity_compose.xml @@ -25,7 +25,7 @@ + + Anzeigename Über mich Suchen … + Medien sollten Beschreibungen haben. Keine Ergebnisse Antworten … Profilbild diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1965c4db..4bf7a371 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -195,6 +195,7 @@ Display name Bio Search… + Media should have a description. No results