package Ġcom . j im ip ur ple . him ich at . ui . adapters Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . format . DateFormat Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . functions . Firebase Functions Ċ import Ġcom . j im ip ur ple . him ich at . R Ċ import Ġcom . j im ip ur ple . him ich at . db . Messages DB Helper Ċ import Ġcom . j im ip ur ple . him ich at . models . Message Ċ import Ġcom . j im ip ur ple . him ich at . models . Received Message Ċ import Ġcom . j im ip ur ple . him ich at . models . Sent Message Ċ import Ġcom . j im ip ur ple . him ich at . models . Un deliver ed Message Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList ĊĊ Ċ class ĠMessage ListAdapter ( val Ġcontext : ĠContext , Ġvar Ġitems : ĠArrayList < Message >, Ġval Ġclick Callback : ĠCallback , Ġval Ġdelete Callback : Ġ( msg : ĠMessage )-> ĠUnit , Ġval Ġedit Callback : Ġ( msg : ĠMessage )-> ĠUnit , Ġval Ġon Hold Callback : Ġ( msg : ĠMessage )-> Unit ) Ġ: ĠRecyclerView . Adapter < Message ListAdapter . Base ViewHolder >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠBase ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . RECE IVED _ MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . received _ message _ list , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReceived Message Holder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . SENT _ MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . sent _ message _ list , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSent Message Holder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . un received _ message _ list , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn received Message Holder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġitems . size ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠBase ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . pos Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġholder . bind ( items [ position ]) ĊĠĠĠĠĠĠĠ ĠLog . i (" Recycler ", Ġ" items Ġ$ items ") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder . item ViewType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . RECE IVED _ MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Create ContextMenu Listener Ġ{ Ġcontext Menu , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Menu . add ( context . getString ( R . string . context _ menu _ item _ remove )). setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Callback ( items [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . SENT _ MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Create ContextMenu Listener Ġ{ Ġcontext Menu , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Menu . add ( context . getString ( R . string . context _ menu _ item _ remove )). setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Callback ( items [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Create ContextMenu Listener Ġ{ Ġcontext Menu , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Menu . add ( context . getString ( R . string . context _ menu _ item _ remove )). setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Callback ( items [ position ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( items [ position ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReceived Message Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . RECE IVED _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSent Message Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . SENT _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem ViewType . UN DE LI VER ED _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠReceived Message Holder ( item View : ĠView ) Ġ: ĠBase ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Ġ= ĠitemView . findViewById ( R . id . received Message Text ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate View Ġ= ĠitemView . findViewById ( R . id . received Message Date ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate Divider View Ġ= ĠitemView . findViewById ( R . id . received Msg Date Divider View ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbox Ġ= ĠitemView . findViewById ( R . id . received Msg Date Divider View Box ) Ġas ĠLinearLayout ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( item : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġitem Ġas ĠReceived Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . text Ġ= Ġi . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . text Ġ= Ġi . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġnull Ġ&& Ġpos !! Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Item Ġ= Ġitems [ pos !! Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġi . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev D Ġ= Ġprev Item . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= Ġi . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" messages Adapter ", Ġ" dateTime Ġ$ dateTime ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" messages Adapter ", Ġ" date Long Ġ$ d ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġcontext . resources . configuration . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ= Ġprev D !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formatted Year Ġ!= Ġprev Year ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month Ġ$ formatted Year ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( formatted Day Ġ!= Ġprev Day ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate View . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġcontext . resources . configuration . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month Ġ$ formatted Year ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate View . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Position Ġ!= ĠRecyclerView . NO _ POSITION ) Ġclick Callback . on Item Clicked ( items [ adapter Position ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// block Button . setOnClickListener Ġ{ block Callback ( i )} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// accept Button . setOnClickListener Ġ{ accept Callback ( i )} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠSent Message Holder ( item View : ĠView ) Ġ: ĠBase ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Ġ= ĠitemView . findViewById ( R . id . sent Message Text ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate View Ġ= ĠitemView . findViewById ( R . id . sent Message Date ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate Divider View Ġ= ĠitemView . findViewById ( R . id . sent Msg Date Divider View ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbox Ġ= ĠitemView . findViewById ( R . id . sent Msg Date Divider View Box ) Ġas ĠLinearLayout ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( item : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġitem Ġas ĠSent Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . text Ġ= Ġi . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġnull Ġ&& Ġpos !! Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Item Ġ= Ġitems [ pos !! Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġi . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev D Ġ= Ġprev Item . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= Ġi . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" messages Adapter ", Ġ" dateTime Ġ$ dateTime ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" messages Adapter ", Ġ" date Long Ġ$ d ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġcontext . resources . configuration . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ= Ġprev D !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formatted Year Ġ!= Ġprev Year ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month Ġ$ formatted Year ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( formatted Day Ġ!= Ġprev Day ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate View . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocale Ġ= Ġcontext . resources . configuration . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Time Ġ= Ġi . getTime String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Day Ġ= Ġcalendar . get ( Calendar . DAY _ OF _ MONTH ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Month Ġ= Ġcalendar . get DisplayName ( Calendar . MONTH , ĠCalendar . LONG , Ġlocale ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Year Ġ= Ġcalendar . get ( Calendar . YEAR ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Divider View . text Ġ= Ġ(" $ formatted Day Ġ$ formatted Month Ġ$ formatted Year ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate View . text Ġ= Ġformatted Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Position Ġ!= ĠRecyclerView . NO _ POSITION ) Ġclick Callback . on Item Clicked ( items [ adapter Position ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠUn received Message Holder ( item View : ĠView ) Ġ: ĠBase ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Ġ= ĠitemView . findViewById ( R . id . un received Message Text ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsend Ġ= ĠitemView . findViewById ( R . id . send Un received Message Button ) Ġas ĠProgress Bar ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( item : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . text Ġ= Ġitem . text Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Position Ġ!= ĠRecyclerView . NO _ POSITION ) Ġclick Callback . on Item Clicked ( items [ adapter Position ]) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Auth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= ĠFirebase Functions . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġm Auth . uid !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Ġ= ĠMessages DB Helper ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġitem . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Id Ġ= Ġitem . receiver Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsender Id Ġ= Ġitem . sender Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠUn deliver ed Message ( sender Id , Ġreceiver Id , Ġtext , Ġ( item Ġas ĠUn deliver ed Message ). deliver ed Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// db . push Message ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" receiver Id " Ġto Ġreceiver Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sender Id " Ġto Ġsender Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" deliver ed Id " Ġto Ġmsg . deliver ed Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" text " Ġto Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" token " Ġto Ġcontext . get SharedPreferences (" com . j im ip ur ple . him ich at . prefs ", Ġ 0 ). getString (" firebase Token ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" msg Test ", Ġ" token Ġ" Ġ+ Ġcontext . get SharedPreferences (" com . j im ip ur ple . him ich at . prefs ", Ġ 0 ). getString (" firebase Token ", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Https Callable (" sendMessage ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call ( data ). add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" dialog Message ", Ġ" result Ġ" Ġ+ Ġtask . result ?. data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" text "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . remove ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" dialog Message ", Ġ" error Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" dialog Message ", Ġ" data Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// cancel Button . setOnClickListener Ġ{ cancel Callback ( item )} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠBase ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġbind ( item : ĠMessage ) ĊĠĠĠĠĠĠĠ Ġvar Ġpos : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Item Clicked ( item : ĠMessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠItem ViewType Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠRE CE IVED _ MESSAGE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠS ENT _ MESSAGE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠUN DE LI VER ED _ MESSAGE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠDATE _ ITEM Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }