Merge pull request #4117 from kiwix/Fixes#4112

Fixed: Virtual keyboard reset the search (in library).
This commit is contained in:
Kelson 2024-11-28 20:43:02 +01:00 committed by GitHub
commit 116180e6f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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,9 +328,12 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions {
} }
override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super { override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super {
getActivity()?.finish() if (isKeyboardVisible()) {
closeKeyboard()
return FragmentActivityExtensions.Super.ShouldNotCall return FragmentActivityExtensions.Super.ShouldNotCall
} }
return FragmentActivityExtensions.Super.ShouldCall
}
private fun onRefreshStateChange(isRefreshing: Boolean?) { private fun onRefreshStateChange(isRefreshing: Boolean?) {
var refreshing = isRefreshing == true var refreshing = isRefreshing == true

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,16 +281,25 @@ 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() {
onBackPressedDispatcher.addCallback(this, onBackPressedCallBack)
}
private val onBackPressedCallBack =
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (navigationDrawerIsOpen()) { if (navigationDrawerIsOpen()) {
closeNavigationDrawer() closeNavigationDrawer()
return return
} }
if (activeFragments().filterIsInstance<FragmentActivityExtensions>().isEmpty()) { if (activeFragments().filterIsInstance<FragmentActivityExtensions>().isEmpty()) {
return super.onBackPressedDispatcher.onBackPressed() isEnabled = false
return onBackPressedDispatcher.onBackPressed().also {
isEnabled = true
}
} }
activeFragments().filterIsInstance<FragmentActivityExtensions>().forEach { activeFragments().filterIsInstance<FragmentActivityExtensions>().forEach {
if (it.onBackPressed(this) == FragmentActivityExtensions.Super.ShouldCall) { if (it.onBackPressed(this@CoreMainActivity) == ShouldCall) {
if (navController.currentDestination?.id?.equals(readerFragmentResId) == true && if (navController.currentDestination?.id?.equals(readerFragmentResId) == true &&
navController.previousBackStackEntry?.destination navController.previousBackStackEntry?.destination
?.id?.equals(searchFragmentResId) == false ?.id?.equals(searchFragmentResId) == false
@ -294,7 +307,10 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
drawerToggle = null drawerToggle = null
finish() finish()
} else { } else {
super.onBackPressedDispatcher.onBackPressed() isEnabled = false
onBackPressedDispatcher.onBackPressed()
isEnabled = true
}
} }
} }
} }