Fixed: Virtual keyboard resetting the search in the library.

* The issue was with android 14 device, it is working fine in below devices.
* Improved the back press handling in CoreMainActivity using the latest onBackPressedDispatcher API, ensuring proper functionality on Android 14 and above.
* Enhanced the back press behavior in OnlineLibraryFragment while searching for ZIM files, so the SearchView does not close immediately when the user presses the back button to simply dismiss the keyboard.
This commit is contained in:
MohitMaliFtechiz 2024-11-28 23:02:43 +05:30
parent 2cd2e15365
commit 2912bc92a2
4 changed files with 48 additions and 22 deletions

View File

@ -68,6 +68,7 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.requestNotificat
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel
import org.kiwix.kiwixmobile.core.extensions.closeKeyboard import org.kiwix.kiwixmobile.core.extensions.closeKeyboard
import org.kiwix.kiwixmobile.core.extensions.coreMainActivity import org.kiwix.kiwixmobile.core.extensions.coreMainActivity
import org.kiwix.kiwixmobile.core.extensions.isKeyboardVisible
import org.kiwix.kiwixmobile.core.extensions.setBottomMarginToFragmentContainerView import org.kiwix.kiwixmobile.core.extensions.setBottomMarginToFragmentContainerView
import org.kiwix.kiwixmobile.core.extensions.setUpSearchView import org.kiwix.kiwixmobile.core.extensions.setUpSearchView
import org.kiwix.kiwixmobile.core.extensions.snack import org.kiwix.kiwixmobile.core.extensions.snack
@ -327,8 +328,11 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions {
} }
override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super { override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super {
getActivity()?.finish() if (isKeyboardVisible()) {
return FragmentActivityExtensions.Super.ShouldNotCall closeKeyboard()
return FragmentActivityExtensions.Super.ShouldNotCall
}
return FragmentActivityExtensions.Super.ShouldCall
} }
private fun onRefreshStateChange(isRefreshing: Boolean?) { private fun onRefreshStateChange(isRefreshing: Boolean?) {

View File

@ -55,7 +55,6 @@
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:dataExtractionRules = "@xml/data_extraction_rules" android:dataExtractionRules = "@xml/data_extraction_rules"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:enableOnBackInvokedCallback="true"
android:largeHeap="true" android:largeHeap="true"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
android:resizeableActivity="true" android:resizeableActivity="true"

View File

@ -22,6 +22,8 @@ import android.content.Context
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.Toast import android.widget.Toast
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@ -36,6 +38,11 @@ fun Fragment.toast(stringId: Int, length: Int = Toast.LENGTH_LONG) {
requireActivity().toast(stringId, length) requireActivity().toast(stringId, length)
} }
fun Fragment.isKeyboardVisible(): Boolean {
val insets = ViewCompat.getRootWindowInsets(requireView()) ?: return false
return insets.isVisible(WindowInsetsCompat.Type.ime())
}
fun Fragment.closeKeyboard() { fun Fragment.closeKeyboard() {
val inputMethodManager = val inputMethodManager =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

View File

@ -24,6 +24,7 @@ import android.os.Process
import android.view.ActionMode import android.view.ActionMode
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
@ -47,6 +48,7 @@ import org.kiwix.kiwixmobile.core.CoreApp
import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.base.BaseActivity import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions.Super.ShouldCall
import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToLibkiwixMigrator import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToLibkiwixMigrator
import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator import org.kiwix.kiwixmobile.core.data.remote.ObjectBoxToRoomMigrator
import org.kiwix.kiwixmobile.core.di.components.CoreActivityComponent import org.kiwix.kiwixmobile.core.di.components.CoreActivityComponent
@ -132,6 +134,7 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
} }
downloadManagerBroadcastReceiver.let(::registerReceiver) downloadManagerBroadcastReceiver.let(::registerReceiver)
createApplicationShortcuts() createApplicationShortcuts()
handleBackPressed()
} }
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@ -149,6 +152,7 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
} }
override fun onDestroy() { override fun onDestroy() {
onBackPressedCallBack.remove()
downloadManagerBroadcastReceiver.let(::unregisterReceiver) downloadManagerBroadcastReceiver.let(::unregisterReceiver)
super.onDestroy() super.onDestroy()
} }
@ -277,28 +281,40 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
externalLinkOpener.openExternalUrl(KIWIX_SUPPORT_URL.toUri().browserIntent()) externalLinkOpener.openExternalUrl(KIWIX_SUPPORT_URL.toUri().browserIntent())
} }
override fun onBackPressed() { private fun handleBackPressed() {
if (navigationDrawerIsOpen()) { onBackPressedDispatcher.addCallback(this, onBackPressedCallBack)
closeNavigationDrawer() }
return
} private val onBackPressedCallBack =
if (activeFragments().filterIsInstance<FragmentActivityExtensions>().isEmpty()) { object : OnBackPressedCallback(true) {
return super.onBackPressedDispatcher.onBackPressed() override fun handleOnBackPressed() {
} if (navigationDrawerIsOpen()) {
activeFragments().filterIsInstance<FragmentActivityExtensions>().forEach { closeNavigationDrawer()
if (it.onBackPressed(this) == FragmentActivityExtensions.Super.ShouldCall) { return
if (navController.currentDestination?.id?.equals(readerFragmentResId) == true && }
navController.previousBackStackEntry?.destination if (activeFragments().filterIsInstance<FragmentActivityExtensions>().isEmpty()) {
?.id?.equals(searchFragmentResId) == false isEnabled = false
) { return onBackPressedDispatcher.onBackPressed().also {
drawerToggle = null isEnabled = true
finish() }
} else { }
super.onBackPressedDispatcher.onBackPressed() activeFragments().filterIsInstance<FragmentActivityExtensions>().forEach {
if (it.onBackPressed(this@CoreMainActivity) == ShouldCall) {
if (navController.currentDestination?.id?.equals(readerFragmentResId) == true &&
navController.previousBackStackEntry?.destination
?.id?.equals(searchFragmentResId) == false
) {
drawerToggle = null
finish()
} else {
isEnabled = false
onBackPressedDispatcher.onBackPressed()
isEnabled = true
}
}
} }
} }
} }
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {