some searching refactoring

This commit is contained in:
Owen LeJeune
2022-09-03 22:40:36 -04:00
parent c5e4069118
commit 096fcdaea4
8 changed files with 99 additions and 61 deletions

View File

@@ -352,7 +352,8 @@ class MainActivity : MonetCompatActivity() {
const val ID_KEY = "id_key" const val ID_KEY = "id_key"
const val TYPE_KEY = "type_key" const val TYPE_KEY = "type_key"
const val SETTINGS_KEY = "settings_key" const val SETTINGS_KEY = "settings_key"
const val SEARCH_KEY = "search_key" const val SEARCH_ID_KEY = "search_key"
const val SEARCH_TITLE_KEY = "search_title_key"
} }
@Composable @Composable
@@ -360,6 +361,7 @@ class MainActivity : MonetCompatActivity() {
startDestination: String = MainNavItem.MainView.route, startDestination: String = MainNavItem.MainView.route,
mainNavStartRoute: String = MainNavItem.Items[0].route, mainNavStartRoute: String = MainNavItem.Items[0].route,
appNavController: NavHostController, appNavController: NavHostController,
preferences: AppPreferences = get(AppPreferences::class.java)
) { ) {
NavHost(navController = appNavController, startDestination = startDestination) { NavHost(navController = appNavController, startDestination = startDestination) {
composable(MainNavItem.MainView.route) { composable(MainNavItem.MainView.route) {
@@ -404,12 +406,26 @@ class MainActivity : MonetCompatActivity() {
SettingsTab(appNavController = appNavController, activity = this@MainActivity) SettingsTab(appNavController = appNavController, activity = this@MainActivity)
} }
composable( composable(
route = MainNavItem.SearchView.route.plus("/{${NavConstants.SEARCH_KEY}}"), route = MainNavItem.SearchView.route.plus("/{${NavConstants.SEARCH_ID_KEY}}/{${NavConstants.SEARCH_TITLE_KEY}}"),
arguments = listOf( arguments = listOf(
navArgument(NavConstants.SEARCH_KEY) { type = NavType.IntType } navArgument(NavConstants.SEARCH_ID_KEY) { type = NavType.IntType },
navArgument(NavConstants.SEARCH_TITLE_KEY) { type = NavType.StringType }
) )
) { ) {
SearchScreen(appNavController = appNavController) it.arguments?.let { arguments ->
val title = arguments.getString(NavConstants.SEARCH_TITLE_KEY) ?: ""
val type = if (preferences.multiSearch) {
MediaViewType.MIXED
} else {
MediaViewType[arguments.getInt(NavConstants.SEARCH_ID_KEY)]
}
SearchScreen(
appNavController = appNavController,
title = title,
mediaViewType = type
)
}
} }
} }
} }

View File

@@ -6,7 +6,6 @@ import com.google.gson.Gson
import com.kieronquinn.monetcompat.core.MonetCompat import com.kieronquinn.monetcompat.core.MonetCompat
import com.owenlejeune.tvtime.BuildConfig import com.owenlejeune.tvtime.BuildConfig
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
import java.util.function.BiPredicate
class AppPreferences(context: Context) { class AppPreferences(context: Context) {
@@ -27,6 +26,7 @@ class AppPreferences(context: Context) {
private val SHOW_BACKDROP_GALLERY = "show_backdrop_gallery" private val SHOW_BACKDROP_GALLERY = "show_backdrop_gallery"
private val USE_WALLPAPER_COLORS = "use_wallpaper_colors" private val USE_WALLPAPER_COLORS = "use_wallpaper_colors"
private val DARK_THEME = "dark_theme" private val DARK_THEME = "dark_theme"
private val MULTI_SEARCH = "multi_search"
} }
private val preferences: SharedPreferences = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE) private val preferences: SharedPreferences = context.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE)
@@ -36,12 +36,15 @@ class AppPreferences(context: Context) {
get() = preferences.getBoolean(PERSISTENT_SEARCH, true) get() = preferences.getBoolean(PERSISTENT_SEARCH, true)
set(value) { preferences.put(PERSISTENT_SEARCH, value) } set(value) { preferences.put(PERSISTENT_SEARCH, value) }
var multiSearch: Boolean
get() = preferences.getBoolean(MULTI_SEARCH, false)
set(value) { preferences.put(MULTI_SEARCH, value) }
/******* Design Preferences ********/
var useWallpaperColors: Boolean var useWallpaperColors: Boolean
get() = preferences.getBoolean(USE_WALLPAPER_COLORS, true) get() = preferences.getBoolean(USE_WALLPAPER_COLORS, true)
set(value) { preferences.put(USE_WALLPAPER_COLORS, value) } set(value) { preferences.put(USE_WALLPAPER_COLORS, value) }
/******* Design Preferences ********/
var darkTheme: Int var darkTheme: Int
get() = preferences.getInt(DARK_THEME, 0) get() = preferences.getInt(DARK_THEME, 0)
set(value) { preferences.put(DARK_THEME, value) } set(value) { preferences.put(DARK_THEME, value) }

View File

@@ -1,6 +1,5 @@
package com.owenlejeune.tvtime.ui.components package com.owenlejeune.tvtime.ui.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectable
import androidx.compose.material3.* import androidx.compose.material3.*
@@ -10,10 +9,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
@@ -47,7 +42,7 @@ fun SwitchPreference(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
.padding(start = 8.dp, top = 8.dp, bottom = 8.dp, end = 8.dp) .padding(all = 8.dp)
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
@@ -61,6 +56,8 @@ fun SwitchPreference(
Text(text = subtitleText, style = MaterialTheme.typography.bodyMedium, color = subtitleColor) Text(text = subtitleText, style = MaterialTheme.typography.bodyMedium, color = subtitleColor)
} }
} }
Spacer(modifier = Modifier.width(32.dp))
CustomSwitch( CustomSwitch(
modifier = Modifier modifier = Modifier
@@ -127,12 +124,6 @@ fun RadioButtonPreference(
disabledTextColor: Color = MaterialTheme.colorScheme.outline disabledTextColor: Color = MaterialTheme.colorScheme.outline
) { ) {
Row( Row(
// modifier = modifier
// .clickable(
// enabled = enabled,
// onClick = onClick
// )
// .semantics { role = Role.RadioButton }
modifier = modifier modifier = modifier
.padding(all = 8.dp) .padding(all = 8.dp)
.selectable( .selectable(

View File

@@ -1,8 +1,6 @@
package com.owenlejeune.tvtime.ui.components package com.owenlejeune.tvtime.ui.components
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectTapGestures
@@ -20,7 +18,10 @@ import androidx.compose.material.Card
import androidx.compose.material.OutlinedTextField import androidx.compose.material.OutlinedTextField
import androidx.compose.material.TextFieldDefaults import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.* import androidx.compose.material.icons.filled.Error
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material.icons.outlined.ArrowDropDown import androidx.compose.material.icons.outlined.ArrowDropDown
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
@@ -55,7 +56,6 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.* import androidx.compose.ui.unit.*
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
@@ -65,13 +65,11 @@ import androidx.navigation.NavHostController
import coil.compose.AsyncImage import coil.compose.AsyncImage
import coil.compose.rememberAsyncImagePainter import coil.compose.rememberAsyncImagePainter
import com.google.accompanist.flowlayout.FlowRow import com.google.accompanist.flowlayout.FlowRow
import com.kieronquinn.monetcompat.core.MonetCompat
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AuthorDetails import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AuthorDetails
import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.ui.navigation.MainNavItem import com.owenlejeune.tvtime.ui.navigation.MainNavItem
import com.owenlejeune.tvtime.ui.screens.main.MediaViewType import com.owenlejeune.tvtime.ui.screens.main.MediaViewType
import com.owenlejeune.tvtime.ui.theme.RatingSelected
import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.TmdbUtils
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener
@@ -82,7 +80,6 @@ import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor
import org.intellij.markdown.html.HtmlGenerator import org.intellij.markdown.html.HtmlGenerator
import org.intellij.markdown.parser.MarkdownParser import org.intellij.markdown.parser.MarkdownParser
import org.koin.java.KoinJavaComponent import org.koin.java.KoinJavaComponent
import kotlin.math.exp
@Composable @Composable
fun TopLevelSwitch( fun TopLevelSwitch(
@@ -212,7 +209,7 @@ fun SearchView(
fab: MutableState<@Composable () -> Unit>, fab: MutableState<@Composable () -> Unit>,
preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java)
) { ) {
val route = "${MainNavItem.SearchView.route}/${mediaType.ordinal}" val route = "${MainNavItem.SearchView.route}/${mediaType.ordinal}/$title"
if (preferences.showSearchBar) { if (preferences.showSearchBar) {
SearchBar( SearchBar(
placeholder = title placeholder = title

View File

@@ -1,33 +1,62 @@
package com.owenlejeune.tvtime.ui.screens package com.owenlejeune.tvtime.ui.screens
import androidx.compose.foundation.clickable import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text import androidx.compose.material.icons.Icons
import androidx.compose.runtime.Composable import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.ui.Alignment import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.ui.screens.main.MediaViewType
@Composable @Composable
fun SearchScreen( fun SearchScreen(
appNavController: NavHostController appNavController: NavHostController,
title: String,
mediaViewType: MediaViewType
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
.clickable(
onClick = {
appNavController.popBackStack()
}
)
.fillMaxSize() .fillMaxSize()
.background(color = MaterialTheme.colorScheme.background)
) { ) {
Spacer(modifier = Modifier.weight(1f)) var searchValue by remember { mutableStateOf("") }
Text( val focusRequester = remember { FocusRequester() }
modifier = Modifier.align(Alignment.CenterHorizontally),
text = "Search" SmallTopAppBar(
modifier = Modifier,
title = {
TextField(
value = searchValue,
onValueChange = { searchValue = it },
placeholder = { Text(text = stringResource(id = R.string.search_placeholder, title)) },
colors = TextFieldDefaults.textFieldColors(
containerColor = MaterialTheme.colorScheme.surface,
focusedIndicatorColor = MaterialTheme.colorScheme.surface,
unfocusedIndicatorColor = MaterialTheme.colorScheme.surface
),
modifier = Modifier
.focusRequester(focusRequester)
)
},
navigationIcon = {
IconButton(onClick = { appNavController.popBackStack() }) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = stringResource(id = R.string.content_description_back_button)
)
}
}
) )
Spacer(modifier = Modifier.weight(1f))
LaunchedEffect(key1 = "") {
focusRequester.requestFocus()
}
} }
} }

View File

@@ -8,5 +8,12 @@ enum class MediaViewType {
@SerializedName("tv") @SerializedName("tv")
TV, TV,
PERSON, PERSON,
EPISODE EPISODE,
MIXED;
companion object {
operator fun get(oridinal: Int): MediaViewType {
return values()[oridinal]
}
}
} }

View File

@@ -1,14 +1,9 @@
package com.owenlejeune.tvtime.ui.screens.main package com.owenlejeune.tvtime.ui.screens.main
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService
@@ -38,13 +33,6 @@ fun PeopleTab(
fab = fab fab = fab
) )
Text(
modifier = Modifier.padding(start = 16.dp),
text = stringResource(id = R.string.nav_popular_people_title),
color = MaterialTheme.colorScheme.primary,
style = MaterialTheme.typography.headlineLarge
)
PeoplePosterGrid( PeoplePosterGrid(
fetchPeople = { peopleList -> fetchPeople = { peopleList ->
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {

View File

@@ -6,17 +6,13 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.IconButton
import androidx.compose.material.TextButton import androidx.compose.material.TextButton
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.* import androidx.compose.material.icons.filled.*
import androidx.compose.material.icons.outlined.DarkMode import androidx.compose.material.icons.outlined.DarkMode
import androidx.compose.material.icons.outlined.LightMode import androidx.compose.material.icons.outlined.LightMode
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.Icon
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -197,6 +193,17 @@ private fun SearchPreferences(
preferences.showSearchBar = isChecked preferences.showSearchBar = isChecked
} }
) )
val multiSearch = remember { mutableStateOf(preferences.multiSearch) }
SwitchPreference(
titleText = "Multi Search",
subtitleText = "Search across movies, TV, and people at the same time",
checkState = multiSearch.value,
onCheckedChange = { isChecked ->
multiSearch.value = isChecked
preferences.multiSearch = isChecked
}
)
} }
@Composable @Composable