package Ġjp . j ug g ler . sub way to oter . api . entity čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . text . Sp ann able č Ċ import Ġandroid . text . Sp ann able String č Ċ import Ġjp . j ug g ler . sub way to oter . R č Ċ import Ġjp . j ug g ler . sub way to oter . api . To ot Parser č Ċ import Ġjp . j ug g ler . sub way to oter . util .* č Ċ import Ġjp . j ug g ler . util .* č Ċ import Ġorg . json . JSONArray č Ċ import Ġorg . json . JSONObject č Ċ import Ġjava . util . regex . Pattern čĊč Ċ enum Ġclass ĠT oot Pol ls Type Ġ{ čĊ ĉ M ast od on , Ġ// ĠM ast od on Ġ 2 . 8 čĊ ĉ Miss key , Ġ// ĠM iss key čĊ ĉ Friends N ico , Ġ// Ġfriends . nico ĠAPI č Ċ } čĊč Ċ class ĠT oot Pol ls Choice ( čĊ ĉ val Ġtext Ġ: ĠString , čĊ ĉ val Ġdecoded _ text Ġ: ĠSp ann able , čĊ ĉ var Ġis V oted Ġ: ĠBoolean Ġ= Ġfalse , Ġ// Ġmiss key čĊ ĉ var Ġvotes Ġ: ĠInt ? Ġ= Ġ 0 , Ġ// Ġmiss key čĊ ĉ var Ġchecked Ġ: ĠBoolean Ġ= Ġfalse Ġ// ĠM ast od on č Ċ ) čĊč Ċ class ĠT oot Pol ls Ġprivate Ġconstructor ( čĊ ĉ parser Ġ: ĠT oot Parser , čĊ ĉ status Ġ: ĠT oot Status , čĊ ĉ list _ attachment Ġ: ĠArrayList < To ot Attachment Like > ?, čĊ ĉ src Ġ: ĠJSONObject , čĊ ĉ val Ġpoll Type Ġ: ĠT oot Pol ls Type č Ċ ) Ġ{ čĊĉčĊ ĉ // Ġone Ġof Ġen que te , en que te _ result čĊ ĉ val Ġtype Ġ: ĠString ? čĊĉčĊ ĉ val Ġquestion Ġ: ĠString ? Ġ// ĠHTML Ġtext čĊĉčĊ ĉ val Ġdecoded _ question Ġ: ĠSp ann able Ġ// Ġè¡¨ç¤º çĶ¨ ãģ« ãĥĩ ãĤ³ãĥ¼ãĥī ãģĹãģ¦ ãģĹãģ¾ ãģĨ ãģ®ãģ§ NonNull ãģ« ãģªãĤĭ čĊĉčĊ ĉ // Ġarray Ġof Ġtext Ġwith Ġemoji čĊ ĉ val Ġitems Ġ: ĠArrayList < To ot Pol ls Choice >? čĊĉčĊ ĉ // Ġ çµĲæŀľ ãģ® æķ° åĢ¤ Ġ// Ġnull Ġor Ġarray Ġof Ġnumber čĊ ĉ var Ġrat ios Ġ: ĠMutable List < Float >? Ġ= Ġnull čĊĉčĊ ĉ // Ġ çµĲæŀľ ãģ® æķ° åĢ¤ ãģ® ãĥĨ ãĤŃ ãĤ¹ãĥĪ Ġ// Ġnull Ġor Ġarray Ġof Ġstring čĊ ĉ private Ġvar Ġrat ios _ text Ġ: ĠMutable List < String >? Ġ= Ġnull čĊĉčĊ ĉ // Ġ ä»¥ä¸ĭ ãģ¯ JSON ãģ«ãģ¯ åŃĺåľ¨ ãģĹãģªãģĦ ãģĮ åĨħéĥ¨ ãģ§ ä½¿ ãģĨ čĊ ĉ val Ġtime _ start Ġ: ĠLong čĊ ĉ val Ġstatus _ id Ġ: ĠEntity Id čĊĉčĊ ĉ // ĠM ast od on Ġpoll ĠAPI čĊ ĉ var Ġexpired _ at Ġ= ĠLong . MAX _ VALUE čĊ ĉ var Ġexpired Ġ= Ġfalse čĊ ĉ var Ġmultiple Ġ= Ġfalse čĊ ĉ var Ġvotes _ count Ġ: ĠInt ? Ġ= Ġnull čĊ ĉ var Ġmax Votes Count Ġ: ĠInt ? Ġ= Ġnull čĊ ĉ var Ġpoll Id Ġ: ĠEntity Id ? Ġ= Ġnull čĊĉčĊ ĉ var Ġown V oted Ġ: ĠBoolean čĊĉčĊ ĉ init Ġ{ čĊĉĉčĊĉ ĉ this . time _ start Ġ= Ġstatus . time _ created _ at čĊĉ ĉ this . status _ id Ġ= Ġstatus . id čĊĉĉčĊĉ ĉ when ( poll Type ) Ġ{ čĊĉĉ ĉ To ot Pol ls Type . Miss key Ġ-> Ġ{ čĊĉĉĉĉčĊĉĉĉ ĉ this . items Ġ= Ġparse Choice List Miss key ( čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ src . opt JSONArray (" choices ") čĊĉĉĉ ĉ ) čĊĉĉĉĉčĊĉĉĉ ĉ val Ġvotes List Ġ= ĠArrayList < Int >() čĊĉĉĉ ĉ var Ġvotes Max Ġ= Ġ 1 čĊĉĉĉ ĉ var Ġown V oted Ġ= Ġfalse čĊĉĉĉ ĉ items ?. forEach Ġ{ Ġchoice Ġ-> čĊĉĉĉĉ ĉ if ( choice . is V oted ) Ġown V oted Ġ= Ġtrue čĊĉĉĉĉ ĉ val Ġvotes Ġ= Ġchoice . votes Ġ?: Ġ 0 čĊĉĉĉĉ ĉ votes List . add ( votes ) čĊĉĉĉĉ ĉ if ( votes Ġ> Ġvotes Max ) Ġvotes Max Ġ= Ġvotes čĊĉĉĉ ĉ } čĊĉĉĉ ĉ this . own V oted Ġ= Ġown V oted čĊĉĉĉĉčĊĉĉĉ ĉ if ( votes List . isNotEmpty ()) Ġ{ čĊĉĉĉĉ ĉ this . rat ios Ġ= čĊĉĉĉĉĉ ĉ votes List . map Ġ{ Ġ( it . toFloat () Ġ/ Ġvotes Max . toFloat ()) Ġ}. to Mutable List () čĊĉĉĉĉ ĉ this . rat ios _ text Ġ= čĊĉĉĉĉĉ ĉ votes List . map Ġ{ Ġparser . context . getString ( R . string . vote _ count _ text , Ġit ) Ġ} čĊĉĉĉĉĉĉ ĉ . to Mutable List () čĊĉĉĉ ĉ } Ġelse Ġ{ čĊĉĉĉĉ ĉ this . rat ios Ġ= Ġnull čĊĉĉĉĉ ĉ this . rat ios _ text Ġ= Ġnull čĊĉĉĉ ĉ } čĊĉĉĉĉčĊĉĉĉ ĉ this . type Ġ= ĠTYPE _ EN QU ET E čĊĉĉĉĉčĊĉĉĉ ĉ this . question Ġ= Ġstatus . content čĊĉĉĉ ĉ this . decoded _ question Ġ= ĠDecode Options ( čĊĉĉĉĉ ĉ parser . context , čĊĉĉĉĉ ĉ parser . link Helper , čĊĉĉĉĉ ĉ short Ġ= Ġtrue , čĊĉĉĉĉ ĉ decode Emoji Ġ= Ġtrue , čĊĉĉĉĉ ĉ attachment List Ġ= Ġlist _ attachment , čĊĉĉĉĉ ĉ link Tag Ġ= Ġstatus , čĊĉĉĉĉ ĉ emoji Map Custom Ġ= Ġstatus . custom _ emo jis , čĊĉĉĉĉ ĉ emoji Map Profile Ġ= Ġstatus . profile _ emo jis , čĊĉĉĉĉ ĉ mentions Ġ= Ġstatus . mentions čĊĉĉĉ ĉ ). decode HTML ( this . question Ġ?: Ġ"? ") čĊĉĉĉĉ čĊĉĉ ĉ } čĊĉĉĉčĊĉĉ ĉ To ot Pol ls Type . M ast od on Ġ-> Ġ{ čĊĉĉĉ ĉ this . type Ġ= Ġ" en que te " čĊĉĉĉĉčĊĉĉĉ ĉ this . question Ġ= Ġstatus . content čĊĉĉĉ ĉ this . decoded _ question Ġ= ĠDecode Options ( čĊĉĉĉĉ ĉ parser . context , čĊĉĉĉĉ ĉ parser . link Helper , čĊĉĉĉĉ ĉ short Ġ= Ġtrue , čĊĉĉĉĉ ĉ decode Emoji Ġ= Ġtrue , čĊĉĉĉĉ ĉ attachment List Ġ= Ġlist _ attachment , čĊĉĉĉĉ ĉ link Tag Ġ= Ġstatus , čĊĉĉĉĉ ĉ emoji Map Custom Ġ= Ġstatus . custom _ emo jis , čĊĉĉĉĉ ĉ emoji Map Profile Ġ= Ġstatus . profile _ emo jis , čĊĉĉĉĉ ĉ mentions Ġ= Ġstatus . mentions čĊĉĉĉ ĉ ). decode HTML ( this . question Ġ?: Ġ"? ") čĊĉĉĉĉčĊĉĉĉ ĉ this . items Ġ= Ġparse Choice List M ast od on ( čĊĉĉĉĉ ĉ parser . context , čĊĉĉĉĉ ĉ status , čĊĉĉĉĉ ĉ src . opt JSONArray (" options ") ?. toObject List () čĊĉĉĉ ĉ ) čĊĉĉĉĉčĊĉĉĉ ĉ this . poll Id Ġ= ĠEntity Id . may Null ( src . parse String (" id ")) čĊĉĉĉ ĉ this . expired _ at Ġ= čĊĉĉĉĉ ĉ To ot Status . parse Time ( src . parse String (" expires _ at ")). not Zero () Ġ?: ĠLong . MAX _ VALUE čĊĉĉĉ ĉ this . expired Ġ= Ġsrc . opt Boolean (" expired ", Ġfalse ) čĊĉĉĉ ĉ this . multiple Ġ= Ġsrc . opt Boolean (" multiple ", Ġfalse ) čĊĉĉĉ ĉ this . votes _ count Ġ= Ġsrc . parseInt (" votes _ count ") čĊĉĉĉĉčĊĉĉĉ ĉ var Ġown V oted Ġ= Ġsrc . opt Boolean (" v oted ", Ġfalse ) čĊčĊĉĉĉ ĉ src . opt JSONArray (" own _ votes ") ?. forEach Ġ{ čĊĉĉĉĉ ĉ if ( Ġit Ġis ĠNumber ){ čĊĉĉĉĉĉ ĉ val Ġi Ġ= Ġit . toInt () čĊĉĉĉĉĉ ĉ items ?. get ( i )?. is V oted Ġ= Ġtrue čĊĉĉĉĉĉ ĉ own V oted Ġ= Ġtrue čĊĉĉĉĉ ĉ } čĊĉĉĉ ĉ } čĊčĊĉĉĉ ĉ this . own V oted Ġ= Ġown V oted čĊĉĉĉĉčĊĉĉĉ ĉ when Ġ{ čĊĉĉĉĉ ĉ this . items Ġ== Ġnull Ġ-> Ġmax Votes Count Ġ= Ġnull čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ this . multiple Ġ-> Ġ{ čĊĉĉĉĉĉ ĉ var Ġmax Ġ: ĠInt ? Ġ= Ġnull čĊĉĉĉĉĉ ĉ for ( item Ġin Ġitems ) Ġ{ čĊĉĉĉĉĉĉ ĉ val Ġv Ġ= Ġitem . votes čĊĉĉĉĉĉĉ ĉ if ( v Ġ!= Ġnull Ġ&& Ġ( max Ġ== Ġnull Ġ|| Ġv Ġ> Ġmax )) Ġmax Ġ= Ġv čĊĉĉĉĉĉĉĉ čĊĉĉĉĉĉ ĉ } čĊĉĉĉĉĉ ĉ max Votes Count Ġ= Ġmax čĊĉĉĉĉ ĉ } čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ else Ġ-> Ġ{ čĊĉĉĉĉĉ ĉ var Ġsum Ġ: ĠInt ? Ġ= Ġnull čĊĉĉĉĉĉ ĉ for ( item Ġin Ġitems ) Ġ{ čĊĉĉĉĉĉĉ ĉ val Ġv Ġ= Ġitem . votes čĊĉĉĉĉĉĉ ĉ if ( v Ġ!= Ġnull ) Ġsum Ġ= Ġ( sum Ġ?: Ġ 0 ) Ġ+ Ġv čĊĉĉĉĉĉ ĉ } čĊĉĉĉĉĉ ĉ max Votes Count Ġ= Ġsum čĊĉĉĉĉ ĉ } čĊĉĉĉ ĉ } čĊĉĉĉĉ čĊĉĉ ĉ } čĊĉĉĉčĊĉĉ ĉ To ot Pol ls Type . Friends N ico Ġ-> Ġ{ čĊĉĉĉ ĉ this . type Ġ= Ġsrc . parse String (" type ") čĊĉĉĉĉčĊĉĉĉ ĉ this . question Ġ= Ġsrc . parse String (" question ") čĊĉĉĉ ĉ this . decoded _ question Ġ= ĠDecode Options ( čĊĉĉĉĉ ĉ parser . context , čĊĉĉĉĉ ĉ parser . link Helper , čĊĉĉĉĉ ĉ short Ġ= Ġtrue , čĊĉĉĉĉ ĉ decode Emoji Ġ= Ġtrue , čĊĉĉĉĉ ĉ attachment List Ġ= Ġlist _ attachment , čĊĉĉĉĉ ĉ link Tag Ġ= Ġstatus , čĊĉĉĉĉ ĉ emoji Map Custom Ġ= Ġstatus . custom _ emo jis , čĊĉĉĉĉ ĉ emoji Map Profile Ġ= Ġstatus . profile _ emo jis , čĊĉĉĉĉ ĉ mentions Ġ= Ġstatus . mentions čĊĉĉĉ ĉ ). decode HTML ( this . question Ġ?: Ġ"? ") čĊĉĉĉĉčĊĉĉĉ ĉ this . items Ġ= Ġparse Choice List Friends N ico ( čĊĉĉĉĉ ĉ parser . context , čĊĉĉĉĉ ĉ status , čĊĉĉĉĉ ĉ src . parse String ArrayList (" items ") čĊĉĉĉ ĉ ) čĊĉĉĉĉčĊĉĉĉ ĉ this . rat ios Ġ= Ġsrc . parseFloat ArrayList (" rat ios ") čĊĉĉĉ ĉ this . rat ios _ text Ġ= Ġsrc . parse String ArrayList (" rat ios _ text ") čĊĉĉĉĉčĊĉĉĉ ĉ this . own V oted Ġ= Ġfalse čĊĉĉ ĉ } čĊĉ ĉ } čĊĉĉčĊ ĉ } čĊĉčĊ ĉ comp anion Ġobject Ġ{ čĊĉ ĉ internal Ġval Ġlog Ġ= ĠLog Category (" To ot Pol ls ") čĊĉĉčĊĉ ĉ const Ġval ĠEN QU ET E _ EXPI RE Ġ= Ġ 3 0 0 0 0 L čĊĉĉčĊĉ ĉ const Ġval ĠTYPE _ EN QU ET E Ġ= Ġ" en que te " čĊĉĉčĊĉ ĉ @ Suppress (" unused ") čĊĉ ĉ const Ġval ĠTYPE _ EN QU ET E _ RESULT Ġ= Ġ" en que te _ result " čĊĉĉčĊĉ ĉ @ Suppress (" Has Platform Type ") čĊĉ ĉ private Ġval Ġre Whitespace Ġ= ĠPattern . compile ("[ \\ s \\ t \\ x 0 d \\ x 0 a ]+ ") čĊĉĉčĊĉ ĉ fun Ġparse ( čĊĉĉ ĉ parser Ġ: ĠT oot Parser , čĊĉĉ ĉ status Ġ: ĠT oot Status , čĊĉĉ ĉ list _ attachment Ġ: ĠArrayList < To ot Attachment Like > ?, čĊĉĉ ĉ src Ġ: ĠJSONObject ?, čĊĉĉ ĉ poll Type Ġ: ĠT oot Pol ls Type čĊĉ ĉ ) Ġ: ĠT oot Pol ls ? Ġ{ čĊĉĉ ĉ src Ġ?: Ġreturn Ġnull čĊĉĉ ĉ return Ġtry Ġ{ čĊĉĉĉ ĉ To ot Pol ls ( čĊĉĉĉĉ ĉ parser , čĊĉĉĉĉ ĉ status , čĊĉĉĉĉ ĉ list _ attachment , čĊĉĉĉĉ ĉ src , čĊĉĉĉĉ ĉ poll Type čĊĉĉĉ ĉ ) čĊĉĉ ĉ } Ġcatch ( ex Ġ: ĠThrowable ) Ġ{ čĊĉĉĉ ĉ log . trace ( ex ) čĊĉĉĉ ĉ null čĊĉĉ ĉ } čĊĉ ĉ } čĊĉĉčĊĉ ĉ private Ġfun Ġparse Choice List M ast od on ( čĊĉĉ ĉ context Ġ: ĠContext , čĊĉĉ ĉ status Ġ: ĠT oot Status , čĊĉĉ ĉ object Array Ġ: ĠArrayList < JSONObject >? čĊĉ ĉ ) Ġ: ĠArrayList < To ot Pol ls Choice >? Ġ{ čĊĉĉ ĉ if ( object Array Ġ!= Ġnull ) Ġ{ čĊĉĉĉ ĉ val Ġsize Ġ= Ġobject Array . size čĊĉĉĉ ĉ val Ġitems Ġ= ĠArrayList < To ot Pol ls Choice >( size ) čĊĉĉĉ ĉ val Ġoptions Ġ= ĠDecode Options ( čĊĉĉĉĉ ĉ context , čĊĉĉĉĉ ĉ emoji Map Custom Ġ= Ġstatus . custom _ emo jis , čĊĉĉĉĉ ĉ emoji Map Profile Ġ= Ġstatus . profile _ emo jis , čĊĉĉĉĉ ĉ decode Emoji Ġ= Ġtrue čĊĉĉĉ ĉ ) čĊĉĉĉ ĉ for ( o Ġin Ġobject Array ) Ġ{ čĊĉĉĉĉ ĉ val Ġtext Ġ= Ġre Whitespace čĊĉĉĉĉĉ ĉ . matcher (( o . parse String (" title ") Ġ?: Ġ"? "). sanitize B DI ()) čĊĉĉĉĉĉ ĉ . replaceAll (" Ġ") čĊĉĉĉĉ ĉ val Ġdecoded _ text Ġ= Ġoptions . decode Emoji ( text ) čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ items . add ( čĊĉĉĉĉĉ ĉ To ot Pol ls Choice ( čĊĉĉĉĉĉĉ ĉ text , čĊĉĉĉĉĉĉ ĉ decoded _ text , čĊĉĉĉĉĉĉ ĉ votes Ġ= Ġo . parseInt (" votes _ count ") Ġ// Ġmay Ġnull čĊĉĉĉĉĉ ĉ ) čĊĉĉĉĉ ĉ ) čĊĉĉĉ ĉ } čĊĉĉĉ ĉ if ( items . isNotEmpty ()) Ġreturn Ġitems čĊĉĉ ĉ } čĊĉĉ ĉ return Ġnull čĊĉ ĉ } čĊĉĉčĊĉ ĉ private Ġfun Ġparse Choice List Friends N ico ( čĊĉĉ ĉ context Ġ: ĠContext , čĊĉĉ ĉ status Ġ: ĠT oot Status , čĊĉĉ ĉ string Array Ġ: ĠArrayList < String >? čĊĉ ĉ ) Ġ: ĠArrayList < To ot Pol ls Choice >? Ġ{ čĊĉĉ ĉ if ( string Array Ġ!= Ġnull ) Ġ{ čĊĉĉĉ ĉ val Ġsize Ġ= ĠstringArray . size čĊĉĉĉ ĉ val Ġitems Ġ= ĠArrayList < To ot Pol ls Choice >( size ) čĊĉĉĉ ĉ val Ġoptions Ġ= ĠDecode Options ( čĊĉĉĉĉ ĉ context , čĊĉĉĉĉ ĉ emoji Map Custom Ġ= Ġstatus . custom _ emo jis , čĊĉĉĉĉ ĉ emoji Map Profile Ġ= Ġstatus . profile _ emo jis , čĊĉĉĉĉ ĉ decode Emoji Ġ= Ġtrue čĊĉĉĉ ĉ ) čĊĉĉĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ čĊĉĉĉĉ ĉ val Ġtext Ġ= Ġre Whitespace čĊĉĉĉĉĉ ĉ . matcher ( string Array [ i ]. sanitize B DI ()) čĊĉĉĉĉĉ ĉ . replaceAll (" Ġ") čĊĉĉĉĉ ĉ val Ġdecoded _ text Ġ= Ġoptions . decode HTML ( text ) čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ items . add ( čĊĉĉĉĉĉ ĉ To ot Pol ls Choice ( čĊĉĉĉĉĉĉ ĉ text , čĊĉĉĉĉĉĉ ĉ decoded _ text čĊĉĉĉĉĉ ĉ ) čĊĉĉĉĉ ĉ ) čĊĉĉĉ ĉ } čĊĉĉĉ ĉ if ( items . isNotEmpty ()) Ġreturn Ġitems čĊĉĉ ĉ } čĊĉĉ ĉ return Ġnull čĊĉ ĉ } čĊĉĉčĊĉ ĉ private Ġfun Ġparse Choice List Miss key ( čĊĉĉ ĉ choices Ġ: ĠJSONArray ? čĊĉ ĉ ) Ġ: ĠArrayList < To ot Pol ls Choice >? Ġ{ čĊĉĉ ĉ if ( choices Ġ!= Ġnull ) Ġ{ čĊĉĉĉ ĉ val Ġitems Ġ= ĠArrayList < To ot Pol ls Choice >() čĊĉĉĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġchoices . length ()) Ġ{ čĊĉĉĉĉ ĉ val Ġsrc Ġ= Ġchoices . opt JSONObject ( i ) čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ val Ġtext Ġ= Ġre Whitespace čĊĉĉĉĉĉ ĉ . matcher ( src . parse String (" text ") ?. sanitize B DI () Ġ?: Ġ"") čĊĉĉĉĉĉ ĉ . replaceAll (" Ġ") čĊĉĉĉĉ ĉ val Ġdecoded _ text Ġ= ĠSp ann able String ( text ) Ġ// Ġmiss key Ġ ãģ§ãģ¯ ãĥŀ ãĥ¼ãĤ¯ ãĥĢ ãĤ¦ ãĥ³ ä¸įåı¯ ãģ§ çµ µ æĸĩåŃĹ ãĤĤ ãģªãģĦ čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ val Ġdst Ġ= ĠT oot Pol ls Choice ( čĊĉĉĉĉĉ ĉ text Ġ= Ġtext , čĊĉĉĉĉĉ ĉ decoded _ text Ġ= Ġdecoded _ text , čĊĉĉĉĉĉ ĉ // Ġ éħį åĪĹ ãĤ¤ãĥ³ ãĥĩ ãĤ¯ ãĤ¹ ãģ¨ åĲĮ ãģĺ ãģł ãģ£ãģŁ Ġid Ġ= ĠEntity Id . may Null ( src . parse Long (" id ")), čĊĉĉĉĉĉ ĉ votes Ġ= Ġsrc . parseInt (" votes ") Ġ?: Ġ 0 , čĊĉĉĉĉĉ ĉ is V oted Ġ= Ġsrc . opt Boolean (" is V oted ") čĊĉĉĉĉ ĉ ) čĊĉĉĉĉ ĉ items . add ( dst ) čĊĉĉĉ ĉ } čĊĉĉĉĉčĊĉĉĉ ĉ if ( items . isNotEmpty ()) Ġreturn Ġitems čĊĉĉ ĉ } čĊĉĉ ĉ return Ġnull čĊĉ ĉ } čĊ ĉ } čĊĉčĊ ĉ // Ġmiss key çĶ¨ čĊ ĉ fun Ġincrease Vote ( context Ġ: ĠContext , Ġarg Choice Ġ: ĠInt ?, Ġis My V oted Ġ: ĠBoolean ) Ġ: ĠBoolean Ġ{ čĊĉ ĉ arg Choice Ġ?: Ġreturn Ġfalse čĊĉĉčĊĉ ĉ synchronized ( this ) Ġ{ čĊĉĉ ĉ try Ġ{ čĊĉĉĉ ĉ // Ġ æĹ¢ ãģ« æĬķ ç¥¨ æ¸ Ī ãģ¿ çĬ¶æħĭ ãģª ãĤī ä½ķ ãĤĤ ãģĹãģªãģĦ čĊĉĉĉ ĉ if ( own V oted ) Ġreturn Ġfalse čĊĉĉĉĉčĊĉĉĉ ĉ val Ġitem Ġ= Ġthis . items ?. get ( arg Choice ) Ġ?: Ġreturn Ġfalse čĊĉĉĉ ĉ item . votes Ġ= Ġ( item . votes Ġ?: Ġ 0 ) Ġ+ Ġ 1 čĊĉĉĉ ĉ if ( is My V oted ) Ġitem . is V oted Ġ= Ġtrue čĊĉĉĉĉčĊĉĉĉ ĉ // Ġupdate Ġrat ios čĊĉĉĉ ĉ val Ġvotes List Ġ= ĠArrayList < Int >() čĊĉĉĉ ĉ var Ġvotes Max Ġ= Ġ 1 čĊĉĉĉ ĉ items . forEach Ġ{ Ġchoice Ġ-> čĊĉĉĉĉ ĉ if ( choice . is V oted ) Ġown V oted Ġ= Ġtrue čĊĉĉĉĉ ĉ val Ġvotes Ġ= Ġchoice . votes Ġ?: Ġ 0 čĊĉĉĉĉ ĉ votes List . add ( votes ) čĊĉĉĉĉ ĉ if ( votes Ġ> Ġvotes Max ) Ġvotes Max Ġ= Ġvotes čĊĉĉĉ ĉ } čĊĉĉĉĉčĊĉĉĉ ĉ if ( votes List . isNotEmpty ()) Ġ{ čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ this . rat ios Ġ= Ġvotes List . as Sequence () čĊĉĉĉĉĉ ĉ . map Ġ{ Ġ( it . toFloat () Ġ/ Ġvotes Max . toFloat ()) Ġ} čĊĉĉĉĉĉ ĉ . to Mutable List () čĊĉĉĉĉĉ čĊĉĉĉĉ ĉ this . rat ios _ text Ġ= Ġvotes List . as Sequence () čĊĉĉĉĉĉ ĉ . map Ġ{ Ġcontext . getString ( R . string . vote _ count _ text , Ġit ) Ġ} čĊĉĉĉĉĉ ĉ . to Mutable List () čĊĉĉĉĉĉ čĊĉĉĉ ĉ } Ġelse Ġ{ čĊĉĉĉĉ ĉ this . rat ios Ġ= Ġnull čĊĉĉĉĉ ĉ this . rat ios _ text Ġ= Ġnull čĊĉĉĉ ĉ } čĊĉĉĉĉčĊĉĉĉ ĉ return Ġtrue čĊĉĉĉĉ čĊĉĉ ĉ } Ġcatch ( ex Ġ: ĠThrowable ) Ġ{ čĊĉĉĉ ĉ log . e ( ex , Ġ" increase Vote Ġfailed ") čĊĉĉĉ ĉ return Ġfalse čĊĉĉ ĉ } čĊĉĉĉčĊĉ ĉ } čĊ ĉ } čĊĉč Ċ } čĊ