package Ġcom . tun aso ftware . tun acr Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġutils . Single Live Event Ċ Ċ class ĠT una Card Recognition ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġread Names Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠ Ġval Ġread Numbers Ġ= Ġmutable Map Of < String , ĠInt >() ĊĠĠĠ Ġval Ġread Exp ir ations Ġ= Ġmutable Map Of < String , ĠInt >() ĊĊĠĠĠ Ġval Ġactions LiveData Ġ= ĠSingle Live Event < Any >() ĊĊĠĠĠ Ġvar Ġfinished Ġ= Ġfalse ; ĊĊĠĠĠ Ġfun Ġon Data Collected ( number : String Ġ, Ġname : String , Ġexpiration : String ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( finished ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isNotBlank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Names [ name ] Ġ= Ġ( read Names [ name ] ?: 0 ). toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( expiration . isNotBlank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Exp ir ations [ expiration ] Ġ= Ġ( read Exp ir ations [ expiration ] ?: 0 ). toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( number . isNotBlank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Numbers [ number ] Ġ= Ġ( read Numbers [ number ] ?: 0 ). toInt () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Result (){ ĊĠĠĠĠĠĠĠ Ġvar Ġread Number Ġ= Ġread Numbers . entries . filter Ġ{ Ġit . value Ġ>= Ġ 3 Ġ}. max By OrNull Ġ{ Ġit . value Ġ} ?. key ĊĠĠĠĠĠĠĠ Ġvar Ġread Name Ġ= Ġread Names . entries . max By OrNull Ġ{ Ġit . value Ġ} ?. key ĊĠĠĠĠĠĠĠ Ġvar Ġread Expiration Ġ= Ġread Exp ir ations . entries . max By OrNull Ġ{ Ġit . value Ġ} ?. key ĊĠĠĠĠĠĠĠ Ġif Ġ( read Number Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions LiveData . post Value ( Action Number Detected ( read Number , Ġread Name , Ġread Expiration )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠAction Number Detected ( val Ġnumber : String , Ġval Ġname : String ?, Ġval Ġexpiration : ĠString ?) ĊĊ