KevinnZou/compose-webview

Navigate forward not working when capture back-presses is false

prawnguy opened this issue · 0 comments

The navigate forward functionality seems to be broken when capture back presses is disabled.
This is my composable:

@Composable
fun BrowserScreen(
    navController: NavController,
    initialUrl: String,
) {
    val viewModel = hiltViewModel<BrowserViewModel, BrowserViewModel.BrowserViewModelFactory> { factory ->
        factory.create(navController,initialUrl)
    }
    val state by viewModel.state.collectAsState()
    val onEvent = viewModel::onEvent

    val webViewNavigator = rememberWebViewNavigator()
    val webViewState = rememberWebViewState(state.activeUrl)
    val accompanistWebViewClient = remember {
        CustomWebViewClient(
            onActiveUrlChanged = {
                onEvent(BrowserEvent.ActiveUrlChanged(it))
            })
    }
    val focusManager = LocalFocusManager.current

//    BackHandler(enabled = true) {
//        webViewNavigator.navigateBack()
//    }

    Scaffold(
        topBar = {
            Row(
                verticalAlignment = Alignment.CenterVertically,
                horizontalArrangement = Arrangement.End,
                modifier = Modifier
                    .background(MaterialTheme.colorScheme.background)
                    .padding(paddingValues = PaddingValues(horizontal = 5.dp, vertical = 3.dp))
            ) {
                AppBarSearchField(
                    value = state.urlBar,
                    onValueChange = {
                        onEvent(BrowserEvent.UrlBarModified(it))
                    },
                    keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
                    keyboardActions = KeyboardActions(
                        onSearch = {
                            webViewNavigator.loadUrl(state.urlBar)
                            focusManager.clearFocus()
                        }
                    ),
                    modifier = Modifier
                        .widthIn(min = 300.dp)
                        .fillMaxWidth(0.85f)
                )
                Spacer(Modifier.weight(1f))
                IconButton(
                    onClick = {
                        val pageTitle = webViewState.pageTitle
                        val pageIcon = webViewState.pageIcon
                        if (pageTitle != null && pageIcon != null){
                            if(state.bookmarked){
                                onEvent(BrowserEvent.RemoveBookmark)
                            } else {
                                onEvent(BrowserEvent.AddBookmark(pageTitle,pageIcon))
                            }
                        }
                    }
                ) {
                    val iconId = if (state.bookmarked) {R.drawable.baseline_bookmark_remove_24} else {R.drawable.baseline_bookmark_add_24}
                    Icon(painter = painterResource(id = iconId), contentDescription = "Add to bookmarks", modifier = Modifier.size(30.dp))
                }

            }
        },
        bottomBar = {
            Row(
                verticalAlignment = Alignment.CenterVertically,
                horizontalArrangement = Arrangement.End,
                modifier = Modifier
                    .background(MaterialTheme.colorScheme.background)
                    .padding(paddingValues = PaddingValues(horizontal = 5.dp, vertical = 3.dp))
            ) {
                IconButton(
                    onClick = {
                        webViewNavigator.navigateBack()
                    }
                ) {
                    Icon(painter = painterResource(id = R.drawable.baseline_arrow_back_ios_24), contentDescription = "Navigate backward", modifier = Modifier.size(30.dp))
                }
                Spacer(Modifier.weight(0.1f))
                IconButton(
                    onClick = {
                        webViewNavigator.navigateForward()
                    }
                ) {
                    Icon(painter = painterResource(id = R.drawable.baseline_arrow_forward_ios_24), contentDescription = "Navigate forward", modifier = Modifier.size(30.dp))
                }
                Spacer(Modifier.weight(1f))
                IconButton(
                    onClick = {
                        onEvent(BrowserEvent.ShowExitConfirmationPrompt)
                    }
                ) {
                    Icon(painter = painterResource(id = R.drawable.baseline_exit_to_app_24), contentDescription = "Exit browser", modifier = Modifier.size(40.dp))
                }
            }
        }
    ) {
            if (state.showExitConfirmationPrompt) {
                ConfirmationDialog(
                    onDismissRequest = { onEvent(BrowserEvent.DismissExitConfirmationPrompt) },
                    onConfirmation = { onEvent(BrowserEvent.ExitBrowser) },
                    dialogTitle = "Exit browser",
                    dialogText = "Are you sure you want to exit the browser?",
                    confirmText = "Exit",
                    dismissText = "Cancel"
                )
            }
            WebView(
                state = webViewState,
                navigator = webViewNavigator,
                client = accompanistWebViewClient,
                captureBackPresses = true,
                onCreated = { webView ->
                    webView.settings.javaScriptEnabled = true
                    webView.setOnCreateContextMenuListener(View.OnCreateContextMenuListener { menu, v, menuInfo ->
                        val result = (v as WebView).getHitTestResult()

                        val type = result.getType()

                        // Confirm type is an image
                        if (type == HitTestResult.IMAGE_TYPE || type == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                            val imageUrl = result.getExtra()
                            println(imageUrl)
                        }
                    })
                },
                modifier = Modifier
                    .fillMaxSize()
                    .padding(it)
            )
        }
}