package Ġno . reality lab . ar face Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . ar . core . Ar Core A pk Ċ import Ġcom . google . ar . core . Aug ment ed Face Ċ import Ġcom . google . ar . core . Tracking State Ċ import Ġcom . google . ar . scene form . rendering . Model Render able Ċ import Ġcom . google . ar . scene form . rendering . Render able Ċ import Ġcom . google . ar . scene form . rendering . Texture Ċ import Ġcom . google . ar . scene form . ux . Aug ment ed Face Node Ċ import Ġkotlinx . android . synt hetic . main . activity _ gl asses .* Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Environment . get External Storage Directory Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Pixel Copy Ċ import Ġandroid . view . View Ċ import Ġandroidx . annotation . NonNull Ċ import Ġcom . google . ar . scene form . Ar Scene View Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap ĊĊ Ċ @ Suppress (" DE PREC ATION ") Ċ class ĠGl asses Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ OPEN GL _ VERSION Ġ= Ġ 3 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrequest Write Permission Ġ= ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠ Ġlateinit Ġvar Ġar Fragment : ĠFace Ar Fragment ĊĠĠĠ Ġprivate Ġvar Ġgl asses : ĠArrayList < Model Render able > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġface Regions Render able : ĠModel Render able ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap : ĠBitmap ĊĠĠĠ Ġvar Ġface Node Map Ġ= ĠHashMap < Aug ment ed Face , ĠAug ment ed Face Node >() ĊĠĠĠ Ġprivate Ġvar Ġindex : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġchange Model : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Is Supported Device Or Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhas Write Permission Ġ= ĠRuntime Permission Util . check Per mis son Granted ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ gl asses ) ĊĠĠĠĠĠĠĠ Ġbutton _ next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Model Ġ= Ġ! change Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġgl asses . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġface Regions Render able Ġ= Ġgl asses . get ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġar Fragment Ġ= Ġface _ fragment Ġas ĠFace Ar Fragment ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( this , ĠUri . parse (" yellow _ sun gl asses . s fb ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġmodel Render able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl asses . add ( model Render able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Regions Render able Ġ= Ġmodel Render able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow C aster Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow Receiver Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( this , ĠUri . parse (" sun gl asses . s fb ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġmodel Render able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl asses . add ( model Render able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow C aster Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow Receiver Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( this , ĠUri . parse (" red Gl asses . s fb ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġmodel Render able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl asses . add ( model Render able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow C aster Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow Receiver Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠModel Render able . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source ( this , ĠUri . parse (" modern Gl asses . s fb ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Accept Ġ{ Ġmodel Render able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl asses . add ( model Render able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow C aster Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Render able . is Shadow Receiver Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscene View Ġ= Ġar Fragment . ar Scene View ĊĠĠĠĠĠĠĠ Ġscene View . camera Stream Render Priority Ġ= ĠRender able . RENDER _ PRIORITY _ FIRST ĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġscene View . scene ĊĊĠĠĠĠĠĠĠ Ġscene . add On Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( face Regions Render able Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene View . session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getAll Track ables ( Aug ment ed Face :: class . java )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! face Node Map . containsKey ( f )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Node Ġ= ĠAug ment ed Face Node ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Node . setParent ( scene ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Node . face Regions Render able Ġ= Ġface Regions Render able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Node Map . put ( f , Ġface Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( change Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Node Map . getValue ( f ). face Regions Render able Ġ= Ġface Regions Render able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Model Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġany ĠAug ment ed Face Nodes Ġassociated Ġwith Ġan ĠAug ment ed Face Ġthat Ġstopped Ġtracking . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiter Ġ= Ġface Node Map . entries . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iter . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġiter . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Ġ= Ġentry . key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( face . tracking State Ġ== ĠTracking State . STOP PED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Node Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Node . setParent ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiter . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġbutton _ snap . setOnClickListener ( object Ġ: ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( view : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview 1 Ġ= Ġ Ġar Fragment . ar Scene View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Bitmap ( view 1 . width , Ġview 1 . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Thread Ġ= Ġ ĠHandler Thread (" Pixel Cop ier "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread . start (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPixel Copy . request ( view 1 , Ġbitmap ,{ copy Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copy Result Ġ== ĠPixel Copy . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Write Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Screenshot ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime Permission Util . request Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Gl asses Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Write Permission , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtoast Ġ= ĠToast . makeText ( this @ Gl asses Activity , Ġe . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ}, ĠHandler ( handler Thread . get Looper ())); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Is Supported Device Or Finish () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Ar Core A pk . getInstance (). check Availability ( this ) Ġ== ĠAr Core A pk . Availability . UNSUPPORTED _ DEVICE _ NOT _ CAP ABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Aug ment ed ĠF aces Ġrequires ĠAR Core ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġopen Gl Version String Ġ= Ġ Ġ( getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ? ĠActivity Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . device Configuration Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . gl Es Version ĊĊĠĠĠĠĠĠĠ Ġopen Gl Version String ?. let Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java . lang . Double . parseDouble ( open Gl Version String ) Ġ< ĠMIN _ OPEN GL _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Scene form Ġrequires ĠOpenGL ĠES Ġ 3 . 0 Ġor Ġlater ", ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Screenshot ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġscreenshot ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠScreen Shot t . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. save Screenshot To P ictures Folder ( this @ Gl asses Activity , Ġbitmap , Ġ" my _ screenshot ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġa Ġtoast ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Gl asses Activity , Ġ" Bitmap ĠSaved Ġat Ġ" Ġ+ Ġfile . absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} Ċ }