package Ġjp . j ug g ler . sub way to oter . span čĊč Ċ import Ġandroid . graphics . Canvas č Ċ import Ġandroid . graphics . Paint č Ċ import Ġandroid . graphics . Rect č Ċ import Ġandroid . graphics . Rect F č Ċ import Ġandroid . text . style . Replacement Span č Ċ import Ġandroidx . annotation . Int Range č Ċ import Ġjp . j ug g ler . ap ng . A png Frames č Ċ import Ġjp . j ug g ler . sub way to oter . App 1 č Ċ import Ġjp . j ug g ler . sub way to oter . pref . Pref B č Ċ import Ġjp . j ug g ler . util . Log Category č Ċ import Ġjava . lang . ref . Weak Reference čĊč Ċ class ĠNetwork Emoji Span Ġinternal Ġconstructor ( čĊĠĠĠ Ġprivate Ġval Ġurl : ĠString , čĊĠĠĠ Ġprivate Ġval Ġscale : ĠFloat Ġ= Ġ 1 f č Ċ ) Ġ: ĠRe placement Span (), ĠAnim atable Span Ġ{ čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlog Ġ= ĠLog Category (" Network Emoji Span ") čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġscale Ratio Ġ= Ġ 1 . 1 4 f čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġdesc ent Ratio Ġ= Ġ 0 . 2 1 1 f čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġm Paint Ġ= ĠPaint () čĊĠĠĠ Ġprivate Ġval Ġrect Src Ġ= ĠRect () čĊĠĠĠ Ġprivate Ġval Ġrect Dst Ġ= ĠRect F () čĊčĊĠĠĠ Ġ// Ġãĥķ ãĥ¬ ãĥ¼ãĥł æİ¢ ç´¢ çµĲæŀľ ãĤĴ æł¼ ç´ į ãģĻãĤĭ æ§ĭ éĢł ä½ĵ ãĤĴ ç¢º ä¿Ŀ ãģĹãģ¦ ãģĬ ãģı čĊĠĠĠ Ġprivate Ġval Ġm Frame Find Result Ġ= ĠA png Frames . Find Frame Result () čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġm Paint . is Filter Bitmap Ġ= Ġtrue čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġvar Ġinvalidate Callback : ĠAnim atable Span Invalid ator ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġref Draw Target : ĠWeak Reference < Any >? Ġ= Ġnull čĊčĊĠĠĠ Ġoverride Ġfun Ġset Invalidate Callback ( čĊĠĠĠĠĠĠĠ Ġdraw Target Tag : ĠAny , čĊĠĠĠĠĠĠĠ Ġinvalidate Callback : ĠAnim atable Span Invalid ator čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . ref Draw Target Ġ= ĠWeak Reference ( draw Target Tag ) čĊĠĠĠĠĠĠĠ Ġthis . invalidate Callback Ġ= Ġinvalidate Callback čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġget Size ( čĊĠĠĠĠĠĠĠ Ġpaint : ĠPaint , čĊĠĠĠĠĠĠĠ Ġtext : ĠCharSequence , čĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 0 ) Ġstart : ĠInt , čĊĠĠĠĠĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 0 ) Ġend : ĠInt , čĊĠĠĠĠĠĠĠ Ġfm : ĠPaint . Font Metrics Int ? čĊĠĠĠ Ġ): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ( paint . text Size Ġ* Ġscale Ratio Ġ* Ġscale Ġ+ Ġ 0 . 5 f ). toInt () čĊĠĠĠĠĠĠĠ Ġif Ġ( fm Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Des cent Ġ= Ġ( 0 . 5 f Ġ+ Ġsize Ġ* Ġdesc ent Ratio ). toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Asc ent Ġ= Ġc Des cent Ġ- Ġsize čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fm . as cent Ġ> Ġc Asc ent ) Ġfm . as cent Ġ= Ġc Asc ent čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fm . top Ġ> Ġc Asc ent ) Ġfm . top Ġ= Ġc Asc ent čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fm . desc ent Ġ< Ġc Des cent ) Ġfm . desc ent Ġ= Ġc Des cent čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fm . bottom Ġ< Ġc Des cent ) Ġfm . bottom Ġ= Ġc Des cent čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġsize čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġdraw ( čĊĠĠĠĠĠĠĠ Ġcanvas : ĠCanvas , čĊĠĠĠĠĠĠĠ Ġtext : ĠCharSequence , čĊĠĠĠĠĠĠĠ Ġstart : ĠInt , čĊĠĠĠĠĠĠĠ Ġend : ĠInt , čĊĠĠĠĠĠĠĠ Ġx : ĠFloat , čĊĠĠĠĠĠĠĠ Ġtop : ĠInt , čĊĠĠĠĠĠĠĠ Ġbaseline : ĠInt , čĊĠĠĠĠĠĠĠ Ġbottom : ĠInt , čĊĠĠĠĠĠĠĠ Ġtext Paint : ĠPaint čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġinvalidate Callback Ġ= Ġthis . invalidate Callback čĊĠĠĠĠĠĠĠ Ġif Ġ( invalidate Callback Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e (" draw : Ġinvalidate _ callback Ġis Ġnull .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠAP NG ãĥĩãĥ¼ãĤ¿ ãģ® åıĸå¾Ĺ čĊĠĠĠĠĠĠĠ Ġval Ġframes Ġ= ĠApp 1 . custom _ emoji _ cache . get Frames ( ref Draw Target , Ġurl ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Callback . delay Invalidate ( 0 L ) čĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠPref B . bp Disable Emoji Animation () Ġ-> Ġ 0 L čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinvalidate Callback . time From Start čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠãĤ¢ ãĥĭ ãĥ¡ ãĥ¼ãĤ·ãĥ§ãĥ³ éĸĭå§ĭ æĻĤ åĪ» ãģĭãĤī ãģ® çµ Į éģİ æĻĤéĸĵ ãģ« å¿ľ ãģĺ ãģŁ ãĥķ ãĥ¬ ãĥ¼ãĥł ãĤĴ æİ¢ ç´¢ čĊĠĠĠĠĠĠĠ Ġframes . find Frame ( m Frame Find Result , Ġt ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġm Frame Find Result . bitmap čĊĠĠĠĠĠĠĠ Ġif Ġ( b Ġ== Ġnull Ġ|| Ġb . is Re cyc led ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e (" draw : Ġbitmap Ġis Ġnull Ġor Ġre cyc led .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġsrc Width Ġ= Ġb . width čĊĠĠĠĠĠĠĠ Ġval Ġsrc Height Ġ= Ġb . height čĊĠĠĠĠĠĠĠ Ġif Ġ( src Width Ġ< Ġ 1 Ġ|| Ġsrc Height Ġ< Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . e (" draw : Ġbitmap Ġsize Ġis Ġtoo Ġsmall .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġrect Src . set ( 0 , Ġ 0 , Ġsrc Width , Ġsrc Height ) čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ çµ µ æĸĩåŃĹ ãģ® æŃ£ æĸ¹ å½¢ ãģ® ãĤµ ãĤ¤ãĤº čĊĠĠĠĠĠĠĠ Ġval Ġdst Size Ġ= Ġtext Paint . text Size Ġ* Ġscale Ratio Ġ* Ġscale čĊčĊĠĠĠĠĠĠĠ Ġ// Ġãĥ Ļ ãĥ¼ãĤ¹ ãĥ© ãĤ¤ãĥ³ ãģĭãĤī ä¸Ĭä¸ĭ æĸ¹åĲĳ ãģ« ãģļ ãĤī ãģĻ ãĤª ãĥķ ãĤ»ãĥĥãĥĪ čĊĠĠĠĠĠĠĠ Ġval Ġc Des cent Ġ= Ġdst Size Ġ* Ġdesc ent Ratio čĊĠĠĠĠĠĠĠ Ġval Ġtrans Y Ġ= Ġbaseline Ġ- Ġdst Size Ġ+ Ġc Des cent čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ çµ µ æĸĩåŃĹ ãģ® ãĤ¢ ãĤ¹ ãĥļ ãĤ¯ãĥĪ æ¯Ķ ãģĭãĤī æıı çĶ» ç¯Ħ åĽ ² ãģ® å¹ ħ ãģ¨ é«ĺ ãģķ ãĤĴ æ±º ãĤģ ãĤĭ čĊĠĠĠĠĠĠĠ Ġval Ġdst Width : ĠFloat čĊĠĠĠĠĠĠĠ Ġval Ġdst Height : ĠFloat čĊĠĠĠĠĠĠĠ Ġval Ġaspect Src Ġ= Ġsrc Width . toFloat () Ġ/ Ġsrc Height . toFloat () čĊĠĠĠĠĠĠĠ Ġif Ġ( aspect Src Ġ>= Ġ 1 f ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Width Ġ= Ġdst Size čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Height Ġ= Ġdst Size Ġ/ Ġaspect Src čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Height Ġ= Ġdst Size čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Width Ġ= Ġdst Size Ġ* Ġaspect Src čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġdst X Ġ= Ġ( dst Size Ġ- Ġdst Width ) Ġ/ Ġ 2 f čĊĠĠĠĠĠĠĠ Ġval Ġdst Y Ġ= Ġ( dst Size Ġ- Ġdst Height ) Ġ/ Ġ 2 f čĊĠĠĠĠĠĠĠ Ġrect Dst . set ( dst X , Ġdst Y , Ġdst X Ġ+ Ġdst Width , Ġdst Y Ġ+ Ġdst Height ) čĊčĊĠĠĠĠĠĠĠ Ġcanvas . save () čĊĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( x , Ġtrans Y ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( b , Ġrect Src , Ġrect Dst , Ġm Paint ) čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . w ( ex , Ġ" draw Bitmap Ġfailed .") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 0 æľĪ 6 æĹ¥ Ġ 1 8 : 1 8 ï¼Ī ãĤ¢ãĥĹãĥª ãģ® ãĥĲãĥ¼ãĤ¸ãĥ§ãĥ³ : Ġ 3 7 8 ï¼ī ĠS ony ĠX per ia ĠX ĠComp act ï¼Ī F 5 3 2 1 ï¼ī , ĠAndroid Ġ 8 . 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 0 æľĪ 6 æĹ¥ Ġ 1 1 : 3 5 ï¼Ī ãĤ¢ãĥĹãĥª ãģ® ãĥĲãĥ¼ãĤ¸ãĥ§ãĥ³ : Ġ 3 8 0 ï¼ī ĠSamsung ĠGalaxy ĠS 7 ĠEdge ï¼Ī hero 2 ql t et mo ï¼ī , ĠAndroid Ġ 8 . 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 0 æľĪ 2 æĹ¥ Ġ 2 1 : 5 6 ï¼Ī ãĤ¢ãĥĹãĥª ãģ® ãĥĲãĥ¼ãĤ¸ãĥ§ãĥ³ : Ġ 3 7 6 ï¼ī ĠGoogle ĠPixel Ġ 3 ï¼Ī blue line ï¼ī , ĠAndroid Ġ 9 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉ java . lang . RuntimeException : čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉĉ ĉ at Ġandroid . graphics . Base Canvas . throw If Cannot Draw Ġ( Base Canvas . java : 5 5 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉĉ ĉ at Ġandroid . view . Display List Canvas . throw If Cannot Draw Ġ( Display List Canvas . java : 2 2 6 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉĉ ĉ at Ġandroid . view . Recording Canvas . draw Bitmap Ġ( Recording Canvas . java : 1 2 3 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉĉ ĉ at Ġjp . j ug g ler . sub way to oter . span . Network Emoji Span . draw Ġ( Network Emoji Span . kt : 1 3 7 ) čĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ å°ĳ ãģĹ å¾Į ãģ« æıı çĶ» ãģĹãģª ãģĬ ãģĻ čĊĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġm Frame Find Result . delay čĊĠĠĠĠĠĠĠ Ġif Ġ( delay Ġ!= ĠLong . MAX _ VALUE Ġ&& Ġ! Pref B . bp Disable Emoji Animation ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Callback . delay Invalidate ( delay ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊ