diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt index 7f3234c9a..c9618433c 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt @@ -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() ) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreen.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreen.kt index a90dd1104..f8bd7b1a6 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreen.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreen.kt @@ -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 { 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 { diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreenTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreenTest.kt index baedf1344..70e88d82c 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreenTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchInPreviousScreenTest.kt @@ -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(relaxed = true) + + // Mock the activity & navController + val mockNavController = mockk(relaxed = true) + val activity = mockk(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) } } } diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomMainActivity.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomMainActivity.kt index f4287235b..829d0a912 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomMainActivity.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomMainActivity.kt @@ -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() ) }