From 730f314200a9a4b80b15826c37d2ed96795088c9 Mon Sep 17 00:00:00 2001 From: Jason-Whitmore Date: Thu, 4 Sep 2025 23:36:47 -0700 Subject: [PATCH 1/4] Fixes Issue #6384: java.lang.NullPointerException in ReviewActivity (#6394) * activity_review.xml: add new GUI elements to replace old ones Before this commit, the info icon shared the same GUI element with the "Skip this image" text. This made the Kotlin code to handle taps on the info icon difficult to write, and would crash with a NPE when the user used a language that is read right to left and the info icon was pressed. This commit creates new GUI elements. Notably, the info icon has it's own element. A LinearLayout is used to place the skip button and the info icon button together. Kotlin code can now be simplified and the NPE bug can be fixed. * ReviewActivity.kt: simplify info icon code to work with some languages Before this commit, if the language was set to a language that is read right to left, pressing the info icon would crash the app with a NPE. This was because the Kotlin code assumed that the icon would always be on the right of the skip button (index 2 in the drawable array). When a right to left language was used, the icon would be on the left and index 2 would be null. This commit builds upon prior GUI changes. The info icon now has its own button. Kotlin changes now remove the use of the drawable array to find the info icon and instead directly references the new info icon button. The info icon button now works properly for both left-to-right and right-to-left languages while maintaining correct positioning. * activity_review.xml: fix xml to be more readable This commit moves around some lines in the XML to make it more readable. * activity_review.xml: change button configuration This change simplifies the button configuration XML and makes the info icon button slightly smaller --------- Co-authored-by: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Co-authored-by: Nicolas Raoul --- .../free/nrw/commons/review/ReviewActivity.kt | 6 +-- app/src/main/res/layout/activity_review.xml | 43 ++++++++++++------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt b/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt index 42a75aeac..1d26eacae 100644 --- a/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.kt @@ -109,10 +109,8 @@ class ReviewActivity : BaseActivity() { setUpMediaDetailFragment() } - binding.skipImage.setOnTouchListener { _, event -> - if (event.action == MotionEvent.ACTION_UP && - event.rawX >= (binding.skipImage.right - binding.skipImage.compoundDrawables[2].bounds.width()) - ) { + binding.skipImageInfo?.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_UP) { showSkipImageInfo() true } else { diff --git a/app/src/main/res/layout/activity_review.xml b/app/src/main/res/layout/activity_review.xml index 871d25c7d..2075fb888 100644 --- a/app/src/main/res/layout/activity_review.xml +++ b/app/src/main/res/layout/activity_review.xml @@ -24,22 +24,35 @@ android:id="@+id/toolbarBinding" layout="@layout/toolbar" /> - - + android:orientation="horizontal" + android:gravity="center"> + + + + + + Date: Sun, 7 Sep 2025 00:35:47 +0530 Subject: [PATCH 2/4] Fix: enable H/W acceleration for UploadActivity to resolve keyboard not showing on Upload Screen (#6418) * fix: enable h/w acceleration for UploadActivity to resolve ime issue * fix(upload): handle keyboard insets for bottom buttons at Depicts step * fix(upload): handle keyboard insets for buttons at select category step * fix(upload): hide keyboard before navigating to Media License screen This solves keyboard opened at the License screen issue, if we proceed by pressing next at the Upload Categories screen when the keyboard is opened --- app/src/main/AndroidManifest.xml | 1 - .../free/nrw/commons/upload/UploadActivity.kt | 14 +++++ .../categories/UploadCategoriesFragment.kt | 2 + .../commons/upload/depicts/DepictsFragment.kt | 2 + .../res/layout/upload_categories_fragment.xml | 5 +- .../res/layout/upload_depicts_fragment.xml | 57 +++++++++---------- app/src/main/res/values/dimens.xml | 3 + 7 files changed, 51 insertions(+), 33 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d56a874b5..e8215bd90 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -101,7 +101,6 @@ android:name=".upload.UploadActivity" android:configChanges="orientation|screenSize|keyboard" android:exported="true" - android:hardwareAccelerated="false" android:icon="@mipmap/ic_launcher" android:windowSoftInputMode="adjustResize"> diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 74597bc14..c2bed5fff 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -13,6 +13,7 @@ import android.os.Build.VERSION_CODES import android.os.Bundle import android.provider.Settings import android.view.View +import android.view.inputmethod.InputMethodManager import android.widget.CheckBox import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog @@ -805,6 +806,19 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onNextButtonClicked(index: Int) { if (index < fragments!!.size - 1) { + // Hide the keyboard before navigating to Media License screen + val isUploadCategoriesFragment = fragments!!.getOrNull(index)?.let { + it is UploadCategoriesFragment + } ?: false + if (isUploadCategoriesFragment) { + val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager + currentFocus?.let { focusedView -> + inputMethodManager.hideSoftInputFromWindow( + focusedView.windowToken, + InputMethodManager.HIDE_NOT_ALWAYS + ) + } + } binding.vpUpload.setCurrentItem(index + 1, false) fragments!![index + 1].onBecameVisible() (binding.rvThumbnails.layoutManager as LinearLayoutManager) 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 262013045..798ab74fe 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 @@ -26,6 +26,7 @@ import fr.free.nrw.commons.media.MediaDetailFragment import fr.free.nrw.commons.upload.UploadActivity import fr.free.nrw.commons.upload.UploadBaseFragment import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog +import fr.free.nrw.commons.utils.handleKeyboardInsets import fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY import io.reactivex.Notification import io.reactivex.android.schedulers.AndroidSchedulers @@ -69,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 39bcabb46..484750410 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 @@ -27,6 +27,7 @@ import fr.free.nrw.commons.upload.UploadActivity import fr.free.nrw.commons.upload.UploadBaseFragment import fr.free.nrw.commons.upload.structure.depictions.DepictedItem import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog +import fr.free.nrw.commons.utils.handleKeyboardInsets import fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE import io.reactivex.Notification import io.reactivex.android.schedulers.AndroidSchedulers @@ -69,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/res/layout/upload_categories_fragment.xml b/app/src/main/res/layout/upload_categories_fragment.xml index fb70f39a1..6ded4af87 100644 --- a/app/src/main/res/layout/upload_categories_fragment.xml +++ b/app/src/main/res/layout/upload_categories_fragment.xml @@ -5,13 +5,13 @@ android:id="@+id/rl_container_categories" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="@dimen/standard_gap" android:background="?attr/mainBackground" > diff --git a/app/src/main/res/layout/upload_depicts_fragment.xml b/app/src/main/res/layout/upload_depicts_fragment.xml index 9fa621396..a1b85666c 100644 --- a/app/src/main/res/layout/upload_depicts_fragment.xml +++ b/app/src/main/res/layout/upload_depicts_fragment.xml @@ -124,38 +124,35 @@ + android:id="@+id/button_divider" + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_above="@+id/navigation_buttons_container" + android:background="@color/divider_grey" /> -