From 87b00bb156a589b824f7ce541e88bb13a1496fb3 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 31 Mar 2022 16:51:02 -0400 Subject: [PATCH] Fix various story reply bottom sheet issues. --- .../reply/composer/StoryReplyComposer.kt | 5 ---- .../direct/StoryDirectReplyDialogFragment.kt | 2 -- ...toryGroupReplyBottomSheetDialogFragment.kt | 18 ++++++++++---- .../reply/group/StoryGroupReplyFragment.kt | 24 +++---------------- .../StoryViewsAndRepliesDialogFragment.kt | 18 ++++++++++---- .../StoryViewsBottomSheetDialogFragment.kt | 2 ++ .../res/layout/bottom_sheet_container.xml | 1 + .../layout/stories_group_replies_fragment.xml | 6 ++--- 8 files changed, 37 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReplyComposer.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReplyComposer.kt index 7e70e5a782..d30a41d739 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReplyComposer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/composer/StoryReplyComposer.kt @@ -115,10 +115,6 @@ class StoryReplyComposer @JvmOverloads constructor( return trimmedText to mentions } - override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { - callback?.onHeightChanged(h) - } - fun openEmojiSearch() { emojiDrawer.onOpenEmojiSearch() } @@ -154,7 +150,6 @@ class StoryReplyComposer @JvmOverloads constructor( fun onSendActionClicked() fun onPickReactionClicked() fun onInitializeEmojiDrawer(mediaKeyboard: MediaKeyboard) - fun onHeightChanged(height: Int) } companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt index c52a7cc125..a777055c8e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/direct/StoryDirectReplyDialogFragment.kt @@ -104,8 +104,6 @@ class StoryDirectReplyDialogFragment : keyboardPagerViewModel.setOnlyPage(KeyboardPage.EMOJI) mediaKeyboard.setFragmentManager(childFragmentManager) } - - override fun onHeightChanged(height: Int) = Unit } viewModel.state.observe(viewLifecycleOwner) { state -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt index ba13ad3101..5f84a65df9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyBottomSheetDialogFragment.kt @@ -15,7 +15,9 @@ import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialog import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stories.viewer.page.StoryViewerPageViewModel import org.thoughtcrime.securesms.stories.viewer.reply.BottomSheetBehaviorDelegate +import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout import org.thoughtcrime.securesms.util.LifecycleDisposable +import kotlin.math.min import kotlin.math.roundToInt /** @@ -45,10 +47,6 @@ class StoryGroupReplyBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDi } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - view.updateLayoutParams { - height = (resources.displayMetrics.heightPixels * 0.6f).roundToInt() - } - lifecycleDisposable.bindTo(viewLifecycleOwner) if (savedInstanceState == null) { childFragmentManager.beginTransaction() @@ -68,6 +66,18 @@ class StoryGroupReplyBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDi } } }) + + view.viewTreeObserver.addOnGlobalLayoutListener { + val parentHeight = requireCoordinatorLayout().height + val desiredHeight = (resources.displayMetrics.heightPixels * 0.6f).roundToInt() + val targetHeight = if (parentHeight != 0) min(parentHeight, desiredHeight) else desiredHeight + + if (view.height != targetHeight) { + view.updateLayoutParams { + height = targetHeight + } + } + } } override fun onDismiss(dialog: DialogInterface) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt index 7a4d0ea2c4..5e25ae0dc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt @@ -2,11 +2,10 @@ package org.thoughtcrime.securesms.stories.viewer.reply.group import android.content.ClipData import android.os.Bundle +import android.provider.Settings.System.getConfiguration import android.view.KeyEvent import android.view.View -import android.view.ViewGroup import android.widget.Toast -import androidx.core.view.doOnNextLayout import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager @@ -34,7 +33,6 @@ import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDial import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment -import org.thoughtcrime.securesms.stories.viewer.reply.BottomSheetBehaviorDelegate import org.thoughtcrime.securesms.stories.viewer.reply.StoryViewsAndRepliesPagerChild import org.thoughtcrime.securesms.stories.viewer.reply.StoryViewsAndRepliesPagerParent import org.thoughtcrime.securesms.stories.viewer.reply.composer.StoryReactionBar @@ -42,9 +40,7 @@ import org.thoughtcrime.securesms.stories.viewer.reply.composer.StoryReplyCompos import org.thoughtcrime.securesms.util.DeleteDialog import org.thoughtcrime.securesms.util.FragmentDialogs.displayInDialogAboveAnchor import org.thoughtcrime.securesms.util.LifecycleDisposable -import org.thoughtcrime.securesms.util.Projection import org.thoughtcrime.securesms.util.ServiceUtil -import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.adapter.mapping.PagingMappingAdapter import org.thoughtcrime.securesms.util.fragments.findListener import org.thoughtcrime.securesms.util.fragments.requireListener @@ -56,7 +52,6 @@ import org.thoughtcrime.securesms.util.visible class StoryGroupReplyFragment : Fragment(R.layout.stories_group_replies_fragment), StoryViewsAndRepliesPagerChild, - BottomSheetBehaviorDelegate, StoryReplyComposer.Callback, EmojiKeyboardCallback, ReactWithAnyEmojiBottomSheetDialogFragment.Callback, @@ -123,10 +118,9 @@ class StoryGroupReplyFragment : } viewModel.pageData.observe(viewLifecycleOwner) { pageData -> - val isScrolledToBottom = recyclerView.canScrollVertically(-1) adapter.submitList(getConfiguration(pageData).toMappingModelList()) { - if (isScrolledToBottom) { - recyclerView.doOnNextLayout { + recyclerView.post { + if (recyclerView.canScrollVertically(1)) { recyclerView.smoothScrollToPosition(0) } } @@ -196,14 +190,6 @@ class StoryGroupReplyFragment : } } - override fun onSlide(bottomSheet: View) { - val inputProjection = Projection.relativeToViewRoot(composer, null) - val parentProjection = Projection.relativeToViewRoot(bottomSheet.parent as ViewGroup, null) - composer.translationY = (parentProjection.height + parentProjection.y - (inputProjection.y + inputProjection.height)) - inputProjection.release() - parentProjection.release() - } - override fun onPageSelected(child: StoryViewsAndRepliesPagerParent.Child) { currentChild = child updateNestedScrolling() @@ -274,10 +260,6 @@ class StoryGroupReplyFragment : sendReaction(emoji) } - override fun onHeightChanged(height: Int) { - ViewUtil.setPaddingBottom(recyclerView, height) - } - private fun initializeMentions() { Recipient.live(groupRecipientId).observe(viewLifecycleOwner) { recipient -> mentionsViewModel.onRecipientChange(recipient) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt index 591f6e3d91..6a0f98c881 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/tabs/StoryViewsAndRepliesDialogFragment.kt @@ -22,7 +22,9 @@ import org.thoughtcrime.securesms.stories.viewer.reply.BottomSheetBehaviorDelega import org.thoughtcrime.securesms.stories.viewer.reply.StoryViewsAndRepliesPagerChild import org.thoughtcrime.securesms.stories.viewer.reply.StoryViewsAndRepliesPagerParent import org.thoughtcrime.securesms.stories.viewer.reply.group.StoryGroupReplyFragment +import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout import org.thoughtcrime.securesms.util.LifecycleDisposable +import kotlin.math.min import kotlin.math.roundToInt /** @@ -61,10 +63,6 @@ class StoryViewsAndRepliesDialogFragment : FixedRoundedCornerBottomSheetDialogFr } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - view.updateLayoutParams { - height = (resources.displayMetrics.heightPixels * 0.6f).roundToInt() - } - pager = view.findViewById(R.id.pager) val bottomSheetBehavior = (requireDialog() as BottomSheetDialog).behavior @@ -94,6 +92,18 @@ class StoryViewsAndRepliesDialogFragment : FixedRoundedCornerBottomSheetDialogFr }.attach() lifecycleDisposable.bindTo(viewLifecycleOwner) + + view.viewTreeObserver.addOnGlobalLayoutListener { + val parentHeight = requireCoordinatorLayout().height + val desiredHeight = (resources.displayMetrics.heightPixels * 0.6f).roundToInt() + val targetHeight = if (parentHeight != 0) min(parentHeight, desiredHeight) else desiredHeight + + if (view.height != targetHeight) { + view.updateLayoutParams { + height = targetHeight + } + } + } } override fun onResume() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/views/StoryViewsBottomSheetDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/views/StoryViewsBottomSheetDialogFragment.kt index f1464d990e..78a41ee471 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/views/StoryViewsBottomSheetDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/views/StoryViewsBottomSheetDialogFragment.kt @@ -21,6 +21,8 @@ class StoryViewsBottomSheetDialogFragment : FixedRoundedCornerBottomSheetDialogF override val themeResId: Int get() = R.style.Widget_Signal_FixedRoundedCorners_Stories + override val peekHeightPercentage: Float = 1f + private val storyId: Long get() = requireArguments().getLong(ARG_STORY_ID) diff --git a/app/src/main/res/layout/bottom_sheet_container.xml b/app/src/main/res/layout/bottom_sheet_container.xml index d89cb6e412..cb269caa2d 100644 --- a/app/src/main/res/layout/bottom_sheet_container.xml +++ b/app/src/main/res/layout/bottom_sheet_container.xml @@ -11,6 +11,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" + android:layout_marginBottom="10dp" android:importantForAccessibility="no" app:srcCompat="@drawable/bottom_sheet_handle" /> diff --git a/app/src/main/res/layout/stories_group_replies_fragment.xml b/app/src/main/res/layout/stories_group_replies_fragment.xml index cd482ff7e7..13cf9644f6 100644 --- a/app/src/main/res/layout/stories_group_replies_fragment.xml +++ b/app/src/main/res/layout/stories_group_replies_fragment.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="240dp" + android:layout_height="match_parent" tools:layout_gravity="bottom">