package Ġcom . tap track . car rot . k ios k control Ċ Ċ import Ġandroid . n fc . N def Message Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġjava . util . concurrent . Copy On Write Array Set Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ interface ĠK ios k Manager Ġ{ ĊĠĠĠ Ġenum Ġclass ĠStatus { ĊĠĠĠĠĠĠĠ ĠUN INITIAL IZED , ĠINITIAL IZ ING , ĠHE ALTH Y , ĠHE ART BE AT _ FAILURE Ġ, CLO SING , ĠCLO SED ĊĠĠĠ Ġ} ĊĠĠĠ Ġinterface ĠManager Status Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon New K ios k Status ( k ios k Status : ĠStatus ) ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġinterface ĠK ios k Response Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon N def Read ( uid : ĠByteArray , Ġtag Type : ĠByte , Ġn def : ĠN def Message ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Tag Read ( uid : ĠByteArray , Ġtag Type : ĠByte ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Heartbeat Received ( time : ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Status Listener ( listener : ĠManager Status Listener ) ĊĠĠĠ Ġfun Ġunregister Status Listener ( listener : ĠManager Status Listener ) ĊĊĠĠĠ Ġfun Ġregister Response Listener ( listener : ĠK ios k Response Listener ) ĊĠĠĠ Ġfun Ġunregister Response Listener ( listener : ĠK ios k Response Listener ) ĊĊĠĠĠ Ġfun ĠgetStatus (): ĠStatus ĊĠĠĠ Ġfun Ġinitialize (): ĠUnit ĊĠĠĠ Ġfun Ġclose (): ĠUnit Ċ } Ċ Ċ internal Ġclass ĠK ios k Callbacks ( private Ġval Ġmanager : ĠK ios k Manager , Ġprivate Ġval Ġnotify Looper : ĠL ooper ) Ġ{ ĊĠĠĠ Ġval Ġstatus Listeners Ġ= Ġhash Set Of < K ios k Manager . Manager Status Listener >() ĊĠĠĠ Ġval Ġstatus Rw Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠĠĠ Ġval Ġk ios k Response Listeners Ġ= ĠCopy On Write Array Set < K ios k Manager . K ios k Response Listener >() ĊĠĠĠ Ġval Ġresponse Rw Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠĠĠ Ġval Ġnotify Handler Ġ= ĠHandler ( notify Looper ) ĊĊĠĠĠ Ġfun Ġregister Status Listener ( listener : ĠK ios k Manager . Manager Status Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Rw Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġmanager . getStatus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listeners . add ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on New K ios k Status ( current ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġunregister Status Listener ( listener : ĠK ios k Manager . Manager Status Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Rw Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listeners . remove ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Of New Status ( k ios k Status : ĠK ios k Manager . Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Rw Lock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on New K ios k Status ( k ios k Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister K ios k Response Listener ( listener : ĠK ios k Manager . K ios k Response Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse Rw Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk ios k Response Listeners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġunregister K ios k Response Listener ( listener : ĠK ios k Manager . K ios k Response Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse Rw Lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk ios k Response Listeners . remove ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Of New N def Read ( uid : ĠByteArray , Ġtag Type : ĠByte , Ġn def : ĠN def Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Rw Lock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ios k Response Listeners . forEach Ġ{ Ġit . on N def Read ( uid , Ġtag Type , Ġn def ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Of New Tag Read ( uid : ĠByteArray , Ġtag Type : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Rw Lock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ios k Response Listeners . forEach Ġ{ Ġit . on Tag Read ( uid , Ġtag Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnotify Of New Heartbeat Received ( time : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Rw Lock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ios k Response Listeners . forEach Ġ{ Ġit . on Heartbeat Received ( time ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊĊĊ