package Ġcz . m ro cz is . net monster . core . cache Ċ Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġcz . m ro cz is . net monster . core . Milliseconds Ċ import Ġcz . m ro cz is . net monster . core . cache . Tele phony Cache . LI F ETIME Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ Ċ /** Ċ Ġ* ĠTele phony Ġcache Ġhelps Ġus Ġreduce Ġcalls Ġto Ġ[ Tele phony Manager . listen ] Ġand Ġspeed Ġup Ġprocessing Ċ Ġ* ĠF etched Ġresults Ġare Ġstored Ġfor Ġ[ LI F ETIME ] Ġmilliseconds . Ċ Ġ*/ Ċ internal Ġobject ĠTele phony Cache Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠL IF ETIME : ĠM illiseconds Ġ= Ġ 1 _ 0 0 0 ĊĊĠĠĠ Ġprivate Ġval Ġkeys Ġ= ĠConcurrent Linked Queue < Key >() ĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠConcurrent HashMap < Key , ĠValue >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġget Ġstored Ġvalue Ġfrom Ġa Ġcache , Ġif Ġit Ġis Ġnot Ġpresent Ġor Ġit Ġis Ġalready Ġexpired ĊĠĠĠĠ Ġ* Ġinvokes Ġ[ update ] Ġto Ġget Ġfresh Ġvalue Ġand Ġcaches Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġsafe Ġto Ġinvoke Ġfrom Ġany Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ sub Id ] Ġ- Ġsubscription Ġid ĊĠĠĠĠ Ġ* Ġ[ event ] Ġ- Ġone Ġof ĠPhone State Listener . LIST EN _* Ġconstants ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T > Ġget OrUpdate ( sub Id : ĠInt ?, Ġevent : ĠInt , Ġupdate : Ġ() Ġ-> ĠT ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthere Ġwill Ġbe Ġonly Ġone Ġinstance Ġof Ġa Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Key Ġ= ĠKey ( sub Id Ġ= Ġsub Id , Ġevent Ġ= Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . find Ġ{ Ġit Ġ== Ġmodel Key Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Ġ+= Ġmodel Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġget Ġcached Ġone Ġwithout Ġsynchron ised Ġaccess ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcache [ key ]?. take If Ġ{ Ġit . valid Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue . any Ġas ? ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġtry Ġgrab Ġcached Ġvalue Ġonce Ġagain Ġsince Ġwe Ġare Ġin Ġa Ġcritical Ġsection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsynced Value Ġ= Ġcache [ key ]?. take If Ġ{ Ġit . valid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sync ed Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynced Value . any Ġas ? ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= ĠValue ( created Ġ= ĠSystem . currentTimeMillis (), Ġany Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ key ] Ġ= ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKey Ġhere Ġserves Ġas Ġa Ġset Ġof Ġunique Ġidentifiers Ġrequired Ġto Ġperform Ġdata Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠKey ( ĊĠĠĠĠĠĠĠ Ġval Ġsub Id : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġval Ġevent : ĠInt , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCached Ġvalue , Ġcould Ġbe Ġliter ally Ġ[ any ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠValue ( ĊĠĠĠĠĠĠĠ Ġval Ġcreated : ĠM illiseconds , ĊĠĠĠĠĠĠĠ Ġval Ġany : ĠAny ?, ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcreated Ġ+ ĠL IF ETIME Ġ>= ĠSystem . currentTimeMillis () ĊĊĠĠĠ Ġ} Ċ Ċ }