Skip to content

Commit bab9c86

Browse files
committed
fix: check that a URL can be opened and show a toast if not
1 parent 362f63d commit bab9c86

File tree

7 files changed

+40
-7
lines changed

7 files changed

+40
-7
lines changed

app/src/main/java/io/github/sds100/keymapper/actions/ActionOptionsBottomSheet.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import androidx.compose.runtime.Composable
3030
import androidx.compose.runtime.rememberCoroutineScope
3131
import androidx.compose.ui.Alignment
3232
import androidx.compose.ui.Modifier
33+
import androidx.compose.ui.platform.LocalContext
3334
import androidx.compose.ui.platform.LocalDensity
3435
import androidx.compose.ui.platform.LocalUriHandler
3536
import androidx.compose.ui.res.stringResource
@@ -44,6 +45,7 @@ import io.github.sds100.keymapper.util.ui.SliderStepSizes
4445
import io.github.sds100.keymapper.util.ui.compose.CheckBoxText
4546
import io.github.sds100.keymapper.util.ui.compose.RadioButtonText
4647
import io.github.sds100.keymapper.util.ui.compose.SliderOptionText
48+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
4749
import kotlinx.coroutines.launch
4850

4951
@OptIn(ExperimentalMaterial3Api::class)
@@ -63,6 +65,7 @@ fun ActionOptionsBottomSheet(
6365
dragHandle = {},
6466
) {
6567
val uriHandler = LocalUriHandler.current
68+
val ctx = LocalContext.current
6669
val helpUrl = stringResource(R.string.url_keymap_action_options_guide)
6770
val scope = rememberCoroutineScope()
6871

@@ -80,7 +83,7 @@ fun ActionOptionsBottomSheet(
8083
modifier = Modifier
8184
.align(Alignment.TopEnd)
8285
.padding(horizontal = 8.dp),
83-
onClick = { uriHandler.openUri(helpUrl) },
86+
onClick = { uriHandler.openUriSafe(ctx, helpUrl) },
8487
) {
8588
Icon(
8689
imageVector = Icons.AutoMirrored.Rounded.HelpOutline,

app/src/main/java/io/github/sds100/keymapper/home/HomeKeyMapListScreen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import io.github.sds100.keymapper.util.drawable
6868
import io.github.sds100.keymapper.util.ui.compose.CollapsableFloatingActionButton
6969
import io.github.sds100.keymapper.util.ui.compose.ComposeChipModel
7070
import io.github.sds100.keymapper.util.ui.compose.ComposeIconInfo
71+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
7172

7273
@OptIn(ExperimentalMaterial3Api::class)
7374
@Composable
@@ -140,6 +141,7 @@ fun HomeKeyMapListScreen(
140141

141142
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
142143
val uriHandler = LocalUriHandler.current
144+
val ctx = LocalContext.current
143145
val helpUrl = stringResource(R.string.url_quick_start_guide)
144146

145147
var keyMapListBottomPadding by remember { mutableStateOf(100.dp) }
@@ -183,7 +185,7 @@ fun HomeKeyMapListScreen(
183185
onSettingsClick = onSettingsClick,
184186
onAboutClick = onAboutClick,
185187
onSortClick = { viewModel.showSortBottomSheet = true },
186-
onHelpClick = { uriHandler.openUri(helpUrl) },
188+
onHelpClick = { uriHandler.openUriSafe(ctx, helpUrl) },
187189
onExportClick = viewModel::onExportClick,
188190
onImportClick = { importFileLauncher.launch(FileUtils.MIME_TYPE_ALL) },
189191
onTogglePausedClick = viewModel::onTogglePausedClick,

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/ConfigKeyMapScreen.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
4646
import androidx.compose.runtime.setValue
4747
import androidx.compose.ui.Alignment
4848
import androidx.compose.ui.Modifier
49+
import androidx.compose.ui.platform.LocalContext
4950
import androidx.compose.ui.platform.LocalUriHandler
5051
import androidx.compose.ui.res.stringResource
5152
import androidx.compose.ui.tooling.preview.Devices
@@ -58,6 +59,7 @@ import io.github.sds100.keymapper.actions.ActionsScreen
5859
import io.github.sds100.keymapper.compose.KeyMapperTheme
5960
import io.github.sds100.keymapper.constraints.ConstraintsScreen
6061
import io.github.sds100.keymapper.mappings.keymaps.trigger.TriggerScreen
62+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
6163
import kotlinx.coroutines.launch
6264

6365
@Composable
@@ -141,6 +143,7 @@ private fun ConfigKeyMapScreen(
141143

142144
var currentTab: ConfigKeyMapTab? by remember { mutableStateOf(null) }
143145
val uriHandler = LocalUriHandler.current
146+
val ctx = LocalContext.current
144147

145148
BackHandler(onBack = onBackClick)
146149

@@ -167,7 +170,7 @@ private fun ConfigKeyMapScreen(
167170
}
168171

169172
if (url.isNotEmpty()) {
170-
uriHandler.openUri(url)
173+
uriHandler.openUriSafe(ctx, url)
171174
}
172175
},
173176
)
@@ -505,6 +508,7 @@ private fun ScreenCard(
505508
screen: @Composable () -> Unit,
506509
) {
507510
val uriHandler = LocalUriHandler.current
511+
val ctx = LocalContext.current
508512

509513
OutlinedCard(modifier = modifier) {
510514
Column {
@@ -520,7 +524,7 @@ private fun ScreenCard(
520524
color = MaterialTheme.colorScheme.primary,
521525
)
522526

523-
IconButton(onClick = { uriHandler.openUri(helpUrl) }) {
527+
IconButton(onClick = { uriHandler.openUriSafe(ctx, helpUrl) }) {
524528
Icon(
525529
Icons.AutoMirrored.Rounded.HelpOutline,
526530
contentDescription = stringResource(R.string.button_help),

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/KeyMapOptionsScreen.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import androidx.compose.ui.Modifier
3434
import androidx.compose.ui.graphics.Color
3535
import androidx.compose.ui.platform.ClipEntry
3636
import androidx.compose.ui.platform.LocalClipboard
37+
import androidx.compose.ui.platform.LocalContext
3738
import androidx.compose.ui.platform.LocalUriHandler
3839
import androidx.compose.ui.res.stringResource
3940
import androidx.compose.ui.text.style.TextOverflow
@@ -48,6 +49,7 @@ import io.github.sds100.keymapper.util.ui.SliderMinimums
4849
import io.github.sds100.keymapper.util.ui.SliderStepSizes
4950
import io.github.sds100.keymapper.util.ui.compose.CheckBoxText
5051
import io.github.sds100.keymapper.util.ui.compose.SliderOptionText
52+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
5153
import kotlinx.coroutines.launch
5254

5355
@Composable
@@ -323,14 +325,15 @@ private fun TriggerFromOtherAppsSection(
323325
}
324326

325327
val uriHandler = LocalUriHandler.current
328+
val ctx = LocalContext.current
326329
val intentGuideUrl = stringResource(R.string.url_trigger_by_intent_guide)
327330

328331
FilledTonalButton(
329332
modifier = Modifier
330333
.fillMaxWidth()
331334
.padding(horizontal = 16.dp),
332335
onClick = {
333-
uriHandler.openUri(intentGuideUrl)
336+
uriHandler.openUriSafe(ctx, intentGuideUrl)
334337
},
335338
) {
336339
Text(text = stringResource(R.string.button_open_trigger_keymap_from_intent_guide))

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/trigger/SetupGuiKeyboardBottomSheet.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.compose.runtime.getValue
2424
import androidx.compose.runtime.rememberCoroutineScope
2525
import androidx.compose.ui.Alignment
2626
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.platform.LocalContext
2728
import androidx.compose.ui.platform.LocalDensity
2829
import androidx.compose.ui.platform.LocalUriHandler
2930
import androidx.compose.ui.res.stringResource
@@ -34,6 +35,7 @@ import androidx.compose.ui.unit.dp
3435
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3536
import io.github.sds100.keymapper.R
3637
import io.github.sds100.keymapper.compose.KeyMapperTheme
38+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
3739
import kotlinx.coroutines.launch
3840

3941
@OptIn(ExperimentalMaterial3Api::class)
@@ -101,6 +103,7 @@ private fun SetupGuiKeyboardBottomSheet(
101103
) {
102104
val scope = rememberCoroutineScope()
103105
val uriHandler = LocalUriHandler.current
106+
val ctx = LocalContext.current
104107
val scrollState = rememberScrollState()
105108

106109
ModalBottomSheet(
@@ -145,7 +148,7 @@ private fun SetupGuiKeyboardBottomSheet(
145148
buttonTextEnabled = stringResource(R.string.setup_gui_keyboard_install_keyboard_button),
146149
buttonTextDisabled = stringResource(R.string.setup_gui_keyboard_install_keyboard_button_disabled),
147150
onButtonClick = {
148-
uriHandler.openUri(guiKeyboardUrl)
151+
uriHandler.openUriSafe(ctx, guiKeyboardUrl)
149152
},
150153
)
151154

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/trigger/TriggerKeyOptionsBottomSheet.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.compose.runtime.Composable
2727
import androidx.compose.runtime.rememberCoroutineScope
2828
import androidx.compose.ui.Alignment
2929
import androidx.compose.ui.Modifier
30+
import androidx.compose.ui.platform.LocalContext
3031
import androidx.compose.ui.platform.LocalDensity
3132
import androidx.compose.ui.platform.LocalUriHandler
3233
import androidx.compose.ui.res.stringResource
@@ -40,6 +41,7 @@ import io.github.sds100.keymapper.mappings.FingerprintGestureType
4041
import io.github.sds100.keymapper.util.ui.CheckBoxListItem
4142
import io.github.sds100.keymapper.util.ui.compose.CheckBoxText
4243
import io.github.sds100.keymapper.util.ui.compose.RadioButtonText
44+
import io.github.sds100.keymapper.util.ui.compose.openUriSafe
4345
import kotlinx.coroutines.launch
4446

4547
@OptIn(ExperimentalMaterial3Api::class)
@@ -65,6 +67,7 @@ fun TriggerKeyOptionsBottomSheet(
6567
dragHandle = {},
6668
) {
6769
val uriHandler = LocalUriHandler.current
70+
val ctx = LocalContext.current
6871
val helpUrl = stringResource(R.string.url_trigger_key_options_guide)
6972
val scope = rememberCoroutineScope()
7073

@@ -82,7 +85,7 @@ fun TriggerKeyOptionsBottomSheet(
8285
modifier = Modifier
8386
.align(Alignment.TopEnd)
8487
.padding(horizontal = 8.dp),
85-
onClick = { uriHandler.openUri(helpUrl) },
88+
onClick = { uriHandler.openUriSafe(ctx, helpUrl) },
8689
) {
8790
Icon(
8891
imageVector = Icons.AutoMirrored.Rounded.HelpOutline,
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.github.sds100.keymapper.util.ui.compose
2+
3+
import android.content.Context
4+
import android.widget.Toast
5+
import androidx.compose.ui.platform.UriHandler
6+
import io.github.sds100.keymapper.R
7+
import io.github.sds100.keymapper.util.str
8+
9+
fun UriHandler.openUriSafe(ctx: Context, uri: String) {
10+
try {
11+
openUri(uri)
12+
} catch (e: IllegalArgumentException) {
13+
Toast.makeText(ctx, ctx.str(R.string.error_no_app_to_open_url), Toast.LENGTH_SHORT).show()
14+
}
15+
}

0 commit comments

Comments
 (0)