Navigate forward not working when capture back-presses is false
prawnguy opened this issue · 0 comments
prawnguy commented
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)
)
}
}