update anime stuff according to pr17

This commit is contained in:
jmir1 2021-05-22 22:36:45 +02:00
parent af584a403f
commit 4e9c0b740e
26 changed files with 182 additions and 96 deletions

View file

@ -21,12 +21,14 @@ import eu.kanade.tachiyomi.data.download.DownloadService
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.AnimeSourceManager
import eu.kanade.tachiyomi.source.model.SAnime
import eu.kanade.tachiyomi.source.model.toSAnime
import eu.kanade.tachiyomi.source.model.toSEpisode
import eu.kanade.tachiyomi.util.episode.NoEpisodesException
import eu.kanade.tachiyomi.util.episode.syncEpisodesWithSource
import eu.kanade.tachiyomi.util.episode.syncEpisodesWithTrackServiceTwoWay
import eu.kanade.tachiyomi.util.prepUpdateCover
import eu.kanade.tachiyomi.util.shouldDownloadNewEpisodes
import eu.kanade.tachiyomi.util.storage.getUriCompat
@ -413,8 +415,12 @@ class AnimelibUpdateService(
val service = trackManager.getService(track.sync_id)
if (service != null && service in loggedServices) {
try {
val updatedTrack = service.refreshAnime(track)
val updatedTrack = service.refresh(track)
db.insertTrack(updatedTrack).executeAsBlocking()
if (service is UnattendedTrackService) {
syncEpisodesWithTrackServiceTwoWay(db, db.getEpisodes(anime).executeAsBlocking(), track, service)
}
} catch (e: Throwable) {
// Ignore errors and continue
Timber.e(e)

View file

@ -52,15 +52,15 @@ abstract class TrackService(val id: Int) {
abstract suspend fun add(track: Track): Track
abstract suspend fun addAnime(track: AnimeTrack): AnimeTrack
abstract suspend fun add(track: AnimeTrack): AnimeTrack
abstract suspend fun update(track: Track): Track
abstract suspend fun updateAnime(track: AnimeTrack): AnimeTrack
abstract suspend fun update(track: AnimeTrack): AnimeTrack
abstract suspend fun bind(track: Track): Track
abstract suspend fun bindAnime(track: AnimeTrack): AnimeTrack
abstract suspend fun bind(track: AnimeTrack): AnimeTrack
abstract suspend fun search(query: String): List<TrackSearch>
@ -68,7 +68,7 @@ abstract class TrackService(val id: Int) {
abstract suspend fun refresh(track: Track): Track
abstract suspend fun refreshAnime(track: AnimeTrack): AnimeTrack
abstract suspend fun refresh(track: AnimeTrack): AnimeTrack
abstract suspend fun login(username: String, password: String)

View file

@ -155,7 +155,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
return api.addLibManga(track)
}
override suspend fun addAnime(track: AnimeTrack): AnimeTrack {
override suspend fun add(track: AnimeTrack): AnimeTrack {
return api.addLibAnime(track)
}
@ -170,7 +170,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
return api.updateLibManga(track)
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack {
override suspend fun update(track: AnimeTrack): AnimeTrack {
// If user was using API v1 fetch library_id
if (track.library_id == null || track.library_id!! == 0L) {
val libManga = api.findLibAnime(track, getUsername().toInt())
@ -195,17 +195,17 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
}
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack {
override suspend fun bind(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.findLibAnime(track, getUsername().toInt())
return if (remoteTrack != null) {
track.copyPersonalFrom(remoteTrack)
track.library_id = remoteTrack.library_id
updateAnime(track)
update(track)
} else {
// Set default fields if it's not found in the list
track.status = READING
track.score = 0F
addAnime(track)
add(track)
}
}
@ -224,7 +224,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
return track
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.getLibAnime(track, getUsername().toInt())
track.copyPersonalFrom(remoteTrack)
track.total_episodes = remoteTrack.total_episodes

View file

@ -41,7 +41,7 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
return api.addLibManga(track)
}
override suspend fun addAnime(track: AnimeTrack): AnimeTrack {
override suspend fun add(track: AnimeTrack): AnimeTrack {
return api.addLibAnime(track)
}
@ -49,7 +49,7 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
return api.updateLibManga(track)
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack {
override suspend fun update(track: AnimeTrack): AnimeTrack {
return api.updateLibAnime(track)
}
@ -73,7 +73,7 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
}
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack {
override suspend fun bind(track: AnimeTrack): AnimeTrack {
val statusTrack = api.statusLibAnime(track)
val remoteTrack = api.findLibAnime(track)
return if (remoteTrack != null && statusTrack != null) {
@ -83,13 +83,13 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
track.score = statusTrack.score
track.last_episode_seen = statusTrack.last_episode_seen
track.total_episodes = remoteTrack.total_episodes
refreshAnime(track)
refresh(track)
} else {
// Set default fields if it's not found in the list
track.status = READING
track.score = 0F
addAnime(track)
updateAnime(track)
add(track)
update(track)
}
}
@ -110,7 +110,7 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
return track
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
val remoteStatusTrack = api.statusLibAnime(track)
track.copyPersonalFrom(remoteStatusTrack!!)
api.findLibAnime(track)?.let { remoteTrack ->

View file

@ -78,7 +78,7 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
return api.addLibManga(track, getUserId())
}
override suspend fun addAnime(track: AnimeTrack): AnimeTrack {
override suspend fun add(track: AnimeTrack): AnimeTrack {
return api.addLibAnime(track, getUserId())
}
@ -86,7 +86,7 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
return api.updateLibManga(track)
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack {
override suspend fun update(track: AnimeTrack): AnimeTrack {
return api.updateLibAnime(track)
}
@ -103,16 +103,16 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
}
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack {
override suspend fun bind(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.findLibAnime(track, getUserId())
return if (remoteTrack != null) {
track.copyPersonalFrom(remoteTrack)
track.media_id = remoteTrack.media_id
updateAnime(track)
update(track)
} else {
track.status = READING
track.score = 0F
addAnime(track)
add(track)
}
}
@ -131,7 +131,7 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
return track
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.getLibAnime(track)
track.copyPersonalFrom(remoteTrack)
track.total_episodes = remoteTrack.total_episodes

View file

@ -62,19 +62,19 @@ class Komga(private val context: Context, id: Int) : TrackService(id), Unattende
override suspend fun add(track: Track): Track = throw Exception("Not used")
override suspend fun addAnime(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun add(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun update(track: Track): Track {
return api.updateProgress(track)
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun update(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun bind(track: Track): Track {
return track
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun bind(track: AnimeTrack): AnimeTrack = throw Exception("Not used")
override suspend fun search(query: String): List<TrackSearch> = throw Exception("Not used")
@ -87,7 +87,7 @@ class Komga(private val context: Context, id: Int) : TrackService(id), Unattende
return track
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
TODO("Not yet implemented")
}

View file

@ -78,7 +78,7 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
return api.updateItem(track)
}
override suspend fun addAnime(track: AnimeTrack): AnimeTrack {
override suspend fun add(track: AnimeTrack): AnimeTrack {
track.status = READING
track.score = 0F
return api.updateItem(track)
@ -88,7 +88,7 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
return api.updateItem(track)
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack {
override suspend fun update(track: AnimeTrack): AnimeTrack {
return api.updateItem(track)
}
@ -103,14 +103,14 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
}
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack {
override suspend fun bind(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.findListItem(track)
return if (remoteTrack != null) {
track.copyPersonalFrom(remoteTrack)
track.media_id = remoteTrack.media_id
updateAnime(track)
update(track)
} else {
addAnime(track)
add(track)
}
}
@ -150,8 +150,8 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
return api.findListItem(track) ?: add(track)
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
return api.findListItem(track) ?: addAnime(track)
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
return api.findListItem(track) ?: add(track)
}
override suspend fun login(username: String, password: String) = login(password)

View file

@ -50,7 +50,7 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
return api.addLibManga(track, getUsername())
}
override suspend fun addAnime(track: AnimeTrack): AnimeTrack {
override suspend fun add(track: AnimeTrack): AnimeTrack {
return api.addLibAnime(track, getUsername())
}
@ -58,7 +58,7 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
return api.updateLibManga(track, getUsername())
}
override suspend fun updateAnime(track: AnimeTrack): AnimeTrack {
override suspend fun update(track: AnimeTrack): AnimeTrack {
return api.updateLibAnime(track, getUsername())
}
@ -76,17 +76,17 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
}
}
override suspend fun bindAnime(track: AnimeTrack): AnimeTrack {
override suspend fun bind(track: AnimeTrack): AnimeTrack {
val remoteTrack = api.findLibAnime(track, getUsername())
return if (remoteTrack != null) {
track.copyPersonalFrom(remoteTrack)
track.library_id = remoteTrack.library_id
updateAnime(track)
update(track)
} else {
// Set default fields if it's not found in the list
track.status = READING
track.score = 0F
addAnime(track)
add(track)
}
}
@ -106,7 +106,7 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
return track
}
override suspend fun refreshAnime(track: AnimeTrack): AnimeTrack {
override suspend fun refresh(track: AnimeTrack): AnimeTrack {
api.findLibAnime(track, getUsername())?.let { remoteTrack ->
track.copyPersonalFrom(remoteTrack)
track.total_episodes = remoteTrack.total_episodes

View file

@ -36,6 +36,8 @@ import eu.kanade.tachiyomi.data.database.models.Episode
import eu.kanade.tachiyomi.data.download.DownloadService
import eu.kanade.tachiyomi.data.download.model.AnimeDownload
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch
import eu.kanade.tachiyomi.databinding.AnimeControllerBinding
import eu.kanade.tachiyomi.source.AnimeSource
@ -71,6 +73,7 @@ import eu.kanade.tachiyomi.ui.watcher.WatcherActivity
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.episode.NoEpisodesException
import eu.kanade.tachiyomi.util.hasCustomCover
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.toast
@ -504,6 +507,24 @@ class AnimeController :
.showDialog(router)
}
}
if (source != null && preferences.autoAddTrack()) {
presenter.trackList
.map { it.service }
.filterIsInstance<UnattendedTrackService>()
.filter { it.accept(source!!) }
.forEach { service ->
launchIO {
try {
service.match(anime)?.let { track ->
presenter.registerTracking(track, service as TrackService)
}
} catch (e: Exception) {
Timber.w(e, "Could not match manga: ${anime.title} with service $service")
}
}
}
}
}
/**

View file

@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.data.download.model.AnimeDownload
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.AnimeSource
import eu.kanade.tachiyomi.source.LocalAnimeSource
import eu.kanade.tachiyomi.source.model.toEpisodeInfo
@ -27,6 +28,7 @@ import eu.kanade.tachiyomi.ui.anime.track.TrackItem
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.episode.EpisodeSettingsHelper
import eu.kanade.tachiyomi.util.episode.syncEpisodesWithSource
import eu.kanade.tachiyomi.util.episode.syncEpisodesWithTrackServiceTwoWay
import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.withUIContext
@ -752,8 +754,12 @@ class AnimePresenter(
.filter { it.track != null }
.map {
async {
val track = it.service.refreshAnime(it.track!!)
val track = it.service.refresh(it.track!!)
db.insertTrack(track).executeAsBlocking()
if (it.service is UnattendedTrackService) {
syncEpisodesWithTrackServiceTwoWay(db, episodes, track, it.service)
}
}
}
.awaitAll()
@ -783,7 +789,7 @@ class AnimePresenter(
item.anime_id = anime.id!!
launchIO {
try {
service.bindAnime(item)
service.bind(item)
db.insertTrack(item).executeAsBlocking()
} catch (e: Throwable) {
withUIContext { view?.applicationContext?.toast(e.message) }
@ -801,7 +807,7 @@ class AnimePresenter(
private fun updateRemote(track: AnimeTrack, service: TrackService) {
launchIO {
try {
service.updateAnime(track)
service.update(track)
db.insertTrack(track).executeAsBlocking()
withUIContext { view?.onTrackingRefreshDone() }
} catch (e: Throwable) {

View file

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.anime.track
import android.annotation.SuppressLint
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import eu.kanade.tachiyomi.R.string
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.TrackItemBinding
import uy.kohesive.injekt.injectLazy
@ -49,6 +50,12 @@ class TrackHolder(private val binding: TrackItemBinding, adapter: TrackAdapter)
if (track.total_episodes > 0) track.total_episodes else "-"
binding.trackStatus.text = item.service.getStatus(track.status)
binding.trackScore.text = if (track.score == 0f) "-" else item.service.displayScore(track)
if (item.service.getScoreList().isEmpty()) {
with(binding.trackScore) {
text = context.getString(string.score_unsupported)
isEnabled = false
}
}
if (item.service.supportsReadingDates) {
binding.trackStartDate.text =

View file

@ -5,16 +5,25 @@ import android.view.LayoutInflater
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.bottomsheet.BottomSheetBehavior
import eu.kanade.tachiyomi.R.string
import eu.kanade.tachiyomi.data.database.models.Anime
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.databinding.TrackControllerBinding
import eu.kanade.tachiyomi.source.AnimeSourceManager
import eu.kanade.tachiyomi.ui.anime.AnimeController
import eu.kanade.tachiyomi.ui.base.controller.openInBrowser
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.widget.sheet.BaseBottomSheetDialog
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class TrackSheet(
val controller: AnimeController,
val anime: Anime
val anime: Anime,
private val sourceManager: AnimeSourceManager = Injekt.get()
) : BaseBottomSheetDialog(controller.activity!!),
TrackAdapter.OnClickListener,
SetTrackStatusDialog.Listener,
@ -41,15 +50,10 @@ class TrackSheet(
adapter.items = controller.presenter.trackList
}
override fun onStart() {
super.onStart()
sheetBehavior.skipCollapsed = true
}
override fun show() {
super.show()
controller.presenter.refreshTrackers()
sheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
sheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
}
fun onNextTrackers(trackers: List<TrackItem>) {
@ -69,7 +73,31 @@ class TrackSheet(
override fun onSetClick(position: Int) {
val item = adapter.getItem(position) ?: return
TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER)
if (item.service is UnattendedTrackService) {
if (item.track != null) {
controller.presenter.unregisterTracking(item.service)
return
}
if (!item.service.accept(sourceManager.getOrStub(anime.source))) {
controller.presenter.view?.applicationContext?.toast(string.source_unsupported)
return
}
launchIO {
try {
item.service.match(anime)?.let { track ->
controller.presenter.registerTracking(track, item.service)
}
?: withUIContext { controller.presenter.view?.applicationContext?.toast(string.error_no_match) }
} catch (e: Exception) {
withUIContext { controller.presenter.view?.applicationContext?.toast(string.error_no_match) }
}
}
} else {
TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER)
}
}
override fun onTitleLongClick(position: Int) {
@ -94,7 +122,7 @@ class TrackSheet(
override fun onScoreClick(position: Int) {
val item = adapter.getItem(position) ?: return
if (item.track == null) return
if (item.track == null || item.service.getScoreList().isEmpty()) return
SetTrackScoreDialog(controller, this, item).showDialog(controller.router)
}

View file

@ -9,6 +9,9 @@ import eu.kanade.tachiyomi.data.database.models.AnimeCategory
import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.toAnimeInfo
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.AnimeCatalogueSource
import eu.kanade.tachiyomi.source.AnimeSourceManager
import eu.kanade.tachiyomi.source.model.Filter
@ -30,6 +33,7 @@ import eu.kanade.tachiyomi.ui.browse.animesource.filter.TextSectionItem
import eu.kanade.tachiyomi.ui.browse.animesource.filter.TriStateItem
import eu.kanade.tachiyomi.ui.browse.animesource.filter.TriStateSectionItem
import eu.kanade.tachiyomi.util.episode.EpisodeSettingsHelper
import eu.kanade.tachiyomi.util.episode.syncEpisodesWithTrackServiceTwoWay
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.removeCovers
@ -102,6 +106,8 @@ open class BrowseAnimeSourcePresenter(
*/
private var pageSubscription: Subscription? = null
private val loggedServices by lazy { Injekt.get<TrackManager>().services.filter { it.isLogged } }
init {
query = searchQuery ?: ""
}
@ -260,11 +266,36 @@ open class BrowseAnimeSourcePresenter(
anime.removeCovers(coverCache)
} else {
EpisodeSettingsHelper.applySettingDefaults(anime)
if (prefs.autoAddTrack()) {
autoAddTrack(anime)
}
}
db.insertAnime(anime).executeAsBlocking()
}
private fun autoAddTrack(anime: Anime) {
loggedServices
.filterIsInstance<UnattendedTrackService>()
.filter { it.accept(source) }
.forEach { service ->
launchIO {
try {
service.match(anime)?.let { track ->
track.anime_id = anime.id!!
(service as TrackService).bind(track)
db.insertTrack(track).executeAsBlocking()
syncEpisodesWithTrackServiceTwoWay(db, db.getEpisodes(anime).executeAsBlocking(), track, service as TrackService)
}
} catch (e: Exception) {
Timber.w(e, "Could not match anime: ${anime.title} with service $service")
}
}
}
}
/**
* Set the filter states for the current source.
*

View file

@ -33,7 +33,7 @@ fun syncEpisodesWithTrackServiceTwoWay(db: AnimeDatabaseHelper, episodes: List<E
launchIO {
try {
service.updateAnime(remoteTrack)
service.update(remoteTrack)
db.insertTrack(remoteTrack).executeAsBlocking()
} catch (e: Throwable) {
Timber.w(e)

View file

@ -8,21 +8,13 @@
android:fillType="evenOdd"
android:pathData="M14.5,7L86.5,7A7,7 0,0 1,93.5 14L93.5,95A7,7 0,0 1,86.5 102L14.5,102A7,7 0,0 1,7.5 95L7.5,14A7,7 0,0 1,14.5 7z" />
<path
android:fillColor="#2E84BF"
android:fillColor="#CE84BF"
android:fillType="evenOdd"
<<<<<<< HEAD
android:fillColor="#CE84BF"/>
=======
android:pathData="M14.5,7L86.5,7A7,7 0,0 1,93.5 14L93.5,95A7,7 0,0 1,86.5 102L14.5,102A7,7 0,0 1,7.5 95L7.5,14A7,7 0,0 1,14.5 7z" />
>>>>>>> pr17
<path
android:fillColor="#69A3CB"
android:fillColor="#C9A3CB"
android:fillType="evenOdd"
<<<<<<< HEAD
android:fillColor="#C9A3CB"/>
=======
android:pathData="M7.5,12.01C7.5,9.24 9.74,7 12.5,7L17.5,7L17.5,102L12.5,102C9.74,102 7.5,99.77 7.5,96.99L7.5,12.01Z" />
>>>>>>> pr17
<path
android:fillColor="#000"
android:fillType="evenOdd"
@ -36,11 +28,7 @@
android:fillType="evenOdd"
android:pathData="M54,54.5m-19.94,0a19.94,19.94 0,1 1,39.87 0a19.94,19.94 0,1 1,-39.87 0" />
<path
<<<<<<< HEAD
android:pathData="M47,41v28l22,-14z"
=======
android:fillColor="#000"
>>>>>>> pr17
android:fillType="evenOdd"
android:pathData="M52.04,46.3L47.42,46.3C46.14,46.3 44.93,46.23 44.2,46.14L44.2,49.76C45,49.65 46.16,49.6 47.42,49.6L60.58,49.6C61.86,49.6 63.02,49.65 63.82,49.76L63.82,46.14C63.09,46.23 61.86,46.3 60.58,46.3L55.69,46.3L55.69,45.07C55.69,44.43 55.73,43.95 55.82,43.45L51.9,43.45C51.99,44 52.04,44.43 52.04,45.07L52.04,46.3ZM46.78,60.68C45.46,60.68 44.29,60.63 43.45,60.52L43.45,64.14C44.34,64.03 45.46,63.98 46.78,63.98L61.29,63.98C62.57,63.98 63.71,64.03 64.57,64.14L64.57,60.52C63.73,60.63 62.57,60.68 61.29,60.68L58.24,60.68C59.33,58.06 59.99,56.23 60.7,53.91C61.34,51.81 61.34,51.81 61.56,51.13L57.58,50.06C57.51,50.93 57.37,51.52 56.89,53.41C56.19,56.14 55.32,58.74 54.5,60.68L46.78,60.68ZM46.48,51.36C47.55,54.02 48.28,56.53 49.03,60.15L52.66,58.9C51.65,54.98 50.92,52.66 49.94,50.11L46.48,51.36Z" />
android:pathData="M47,41v28l22,-14z" />
</vector>

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:background="@drawable/selectable_item_background"
android:paddingStart="16dp"
android:paddingTop="4dp"
android:paddingEnd="12dp"
@ -28,7 +28,7 @@
android:id="@+id/btn_episodes_filter"
android:layout_width="28dp"
android:layout_height="28dp"
android:background="?selectableItemBackgroundBorderless"
android:background="@drawable/ripple_regular"
android:contentDescription="@string/action_filter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View file

@ -11,6 +11,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingTop="4dp"
android:paddingBottom="@dimen/action_toolbar_list_padding"
tools:listitem="@layout/history_item" />

View file

@ -56,7 +56,7 @@
android:id="@+id/remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:background="@drawable/ripple_regular"
android:contentDescription="@string/action_remove"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
@ -69,7 +69,7 @@
android:id="@+id/resume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:background="@drawable/ripple_regular"
android:contentDescription="@string/action_resume"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -142,7 +142,8 @@
app:icon="@drawable/ic_favorite_border_24dp"
app:layout_constraintEnd_toStartOf="@+id/btn_tracking"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/anime_info" />
app:layout_constraintTop_toBottomOf="@+id/anime_info"
app:rippleColor="?attr/rippleColor" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_tracking"
@ -155,6 +156,7 @@
app:layout_constraintEnd_toStartOf="@+id/btn_webview"
app:layout_constraintStart_toEndOf="@+id/btn_favorite"
app:layout_constraintTop_toBottomOf="@+id/anime_info"
app:rippleColor="?attr/rippleColor"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton
@ -169,6 +171,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn_tracking"
app:layout_constraintTop_toBottomOf="@+id/anime_info"
app:rippleColor="?attr/rippleColor"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -42,8 +42,8 @@
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_weight="1"
android:paddingBottom="8dp"
android:clipChildren="false"
android:clipToPadding="false" />
android:clipToPadding="false"
android:paddingBottom="8dp" />
</LinearLayout>

View file

@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
android:layout_height="56dp"
android:layout_gravity="center_vertical"
android:background="@drawable/list_item_selector_background"
android:paddingStart="8dp"
@ -11,8 +11,8 @@
<ImageView
android:id="@+id/thumbnail"
android:layout_width="@dimen/material_component_lists_single_line_with_avatar_height"
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_gravity="center_vertical"
android:padding="8dp"
android:scaleType="centerCrop"

View file

@ -15,6 +15,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingTop="4dp"
android:paddingBottom="@dimen/action_toolbar_list_padding"
tools:listitem="@layout/anime_updates_item" />

View file

@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/material_component_lists_two_line_height"
android:layout_height="56dp"
android:background="@drawable/list_item_selector_background"
android:paddingEnd="4dp">
@ -55,8 +55,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="4dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -4,8 +4,8 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="42dp"
android:layout_height="42dp"
android:padding="8dp"
android:background="?selectableItemBackgroundBorderless">
android:background="@drawable/ripple_regular"
android:padding="8dp">
<ImageView
android:id="@+id/download_icon"
@ -22,7 +22,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="1dp"
android:visibility="gone"
android:progress="100"
app:indicatorColor="?android:attr/textColorHint"
app:indicatorInset="0dp"

View file

@ -10,7 +10,7 @@
android:id="@+id/title_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground">
android:background="@drawable/selectable_item_background">
<TextView
android:id="@+id/title"
@ -46,7 +46,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/label_more"
android:padding="@dimen/material_component_text_fields_padding_above_and_below_label"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
@ -59,9 +59,9 @@
android:id="@+id/no_results_found"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/material_component_text_fields_padding_above_and_below_label"
android:paddingEnd="@dimen/material_component_text_fields_padding_above_and_below_label"
android:paddingBottom="@dimen/material_component_text_fields_padding_above_and_below_label"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/no_results_found"
android:visibility="gone" />

View file

@ -56,13 +56,8 @@
android:id="@+id/remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<<<<<<< HEAD
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/action_remove"
=======
android:background="@drawable/ripple_regular"
android:contentDescription="@string/action_resume"
>>>>>>> pr17
android:contentDescription="@string/action_remove"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/resume"