package Ġeu . kan ade . data . anime history Ċ Ċ import Ġandroidx . paging . Paging Source Ċ import Ġeu . kan ade . data . An ime Database Handler Ċ import Ġeu . kan ade . data . anime . anime Mapper Ċ import Ġeu . kan ade . data . episode . episode Mapper Ċ import Ġeu . kan ade . domain . anime . model . An ime Ċ import Ġeu . kan ade . domain . anime history . model . An ime History Update Ċ import Ġeu . kan ade . domain . anime history . model . An ime History With Relations Ċ import Ġeu . kan ade . domain . anime history . repository . An ime History Repository Ċ import Ġeu . kan ade . domain . episode . model . Episode Ċ import Ġeu . kan ade . t ach iy omi . util . system . log cat Ċ import Ġlog cat . Log Priority Ċ Ċ class ĠAn ime History Repository Impl ( ĊĠĠĠ Ġprivate Ġval Ġhandler : ĠAn ime Database Handler , Ċ ) Ġ: ĠAn ime History Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget History ( query : ĠString ): ĠP aging Source < Long , ĠAn ime History With Relations > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandler . subscribe To Paging Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Query Ġ= Ġ{ Ġan ime history View Queries . count History ( query ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Provider Ġ= Ġ{ Ġlimit , Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan ime history View Queries . anime history ( query , Ġlimit , Ġoffset , Ġan ime history With Relations Mapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetLast History (): ĠAn ime History With Relations ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandler . await One OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan ime history View Queries . get Latest An ime History ( anime history With Relations Mapper ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetNext Episode ( anime Id : ĠLong , Ġepisode Id : ĠLong ): ĠEp isode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġepisode Ġ= Ġhandler . await One Ġ{ Ġepisode s Queries . get Episode ById ( episode Id , Ġepisode Mapper ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġan ime Ġ= Ġhandler . await One Ġ{ Ġan imes Queries . get An ime ById ( anime Id , Ġan ime Mapper ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! episode . seen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġepisode ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsort Function : Ġ( Episode , ĠEp isode ) Ġ-> ĠInt Ġ= Ġwhen Ġ( anime . sorting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ SOURCE Ġ-> Ġ{ Ġc 1 , Ġc 2 Ġ-> Ġc 2 . source Order . compareTo ( c 1 . source Order ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ NUMBER Ġ-> Ġ{ Ġc 1 , Ġc 2 Ġ-> Ġc 1 . episode Number . compareTo ( c 2 . episode Number ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ UPLOAD _ DATE Ġ-> Ġ{ Ġc 1 , Ġc 2 Ġ-> Ġc 1 . date Upload . compareTo ( c 2 . date Upload ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError (" Unknown Ġsorting Ġmethod ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġepisode s Ġ= Ġhandler . await List Ġ{ Ġepisode s Queries . get Episode sBy An ime Id ( anime Id , Ġepisode Mapper ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( sort Function ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurr Episode Index Ġ= Ġepisode s . indexOf First Ġ{ Ġepisode . id Ġ== Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( anime . sorting ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ SOURCE Ġ-> Ġepisode s . get OrNull ( curr Episode Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ NUMBER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepisode Number Ġ= Ġepisode . episode Number ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( curr Episode Index Ġ+ Ġ 1 ) Ġuntil Ġepisode s . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġepisode s [ it ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . episode Number Ġ> Ġepisode Number Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . episode Number Ġ<= Ġepisode Number Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn ime . E PI SO DE _ SORT ING _ UPLOAD _ DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode s . drop ( curr Episode Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . date Upload Ġ>= Ġepisode . date Upload Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError (" Unknown Ġsorting Ġmethod ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġreset History ( history Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . await Ġ{ Ġan ime history Queries . reset An ime History ById ( history Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat ( Log Priority . ERROR , Ġthrowable Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġreset History By An ime Id ( anime Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . await Ġ{ Ġan ime history Queries . reset History By An ime Id ( anime Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat ( Log Priority . ERROR , Ġthrowable Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete All History (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . await Ġ{ Ġan ime history Queries . removeAll History () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat ( Log Priority . ERROR , Ġthrowable Ġ= Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupsert History ( history Update : ĠAn ime History Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . await Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan ime history Queries . upsert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Update . episode Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Update . seen At , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat ( Log Priority . ERROR , Ġthrowable Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ