package Ġcom . example . android calculator Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . compose . ui . text . Text Range Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ Ċ class ĠDisplay ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġtemp Bottom Display : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġ_ top Display : ĠMutable LiveData < TextField Value > Ġ= ĠMutable LiveData ( TextField Value ()) ĊĠĠĠ Ġprivate Ġval Ġ_ bottom Display : ĠMutable LiveData < String > Ġ= ĠMutable LiveData ("") ĊĠĠĠ Ġprivate Ġval Ġ_ back space Enabled : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġprivate Ġval Ġ_ alert Dialog Parameters : ĠMutable LiveData < AlertDialog Parameters > Ġ= ĠMutable LiveData ( ĊĠĠĠĠĠĠĠ ĠAlertDialog Parameters ( false , Ġ"", Ġ"") ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġalert Dialog Parameters : ĠLive Data < AlertDialog Parameters > Ġ= Ġ_ alert Dialog Parameters ĊĠĠĠ Ġval Ġtop Display : ĠLive Data < TextField Value > Ġ= Ġ_ top Display ĊĠĠĠ Ġval Ġbottom Display : ĠLive Data < String > Ġ= Ġ_ bottom Display ĊĠĠĠ Ġval Ġback space Enabled : ĠLive Data < Boolean > Ġ= Ġ_ back space Enabled ĊĊĠĠĠ Ġprivate Ġfun Ġback space Button Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ back space Enabled . value Ġ= Ġenabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Max Digits ( math Expression : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Digits Ġ= Ġ 1 5 ĊĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġmath Expression Length Ġ= Ġmath Expression . length Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġdot Decimal : ĠChar Ġ= Ġ"." [ 0 ] ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. math Expression Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( math Expression [ index ]. is Digit ()) Ġ|| Ġ( math Expression [ index ] Ġ== Ġdot Decimal )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ> Ġmax Digits ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcounter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Top Display Change ( newValue : ĠText FieldValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= ĠnewValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Bottom Display Change ( newValue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ bottom Display . value Ġ= ĠnewValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow AlertDialog (_ enabled : ĠBoolean , Ġ_ title : ĠString , Ġ_ text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ alert Dialog Parameters . value ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġ_ enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ_ title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ_ text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . enabled ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. enabled . toString ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . title ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. title . toString ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . text ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ_ alert Dialog Parameters . value ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġ_ enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġempty ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . enabled ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. enabled . toString ()) Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . title ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. title . toString ()) Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Pro pri et ies . text ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog Parameters . value ?. text . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Number ( number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( number Ġ! in Ġ 0 .. 9 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġback space Button Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġval ĠisEmpty Ġ= Ġ_ top Display . value ?. text ?. isEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnumber . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= ĠText Range ( number . toString (). length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ_ is Max Digits Ġ= Ġis Max Digits (_ top Display . value ?. text Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Max Digits ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Parameters . value Ġ: ", Ġalert Dialog Parameters . value ?. enabled . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ("_ is Max Digits ĠValue : Ġ", Ġ_ is Max Digits . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow AlertDialog ( true , Ġ"", Ġ" Can 't Ġenter Ġmore Ġthan Ġ 1 5 Ġdigits .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" alert Dialog Parameters . value Ġ: ", Ġalert Dialog Parameters . value ?. enabled . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġ_ top Display . value ?. selection ?. start Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= ĠstartIndex ĊĠĠĠĠĠĠĠ Ġval Ġcursor Position Ġ= Ġ(_ top Display . value ?. selection ?. start Ġas ĠInt ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġ_ top Display . value ?. text ?. replace Range ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber . toString () ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnew Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= ĠText Range ( cursor Position ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Back space () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠisEmpty Ġ= Ġ_ top Display . value ?. text ?. isEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġis Collapsed Ġ= Ġ_ top Display . value ?. selection ?. collapsed ĊĠĠĠĠĠĠĠ Ġif Ġ( is Collapsed Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Cursor Position Ġ= Ġ_ top Display . value ?. selection ?. start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Cursor Position Ġ== Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġ(_ top Display . value ?. selection ?. start Ġas ĠInt ) Ġ- Ġ 1 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" startIndex ĠValue : Ġ", ĠstartIndex . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġ_ top Display . value ?. selection ?. end Ġas ĠInt Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" end Index ĠValue : Ġ", Ġend Index . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Position Ġ= ĠstartIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ_ top Display . value ?. text ?. remove Range ( startIndex , Ġend Index ) Ġas ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= ĠText Range ( cursor Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġ_ top Display . value ?. selection ?. start Ġas ĠInt Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" startIndex ĠValue : Ġ", ĠstartIndex . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġ_ top Display . value ?. selection ?. end Ġas ĠInt Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" end Index ĠValue : Ġ", Ġend Index . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ_ top Display . value ?. text ?. remove Range ( startIndex , Ġend Index ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠisEmpty Ġ= Ġ_ top Display . value ?. text ?. isEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Ġ== Ġtrue ) Ġback space Button Enabled ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Sum () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Minus () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġvar Ġexpression Ġ= Ġ" 1 . 1 0 0 0 0 1 Ġ+ Ġ 1 Ġ+ Ġ 1 " Ċ // ĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠExpression Builder ( expression ). build (). evaluate () Ċ // ĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġresult . toString () Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" Expression :", Ġ" Result : Ġ$ result ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Multiple () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Split () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Percent () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Dot () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisEmpty Ġ= Ġ_ top Display . value ?. text ?. isEmpty () ĊĠĠĠĠĠĠĠ Ġval Ġdot Signal Ġ= Ġ"." ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( text Ġ= Ġdot Signal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ_ is Max Digits Ġ= Ġis Max Digits (_ top Display . value ?. text Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Max Digits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ("_ is Max Digits ĠValue : Ġ", Ġ_ is Max Digits . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġ_ top Display . value ?. selection ?. start Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= ĠstartIndex ĊĠĠĠĠĠĠĠ Ġval Ġcursor Position Ġ= Ġ(_ top Display . value ?. selection ?. start Ġas ĠInt ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġ_ top Display . value ?. text ?. replace Range ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdot Signal ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnew Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= ĠText Range ( cursor Position ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Equal () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Bracket () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Clear () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew TextField Value Ġ= ĠText FieldValue ( text Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġ_ top Display . value Ġ= Ġnew TextField Value ĊĠĠĠĠĠĠĠ Ġback space Button Enabled ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Positive And Negative () Ġ{ ĊĊĠĠĠ Ġ} Ċ } Ċ