/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . ml kit . md . product search Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . android . vol ley . Request Queue Ċ import Ġcom . android . vol ley . toolbox . Vol ley Ċ import Ġcom . google . android . gms . tasks . Tasks Ċ import Ġcom . google . api . client . extensions . android . http . Android Http Ċ import Ġcom . google . api . client . json . gson . Gson Factory Ċ import Ġcom . google . api . services . vision . v 1 . Vision Ċ import Ġcom . google . api . services . vision . v 1 . Vision Request Initializer Ċ import Ġcom . google . api . services . vision . v 1 . model .* Ċ import Ġcom . google . cloud . vision . v 1 . Product SetName Ċ import Ġcom . google . ml kit . md . Build Config Ċ import Ġcom . google . ml kit . md . object detection . Detected Object Info Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . collections . ArrayList ĊĊ Ċ /** ĠA Ġfake Ġsearch Ġengine Ġto Ġhelp Ġsimulate Ġthe Ġcomplete Ġwork Ġflow . Ġ Ġ*/ Ċ class ĠSearch Engine ( context : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsearch Request Queue : ĠRequest Queue Ġ= ĠVol ley . new Request Queue ( context ) ĊĠĠĠ Ġprivate Ġval Ġrequest Creation Executor : ĠExecutor Service Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġdetected Object : ĠDet ected Object Info , ĊĠĠĠĠĠĠĠ Ġlistener : Ġ( detected Object : ĠDet ected Object Info , Ġproduct List : ĠList < Product >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠC rops Ġthe Ġobject Ġimage Ġout Ġof Ġthe Ġfull Ġimage Ġis Ġexpensive , Ġso Ġdo Ġit Ġoff Ġthe ĠUI Ġthread . ĊĠĠĠĠĠĠĠ ĠTasks . call < Batch Annot ate Images Response >( request Creation Executor , ĠCallable Ġ{ Ġcreate Request ( detected Object ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct List Ġ= ĠArrayList < Product >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsimilar Products : ĠList < Result > Ġ= Ġresponse . responses [ 0 ]. product SearchResults . results ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( similar Product Ġin Ġsimilar Products ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġsimilar Product . score . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġsimilar Product . product . displayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct List . add ( Product ( similar Product . image , Ġtitle , Ġscore )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( ex : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġget Ġproduct SearchResults ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct (/* ĠimageUrl = Ġ*/ "", Ġ" Product Ġtitle Ġ$ i ", Ġ" Product Ġsubtitle Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( detected Object , Ġproduct List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġcreate Ġproduct Ġsearch Ġrequest !", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġbelow Ġdummy Ġcode Ġafter Ġyour Ġown Ġproduct Ġsearch Ġbacked Ġhook ed Ġup . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct List Ġ= ĠArrayList < Product >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct (/* ĠimageUrl = Ġ*/ "", Ġ" Product Ġtitle Ġ$ i ", Ġ" Product Ġsubtitle Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . invoke ( detected Object , Ġproduct List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Request Queue . cancel All ( TAG ) ĊĠĠĠĠĠĠĠ Ġrequest Creation Executor . shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Search Engine " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCLO UD _ V ISION _ API _ KEY Ġ= ĠBuild Config . GOOGLE _ CLOUD _ API _ KEY ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGOOGLE _ CLOUD _ PROJECT Ġ= ĠBuild Config . GOOGLE _ CLOUD _ PROJECT ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGOOGLE _ CLOUD _ REGION Ġ= ĠBuild Config . GOOGLE _ CLOUD _ REGION ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGOOGLE _ CLOUD _ V ISION _ PRODUCT _ SET Ġ= ĠBuild Config . GOOGLE _ CLOUD _ V ISION _ PRODUCT _ SET ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGOOGLE _ CLOUD _ V ISION _ PRODUCT _ CATEGORY Ġ= ĠBuild Config . GOOGLE _ CLOUD _ V ISION _ PRODUCT _ CATEGORY ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Request ( search ing Object : ĠDet ected Object Info ): ĠBatch Annot ate Images Response Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠVision . Builder ( Android Http . new Compatible Transport (), ĠGson Factory . getDefaultInstance (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Vision Request Initializer ( Vision Request Initializer ( CLOUD _ V ISION _ API _ KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvision : ĠVision Ġ= Ġbuilder . build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbatch Annot ate Images Request Ġ= ĠBatch Annot ate Images Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Annot ate Images Request . requests Ġ= Ġobject Ġ: Ġjava . util . ArrayList < Annot ate Image Request ?> () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotate Image Request Ġ= ĠAnnot ate Image Request () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase 6 4 Encoded Image Ġ= ĠImage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject ImageData Ġ= Ġsearching Object . image Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Failed Ġto Ġget Ġobject Ġimage Ġdata !") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBase 6 4 Ġencode Ġthe ĠJPEG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Encoded Image . encode Content ( object ImageData ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotate Image Request . image Ġ= Ġbase 6 4 Encoded Image ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġfeatures Ġwe Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotate Image Request . features Ġ= Ġobject Ġ: Ġjava . util . ArrayList < Feature >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Search Ġ= ĠFeature () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Search . type Ġ= Ġ" PRODUCT _ SEARCH " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Search . max Results Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( product Search ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġimage Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Set Path Ġ= ĠProduct SetName . format ( GOOGLE _ CLOUD _ PROJECT , ĠGOOGLE _ CLOUD _ REGION , ĠGOOGLE _ CLOUD _ V ISION _ PRODUCT _ SET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Context Ġ= ĠImage Context () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Search Params Ġ= ĠProduct Search Params () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Search Params . product Set Ġ= Ġproduct Set Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Search Categories Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Search Categories . add ( GOOGLE _ CLOUD _ V ISION _ PRODUCT _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Search Params . product Categories Ġ= Ġproduct Search Categories ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Context . product Search Params Ġ= Ġproduct Search Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotate Image Request . image Context Ġ= Ġimage Context ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġlist Ġof Ġone Ġthing Ġto Ġthe Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( annotate Image Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotate Request Ġ= Ġvision . images (). annotate ( batch Annot ate Images Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDue Ġto Ġa Ġbug : Ġrequests Ġto ĠVision ĠAPI Ġcontaining Ġlarge Ġimages Ġfail Ġwhen ĠG Z ipped . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDue Ġto Ġa Ġbug : Ġrequests Ġto ĠVision ĠAPI Ġcontaining Ġlarge Ġimages Ġfail Ġwhen ĠG Z ipped . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotate Request . disable G Zip Content Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" created ĠCloud ĠVision Ġrequest Ġobject , Ġsending Ġrequest ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġannotate Request . execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ