package Ġjp . j ug g ler . sub way to oter . act post čĊč Ċ import Ġandroid . content . SharedPreferences č Ċ import Ġandroid . os . Handler č Ċ import Ġandroid . text .* č Ċ import Ġandroid . text . style . ForegroundColor Span č Ċ import Ġandroid . view . View č Ċ import Ġandroidx . appcompat . app . AppCompatActivity č Ċ import Ġjp . j ug g ler . sub way to oter . App 1 č Ċ import Ġjp . j ug g ler . sub way to oter . R č Ċ import Ġjp . j ug g ler . sub way to oter . api .* č Ċ import Ġjp . j ug g ler . sub way to oter . api . entity .* č Ċ import Ġjp . j ug g ler . sub way to oter . dialog . Actions Dialog č Ċ import Ġjp . j ug g ler . sub way to oter . dialog . Emoji Picker č Ċ import Ġjp . j ug g ler . sub way to oter . dialog . Emoji Picker Result č Ċ import Ġjp . j ug g ler . sub way to oter . emoji . Custom Emoji č Ċ import Ġjp . j ug g ler . sub way to oter . emoji . Emoji Base č Ċ import Ġjp . j ug g ler . sub way to oter . emoji . Unicode Emoji č Ċ import Ġjp . j ug g ler . sub way to oter . pref . Pref B č Ċ import Ġjp . j ug g ler . sub way to oter . span . Network Emoji Span č Ċ import Ġjp . j ug g ler . sub way to oter . table . Ac ct Set č Ċ import Ġjp . j ug g ler . sub way to oter . table . Saved Account č Ċ import Ġjp . j ug g ler . sub way to oter . table . Tag Set č Ċ import Ġjp . j ug g ler . sub way to oter . util . Decode Options č Ċ import Ġjp . j ug g ler . sub way to oter . util . Emoji Decoder č Ċ import Ġjp . j ug g ler . sub way to oter . util . Popup Auto Complete Ac ct č Ċ import Ġjp . j ug g ler . sub way to oter . view . My EditText č Ċ import Ġjp . j ug g ler . util .* č Ċ import Ġjava . util .* č Ċ import Ġkotlin . math . min čĊč Ċ // Ġ åħ¥åĬĽ è£ ľ å®Į æ©Łèĥ½ č Ċ class ĠCompletion Helper ( čĊĠĠĠ Ġprivate Ġval Ġactivity : ĠAppCompatActivity , čĊĠĠĠ Ġprivate Ġval Ġpref : ĠSharedPreferences , čĊĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler , č Ċ ) Ġ{ čĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLog Category (" Completion Helper ") čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġre Chars Not Emoji Ġ= Ġ"[ ^ 0 - 9 A - Za - z _- ] ". ascii Regex () čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ çĦ¡ è¦ĸ ãģĻãĤĭ ãĤ¹ ãĥĳ ãĥ³ čĊĠĠĠĠĠĠĠ Ġ// Ġ($ ãĤĴ . ãģ« å¤ī æıĽ æ¸ Ī ) čĊĠĠĠĠĠĠĠ Ġval Ġignore Spans Ġ= Ġset Of ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . Selection . END ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . Selection . START ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . widget . Editor . Span Controller ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . widget . TextView . Change Watcher ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . emoji 2 . text . Sp ann able Builder . Watcher Wrapper ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . emoji 2 . views integration . Emoji Key Listener ", čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . Dynamic Layout . Change Watcher ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . method . Text Key Listener ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . method . Touch . Drag State ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . text . style . Spell Check Span ", čĊĠĠĠĠĠĠĠ Ġ) čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġre Remove Span Ġ= Ġ""" \ Q android . text . style .\ E .+ Span """. to Regex () čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatch UserName Or Ascii Domain ( cp : ĠInt ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cp Ġ>= Ġ 0 x 7 f ) Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcp . to Char () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ' 0 ' Ġ<= Ġc Ġ&& Ġc Ġ<= Ġ' 9 ' Ġ|| čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' A ' Ġ<= Ġc Ġ&& Ġc Ġ<= Ġ' Z ' Ġ|| čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' a ' Ġ<= Ġc Ġ&& Ġc Ġ<= Ġ' z ' Ġ|| čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ== Ġ'_' Ġ|| Ġc Ġ== Ġ'-' Ġ|| Ġc Ġ== Ġ'.' čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠLetter Ġ| ĠMark Ġ| ĠDecimal _ Number Ġ| ĠConnector _ P unctuation čĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatch Id n Word ( cp : ĠInt ) Ġ= Ġwhen Ġ( Character . getType ( cp ). to Byte ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLetter čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLC ãģ¯ ãĤ¨ ãĤ¤ ãĥª ãĤ¢ ãĤ¹ ãģª ãģ®ãģ§ æĸĩåŃĹ ãģĭãĤī å¾Ĺ ãĤī ãĤĮãĤĭ ãģĵãģ¨ ãģ¯ ãģªãģĦ ãģ¯ ãģļ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . UPPER CASE _ LET TER , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . LOWER CASE _ LET TER , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . TITLE CASE _ LET TER , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . MODI FIER _ LET TER , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . OTHER _ LET TER , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMark čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . NON _ SPACING _ MARK , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . COMB IN ING _ SPACING _ MARK , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . ENC LO SING _ MARK , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecimal _ Number čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . DECIMAL _ DIGIT _ NUMBER Ġ-> Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConnector _ P unctuation čĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter . CON NE CTOR _ PUN CT UATION Ġ-> Ġtrue čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġinterface ĠCallback 2 Ġ{ čĊĠĠĠĠĠĠĠ Ġfun Ġon Text Update () čĊĠĠĠĠĠĠĠ Ġfun Ġcan Open Popup (): ĠBoolean čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġpicker Caption Emoji : ĠString Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ Ġactivity . getString ( R . string . open _ picker _ emoji ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġvar Ġcallback 2 : ĠCallback 2 ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġet : ĠMy EditText ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġpopup : ĠPopup Auto Complete Ac ct ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġform Root : ĠView ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġb Main Screen : ĠBoolean Ġ= Ġfalse čĊčĊĠĠĠ Ġprivate Ġvar Ġaccess Info : ĠSaved Account ? Ġ= Ġnull čĊčĊĠĠĠ Ġprivate Ġval Ġon Emoji List Load : Ġ( list : ĠArrayList < Custom Emoji >) Ġ-> ĠUnit Ġ= Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( popup ?. is Showing Ġ== Ġtrue ) Ġproc TextChanged . run () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġproc TextChanged : ĠRunnable Ġ= ĠRunnable Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis . et čĊĠĠĠĠĠĠĠ Ġif Ġ( et Ġ== Ġnull Ġ|| Ġet . selection Start Ġ!= Ġet . selection End Ġ|| Ġcallback 2 ?. can Open Popup () Ġ!= Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEditText ãĤĴ çī¹å®ļ ãģ§ãģį ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç¯Ħ åĽ ² éģ¸æĬŀ ä¸Ń čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä½ķ ãĤī ãģĭ ãģ® çĲĨ çĶ± ãģ§ ãĥĿ ãĥĥãĥĹ ãĤ¢ãĥĥãĥĹ ãģĮ è¨± åı¯ ãģķãĤĮ ãģ¦ãģĦ ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Mention ( et , Ġet . text . toString ()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun Ġcheck Mention ( et : ĠMy EditText , Ġsrc : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// Ġ éģ¸æĬŀ ç¯Ħ åĽ ² æľ« å°¾ ãģĭãĤī ãĤ¹ ãĤŃ ãĥ£ ãĥ³ čĊĠĠĠĠĠĠĠ Ġvar Ġcount _ at Mark Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġvar Ġstart : ĠInt Ġ= Ġ- 1 čĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġet . selection End čĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġend čĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Ġ= Ġsrc . code Point Before ( i ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-= ĠCharacter . char Count ( cp ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cp Ġ== Ġ'@ '. code ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(++ count _ at Mark Ġ>= Ġ 2 ) Ġbreak Ġelse Ġcontinue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( count _ at Mark Ġ== Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ username @ host Ġãģ® Ġusername éĥ¨åĪĨ ãģ¯ Unicode ãĤĴ åĲ« ãģ¾ ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match UserName Or Ascii Domain ( cp )) Ġcontinue Ġelse Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ username @ host Ġãģ® host Ġ éĥ¨åĪĨ ãģĭ ãĢģ Ġ@ username Ġãģ® username éĥ¨åĪĨ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãģĵ ãģĵ ãģ¯ Unicode ãĤĴ åĲ« ãĤĢ ãģĭ ãĤĤ ãģĹ ãĤĮ ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match UserName Or Ascii Domain ( cp ) Ġ|| Ġmatch Id n Word ( cp )) Ġcontinue Ġelse Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== Ġ- 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Tag ( et , Ġsrc ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ æľĢ ä½İ ãģ§ ãĤĤ 2 æĸĩåŃĹ ãģªãģĦ ãģ¨ è£ ľ å®Į ãģĹãģªãģĦ čĊĠĠĠĠĠĠĠ Ġif Ġ( end Ġ- Ġstart Ġ< Ġ 2 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 0 čĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsrc . substring ( start , Ġend ) čĊĠĠĠĠĠĠĠ Ġval Ġac ct _ list Ġ= ĠAc ct Set . search Prefix ( s , Ġlimit ) čĊĠĠĠĠĠĠĠ Ġlog . d (" search Ġfor Ġ$ s , Ġresult =${ acct _ list . size }") čĊĠĠĠĠĠĠĠ Ġif Ġ( acct _ list . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Popup ()?. set List ( et , Ġstart , Ġend , Ġac ct _ list , Ġnull , Ġnull ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcheck Tag ( et : ĠMy EditText , Ġsrc : ĠString ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġet . selection End čĊĠĠĠĠĠĠĠ Ġval Ġlast _ sharp Ġ= Ġsrc . lastIndexOf ('# ', Ġend Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠ Ġif Ġ( last _ sharp Ġ== Ġ- 1 Ġ|| Ġend Ġ- Ġlast _ sharp Ġ< Ġ 2 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Emoji ( et , Ġsrc ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġpart Ġ= Ġsrc . substring ( last _ sharp Ġ+ Ġ 1 , Ġend ) čĊĠĠĠĠĠĠĠ Ġif Ġ(! To ot Tag . isValid ( part , Ġaccess Info ?. is Miss key Ġ== Ġtrue )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Emoji ( et , Ġsrc ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 0 čĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsrc . substring ( last _ sharp Ġ+ Ġ 1 , Ġend ) čĊĠĠĠĠĠĠĠ Ġval Ġtag _ list Ġ= ĠTag Set . search Prefix ( s , Ġlimit ) čĊĠĠĠĠĠĠĠ Ġlog . d (" search Ġfor Ġ$ s , Ġresult =${ tag _ list . size }") čĊĠĠĠĠĠĠĠ Ġif Ġ( tag _ list . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Popup ()?. set List ( et , Ġlast _ sharp , Ġend , Ġtag _ list , Ġnull , Ġnull ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcheck Emoji ( et : ĠMy EditText , Ġsrc : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġet . selection End čĊĠĠĠĠĠĠĠ Ġval Ġlast _ colon Ġ= Ġsrc . lastIndexOf (' :', Ġend Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠ Ġif Ġ( last _ colon Ġ== Ġ- 1 Ġ|| Ġend Ġ- Ġlast _ colon Ġ< Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ(! Emoji Decoder . can Start Short Code ( src , Ġlast _ colon )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ: Ġãģ® æīĭ åīį ãģ¯ å§ĭ ç«¯ ãģĭ æĶ¹ è¡Į ãģĭ ç©º çĻ½ ãģ§ ãģª ãģĳ ãĤĮãģ° ãģª ãĤī ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . d (" check Emoji : Ġinvalid Ġcharacter Ġbefore Ġshort code .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġpart Ġ= Ġsrc . substring ( last _ colon Ġ+ Ġ 1 , Ġend ) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( part . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ: ãĤĴ åħ¥åĬĽ ãģĹãģŁ çĽ´ å¾Į ãģ¯ åĢĻ è£ ľ ãģ¯ 0 ãģ§ ãĢģ ãĢĮ éĸ ī ãģĺ ãĤĭ ãĢį ãģ¨ ãĢĮ çµ µ æĸĩåŃĹ ãĤĴ éģ¸ ãģ ¶ ãĢį ãģłãģĳ ãģĮ è¡¨ç¤º ãģķãĤĮãģŁ ãĥĿ ãĥĥãĥĹ ãĤ¢ãĥĥãĥĹ ãĤĴ åĩº ãģĻ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Popup ()?. set List ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet , Ġlast _ colon , Ġend , Ġnull , Ġpicker Caption Emoji , Ġopen Picker Emoji čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( re Chars Not Emoji . contains Match In ( part )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç¯Ħ åĽ ² åĨħ ãģ« çµ µ æĸĩåŃĹ ãģ« ä½¿ ãģĪ ãģªãģĦ æĸĩåŃĹ ãģĮãģĤãĤĭ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġcode _ list Ġ= ĠArrayList < CharSequence >() čĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 0 čĊčĊĠĠĠĠĠĠĠ Ġ// ĠãĤ « ãĤ¹ãĤ¿ ãĥł çµ µ æĸĩåŃĹ ãģ® åĢĻ è£ ľ ãĤĴ éĥ¨åĪĨ ä¸Ģèĩ´ æ¤ ľç´¢ čĊĠĠĠĠĠĠĠ Ġcode _ list . addAll ( custom Emoji Code List ( access Info , Ġlimit , Ġpart )) čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ éĢļå¸¸ ãģ® çµ µ æĸĩåŃĹ ãĤĴ éĥ¨åĪĨ ä¸Ģèĩ´ ãģ§ æ¤ ľç´¢ čĊĠĠĠĠĠĠĠ Ġval Ġremain Ġ= Ġlimit Ġ- Ġcode _ list . size čĊĠĠĠĠĠĠĠ Ġif Ġ( remain Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsrc . substring ( last _ colon Ġ+ Ġ 1 , Ġend ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lowercase () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('- ', Ġ'_ ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= ĠEmoji Decoder . search Short Code ( activity , Ġs , Ġremain ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . d (" check Emoji : Ġsearch Ġfor Ġ$ s , Ġresult =${ matches . size }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode _ list . addAll ( matches ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġopen Popup ()?. set List ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġet , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast _ colon , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġend , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode _ list , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicker Caption Emoji , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Picker Emoji čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// ĠãĤ « ãĤ¹ãĤ¿ ãĥł çµ µ æĸĩåŃĹ ãģ® åĢĻ è£ ľ ãĤĴ ä½ľ ãĤĭ čĊĠĠĠ Ġprivate Ġfun Ġcustom Emoji Code List ( čĊĠĠĠĠĠĠĠ Ġaccess Info : ĠSaved Account ?, čĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Same Parameter Value ") Ġlimit : ĠInt , čĊĠĠĠĠĠĠĠ Ġneedle : ĠString , čĊĠĠĠ Ġ) Ġ= Ġbuild List < CharSequence > Ġ{ čĊĠĠĠĠĠĠĠ Ġaccess Info Ġ?: Ġreturn @ build List čĊčĊĠĠĠĠĠĠĠ Ġval Ġcustom _ list Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp 1 . custom _ emoji _ list er . getList With Aliases ( access Info , Ġon Emoji List Load ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ build List čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġcustom _ list ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġlimit ) Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! item . shortcode . contains ( needle )) Ġcontinue čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able StringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' Ġ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Span ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Emoji Span ( item . url ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . length , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp anned . SPAN _ EXCL USIVE _ EXCL USIVE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (' Ġ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . alias Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġsb . length čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (": ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( item . alias ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (": ĠâĨĴ Ġ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Span ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground Color Span ( activity . attr Color ( R . attr . color Time Small )), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . length , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp anned . SPAN _ EXCL USIVE _ EXCL USIVE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (': ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( item . shortcode ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (': ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( sb ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġopen Popup (): ĠPopup Auto Complete Ac ct ? Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġpopup Ġ= Ġthis @ Completion Helper . popup čĊĠĠĠĠĠĠĠ Ġif Ġ( popup ?. is Showing Ġ== Ġtrue ) Ġreturn Ġpopup čĊĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis @ Completion Helper . et Ġ?: Ġreturn Ġnull čĊĠĠĠĠĠĠĠ Ġval Ġform Root Ġ= Ġthis @ Completion Helper . form Root Ġ?: Ġreturn Ġnull čĊĠĠĠĠĠĠĠ Ġpopup Ġ= ĠPopup Auto Complete Ac ct ( activity , Ġet , Ġform Root , Ġb Main Screen ) čĊĠĠĠĠĠĠĠ Ġthis @ Completion Helper . popup Ġ= Ġpopup čĊĠĠĠĠĠĠĠ Ġreturn Ġpopup čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġset Instance ( access Info : ĠSaved Account ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . access Info Ġ= Ġaccess Info čĊĠĠĠĠĠĠĠ Ġaccess Info ?. let Ġ{ ĠApp 1 . custom _ emoji _ list er . getList ( it , Ġon Emoji List Load ) Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( popup ?. is Showing Ġ== Ġtrue ) Ġproc TextChanged . run () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġclose Ac ct Popup () Ġ{ čĊĠĠĠĠĠĠĠ Ġpopup ?. dismiss () čĊĠĠĠĠĠĠĠ Ġpopup Ġ= Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon Scroll Changed () Ġ{ čĊĠĠĠĠĠĠĠ Ġpopup ?. take If Ġ{ Ġit . is Showing Ġ} ?. update Position () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon Destroy () Ġ{ čĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( proc TextChanged ) čĊĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġattach EditText ( čĊĠĠĠĠĠĠĠ Ġform Root : ĠView , čĊĠĠĠĠĠĠĠ Ġet : ĠMy EditText , čĊĠĠĠĠĠĠĠ Ġb Main Screen : ĠBoolean , čĊĠĠĠĠĠĠĠ Ġcallback 2 : ĠCallback 2 , čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . form Root Ġ= Ġform Root čĊĠĠĠĠĠĠĠ Ġthis . et Ġ= Ġet čĊĠĠĠĠĠĠĠ Ġthis . callback 2 Ġ= Ġcallback 2 čĊĠĠĠĠĠĠĠ Ġthis . b Main Screen Ġ= Ġb Main Screen čĊčĊĠĠĠĠĠĠĠ Ġet . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs : ĠCharSequence , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( proc TextChanged ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( proc TextChanged , Ġif Ġ( popup ?. is Showing Ġ== Ġtrue ) Ġ 1 0 0 L Ġelse Ġ 5 0 0 L ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥ ļ ãĥ¼ ãĤ¹ãĥĪ æĻĤ ãģ« ä½Ļ è¨Ī ãģª è£ħ é£ ¾ ãĤĴ åıĸ ãĤĬ éĻ¤ ãģı čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspans Ġ= Ġs . get Spans ( 0 , Ġs . length , ĠAny :: class . java ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis I me Comp osing Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspans . any Ġ{ Ġit ?. java Class ?. name Ġ== Ġ" android . view . input method . Comp osing Text " Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is I me Comp osing ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspans ?. filter Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ( it ?. java Class ?. name Ġ?: Ġ""). replace ('$ ', Ġ'.') čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Spans . contains ( name ) Ġ-> Ġfalse čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre Remove Span . matches ( name ) Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i (" span Ġremove Ġ$ name ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i (" span Ġkeep Ġ$ name ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠTrip le ( it , Ġs . get Span Start ( it ), Ġs . get Span End ( it )) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . sorted By Ġ{ Ġ- it . second Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . remove Span ( it . first ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Completion Helper . callback 2 ?. on Text Update () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ}) čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ ç¯Ħ åĽ ² éģ¸æĬŀ ãģķãĤĮ ãģ¦ ãĤĭ ãģª ãĤī ãĥĿ ãĥĥãĥĹ ãĤ¢ãĥĥãĥĹ ãģ¯ éĸ ī ãģĺ ãĤĭ čĊĠĠĠĠĠĠĠ Ġet . on Selection Change Ġ= Ġ{ Ġsel Start , Ġsel End Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sel Start Ġ!= Ġsel End ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . d (" on Selection Change : Ġrange Ġselected ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Ac ct Popup () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ åħ¨ çĦ¶ åĭķ ãģĦãģ¦ ãģª ãģķ ãģĿ ãģĨ âĢ¦ čĊĠĠĠĠĠĠĠ Ġ// Ġet . set Custom Selection Action Mode Callback ( Ġaction _ mode _ callback Ġ); čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠSp ann able StringBuilder . append Emoji ( result : ĠEmoji Picker Result ) Ġ= čĊĠĠĠĠĠĠĠ Ġappend Emoji ( result . b Instance Has Custom Emoji , Ġresult . emoji ) čĊčĊĠĠĠ Ġprivate Ġfun ĠSp ann able StringBuilder . append Emoji ( čĊĠĠĠĠĠĠĠ Ġb Instance Has Custom Emoji : ĠBoolean , čĊĠĠĠĠĠĠĠ Ġemoji : ĠEmoji Base , čĊĠĠĠ Ġ): ĠSp ann able StringBuilder Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= ĠEmoji Decoder . custom Emoji Separator () čĊĠĠĠĠĠĠĠ Ġwhen Ġ( emoji ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCustom Emoji Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ « ãĤ¹ãĤ¿ ãĥł çµ µ æĸĩåŃĹ ãģ¯ å¸¸ ãģ« shortcode è¡¨ çı¾ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Emoji Decoder . can Start Short Code ( this , Ġthis . length )) Ġappend ( separator ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( Sp ann able String (": ${ emoji . shortcode } :" )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ » ãĥĳ ãĥ¬ ãĥ¼ãĤ¿ ãģ« ZW SP ãĤĴä½¿ ãģĨ è¨Ńå®ļ ãģª ãĤī ãĢģ è£ ľ å®Į ãģĹãģŁ æ¬¡ãģ® ä½įç½® ãģ« ãĤĤ ZW SP ãĤĴ è¿½åĬł ãģĻãĤĭ ãĢĤ éĢ£ ç¶ļ ãģĹãģ¦ åħ¥åĬĽ è£ ľ å®Į ãģ§ãģįãĤĭ ãĤĪãģĨãģ« ãģªãĤĭ ãĢĤ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( separator Ġ!= Ġ' Ġ') Ġappend ( separator ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnicode Emoji Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! b Instance Has Custom Emoji ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åı¤ ãģĦ ãĤ¿ ãĥ³ãĤ¹ ãģł ãģ¨ shortcode ãĤĴä½¿ ãģĨ ãĢĤ è¦ĭ ãģŁ çĽ® ãģ¯ çµ µ æĸĩåŃĹ ãģ« å¤ī ãģĪãĤĭ ãĢĤ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Emoji Decoder . can Start Short Code ( this , Ġthis . length )) Ġappend ( separator ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( Decode Options ( activity ). decode Emoji (": ${ emoji . unified Name } :" )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ » ãĥĳ ãĥ¬ ãĥ¼ãĤ¿ ãģ« ZW SP ãĤĴä½¿ ãģĨ è¨Ńå®ļ ãģª ãĤī ãĢģ è£ ľ å®Į ãģĹãģŁ æ¬¡ãģ® ä½įç½® ãģ« ãĤĤ ZW SP ãĤĴ è¿½åĬł ãģĻãĤĭ ãĢĤ éĢ£ ç¶ļ ãģĹãģ¦ åħ¥åĬĽ è£ ľ å®Į ãģ§ãģįãĤĭ ãĤĪãģĨãģ« ãģªãĤĭ ãĢĤ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( separator Ġ!= Ġ' Ġ') Ġappend ( separator ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åįģ åĪĨ ãģ« æĸ°ãģĹãģĦ ãĤ¿ ãĥ³ãĤ¹ ãģª ãĤī çµ µ æĸĩåŃĹ ãģ® unicode ãĤĴä½¿ ãģĨ ãĢĤ è¦ĭ ãģŁ çĽ® ãģ¯ çµ µ æĸĩåŃĹ ãģ« å¤ī ãģĪãĤĭ ãĢĤ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( Decode Options ( activity ). decode Emoji ( emoji . unified Code )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġthis čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġopen Picker Emoji : ĠRunnable Ġ= ĠRunnable Ġ{ čĊĠĠĠĠĠĠĠ ĠEmoji Picker ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġaccess Info , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose On Selected Ġ= ĠPref B . bp Emoji Picker Close On Selected ( pref ) čĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis . et Ġ?: Ġreturn @ Emoji Picker čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġet . text Ġ?: Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Length Ġ= Ġsrc . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmin ( src Length , Ġet . selection End ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġsrc . lastIndexOf (' :', Ġend Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== Ġ- 1 Ġ|| Ġend Ġ- Ġstart Ġ< Ġ 1 ) Ġreturn @ Emoji Picker čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able StringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( src . sub Sequence ( 0 , Ġstart )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Emoji ( result ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Selection Ġ= Ġsb . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ< Ġsrc Length ) Ġsb . append ( src . sub Sequence ( end , Ġsrc Length )) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . text Ġ= Ġsb čĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . setSelection ( new Selection ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc TextChanged . run () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ Ń ãĥ¼ãĥ ľ ãĥ¼ãĥī ãĤĴ åĨį åº¦ è¡¨ç¤º ãģĻãĤĭ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp 1 . get AppState ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Post Helper / Emoji Picker / cb " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). handler . post Ġ{ Ġet . show Keyboard () Ġ} čĊĠĠĠĠĠĠĠ Ġ}. show () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġopen Emoji Picker From More () Ġ{ čĊĠĠĠĠĠĠĠ ĠEmoji Picker ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġaccess Info , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose On Selected Ġ= ĠPref B . bp Emoji Picker Close On Selected ( pref ) čĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis . et Ġ?: Ġreturn @ Emoji Picker čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġet . text Ġ?: Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Length Ġ= Ġsrc . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġmin ( src Length , Ġet . selection Start ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmin ( src Length , Ġet . selection End ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able StringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( src . sub Sequence ( 0 , Ġstart )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Emoji ( result ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Selection Ġ= Ġsb . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ< Ġsrc Length ) Ġsb . append ( src . sub Sequence ( end , Ġsrc Length )) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . text Ġ= Ġsb čĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . setSelection ( new Selection ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc TextChanged . run () čĊĠĠĠĠĠĠĠ Ġ}. show () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠSp ann able StringBuilder . append Hash Tag ( tag Without Sharp : ĠString ): ĠSp ann able StringBuilder Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġ' Ġ' čĊĠĠĠĠĠĠĠ Ġif Ġ(! Emoji Decoder . can Start Has ht ag ( this , Ġthis . length )) Ġappend ( separator ) čĊĠĠĠĠĠĠĠ Ġthis . append ('# '). append ( tag Without Sharp ) čĊĠĠĠĠĠĠĠ Ġappend ( separator ) čĊĠĠĠĠĠĠĠ Ġreturn Ġthis čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġopen Feature d Tag List ( list : ĠList < To ot Tag > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġad Ġ= ĠActions Dialog () čĊĠĠĠĠĠĠĠ Ġlist ?. forEach Ġ{ Ġtag Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġad . addAction ("# ${ tag . name }") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis . et Ġ?: Ġreturn @ addAction čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġet . text Ġ?: Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Length Ġ= Ġsrc . length čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġmin ( src Length , Ġet . selection Start ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmin ( src Length , Ġet . selection End ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able StringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( src . sub Sequence ( 0 , Ġstart )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Hash Tag ( tag . name ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Selection Ġ= Ġsb . length čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ< Ġsrc Length ) Ġsb . append ( src . sub Sequence ( end , Ġsrc Length )) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet . text Ġ= Ġsb čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet . setSelection ( new Selection ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproc TextChanged . run () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġad . addAction ( activity . getString ( R . string . input _ sharp _ it self )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġthis . et Ġ?: Ġreturn @ addAction čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġet . text Ġ?: Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Length Ġ= Ġsrc . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġmin ( src Length , Ġet . selection Start ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmin ( src Length , Ġet . selection End ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠSp ann able StringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( src . sub Sequence ( 0 , Ġstart )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Emoji Decoder . can Start Has ht ag ( sb , Ġsb . length )) Ġsb . append (' Ġ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('# ') čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Selection Ġ= Ġsb . length čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ< Ġsrc Length ) Ġsb . append ( src . sub Sequence ( end , Ġsrc Length )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . text Ġ= Ġsb čĊĠĠĠĠĠĠĠĠĠĠĠ Ġet . setSelection ( new Selection ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc TextChanged . run () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġad . show ( activity , Ġactivity . getString ( R . string . featured _ hashtags )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// ĉ final ĠAction Mode . Callback Ġaction _ mode _ callback Ġ= Ġnew ĠAction Mode . Callback () Ġ{ čĊĠĠĠ Ġ// ĉ ĉ @ Override Ġpublic Ġboolean ĠonCreate Action Mode ( ĠAction Mode Ġaction Mode , ĠMenu Ġmenu Ġ){ čĊĠĠĠ Ġ// ĉĉ ĉ action Mode . get Menu Inflater (). inflate ( R . menu . to ot _ long _ tap , Ġmenu ); čĊĠĠĠ Ġ// ĉĉ ĉ return Ġtrue ; čĊĠĠĠ Ġ// ĉ ĉ } čĊĠĠĠ Ġ// ĉ ĉ @ Override Ġpublic Ġvoid Ġon Destroy Action Mode ( ĠAction Mode Ġaction Mode Ġ){ čĊĠĠĠ Ġ// čĊĠĠĠ Ġ// ĉ ĉ } čĊĠĠĠ Ġ// ĉ ĉ @ Override Ġpublic Ġboolean Ġon Prepare Action Mode ( ĠAction Mode Ġaction Mode , ĠMenu Ġmenu Ġ){ čĊĠĠĠ Ġ// ĉĉ ĉ return Ġfalse ; čĊĠĠĠ Ġ// ĉ ĉ } čĊĠĠĠ Ġ// čĊĠĠĠ Ġ// ĉ ĉ @ Override čĊĠĠĠ Ġ// ĉ ĉ public Ġboolean Ġon Action Item Clicked ( ĠAction Mode Ġaction Mode , ĠMenuItem Ġitem Ġ){ čĊĠĠĠ Ġ// ĉĉ ĉ if Ġ( item . getItem Id () Ġ== ĠR . id . action _ pick _ emoji ) Ġ{ čĊĠĠĠ Ġ// ĉĉĉ ĉ action Mode . finish (); čĊĠĠĠ Ġ// ĉĉĉ ĉ Emoji Picker . open ( Ġactivity , Ġinstance , Ġnew ĠEmoji Picker . Callback () Ġ{ čĊĠĠĠ Ġ// ĉĉĉĉ ĉ @ Override Ġpublic Ġvoid Ġon Pick ed Emoji ( ĠString Ġname Ġ){ čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ int Ġend Ġ= Ġet . getSelection End (); čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ String Ġsrc Ġ= Ġet . getText (). toString (); čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ CharSequence Ġsv Insert Ġ= Ġ":" Ġ+ Ġname Ġ+ Ġ": "; čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ src Ġ= Ġsrc . substring ( Ġ 0 , Ġend Ġ) Ġ+ Ġsv Insert Ġ+ Ġ" Ġ" Ġ+ Ġ( Ġend Ġ>= Ġsrc . length () Ġ? Ġ"" Ġ: Ġsrc . substring ( Ġend Ġ) Ġ); čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ et . setText ( Ġsrc Ġ); čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ et . setSelection ( Ġend Ġ+ Ġsv Insert . length () Ġ+ Ġ 1 Ġ); čĊĠĠĠ Ġ// čĊĠĠĠ Ġ// ĉĉĉĉĉ ĉ proc _ text _ changed . run (); čĊĠĠĠ Ġ// ĉĉĉĉ ĉ } čĊĠĠĠ Ġ// ĉĉĉ ĉ } Ġ); čĊĠĠĠ Ġ// ĉĉĉ ĉ return Ġtrue ; čĊĠĠĠ Ġ// ĉĉ ĉ } čĊĠĠĠ Ġ// čĊĠĠĠ Ġ// ĉĉ ĉ return Ġfalse ; čĊĠĠĠ Ġ// ĉ ĉ } čĊĠĠĠ Ġ// ĉ }; č Ċ } čĊ