package Ġcom . example . picture composer Ċ Ċ import Ġandroid . animation . Animator Inflater Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content .* Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Image Decoder Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . children Ċ import Ġcom . example . picture composer . Camera Activity . Companion . captured Image Ċ import Ġcom . example . picture composer . model . PC Subject Detected Ċ import Ġcom . example . picture composer . util . Image Utility Ċ import Ġcom . example . picture composer . util . Proc Img Ċ import Ġcom . example . picture composer . util . Subject BoundingBox View Ċ import Ġcom . example . picture composer . util . Subject Dot View Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . database . Firebase Database Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġcom . google . firebase . storage . k tx . storage Ċ import Ġcom . google . ml kit . vision . common . Input Image Ċ import Ġcom . google . ml kit . vision . face . Face Detection Ċ import Ġcom . google . ml kit . vision . face . Face Detector Options Ċ import Ġcom . google . ml kit . vision . label . Image Label ing Ċ import Ġcom . google . ml kit . vision . label . defaults . Image Label er Options Ċ import Ġcom . photo composer . subject detection . model . Subject Detected Ċ import Ġcom . photo composer . subject detection . subject detector . Subject Detector Local izer API Ċ import Ġorg . opencv . android . OpenCV Loader Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġkotlin . system . exit Process Ċ Ċ @ Suppress (" NULL ABILITY _ MIS MATCH _ BASE D _ ON _ JAVA _ AN NOT ATIONS ", Ġ" DE PREC ATION ") Ċ class ĠResults Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠResults Activity :: class . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUI ĠComponents ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcategory TextView : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Gr ades Button : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreveal Subject s Button : ĠToggle Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġback Button : ĠFloating ActionButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhelp Button : ĠFloating ActionButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinput ImageView : ĠImageView ĊĠĠĠ Ġprivate Ġvar Ġcapture Mode : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġupload Mode : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstorage : ĠFirebase Storage ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfirebase Database : ĠFirebase Database ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsubject Overlay View Container : ĠViewGroup ĊĠĠĠ Ġprivate Ġvar Ġdot View Size : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġpick Photo Code Ġ= Ġ 1 0 4 6 ĊĊĠĠĠ Ġprivate Ġvar Ġselected Subject Label Ġ= Ġ" Unknown " ĊĠĠĠ Ġprivate Ġvar Ġselected Subject BoundingBox : ĠRect F Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġvar Ġselected Subject Confidence Score : ĠFloat Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġprivate Ġval Ġsubject Detector Ġby Ġlazy Ġ{ ĠSubject Detector Local izer API . create Default ( assets ) Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠĠĠ Ġ// ĠGrad ing ĊĠĠĠ Ġprivate Ġvar Ġcalc Th ir ds Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcalc F ram ing Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcalc Exposure Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcalc Level Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcalc Blur Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcalc Final Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ results ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠUI Ġcomponents ĊĠĠĠĠĠĠĠ Ġview Gr ades Button Ġ= ĠfindViewById ( R . id . view _ grade s _ button ) ĊĠĠĠĠĠĠĠ Ġback Button Ġ= ĠfindViewById ( R . id . back _ button ) ĊĠĠĠĠĠĠĠ Ġinput ImageView Ġ= ĠfindViewById ( R . id . input _ image _ view ) ĊĠĠĠĠĠĠĠ Ġcategory TextView Ġ= ĠfindViewById ( R . id . category _ text _ view ) ĊĠĠĠĠĠĠĠ Ġreveal Subject s Button Ġ= ĠfindViewById ( R . id . reveal _ subjects _ button ) ĊĠĠĠĠĠĠĠ Ġhelp Button Ġ= ĠfindViewById ( R . id . help _ button ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġsubject Ġdetection ĠUI Ġcomponents ĊĠĠĠĠĠĠĠ Ġsubject Overlay View Container Ġ= ĠfindViewById ( R . id . subject _ overlay _ view _ container ) ĊĠĠĠĠĠĠĠ Ġdot View Size Ġ= Ġresources . get Dimension Pixel Offset ( R . dim en . subject _ image _ dot _ size ) ĊĊĠĠĠĠĠĠĠ Ġfirebase Database Ġ= ĠFirebase Database . getInstance () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġthe Ġsource Ġactivity ĊĠĠĠĠĠĠĠ Ġcapture Mode Ġ= Ġintent . getBoolean Extra (" CAPTURE _ MODE ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġupload Mode Ġ= Ġintent . getBoolean Extra (" UPLOAD _ MODE ", Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġappropriate Ġintent s Ġfor Ġcorresponding Ġmode ĊĠĠĠĠĠĠĠ Ġif Ġ( capture Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this . application Context , ĠCamera Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( upload Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this . application Context , ĠNavigation Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" CAPTURE _ MODE ", Ġfalse ). putExtra (" UPLOAD _ MODE ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// get Ġshared Ġpreferences ĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= Ġget SharedPreferences (" photo - composer ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġ// ĠCheck ĠOpenCV Ġsetup ĊĠĠĠĠĠĠĠ Ġif Ġ(! OpenCV Loader . init Debug ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" OpenCV Loader . init Debug (), Ġnot Ġworking .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" OpenCV Loader . init Debug (), Ġworking .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Subject Detection () ĊĠĠĠĠĠĠĠ Ġview Gr ades Button Initialize Listener () ĊĠĠĠĠĠĠĠ Ġhelp Button Initialize Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull Ġ&& Ġrequest Code Ġ== Ġpick Photo Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġphoto ĠUri Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Uri Ġ= Ġdata . data ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Uri Ġto Ġbitmap Ġconversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselected Image : ĠBitmap ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġversion Ġof ĠAndroid Ġon Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Image Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 9 ) Ġ{ Ġ// changed Ġfrom Ġ 2 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġnewer Ġversions Ġof ĠAndroid , Ġuse Ġthe Ġnew Ġdecode Bitmap Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠImage Decoder . create Source ( this . content Resolver , Ġphoto Uri !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Decoder . decode Bitmap ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsupport Ġolder Ġversions Ġof ĠAndroid Ġby Ġusing Ġget Bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . get Bitmap ( this . content Resolver , Ġphoto Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// store Ġthis Ġphoto Ġin Ġglobal Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image Ġ= Ġselected Image ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// head Ġto Ġresults Ġactivity Ġto Ġdisplay Ġselected Ġphoto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResults Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). putExtra (" CAPTURE _ MODE ", Ġfalse ). putExtra (" UPLOAD _ MODE ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( capture Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this . application Context , ĠCamera Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( upload Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this . application Context , ĠNavigation Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhelp Button Initialize Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġhelp Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelp Dialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Dialog . setMessage (" Re veal ĠSubject s ĠButton Ġreve als Ġthe Ġselect able Ġsubjects Ġin Ġthe Ġimage .\ n \ n ĠT ap Ġon Ġthe Ġdot Ġin Ġthe Ġimage Ġto Ġselect Ġyour Ġsubject .\ n \ n ĠT ap Ġand Ġhold Ġon Ġthe Ġdot Ġto Ġreveal Ġrelated Ġlabels .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Ok " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog Interface , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Dialog . create (). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConf ir ms Ġthe Ġimage Ġfor Ġupload , Ġand Ġsends Ġmetadata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġview Gr ades Button Initialize Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Gr ades Button . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġimg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Th ir ds Ġ= ĠProc Img (). th ir ds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc F ram ing Ġ= ĠProc Img (). fr aming ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Exposure Ġ= ĠProc Img (). ex posure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Blur Ġ= ĠProc Img (). blur () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Level Ġ= ĠProc Img (). level () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Final Ġ= ĠProc Img (). final ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Th ir ds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc F ram ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Exposure , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Blur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġ" Up loading Ġimage ...", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= ĠFirebase . storage ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġstorage Ġreference Ġfrom Ġour Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Ref Ġ= Ġstorage . reference ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġreference Ġto Ġimage Ġfile Ġin Ġa Ġdirectory Ġnamed Ġas Ġthe ĠUID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent UserID Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ref Ġ= Ġstorage Ref . child ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ current UserID /${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Utility . getImage Uri From Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). last Path Segment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġtask Ġto Ġupload Ġimage ĠUri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ref . put File ( Image Utility . getImage Uri From Bitmap ( application Context , Ġcaptured Image !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġphoto Ġsuccessfully Ġuploads Ġto Ġcloud Ġstorage Ġand Ġa Ġdownload Url Ġwas Ġgenerated Ġfor Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Task . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ref . download Url . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToast Ġfor Ġthe Ġsuccessful Ġupload Ġand ĠURL Ġretrieval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Photo Ġuploaded Ġsuccessfully !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġwhere Ġto Ġput Ġthe Ġphoto Ġin Ġthe Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr UserID Ġ= ĠFirebase Auth . getInstance (). currentUser !!. uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Photo Key Ref Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database . getReference (" UID /$ curr UserID / curr Photo Key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Reference Ġ= Ġfirebase Database . getReference (" UID /$ curr UserID / email ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto List Reference Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database . getReference (" UID /$ curr UserID / photo List ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġphoto Ġobject Ġwith Ġall Ġof Ġthe Ġphoto Ġattributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Photo Ġ= ĠPhoto ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox . bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Th ir ds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc F ram ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Exposure , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Blur , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Final , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" temp Key " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġis Ġthe Ġuser 's Ġfirst Ġphoto , Ġinitialize Ġtheir Ġemail Ġin Ġthe Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Reference . setValue ( Firebase Auth . getInstance (). currentUser !!. email !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPush Ġthe Ġnew Ġphoto Ġwith Ġall Ġof Ġits Ġmetadata Ġto Ġthe Ġappropriate Ġspot Ġin Ġthe Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġphoto List Reference . push (). key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database . getReference (" UID /$ curr UserID / photo List /$ key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( new Photo ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġcurr Photo Key Ġpoint Ġto Ġthis Ġphoto Ġso Ġwe Ġknow Ġit 's Ġthe Ġone Ġto Ġdisplay Ġon Ġgrad ing Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Database . getReference (" UID /$ curr UserID / photo List /$ key / key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Photo Key Ref . setValue ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// head Ġto Ġthe Ġgrad ing Ġscreen Ġnow Ġand Ġpass Ġalong Ġthe Ġsubject Ġword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( application Context , ĠGr ade Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġthe Ġimage Ġfailed Ġto Ġupload Ġwe Ġwant Ġto Ġenable Ġthe Ġbutton Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġupload Ġimage Ġplease Ġtry Ġagain .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġcategory TextView . add TextChanged Listener ( object : ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( p 0 : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category TextView . text . toString () Ġ!= Ġ""){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Gr ades Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category TextView . text . toString () Ġ== Ġ""){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Gr ades Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category TextView . text . toString () Ġ!= Ġ""){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Gr ades Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġsubject Ġdetection Ġon Ġthe Ġprovided Ġimage Ġfrom ĠCamera Activity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrun Subject Detection () Ġ{ ĊĠĠĠĠĠĠĠ Ġcaptured Image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequired Ġformat Ġfor Ġimages Ġis ĠAR GB _ 8 8 8 8 , Ġotherwise Ġwill Ġthrow ĠConfig # Hardware Ġget Pixels Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput ImageView . setImage Bitmap ( image ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetected Subject s List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . let Ġ{ Ġinput Image Ġ-> Ġsubject Detector . detect Subject s ( input Image ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetected Subject s List . max By Ġ{ Ġdetected Subject Ġ-> Ġ( detected Subject . subject BoundingBox . width () Ġ* Ġdetected Subject . subject BoundingBox . height ()) Ġ} ?. subject BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠRect F () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConvert Ġto ĠML KIT ĠInput Image ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Image Ġ= ĠInput Image . from Bitmap ( image , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor ĠimageView Ġto Ġinitialize Ġparameters Ġbefore Ġrunning . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġwidth Ġand Ġheight Ġwill Ġreturn Ġ 0 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput ImageView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detected Subject s List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detected Subject s List . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreveal Subject s Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Subject s Detected ( detected Subject s List , Ġinput Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġsubjects Ġdetected ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreveal Subject s Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Gr ades Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreveal Subject s Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Category TextView () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRedirect Ġusers Ġback Ġto Ġupload / capture ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . setMessage (" No Ġsubject Ġdetected , Ġtry Ġuploading Ġor Ġcapturing Ġagain .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Ok " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog Interface , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġuser Ġto Ġeither Ġcapture Ġor Ġupload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Mode Ġ= Ġintent . getBoolean Extra (" CAPTURE _ MODE ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Mode Ġ= Ġintent . getBoolean Extra (" UPLOAD _ MODE ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( capture Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( upload Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" CAPTURE _ MODE ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" UPLOAD _ MODE ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Image ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . create (). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Commit Pref Ed its ") ĊĠĠĠ Ġprivate Ġfun Ġon Subject s Detected ( ĊĠĠĠĠĠĠĠ Ġsubjects Detected List : ĠList < Subject Detected >, ĊĠĠĠĠĠĠĠ Ġinput Image : ĠInput Image ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject Overlay View Container . removeAll Views () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSelect Ġthe Ġmost Ġprom inent Ġsubject Ġas Ġthe Ġmain Ġsubject ĊĠĠĠĠĠĠĠ Ġval Ġmost Prom inent Subject Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubjects Detected List . max By Ġ{ Ġsubject Ġ-> Ġ( subject . subject BoundingBox . width () Ġ* Ġsubject . subject BoundingBox . height ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠT ap - able Ġdot Ġview Ġfor Ġevery Ġsubject Ġon Ġthe Ġpicture . ĊĠĠĠĠĠĠĠ Ġfor Ġ( subject Detected Ġin Ġsubjects Detected List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpc Subject Detected Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPC Subject Detected ( subject Detected , Ġsubject Detected . subject BoundingBox , Ġinput Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Dot View Ġ= Ġcreate Subject Dot View ( pc Subject Detected , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subject Detected Ġ== Ġmost Prom inent Subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox View Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubject BoundingBox View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . box In View BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox View . tag Ġ= Ġ" Selected ĠBounding ĠBox " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . addView ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox Ġ= Ġsubject Detected . subject BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Label er ( pc Subject Detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Box View ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . tag Ġ= Ġ" Selected ĠSubject " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Label er ( pc Subject Detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġsubject Overlay View Container . children ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġpreviously Ġselected Ġbox View Ġand Ġupdate Ġthis Ġas Ġthe Ġnew Ġbounding Ġbox Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . tag Ġ== Ġ" Selected ĠBounding ĠBox ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . remove View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox View Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubject BoundingBox View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . box In View BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox View . tag Ġ= Ġ" Selected ĠBounding ĠBox " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . addView ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Box View ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . tag Ġ== Ġ" Selected ĠSubject ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . tag Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . tag Ġ= Ġ" Selected ĠSubject " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Dot View ( subject Dot View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Label er Long Click ( pc Subject Detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġsubject Overlay View Container . children ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġpreviously Ġselected Ġbox View Ġand Ġupdate Ġthis Ġas Ġthe Ġnew Ġbounding Ġbox Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . tag Ġ== Ġ" Selected ĠBounding ĠBox ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . remove View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox View Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubject BoundingBox View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . box In View BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox View . tag Ġ= Ġ" Selected ĠBounding ĠBox " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . addView ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Box View ( box View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . tag Ġ== Ġ" Selected ĠSubject ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . tag Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Dot View . tag Ġ= Ġ" Selected ĠSubject " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Dot View ( subject Dot View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Long ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Overlay View Container . addView ( subject Dot View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreveal Subject s Button . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSubject s Ġreve aled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġsubject Overlay View Container . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . visibility Ġ== ĠView . IN VISIBLE Ġ&& Ġview . tag Ġ!= Ġ" Selected ĠSubject " Ġ&& Ġview . tag Ġ!= Ġ" Selected ĠBounding ĠBox ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shared Preferences . getBoolean (" DISPLAY DIALOG ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremember Label Ġ= ĠarrayOf (" Don 't Ġshow Ġagain .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġremember Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . setMessage (" Tap Ġon Ġthe Ġdot Ġin Ġthe Ġimage Ġto Ġselect Ġyour Ġsubject .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Label , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_: ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremember Ġ= Ġ! remember ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Ok " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog Interface , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remember ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences . edit (). put Boolean (" DISPLAY DIALOG ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . create (). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSubject s Ġhidden ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( view Ġin Ġsubject Overlay View Container . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . visibility Ġ== ĠView . VISIBLE Ġ&& Ġview . tag Ġ!= Ġ" Selected ĠSubject " Ġ&& Ġview . tag Ġ!= Ġ" Selected ĠBounding ĠBox ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Dot View ( target View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn imator Inflater . load Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim ator . subject _ dot _ enter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠAn imator Set ĊĠĠĠĠĠĠĠ Ġanim ator Set . setTarget ( target View ) ĊĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Box View ( target View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn imator Inflater . load Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim ator . subject _ bounding _ box _ enter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠAn imator Set ĊĠĠĠĠĠĠĠ Ġanim ator Set . setTarget ( target View ) ĊĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Label er Long Click ( pc Subject Detected : ĠPC Subject Detected ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc ropped Input Image Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Image . from Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpc Subject Detected . image Data ?. let Ġ{ Ġit 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Utility . byteArray To Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġhigh Accuracy Opts Ġ= ĠFace Detector Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Performance Mode ( Face Detector Options . PER FORMANCE _ MODE _ FAST ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Land mark Mode ( Face Detector Options . LAND MARK _ MODE _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġface Detector Ġ= ĠFace Detection . getClient ( high Accuracy Opts ) ĊĊĠĠĠĠĠĠĠ Ġval Ġarray Adapter Ġ= ĠArray Adapter < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . layout . select _ dialog _ single choice ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġface Detector . process ( c ropped Input Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġfaces Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( faces . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label Ġ= Ġ" Por trait " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . text Ġ= Ġselected Subject Label . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Adapter . insert ( selected Subject Label , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Label ing . getClient ( Image Label er Options . DEFAULT _ OPTIONS ) ĊĊĠĠĠĠĠĠĠ Ġlabel er . process ( c ropped Input Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġsubject Label List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subject Label List . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsubject Label List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Adapter . add ( subject Label List [ i ]. text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageView Ġ= ĠImageView ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . max Height Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( c ropped Input Image . bitmap Internal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Choose ĠSubject ĠLabel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAdapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject BoundingBox Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpc Subject Detected . subject BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Adapter . getItem ( which ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toUpperCase ( Locale . ROOT ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Adapter . getItem ( which ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Category TextView () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. set Negative Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cancel " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog , Ġ_ Ġ-> Ġdialog ?. dismiss () Ġ}. show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġidentify Ġsubject , Ġtry Ġagain .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Label er ( pc Subject Detected : ĠPC Subject Detected ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Subject BoundingBox Ġ= Ġpc Subject Detected . subject BoundingBox ĊĠĠĠĠĠĠĠ Ġval Ġc ropped Input Image Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Image . from Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpc Subject Detected . image Data ?. let Ġ{ Ġit 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Utility . byteArray To Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġhigh Accuracy Opts Ġ= ĠFace Detector Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Performance Mode ( Face Detector Options . PER FORMANCE _ MODE _ FAST ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġface Detector Ġ= ĠFace Detection . getClient ( high Accuracy Opts ) ĊĊĠĠĠĠĠĠĠ Ġface Detector . process ( c ropped Input Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġfaces Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( faces . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label Ġ= Ġ" Por trait " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . text Ġ= Ġselected Subject Label . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Category TextView () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel er Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Label ing . getClient ( Image Label er Options . DEFAULT _ OPTIONS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel er . process ( c ropped Input Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġsubject Label List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subject Label List . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Label Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Label List . max By Ġ{ Ġsubject Detected Ġ-> Ġsubject Detected . confidence Ġ} !!. text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Subject Confidence Score Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Label List . max By Ġ{ Ġsubject Detected Ġ-> Ġsubject Detected . confidence Ġ} !!. confidence ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Category TextView () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġidentify Ġsubject , Ġtry Ġagain .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġidentify Ġsubject , Ġtry Ġagain .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Category TextView () Ġ{ ĊĠĠĠĠĠĠĠ Ġcategory TextView . text Ġ= Ġselected Subject Label . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠ Ġcategory TextView . invalidate () ĊĠĠĠĠĠĠĠ Ġcategory TextView . force Layout () ĊĠĠĠĠĠĠĠ Ġ// Ġcategory TextView . request Layout () Ġ// Ġthis Ġrequires Ġthe Ġwhole Ġscreen Ġto Ġbe Ġredraw n Ġcausing Ġslow Ġreload ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAn imator Inflater . load Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim ator . subject _ bounding _ box _ enter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠAn imator Set ĊĠĠĠĠĠĠĠ Ġanim ator Set . setTarget ( category TextView ) ĊĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġval Ġintent Filter Selected Subject Label Update Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter (" SELECTED _ SUBJECT _ LABEL _ UPDATE ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . text Ġ= Ġselected Subject Label . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory TextView . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . register Receiver ( intent Receiver , Ġintent Filter Selected Subject Label Update ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġdot Ġview Ġfor Ġevery Ġsubject Ġin Ġthe Ġpicture . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Subject Dot View ( ĊĠĠĠĠĠĠĠ Ġsubject : ĠPC Subject Detected , ĊĠĠĠĠĠĠĠ Ġselected : ĠBoolean ĊĠĠĠ Ġ): ĠSubject Dot View Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Coordinate Scale : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Gap : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġvertical Gap : ĠFloat ĊĠĠĠĠĠĠĠ Ġval Ġinput ImageView Ġ= Ġinput ImageView ĊĠĠĠĠĠĠĠ Ġval Ġinput Bitmap Ġ= Ġcaptured Image Ġ?: Ġthrow ĠNullPointerException () ĊĠĠĠĠĠĠĠ Ġval Ġinput ImageView Ratio Ġ= Ġinput ImageView . width . toFloat () Ġ/ Ġinput ImageView . height ĊĠĠĠĠĠĠĠ Ġval Ġinput Bitmap Ratio Ġ= Ġinput Bitmap . width . toFloat () Ġ/ Ġinput Bitmap . height ĊĊĠĠĠĠĠĠĠ Ġif Ġ( input Bitmap Ratio Ġ<= Ġinput ImageView Ratio ) Ġ{ Ġ// ĠImage Ġcontent Ġfill s Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Coordinate Scale Ġ= Ġinput ImageView . height . toFloat () Ġ/ Ġinput Bitmap . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Gap Ġ= Ġ( input ImageView . width Ġ- Ġinput Bitmap . width Ġ* Ġview Coordinate Scale ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Gap Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠImage Ġcontent Ġfill s Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Coordinate Scale Ġ= Ġinput ImageView . width . toFloat () Ġ/ Ġinput Bitmap . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Gap Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Gap Ġ= Ġ( input ImageView . height Ġ- Ġinput Bitmap . height Ġ* Ġview Coordinate Scale ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġsubject BoundingBox Ġ= Ġsubject . subject BoundingBox ĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġcorresponding Ġcoordinate . ĊĠĠĠĠĠĠĠ Ġval Ġbox In View Coordinate Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject BoundingBox . left Ġ* Ġview Coordinate Scale Ġ+ Ġhorizontal Gap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject BoundingBox . top Ġ* Ġview Coordinate Scale Ġ+ Ġvertical Gap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject BoundingBox . right Ġ* Ġview Coordinate Scale Ġ+ Ġhorizontal Gap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject BoundingBox . bottom Ġ* Ġview Coordinate Scale Ġ+ Ġvertical Gap ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdot View Ġ= ĠSubject Dot View ( this , Ġselected , Ġbox In View Coordinate ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠFrame Layout . LayoutParams ( dot View Size , Ġdot View Size ) ĊĠĠĠĠĠĠĠ Ġval Ġdot Center Ġ= ĠPoint F ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( box In View Coordinate . right Ġ+ Ġbox In View Coordinate . left ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( box In View Coordinate . bottom Ġ+ Ġbox In View Coordinate . top ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlayout Params . set Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( dot Center . x Ġ- Ġdot View Size Ġ/ Ġ 2 f ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( dot Center . y Ġ- Ġdot View Size Ġ/ Ġ 2 f ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdot View . layout Params Ġ= Ġlayout Params ĊĠĠĠĠĠĠĠ Ġreturn Ġdot View ĊĠĠĠ Ġ} Ċ }