package Ġcom . example . ping code lab Ċ Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . Types Ċ import Ġcom . f red por ci unc ula . flow . preferences . Flow SharedPreferences Ċ import Ġcom . f red por ci unc ula . flow . preferences . Serializer Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ Ċ data Ġclass ĠPing ( ĊĠĠĠ Ġval Ġid : ĠString , ĊĠĠĠ Ġval Ġdate : ĠLong Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠ Ġval Ġp ong Date : ĠLong ? Ġ= Ġnull Ċ ) Ċ Ċ @ Experimental Cor outines Api Ċ class ĠPing Repository ( ĊĠĠĠ Ġprivate Ġval Ġflow SharedPreferences : ĠFlow SharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġm oshi : ĠM oshi Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrepo Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= Ġobject Ġ: ĠSerializer < List < Ping >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġadapter Ġ= Ġm oshi . adapter < List < Ping >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTypes . new Parameterized Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPing :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( serialized : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . fromJson ( serialized ) Ġ?: Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠList < Ping >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . toJson ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġflow SharedPreferences . getObject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" p ings ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve () Ġ= Ġrepo . as Flow () ĊĊĠĠĠ Ġfun Ġget ( id : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġrepo . get (). first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġset ( message : ĠPing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepo . set And Commit ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . id Ġ== Ġmessage . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġmessage ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepo . set And Commit ( emptyList ()) ĊĠĠĠ Ġ} Ċ }