From ec9bb3f89bac68e6fe2b220c5dfeacc853acee13 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa Date: Wed, 22 Oct 2025 13:32:25 +0530 Subject: [PATCH 1/3] Modify handleKeyboardInsets to handle insets correctly --- .../fr/free/nrw/commons/auth/LoginActivity.kt | 1 + .../categories/UploadCategoriesFragment.kt | 1 + .../commons/upload/depicts/DepictsFragment.kt | 1 + .../mediaDetails/UploadMediaDetailFragment.kt | 1 + .../free/nrw/commons/utils/EdgeToEdgeUtils.kt | 57 +++++++------------ 5 files changed, 26 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt index eb025b50f..688f508ae 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt @@ -89,6 +89,7 @@ class LoginActivity : AccountAuthenticatorActivity() { binding = ActivityLoginBinding.inflate(layoutInflater) applyEdgeToEdgeAllInsets(binding!!.root) + binding?.aboutPrivacyPolicy?.handleKeyboardInsets() with(binding!!) { setContentView(root) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.kt index 722a88b22..ee6af7bb6 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.kt @@ -70,6 +70,7 @@ class UploadCategoriesFragment : UploadBaseFragment(), CategoriesContract.View { savedInstanceState: Bundle? ): View? { binding = UploadCategoriesFragmentBinding.inflate(inflater, container, false) + binding!!.llContainerButtons.handleKeyboardInsets() return binding!!.root } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.kt index 2c2cf3586..5dcc2bf86 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.kt @@ -70,6 +70,7 @@ class DepictsFragment : UploadBaseFragment(), DepictsContract.View { savedInstanceState: Bundle? ): View { _binding = UploadDepictsFragmentBinding.inflate(inflater, container, false) + _binding!!.navigationButtonsContainer.handleKeyboardInsets() return binding.root } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt index 331c993c9..b3b067948 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt @@ -146,6 +146,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentUploadMediaDetailFragmentBinding.inflate(inflater, container, false) + _binding!!.mediaDetailCardView.handleKeyboardInsets() // intialise the adapter early to prevent uninitialized access uploadMediaDetailAdapter = UploadMediaDetailAdapter( this, diff --git a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt index d0c2b12e8..a5145c24d 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt +++ b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt @@ -166,46 +166,33 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset * and accounts for navigation bar insets to avoid double offsets. */ fun View.handleKeyboardInsets() { - var existingBottomMargin = 0 - - ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets -> - existingBottomMargin = if (view.getTag(R.id.initial_margin_bottom) != null) { - view.getTag(R.id.initial_margin_bottom) as Int - } else { - view.setTag(R.id.initial_margin_bottom, view.marginBottom) - view.marginBottom - } - - WindowInsetsCompat.CONSUMED + val existingBottomMargin = if (getTag(R.id.initial_margin_bottom) != null) { + getTag(R.id.initial_margin_bottom) as Int + } else { + setTag(R.id.initial_margin_bottom, marginBottom) + marginBottom } - // Animate during IME transition - ViewCompat.setWindowInsetsAnimationCallback( - this, - object : WindowInsetsAnimationCompat.Callback( - DISPATCH_MODE_CONTINUE_ON_SUBTREE - ) { - override fun onProgress( - insets: WindowInsetsCompat, - runningAnimations: MutableList - ): WindowInsetsCompat { - val lp = layoutParams as MarginLayoutParams - val navBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) - val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) - val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) + ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> - // Avoid extra space due to system nav bar when the keyboard is shown - val imeBottomMargin = imeInsets.bottom - navBarInsets.bottom + val lp = layoutParams as MarginLayoutParams - lp.bottomMargin = if(imeVisible && imeBottomMargin >= existingBottomMargin) - imeBottomMargin + existingBottomMargin - else existingBottomMargin + val navBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) + val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) + val imeBottomMargin = imeInsets.bottom - navBarInsets.bottom + + lp.bottomMargin = if (imeVisible && imeBottomMargin >= existingBottomMargin) + imeBottomMargin + existingBottomMargin + else existingBottomMargin + + layoutParams = lp + + insets + } + + ViewCompat.requestApplyInsets(this) - layoutParams = lp - return WindowInsetsCompat.CONSUMED - } - } - ) } /** From 3f2c75ce114d5a1043880a2f05cccd3d18124034 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa Date: Wed, 22 Oct 2025 13:43:37 +0530 Subject: [PATCH 2/3] Refactor handleKeyboardInsets() --- .../free/nrw/commons/utils/EdgeToEdgeUtils.kt | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt index a5145c24d..973884164 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt +++ b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt @@ -166,14 +166,13 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset * and accounts for navigation bar insets to avoid double offsets. */ fun View.handleKeyboardInsets() { - val existingBottomMargin = if (getTag(R.id.initial_margin_bottom) != null) { - getTag(R.id.initial_margin_bottom) as Int - } else { - setTag(R.id.initial_margin_bottom, marginBottom) - marginBottom - } - - ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> + ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> + val existingBottomMargin = if (view.getTag(R.id.initial_margin_bottom) != null) { + view.getTag(R.id.initial_margin_bottom) as Int + } else { + view.setTag(R.id.initial_margin_bottom, marginBottom) + marginBottom + } val lp = layoutParams as MarginLayoutParams @@ -188,11 +187,8 @@ fun View.handleKeyboardInsets() { layoutParams = lp - insets + WindowInsetsCompat.CONSUMED } - - ViewCompat.requestApplyInsets(this) - } /** From c09365737f41d102925ae512eff7f3a96cc2073f Mon Sep 17 00:00:00 2001 From: Ritika Pahwa Date: Wed, 22 Oct 2025 13:44:34 +0530 Subject: [PATCH 3/3] Refactor handleKeyboardInsets() --- .../main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt index 973884164..04007485d 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt +++ b/app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt @@ -170,8 +170,8 @@ fun View.handleKeyboardInsets() { val existingBottomMargin = if (view.getTag(R.id.initial_margin_bottom) != null) { view.getTag(R.id.initial_margin_bottom) as Int } else { - view.setTag(R.id.initial_margin_bottom, marginBottom) - marginBottom + view.setTag(R.id.initial_margin_bottom, view.marginBottom) + view.marginBottom } val lp = layoutParams as MarginLayoutParams