/** Ċ * ĠCopyright ĠS or am its u ĠCo ., ĠLtd . ĠAll ĠRights ĠReserved . Ċ * ĠSPDX - License - Identifier : ĠGPL - 3 . 0 Ċ */ Ċ Ċ package Ġjp . co . sor am its u . feature _ main _ impl . presentation . util Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . WindowManager . LayoutParams Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . EditText Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Dialog Ċ import Ġjp . co . sor am its u . common . presentation . De bounce Click Handler Ċ import Ġjp . co . sor am its u . common . util . Numbers Formatter Ċ import Ġjp . co . sor am its u . common . util . ext . g one Ċ import Ġjp . co . sor am its u . common . util . ext . hide Ċ import Ġjp . co . sor am its u . common . util . ext . set De bounc ed ClickListener Ċ import Ġjp . co . sor am its u . common . util . ext . show Ċ import Ġjp . co . sor am its u . feature _ main _ impl . R Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . cancel Btn Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . keyboard Img Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . message Tv Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . vote Submit Container Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . vote Submit Icon Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . vote Submit Text Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . votes Et Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . votes Sb Ċ import Ġkotlinx . android . synt hetic . main . vote _ bottom _ dialog . vote Submit Button Image Ċ Ċ class ĠV ote Style b ale Holder ( val Ġicon : ĠImageView , Ġval Ġtext : ĠTextView , Ġval Ġcontainer : ĠView , Ġval Ġbutton Image : ĠImageView , Ġval Ġseek Bar : ĠSeek Bar ) Ċ Ċ private Ġtype alias ĠV ote Dialog St y ler Ġ= Ġ( Vote Style b ale Holder ) Ġ-> ĠUnit Ċ Ċ class ĠV ote Bottom Sheet Dialog ( ĊĠĠĠ Ġcontext : ĠActivity , ĊĠĠĠ Ġprivate Ġval Ġvot able Type : ĠV ot able Type , ĊĠĠĠ Ġprivate Ġval Ġmax Votes Needed : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġvote ClickListener : Ġ( Long ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġkeyboard ClickListener : Ġ( EditText ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġnumbers Formatter : ĠNumbers Formatter , ĊĠĠĠ Ġdebounce Click Handler : ĠDe bounce Click Handler Ċ ) Ġ: ĠBottom Sheet Dialog ( context , ĠR . style . Bottom Sheet Dialog ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlock Votes Count Ġ= Ġ 0 ĊĊĠĠĠ Ġsealed Ġclass ĠV ot able Type ( val Ġmax Vote Type : ĠMax Vote Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġvote Dialog St y ler : ĠV ote Dialog St y ler ĊĊĠĠĠĠĠĠĠ Ġclass ĠProject ( max Vote Type : ĠMax Vote Type ) Ġ: ĠV ot able Type ( max Vote Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvote Dialog St y ler : ĠV ote Dialog St y ler Ġ= Ġ{ Ġdialog St yl able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( dialog St yl able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontainer . context ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Image . g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . text Ġ= Ġcontext . getString ( R . string . common _ vote ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . setBackground Resource ( R . drawable . rounded _ rectangle _ red ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠRefer endum ( private Ġval Ġis V oting For : ĠBoolean ) Ġ: ĠV ot able Type ( Max Vote Type . USER _ CAN _ G IVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvote Dialog St y ler : ĠV ote Dialog St y ler Ġ= Ġ{ Ġdialog St yl able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( dialog St yl able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontainer . context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . g one () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is V oting For ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . thumb Ġ= Ġcontext . get Drawable ( R . drawable . ic _ seek bar _ thumb _ red ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . progress Tint List Ġ= ĠColor State List . valueOf ( context . resources . getColor ( R . color . u ikit _ light Red )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . thumb Ġ= Ġcontext . get Drawable ( R . drawable . ic _ seek bar _ thumb _ grey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . progress Tint List Ġ= ĠColor State List . valueOf ( context . resources . getColor ( R . color . grey )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Res Ġ= Ġif Ġ( is V oting For ) ĠR . drawable . ic _ thumb _ up _ 1 6 Ġelse ĠR . drawable . ic _ thumb _ down _ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Image . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Image . setImage Resource ( icon Res ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground Res Ġ= Ġif Ġ( is V oting For ) ĠR . drawable . rounded _ rectangle _ red Ġelse ĠR . drawable . rounded _ rectangle _ grey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Image . setBackground Resource ( background Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠMax Vote Type Ġ{ ĊĠĠĠĠĠĠĠ ĠUSER _ CAN _ G IVE , ĊĠĠĠĠĠĠĠ ĠV OT ABLE _ NEED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠsetContentView ( LayoutInflater . from ( context ). inflate ( R . layout . vote _ bottom _ dialog , Ġnull )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Holder Ġ= ĠV ote Style b ale Holder ( vote Submit Icon , Ġvote Submit Text , Ġvote Submit Container , Ġvote Submit Button Image , Ġvotes Sb ) ĊĠĠĠĠĠĠĠ Ġvot able Type . vote Dialog St y ler . invoke ( dialog Holder ) ĊĊĠĠĠĠĠĠĠ Ġvotes Et . tag Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvotes Sb . max Ġ= Ġmax Votes Needed ĊĊĠĠĠĠĠĠĠ Ġvotes Et . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( after ChangeEvent : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Et . tag Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Et . remove TextChanged Listener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvotes Count Ġ= Ġnumbers Formatter . getNumber FromString ( after ChangeEvent . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Changed ( votes Count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Et . add TextChanged Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġvotes Sb . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar ?, Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( votes Et . tag Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvotes Ġ= Ġif Ġ( progress Ġ== Ġ 0 ) Ġ 1 Ġelse Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Votes Text ( votes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Et . tag Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġcancel Btn . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwindow !!. set Soft Input Mode ( LayoutParams . SOFT _ INPUT _ ADJ UST _ RE SIZE ) ĊĊĠĠĠĠĠĠĠ Ġvote Submit Container . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( votes Et . text . toString (). isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote ClickListener ( numbers Formatter . getNumber FromString ( votes Et . text . toString ()). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvote Submit Button Image . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( votes Et . text . toString (). isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote ClickListener ( numbers Formatter . getNumber FromString ( votes Et . text . toString ()). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkeyboard Img . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard ClickListener ( votes Et ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvotes Sb . progress Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvotes Changed ( votes Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( votes Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Tv . text Ġ= Ġcontext . getString ( R . string . project _ you _ can _ vote _ at _ least _ 1 _ point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Tv . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . alpha Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( votes Count Ġ> Ġmax Votes Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Max Vote Type . V OT ABLE _ NEED Ġ== Ġvot able Type . max Vote Type ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Votes Text ( max Votes Needed ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Tv . text Ġ= Ġcontext . getString ( R . string . project _ requires _ votes _ format , Ġmax Votes Needed . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lock Votes Count Ġ== Ġ 0 ) Ġlock Votes Count Ġ= Ġvotes Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Votes Text ( lock Votes Count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Tv . text Ġ= Ġcontext . getString ( R . string . project _ user _ have _ not _ en ough _ votes _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvote Submit Container . alpha Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Tv . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvotes Sb . progress Ġ= Ġvotes Sb . max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Votes Text ( votes Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlock Votes Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġvotes Sb . progress Ġ= Ġvotes Count ĊĠĠĠĠĠĠĠ Ġvote Submit Container . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvote Submit Container . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġmessage Tv . hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Open Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġkeyboard Img . setImage Resource ( R . drawable . icon _ open _ keyboard ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Close Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġkeyboard Img . setImage Resource ( R . drawable . icon _ close _ keyboard ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Votes Text ( votes : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvotes String Ġ= Ġnumbers Formatter . format Integer ( votes . to BigDecimal ()) ĊĠĠĠĠĠĠĠ Ġvotes Et . setText ( votes String ) ĊĠĠĠĠĠĠĠ Ġvotes Et . setSelection ( votes Et . length ()) ĊĠĠĠ Ġ} Ċ }