Merge pull request #4378 from kiwix/Fixes#4377

Fixed: `FIND_IN_PAGE` not working after switching to another ZIM file.
This commit is contained in:
Kelson 2025-08-13 11:33:55 +02:00 committed by GitHub
commit b3090a175d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 38 additions and 13 deletions

View File

@ -46,6 +46,7 @@ import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.compose.rememberNavController
import eu.mhutti1.utils.storage.StorageDevice
import eu.mhutti1.utils.storage.StorageDeviceUtils
@ -368,7 +369,8 @@ class KiwixMainActivity : CoreMainActivity() {
searchString = searchString,
isOpenedFromTabView = isOpenedFromTabView,
isVoice = isVoice
)
),
NavOptions.Builder().setPopUpTo(searchFragmentRoute, inclusive = true).build()
)
}

View File

@ -20,14 +20,25 @@ package org.kiwix.kiwixmobile.core.search.viewmodel.effects
import androidx.appcompat.app.AppCompatActivity
import org.kiwix.kiwixmobile.core.base.SideEffect
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.popNavigationBackstack
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setNavigationResult
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setNavigationResultOnCurrent
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.core.main.FIND_IN_PAGE_SEARCH_STRING
data class SearchInPreviousScreen(private val searchString: String) : SideEffect<Unit> {
override fun invokeWith(activity: AppCompatActivity) {
activity.setNavigationResult(searchString, FIND_IN_PAGE_SEARCH_STRING)
activity.popNavigationBackstack()
val coreMainActivity = activity as CoreMainActivity
// Remove current ReaderFragment. Bug Fix #4377
coreMainActivity.navController.popBackStack(
coreMainActivity.readerFragmentRoute,
inclusive = true
)
// Launch fresh ReaderFragment so all the previous arguments will remove.
coreMainActivity.navController.navigate(coreMainActivity.readerFragmentRoute)
// Pass search result to the *new* instance
activity.setNavigationResultOnCurrent(searchString, FIND_IN_PAGE_SEARCH_STRING)
}
companion object {

View File

@ -19,12 +19,13 @@
package org.kiwix.kiwixmobile.core.search.viewmodel.effects
import android.content.Intent
import androidx.navigation.NavHostController
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkConstructor
import io.mockk.verify
import io.mockk.verifyOrder
import org.junit.jupiter.api.Test
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.popNavigationBackstack
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setNavigationResult
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setNavigationResultOnCurrent
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.core.main.FIND_IN_PAGE_SEARCH_STRING
@ -33,11 +34,20 @@ internal class SearchInPreviousScreenTest {
fun `invoke with returns positive result with string to previous screen`() {
val searchString = "search"
mockkConstructor(Intent::class)
val activity = mockk<CoreMainActivity>(relaxed = true)
// Mock the activity & navController
val mockNavController = mockk<NavHostController>(relaxed = true)
val activity = mockk<CoreMainActivity>(relaxed = true) {
every { readerFragmentRoute } returns "readerRoute"
every { navController } returns mockNavController
}
SearchInPreviousScreen(searchString).invokeWith(activity)
verify {
activity.setNavigationResult(searchString, FIND_IN_PAGE_SEARCH_STRING)
activity.popNavigationBackstack()
verifyOrder {
mockNavController.popBackStack("readerRoute", true)
mockNavController.navigate("readerRoute")
activity.setNavigationResultOnCurrent(searchString, FIND_IN_PAGE_SEARCH_STRING)
}
}
}

View File

@ -29,6 +29,7 @@ import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.core.net.toUri
import androidx.navigation.NavOptions
import androidx.navigation.compose.rememberNavController
import org.kiwix.kiwixmobile.core.CoreApp
import org.kiwix.kiwixmobile.core.R.drawable
@ -182,7 +183,8 @@ class CustomMainActivity : CoreMainActivity() {
searchString = searchString,
isOpenedFromTabView = isOpenedFromTabView,
isVoice = isVoice
)
),
NavOptions.Builder().setPopUpTo(searchFragmentRoute, inclusive = true).build()
)
}