package Ġcom . blo vote . sur veys . ui . questions Ċ Ċ import Ġandroid . support . annotation . Ui Thread Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget .* Ċ import Ġcom . blo vote . R Ċ import Ġcom . blo vote . sur veys . data . entities . Question Type Ċ import Ġkotlinx . coroutines . experimental . android . UI Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġorg . jetbrains . ank o . sdk 2 5 . coroutines . onClick Ċ Ċ class ĠQuestion Adapter ( private Ġval Ġedit Mode Ġ: ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhas Right Answer : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtype Ġ: ĠQuestion Type Ġ= ĠQuestion Type . Single Variant , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpoints Ġ: ĠMutable List < String > Ġ= Ġmutable ListOf (""), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġan sw s : ĠMutable List < Int > Ġ= ĠArrayList ()) ĊĊĠĠĠ Ġ: ĠRecyclerView . Adapter < Question Adapter . ViewHolder >() Ġ{ ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠQuestion Type . Single Variant Ġ&& Ġan sw s . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Single Ġvariant Ġquestions Ġcannot Ġhave Ġmore Ġthan Ġ 1 Ġright Ġanswer ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast RadioButton Ġ: ĠRadio Button ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . layout _ question _ point , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpoints . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġholder . item View ĊĊĠĠĠĠĠĠĠ Ġval Ġradio View Ġ= Ġview . findViewById < RadioButton >( R . id . radio _ point ) ĊĠĠĠĠĠĠĠ Ġradio View . visibility Ġ= Ġif Ġ( type Ġ== ĠQuestion Type . Single Variant ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġradio View . isEnabled Ġ= Ġ! edit Mode Ġ|| Ġhas Right Answer ĊĠĠĠĠĠĠĠ Ġradio View . isChecked Ġ= Ġan sw s . contains ( position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( radio View . isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast RadioButton Ġ= Ġradio View ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġradio View . onClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Type ( Question Type . Single Variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ans ws . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast RadioButton ?. isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio View . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast RadioButton Ġ= Ġradio View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan sw s Ġ= Ġmutable ListOf ( holder . adapter Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcheck View Ġ= Ġview . findViewById < CheckBox >( R . id . check _ point ) ĊĠĠĠĠĠĠĠ Ġcheck View . visibility Ġ= Ġif Ġ( type Ġ== ĠQuestion Type . Many Variants ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġcheck View . isEnabled Ġ= Ġ! edit Mode Ġ|| Ġhas Right Answer ĊĠĠĠĠĠĠĠ Ġcheck View . isChecked Ġ= Ġan sw s . contains ( position ) ĊĠĠĠĠĠĠĠ Ġcheck View . setOn Checked ChangeListener ({ button , Ġchecked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan sw s . add ( holder . adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan sw s . sort () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan sw s . remove ( holder . adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġedit Text Ġ= Ġview . findViewById < EditText >( R . id . text _ point ) ĊĠĠĠĠĠĠĠ Ġedit Text . setText ( points [ position ], ĠTextView . Buffer Type . EDIT ABLE ) ĊĠĠĠĠĠĠĠ Ġset Editable ( edit Text , Ġedit Mode ) ĊĠĠĠĠĠĠĠ Ġedit Text . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( p 0 : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints [ holder . adapter Position ] Ġ= Ġp 0 . toString (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġdelete Button Ġ= Ġview . findViewById < Image Button >( R . id . point _ delete ) ĊĠĠĠĠĠĠĠ Ġdelete Button . visibility Ġ= Ġif Ġ( edit Mode ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġdelete Button . onClick Ġ{ Ġrequest Point Delete ( holder . adapter Position ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Editable ( edit Text : ĠEditText , Ġedit Mode : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġedit Text . is Clickable Ġ= Ġedit Mode ĊĠĠĠĠĠĠĠ Ġedit Text . is Focus able Ġ= Ġedit Mode ĊĠĠĠĠĠĠĠ Ġedit Text . is Cursor Visible Ġ= Ġedit Mode ĊĠĠĠĠĠĠĠ Ġedit Text . is Focus able In Touch Mode Ġ= Ġedit Mode ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġupdate Type ( type : ĠQuestion Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġthis . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġan sw s . clear () ĊĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype ĊĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Points ( new Points : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpoints Ġ= ĠArrayList ( new Points ) ĊĠĠĠĠĠĠĠ Ġlaunch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Points () Ġ: ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpoints ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Answers () Ġ: ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġan sw s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Point ( point : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpoints . add ( point ) ĊĠĠĠĠĠĠĠ Ġlaunch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Range Inserted ( points . size Ġ- Ġ 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Point Delete ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ>= Ġ 0 Ġ&& Ġposition Ġ< Ġpoints . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . remove At ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Range Removed ( position , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck Type ( type : ĠQuestion Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . type Ġ!= Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Expected Ġ${ type }, Ġbut Ġwas Ġ${ this . type }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ ******************************** ***** ĠInner Ġclasses Ġ************************* ******/ ĊĊĠĠĠ Ġclass ĠViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ċ Ċ }