package Ġram . attachment Selector . adapter Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġcom . air bnb . lott ie . Lot tie Animation View Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . request . RequestOptions Ċ import Ġcom . tr u iz lop . section ed recyclerview . Section ed RecyclerView Adapter Ċ import Ġkotlinx . android . synt hetic . main . item _ images . view .* Ċ import Ġram . attachment Selector . R Ċ import Ġram . attachment Selector . data . model . Header Item Model Ċ import Ġram . attachment Selector . data . model . Image DataModel Ċ import Ġjava . util .* Ċ Ċ class ĠImage Section Grid Adapter ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġlist ner : Ġon Grid Image Click edList ner ) Ġ: ĊĠĠĠĠĠĠĠ ĠSection ed RecyclerView Adapter < Image Section Grid Adapter . Header ViewHolder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Section Grid Adapter . Child ViewHolder , ĠImage Section Grid Adapter . F ot ter ViewHolder >() Ġ{ ĊĊĊĠĠĠ Ġprivate Ġvar Ġmap : ĠMap < String , ĠList < Image DataModel >> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġheader List : ĠList < Header Item Model >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġinflater : ĠLayoutInflater ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater Ġ= ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠ Ġmap Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġheader List Ġ= ĠArrayList () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface Ġon Grid Image Click edList ner Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Grid Image Clicked ( image Model : ĠImage DataModel ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Grid Section Clicked ( image Model : ĠList < Image DataModel >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Image Datas ( map : ĠMap < String , ĠList < Image DataModel >> ?, Ġheader list : ĠList < Header Item Model > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map Ġ== Ġnull Ġ|| Ġheader list Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġthis . map Ġ= Ġmap ĊĠĠĠĠĠĠĠ Ġthis . header List Ġ= Ġheader list ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Section Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġheader List !!. size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count For Section ( section : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ! ![ header List ! ![ section ]. date String ] !!. size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Footer In Section ( section : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Section Header ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠHeader ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHeader ViewHolder ( in flater . inflate ( R . layout . item _ header , Ġparent , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Section Footer ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠF ot ter ViewHolder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Item ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠChild ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠChild ViewHolder ( in flater . inflate ( R . layout . item _ images , Ġparent , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Section Header ViewHolder ( holder : ĠHeader ViewHolder , Ġsection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . setHeader Datas ( header List ! ![ section ]) ĊĠĠĠĠĠĠĠ Ġholder . tv Date Header . setOnClickListener ( View . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . start Check Animation ( section ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsect i ( section ) ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Section Footer ViewHolder ( holder : ĠF ot ter ViewHolder , Ġsection : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Item ViewHolder ( holder : ĠChild ViewHolder , Ġsection : ĠInt , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġmap ! ![ header List ! ![ section ]. date String ] !!. get ( position ) ĊĠĠĠĠĠĠĠ Ġholder . set Child Datas ( item ) ĊĠĠĠĠĠĠĠ Ġholder . parent Layout . setOnClickListener ( View . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . start Check Animation ( section , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠHeader ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠĠ Ġvar Ġtv Date Header Ġ= ĠitemView . findViewById < TextView >( R . id . tv _ date _ header ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanimation View Ġ= ĠitemView . findViewById < Lot tie Animation View >( R . id . lott ie _ animation ) ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanim ator : ĠValue Animator ? Ġ= Ġnull ĊĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator !!. add Update Listener Ġ{ Ġvalue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation View . set Progress ( value Animator . animated Value Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Header Datas ( header Item Model : ĠHeader Item Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Date Header . text Ġ= Ġheader Item Model . date String ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Check Animation ( section : ĠInt ) Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Item Ġ= Ġheader List !!. get ( section ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation View . progress Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator !!. start (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation View . progress Ġ= Ġ 0 f ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item . isSelected Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap !!. get ( header List !!. get ( section ). date String ) !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . selected Ġ= Ġselected Item . isSelected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ner Ġ!= Ġnull ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ner . on Grid Image Clicked ( selected Item ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠF ot ter ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) ĊĊĠĠĠ Ġinner Ġclass ĠChild ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġiv Images Ġ= ĠitemView . iv _ images ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtv Gradient Ġ= ĠitemView . tv _ gradient ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtv Folder Name Ġ= ĠitemView . tv _ folder _ name ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanimation View Ġ= ĠitemView . lott ie _ animation ĊĠĠĠĠĠĠĠ Ġvar Ġparent Layout Ġ= ĠitemView . parent _ layout ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanim ator : ĠValue Animator ? Ġ= Ġnull ĊĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator !!. add Update Listener Ġ{ Ġvalue Animator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation View . set Progress ( value Animator . animated Value Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Check Animation ( section : ĠInt , Ġchild : ĠInt ) Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Item Ġ= Ġmap !!. get ( header List !!. get ( section ). date String ) !!. get ( child ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation View . progress Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator !!. start (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item . selected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation View . progress Ġ= Ġ 0 f ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item . selected Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list ner Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ner . on Grid Image Clicked ( selected Item ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġset Child Datas ( item : ĠImage DataModel ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( item . image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply ( RequestOptions (). center Crop ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( iv Images ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Gradient . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Folder Name . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . selected Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator !!. start (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġanimation View . progress Ġ= Ġ 0 f ; ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ