package Ġxyz . k linker . messenger . fragment . message . send Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . os . Handler Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġxyz . k linker . messenger . R Ċ import Ġxyz . k linker . messenger . activity . Messenger Activity Ċ import Ġxyz . k linker . messenger . api . implementation . Account Ċ import Ġxyz . k linker . messenger . fragment . conversation . Conversation List Fragment Ċ import Ġxyz . k linker . messenger . fragment . message . Message List Fragment Ċ import Ġxyz . k linker . messenger . shared . data . DataSource Ċ import Ġxyz . k linker . messenger . shared . data . MimeType Ċ import Ġxyz . k linker . messenger . shared . data . Settings Ċ import Ġxyz . k linker . messenger . shared . data . model . Message Ċ import Ġxyz . k linker . messenger . shared . data . pojo . Keyboard Layout Ċ import Ġxyz . k linker . messenger . shared . service . New Messages Check Service Ċ import Ġxyz . k linker . messenger . shared . util .* Ċ import Ġjava . util .* Ċ Ċ class ĠSend Message Manager ( private Ġval Ġfragment : ĠMessage List Fragment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġactivity : ĠFragment Activity ? Ġby Ġlazy Ġ{ Ġfragment . activity Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġarg Manager ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfragment . arg Manager ĊĠĠĠ Ġprivate Ġval Ġattach Manager ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfragment . attach Manager ĊĠĠĠ Ġprivate Ġval Ġmessage Loader ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfragment . message Loader ĊĊĠĠĠ Ġinternal Ġval Ġmessage Entry : ĠEditText Ġby Ġlazy Ġ{ Ġfragment . root View !!. findViewById < View >( R . id . message _ entry ) Ġas ĠEditText Ġ} ĊĠĠĠ Ġprivate Ġval Ġsend Progress : ĠProgress Bar ? Ġby Ġlazy Ġ{ Ġfragment . root View ?. findViewById < View >( R . id . send _ progress ) Ġas ĠProgress Bar ? Ġ} ĊĠĠĠ Ġprivate Ġval Ġattach : ĠView Ġby Ġlazy Ġ{ Ġfragment . root View !!. findViewById < View >( R . id . attach ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġsend : ĠFloating ActionButton Ġby Ġlazy Ġ{ Ġfragment . root View !!. findViewById < View >( R . id . send ) Ġas ĠFloating ActionButton Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġdelayed Timer : ĠCount Down Timer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdelayed Sending Handler : ĠHandler Ġby Ġlazy Ġ{ ĠHandler () Ġ} ĊĊĠĠĠ Ġfun Ġinit Send bar () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelayed Sending Handler . post Ġ{ Ġ} Ġ// Ġinitialize ĊĊĠĠĠĠĠĠĠ ĠKeyboard Layout Helper . apply Layout ( message Entry ) ĊĠĠĠĠĠĠĠ Ġmessage Entry . text Size Ġ= ĠSettings . large Font . toFloat () ĊĊĠĠĠĠĠĠĠ Ġmessage Entry . setOn Editor ActionListener Ġ{ Ġ_, Ġaction Id , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Id Ġ== ĠEditor Info . IME _ ACTION _ SEND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission Then Send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage Entry . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattach Layout : ĠView ? Ġ= Ġfragment . root View !!. findViewById ( R . id . attach _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attach Layout ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach . is Sound Effects Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach . is Sound Effects Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsend On Enter Ġ= ĠSettings . keyboard Layout Ġ=== ĠKeyboard Layout . SEND ĊĠĠĠĠĠĠĠ Ġmessage Entry . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . counter Calculator . update Counter Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send On Enter Ġ&& Ġchar Sequence . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Key Ġ= Ġchar Sequence [ char Sequence . length Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Key Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission Then Send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send Progress ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmessage Entry . text . toString (). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġur is Ġ= ĠArrayList < Media Message >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach Manager . currently Attached . map To ( uris ) Ġ{ ĠMedia Message ( it . media Uri , Ġit . mime Type ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . isEmpty () Ġ&& Ġur is . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcancel Ġdelayed Ġsending Ġfor Ġempty Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Delayed Sending Components ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġthe Ġdelayed Ġsending , Ġif Ġthe Ġuser Ġmakes Ġa Ġchange Ġto Ġthe Ġentered Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Delayed Sending Components ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Sending Handler . post Delayed ({ ĠsendMessage ( uris , Ġfalse ) Ġ}, ĠSettings . delayed Sending Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġaccent Ġ= Ġfragment . arg Manager . color Accent ĊĠĠĠĠĠĠĠ Ġsend Progress ?. progress Tint List Ġ= ĠColor State List . valueOf ( accent ) ĊĠĠĠĠĠĠĠ Ġsend Progress ?. progress Background Tint List Ġ= ĠColor State List . valueOf ( accent ) ĊĠĠĠĠĠĠĠ Ġsend Progress ?. progress Tint Mode Ġ= ĠPort er D uff . Mode . SRC _ IN ĊĠĠĠĠĠĠĠ Ġsend Progress ?. progress Tint Mode Ġ= ĠPort er D uff . Mode . SRC _ IN ĊĠĠĠĠĠĠĠ Ġsend . setOnClickListener Ġ{ Ġrequest Permission Then Send () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsend . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠSettings . signature ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġsig Ġ!= Ġnull Ġ&& Ġ! sig . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelayed Sending Ġ= ĠSettings . delayed Sending Timeout Ġ!= Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ&& Ġdelayed Sending Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Items ( R . array . send _ button _ signature _ delay ) Ġ{ Ġ_, Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġschedule Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠsendMessage On Fragment Closed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġrequest Permission Then Send ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! signature Ġ&& Ġdelayed Sending Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Items ( R . array . send _ button _ no _ signature _ delay ) Ġ{ Ġ_, Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġschedule Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠsendMessage On Fragment Closed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ&& Ġ! delayed Sending Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Items ( R . array . send _ button _ signature _ no _ delay ) Ġ{ Ġ_, Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġschedule Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġrequest Permission Then Send ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . send _ as _ scheduled _ message _ question ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . yes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġschedule Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( android . R . string . no ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠMess enger Activity )?. nav Controller ?. drawer Item Clicked ( R . id . menu _ conversation _ schedule ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Delayed Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( send Progress ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage On Fragment Closed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend On Fragment Destroyed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( send Progress ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage On Fragment Closed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġres end Message ( original MessageId : ĠLong , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠDataSource . delete Message ( activity !! , Ġoriginal MessageId ) ĊĊĠĠĠĠĠĠĠ Ġfragment . message Loader . message Loaded Count -- ĊĠĠĠĠĠĠĠ Ġfragment . message Loader . load Messages ( false ) ĊĊĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Entry . setText ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission Then Send () ĊĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage On Fragment Closed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Progress ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġdelayed Sending Handler . remove Callbacks And Messages ( null ) ĊĊĠĠĠĠĠĠĠ Ġval Ġur is Ġ= ĠArrayList < Media Message >() ĊĠĠĠĠĠĠĠ Ġattach Manager . currently Attached . map To ( uris ) Ġ{ ĠMedia Message ( it . media Uri , Ġit . mime Type ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠsendMessage ( uris ) ĊĠĠĠĠĠĠĠ Ġmessage Entry . setText ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Permission Then Send () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Permission Then Send ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Permission Then Send ( force No Signature : ĠBoolean , Ġdelayed Sending Timeout : ĠLong Ġ= ĠSettings . delayed Sending Timeout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġfinding Ġthe Ġmessage Ġand ĠURIs Ġis Ġalso Ġdone Ġin Ġthe Ġon Back Pressed Ġmethod . ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmessage Entry . text . toString (). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġur is Ġ= ĠArrayList < Media Message >() ĊĊĠĠĠĠĠĠĠ Ġattach Manager . currently Attached . map To ( uris ) Ġ{ ĠMedia Message ( it . media Uri , Ġit . mime Type ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ((! Account . exists () Ġ|| ĠAccount . primary ) Ġ&& ĠPermissions Utils . check Request Main Permissions ( activity !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPermissions Utils . start Main Permission Request ( activity !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Account . primary Ġ&& Ġ! Permissions Utils . is Default Sms App ( activity !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPermissions Utils . setDefault Sms App ( activity !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message . isNotEmpty () Ġ|| Ġur is . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delayed Sending Timeout Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Delayed Sending Components ( true , Ġdelayed Sending Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Sending Handler . post Delayed ({ ĠsendMessage ( uris , Ġforce No Signature ) Ġ}, Ġdelayed Sending Timeout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Delayed Sending Components ( start : ĠBoolean , Ġdelayed Sending Timeout : ĠLong Ġ= ĠSettings . delayed Sending Timeout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelayed Sending Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġdelayed Timer ?. cancel () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend . setImage Resource ( R . drawable . ic _ send ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend . setOnClickListener Ġ{ Ġrequest Permission Then Send () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. isIn determinate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend . setImage Resource ( R . drawable . ic _ close ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend . setOnClickListener Ġ{ Ġchange Delayed Sending Components ( false ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. max Ġ= Ġdelayed Sending Timeout . toInt () Ġ/ Ġ 1 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Timer Ġ= Ġobject Ġ: ĠCount Down Timer ( delayed Sending Timeout , Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Progress ?. progress Ġ= Ġ( delayed Sending Timeout Ġ- Ġmillis Until Finished ). toInt () Ġ/ Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage ( uris : ĠList < Media Message >) Ġ{ ĊĠĠĠĠĠĠĠ ĠsendMessage ( uris , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage ( uris : ĠList < Media Message >, Ġforce No Signature : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ ĠNew Messages Check Service . write Last Run ( activity ) ĊĠĠĠĠĠĠĠ Ġchange Delayed Sending Components ( false ) ĊĠĠĠĠĠĠĠ Ġattach Manager . back Pressed () ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmessage Entry . text . toString (). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġactivity . support FragmentManager . find Fragment ById ( R . id . conversation _ list _ container ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( message . isNotEmpty () Ġ|| Ġur is . isNotEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Manager . clear Attached Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage Entry . text Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( message . isNotEmpty () Ġ|| Ġur is . isNotEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= ĠDataSource . get Conversation ( activity , Ġarg Manager . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend Utils Ġ= ĠSend Utils ( conversation ?. sim Subscription Id ). set Force No Signature ( force No Signature ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Loader . adapter Ġ!= Ġnull Ġ&& Ġmessage Loader . adapter !!. getItem ViewType ( 0 ) Ġ== ĠMessage . TYPE _ INFO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDataSource . delete Message ( activity , Ġmessage Loader . adapter !!. getItem Id ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠMessage () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . conversation Id Ġ= Ġarg Manager . conversation Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . type Ġ= ĠMessage . TYPE _ SEND ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . read Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . seen Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . from Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . color Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . sim PhoneNumber Ġ= Ġif Ġ( conversation ?. sim Subscription Id Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDual Sim Utils . get PhoneNumber From Sim Subscription ( conversation . sim Subscription Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . sent DeviceId Ġ= Ġif Ġ( Account . exists ()) Ġjava . lang . Long . parse Long ( Account . deviceId !! ) Ġelse Ġ- 1 L ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . timestamp Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . data Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . mime Type Ġ= ĠMime Type . TEXT _ PLAIN ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ!= Ġnull Ġ&& Ġfragment Ġis ĠCon versation List Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . notify Of Sent Message ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDataSource . insert Message ( activity , Ġm , Ġm . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Utils . send ( activity , Ġmessage , Ġarg Manager . phone Numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġur is . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . timestamp Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . data Ġ= Ġit . uri . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . mime Type Ġ= Ġit . mime Type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . id Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ!= Ġnull Ġ&& Ġfragment Ġis ĠCon versation List Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . notify Of Sent Message ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmessageId Ġ= ĠDataSource . insert Message ( activity , Ġm , Ġm . conversation Id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġsend Utils . send ( activity , Ġ"", Ġarg Manager . phone Numbers , Ġit . uri , Ġit . mime Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDataSource . update Message Data ( activity , ĠmessageId , Ġimage Uri . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Wrapper ( activity , ĠR . raw . message _ ping ). play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fragment . load Messages ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fragment . notification Manager . dismiss On Message Sent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠMedia Message ( val Ġuri : ĠUri , Ġval ĠmimeType : ĠString ) Ċ }