fun annotateImage()

in product-search/codelab2/android/final/app/src/main/java/com/google/codelabs/productimagesearch/api/ProductSearchAPIClient.kt [76:143]


    fun annotateImage(image: Bitmap): Task<List<ProductSearchResult>> {
        // Initialization to use the Task API
        val apiSource = TaskCompletionSource<List<ProductSearchResult>>()
        val apiTask = apiSource.task

        // Convert the query image to its Base64 representation to call the Product Search API.
        val base64: String = convertBitmapToBase64(image)

        // Craft the request body JSON.
        val requestJson = """
            {
              "requests": [
                {
                  "image": {
                    "content": """".trimIndent() + base64 + """"
                  },
                  "features": [
                    {
                      "type": "PRODUCT_SEARCH",
                      "maxResults": $VISION_API_PRODUCT_MAX_RESULT
                    }
                  ],
                  "imageContext": {
                    "productSearchParams": {
                      "productSet": "projects/${VISION_API_PROJECT_ID}/locations/${VISION_API_LOCATION_ID}/productSets/${VISION_API_PRODUCT_SET_ID}",
                      "productCategories": [
                           "apparel-v2"
                         ]
                    }
                  }
                }
              ]
            }
        """.trimIndent()

        // Add a new request to the queue
        requestQueue.add(object :
            JsonObjectRequest(
                Method.POST,
                "$VISION_API_URL/images:annotate?key=$VISION_API_KEY",
                JSONObject(requestJson),
                { response ->
                    // Parse the API JSON response to a list of ProductSearchResult object.
                    val productList = apiResponseToObject(response)

                    // Loop through the product list and create tasks to load reference images.
                    // We will call the projects.locations.products.referenceImages.get endpoint
                    // for each product.
                    val fetchReferenceImageTasks = productList.map { fetchReferenceImage(it) }

                    // When all reference image fetches have completed,
                    // return the ProductSearchResult list
                    Tasks.whenAllComplete(fetchReferenceImageTasks)
                        // Return the list of ProductSearchResult with product images' HTTP URLs.
                        .addOnSuccessListener { apiSource.setResult(productList) }
                        // An error occurred so returns it to the caller.
                        .addOnFailureListener { apiSource.setException(it) }
                },
                // Return the error
                { error -> apiSource.setException(error) }
            ) {
            override fun getBodyContentType() = "application/json"
        }.apply {
            setShouldCache(false)
        })

        return apiTask
    }