package Ġserv ic est ack . net . tech stack sk otlin Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . support . v 4 . app . Fragment Activity Ċ import Ġnet . servic est ack . android . Android ServiceClient Ċ import Ġnet . servic est ack . android . Android Utils Ċ import Ġnet . servic est ack . client . Async Success Ċ import Ġnet . servic est ack . client . Utils Ċ import Ġjava . util .* Ċ Ċ class ĠApp Ġ{ ĊĊĠĠĠ Ġinternal Ġvar Ġclient : ĠAndroid ServiceClient ĊĠĠĠ Ġvar Ġapp Data : ĠApp Data ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠAndroid ServiceClient (" https :// www . tech stacks . io ") ĊĠĠĠĠĠĠĠ Ġapp Data Ġ= ĠApp Data ( client ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠApp Data ( internal Ġvar Ġclient : ĠAndroid ServiceClient ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġlisteners Ġ= ĠArrayList < AppData Listener >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Listener ( callback : ĠApp Data Listener ): ĠApp Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! listeners . contains ( callback )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . add ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate ( dataType : ĠDataType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġlisteners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update ( this , ĠdataType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġload App Overview (): ĠApp Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Overview Response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . App Overview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( App Overview (), ĠAsync Success < App Overview Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Overview Response Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . App Overview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġapp Overview Response : ĠApp Overview Response ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġlast Tech Stack s Query : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġsearch Tech Stack s ( query : ĠString ): ĠApp Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Tech Stack s Response Ġ!= Ġnull Ġ&& ĠUtils . equals ( query , Ġlast Tech Stack s Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Search Tech Stack s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Tech Stack s Query Ġ= Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( Find Tech Stack s (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of ( Pair (" Name Contains ", Ġquery ), ĠPair (" Description Contains ", Ġquery )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Success < Query Response < Tech nology Stack >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Utils . equals ( query , Ġlast Tech Stack s Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Tech Stack s Response Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Search Tech Stack s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsearch Tech Stack s Response : ĠQuery Response < Tech nology Stack >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġlast Tech nologies Query : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġsearch Tech nologies ( query : ĠString ): ĠApp Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Tech nologies Response Ġ!= Ġnull Ġ&& ĠUtils . equals ( query , Ġlast Tech nologies Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Search Tech nologies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Tech nologies Query Ġ= Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( Find Tech nologies (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of ( Pair (" Name Contains ", Ġquery ), ĠPair (" Description Contains ", Ġquery )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Success < Query Response < Tech nology >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Utils . equals ( query , Ġlast Tech nologies Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Tech nologies Response Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Search Tech nologies ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsearch Tech nologies Response : ĠQuery Response < Tech nology >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠĠĠĠĠ Ġvar Ġtechnology : ĠGet Tech nology Response ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠĠĠĠĠ Ġfun Ġload Tech nology ( slug : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( technology Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Tech nology ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠGet Tech nology () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . slug Ġ= Ġslug ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( request , ĠAsync Success < Get Tech nology Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtechnology Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Tech nology ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġtech Stack : ĠGet Tech nology Stack Response ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠĠĠĠĠ Ġfun Ġload Tech Stack ( slug : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tech Stack Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Tech Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠGet Tech nology Stack () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . slug Ġ= Ġslug ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( request , ĠAsync Success < Get Tech nology Stack Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtech Stack Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( DataType . Tech Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġimg Cache Ġ= ĠHashMap < String , ĠBitmap >() ĊĠĠĠĠĠĠĠ Ġfun Ġload Image ( img Url : ĠString , Ġcallback : ĠImage Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Ġ= Ġimg Cache [ img Url ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( img Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . success ( img ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get Async ( img Url , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Ġ= ĠAndroid Utils . read Bitmap ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Cache . put ( img Url , Ġimg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . success ( img ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠApp Data Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate ( data : ĠApp Data , ĠdataType : ĠDataType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠImage Result Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsuccess ( img : ĠBitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠDataType Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Overview , ĊĠĠĠĠĠĠĠ ĠSearch Tech Stack s , ĊĠĠĠĠĠĠĠ ĠSearch Tech nologies , ĊĠĠĠĠĠĠĠ ĠTechnology , ĊĠĠĠĠĠĠĠ ĠTech Stack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar ĠInstance Ġ= ĠApp () ĊĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠApp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInstance ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠApp Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġget (). app Data ĊĊĠĠĠĠĠĠĠ Ġfun Ġopen Tech Stack ( activity : ĠActivity ?, Ġslug : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( slug Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Tech Stack Ġ= ĠIntent ( activity , ĠTech Stack Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Tech Stack . putExtra (" slug ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !!. startActivity ( open Tech Stack ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġopen Tech nology ( activity : ĠActivity ?, Ġslug : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( slug Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Tech nology Ġ= ĠIntent ( activity , ĠTechnology Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Tech nology . putExtra (" slug ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !!. startActivity ( open Tech nology ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġopen Url ( activity : ĠActivity , Ġurl : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity ( Intent ( Intent . ACTION _ VIEW , ĠUri . parse ( url ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ