/* Ċ MIT ĠLicense Ċ Ċ Copyright Ġ( c ) Ġ 2 0 1 7 Ġ- Ġ 2 0 2 1 ĠPo ĠCh eng Ċ Ċ Permission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ of Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ in Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ to Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ copies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ furnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ċ The Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ copies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ċ THE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ IMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ FITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ AUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ LIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ OUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ SOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . monkey app . numbers Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . activity . result . contract . Activity Result Contract Ċ import Ġandroidx . core . view . children Ċ import Ġandroidx . core . view . do On Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . ui . on Nav Destination Selected Ċ import Ġarrow . core . Either Ċ import Ġcom . google . android . gms . ads . Ad Listener Ċ import Ġcom . google . android . gms . ads . Ad Request Ċ import Ġcom . google . android . gms . ads . Ad Size Ċ import Ġcom . google . android . gms . ads . Ad View Ċ import Ġcom . google . firebase . analytics . Firebase Analytics Ċ import Ġcom . google . firebase . analytics . k tx . analytics Ċ import Ġcom . google . firebase . analytics . k tx . log Event Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . monkey app . numbers . app helpers .* Ċ import Ġcom . monkey app . numbers . trans l ators . Spell er Error Ċ Ċ class ĠMain Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġad View : ĠAd View ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġmain ViewModel : ĠMain ViewModel Ġby Ġview Models Ġ{ ĠMain ViewModel . Factory () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġocr Scanner Launcher Ġ= Ġ Ġregister For Activity Result ( Ġobject Ġ: ĠActivity Result Contract < Unit , ĠString >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġinput : ĠUnit ?): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . ocr Intent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. getString Extra (" number ") Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ġ{ Ġnumber Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( number . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber . forEach Ġ{ Ġdigit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . append ( digit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġad View ?. resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġad View ?. pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġad View ?. destroy () ĊĠĠĠĠĠĠĠ Ġad View Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . content _ main , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ad View Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad View Ġ= ĠAd View ( require Context ()). apply (:: setup Ad View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġom ni Button View : ĠOm ni Button Ġ= Ġview . findViewById ( R . id . om ni Button View ) ĊĠĠĠĠĠĠĠ Ġval Ġdigit Pad View : ĠViewGroup Ġ= Ġview . findViewById ( R . id . digit Pad View ) ĊĠĠĠĠĠĠĠ Ġval Ġwords TextView : ĠTextView Ġ= Ġview . findViewById ( R . id . words TextView ) ĊĠĠĠĠĠĠĠ Ġval Ġnumber TextView : ĠTextView Ġ= Ġview . findViewById ( R . id . number TextView ) ĊĊĠĠĠĠĠĠĠ Ġom ni Button View . setOnClickListener Ġ{ Ġom ni Button Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( om ni Button Ġas ? ĠOm ni Button )?. state ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠOm ni Button . State . Clean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( it Ġ== ĠOm ni Button . State . Camera ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġocr Scanner Launcher . launch ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdigit Pad View . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ Ġit . id Ġ== ĠR . id . btn Del Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlong Ġclick Ġto Ġreset Ġnumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Long ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġlast Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . back space () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdigit Pad View . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠButton Ġ&& Ġ( it . text [ 0 ] Ġ== Ġ'.' Ġ|| Ġit . text [ 0 ] Ġin Ġ' 0 ' .. ' 9 ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . append (( it Ġas ĠButton ). text [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwords TextView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwords Text Ġ= Ġwords TextView . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( words Text . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠMain Fragment Directions . action Main To FullScreen ( words Text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Main Fragment ", Ġ" navigation Ġfailed ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmain ViewModel . formatted Number Text . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber TextView . text Ġ= Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġom ni Button View . state Ġ= Ġif Ġ( it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOm ni Button . State . Camera ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOm ni Button . State . Clean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmain ViewModel . number Words Text . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġwords TextView . text Ġ= Ġit . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp eller Error . NUMBER _ IS _ TOO _ LARGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigit Pad View . sn ackbar ( R . string . too _ large _ to _ spell ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon ( R . drawable . ic _ error , ĠR . color . accent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġattach Ġrating Ġpromp ter ĊĠĠĠĠĠĠĠ ĠRating Pro mp ter ( activity Ġ= Ġrequire Activity (), Ġanchor View Ġ= Ġdigit Pad View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( view Lifecycle Owner ) ĊĊĠĠĠĠĠĠĠ ĠFirebase . analytics . log Event ( Firebase Analytics . Event . SCREEN _ VIEW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ( Firebase Analytics . Param . SCREEN _ NAME , ĠMain Fragment :: class . java . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam ( Firebase Analytics . Param . SCREEN _ CLASS , ĠMain Fragment :: class . java . simple Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . main , Ġmenu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitem . on Nav Destination Selected ( find Nav Controller ()) Ġ|| Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠMain Fragment . setup Ad View ( ad View : ĠAd View ) Ġ{ ĊĠĠĠ Ġval Ġad Container View Ġ= Ġrequire View (). findViewById < Frame Layout >( R . id . ad View Container ) ĊĊĠĠĠ Ġfun Ġadaptive Ad Size (): ĠAd Size Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġrequire Activity (). window Manager . default Display ĊĠĠĠĠĠĠĠ Ġval Ġout Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠ Ġdisplay . get Metrics ( out Metrics ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġout Metrics . density ĊĊĠĠĠĠĠĠĠ Ġvar Ġad Width Pixels Ġ= Ġad Container View . width . toFloat () ĊĠĠĠĠĠĠĠ Ġif Ġ( ad Width Pixels Ġ== Ġ 0 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Width Pixels Ġ= Ġout Metrics . width Pixels . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġad Width Pixels Ġ/= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġad Width Ġ= Ġ( ad Width Pixels Ġ/ Ġdensity ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn ĠAd Size . getCurrent Orientation An ch ored Adaptive Banner Ad Size ( require Context (), Ġad Width ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġad Container View . do On Layout Ġ{ ĊĠĠĠĠĠĠĠ Ġad View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Size Ġ= Ġadaptive Ad Size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Unit Id Ġ= Ġresources . getString ( R . string . ad _ unit _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Listener Ġ= Ġobject Ġ: ĠAd Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Failed To Load ( errorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase . analytics . log Event (" Ad Loading Failed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam (" ErrorCode ", ĠerrorCode . toString () Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġad Container View . addView ( ad View ) ĊĠĠĠĠĠĠĠ Ġad View . load Ad ( Ad Request . Builder (). build ()) ĊĠĠĠ Ġ} Ċ }