diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsBottomSheetFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsBottomSheetFragment.kt index 996817c72c..4a6c7267af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsBottomSheetFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsBottomSheetFragment.kt @@ -20,7 +20,8 @@ abstract class DSLSettingsBottomSheetFragment( override val peekHeightPercentage: Float = 1f ) : FixedRoundedCornerBottomSheetDialogFragment() { - private lateinit var recyclerView: RecyclerView + protected lateinit var recyclerView: RecyclerView + private set override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(layoutId, container, false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt index 1a97e2655a..d3337b51dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt @@ -7,6 +7,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.RecyclerView import com.airbnb.lottie.LottieAnimationView import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.DimensionUnit @@ -14,6 +15,7 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.badges.models.BadgePreview +import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout import org.thoughtcrime.securesms.components.settings.DSLConfiguration import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFragment @@ -24,6 +26,7 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.DonationE import org.thoughtcrime.securesms.components.settings.app.subscription.models.CurrencySelection import org.thoughtcrime.securesms.components.settings.app.subscription.models.GooglePayButton import org.thoughtcrime.securesms.components.settings.configure +import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.Projection import org.thoughtcrime.securesms.util.SpanUtil @@ -70,6 +73,8 @@ class BoostFragment : DSLSettingsBottomSheetFragment( .setCancelable(false) .create() + recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_IF_CONTENT_SCROLLS + boost1AnimationView = requireView().findViewById(R.id.boost1_animation) boost2AnimationView = requireView().findViewById(R.id.boost2_animation) boost3AnimationView = requireView().findViewById(R.id.boost3_animation) @@ -77,6 +82,18 @@ class BoostFragment : DSLSettingsBottomSheetFragment( boost5AnimationView = requireView().findViewById(R.id.boost5_animation) boost6AnimationView = requireView().findViewById(R.id.boost6_animation) + KeyboardAwareLinearLayout(requireContext()).apply { + addOnKeyboardHiddenListener { + recyclerView.post { recyclerView.requestLayout() } + } + + addOnKeyboardShownListener { + recyclerView.post { recyclerView.scrollToPosition(adapter.itemCount - 1) } + } + + requireCoordinatorLayout().addView(this) + } + viewModel.state.observe(viewLifecycleOwner) { state -> adapter.submitList(getConfiguration(state).toMappingModelList()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java deleted file mode 100644 index ee37b334f7..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.thoughtcrime.securesms.util; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -public final class BottomSheetUtil { - - public static final String STANDARD_BOTTOM_SHEET_FRAGMENT_TAG = "BOTTOM"; - - private BottomSheetUtil() {} - - /** - * Show preventing a possible IllegalStateException. - */ - public static void show(@NonNull FragmentManager manager, - @Nullable String tag, - @NonNull BottomSheetDialogFragment dialog) - { - FragmentTransaction transaction = manager.beginTransaction(); - transaction.add(dialog, tag); - transaction.commitAllowingStateLoss(); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.kt new file mode 100644 index 0000000000..e528b1e6a3 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.kt @@ -0,0 +1,29 @@ +package org.thoughtcrime.securesms.util + +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.fragment.app.FragmentManager +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import org.thoughtcrime.securesms.R + +object BottomSheetUtil { + const val STANDARD_BOTTOM_SHEET_FRAGMENT_TAG = "BOTTOM" + + /** + * Show preventing a possible IllegalStateException. + */ + @JvmStatic + fun show( + manager: FragmentManager, + tag: String?, + dialog: BottomSheetDialogFragment + ) { + manager.beginTransaction().apply { + add(dialog, tag) + commitAllowingStateLoss() + } + } + + fun BottomSheetDialogFragment.requireCoordinatorLayout(): CoordinatorLayout { + return requireDialog().findViewById(R.id.coordinator) + } +}