package Ġde . h sa ug sb urg . team ul ster . so happy . analyzer Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Inf late Exception Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . MainActivity Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . analyzer . detector . Detection Result Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . analyzer . detector . Face Detector Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . analyzer . detector . Sm ile Detector Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . config . Image Analyzer Config Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . exceptions . ExceptionHandler Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . factories . Detector Factory Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . fragment . Camera Fragment Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . state Machine . Action Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . state Machine . StateMachine Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . state Machine . states .* Ċ import Ġde . h sa ug sb urg . team ul ster . so happy . view model . Measurement ViewModel Ċ import Ġkotlin . concurrent . thread Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġimplements Ġthe ĠImage Analyzer Ġbased Ġon Ġa Ġgiven ĠImage Analyzer Config . Ċ Ġ* Ċ Ġ* Ġ@ param Ġ[ config ] Ġa Ġgiven ĠImage Analyzer Config Ġwhich Ġdetermines Ġthe Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Detector Impl / smile Detector Impl Ġto Ġbe Ġused Ċ Ġ*/ Ċ class ĠImage Analyzer ( val Ġfragment : ĠCamera Fragment , Ġconfig : ĠImage Analyzer Config ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠImage Analyzer State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNONE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFACE _ DE TE CTION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSM ILE _ DE TE CTION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCANCEL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmeasurement : ĠMeasurement ViewModel Ġby Ġfragment . activity ViewModels () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġface Detector : ĠFace Detector ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsm ile Detector : ĠSm ile Detector ĊĠĠĠ Ġprivate Ġvar Ġimage Analyzer State : ĠImage Analyzer State Ġ= ĠImage Analyzer State . NONE ĊĠĠĠ Ġprivate Ġval Ġstate Machine : ĠState Machine Ġby Ġfragment . activity ViewModels () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġface Detector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDetector Factory . create Face Detector From Config ( config , Ġfragment . require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsm ile Detector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDetector Factory . create Sm ile Detector From Config ( config , Ġfragment . require Activity ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException Handler . call Exception Dialog ( fragment . require Activity (), Ġfragment . resources , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException Handler . call Exception Dialog ( fragment . require Activity (), Ġfragment . resources , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInf late Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException Handler . call Exception Dialog ( fragment . require Activity (), Ġfragment . resources , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn initialized Property AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException Handler . call Exception Dialog ( fragment . require Activity (), Ġfragment . resources , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstate Machine . add State ChangeListener Ġ{ Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Analyzer State Ġ= Ġwhen Ġ( new ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Ġ-> ĠImage Analyzer State . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWaiting For Face , Ġis ĠTake AB re ath Ġ-> ĠImage Analyzer State . FACE _ DE TE CTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWaiting For Sm ile Ġ-> ĠImage Analyzer State . SM ILE _ DE TE CTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuestions , Ġis ĠNo Sm ile Ġ-> ĠImage Analyzer State . CANCEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġimage Analyzer State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage Analyzer State Ġ= Ġwhen Ġ( state Machine . getCurrent Machine State ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Ġ-> ĠImage Analyzer State . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWaiting For Face , Ġis ĠTake AB re ath Ġ-> ĠImage Analyzer State . FACE _ DE TE CTION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWaiting For Sm ile Ġ-> ĠImage Analyzer State . SM ILE _ DE TE CTION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuestions , Ġis ĠNo Sm ile Ġ-> ĠImage Analyzer State . CANCEL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġimage Analyzer State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcalculates Ġa ĠFace Detection Result Ġusing Ġ[ face Detector ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ img ] Ġa Ġbitmap Ġwhich Ġwill Ġbe Ġanalyzed ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Detection Result ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcompute Face Detection Result ( img : ĠBitmap ): ĠDetection Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġface Detector . detect ( img ) ĊĠĠĠĠĠĠĠ Ġreturn ĠDetection Result ( result , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcalculates Ġa ĠSm ile Detection Result Ġwhich Ġholds Ġthe Ġresult , ĊĠĠĠĠ Ġ* Ġwhether Ġor Ġnot Ġa Ġsm ile Ġwas Ġdetected Ġin Ġa Ġalready Ġanalyzed ĠFace Detection Result . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ img ] Ġa Ġbitmap Ġwhich Ġwill Ġbe Ġanalyzed ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Detection Result ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcompute Sm ile Detection Result ( img : ĠBitmap ): ĠDetection Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġface Detection Result Ġ= Ġface Detector . detect ( img ) ĊĠĠĠĠĠĠĠ Ġval Ġc ropped Out Face Ġ= Ġface Detection Result ?. frame ?. let Ġ{ ĠBitmap Editor . crop ( img , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsm ile DR Ġ= Ġc ropped Out Face ?. let Ġ{ Ġsm ile Detector . detect ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDetection Result ( face Detection Result , Ġsm ile DR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstarts Ġan Ġthread Ġwith Ġan Ġinfinite Ġloop . ĠGets Ġthe Ġcurrent Ġframe Ġfrom Ġthe Ġbitmap Queue Ġand ĊĠĠĠĠ Ġ* Ġand Ġprocesses Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Hardware Ids ") ĊĠĠĠ Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image Analyzer State Ġ== ĠImage Analyzer State . CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement . id Ġ= ĠSettings . Secure . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . context ?. content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . Secure . ANDROID _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fragment . require Activity () Ġas ĠMainActivity ). local Database Manager ?. add OrUpdate Measurement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġfragment . queue . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwhen Ġ( image Analyzer State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Analyzer State . FACE _ DE TE CTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcompute Face Detection Result ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Machine . getCurrent Machine State () Ġis ĠWaiting For Face Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . face Detection Result Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . consume Action ( Action . Face Detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Analyzer State . SM ILE _ DE TE CTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcompute Sm ile Detection Result ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Machine . getCurrent Machine State () Ġis ĠWaiting For Sm ile Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . smile Detection Result Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . smile Detection Result . is Sm iling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Machine . consume Action ( Action . Sm ile Detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Result :", Ġresult . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. let Ġ{ Ġmeasurement . add Detection Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ