content: /*
   * Copyright 2016, The Android Open Source Project
   *
   * 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
   *
   *      http://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.example.androidthings.doorbell;
  
  import android.util.Log;
  
  import com.google.api.client.extensions.android.http.AndroidHttp;
  import com.google.api.client.http.HttpTransport;
  import com.google.api.client.json.JsonFactory;
  import com.google.api.client.json.gson.GsonFactory;
  import com.google.api.services.vision.v1.Vision;
  import com.google.api.services.vision.v1.VisionRequestInitializer;
  import com.google.api.services.vision.v1.model.AnnotateImageRequest;
  import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest;
  import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse;
  import com.google.api.services.vision.v1.model.EntityAnnotation;
  import com.google.api.services.vision.v1.model.Feature;
  import com.google.api.services.vision.v1.model.Image;
  
  import java.io.IOException;
  import java.util.Collections;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  public class CloudVisionUtils {
      public static final String TAG = CloudVisionUtils.class.getSimpleName();
  
      private static final String CLOUD_VISION_API_KEY = "<ENTER VISION API KEY>";
  
      private static final String LABEL_DETECTION = "LABEL_DETECTION";
  
      private static final int MAX_LABEL_RESULTS = 10;
  
      /**
       * Construct an annotated image request for the provided image to be executed
       * using the provided API interface.
       *
       * @param imageBytes image bytes in JPEG format.
       * @return collection of annotation descriptions and scores.
       */
      public static Map<String, Float> annotateImage(byte[] imageBytes) throws IOException {
          // Construct the Vision API instance
          HttpTransport httpTransport = AndroidHttp.newCompatibleTransport();
          JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
          VisionRequestInitializer initializer = new VisionRequestInitializer(CLOUD_VISION_API_KEY);
          Vision vision = new Vision.Builder(httpTransport, jsonFactory, null)
                  .setVisionRequestInitializer(initializer)
                  .build();
  
          // Create the image request
          AnnotateImageRequest imageRequest = new AnnotateImageRequest();
          Image img = new Image();
          img.encodeContent(imageBytes);
          imageRequest.setImage(img);
  
          // Add the features we want
          Feature labelDetection = new Feature();
          labelDetection.setType(LABEL_DETECTION);
          labelDetection.setMaxResults(MAX_LABEL_RESULTS);
          imageRequest.setFeatures(Collections.singletonList(labelDetection));
  
          // Batch and execute the request
          BatchAnnotateImagesRequest requestBatch = new BatchAnnotateImagesRequest();
          requestBatch.setRequests(Collections.singletonList(imageRequest));
          BatchAnnotateImagesResponse response = vision.images()
                  .annotate(requestBatch)
                  // Due to a bug: requests to Vision API containing large images fail when GZipped.
                  .setDisableGZipContent(true)
                  .execute();
  
          return convertResponseToMap(response);
      }
  
      /**
       * Process an encoded image and return a collection of vision
       * annotations describing features of the image data.
       *
       * @return collection of annotation descriptions and scores.
       */
      private static Map<String, Float> convertResponseToMap(BatchAnnotateImagesResponse response) {
  
          // Convert response into a readable collection of annotations
          Map<String, Float> annotations = new HashMap<>();
          List<EntityAnnotation> labels = response.getResponses().get(0).getLabelAnnotations();
          if (labels != null) {
              for (EntityAnnotation label : labels) {
                  annotations.put(label.getDescription(), label.getScore());
              }
          }
  
          Log.d(TAG, "Cloud Vision request completed:" + annotations);
          return annotations;
      }
  }
  