From 73ce9ffda57320a63d5ab70bafb86de6379f7033 Mon Sep 17 00:00:00 2001 From: UlrichKu Date: Wed, 25 Oct 2023 11:59:59 +0200 Subject: [PATCH] 4063: Make dialog size more stable (#4066) Fixes: #4063 Switching from an AlertDialog to only a DialogFragment. I didn't get the AlertDialog to be sized correctly. It also opens now directly with the right (full screen) size. When the imageView fails to load (i.e. with an audio file) it will be hidden. This changes the button layout somewhat. One observation: The placeholder text "... visually impaired..." is not quite right as a description for an audio file is not intended for the visually impaired. But I couldn't think of a better text just yet. ![grafik](https://github.com/tuskyapp/Tusky/assets/1618905/fd49d5bd-b86c-4659-abb9-f1776cbb2a55) --- .../compose/dialog/CaptionDialog.kt | 72 ++++++++++++------- .../res/layout/dialog_image_description.xml | 41 +++++++++-- app/src/main/res/values/strings.xml | 1 - 3 files changed, 79 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt index c066b3d9f..3b6399d19 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt @@ -15,7 +15,6 @@ package com.keylesspalace.tusky.components.compose.dialog -import android.app.Dialog import android.content.Context import android.graphics.drawable.Drawable import android.net.Uri @@ -26,7 +25,7 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.widget.EditText -import androidx.appcompat.app.AlertDialog +import android.widget.LinearLayout import androidx.core.os.BundleCompat import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment @@ -36,6 +35,8 @@ import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.DialogImageDescriptionBinding +import com.keylesspalace.tusky.util.hide +import com.keylesspalace.tusky.util.viewBinding // https://github.com/tootsuite/mastodon/blob/c6904c0d3766a2ea8a81ab025c127169ecb51373/app/models/media_attachment.rb#L32 private const val MEDIA_DESCRIPTION_CHARACTER_LIMIT = 1500 @@ -44,11 +45,26 @@ class CaptionDialog : DialogFragment() { private lateinit var listener: Listener private lateinit var input: EditText - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val context = requireContext() + private val binding by viewBinding(DialogImageDescriptionBinding::bind) - val binding = DialogImageDescriptionBinding.inflate(layoutInflater) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NORMAL, R.style.TuskyDialogFragmentStyle) + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + savedInstanceState?.getString(DESCRIPTION_KEY)?.let { + input.setText(it) + } + + return inflater.inflate(R.layout.dialog_image_description, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { input = binding.imageDescriptionText val imageView = binding.imageDescriptionView imageView.maxZoom = 6f @@ -61,20 +77,19 @@ class CaptionDialog : DialogFragment() { input.filters = arrayOf(InputFilter.LengthFilter(MEDIA_DESCRIPTION_CHARACTER_LIMIT)) input.setText(arguments?.getString(EXISTING_DESCRIPTION_ARG)) + binding.cancelButton.setOnClickListener { + dismiss() + } val localId = arguments?.getInt(LOCAL_ID_ARG) ?: error("Missing localId") - val dialog = AlertDialog.Builder(context) - .setView(binding.root) - .setPositiveButton(android.R.string.ok) { _, _ -> - listener.onUpdateDescription(localId, input.text.toString()) - } - .setNegativeButton(android.R.string.cancel, null) - .create() + binding.okButton.setOnClickListener { + listener.onUpdateDescription(localId, input.text.toString()) + dismiss() + } isCancelable = true - val window = dialog.window - window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) val previewUri = BundleCompat.getParcelable(requireArguments(), PREVIEW_URI_ARG, Uri::class.java) ?: error("Preview Uri is null") + // Load the image and manually set it into the ImageView because it doesn't have a fixed size. Glide.with(this) .load(previewUri) @@ -90,9 +105,23 @@ class CaptionDialog : DialogFragment() { ) { imageView.setImageDrawable(resource) } - }) - return dialog + override fun onLoadFailed(errorDrawable: Drawable?) { + super.onLoadFailed(errorDrawable) + imageView.hide() + } + }) + } + + override fun onStart() { + super.onStart() + dialog?.apply { + window?.setLayout( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + } } override fun onSaveInstanceState(outState: Bundle) { @@ -100,17 +129,6 @@ class CaptionDialog : DialogFragment() { super.onSaveInstanceState(outState) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - savedInstanceState?.getString(DESCRIPTION_KEY)?.let { - input.setText(it) - } - return super.onCreateView(inflater, container, savedInstanceState) - } - override fun onAttach(context: Context) { super.onAttach(context) listener = context as? Listener ?: error("Activity is not ComposeCaptionDialog.Listener") diff --git a/app/src/main/res/layout/dialog_image_description.xml b/app/src/main/res/layout/dialog_image_description.xml index d20d8795f..e44b4887e 100644 --- a/app/src/main/res/layout/dialog_image_description.xml +++ b/app/src/main/res/layout/dialog_image_description.xml @@ -1,6 +1,8 @@ + + android:contentDescription="@string/post_media_image" /> + app:counterTextColor="?android:textColorTertiary" + app:hintEnabled="false"> + tools:hint="Description" + android:importantForAutofill="no" + android:inputType="textCapSentences|textMultiLine|textAutoCorrect" /> + + + +