From 39e35941550d449b7bda7ab561c3acaf6c63d5e4 Mon Sep 17 00:00:00 2001 From: Pawloland <59684145+Pawloland@users.noreply.github.com> Date: Tue, 26 May 2026 16:54:55 +0200 Subject: [PATCH] Fix search crash on API 32 and older Signed-off-by: Pawloland <59684145+Pawloland@users.noreply.github.com> --- .../com/tailscale/ipn/ui/view/MainView.kt | 4 +--- .../com/tailscale/ipn/ui/view/SearchView.kt | 19 +++---------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/ui/view/MainView.kt b/android/src/main/java/com/tailscale/ipn/ui/view/MainView.kt index d2701e46a8..ac0b97faa7 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/view/MainView.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/view/MainView.kt @@ -562,10 +562,8 @@ fun PeerList( var isListFocussed by remember { mutableStateOf(false) } val expandedPeer = viewModel.expandedMenuPeer.collectAsState() val localClipboardManager = LocalClipboardManager.current - // Restrict search to devices running API 33+ (see https://github.com/tailscale/corp/issues/27375) - val enableSearch = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU Column(modifier = Modifier.fillMaxSize()) { - if (enableSearch && FeatureFlags.isEnabled("enable_new_search")) { + if (FeatureFlags.isEnabled("enable_new_search")) { Search(onSearchBarClick) } else { if (!isAndroidTV()) { diff --git a/android/src/main/java/com/tailscale/ipn/ui/view/SearchView.kt b/android/src/main/java/com/tailscale/ipn/ui/view/SearchView.kt index 3cc69fbc0b..bf10c44cc9 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/view/SearchView.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/view/SearchView.kt @@ -3,11 +3,7 @@ package com.tailscale.ipn.ui.view -import android.app.Activity -import android.os.Build -import android.window.OnBackInvokedCallback -import android.window.OnBackInvokedDispatcher -import androidx.annotation.RequiresApi +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.isSystemInDarkTheme @@ -33,7 +29,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SearchBar import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -45,7 +40,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.platform.LocalContext + import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource @@ -60,7 +55,6 @@ import com.tailscale.ipn.ui.util.Lists import com.tailscale.ipn.ui.viewModel.MainViewModel import kotlinx.coroutines.delay -@RequiresApi(Build.VERSION_CODES.TIRAMISU) @OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchView( @@ -80,7 +74,6 @@ fun SearchView( val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current var expanded by rememberSaveable { mutableStateOf(true) } - val context = LocalContext.current as Activity val listState = rememberLazyListState() val noResultsBackground = @@ -90,19 +83,13 @@ fun SearchView( MaterialTheme.colorScheme.surfaceContainer // color for light mode } - val callback = OnBackInvokedCallback { + BackHandler { focusManager.clearFocus(force = true) keyboardController?.hide() onNavigateBack() viewModel.updateSearchTerm("") } - DisposableEffect(Unit) { - val dispatcher = context.onBackInvokedDispatcher - dispatcher?.registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_DEFAULT, callback) - onDispose { dispatcher?.unregisterOnBackInvokedCallback(callback) } - } - LaunchedEffect(searchTerm, filteredPeers) { if (searchTerm.isEmpty() && filteredPeers.isNotEmpty()) { delay(100) // Give Compose time to update list