package Ġcom . example . android . navigation . fragments . base Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . example . android . navigation . R Ċ import Ġcom . example . android . navigation . list . ItemList Adapter Ċ import Ġcom . example . android . navigation . util . Animation Utils . animate View Ċ import Ġcom . example . android . navigation . util . Constants Ċ import Ġcom . example . android . navigation . util . Globals Ċ import Ġcom . example . android . navigation . util . OnClick Gesture Ċ import Ġcom . example . android . navigation . util . On Scroll Below Items Listener Ċ Ċ import Ġjava . util . Queue Ċ Ċ abstract Ġclass ĠBase List Fragment < T >: ĠBase State Fragment () Ġ{ ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĠĠĠ Ġ// ĠViews ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġlist Adapter : ĠItem ListAdapter < T > ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġlist Items Ġ: ĠRecyclerView ĊĠĠĠ Ġprivate Ġvar Ġupdate Flags Ġ= Ġ 0 ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĠĠĠ Ġ// ĠInit ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġprotected Ġval Ġlist LayoutManager : RecyclerView . LayoutManager ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġgrid LayoutManager : RecyclerView . LayoutManager ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġactivity !!. getResources () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġresources . get Dimension Pixel Size ( R . dim en . video _ item _ grid _ thumbnail _ image _ width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ+= Ġ( 2 4 Ġ* Ġresources . getDisplay Metrics (). density ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Count Ġ= ĠMath . floor ( resources . getDisplay Metrics (). width Pixels Ġ/ Ġwidth . toDouble ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlm Ġ= ĠGrid LayoutManager ( activity , Ġspan Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlm . set Span Size Lookup ( list Adapter . set Custom Span Size Lookup ( span Count )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlm ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġis GridLayout : Boolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist _ mode Ġ= ĠPreference Manager . getDefault SharedPreferences ( activity ). getString ( Constants (). KEY _ VIEW _ MODE , ĠGlobals (). VIEW _ MODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" auto " Ġ== Ġlist _ mode ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġget Resources (). getConfiguration () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE Ġ&& Ġconfiguration . is Layout Size At Least ( Configuration . SCREEN LAYOUT _ SIZE _ LARGE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" grid " Ġ== Ġlist _ mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĠĠĠ Ġ// ĠLife Cycle ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Attach ( context : Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( update Flags Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( update Flags Ġand ĠLIST _ MODE _ UPDATE _ FLAG ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Grid Ġ= Ġis GridLayout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Items . setLayout Manager ( if Ġ( use Grid ) Ġgrid LayoutManager Ġelse Ġlist LayoutManager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . set Grid Item Variants ( use Grid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flags Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Suffix (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNa ive Ġsolution , Ġbut Ġit 's Ġgood Ġfor Ġnow Ġ( the Ġitems Ġdon 't Ġchange ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ"." Ġ+ Ġlist Adapter . getList Items (). size Ġ+ Ġ". list " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠwriteTo ( objects To Save : Queue < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobjects To Save . add ( list Adapter . getList Items ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġread From (@ NonNull Ġsaved Objects : Queue < Any >) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġlist Adapter !!. getList Items (). clear () Ċ // ĠĠĠĠĠĠĠ Ġlist Adapter !!. getList Items (). addAll ( saved Objects . poll () Ġas ĠList < Info Item >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġinit List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuse Grid Ġ= Ġis GridLayout ĊĠĠĠĠĠĠĠ Ġ// list Items Ġ= Ġroot View . findViewById < RecyclerView >( R . id . items _ list ) Ġ<-- ĠWR ONG Ġinit Ġnel Ġfragment Ġspecific o ĊĠĠĠĠĠĠĠ Ġlist Items . setLayout Manager ( if Ġ( use Grid ) Ġgrid LayoutManager Ġelse Ġlist LayoutManager ) ĊĠĠĠĠĠĠĠ Ġ// list Adapter Ġ= ĠItem ListAdapter ( 1 , activity Ġas ĠAppCompatActivity ) Ġ<-- ĠWR ONG Ġinit Ġnel Ġfragment Ġspecific o ĊĠĠĠĠĠĠĠ Ġlist Adapter . set Grid Item Variants ( use Grid ) ĊĠĠĠĠĠĠĠ Ġlist Items . setAdapter ( list Adapter ) ĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġon ItemSelected ( selected Item : ĠT ) ĊĠĠĠ Ġabstract Ġfun Ġon Item Hel d ( selected Item : ĠT ) ĊĠĠĠ Ġabstract Ġfun Ġon Item Drag ged ( selected Item : ĠT , ĠviewHolder : ĠRecyclerView . ViewHolder ?) ĊĊĠĠĠ Ġprotected Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// this Ġhandle Ġall Ġtypes Ġcomments , Ġchannel , Ġplaylist , Ġresults ĊĠĠĠĠĠĠĠ Ġlist Adapter . setSelected Listener ( object : ĠOnClick Gesture < T >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġselected ( selected Item : T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Tag ." + this . toString (), Ġ" list ner Ġclick Ġcalled Ġwith : Ġselected Item Ġ= Ġ[" Ġ+ Ġselected Item Ġ+ Ġ"] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemSelected ( selected Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġheld ( selected Item : T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Hel d ( selected Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// show Stream Dialog ( selected Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdrag ( selected Item : ĠT , ĠviewHolder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Drag ged ( selected Item , view Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġlist Items . clear On Scroll Listeners () ĊĠĠĠĠĠĠĠ Ġlist Items . add On Scroll Listener ( object : ĠOn Scroll Below Items Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled Down ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll To Bottom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) Ċ // ĠĠĠĠĠĠĠ Ġno Ġneed Ġof Ġthis Ċ // ĠĠĠĠĠĠĠ ĠItem Touch Helper ( object Ġ: ĠItem Touch Helper . Callback () Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Movement Flags ( re cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder ): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Suggestion Movement Flags ( re cyclerView , ĠviewHolder ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Move ( re cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder 1 : ĠRecyclerView . ViewHolder ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġi : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Suggestion Item Sw ip ed ( view Holder , Ġi ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ}). attach To RecyclerView ( list Items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġon Scroll To Bottom () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( hasMore Items () Ġ&& Ġ! isLoading . get ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload More Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĠĠĠ Ġ// ĠLoad Ġand Ġhandle ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġload More Items () ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġhas More Items (): Boolean ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĠĠĠ Ġ// ĠContract ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . show Loading () ĊĠĠĠĠĠĠĠ Ġanimate View ( list Items , Ġfalse , Ġ 4 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . hide Loading () ĊĠĠĠĠĠĠĠ Ġanimate View ( list Items , Ġtrue , Ġ 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġshow Error ( message : String , Ġshow Retry Button : Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . show Error ( message , Ġshow Retry Button ) ĊĠĠĠĠĠĠĠ Ġanimate View ( list Items , Ġfalse , Ġ 2 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġshow Empty State () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . show Empty State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLIST _ MODE _ UPDATE _ FLAG Ġ= Ġ 0 x 3 2 ĊĠĠĠ Ġ} Ċ } Ċ