Skip to content

Commit fc23c42

Browse files
committed
Fix search behaviour and some code style issues.
1 parent 14ea60a commit fc23c42

File tree

16 files changed

+178
-207
lines changed

16 files changed

+178
-207
lines changed

Diff for: lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/home/HomeScreen.kt

+9-9
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ private fun HomeRow(
160160
val game = games[index]
161161
LemuroidGameCard(
162162
modifier =
163-
Modifier
164-
.widthIn(0.dp, 144.dp)
165-
.animateItemPlacement(),
163+
Modifier
164+
.widthIn(0.dp, 144.dp)
165+
.animateItemPlacement(),
166166
game = game,
167167
onClick = { onGameClicked(game) },
168168
onLongClick = { onGameLongClick(game) },
@@ -181,15 +181,15 @@ private fun HomeNotification(
181181
) {
182182
ElevatedCard(
183183
modifier =
184-
Modifier
185-
.fillMaxWidth()
186-
.padding(start = 16.dp, end = 16.dp),
184+
Modifier
185+
.fillMaxWidth()
186+
.padding(start = 16.dp, end = 16.dp),
187187
) {
188188
Column(
189189
modifier =
190-
Modifier
191-
.fillMaxWidth()
192-
.padding(16.dp),
190+
Modifier
191+
.fillMaxWidth()
192+
.padding(16.dp),
193193
verticalArrangement = Arrangement.spacedBy(16.dp),
194194
) {
195195
Text(

Diff for: lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/home/HomeViewModel.kt

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.lifecycle.ViewModel
99
import androidx.lifecycle.ViewModelProvider
1010
import androidx.lifecycle.viewModelScope
1111
import com.swordfish.lemuroid.app.shared.library.PendingOperationsMonitor
12-
import com.swordfish.lemuroid.app.shared.settings.SettingsInteractor
1312
import com.swordfish.lemuroid.app.shared.settings.StorageFrameworkPickerLauncher
1413
import com.swordfish.lemuroid.lib.library.db.RetrogradeDatabase
1514
import com.swordfish.lemuroid.lib.library.db.entity.Game

Diff for: lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/main/MainActivity.kt

+46-39
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.activity.viewModels
88
import androidx.compose.foundation.layout.fillMaxSize
99
import androidx.compose.foundation.layout.padding
1010
import androidx.compose.material3.AlertDialog
11+
import androidx.compose.material3.ExperimentalMaterial3Api
1112
import androidx.compose.material3.Scaffold
1213
import androidx.compose.runtime.Composable
1314
import androidx.compose.runtime.LaunchedEffect
@@ -117,6 +118,7 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
117118
}
118119
}
119120

121+
@OptIn(ExperimentalMaterial3Api::class)
120122
@Composable
121123
private fun MainScreen(navController: NavHostController) {
122124
AppTheme {
@@ -182,50 +184,55 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
182184
composable(MainRoute.HOME) {
183185
HomeScreen(
184186
modifier = Modifier.padding(padding),
185-
viewModel = viewModel(
186-
factory =
187-
HomeViewModel.Factory(
188-
applicationContext,
189-
retrogradeDb,
187+
viewModel =
188+
viewModel(
189+
factory =
190+
HomeViewModel.Factory(
191+
applicationContext,
192+
retrogradeDb,
193+
),
190194
),
191-
),
192195
onGameClick = onGameClick,
193196
onGameLongClick = onGameLongClick,
194197
)
195198
}
196199
composable(MainRoute.FAVORITES) {
197200
FavoritesScreen(
198201
modifier = Modifier.padding(padding),
199-
viewModel = viewModel(
200-
factory = FavoritesViewModel.Factory(retrogradeDb),
201-
),
202+
viewModel =
203+
viewModel(
204+
factory = FavoritesViewModel.Factory(retrogradeDb),
205+
),
202206
onGameClick = onGameClick,
203207
onGameLongClick = onGameLongClick,
204208
)
205209
}
206210
composable(MainRoute.SEARCH) {
207211
SearchScreen(
208212
modifier = Modifier.padding(padding),
209-
viewModel = viewModel(
210-
factory = SearchViewModel.Factory(retrogradeDb),
211-
),
213+
viewModel =
214+
viewModel(
215+
factory = SearchViewModel.Factory(retrogradeDb),
216+
),
212217
searchQuery = mainUIState.searchQuery,
213218
onGameClick = onGameClick,
214219
onGameLongClick = onGameLongClick,
215220
onGameFavoriteToggle = onGameFavoriteToggle,
221+
onResetSearchQuery = { mainViewModel.changeQueryString("") },
216222
)
217223
}
218224
composable(MainRoute.SYSTEMS) {
219225
MetaSystemsScreen(
220226
modifier = Modifier.padding(padding),
221227
navController = navController,
222-
viewModel = viewModel(
223-
factory =
224-
MetaSystemsViewModel.Factory(
225-
retrogradeDb,
226-
applicationContext,
227-
),
228-
),
228+
viewModel =
229+
viewModel(
230+
factory =
231+
MetaSystemsViewModel.Factory(
232+
retrogradeDb,
233+
applicationContext,
234+
),
235+
),
229236
)
230237
}
231238
composable(MainRoute.SYSTEM_GAMES) { entry ->
@@ -251,16 +258,16 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
251258
viewModel =
252259
viewModel(
253260
factory =
254-
SettingsViewModel.Factory(
255-
applicationContext,
256-
settingsInteractor,
257-
saveSyncManager,
258-
FlowSharedPreferences(
259-
SharedPreferencesHelper.getLegacySharedPreferences(
260-
applicationContext,
261+
SettingsViewModel.Factory(
262+
applicationContext,
263+
settingsInteractor,
264+
saveSyncManager,
265+
FlowSharedPreferences(
266+
SharedPreferencesHelper.getLegacySharedPreferences(
267+
applicationContext,
268+
),
261269
),
262270
),
263-
),
264271
),
265272
navController = navController,
266273
)
@@ -271,10 +278,10 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
271278
viewModel =
272279
viewModel(
273280
factory =
274-
AdvancedSettingsViewModel.Factory(
275-
applicationContext,
276-
settingsInteractor,
277-
),
281+
AdvancedSettingsViewModel.Factory(
282+
applicationContext,
283+
settingsInteractor,
284+
),
278285
),
279286
navController = navController,
280287
)
@@ -294,10 +301,10 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
294301
viewModel =
295302
viewModel(
296303
factory =
297-
CoresSelectionViewModel.Factory(
298-
applicationContext,
299-
coresSelection,
300-
),
304+
CoresSelectionViewModel.Factory(
305+
applicationContext,
306+
coresSelection,
307+
),
301308
),
302309
)
303310
}
@@ -320,10 +327,10 @@ class MainActivity : RetrogradeComponentActivity(), BusyActivity {
320327
viewModel =
321328
viewModel(
322329
factory =
323-
SaveSyncSettingsViewModel.Factory(
324-
application,
325-
saveSyncManager,
326-
),
330+
SaveSyncSettingsViewModel.Factory(
331+
application,
332+
saveSyncManager,
333+
),
327334
),
328335
)
329336
}

Diff for: lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/main/MainNavigationBar.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fun MainNavigationBar(
2222
AnimatedVisibility(
2323
visible = currentRoute?.showBottomNavigation != false,
2424
enter = expandVertically(),
25-
exit = shrinkVertically()
25+
exit = shrinkVertically(),
2626
) {
2727
LemuroidNavigationBar(currentRoute, navController)
2828
}
@@ -31,7 +31,7 @@ fun MainNavigationBar(
3131
@Composable
3232
private fun LemuroidNavigationBar(
3333
currentRoute: MainRoute?,
34-
navController: NavHostController
34+
navController: NavHostController,
3535
) {
3636
NavigationBar(modifier = Modifier.fillMaxWidth()) {
3737
MainNavigationRoutes.values().forEach { destination ->

Diff for: lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/main/MainTopBar.kt

+91-23
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@ package com.swordfish.lemuroid.app.mobile.feature.main
22

33
import android.content.Context
44
import androidx.compose.animation.AnimatedVisibility
5-
import androidx.compose.animation.Crossfade
65
import androidx.compose.animation.fadeIn
76
import androidx.compose.animation.fadeOut
7+
import androidx.compose.foundation.layout.Box
88
import androidx.compose.foundation.layout.Column
99
import androidx.compose.foundation.layout.Row
10+
import androidx.compose.foundation.layout.fillMaxSize
1011
import androidx.compose.foundation.layout.fillMaxWidth
12+
import androidx.compose.foundation.layout.height
13+
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.shape.RoundedCornerShape
15+
import androidx.compose.foundation.text.KeyboardActions
1116
import androidx.compose.material.icons.Icons
1217
import androidx.compose.material.icons.automirrored.filled.ArrowBack
18+
import androidx.compose.material.icons.filled.Search
1319
import androidx.compose.material.icons.outlined.CloudSync
1420
import androidx.compose.material.icons.outlined.Info
1521
import androidx.compose.material.icons.outlined.Settings
@@ -21,13 +27,22 @@ import androidx.compose.material3.LinearProgressIndicator
2127
import androidx.compose.material3.MaterialTheme
2228
import androidx.compose.material3.Surface
2329
import androidx.compose.material3.Text
30+
import androidx.compose.material3.TextField
31+
import androidx.compose.material3.TextFieldDefaults
2432
import androidx.compose.material3.TopAppBar
2533
import androidx.compose.material3.TopAppBarDefaults
2634
import androidx.compose.material3.surfaceColorAtElevation
2735
import androidx.compose.runtime.Composable
36+
import androidx.compose.runtime.LaunchedEffect
37+
import androidx.compose.runtime.remember
2838
import androidx.compose.ui.Modifier
39+
import androidx.compose.ui.focus.FocusRequester
40+
import androidx.compose.ui.focus.focusRequester
41+
import androidx.compose.ui.graphics.Color
2942
import androidx.compose.ui.platform.LocalContext
43+
import androidx.compose.ui.platform.LocalFocusManager
3044
import androidx.compose.ui.res.stringResource
45+
import androidx.compose.ui.unit.dp
3146
import androidx.navigation.NavController
3247
import androidx.navigation.NavHostController
3348
import com.swordfish.lemuroid.R
@@ -42,22 +57,13 @@ fun MainTopBar(
4257
mainUIState: MainViewModel.UiState,
4358
) {
4459
Column {
45-
Surface(tonalElevation = BottomAppBarDefaults.ContainerElevation) {
46-
Crossfade(
47-
targetState = currentRoute,
48-
label = "MainTopBar"
49-
) { route ->
50-
when (route) {
51-
MainRoute.SEARCH -> SearchTopBar(
52-
navController = navController,
53-
onHelpPressed = onHelpPressed,
54-
mainUIState = mainUIState,
55-
onUpdateQueryString = onUpdateQueryString,
56-
)
57-
else -> LemuroidTopAppBar(route, navController, mainUIState, onHelpPressed)
58-
}
59-
}
60-
}
60+
LemuroidTopAppBar(
61+
route = currentRoute,
62+
navController = navController,
63+
mainUIState = mainUIState,
64+
onHelpPressed = onHelpPressed,
65+
onUpdateQueryString = onUpdateQueryString,
66+
)
6167

6268
AnimatedVisibility(mainUIState.operationInProgress) {
6369
LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
@@ -72,6 +78,7 @@ fun LemuroidTopAppBar(
7278
navController: NavController,
7379
mainUIState: MainViewModel.UiState,
7480
onHelpPressed: () -> Unit,
81+
onUpdateQueryString: (String) -> Unit,
7582
) {
7683
val context = LocalContext.current
7784
val topBarColor =
@@ -80,15 +87,24 @@ fun LemuroidTopAppBar(
8087
)
8188

8289
TopAppBar(
83-
title = { Text(text = stringResource(route.titleId)) },
90+
title = {
91+
if (route == MainRoute.SEARCH) {
92+
LemuroidSearchView(
93+
mainUIState = mainUIState,
94+
onUpdateQueryString = onUpdateQueryString,
95+
)
96+
} else {
97+
Text(text = stringResource(route.titleId))
98+
}
99+
},
84100
colors =
85-
TopAppBarDefaults.topAppBarColors(
86-
scrolledContainerColor = topBarColor,
87-
containerColor = topBarColor,
88-
),
101+
TopAppBarDefaults.topAppBarColors(
102+
scrolledContainerColor = topBarColor,
103+
containerColor = topBarColor,
104+
),
89105
navigationIcon = {
90106
AnimatedVisibility(
91-
visible = route?.parent != null,
107+
visible = route.parent != null,
92108
enter = fadeIn(),
93109
exit = fadeOut(),
94110
) {
@@ -154,3 +170,55 @@ fun LemuroidTopBarActions(
154170
}
155171
}
156172
}
173+
174+
@Composable
175+
private fun LemuroidSearchView(
176+
mainUIState: MainViewModel.UiState,
177+
onUpdateQueryString: (String) -> Unit,
178+
) {
179+
val focusRequester = remember { FocusRequester() }
180+
val focusManager = LocalFocusManager.current
181+
182+
LaunchedEffect(Unit) {
183+
focusRequester.requestFocus()
184+
}
185+
186+
Box(
187+
modifier =
188+
Modifier
189+
.fillMaxWidth()
190+
.height(56.dp),
191+
) {
192+
Surface(
193+
modifier =
194+
Modifier
195+
.fillMaxSize()
196+
.padding(top = 8.dp, bottom = 8.dp, end = 8.dp),
197+
shape = RoundedCornerShape(100),
198+
tonalElevation = 16.dp,
199+
) { }
200+
201+
TextField(
202+
value = mainUIState.searchQuery,
203+
modifier =
204+
Modifier
205+
.fillMaxSize()
206+
.focusRequester(focusRequester),
207+
textStyle = MaterialTheme.typography.bodyMedium,
208+
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
209+
onValueChange = { onUpdateQueryString(it) },
210+
singleLine = true,
211+
keyboardActions =
212+
KeyboardActions(
213+
onDone = { focusManager.clearFocus(true) },
214+
),
215+
colors =
216+
TextFieldDefaults.colors(
217+
focusedContainerColor = Color.Transparent,
218+
unfocusedContainerColor = Color.Transparent,
219+
focusedIndicatorColor = Color.Transparent,
220+
unfocusedIndicatorColor = Color.Transparent,
221+
),
222+
)
223+
}
224+
}

0 commit comments

Comments
 (0)