package Ġcom . f zm . chat 3 3 . main . mv vm Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . TextUtils Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . baidu . cr ab sdk . Cr ab SDK Ċ import Ġcom . fu z ame i . common . base . mv vm . Single LiveData Ċ import Ġcom . fu z ame i . common . bus . Live Bus Ċ import Ġcom . fu z ame i . common . executor . App Executors Ċ import Ġcom . fu z ame i . common . ext . request Ċ import Ġcom . fu z ame i . common . ext . result Ċ import Ġcom . fu z ame i . common . ext . start Ċ import Ġcom . fu z ame i . common . net . Result Ċ import Ġcom . fu z ame i . common . net . rx java . ApiException Ċ import Ġcom . fu z ame i . common . utils . Room Utils Ċ import Ġcom . fu z ame i . common . utils . Show Utils Ċ import Ġcom . fu z ame i . common . utils . Tool Utils Ċ import Ġcom . fu z ame i . common . utils . run Ċ import Ġcom . fu z ame i . component service . app . Bus Event Ċ import Ġcom . fu z ame i . component service . app . Loading ViewModel Ċ import Ġcom . fu z ame i . component service . config . AppConfig Ċ import Ġcom . f zm . chat 3 3 . R Ċ import Ġcom . f zm . chat 3 3 . core . bean . MessageState Ċ import Ġcom . f zm . chat 3 3 . core . bean . Relationship Bean Ċ import Ġcom . f zm . chat 3 3 . core . bean . param . to Enc Params Ċ import Ġcom . f zm . chat 3 3 . core . consts . P raise Action . ACTION _ LIKE Ċ import Ġcom . f zm . chat 3 3 . core . consts . P raise Action . ACTION _ RE WARD Ċ import Ġcom . f zm . chat 3 3 . core . db . Chat Database Ċ import Ġcom . f zm . chat 3 3 . core . db . bean .* Ċ import Ġcom . f zm . chat 3 3 . core . db . dao . ChatMessage Dao Ċ import Ġcom . f zm . chat 3 3 . core . global . Chat 3 3 Const .* Ċ import Ġcom . f zm . chat 3 3 . core . global . Login Info Delegate Ċ import Ġcom . f zm . chat 3 3 . core . manager . Cipher Exception Ċ import Ġcom . f zm . chat 3 3 . core . manager . Cipher Manager Ċ import Ġcom . f zm . chat 3 3 . core . manager . Message Manager Ċ import Ġcom . f zm . chat 3 3 . core . net . O ss Model Ċ import Ġcom . f zm . chat 3 3 . core . provider . Info Provider Ċ import Ġcom . f zm . chat 3 3 . core . provider . Sync Info Strategy Ċ import Ġcom . f zm . chat 3 3 . core . repo . Contacts Repository Ċ import Ġcom . f zm . chat 3 3 . core . request . Chat Log History Request Ċ import Ġcom . f zm . chat 3 3 . core . request . Receive Red Packet Request Ċ import Ġcom . f zm . chat 3 3 . core . response . Receive Red Packet Response Ċ import Ġcom . f zm . chat 3 3 . core . source . Chat DataSource Ċ import Ġcom . f zm . chat 3 3 . core . utils . UserInfo Preference Ċ import Ġcom . f zm . chat 3 3 . utils . FileUtils Ċ import Ġcom . google . gson . Gson Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . functions . Consumer Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . kode in . di . K ode in Ċ import Ġorg . kode in . di . conf . global Ċ import Ġorg . kode in . di . generic . instance Ċ import Ġtop . z ib in . l ub an . L ub an Ċ import Ġtop . z ib in . l ub an . On Compress Listener Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠChat ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontacts Repository : ĠContact s Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogin Info Delegate : ĠLogin Info Delegate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchat DataSource : ĠChat DataSource Ċ ): ĠLoading ViewModel (), ĠLogin Info Delegate Ġby Ġlogin Info Delegate Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġchat Dao () Ġ= ĠChat Database . getInstance (). chat Message Dao () ĊĠĠĠ Ġprivate Ġfun Ġroom Key Dao () Ġ= ĠChat Database . getInstance (). room Key Dao () ĊĠĠĠ Ġprivate Ġfun Ġroom Dao () Ġ= ĠChat Database . getInstance (). rooms Dao () ĊĠĠĠ Ġprivate Ġval ĠprivateKey Ġby Ġlazy Ġ{ ĠCipher Manager . get PrivateKey () Ġ} ĊĠĠĠ Ġprivate Ġval Ġgroup Key Cache Ġby Ġlazy Ġ{ ĠHashMap < String , ĠRoom Key >() Ġ} ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson Ġby ĠK ode in . global . instance () ĊĊĠĠĠ Ġprivate Ġval Ġ_ chat Log Result Ġby Ġlazy Ġ{ ĠMutable LiveData < Chat Log Result >() Ġ} ĊĠĠĠ Ġval Ġchat Log Result : ĠLive Data < Chat Log Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ chat Log Result ĊĊĠĠĠ Ġprivate Ġval Ġ_ sendMessage Ġby Ġlazy Ġ{ ĠMutable LiveData < ChatMessage Result >() Ġ} ĊĠĠĠ Ġval ĠsendMessage : ĠLive Data < ChatMessage Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ sendMessage ĊĊĠĠĠ Ġprivate Ġval Ġ_ revoke Message Ġby Ġlazy Ġ{ ĠMutable LiveData < Any >() Ġ} ĊĠĠĠ Ġval Ġre voke Message : ĠLive Data < Any > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ revoke Message ĊĊĠĠĠ Ġprivate Ġval Ġ_ set Mut ed Single Ġby Ġlazy Ġ{ ĠMutable LiveData < Long >() Ġ} ĊĠĠĠ Ġval Ġset Mut ed Single : ĠLive Data < Long > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ set Mut ed Single ĊĊĠĠĠ Ġprivate Ġval Ġ_ receive Red Packet Ġby Ġlazy Ġ{ ĠMutable LiveData < Receive Red Packet Result >() Ġ} ĊĠĠĠ Ġval Ġreceive Red Packet : ĠLive Data < Receive Red Packet Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ receive Red Packet ĊĊĠĠĠ Ġprivate Ġval Ġ_ has Relationship Ġby Ġlazy Ġ{ ĠMutable LiveData < Has Relationship Result >() Ġ} ĊĠĠĠ Ġval Ġhas Relationship : ĠLive Data < Has Relationship Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ has Relationship ĊĊĠĠĠ Ġprivate Ġval Ġ_ get Room Info Ġby Ġlazy Ġ{ ĠMutable LiveData < Get Room Info Result >() Ġ} ĊĠĠĠ Ġval Ġget Room Info : ĠLive Data < Get Room Info Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ get Room Info ĊĊĠĠĠ Ġprivate Ġval Ġ_ get Room Users Ġby Ġlazy Ġ{ ĠMutable LiveData < Get Room Users Result >() Ġ} ĊĠĠĠ Ġval Ġget Room Users : ĠLive Data < Get Room Users Result > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ get Room Users ĊĊĠĠĠ Ġprivate Ġval Ġ_ msg Like Result Ġby Ġlazy Ġ{ ĠMutable LiveData < Pair < String , ĠString >>() Ġ} ĊĠĠĠ Ġval Ġmsg Like Result : ĠLive Data < Pair < String , ĠString >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ msg Like Result ĊĊĠĠĠ Ġprivate Ġval Ġ_ notify Changed Ġby Ġlazy Ġ{ ĠMutable LiveData < Any >() Ġ} ĊĠĠĠ Ġval Ġnotify Changed : ĠLive Data < Any > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ notify Changed ĊĊĠĠĠ Ġprivate Ġval Ġnotify Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġnotify DataSet Changed ( delay : ĠLong Ġ= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( notify . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify . set ( true ) ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notify . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ notify Changed . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Chat Log History ( context : ĠContext , Ġtarget Id : ĠString , Ġchannel Type : ĠInt , Ġstart Id : ĠString , Ġtime Stamp : ĠLong , Ġsize : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ç§ģ èģ Ĭ ç¾¤ èģ Ĭ åħ± çĶ¨ ä¸Ģ å¥Ĺ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠChat Log History Request () ĊĠĠĠĠĠĠĠ Ġrequest . id Ġ= Ġtarget Id ĊĠĠĠĠĠĠĠ Ġrequest . start Id Ġ= Ġstart Id ĊĠĠĠĠĠĠĠ Ġrequest . number Ġ= Ġsize ĊĊĠĠĠĠĠĠĠ Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ FR I END Ġ&& Ġtarget Id Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( ArrayList (), Ġ"- 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åħĪ ä»İ æľ¬åľ° æķ°æį®åºĵ ä¸Ń æŁ¥è¯¢ èģ Ĭ å¤© è®°å½ķ ĊĠĠĠĠĠĠĠ Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ ROOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). getGroup Chat Log Local ( channel Type , Ġtarget Id , Ġtime Stamp , Ġsize ). run ( Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( context , Ġtarget Id , Ġchannel Type , Ġrequest , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). get Private Chat Log Local ( target Id , Ġtime Stamp , Ġsize ). run ( Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( context , Ġtarget Id , Ġchannel Type , Ġrequest , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Chat Log From Id ( context : ĠContext , Ġtarget Id : ĠString , Ġchannel Type : ĠInt , Ġlog Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ ROOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). getGroup Chat Log From Id ( target Id , Ġlog Id ). run ( Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( context , Ġtarget Id , Ġchannel Type , Ġnull , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). get Private Chat Log From Id ( target Id , Ġlog Id ). run ( Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( context , Ġtarget Id , Ġchannel Type , Ġnull , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġprivate Ġfun Ġprocess Message ( context : ĠContext , Ġtarget Id : ĠString , Ġchannel Type : ĠInt , Ġrequest : ĠChat Log History Request ?, Ġchat Messages : ĠMutable List < ChatMessage >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġno More Chat Log Ġ= ĠUserInfo Preference . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean Pref ( UserInfo Preference . NO _ MORE _ CHAT _ LOG Ġ+ Ġchannel Type Ġ+ Ġ"-" Ġ+ Ġtarget Id , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠObservable . just ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . from ( App Executors . database ThreadPool ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġchat Messages . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġchat Messages [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ ROOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Group Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ FR I END ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Friend Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . msg Type Ġ== ĠChat Message . Type . NOTIFICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Notification ( context , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . message State Ġ== ĠMessage State . SEND ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æķ°æį®åºĵ æŁ¥ åĩº æŃ£åľ¨ åıĳéĢģ çļĦ æ¶Īæģ¯ ï¼Į ä½Ĩ åıĳéĢģ éĺŁåĪĹ éĩĮ æ²¡æľī ï¼Į åĪĻ æłĩè®° ä¸º åıĳéĢģ å¤±è´¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Message Manager . contains Message ( message . msg Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . message State Ġ= ĠMessage State . SEND _ FAIL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). update MessageState ( message . channel Type , Ġmessage . msg Id , Ġmessage . message State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnap Msg Ġ= Ġ( message . is Snap Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmessage . snap Count ing Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmessage . destroy Time Ġ<= ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnap Notification Ġ= Ġmessage . msg Type Ġ== Ġ 6 Ġ&& Ġmessage . msg . type Ġ== Ġ 1 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap Msg Ġ|| Ġsnap Notification ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġmessage . channel Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Id Ġ= Ġmessage . log Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). delete Message ( channel , Ġlog Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Messages . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( chat Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġmessages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( messages . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Log Ġ= Ġmessages [ messages . size Ġ- Ġ 1 ]. log Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . reverse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( messages , Ġnext Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! no More Chat Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Chat Log From Server ( context , Ġchannel Type , Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( ArrayList (), Ġ"- 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( chat Messages , Ġ"- 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ æľįåĬ¡ ç«¯ èİ·åıĸ èģ Ĭ å¤© è®°å½ķ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠĠ Ġ èģ Ĭ å¤© è®°å½ķ è¯·æ±Ĥ åıĤæķ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Chat Log From Server ( context : ĠContext , Ġchannel Type : ĠInt , Ġrequest : ĠChat Log History Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . get Chat Log History ( channel Type , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . logs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" - 1 " Ġ== Ġit . next Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æłĩè®° ä¸º æĹł æĽ´ æĹ© çļĦ æ¶Īæģ¯ è®°å½ķ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUserInfo Preference . getInstance (). set Boolean Pref ( UserInfo Preference . NO _ MORE _ CHAT _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġchannel Type Ġ+ Ġ"" Ġ+ Ġrequest . id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( it . logs , Ġit . next Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( it . logs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġchat Messages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chat Messages . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġchat Messages . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġchat Messages [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ ROOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Group Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( channel Type Ġ== ĠCHAN NEL _ FR I END ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Friend Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . msg Type Ġ== ĠChat Message . Type . NOTIFICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Notification ( context , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . msg . type Ġ== Ġ 1 5 Ġ|| Ġmessage . msg . type Ġ== Ġ 1 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Messages . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . msg Type Ġ== ĠChat Message . Type . FORWARD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Forward Message Content ( context , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . msg Type Ġ== ĠChat Message . Type . TRANSFER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . record Id Ġ= Ġmessage . msg . record Id . split ("," . to Regex ())[ if Ġ( message . is Sent Type ) Ġ 0 Ġelse Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . msg Type Ġ== ĠChat Message . Type . RECE IP T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( message . msg . record Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . record Id Ġ= Ġmessage . msg . record Id . split ("," . to Regex ())[ if Ġ( message . is Sent Type ) Ġ 1 Ġelse Ġ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Messages . reverse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( chat Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġchat Messages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( message Ġin Ġchat Messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). getMessage ById ( message . log Id , Ġmessage . channel Type ). run ( Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). update Ignore ( it . channel Type , Ġit . log Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠConsumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). insert ( message ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" - 1 " Ġ== Ġit . next Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æłĩè®° ä¸º æĹł æĽ´ æĹ© çļĦ æ¶Īæģ¯ è®°å½ķ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUserInfo Preference . getInstance (). set Boolean Pref ( UserInfo Preference . NO _ MORE _ CHAT _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġchannel Type Ġ+ Ġ"" Ġ+ Ġrequest . id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( chat Messages , Ġit . next Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" - 1 " Ġ== Ġit . next Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æłĩè®° ä¸º æĹł æĽ´ æĹ© çļĦ æ¶Īæģ¯ è®°å½ķ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUserInfo Preference . getInstance (). set Boolean Pref ( UserInfo Preference . NO _ MORE _ CHAT _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġchannel Type Ġ+ Ġ"" Ġ+ Ġrequest . id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( ArrayList (), Ġit . next Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}, ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Show Utils . show Toast Normal ( context , Ġit . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ chat Log Result . value Ġ= ĠChat Log Result ( ArrayList (), Ġrequest . start Id ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt Friend Message ( item : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( item . msg . encrypted Msg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . encrypted Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( item . decrypt PublicKey ) Ġ&& Ġ! TextUtils . isEmpty ( privateKey )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Key Ġ= Ġitem . msg . from Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Key Ġ= Ġitem . msg . to Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat File Ġ= ĠCipher Manager . decrypt String ( item . msg . encrypted Msg !! , Ġitem . decrypt PublicKey , ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg Ġ= Ġgson . fromJson ( chat File , ĠChat File :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . from Key Ġ= Ġfrom Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . to Key Ġ= Ġto Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). insert ( item ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCr ab SDK . upload Exception ( Cipher Exception ( getUserId (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser . value ?. publicKey , Ġitem . decrypt PublicKey , Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt Group Message ( item : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( item . msg . encrypted Msg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . encrypted Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdecrypt Key Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . kid Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( privateKey )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġroom Key : ĠRoom Key ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Key Ġ= Ġgroup Key Cache [ item . receive Id Ġ+ Ġ"-" Ġ+ Ġitem . msg . kid ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Key Ġ= ĠChat Database . getInstance (). room Key Dao (). get Room Key ById ( item . receive Id , Ġitem . msg . kid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Key Cache [ item . receive Id Ġ+ Ġ"-" Ġ+ Ġitem . msg . kid ] Ġ= Ġroom Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Key Ġ= Ġroom Key !!. key Safe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkid Ġ= Ġitem . msg . kid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat File Ġ= ĠCipher Manager . decrypt Symmetric ( item . msg . encrypted Msg !! , Ġdecrypt Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg Ġ= Ġgson . fromJson ( chat File , ĠChat File :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . kid Ġ= Ġkid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ Ġchat Dao (). insert ( item ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCr ab SDK . upload Exception ( Cipher Exception ( getUserId (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser . value ?. publicKey , Ġdecrypt Key , Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĭ ¼ æİ¥ å¤ĦçĲĨ åĲĪå¹¶ è½¬ åıĳ æ¶Īæģ¯ çļĦ content åŃĹæ®µ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġitem Ġ Ġ å¾ħ è§£æŀĲ çļĦ éĢļçŁ¥ æ¶Īæģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Forward Message Content ( context : ĠContext , Ġitem : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġitem . msg . source Log ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("${ it . sender Info . nickname }: ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . msg Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . SYSTEM , ĠChat Message . Type . TEXT Ġ-> Ġbuilder . append ( it . msg . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . AUDIO Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . IMAGE Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . RED _ PACKET Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . VIDEO Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . FILE Ġ-> Ġbuilder . append ("${ context . getString ( R . string . core _ msg _ type 1 2 )} ${ it . msg . fileName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . FORWARD Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 7 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . TRANSFER Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . RECE IP T Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 9 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . Type . INV IT ATION Ġ-> Ġbuilder . append ( context . getString ( R . string . core _ msg _ type 1 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġbuilder . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( item . msg . source Channel Ġ== ĠCHAN NEL _ ROOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å°Ŀè¯ķ è§£ å¯Ĩ è½¬ åıĳ çļĦ source Name ï¼Į éĢļå¸¸ æĥħåĨµä¸ĭ æĺ¯ æĺİ æĸĩ ï¼Į ä¸įéľĢè¦ģ è§£ å¯Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . msg . source Name . split ( AppConfig . ENC _ IN FIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . size Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= ĠChat Database . getInstance (). room Key Dao (). get Room Key ById ( pair [ 2 ], Ġpair [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . source Name Ġ= ĠCipher Manager . decrypt Symmetric ( pair [ 0 ], Ġroom Key . key Safe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Notification ( context : ĠContext , Ġitem : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( item . msg . operator ) Ġ&& ĠText Utils . isEmpty ( item . msg . target ) Ġ&& ĠText Utils . isEmpty ( item . msg . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åħ¼ å®¹ æĹ§ çīĪæľ¬ æ¶Īæģ¯ çļĦ æĺ¾ç¤º ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . content Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . type Ġ== Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . sender Id Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ screenshots _ from _ me ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ screenshots _ from _ other ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . msg . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRE VOKE _ MSG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ revoke _ by _ self ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ revoke _ by _ other , Ġoperator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). delete Message ( item . channel Type , Ġitem . msg . log Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE _ GROUP Ġ-> Ġif Ġ( TextUtils . isEmpty ( item . msg . target )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ create _ group _ by _ self ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ create _ group _ by _ other , Ġoperator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . msg . room Name . split ( AppConfig . ENC _ IN FIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġif Ġ( pair . size Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= Ġroom Key Dao (). get Room Key ById ( pair [ 2 ], Ġpair [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= ĠCipher Manager . decrypt Symmetric ( pair [ 0 ], Ġroom Key . key Safe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ add _ group _ for _ other , Ġtarget , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ add _ group _ for _ other , Ġtarget , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . msg . room Name . split ( AppConfig . ENC _ IN FIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġif Ġ( pair . size Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= Ġroom Key Dao (). get Room Key ById ( pair [ 2 ], Ġpair [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= ĠCipher Manager . decrypt Symmetric ( pair [ 0 ], Ġroom Key . key Safe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= Ġitem . msg . room Name . substring ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ add _ group _ by _ other , Ġoperator , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ add _ group _ by _ other , Ġoperator , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEXIT _ GROUP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ remove _ friend _ by _ self , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK ICK _ OUT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ remove _ friend _ by _ other , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN _ GROUP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ add _ friend , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDIS MIS S _ GROUP Ġ-> Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ dis so v le ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF RI END _ IN _ GROUP Ġ-> Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ add _ friend _ by _ self , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( item . msg . target Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ add _ friend _ by _ other , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE _ FR I END Ġ-> Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ remove _ friend _ by _ self ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ remove _ friend _ by _ other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCHANGE _ GROUP _ OWNER Ġ-> Ġif Ġ( item . msg . target Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ set _ master _ to _ me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ set _ master _ to _ other , Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCHANGE _ GROUP _ ADMIN Ġ-> Ġif Ġ( item . msg . target Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ set _ admin _ to _ me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ group _ set _ admin _ to _ other , Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCHANGE _ GROUP _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . msg . room Name . split ( AppConfig . ENC _ IN FIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġif Ġ( pair . size Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= Ġroom Key Dao (). get Room Key ById ( pair [ 2 ], Ġpair [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= ĠCipher Manager . decrypt Symmetric ( pair [ 0 ], Ġroom Key . key Safe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= Ġitem . msg . room Name . substring ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ change _ group _ name _ by _ self , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ change _ group _ name _ by _ self , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . msg . room Name . split ( AppConfig . ENC _ IN FIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġif Ġ( pair . size Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= Ġroom Key Dao (). get Room Key ById ( pair [ 2 ], Ġpair [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= ĠCipher Manager . decrypt Symmetric ( pair [ 0 ], Ġroom Key . key Safe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . room Name Ġ= Ġitem . msg . room Name . substring ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ change _ group _ name _ by _ other , Ġoperator , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ change _ group _ name _ by _ other , Ġoperator , Ġitem . msg . room Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Dao (). update Name ( item . msg . room Name , Ġitem . receive Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLive Bus . of ( Bus Event :: class . java ). contacts Refresh (). setValue ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRE CE IVE _ RED _ PACKET Ġ-> Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . owner , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . owner Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ red _ packet _ receive _ by _ self ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ red _ packet _ receive _ from _ other , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . operator , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ red _ packet _ receive _ by _ other , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBE CO ME _ FR I END Ġ-> Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ add _ friend _ success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM UTE _ IN _ GROUP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= Ġif Ġ( item . msg . operator Ġ== Ġ" 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ tips _ group _ admin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcontext . getString ( R . string . core _ tips _ group _ master ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . msg . muted Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ speak _ setting _ all _ enable , Ġoperator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 , Ġ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġitem . msg . names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġif Ġ( item . msg . muted Type Ġ== Ġ 2 Ġ&& Ġitem . msg . opt Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . core _ speak _ disable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcontext . getString ( R . string . core _ speak _ enable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnames . take ( 6 ). indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( names [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġnames . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ sl ight _ pause )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . size Ġ> Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ people _ count _ etc , Ġnames . size , Ġmode )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ people _ count , Ġnames . size , Ġmode )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġbuilder . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ speak _ setting _ all _ disable , Ġoperator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS NAP _ DESTROY Ġ-> Ġ// Ġ éĺħ åĲİ åį³ çĦ ļ çĦ ļ æ¯ ģ æ¶Īæģ¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠåĪłéĻ¤ è¿ĺ æ²¡ å¼Ģå§ĭ è¯» çļĦ éĺħ åĲİ åį³ çĦ ļ æ¶Īæģ¯ ï¼Ī åĽłä¸º åħ¶ä»ĸ ç«¯ å·² è¯» ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ChatMessage Dao . visible Snap Msg . contains ("${ item . channel Type }-${ item . msg . log Id } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). delete Un read Snap Message ( item . channel Type , Ġitem . msg . log Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSCREEN _ SHOT Ġ-> Ġif Ġ( item . sender Id Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ screenshots _ from _ me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ screenshots _ from _ other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIN V ITE _ GROUP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġitem . msg . names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnames . take ( 6 ). indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( names [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġnames . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ sl ight _ pause )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . size Ġ> Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ invite _ join _ etc , Ġnames . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( context . getString ( R . string . core _ invite _ join , Ġnames . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġbuilder . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRE CE IP T _ SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrecord Id çļĦ ç»Ħ æĪĲ ç»ĵæŀĦ ï¼ļ" From Id , To Id " ï¼Į åĪĨåĪ« ä»£è¡¨ è½¬ åĩº id åĴĮ è½¬ åħ¥ id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . record Id Ġ= Ġitem . msg . record Id . split ("," . to Regex ())[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ receipt _ from _ me ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . record Id Ġ= Ġitem . msg . record Id . split ("," . to Regex ())[ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ receipt _ from _ other ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). update Record Id ( item . msg . log Id , Ġitem . msg . record Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUPDATE _ GROUP _ KEY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . receive Id Ġ!= Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġåıª å¤ĦçĲĨ åıĳ ç»Ļ èĩªå·±çļĦ å¯Ĩ éĴ¥ éĢļçŁ¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° ç¾¤ å¯Ĩ éĴ¥ æ¶Īæģ¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Key Ġ= Ġif Ġ( Cipher Manager . has DH KeyPair ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠCipher Manager . decrypt String ( item . msg . key , Ġitem . msg . from Key , ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġitem . msg . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Key ( item . msg . roomId , Ġitem . msg . kid , Ġitem . msg . key , Ġitem . msg . from Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Key ( item . msg . roomId , Ġitem . msg . kid , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Key ( item . msg . roomId , Ġitem . msg . kid , Ġitem . msg . key , Ġitem . msg . from Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Key Dao (). insert ( room Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGROUP _ RE JECT _ MSG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠInfo Provider . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. strategy ( Sync Info Strategy ( item , Ġitem . msg . target , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Friend Bean :: class . java )?. displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . msg . content Ġ= Ġcontext . getString ( R . string . core _ reject _ join _ group , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPR AI SE _ MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° èµ ŀ èµ ı è¯¦æĥħ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġchat Dao (). getMessage ById Sync ( item . msg . log Id , Ġitem . channel Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Dao (). update P raise ( item . msg . log Id , Ġitem . channel Type , Ġtemp . pr aise . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çĤ¹ èµ ŀ ä¸įèĥ½ åıĸæ¶Ī ï¼Ī åıª å¢ŀ ä¸į åĩı ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . like Ġ> Ġlike ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlike Ġ= Ġitem . msg . like ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æīĵ èµ ı ä¸įèĥ½ åıĸæ¶Ī ï¼Ī åıª å¢ŀ ä¸į åĩı ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . reward Ġ> Ġreward ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Ġ= Ġitem . msg . reward ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . msg . operator Ġ== Ġget UserId ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . msg . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ LIKE Ġ-> Ġlike () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RE WARD Ġ-> Ġreward () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Res end Message ( message : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sendMessage . value Ġ= ĠChat Message Result ( message , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġupload Image ( context : ĠContext , Ġimage Path : ĠString , Ġmessage : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġ 1 8 - 5 - 2 5 Ġ Ġ è¿ĻéĩĮ ä¸ºäºĨ ç®Ģåįķ èµ· è§ģ ï¼Į æ²¡æľī åĪ¤æĸŃ file çļĦ ç±»åŀĭ ĊĠĠĠĠĠĠĠ Ġif Ġ(! File ( image Path ). exists () Ġ|| Ġimage Path . contains ( AppConfig . ENC _ PREFIX )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image _ no _ exist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image Path . endsWith (" gif ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgif åĽ¾ ä¸į åİĭç¼© ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Image Internal ( context , ĠFile ( image Path ), Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ub an . with ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore By ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Dir ( FileUtils . getImage Cache Path ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Compress Listener ( object Ġ: ĠOn Compress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image _ zip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Width Ġ= ĠTool Utils . getLocal Image Height Width ( file . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Width [ 0 ] Ġ<= Ġ 0 Ġ|| Ġheight Width [ 1 ] Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Image Internal ( context , Ġfile , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image _ zip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). launch () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Image Internal ( context : ĠContext , Ġfile : ĠFile , Ġmessage : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ ĠO ss Model . getInstance (). upload Media ( message . to Enc Params (), Ġfile . absolute Path , ĠO ss Model . PI CTURE , Ġobject Ġ: ĠO ss Model . Up Load CallBack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Width Ġ= ĠTool Utils . getLocal Image Height Width ( file . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Width [ 0 ] Ġ<= Ġ 0 Ġ|| Ġheight Width [ 1 ] Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . imageUrl Ġ= Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sendMessage . value Ġ= ĠChat Message Result ( message , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( current Size : ĠLong , Ġtotal Size : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupload File ( context : ĠContext , ĠfilePath : ĠString , Ġmessage : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ file _ no _ exist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( FileUtils . getLength ( filePath ) Ġ> ĠMAX _ UPLOAD _ FILE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ file _ size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠO ss Model . getInstance (). upload Media ( message . to Enc Params (), Ġfile . absolute Path , ĠO ss Model . FILE , Ġobject Ġ: ĠO ss Model . Up Load CallBack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . file Url Ġ= Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sendMessage . value Ġ= ĠChat Message Result ( message , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( current Size : ĠLong , Ġtotal Size : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupload Audio ( context : ĠContext , Ġtarget Id : ĠString , Ġchannel Type : ĠInt , Ġis Snap : ĠInt , Ġseconds : ĠFloat , Ġaudio Path : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ audio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( audio Path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ audio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġseconds . toInt () Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġchat File Ġ= ĠChat File . new Audio ("", Ġ 0 , Ġaudio Path ) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠChat Message . create ( target Id , Ġchannel Type , Ġchat File . chat FileType , Ġis Snap , Ġchat File ) ĊĠĠĠĠĠĠĠ ĠO ss Model . getInstance (). upload Media ( message . to Enc Params (), Ġfile . absolute Path , ĠO ss Model . VOICE , Ġobject Ġ: ĠO ss Model . Up Load CallBack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdur ations Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dur ations Ġ> Ġ 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdur ations Ġ= Ġ 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . media Url Ġ= Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . duration Ġ= Ġdur ations . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sendMessage . value Ġ= ĠChat Message Result ( message , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( current Size : ĠLong , Ġtotal Size : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ audio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupload Video ( context : ĠContext , ĠfilePath : ĠString , Ġmessage : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ video _ no _ exist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( FileUtils . getLength ( filePath ) Ġ> ĠMAX _ UPLOAD _ FILE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ video _ size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠO ss Model . getInstance (). upload Media ( message . to Enc Params (), Ġfile . absolute Path , ĠO ss Model . VIDEO , Ġobject Ġ: ĠO ss Model . Up Load CallBack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . msg . media Url Ġ= Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sendMessage . value Ġ= ĠChat Message Result ( message , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( current Size : ĠLong , Ġtotal Size : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShow Utils . show Toast ( context , ĠR . string . chat _ error _ upload _ video ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Local Block ( id : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontacts Repository . is Local Block ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Local Friend ById ( id : ĠString ?) Ġ: ĠFriend Bean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontacts Repository . getLocal Friend ById ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Local Room ById ( id : ĠString ?) Ġ: ĠRoom List Bean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontacts Repository . getLocal Room ById ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġre voke Message ( id : ĠString , Ġtype : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading () ĊĠĠĠĠĠĠĠ Ġ}. request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . revoke Message ( id , Ġtype ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ revoke Message . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}, ĠonComplete Ġ= Ġ{ dismiss () }) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Mut ed Single ( roomId : ĠString , ĠuserId : ĠString , Ġdeadline : ĠLong ){ ĊĠĠĠĠĠĠĠ Ġstart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading () ĊĠĠĠĠĠĠĠ Ġ}. request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . set Mut ed Single ( roomId , ĠuserId , Ġdeadline ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Mut ed Single . value Ġ= Ġdeadline ĊĠĠĠĠĠĠĠ Ġ}, ĠonComplete Ġ= Ġ{ dismiss () }) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreceive Red Packet ( message : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading () ĊĠĠĠĠĠĠĠ Ġ}. request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠReceive Red Packet Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . packet Id Ġ= Ġmessage . msg . packet Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . receive Red Packet ( request ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ receive Red Packet . value Ġ= ĠReceive Red Packet Result ( message , Ġtrue , Ġit , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ}, ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ receive Red Packet . value Ġ= ĠReceive Red Packet Result ( message , Ġfalse , Ġnull , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}, ĠonComplete Ġ= Ġ{ dismiss () }) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Relationship ( channel Type : ĠInt , Ġid : ĠString , Ġold Deleted : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( channel Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ ROOM Ġ-> Ġchat DataSource . has Relationship ( channel Type , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHAN NEL _ FR I END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¥½ åıĭ åħ³ç³» ä»İ æľ¬åľ° åĪ¤æĸŃ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( Relationship Bean (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Friend Ġ= Ġcontacts Repository . is Local Friend ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠResult . Error ( ApiException ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. result ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ has Relationship . value Ġ= ĠHas Relationship Result ( true , Ġold Deleted , Ġit , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ}, ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ has Relationship . value Ġ= ĠHas Relationship Result ( false , Ġold Deleted , Ġnull , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room Info ( target Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontacts Repository . get Room Info ( target Id ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ( on Success Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Utils . run ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Database . getInstance (). recent Message Dao (). change Sticky ( target Id , Ġit . get On Top ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Database . getInstance (). recent Message Dao (). change Dist urb ( target Id , Ġit . get No Dist ur bing ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ get Room Info . value Ġ= ĠGet Room Info Result ( true , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}, ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ get Room Info . value Ġ= ĠGet Room Info Result ( false , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room Users ( target Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontacts Repository . get Room Users ( target Id ) ĊĠĠĠĠĠĠĠ Ġ}. result { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ get Room Users . value Ġ= ĠGet Room Users Result ( target Id , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmessage Like ( channel Type : ĠInt , Ġlog Id : ĠString , Ġaction : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . message Like ( channel Type , Ġlog Id , Ġaction ) ĊĠĠĠĠĠĠĠ Ġ}. result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ msg Like Result . value Ġ= ĠPair ( log Id , Ġaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ---------------- --------------- Chat Row Base ä¸ŃçļĦ è¯·æ±Ĥ ---------------- --------------- */ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĺħè¯» éĺħ åĲİ åį³ çĦ ļ æ¶Īæģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread Snap Message ( log Id : ĠString , Ġtype : ĠInt ): ĠLive Data < Result < Any >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠSingle LiveData < Result < Any >>() ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . read Snap Message ( log Id , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĤ¹åĩ» ç¾¤ èģ Ĭ éĤ Ģ è¯· æ¶Īæģ¯ æĹ¶ ï¼Į åĪ¤æĸŃ æĺ¯åĲ¦ åľ¨ ç¾¤ ä¸Ń ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Relationship ( channel Type : ĠInt , Ġid : ĠString ): ĠLive Data < Relationship Bean > Ġ{ ĊĠĠĠĠĠĠĠ Ġloading () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠSingle LiveData < Relationship Bean >() ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat DataSource . has Relationship ( channel Type , Ġid ). data OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ç¾¤ æĪĲåĳĺ ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Room UserInfo ( roomId : ĠString , ĠuserId : ĠString ): ĠLive Data < Result < Room User Bean >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠSingle LiveData < Result < Room User Bean >>() ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontacts Repository . get Room UserInfo ( roomId , ĠuserId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠChat Log Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġchat List : ĠList < ChatMessage >, ĊĠĠĠĠĠĠĠ Ġval Ġnext Log Id : ĠString Ċ ) Ċ Ċ data Ġclass ĠChat Message Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠChat Message , ĊĠĠĠĠĠĠĠ Ġval Ġres end : ĠBoolean Ċ ) Ċ Ċ data Ġclass ĠReceive Red Packet Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġmessage : ĠChat Message , ĊĠĠĠĠĠĠĠ Ġval Ġsuccess : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġreceive Red Packet Response : ĠReceive Red Packet Response ?, ĊĠĠĠĠĠĠĠ Ġval Ġapi Exception : ĠApiException ? Ċ ) Ċ Ċ data Ġclass ĠHas Relationship Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġsuccess : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġold Deleted : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġrelationship Bean : ĠRelationship Bean ?, ĊĠĠĠĠĠĠĠ Ġval Ġapi Exception : ĠApiException ? Ċ ) Ċ Ċ data Ġclass ĠGet Room Info Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġsuccess : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġroom Info Bean : ĠRoom Info Bean ? Ċ ) Ċ Ċ data Ġclass ĠGet Room Users Result Ġ( ĊĠĠĠĠĠĠĠ Ġval Ġtarget Id : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġwrapper : ĠRoom User Bean . Wrapper ? Ċ )