diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/DetailService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/DetailService.kt index 906f9c7..2dfddfe 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/DetailService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/DetailService.kt @@ -25,4 +25,6 @@ interface DetailService { suspend fun getWatchProviders(id: Int): Response + suspend fun getExternalIds(id: Int): Response + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesApi.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesApi.kt index d0c6e28..05cc242 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesApi.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesApi.kt @@ -58,4 +58,7 @@ interface MoviesApi { @GET("movie/{id}/watch/providers") suspend fun getWatchProviders(@Path("id") id: Int): Response + @GET("movie/{id}/external_ids") + suspend fun getExternalIds(@Path("id") id: Int): Response + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt index 83c0631..ea781d0 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/MoviesService.kt @@ -3,6 +3,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3 import com.owenlejeune.tvtime.api.tmdb.TmdbClient import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastAndCrew import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KeywordsResponse @@ -82,4 +83,8 @@ class MoviesService: KoinComponent, DetailService, HomePageService { return movieService.getWatchProviders(id) } + override suspend fun getExternalIds(id: Int): Response { + return movieService.getExternalIds(id) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleApi.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleApi.kt index 444170e..df51d36 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleApi.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleApi.kt @@ -1,6 +1,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3 import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailPerson +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePagePeopleResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonImageCollection @@ -32,4 +33,7 @@ interface PeopleApi { // @GET("persons/{id}/tagged_images") // suspend fun getTaggedImages(@Path("id") id: Int, @Query("page") page: Int = 1): Response + @GET("person/{id}/external_ids") + suspend fun getExternalIds(@Path("id") id: Int): Response + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt index 35872dc..de1be41 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/PeopleService.kt @@ -2,6 +2,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3 import com.owenlejeune.tvtime.api.tmdb.TmdbClient import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailPerson +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePagePeopleResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonImageCollection @@ -28,4 +29,8 @@ class PeopleService: KoinComponent { return service.getPopular(page) } + suspend fun getExternalIds(id: Int): Response { + return service.getExternalIds(id) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvApi.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvApi.kt index 866ac89..b7931b3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvApi.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvApi.kt @@ -61,4 +61,7 @@ interface TvApi { @GET("tv/{id}/watch/providers") suspend fun getWatchProviders(@Path("id") seriesId: Int): Response + @GET("tv/{id}/external_ids") + suspend fun getExternalIds(@Path("id") id: Int): Response + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt index 63293e3..f28e50f 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/TvService.kt @@ -3,6 +3,7 @@ package com.owenlejeune.tvtime.api.tmdb.api.v3 import com.owenlejeune.tvtime.api.tmdb.TmdbClient import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CastAndCrew import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedItem +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KeywordsResponse @@ -87,4 +88,8 @@ class TvService: KoinComponent, DetailService, HomePageService { return service.getSeason(seriesId, seasonId) } + override suspend fun getExternalIds(id: Int): Response { + return service.getExternalIds(id) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ExternalIds.kt b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ExternalIds.kt new file mode 100644 index 0000000..3f33b6e --- /dev/null +++ b/app/src/main/java/com/owenlejeune/tvtime/api/tmdb/api/v3/model/ExternalIds.kt @@ -0,0 +1,22 @@ +package com.owenlejeune.tvtime.api.tmdb.api.v3.model + +import com.google.gson.annotations.SerializedName + +data class ExternalIds( + @SerializedName("facebook_id") + val facebook: String?, + @SerializedName("instagram_id") + val instagram: String?, + @SerializedName("tiktok_id") + val tiktok: String?, + @SerializedName("twitter_id") + val twitter: String?, + @SerializedName("youtube_id") + val youtube: String? +) { + fun hasExternalIds(): Boolean = (facebook != null) + .or(instagram != null) + .or(tiktok != null) + .or(twitter != null) + .or(youtube != null) +} \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt index 0dffd35..e500ce1 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/DetailViewCommon.kt @@ -1,18 +1,26 @@ package com.owenlejeune.tvtime.ui.components +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -24,6 +32,7 @@ import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.rememberPagerState import com.owenlejeune.tvtime.R +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection import com.owenlejeune.tvtime.ui.viewmodel.ConfigurationViewModel import com.owenlejeune.tvtime.utils.TmdbUtils @@ -220,4 +229,56 @@ fun RatingView( size = 50.dp ) } +} + +@Composable +fun ExternalIdsArea( + externalIds: ExternalIds, + modifier: Modifier = Modifier +) { + if (externalIds.hasExternalIds()) { + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + externalIds.twitter?.let { + ExternalIdLogo(url = "https://twitter.com/$it", logoPainter = painterResource(id = R.drawable.twitter_logo)) + } + externalIds.facebook?.let { + ExternalIdLogo(url = "https://facebook.com/$it", logoPainter = painterResource(id = R.drawable.facebook_logo)) + } + externalIds.instagram?.let { + ExternalIdLogo(url = "https://instagram.com/$it", logoPainter = painterResource(id = R.drawable.instagram_logo)) + } + externalIds.tiktok?.let { + ExternalIdLogo(url = "https://tiktok.com/@$it", logoPainter = painterResource(id = R.drawable.tiktok_logo)) + } + externalIds.youtube?.let { + ExternalIdLogo(url = "https://youtube.com/$it", logoPainter = painterResource(id = R.drawable.youtube_logo)) + } + } + } +} + +@Composable +private fun ExternalIdLogo( + logoPainter: Painter, + url: String, +) { + val context = LocalContext.current + + IconButton( + onClick = { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + context.startActivity(intent) + }, + modifier = Modifier.size(28.dp) + ) { + Icon( + painter = logoPainter, + contentDescription = null, + tint = MaterialTheme.colorScheme.secondary + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt index 3196263..2c03c84 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/components/Widgets.kt @@ -619,40 +619,6 @@ fun HtmlText(text: String, modifier: Modifier = Modifier, color: Color = Color.U ) } -@Composable -fun CircleBackgroundColorImage( - size: Dp, - backgroundColor: Color, - painter: Painter, - modifier: Modifier = Modifier, - imageSize: DpSize? = null, - imageAlignment: Alignment = Alignment.Center, - contentDescription: String? = null, - colorFilter: ColorFilter? = null -) { - Box( - modifier = modifier - .clip(CircleShape) - .size(size) - .background(color = backgroundColor) - ) { - val mod = if (imageSize != null) { - Modifier - .align(imageAlignment) - .size(size = imageSize) - } else { - Modifier.align(imageAlignment) - } - Image( - contentDescription = contentDescription, - modifier = mod, - colorFilter = colorFilter, - painter = painter, - contentScale = ContentScale.FillBounds - ) - } -} - @Composable fun CircleBackgroundColorImage( size: Dp, @@ -1090,7 +1056,7 @@ fun SearchBar( placeHolder = stringResource(id = R.string.search_placeholder, placeholder), leadingIcon = { Image( - painter = painterResource(id = R.drawable.ic_search), + imageVector = Icons.Filled.Search, contentDescription = stringResource(R.string.search_icon_content_descriptor), colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.primary) ) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt index 0494139..820be9a 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/navigation/HomeScreenNavigation.kt @@ -1,9 +1,15 @@ package com.owenlejeune.tvtime.ui.navigation import androidx.compose.foundation.layout.RowScope +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Face +import androidx.compose.material.icons.outlined.Movie +import androidx.compose.material.icons.outlined.Person +import androidx.compose.material.icons.outlined.Tv import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.graphics.vector.ImageVector import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -62,7 +68,7 @@ fun HomeScreenNavHost( sealed class HomeScreenNavItem( stringRes: Int, - val icon: Int, + val icon: ImageVector, val route: String, private val orderGetter: (AppPreferences) -> Int, private val orderSetter: (AppPreferences, Int) -> Unit @@ -97,21 +103,21 @@ sealed class HomeScreenNavItem( object Movies: HomeScreenNavItem( R.string.nav_movies_title, - R.drawable.ic_movie, + Icons.Outlined.Movie, "movies_route", { it.moviesTabPosition }, { p, i -> p.moviesTabPosition = i } ) object TV: HomeScreenNavItem( R.string.nav_tv_title, - R.drawable.ic_tv, + Icons.Outlined.Tv, "tv_route", { it.tvTabPosition }, { p, i -> p.tvTabPosition = i } ) object Account: HomeScreenNavItem( R.string.nav_account_title, - R.drawable.ic_person, + Icons.Outlined.Person, "account_route", { // if (SessionManager.currentSession.value?.isAuthorized == true) { @@ -124,7 +130,7 @@ sealed class HomeScreenNavItem( ) object People: HomeScreenNavItem( R.string.nav_people_title, - R.drawable.ic_face, + Icons.Outlined.Face, "people_route", { it.peopleTabPosition }, { p, i -> p.peopleTabPosition = i } diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt index 17f0e87..b08c60d 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/HomeScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.NavigationRailDefaults import androidx.compose.material.Scaffold import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -19,8 +20,10 @@ import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.NavigationRail import androidx.compose.material3.NavigationRailItem +import androidx.compose.material3.NavigationRailItemDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior @@ -35,7 +38,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.NavHostController @@ -161,7 +163,7 @@ private fun BottomNavBar( modifier = Modifier .padding(4.dp) .clip(RoundedCornerShape(24.dp)), - icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, + icon = { Icon(imageVector = item.icon, contentDescription = null) }, label = { val name = if (preferences.showBottomTabLabels) item.name else " " Text(text = name) @@ -171,7 +173,11 @@ private fun BottomNavBar( if (!isSelected) { navController.navigateInBottomBar(item.route) } - } + }, + colors = NavigationBarItemDefaults.colors( + indicatorColor = MaterialTheme.colorScheme.secondary, + selectedIconColor = MaterialTheme.colorScheme.onSecondary + ) ) } } @@ -252,14 +258,15 @@ private fun DualColumnMainContent( HomeScreenNavItem.SortedItems.forEachIndexed { index, item -> val isSelected = currentRoute == item.route NavigationRailItem( - icon = { Icon(painter = painterResource(id = item.icon), contentDescription = null) }, + icon = { Icon(imageVector = item.icon, contentDescription = null) }, label = { if (preferences.showBottomTabLabels) Text(item.name) }, selected = isSelected, onClick = { if (!isSelected) { navController.navigateInBottomBar(item.route) } - } + }, + colors = NavigationRailItemDefaults.colors(indicatorColor = MaterialTheme.colorScheme.secondary) ) if (index < HomeScreenNavItem.SortedItems.size - 1) { Spacer(modifier = Modifier.height(20.dp)) diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt index 32bfa7b..b9c48cc 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/ListDetailScreen.kt @@ -12,7 +12,11 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons 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.Favorite +import androidx.compose.material.icons.filled.Star import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -573,7 +577,7 @@ private fun ActionButtonRow(listItem: ListItem) { ActionButton( itemId = listItem.id, type = listItem.mediaType, - iconRes = R.drawable.ic_favorite, + imageVector = Icons.Filled.Favorite, contentDescription = stringResource(id = R.string.favourite_label), isSelected = isFavourited, filledIconColor = FavoriteSelected, @@ -583,7 +587,7 @@ private fun ActionButtonRow(listItem: ListItem) { ActionButton( itemId = listItem.id, type = listItem.mediaType, - iconRes = R.drawable.ic_watchlist, + imageVector = Icons.Filled.Bookmark, contentDescription = "", isSelected = isWatchlisted, filledIconColor = WatchlistSelected, @@ -594,7 +598,7 @@ private fun ActionButtonRow(listItem: ListItem) { ActionButton( itemId = listItem.id, type = listItem.mediaType, - iconRes = R.drawable.ic_rating_star, + imageVector = Icons.Filled.Star, contentDescription = "", isSelected = isRated, filledIconColor = RatingSelected, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt index fd7b6b1..11c2df3 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/MediaDetailScreen.kt @@ -20,6 +20,10 @@ import androidx.compose.material.icons.filled.Send import androidx.compose.material.icons.outlined.ExpandMore import androidx.compose.material3.* import androidx.compose.material.TabRow +import androidx.compose.material.icons.filled.Bookmark +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.List +import androidx.compose.material.icons.filled.Star import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -27,6 +31,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext @@ -188,6 +193,8 @@ private fun MediaViewContent( showImageGallery: MutableState, pagerState: PagerState ) { + val scope = rememberCoroutineScope() + Row( modifier = Modifier .background(color = MaterialTheme.colorScheme.background), @@ -219,6 +226,22 @@ private fun MediaViewContent( MiscTvDetails(mediaItem = mediaItem, service as TvService) } + val externalIds = remember { mutableStateOf(null) } + LaunchedEffect(Unit) { + scope.launch { + val response = service.getExternalIds(itemId!!) + if (response.isSuccessful) { + externalIds.value = response.body()!! + } + } + } + externalIds.value?.let { + ExternalIdsArea( + externalIds = it, + modifier = Modifier.padding(start = 20.dp) + ) + } + ActionsView(itemId = itemId, type = type, service = service) if (type == MediaViewType.MOVIE) { @@ -587,7 +610,7 @@ fun ActionButton( modifier: Modifier = Modifier, itemId: Int, type: MediaViewType, - iconRes: Int, + imageVector: ImageVector, contentDescription: String, isSelected: Boolean, filledIconColor: Color, @@ -628,7 +651,7 @@ fun ActionButton( modifier = Modifier .clip(CircleShape) .align(Alignment.Center), - painter = painterResource(id = iconRes), + imageVector = imageVector, contentDescription = contentDescription, tint = tintColor.value ) @@ -685,7 +708,7 @@ private fun RateButton( modifier = Modifier .clip(CircleShape) .align(Alignment.Center), - painter = painterResource(id = R.drawable.ic_rating_star), + imageVector = Icons.Filled.Star, contentDescription = "", tint = tintColor.value ) @@ -727,7 +750,7 @@ fun WatchlistButton( modifier = modifier, itemId = itemId, type = type, - iconRes = R.drawable.ic_watchlist, + imageVector = Icons.Filled.Bookmark, contentDescription = "", isSelected = hasWatchlistedItem, filledIconColor = WatchlistSelected, @@ -760,7 +783,7 @@ fun ListButton( ), size = 40.dp, backgroundColor = MaterialTheme.colorScheme.actionButtonColor, - painter = painterResource(id = R.drawable.ic_add_to_list), + image = Icons.Filled.List, colorFilter = ColorFilter.tint(color = /*if (hasWatchlistedItem.value) WatchlistSelected else*/ MaterialTheme.colorScheme.background), contentDescription = "" ) @@ -786,7 +809,7 @@ fun FavoriteButton( modifier = modifier, itemId = itemId, type = type, - iconRes = R.drawable.ic_favorite, + imageVector = Icons.Filled.Favorite, contentDescription = "", isSelected = isFavourited, filledIconColor = FavoriteSelected, diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt index 6ead2df..e9e8594 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/PeopleDetailScreen.kt @@ -10,9 +10,11 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource @@ -24,10 +26,12 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailPerson +import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ExternalIds import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse import com.owenlejeune.tvtime.ui.components.ContentCard import com.owenlejeune.tvtime.ui.components.DetailHeader import com.owenlejeune.tvtime.ui.components.ExpandableContentCard +import com.owenlejeune.tvtime.ui.components.ExternalIdsArea import com.owenlejeune.tvtime.ui.components.TwoLineImageTextCard import com.owenlejeune.tvtime.ui.navigation.AppNavItem import com.owenlejeune.tvtime.utils.TmdbUtils @@ -83,6 +87,8 @@ fun PersonDetailScreen( ) } ) { innerPadding -> + val scope = rememberCoroutineScope() + Box(modifier = Modifier.padding(innerPadding)) { Column( modifier = Modifier @@ -98,6 +104,22 @@ fun PersonDetailScreen( BiographyCard(person = person.value) + val externalIds = remember { mutableStateOf(null) } + LaunchedEffect(Unit) { + scope.launch { + val response = PeopleService().getExternalIds(personId!!) + if (response.isSuccessful) { + externalIds.value = response.body()!! + } + } + } + externalIds.value?.let { + ExternalIdsArea( + externalIds = it, + modifier = Modifier.padding(start = 4.dp) + ) + } + val credits = remember { mutableStateOf(null) } personId?.let { if (credits.value == null) { diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/onboarding/OnboardingPage.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/onboarding/OnboardingPage.kt index ade96f1..ce3179a 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/screens/onboarding/OnboardingPage.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/screens/onboarding/OnboardingPage.kt @@ -4,15 +4,12 @@ import android.os.Build import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Brightness6 diff --git a/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt b/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt index c3d5279..92312cc 100644 --- a/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt +++ b/app/src/main/java/com/owenlejeune/tvtime/ui/views/HomeTabRecyclerAdapter.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.recyclerview.widget.RecyclerView @@ -75,7 +74,7 @@ class HomeTabRecyclerAdapter: RecyclerView.Adapter 0) { val text = String(buffer, 0, bytesRead) sb.append(text) diff --git a/app/src/main/res/drawable/facebook_logo.xml b/app/src/main/res/drawable/facebook_logo.xml new file mode 100644 index 0000000..45a6a66 --- /dev/null +++ b/app/src/main/res/drawable/facebook_logo.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_to_list.xml b/app/src/main/res/drawable/ic_add_to_list.xml deleted file mode 100644 index 1f7cbc5..0000000 --- a/app/src/main/res/drawable/ic_add_to_list.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml deleted file mode 100644 index 2a31b2e..0000000 --- a/app/src/main/res/drawable/ic_back.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_broken_image.xml b/app/src/main/res/drawable/ic_broken_image.xml deleted file mode 100644 index ad5cdbe..0000000 --- a/app/src/main/res/drawable/ic_broken_image.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_face.xml b/app/src/main/res/drawable/ic_face.xml deleted file mode 100644 index eed089b..0000000 --- a/app/src/main/res/drawable/ic_face.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_favorite.xml b/app/src/main/res/drawable/ic_favorite.xml deleted file mode 100644 index 20a157a..0000000 --- a/app/src/main/res/drawable/ic_favorite.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_movie.xml b/app/src/main/res/drawable/ic_movie.xml deleted file mode 100644 index aadc4cb..0000000 --- a/app/src/main/res/drawable/ic_movie.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml deleted file mode 100644 index 6bdced2..0000000 --- a/app/src/main/res/drawable/ic_person.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_rating_star.xml b/app/src/main/res/drawable/ic_rating_star.xml deleted file mode 100644 index 3383294..0000000 --- a/app/src/main/res/drawable/ic_rating_star.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index b86b554..0000000 --- a/app/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_tv.xml b/app/src/main/res/drawable/ic_tv.xml deleted file mode 100644 index daa4262..0000000 --- a/app/src/main/res/drawable/ic_tv.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_watchlist.xml b/app/src/main/res/drawable/ic_watchlist.xml deleted file mode 100644 index 7e480e2..0000000 --- a/app/src/main/res/drawable/ic_watchlist.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/instagram_logo.xml b/app/src/main/res/drawable/instagram_logo.xml new file mode 100644 index 0000000..ddc1759 --- /dev/null +++ b/app/src/main/res/drawable/instagram_logo.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/no_person_photo.xml b/app/src/main/res/drawable/no_person_photo.xml deleted file mode 100644 index c2fa6fb..0000000 --- a/app/src/main/res/drawable/no_person_photo.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tiktok_logo.xml b/app/src/main/res/drawable/tiktok_logo.xml new file mode 100644 index 0000000..f8373a2 --- /dev/null +++ b/app/src/main/res/drawable/tiktok_logo.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/twitter_logo.xml b/app/src/main/res/drawable/twitter_logo.xml new file mode 100644 index 0000000..b84a9e8 --- /dev/null +++ b/app/src/main/res/drawable/twitter_logo.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/youtube_logo.xml b/app/src/main/res/drawable/youtube_logo.xml new file mode 100644 index 0000000..f84ef9f --- /dev/null +++ b/app/src/main/res/drawable/youtube_logo.xml @@ -0,0 +1,9 @@ + + +