/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . pl aid app . core . data . prefs Ċ Ċ import Ġio . pl aid app . core . data . Source Ċ import Ġio . pl aid app . core . ui . filter . Filters Changed Callback Ċ import Ġjava . util . Collections Ċ Ċ /** Ċ Ġ* ĠManage Ġsaving Ġand Ġretrieving Ġdata Ġsources Ġfrom Ġdisk . Ċ Ġ*/ Ċ class ĠS ources Repository ( ĊĠĠĠ Ġprivate Ġval Ġdefault Sources : ĠList < Source >, ĊĠĠĠ Ġprivate Ġval ĠdataSource : ĠS ources Local DataSource Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= Ġmutable ListOf < Source >() ĊĠĠĠ Ġprivate Ġval Ġcallbacks Ġ= Ġmutable ListOf < Filters Changed Callback >() ĊĊĠĠĠ Ġfun Ġregister Filter Changed Callback ( callback : ĠFilters Changed Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . add ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sources (): ĠList < Source > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cache . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcache Ġis Ġempty ĊĠĠĠĠĠĠĠ Ġval Ġsource Keys Ġ= ĠdataSource . get Keys () ĊĠĠĠĠĠĠĠ Ġif Ġ( source Keys Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sources ( default Sources ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdefault Sources ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsources Ġ= Ġmutable ListOf < Source >() ĊĠĠĠĠĠĠĠ Ġsource Keys . forEach Ġ{ Ġsource Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive State Ġ= ĠdataSource . getSource Active State ( source Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd ĠD ribb ble Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Key . startsWith ( Source . D ribb ble Search Source . DR IB BB LE _ QUERY _ PREFIX ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġsource Key . replace ( Source . D ribb ble Search Source . DR IB BB LE _ QUERY _ PREFIX , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( Source . D ribb ble Search Source ( query , Ġactive State )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd ĠDesigner ĠNews Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Key . startsWith ( Source . Designer News Search Source . DE SIGN ER _ NE WS _ QUERY _ PREFIX ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġsource Key . replace ( Source . Designer News Search Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. DE SIGN ER _ NE WS _ QUERY _ PREFIX , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( Source . Designer News Search Source ( query , Ġactive State )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġdeprecated Ġsources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Deprecated Designer News Source ( source Key ) Ġ-> ĠdataSource . remove Source ( source Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Deprecated D ribb ble V 1 Source ( source Key ) Ġ-> ĠdataSource . remove Source ( source Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget Source From Defaults ( source Key , Ġactive State )?. let Ġ{ Ġsources . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCollections . sort ( sources , ĠSource . Source Comparator ()) ĊĠĠĠĠĠĠĠ Ġcache . addAll ( sources ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcache ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Sources ( sources : ĠList < Source >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Keys Ġ= Ġsources . map Ġ{ Ġit . key Ġ}. toSet () ĊĠĠĠĠĠĠĠ ĠdataSource . add Sources ( source Keys , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Source ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . add Source ( source . key , Ġsource . active ) ĊĠĠĠĠĠĠĠ Ġcache . add ( source ) ĊĠĠĠĠĠĠĠ Ġdispatch Source Changed ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Source ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . update Source ( source . key , Ġsource . active ) ĊĠĠĠĠĠĠĠ Ġcache . find Ġ{ Ġit . key Ġ== Ġsource . key Ġ} ?. apply Ġ{ Ġactive Ġ= Ġsource . active Ġ} ĊĠĠĠĠĠĠĠ Ġdispatch Source Changed ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Source ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ ĠdataSource . remove Source ( source . key ) ĊĠĠĠĠĠĠĠ Ġcache . remove ( source ) ĊĠĠĠĠĠĠĠ Ġdispatch Source Removed ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Active Sources Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sources (). count Ġ{ Ġit . active Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Source From Defaults ( key : ĠString , Ġactive : ĠBoolean ): ĠSource ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdefault Sources . first OrNull Ġ{ Ġsource Ġ-> Ġsource . key Ġ== Ġkey Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit ?. active Ġ= Ġactive Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Source Changed ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Filters Changed ( source ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Source Removed ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . forEach Ġ{ Ġit . on Filter Removed ( source ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSOURCE _ DE SIGN ER _ NE WS _ POP ULAR Ġ= Ġ" SOURCE _ DE SIGN ER _ NE WS _ POP ULAR " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSOURCE _ PRODUCT _ H UNT Ġ= Ġ" SOURCE _ PRODUCT _ H UNT " ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠS ources Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Sources : ĠList < Source >, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource : ĠS ources Local DataSource ĊĠĠĠĠĠĠĠ Ġ): ĠS ources Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ?: ĠS ources Repository ( default Sources , ĠdataSource ). also Ġ{ ĠINSTANCE Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ