@@ -14,13 +14,17 @@ import android.content.res.Configuration.SCREENLAYOUT_SIZE_LARGE
1414import android.content.res.Configuration.SCREENLAYOUT_SIZE_MASK
1515import android.net.ConnectivityManager
1616import android.net.NetworkCapabilities
17+ import android.os.Build
1718import android.os.Bundle
1819import android.provider.Settings
20+ import android.util.Log
1921import androidx.activity.ComponentActivity
2022import androidx.activity.compose.setContent
2123import androidx.activity.result.ActivityResultLauncher
2224import androidx.activity.result.contract.ActivityResultContract
25+ import androidx.annotation.RequiresApi
2326import androidx.browser.customtabs.CustomTabsIntent
27+ import androidx.compose.animation.core.LinearOutSlowInEasing
2428import androidx.compose.animation.core.tween
2529import androidx.compose.animation.fadeIn
2630import androidx.compose.animation.fadeOut
@@ -111,6 +115,7 @@ class MainActivity : ComponentActivity() {
111115 // simply opening the URL. This should be consumed once it has been handled.
112116 private val loginQRCode: StateFlow <String ?> = MutableStateFlow (null )
113117
118+ @RequiresApi(Build .VERSION_CODES .TIRAMISU )
114119 @SuppressLint(" SourceLockedOrientationActivity" )
115120 override fun onCreate (savedInstanceState : Bundle ? ) {
116121 super .onCreate(savedInstanceState)
@@ -146,24 +151,37 @@ class MainActivity : ComponentActivity() {
146151 viewModel.setVpnPermissionLauncher(vpnPermissionLauncher)
147152
148153 setContent {
154+ navController = rememberNavController()
155+
149156 AppTheme {
150- navController = rememberNavController()
151157 Surface (color = MaterialTheme .colorScheme.inverseSurface) { // Background for the letterbox
152158 Surface (modifier = Modifier .universalFit()) { // Letterbox for AndroidTV
153159 NavHost (
154160 navController = navController,
155161 startDestination = " main" ,
156162 enterTransition = {
157- slideInHorizontally(animationSpec = tween(150 ), initialOffsetX = { it })
163+ slideInHorizontally(
164+ animationSpec = tween(250 , easing = LinearOutSlowInEasing ),
165+ initialOffsetX = { it }) +
166+ fadeIn(animationSpec = tween(500 , easing = LinearOutSlowInEasing ))
158167 },
159168 exitTransition = {
160- slideOutHorizontally(animationSpec = tween(150 ), targetOffsetX = { - it })
169+ slideOutHorizontally(
170+ animationSpec = tween(250 , easing = LinearOutSlowInEasing ),
171+ targetOffsetX = { - it }) +
172+ fadeOut(animationSpec = tween(500 , easing = LinearOutSlowInEasing ))
161173 },
162174 popEnterTransition = {
163- slideInHorizontally(animationSpec = tween(150 ), initialOffsetX = { - it })
175+ slideInHorizontally(
176+ animationSpec = tween(250 , easing = LinearOutSlowInEasing ),
177+ initialOffsetX = { - it }) +
178+ fadeIn(animationSpec = tween(500 , easing = LinearOutSlowInEasing ))
164179 },
165180 popExitTransition = {
166- slideOutHorizontally(animationSpec = tween(150 ), targetOffsetX = { it })
181+ slideOutHorizontally(
182+ animationSpec = tween(250 , easing = LinearOutSlowInEasing ),
183+ targetOffsetX = { it }) +
184+ fadeOut(animationSpec = tween(500 , easing = LinearOutSlowInEasing ))
167185 }) {
168186 fun backTo (route : String ): () -> Unit = {
169187 navController.popBackStack(route = route, inclusive = false )
@@ -177,7 +195,10 @@ class MainActivity : ComponentActivity() {
177195 },
178196 onNavigateToExitNodes = { navController.navigate(" exitNodes" ) },
179197 onNavigateToHealth = { navController.navigate(" health" ) },
180- onNavigateToSearch = { navController.navigate(" search" ) })
198+ onNavigateToSearch = {
199+ viewModel.enableSearchAutoFocus()
200+ navController.navigate(" search" )
201+ })
181202
182203 val settingsNav =
183204 SettingsNav (
@@ -186,7 +207,7 @@ class MainActivity : ComponentActivity() {
186207 onNavigateToDNSSettings = { navController.navigate(" dnsSettings" ) },
187208 onNavigateToSplitTunneling = { navController.navigate(" splitTunneling" ) },
188209 onNavigateToTailnetLock = { navController.navigate(" tailnetLock" ) },
189- onNavigateToSubnetRouting = { navController.navigate(" subnetRouting" )},
210+ onNavigateToSubnetRouting = { navController.navigate(" subnetRouting" ) },
190211 onNavigateToMDMSettings = { navController.navigate(" mdmSettings" ) },
191212 onNavigateToManagedBy = { navController.navigate(" managedBy" ) },
192213 onNavigateToUserSwitcher = { navController.navigate(" userSwitcher" ) },
@@ -219,11 +240,14 @@ class MainActivity : ComponentActivity() {
219240 MainView (loginAtUrl = ::login, navigation = mainViewNav, viewModel = viewModel)
220241 }
221242 composable(" search" ) {
243+ val autoFocus = viewModel.autoFocusSearch
222244 SearchView (
223245 viewModel = viewModel,
224246 navController = navController,
225- onNavigateBack = { navController.popBackStack() })
226- }
247+ onNavigateBack = { navController.popBackStack() },
248+ autoFocus = autoFocus
249+ )
250+ }
227251 composable(" settings" ) { SettingsView (settingsNav) }
228252 composable(" exitNodes" ) { ExitNodePicker (exitNodePickerNav) }
229253 composable(" health" ) { HealthView (backTo(" main" )) }
0 commit comments