package Ġcom . destruct o . s ush i . ui . manga . manga Reviews Ċ Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . destruct o . s ush i . CACHE _ EXPI RE _ TIME _ LIMIT Ċ import Ġcom . destruct o . s ush i . model . database . M anga Reviews Entity Ċ import Ġcom . destruct o . s ush i . model . j ikan . manga . M anga Review Ċ import Ġcom . destruct o . s ush i . model . j ikan . manga . Review Entity Ċ import Ġcom . destruct o . s ush i . network . J ikan Api Ċ import Ġcom . destruct o . s ush i . network . Resource Ċ import Ġcom . destruct o . s ush i . room . M anga Review List Dao Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠM anga Reviews ViewModel ĊĠĠĠ Ġ@ ViewModel Inject ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġj ikan Api : ĠJ ikan Api , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm anga Review List Dao : ĠM anga Review List Dao ĊĠĠĠĠĠĠĠ Ġ): ĠViewModel () Ġ{ ĊĊĠĠĠ Ġvar Ġm anga Review : ĠMutable LiveData < Resource < M anga Review >> Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġfun Ġget Review List ById ( mal Id : ĠInt ): ĠM anga Review ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm anga Review List Dao . getM anga Reviews ById ( mal Id )?. review List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget M anga Reviews ( mal Id : ĠInt , Ġpage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . loading ( null ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Review List Cache Ġ= Ġm anga Review List Dao . getM anga Reviews ById ( mal Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manga Review List Cache Ġ!= Ġnull ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (( System . currentTimeMillis () Ġ- Ġm anga Review List Cache . time ) Ġ> ĠCACHE _ EXPI RE _ TIME _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Reviews Call ( mal Id , Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Character List Ġ= Ġm anga Review List Cache . review List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . success ( manga Character List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Reviews Call ( mal Id , Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġm anga Reviews Call ( mal Id : Int , Ġpage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm anga Id : ĠString Ġ= Ġmal Id . toString () ĊĠĠĠĠĠĠĠ Ġval Ġget M anga Reviews Deferred Ġ= Ġj ikan Api . getM anga Reviews Async ( manga Id , Ġpage ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Character List Ġ= Ġget M anga Reviews Deferred . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Review Request Ġ= ĠM anga Reviews Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreview List Ġ= Ġm anga Character List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġmal Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review List Dao . insert M anga Reviews ( manga Review Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . success ( manga Review Request . review List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . error ( e . message Ġ?: Ġ"", Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġload Next Page ( mal Id : Int ){ ĊĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . loading ( null ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Id : ĠString Ġ= Ġmal Id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġm anga Review List Dao . getM anga Reviews ById ( mal Id )?. currentPage ?. toInt ()?. plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Reviews Deferred Ġ= Ġj ikan Api . getM anga Reviews Async ( manga Id , Ġpage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Reviews Ġ= Ġget Reviews Deferred . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Review List Ġ= Ġm anga Review List Dao . getM anga Reviews ById ( mal Id )?. review List ?. reviews ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Reviews . reviews ?. addAll ( 0 , Ġold Review List Ġas ĠCollection < Review Entity ?> ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġan ime Review List Entity Ġ= ĠM anga Reviews Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreview List Ġ= Ġm anga Reviews , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġmal Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġpage . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Load ĠPage Ġ: Ġ$ page ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review List Dao . insert M anga Reviews ( anime Review List Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . success ( anime Review List Entity . review List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Review . value Ġ= ĠResource . error ( e . message Ġ?: Ġ"", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }