package Ġv ip . m yst ery 0 . feedback view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġv ip . m yst ery 0 . feedback view . helper . Feedback View Helper Ċ import Ġv ip . m yst ery 0 . feedback view . model . Base Message Ċ import Ġv ip . m yst ery 0 . feedback view . model . System Message Ċ import Ġv ip . m yst ery 0 . tools . utils . equals Date Ċ import Ġv ip . m yst ery 0 . tools . utils . to Calendar Ċ import Ġv ip . m yst ery 0 . tools . utils . to DateTime String Ċ import Ġv ip . m yst ery 0 . tools . utils . to Time String Ċ Ċ class ĠFeedback View Ġ: ĠLinearLayout Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Feedback View " ĊĠĠĠ Ġprivate Ġval Ġinf late : ĠView Ġ= ĠView . inflate ( context , ĠR . layout . layout _ feedback _ view , Ġthis ) ĊĠĠĠ Ġprivate Ġval Ġre cyclerView Ġ= Ġinf late . findViewById < RecyclerView >( R . id . re cyclerView ) ĊĠĠĠ Ġprivate Ġval Ġan nex Button Ġ= Ġinf late . findViewById < ImageView >( R . id . ann ex Button ) ĊĠĠĠ Ġprivate Ġval Ġsend Button Ġ= Ġinf late . findViewById < ImageView >( R . id . send Button ) ĊĠĠĠ Ġprivate Ġval Ġedit Text Ġ= Ġinf late . findViewById < EditText >( R . id . input EditText ) ĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠFeedback Adapter ( context ) ĊĊĠĠĠ Ġprivate Ġvar Ġsend Listener : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġre cyclerView . item Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġan nex Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" è¯· éĢīæĭ© æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Items ( array Of (" ä¸Ĭä¼ł åĽ¾çīĩ ", Ġ" ä¸Ĭä¼ł æĸĩä»¶ ")) Ġ{ Ġ_, Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠFeedback View Helper . instance . do Select Listener ?. select Image () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠFeedback View Helper . instance . do Select Listener ?. select File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Send () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġedit Text . setOn Editor ActionListener Ġ{ Ġ_, Ġaction Id , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Id Ġ== ĠEditor Info . IME _ ACTION _ SEND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Send () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Send Listener ( listener : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Send () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġedit Text . text . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( message . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( send Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" åıĳéĢģ çĽĳåĲ¬ ä¸ºç©º ï¼ģ ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" åıĳéĢģ çļĦ æ¶Īæģ¯ ä¸º ï¼ļ $ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Listener !! ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd All Message ( message List : ĠList < Base Message >, Ġclear Input : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġadapter . message List . size ĊĠĠĠĠĠĠĠ Ġadapter . message List . addAll ( message List ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Inserted ( startIndex , Ġmessage List . size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( clear Input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . text Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Message ( message : ĠBase Message , Ġclear Input : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Message Ġ= Ġadapter . message List . last OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Message Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . message List . add ( System Message ( message . time . to Calendar (). to DateTime String ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . time Ġ- Ġlast Message . time Ġ> Ġ 1 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġmessage . time . to Calendar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġequals Date Ġ= Ġdate . equals Date ( last Message . time . to Calendar ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( equals Date ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . message List . add ( System Message ( date . to Time String ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . message List . add ( System Message ( date . to DateTime String ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . message List . add ( message ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Inserted ( adapter . message List . last Index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( clear Input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . text Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Message ( message : ĠBase Message , Ġclear Input : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġadapter . message List . find Ġ{ Ġmessage . id Ġ== Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( msg Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" æ¶Īæģ¯ ä¸įåŃĺåľ¨ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmsg . copyFrom ( message ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( adapter . message List . indexOf ( msg )) ĊĠĠĠĠĠĠĠ Ġif Ġ( clear Input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . text Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll To Top () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . scrollTo Position ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll To Bottom () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . scrollTo Position ( adapter . item Count Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ