Skip to content
Merged
3 changes: 3 additions & 0 deletions api/anilist/src/main/graphql/fragments/MediaTracking.graphql
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
fragment MediaTracking on Media {
id
type
coverImage {
large
color
}
bannerImage
title {
userPreferred
romaji
Expand Down
6 changes: 3 additions & 3 deletions api/anilist/src/main/graphql/fragments/User.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ fragment User on User {
}
}
favourites {
anime(page: 0, perPage: 10) {
anime(page: 0, perPage: 25) {
nodes {
...MediaSmall
}
}
manga(page: 0, perPage: 10) {
manga(page: 0, perPage: 25) {
nodes {
...MediaSmall
}
}
characters(page: 0, perPage: 10) {
characters(page: 0, perPage: 25) {
nodes {
...CharacterSmall
}
Expand Down
1 change: 1 addition & 0 deletions api/anilist/src/main/graphql/queries/UserQuery.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ query UserMediaListQuery($userId: Int, $type: MediaType) {
lists {
name
entries {
status
progress
score(format: POINT_10_DECIMAL)
media {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.imashnake.animite.api.anilist.sanitize.media.Media.Season.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.media.Media.Source.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.media.Media.Status.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.profile.User.TrackingStatus
import com.imashnake.animite.api.anilist.type.CharacterRole
import com.imashnake.animite.api.anilist.type.MediaFormat
import com.imashnake.animite.api.anilist.type.MediaRankType
Expand Down Expand Up @@ -721,22 +722,28 @@
data class Tracking(
val id: Int,
val coverImage: String?,
val bannerImage: String?,
val color: String?,
val title: String?,
val season: Season?,
val seasonYear: Int?,
val format: Format?,
val segments: Int?,
val progress: Int?,
val score: Score?,
val status: TrackingStatus,
) {
internal constructor(
query: MediaTracking,
progress: Int?,
score: Float?,
status: TrackingStatus,
language: Language
) : this(
id = query.id,
coverImage = query.coverImage?.large,
bannerImage = query.bannerImage,
color = query.coverImage?.color,
title = when (language) {
Language.DEFAULT -> query.title?.userPreferred
Language.ROMAJI -> query.title?.romaji
Expand All @@ -748,7 +755,8 @@
format = query.format?.sanitize(),
segments = query.episodes ?: query.nextAiringEpisode?.episode ?: query.chapters,
progress = progress,
score = score?.let { Score(it) }
score = score?.let { Score(it) },
status = status
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import com.imashnake.animite.api.anilist.sanitize.media.Media
import com.imashnake.animite.api.anilist.sanitize.media.Media.Language
import com.imashnake.animite.api.anilist.sanitize.media.Media.Small.Type
import com.imashnake.animite.api.anilist.sanitize.profile.User.ListNames.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.profile.User.TrackingStatus.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.profile.User.TrackingStatus.Companion.toTrackingStatus
import com.imashnake.animite.api.anilist.type.MediaListStatus
import com.imashnake.animite.api.anilist.type.MediaType
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
Expand Down Expand Up @@ -89,7 +91,7 @@
@Immutable
data class NamedTrackingList(
val name: String?,
val existingListName: ListNames?,
val existingListName: TrackingStatus?,
val list: ImmutableList<Media.Tracking>,
) {
internal constructor(
Expand All @@ -103,7 +105,12 @@
query = it?.media?.mediaTracking ?: return@mapNotNull null,
progress = it.progress,
score = it.score?.toFloat(),
language = language
language = language,
status = it.status.toTrackingStatus(
type = it.media.mediaTracking.type?.name?.let { type ->
Type.valueOf(type)
} ?: Type.UNKNOWN
)
)
}.toImmutableList()
)
Expand Down Expand Up @@ -212,31 +219,43 @@
Characters,
}

enum class ListNames {
enum class TrackingStatus {
// Anime lists
WATCHING,
COMPLETED,
PAUSED,
DROPPED,
REWATCHING,
PLANNING,
PLAN_TO_WATCH,

// Manga lists
READING,
REREADING,
PLAN_TO_READ,

PLANNING,

CUSTOM_OR_UNKNOWN;

companion object {
fun safeValueOf(rawValue: String?): ListNames = try {
ListNames.valueOf(rawValue?.uppercase().toString())
fun safeValueOf(rawValue: String?): TrackingStatus = try {
TrackingStatus.valueOf(rawValue?.uppercase().toString())
} catch (e: IllegalArgumentException) {
Log.e(EXCEPTION_TAG, "safeValueOf: $e; Format $rawValue not found.")
CUSTOM_OR_UNKNOWN
}

fun String?.sanitize() = safeValueOf(this)

fun MediaListStatus?.toTrackingStatus(type: Type): TrackingStatus = when (this) {
MediaListStatus.CURRENT -> if (type == Type.ANIME) WATCHING else READING
MediaListStatus.PLANNING -> if (type == Type.ANIME) PLAN_TO_WATCH else PLAN_TO_READ
MediaListStatus.COMPLETED -> COMPLETED
MediaListStatus.DROPPED -> DROPPED
MediaListStatus.PAUSED -> PAUSED
MediaListStatus.REPEATING -> if (type == Type.ANIME) REWATCHING else REREADING
else -> CUSTOM_OR_UNKNOWN
}
}
}

Expand Down
18 changes: 1 addition & 17 deletions app/src/main/kotlin/com/imashnake/animite/theme/Theme.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ package com.imashnake.animite.theme

import android.os.Build
import androidx.compose.animation.core.tween
import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.LocalRippleConfiguration
import androidx.compose.material3.MaterialExpressiveTheme
import androidx.compose.material3.MaterialTheme
Expand Down Expand Up @@ -32,12 +29,7 @@ import com.materialkolor.ktx.animateColorScheme
import com.materialkolor.rememberDynamicColorScheme
import kotlinx.datetime.LocalTime
import kotlin.math.floor
import kotlin.time.ExperimentalTime

@OptIn(
ExperimentalMaterial3Api::class,
ExperimentalMaterial3ExpressiveApi::class, ExperimentalTime::class,
)
@Composable
fun AnimiteTheme(
paddings: Paddings = rememberDefaultPaddings(),
Expand Down Expand Up @@ -92,15 +84,7 @@ fun AnimiteTheme(
}.modify(useDarkTheme, isAmoled)
}

val animiteRippleTheme = RippleConfiguration(
color = MaterialTheme.colorScheme.primary,
rippleAlpha = RippleAlpha(
draggedAlpha = 0.16f,
focusedAlpha = 0.12f,
hoveredAlpha = 0.08f,
pressedAlpha = 0.12f,
)
)
val animiteRippleTheme = RippleConfiguration(color = MaterialTheme.colorScheme.primary)

MaterialExpressiveTheme(
colorScheme = animateColorScheme(animiteColorScheme, animationSpec = { tween(500) }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ import com.imashnake.animite.profile.tabs.AboutTab
import com.imashnake.animite.profile.tabs.FavouritesTab
import com.imashnake.animite.profile.tabs.MediaTab
import com.imashnake.animite.profile.tabs.ProfileTab
import com.imashnake.animite.profile.ui.Login
import com.imashnake.animite.settings.SettingsPage
import com.mikepenz.markdown.coil3.Coil3ImageTransformerImpl
import com.mikepenz.markdown.m3.Markdown
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,39 @@
package com.imashnake.animite.profile.dev

import com.imashnake.animite.api.anilist.sanitize.profile.User.ListNames
import com.imashnake.animite.api.anilist.sanitize.profile.User.TrackingStatus
import com.imashnake.animite.profile.R
import com.imashnake.animite.media.R as mediaR
import com.imashnake.animite.navigation.R as navigationR

val ListNames.res get() = when(this) {
ListNames.WATCHING -> navigationR.drawable.anime
ListNames.COMPLETED -> mediaR.drawable.finished
ListNames.PAUSED -> mediaR.drawable.hiatus
ListNames.DROPPED -> mediaR.drawable.cancelled
ListNames.REWATCHING -> R.drawable.rewatch_list
ListNames.PLANNING -> mediaR.drawable.not_yet_released
val TrackingStatus.res get() = when(this) {
TrackingStatus.WATCHING -> navigationR.drawable.anime
TrackingStatus.COMPLETED -> mediaR.drawable.finished
TrackingStatus.PAUSED -> mediaR.drawable.hiatus
TrackingStatus.DROPPED -> mediaR.drawable.cancelled
TrackingStatus.REWATCHING -> R.drawable.rewatch_list
TrackingStatus.PLAN_TO_WATCH -> mediaR.drawable.not_yet_released

ListNames.READING -> R.drawable.reading_list
ListNames.REREADING -> R.drawable.rewatch_list
ListNames.PLAN_TO_READ -> mediaR.drawable.not_yet_released
TrackingStatus.READING -> R.drawable.reading_list
TrackingStatus.REREADING -> R.drawable.rewatch_list
TrackingStatus.PLAN_TO_READ -> mediaR.drawable.not_yet_released

ListNames.CUSTOM_OR_UNKNOWN -> R.drawable.custom_list
TrackingStatus.PLANNING -> mediaR.drawable.not_yet_released

TrackingStatus.CUSTOM_OR_UNKNOWN -> R.drawable.custom_list
}

val TrackingStatus.title get() = when(this) {
TrackingStatus.WATCHING -> R.string.watching
TrackingStatus.COMPLETED -> R.string.completed
TrackingStatus.PAUSED -> R.string.paused
TrackingStatus.DROPPED -> R.string.dropped
TrackingStatus.REWATCHING -> R.string.rewatching
TrackingStatus.PLAN_TO_WATCH -> R.string.plan_to_watch

TrackingStatus.READING -> R.string.reading
TrackingStatus.REREADING -> R.string.rereading
TrackingStatus.PLAN_TO_READ -> R.string.plan_to_read

TrackingStatus.PLANNING,
TrackingStatus.CUSTOM_OR_UNKNOWN -> R.string.unknown
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.imashnake.animite.profile
package com.imashnake.animite.profile.ui

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
Expand All @@ -17,6 +17,7 @@ import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import com.imashnake.animite.core.ui.LocalPaddings
import com.imashnake.animite.profile.R
import com.imashnake.animite.profile.dev.ANILIST_AUTH_URL

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -58,7 +59,7 @@
import androidx.compose.ui.util.fastMapNotNull
import com.imashnake.animite.api.anilist.sanitize.media.Media
import com.imashnake.animite.api.anilist.sanitize.profile.User
import com.imashnake.animite.api.anilist.sanitize.profile.User.ListNames.Companion.sanitize
import com.imashnake.animite.api.anilist.sanitize.profile.User.TrackingStatus.Companion.sanitize
import com.imashnake.animite.core.ui.LocalPaddings
import com.imashnake.animite.core.ui.component.Divider
import com.imashnake.animite.core.ui.component.DropDownIcon
Expand Down Expand Up @@ -358,13 +359,21 @@
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
private fun MediaTrackingItem(
listName: User.ListNames,
listName: User.TrackingStatus,
item: Media.Tracking,
useExpressiveProgressIndicator: Boolean,
onClick: (Int, String?) -> Unit,
modifier: Modifier = Modifier
) {
Row(modifier = modifier.clickable { onClick(item.id, item.title) }) {
var isUpdateEntryDialogVisible by remember { mutableStateOf(false) }

Row(
modifier = modifier.combinedClickable(
onClick = { onClick(item.id, item.title) },
// TODO: Add this after the point system is corrected.
// onLongClick = { isUpdateEntryDialogVisible = true }
)
) {
MediaTrackingCard(
image = item.coverImage,
tag = null,
Expand Down Expand Up @@ -439,7 +448,7 @@

if (segments != null && progress != null) {
val formattedProgress = progress
.takeUnless { listName == User.ListNames.COMPLETED }
.takeUnless { listName == User.TrackingStatus.COMPLETED }
?.let { "$it/$segments" }
?: "$segments"

Expand All @@ -456,10 +465,10 @@
)

when (listName) {
User.ListNames.WATCHING,
User.ListNames.REWATCHING,
User.ListNames.READING,
User.ListNames.REREADING -> if (useExpressiveProgressIndicator) {
User.TrackingStatus.WATCHING,
User.TrackingStatus.REWATCHING,
User.TrackingStatus.READING,
User.TrackingStatus.REREADING -> if (useExpressiveProgressIndicator) {
LinearWavyProgressIndicator(
progress = { progress.toFloat() / segments },
amplitude = { if (it <= 0.1f || it >= 0.95f) 0f else 0.5f },
Expand All @@ -481,4 +490,11 @@
}
}
}

if (isUpdateEntryDialogVisible) {
UpdateEntryDialog(
item = item,
onDismissRequest = { isUpdateEntryDialogVisible = false }
)
}
}
Loading
Loading