update dependencies + fix credits on people detail + add animations to page transition

This commit is contained in:
Owen LeJeune
2023-06-22 22:44:33 -04:00
parent 42930ab953
commit 90969247f9
16 changed files with 90 additions and 124 deletions

View File

@@ -4,7 +4,7 @@ plugins {
id 'kotlin-android' id 'kotlin-android'
} }
def composeVersion = "1.2.0-beta03" def composeCompilerVersion = "1.4.7"
android { android {
compileSdkVersion 33 compileSdkVersion 33
@@ -25,6 +25,9 @@ android {
buildConfigField("String", "TMDB_Api_v4Key", TMDB_Api_v4Key) buildConfigField("String", "TMDB_Api_v4Key", TMDB_Api_v4Key)
} }
buildFeatures {
buildConfig = true
}
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
@@ -38,44 +41,44 @@ android {
} }
kotlinOptions { kotlinOptions {
jvmTarget = '11' jvmTarget = '11'
useIR = true
} }
buildFeatures { buildFeatures {
compose true compose true
} }
composeOptions { composeOptions {
kotlinCompilerExtensionVersion composeVersion kotlinCompilerExtensionVersion composeCompilerVersion
} }
packagingOptions { packagingOptions {
resources { resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}' excludes += '/META-INF/{AL2.0,LGPL2.1}'
} }
} }
namespace 'com.owenlejeune.tvtime'
} }
dependencies { dependencies {
// ktx // ktx
def ktx_core = "1.8.0" def ktx_core = "1.10.1"
def ktx_paging = "3.1.1" def ktx_paging = "3.1.1"
implementation "androidx.core:core-ktx:$ktx_core" implementation "androidx.core:core-ktx:$ktx_core"
implementation "androidx.paging:paging-common-ktx:$ktx_paging" implementation "androidx.paging:paging-common-ktx:$ktx_paging"
// android x // android x
def androidx = "1.0.0" def androidx = "1.1.0"
implementation "androidx.window:window:$androidx" implementation "androidx.window:window:$androidx"
// material // material
def material = "1.6.1" def material = "1.9.0"
implementation "com.google.android.material:material:$material" implementation "com.google.android.material:material:$material"
// compose // compose
def compose = composeVersion def compose = "1.2.0-beta03"
def compose_material3 = "1.0.0-alpha13" def compose_material3 = "1.2.0-alpha02"
def compose_accompanist = "0.24.10-beta" def compose_accompanist = "0.28.0"
def compose_navigation = "2.5.3" def compose_navigation = "2.7.0-beta01"
def compose_paging = "1.0.0-alpha16" def compose_paging = "3.2.0-beta01"
def compose_constraint_layout = "1.0.1" def compose_constraint_layout = "1.0.1"
def compose_activity = "1.4.0" def compose_activity = "1.7.2"
implementation "androidx.compose.ui:ui:$compose" implementation "androidx.compose.ui:ui:$compose"
implementation "androidx.compose.material3:material3:$compose_material3" implementation "androidx.compose.material3:material3:$compose_material3"
implementation "androidx.compose.material:material:$compose" implementation "androidx.compose.material:material:$compose"
@@ -86,12 +89,10 @@ dependencies {
implementation "com.google.accompanist:accompanist-pager:$compose_accompanist" implementation "com.google.accompanist:accompanist-pager:$compose_accompanist"
implementation "com.google.accompanist:accompanist-pager-indicators:$compose_accompanist" implementation "com.google.accompanist:accompanist-pager-indicators:$compose_accompanist"
implementation "com.google.accompanist:accompanist-flowlayout:$compose_accompanist" implementation "com.google.accompanist:accompanist-flowlayout:$compose_accompanist"
// implementation "com.google.accompanist:accompanist-insets:$compose_accompanist"
implementation "androidx.navigation:navigation-compose:$compose_navigation" implementation "androidx.navigation:navigation-compose:$compose_navigation"
implementation "androidx.paging:paging-compose:$compose_paging" implementation "androidx.paging:paging-compose:$compose_paging"
implementation "androidx.constraintlayout:constraintlayout-compose:$compose_constraint_layout" implementation "androidx.constraintlayout:constraintlayout-compose:$compose_constraint_layout"
implementation "androidx.paging:paging-compose:$compose_paging" implementation "com.google.accompanist:accompanist-webview:$compose_accompanist"
implementation "com.google.accompanist:accompanist-webview:0.28.0"
// material you // material you
def monet_compat = "0.4.1" def monet_compat = "0.4.1"
@@ -104,7 +105,7 @@ dependencies {
// retrofit // retrofit
def retrofit = "2.9.0" def retrofit = "2.9.0"
def stetho = "1.6.0" def stetho = "1.6.0"
def gson = "2.9.0" def gson = "2.10.1"
def profiler = "1.0.8" def profiler = "1.0.8"
implementation "com.squareup.retrofit2:retrofit:$retrofit" implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "com.squareup.retrofit2:converter-gson:$retrofit" implementation "com.squareup.retrofit2:converter-gson:$retrofit"
@@ -145,7 +146,7 @@ dependencies {
// testing // testing
def junit = "4.13.2" def junit = "4.13.2"
def androidx_junit = "1.1.3" def androidx_junit = "1.1.3"
def espresso_core = "3.4.0" def espresso_core = "3.5.1"
testImplementation "junit:junit:$junit" testImplementation "junit:junit:$junit"
androidTestImplementation "androidx.test.ext:junit:$androidx_junit" androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_core" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_core"

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.owenlejeune.tvtime">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />

View File

@@ -8,14 +8,12 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.kieronquinn.monetcompat.app.MonetCompatActivity import com.kieronquinn.monetcompat.app.MonetCompatActivity
import com.owenlejeune.tvtime.extensions.rememberWindowSizeClass import com.owenlejeune.tvtime.extensions.rememberWindowSizeClass
import com.owenlejeune.tvtime.ui.navigation.AppNavigationHost import com.owenlejeune.tvtime.ui.navigation.AppNavigationHost
import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem
import com.owenlejeune.tvtime.ui.theme.TVTimeTheme import com.owenlejeune.tvtime.ui.theme.TVTimeTheme
import com.owenlejeune.tvtime.ui.viewmodel.ConfigurationViewModel
import com.owenlejeune.tvtime.utils.KeyboardManager import com.owenlejeune.tvtime.utils.KeyboardManager
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope

View File

@@ -38,14 +38,12 @@ import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
@@ -73,9 +71,9 @@ import com.owenlejeune.tvtime.extensions.unlessEmpty
import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.ui.navigation.AppNavItem
import com.owenlejeune.tvtime.ui.viewmodel.HomeScreenViewModel import com.owenlejeune.tvtime.ui.viewmodel.HomeScreenViewModel
import com.owenlejeune.tvtime.utils.types.MediaViewType
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.utils.types.MediaViewType
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor
@@ -756,6 +754,7 @@ fun AccountIcon(
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ThemedOutlineTextField( fun ThemedOutlineTextField(
value: String, value: String,
@@ -803,12 +802,13 @@ fun ThemedOutlineTextField(
maxLines = maxLines, maxLines = maxLines,
interactionSource = interactionSource, interactionSource = interactionSource,
shape = shape, shape = shape,
colors = TextFieldDefaults.outlinedTextFieldColors( colors = OutlinedTextFieldDefaults.colors(
unfocusedBorderColor = MaterialTheme.colorScheme.onBackground, unfocusedBorderColor = MaterialTheme.colorScheme.onBackground,
focusedBorderColor = MaterialTheme.colorScheme.primary, focusedBorderColor = MaterialTheme.colorScheme.primary,
focusedLabelColor = MaterialTheme.colorScheme.primary, focusedLabelColor = MaterialTheme.colorScheme.primary,
cursorColor = MaterialTheme.colorScheme.primary, cursorColor = MaterialTheme.colorScheme.primary,
textColor = MaterialTheme.colorScheme.onBackground, focusedTextColor = MaterialTheme.colorScheme.onBackground,
unfocusedTextColor = MaterialTheme.colorScheme.onBackground,
errorBorderColor = MaterialTheme.colorScheme.error, errorBorderColor = MaterialTheme.colorScheme.error,
errorCursorColor = MaterialTheme.colorScheme.error, errorCursorColor = MaterialTheme.colorScheme.error,
errorLabelColor = MaterialTheme.colorScheme.error errorLabelColor = MaterialTheme.colorScheme.error

View File

@@ -1,5 +1,10 @@
package com.owenlejeune.tvtime.ui.navigation package com.owenlejeune.tvtime.ui.navigation
import android.util.Log
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
@@ -11,17 +16,17 @@ import androidx.navigation.navDeepLink
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.extensions.WindowSizeClass import com.owenlejeune.tvtime.extensions.WindowSizeClass
import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.ui.screens.SearchScreen
import com.owenlejeune.tvtime.ui.screens.AboutScreen import com.owenlejeune.tvtime.ui.screens.AboutScreen
import com.owenlejeune.tvtime.ui.screens.AccountScreen import com.owenlejeune.tvtime.ui.screens.AccountScreen
import com.owenlejeune.tvtime.ui.screens.HomeScreen
import com.owenlejeune.tvtime.ui.screens.ListDetailScreen import com.owenlejeune.tvtime.ui.screens.ListDetailScreen
import com.owenlejeune.tvtime.ui.screens.MediaDetailScreen import com.owenlejeune.tvtime.ui.screens.MediaDetailScreen
import com.owenlejeune.tvtime.utils.types.MediaViewType
import com.owenlejeune.tvtime.ui.screens.PersonDetailScreen import com.owenlejeune.tvtime.ui.screens.PersonDetailScreen
import com.owenlejeune.tvtime.ui.screens.SearchScreen
import com.owenlejeune.tvtime.ui.screens.SettingsScreen import com.owenlejeune.tvtime.ui.screens.SettingsScreen
import com.owenlejeune.tvtime.ui.screens.WebLinkScreen import com.owenlejeune.tvtime.ui.screens.WebLinkScreen
import com.owenlejeune.tvtime.ui.screens.HomeScreen
import com.owenlejeune.tvtime.utils.NavConstants import com.owenlejeune.tvtime.utils.NavConstants
import com.owenlejeune.tvtime.utils.types.MediaViewType
import org.koin.java.KoinJavaComponent import org.koin.java.KoinJavaComponent
@Composable @Composable
@@ -32,8 +37,15 @@ fun AppNavigationHost(
windowSize: WindowSizeClass, windowSize: WindowSizeClass,
preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java) preferences: AppPreferences = KoinJavaComponent.get(AppPreferences::class.java)
) { ) {
NavHost(navController = appNavController, startDestination = startDestination) { NavHost(
composable(AppNavItem.MainView.route) { navController = appNavController,
startDestination = startDestination,
enterTransition = { slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Start, tween(500)) },
popEnterTransition = { fadeIn(tween(500)) },
exitTransition = { fadeOut(tween(500)) },
popExitTransition = { slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.End, tween(500)) }
) {
composable(route = AppNavItem.MainView.route) {
HomeScreen( HomeScreen(
appNavController = appNavController, appNavController = appNavController,
mainNavStartRoute = mainNavStartRoute, mainNavStartRoute = mainNavStartRoute,
@@ -41,7 +53,7 @@ fun AppNavigationHost(
) )
} }
composable( composable(
AppNavItem.DetailView.route.plus("/{${NavConstants.TYPE_KEY}}/{${NavConstants.ID_KEY}}"), route = AppNavItem.DetailView.route.plus("/{${NavConstants.TYPE_KEY}}/{${NavConstants.ID_KEY}}"),
arguments = listOf( arguments = listOf(
navArgument(NavConstants.ID_KEY) { type = NavType.IntType }, navArgument(NavConstants.ID_KEY) { type = NavType.IntType },
navArgument(NavConstants.TYPE_KEY) { type = NavType.EnumType(MediaViewType::class.java) } navArgument(NavConstants.TYPE_KEY) { type = NavType.EnumType(MediaViewType::class.java) }

View File

@@ -3,7 +3,6 @@ package com.owenlejeune.tvtime.ui.screens
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.provider.Settings import android.provider.Settings
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -32,7 +31,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarScrollState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@@ -67,11 +66,9 @@ fun AboutScreen(
val context = LocalContext.current val context = LocalContext.current
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState)
}
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(connection = scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(connection = scrollBehavior.nestedScrollConnection),
topBar = { topBar = {
@@ -216,7 +213,10 @@ private fun ColumnScope.AttributionSection() {
.clip(RoundedCornerShape(10.dp)) .clip(RoundedCornerShape(10.dp))
.clickable( .clickable(
onClick = { onClick = {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(context.getString(R.string.tmdb_home_page))) val intent = Intent(
Intent.ACTION_VIEW,
Uri.parse(context.getString(R.string.tmdb_home_page))
)
context.startActivity(intent) context.startActivity(intent)
} }
) )

View File

@@ -1,6 +1,5 @@
package com.owenlejeune.tvtime.ui.screens package com.owenlejeune.tvtime.ui.screens
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -63,11 +62,9 @@ fun AccountScreen(
val currentSessionState = remember { SessionManager.currentSession } val currentSessionState = remember { SessionManager.currentSession }
val currentSession = currentSessionState.value val currentSession = currentSessionState.value
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState)
}
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar = {

View File

@@ -2,17 +2,14 @@ package com.owenlejeune.tvtime.ui.screens
import android.app.Activity import android.app.Activity
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.NavigationRailDefaults
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@@ -27,9 +24,8 @@ import androidx.compose.material3.NavigationRailItemDefaults
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.rememberTopAppBarScrollState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -50,8 +46,8 @@ import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.ui.components.AccountIcon import com.owenlejeune.tvtime.ui.components.AccountIcon
import com.owenlejeune.tvtime.ui.components.ProfileMenuContainer import com.owenlejeune.tvtime.ui.components.ProfileMenuContainer
import com.owenlejeune.tvtime.ui.components.ProfileMenuDefaults import com.owenlejeune.tvtime.ui.components.ProfileMenuDefaults
import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem
import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavHost import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavHost
import com.owenlejeune.tvtime.ui.navigation.HomeScreenNavItem
import com.owenlejeune.tvtime.ui.viewmodel.HomeScreenViewModel import com.owenlejeune.tvtime.ui.viewmodel.HomeScreenViewModel
import org.koin.java.KoinJavaComponent import org.koin.java.KoinJavaComponent
@@ -64,11 +60,8 @@ fun HomeScreen(
) { ) {
val navController = rememberNavController() val navController = rememberNavController()
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState)
}
val homeScreenViewModel = viewModel<HomeScreenViewModel>() val homeScreenViewModel = viewModel<HomeScreenViewModel>()
@@ -123,6 +116,7 @@ fun HomeScreen(
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun TopBar( private fun TopBar(
scrollBehavior: TopAppBarScrollBehavior, scrollBehavior: TopAppBarScrollBehavior,
@@ -179,6 +173,7 @@ private fun BottomNavBar(
} }
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun MainContent( private fun MainContent(
windowSize: WindowSizeClass, windowSize: WindowSizeClass,
@@ -218,6 +213,7 @@ private fun SingleColumnMainContent(
) )
} }
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun DualColumnMainContent( private fun DualColumnMainContent(
appNavController: NavHostController, appNavController: NavHostController,

View File

@@ -1,10 +1,7 @@
package com.owenlejeune.tvtime.ui.screens package com.owenlejeune.tvtime.ui.screens
import android.accounts.Account
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.util.Log
import android.widget.Toast
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectable
@@ -13,11 +10,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Book
import androidx.compose.material.icons.filled.Bookmark
import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Star
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -41,32 +34,22 @@ import androidx.navigation.NavController
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountService
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.MarkAsFavoriteBody
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.WatchlistBody
import com.owenlejeune.tvtime.api.tmdb.api.v4.ListV4Service import com.owenlejeune.tvtime.api.tmdb.api.v4.ListV4Service
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.* import com.owenlejeune.tvtime.api.tmdb.api.v4.model.*
import com.owenlejeune.tvtime.extensions.WindowSizeClass import com.owenlejeune.tvtime.extensions.WindowSizeClass
import com.owenlejeune.tvtime.extensions.unlessEmpty import com.owenlejeune.tvtime.extensions.unlessEmpty
import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.ui.components.Actions import com.owenlejeune.tvtime.ui.components.Actions
import com.owenlejeune.tvtime.ui.components.ActionsView import com.owenlejeune.tvtime.ui.components.ActionsView
import com.owenlejeune.tvtime.ui.components.FavoriteButton
import com.owenlejeune.tvtime.ui.components.RatingView import com.owenlejeune.tvtime.ui.components.RatingView
import com.owenlejeune.tvtime.ui.components.Spinner import com.owenlejeune.tvtime.ui.components.Spinner
import com.owenlejeune.tvtime.ui.components.SwitchPreference import com.owenlejeune.tvtime.ui.components.SwitchPreference
import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.ui.navigation.AppNavItem
import com.owenlejeune.tvtime.ui.theme.* import com.owenlejeune.tvtime.ui.theme.*
import com.owenlejeune.tvtime.ui.viewmodel.AccountViewModel import com.owenlejeune.tvtime.ui.viewmodel.AccountViewModel
import com.owenlejeune.tvtime.utils.SessionManager
import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.utils.types.MediaViewType
import de.charlex.compose.RevealDirection import de.charlex.compose.RevealDirection
import de.charlex.compose.RevealSwipe import de.charlex.compose.RevealSwipe
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.java.KoinJavaComponent import org.koin.java.KoinJavaComponent
import kotlin.math.roundToInt import kotlin.math.roundToInt
@@ -90,19 +73,16 @@ fun ListDetailScreen(
val listMap = remember { accountViewModel.listMap } val listMap = remember { accountViewModel.listMap }
val parentList = listMap[itemId] val parentList = listMap[itemId]
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
}
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar = {
SmallTopAppBar( TopAppBar(
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
colors = TopAppBarDefaults colors = TopAppBarDefaults
.smallTopAppBarColors( .topAppBarColors(
scrolledContainerColor = MaterialTheme.colorScheme.background, scrolledContainerColor = MaterialTheme.colorScheme.background,
titleContentColor = MaterialTheme.colorScheme.primary titleContentColor = MaterialTheme.colorScheme.primary
), ),

View File

@@ -81,11 +81,8 @@ fun MediaDetailScreen(
val imagesMap = remember { mainViewModel.produceImagesFor(type) } val imagesMap = remember { mainViewModel.produceImagesFor(type) }
val images = imagesMap[itemId] val images = imagesMap[itemId]
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
}
val pagerState = rememberPagerState(initialPage = 0) val pagerState = rememberPagerState(initialPage = 0)
@@ -96,10 +93,10 @@ fun MediaDetailScreen(
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar = {
SmallTopAppBar( TopAppBar(
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
colors = TopAppBarDefaults colors = TopAppBarDefaults
.smallTopAppBarColors( .topAppBarColors(
scrolledContainerColor = MaterialTheme.colorScheme.background, scrolledContainerColor = MaterialTheme.colorScheme.background,
titleContentColor = MaterialTheme.colorScheme.primary titleContentColor = MaterialTheme.colorScheme.primary
), ),

View File

@@ -1,6 +1,5 @@
package com.owenlejeune.tvtime.ui.screens package com.owenlejeune.tvtime.ui.screens
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -19,14 +18,13 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarScrollState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -58,6 +56,7 @@ fun PersonDetailScreen(
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
mainViewModel.getById(personId, MediaViewType.PERSON) mainViewModel.getById(personId, MediaViewType.PERSON)
mainViewModel.getExternalIds(personId, MediaViewType.PERSON) mainViewModel.getExternalIds(personId, MediaViewType.PERSON)
mainViewModel.getCastAndCrew(personId, MediaViewType.PERSON)
} }
val systemUiController = rememberSystemUiController() val systemUiController = rememberSystemUiController()
@@ -67,19 +66,16 @@ fun PersonDetailScreen(
val peopleMap = remember { mainViewModel.peopleMap } val peopleMap = remember { mainViewModel.peopleMap }
val person = peopleMap[personId] val person = peopleMap[personId]
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
val scrollBehaviour = remember(decayAnimationSpec) {
TopAppBarDefaults.pinnedScrollBehavior(topAppBarScrollState)
}
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehaviour.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { topBar = {
SmallTopAppBar( TopAppBar(
scrollBehavior = scrollBehaviour, scrollBehavior = scrollBehavior,
colors = TopAppBarDefaults colors = TopAppBarDefaults
.smallTopAppBarColors( .topAppBarColors(
scrolledContainerColor = MaterialTheme.colorScheme.background, scrolledContainerColor = MaterialTheme.colorScheme.background,
titleContentColor = MaterialTheme.colorScheme.primary titleContentColor = MaterialTheme.colorScheme.primary
), ),
@@ -96,8 +92,6 @@ fun PersonDetailScreen(
) )
} }
) { innerPadding -> ) { innerPadding ->
val scope = rememberCoroutineScope()
Box(modifier = Modifier.padding(innerPadding)) { Box(modifier = Modifier.padding(innerPadding)) {
Column( Column(
modifier = Modifier modifier = Modifier

View File

@@ -23,22 +23,17 @@ import androidx.paging.compose.collectAsLazyPagingItems
import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.api.tmdb.api.v3.MoviesService import com.owenlejeune.tvtime.api.tmdb.api.v3.MoviesService
import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchService
import com.owenlejeune.tvtime.api.tmdb.api.v3.TvService import com.owenlejeune.tvtime.api.tmdb.api.v3.TvService
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import com.owenlejeune.tvtime.extensions.listItems import com.owenlejeune.tvtime.extensions.lazyPagingItems
import com.owenlejeune.tvtime.ui.components.MediaResultCard import com.owenlejeune.tvtime.ui.components.MediaResultCard
import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel
import com.owenlejeune.tvtime.ui.viewmodel.SearchViewModel import com.owenlejeune.tvtime.ui.viewmodel.SearchViewModel
import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.utils.types.MediaViewType import com.owenlejeune.tvtime.utils.types.MediaViewType
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.java.KoinJavaComponent.get import org.koin.java.KoinJavaComponent.get
import com.owenlejeune.tvtime.extensions.lazyPagingItems
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SearchScreen( fun SearchScreen(
appNavController: NavHostController, appNavController: NavHostController,
@@ -67,14 +62,15 @@ fun SearchScreen(
} }
} }
SmallTopAppBar( TopAppBar(
title = { title = {
TextField( TextField(
value = searchValue.value, value = searchValue.value,
onValueChange = { searchValue.value = it }, onValueChange = { searchValue.value = it },
placeholder = { Text(text = stringResource(id = R.string.search_placeholder, title)) }, placeholder = { Text(text = stringResource(id = R.string.search_placeholder, title)) },
colors = TextFieldDefaults.textFieldColors( colors = TextFieldDefaults.colors(
containerColor = MaterialTheme.colorScheme.surface, focusedContainerColor = MaterialTheme.colorScheme.surface,
unfocusedContainerColor = MaterialTheme.colorScheme.surface,
focusedIndicatorColor = MaterialTheme.colorScheme.surface, focusedIndicatorColor = MaterialTheme.colorScheme.surface,
unfocusedIndicatorColor = MaterialTheme.colorScheme.surface unfocusedIndicatorColor = MaterialTheme.colorScheme.surface
), ),

View File

@@ -3,7 +3,6 @@ package com.owenlejeune.tvtime.ui.screens
import android.os.Build import android.os.Build
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.rememberSplineBasedDecay
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -61,11 +60,8 @@ fun SettingsScreen(
systemUiController.setStatusBarColor(color = MaterialTheme.colorScheme.background) systemUiController.setStatusBarColor(color = MaterialTheme.colorScheme.background)
systemUiController.setNavigationBarColor(color = MaterialTheme.colorScheme.background) systemUiController.setNavigationBarColor(color = MaterialTheme.colorScheme.background)
val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarState()
val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarScrollState)
val scrollBehavior = remember(decayAnimationSpec) {
TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec, topAppBarScrollState)
}
val appBarTitle = remember { mutableStateOf("") } val appBarTitle = remember { mutableStateOf("") }
val defaultRestoreAction = ::resetAllPreferences val defaultRestoreAction = ::resetAllPreferences

View File

@@ -199,7 +199,7 @@ class MainViewModel: ViewModel(), KoinComponent {
when (type) { when (type) {
MediaViewType.MOVIE -> movieService.getCastAndCrew(id) MediaViewType.MOVIE -> movieService.getCastAndCrew(id)
MediaViewType.TV -> tvService.getCastAndCrew(id) MediaViewType.TV -> tvService.getCastAndCrew(id)
MediaViewType.PERSON -> tvService.getCastAndCrew(id) MediaViewType.PERSON -> peopleService.getCredits(id)
else -> {} else -> {}
} }
} }

View File

@@ -1,6 +1,6 @@
buildscript { buildscript {
def gradle = "7.1.2" def gradle = "8.0.2"
def kotlin = "1.6.21" def kotlin = "1.8.21"
repositories { repositories {
google() google()
mavenCentral() mavenCentral()

View File

@@ -1,6 +1,6 @@
#Tue Feb 08 23:49:04 EST 2022 #Tue Feb 08 23:49:04 EST 2022
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME