package Ġcom . mixed hash . un be erable . presentation Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . mixed hash . un be erable . R Ċ import Ġcom . mixed hash . un be erable . databinding . Activity ItemList Binding Ċ import Ġcom . mixed hash . un be erable . model . P unk Response Ċ import Ġcom . mixed hash . un be erable . util . List Modes Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ Ċ /** Ċ Ġ* ĠAn Ġactivity Ġrepresenting Ġa Ġlist Ġof ĠP ings . ĠThis Ġactivity Ċ Ġ* Ġhas Ġdifferent Ġpresent ations Ġfor Ġhand set Ġand Ġtablet - size Ġdevices . ĠOn Ċ Ġ* Ġhand sets , Ġthe Ġactivity Ġpresents Ġa Ġlist Ġof Ġitems , Ġwhich Ġwhen Ġtouched , Ċ Ġ* Ġlead Ġto Ġa Ġ[ Item Detail Activity ] Ġrepresenting Ċ Ġ* Ġitem Ġdetails . ĠOn Ġtable ts , Ġthe Ġactivity Ġpresents Ġthe Ġlist Ġof Ġitems Ġand Ċ Ġ* Ġitem Ġdetails Ġside - by - side Ġusing Ġtwo Ġvertical Ġpan es . Ċ Ġ*/ Ċ @ Android EntryPoint Ċ class ĠItem List Activity Ġ: ĠAppCompatActivity (), ĠInterface Com municator , ĠCallback Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġor Ġnot Ġthe Ġactivity Ġis Ġin Ġtwo - pane Ġmode , Ġi . e . Ġrunning Ġon Ġa Ġtablet ĊĠĠĠĠ Ġ* Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġtwo Pane : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠItem List ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġvar Ġmode : ĠList Modes Ġ= ĠList Modes . API _ MODE ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity ItemList Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity ItemList Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ ĠsetContentView ( view ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= ĠfindViewById < Toolbar >( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġtoolbar . title Ġ= Ġtitle ĊĊĠĠĠĠĠĠĠ Ġif Ġ( findViewById < Nested ScrollView >( R . id . item _ detail _ container ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġdetail Ġcontainer Ġview Ġwill Ġbe Ġpresent Ġonly Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlarge - screen Ġlayouts Ġ( res / values - w 9 0 0 dp ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġview Ġis Ġpresent , Ġthen Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġactivity Ġshould Ġbe Ġin Ġtwo - pane Ġmode . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Pane Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbeer List Observer Ġ= ĠObserver < List < P unk Response >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup RecyclerView ( findViewById ( R . id . item _ list ), Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . fab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Search Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . list Switch . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . list Switch . text Ġ= Ġ" Local " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠList Modes . LOCAL _ MODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getAll Stored Be ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . list Switch . text Ġ= Ġ" API " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠList Modes . API _ MODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getAll Be ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . be ers . observe ( this , Ġbeer List Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠList Modes . LOCAL _ MODE ) ĠviewModel . getAll Stored Be ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView ( re cyclerView : ĠRecyclerView , Ġdata : ĠList < P unk Response >) Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Item RecyclerView Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Pane ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSimple Item RecyclerView Adapter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparent Activity : ĠItem List Activity , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalues : ĠList < P unk Response >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtwo Pane : ĠBoolean ĊĠĠĠ Ġ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . Adapter < Simple Item RecyclerView Adapter . ViewHolder >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠonClick Listener : ĠView . OnClickListener Ġ= ĠView . OnClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġv . tag Ġas ĠP unk Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġparent Activity . mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( two Pane ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠItem Detail Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Serializable ( Item Detail Fragment . P UNK _ OBJECT , Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Serializable ( Item Detail Fragment . MODE , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Callback ( this @ Simple Item RecyclerView Adapter . parent Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Activity . support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . item _ detail _ container , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( v . context , ĠItem Detail Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Item Detail Fragment . P UNK _ OBJECT , Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Item Detail Fragment . MODE , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . context . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . item _ list _ content , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġvalues [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . get (). load ( item . imageUrl ). into ( holder . imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . id View . text Ġ= Ġitem . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . tag line View . text Ġ= Ġitem . tag Line ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( holder . item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener ( on ClickListener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġvalues . size ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageView : ĠImageView Ġ= Ġview . findViewById ( R . id . image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid View : ĠTextView Ġ= Ġview . findViewById ( R . id . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag line View : ĠTextView Ġ= Ġview . findViewById ( R . id . tag Line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Search Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġsupport FragmentManager ĊĠĠĠĠĠĠĠ Ġval Ġdialog Fragment Ġ= ĠSearch Dialog Fragment () ĊĠĠĠĠĠĠĠ Ġdialog Fragment . set Interface Com municator ( this ) ĊĠĠĠĠĠĠĠ Ġdialog Fragment . show ( fm , Ġ" fragment _ search _ dialog ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Request Code ( code : ĠInt , Ġfilters : ĠMap < String , ĠString > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġfilters ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Modes . API _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . getAll Be ers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Be er With Filters ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Modes . LOCAL _ MODE Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġfinish Ġcustom Ġquery Ġfunction Ġfor Ġlocal Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Not Ġimplemented Ġyet ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠviewModel . get Be ers By Query ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Modes . API _ MODE Ġ-> ĠviewModel . getRandom Be er () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Modes . LOCAL _ MODE Ġ-> ĠviewModel . getRandom Stored Be er () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate L ived ata () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠList Modes . LOCAL _ MODE ) ĠviewModel . getAll Stored Be ers () ĊĠĠĠ Ġ} Ċ } Ċ