package Ġcom . example . calculator Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . example . calculator . databinding . Activity Main Binding Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġenum Ġclass ĠOp Kind Ġ{ ĊĠĠĠĠĠĠĠ ĠADD , ĠSUB TRACT , ĠMULTI PLY , ĠDIV IDE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠOp Kind . compute ( a : ĠBigDecimal , Ġb : ĠBigDecimal ): ĠBigDecimal Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp Kind . ADD Ġ-> Ġa Ġ+ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp Kind . SUB TRACT Ġ-> Ġa Ġ- Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp Kind . MULTI PLY Ġ-> Ġa Ġ* Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp Kind . DI VID E Ġ-> Ġa . divide ( b , Ġ 1 0 , ĠRound ingMode . HALF _ E VEN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding ĊĠĠĠ Ġprivate Ġval Ġtxt Result Ġget () Ġ= Ġbinding . txt Result ĊĠĠĠ Ġprivate Ġvar Ġlast Result : ĠBigDecimal Ġ= ĠBigDecimal . ZERO ĊĠĠĠ Ġprivate Ġvar Ġlast Op : ĠOp Kind ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġwaiting Next Operand : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġbinding . btn 0 . setOnClickListener Ġ{ Ġappend Text (" 0 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 1 . setOnClickListener Ġ{ Ġappend Text (" 1 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 2 . setOnClickListener Ġ{ Ġappend Text (" 2 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 3 . setOnClickListener Ġ{ Ġappend Text (" 3 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 4 . setOnClickListener Ġ{ Ġappend Text (" 4 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 5 . setOnClickListener Ġ{ Ġappend Text (" 5 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 6 . setOnClickListener Ġ{ Ġappend Text (" 6 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 7 . setOnClickListener Ġ{ Ġappend Text (" 7 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 8 . setOnClickListener Ġ{ Ġappend Text (" 8 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn 0 . setOnClickListener Ġ{ Ġappend Text (" 9 ") Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Point . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Text (".") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . btn Sign . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Text Ġ= Ġtxt Result . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Text . startsWith ("- ") Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Text . substring ( 1 , Ġcurrent Text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Text Ġ!= Ġ" 0 " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- $ current Text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . btn Back space . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Text Ġ= Ġtxt Result . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġcurrent Text . substring ( 0 , Ġcurrent Text . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text . isEmpty () Ġ|| Ġnew Text Ġ== Ġ"- ") Ġ" 0 " Ġelse Ġnew Text ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . btn Clear . setOnClickListener Ġ{ Ġclear Text () Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . btn Plus . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc ( Op Kind . ADD ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Minus . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc ( Op Kind . SUB TRACT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Times . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc ( Op Kind . MULTI PLY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Divide . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc ( Op Kind . DI VID E ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . btn Calc . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclear Text () ĊĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= Ġit . getString (" current Text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Result Ġ= Ġit . get Serializable (:: last Result . name ) Ġas ĠBigDecimal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Op Ġ= Ġit . get Serializable (:: last Op . name ) Ġas ĠOp Kind ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting Next Operand Ġ= Ġit . getBoolean (:: waiting Next Operand . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . putString (" current Text ", Ġtxt Result . text . toString ()) ĊĠĠĠĠĠĠĠ Ġout State . put Serializable (:: last Result . name , Ġlast Result ) ĊĠĠĠĠĠĠĠ Ġout State . put Serializable (:: last Op . name , Ġlast Op ) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean (:: waiting Next Operand . name , Ġwaiting Next Operand ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= Ġ" 0 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Text ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( waiting Next Operand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting Next Operand Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Text Ġ= Ġtxt Result . text . toString () ĊĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= Ġif Ġ( current Text Ġ== Ġ" 0 ") Ġtext Ġelse Ġcurrent Text Ġ+ Ġtext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc ( next Op : ĠOp Kind ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( waiting Next Operand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Op Ġ= Ġnext Op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Value Ġ= ĠBigDecimal ( txt Result . text . toString ()) ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Op ?. compute ( last Result , Ġcurrent Value ) Ġ?: Ġcurrent Value ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠArithmetic Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Op Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting Next Operand Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġoperation !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( next Op Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Result Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( last Op Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Result . text Ġ= ĠnewValue . to Plain String () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Op Ġ= Ġnext Op ĊĠĠĠĠĠĠĠ Ġwaiting Next Operand Ġ= Ġnext Op Ġ!= Ġnull ĊĠĠĠ Ġ} Ċ }