content: /*
   * Copyright 2014 Sony Corporation
   */
  
  package com.almalence.sony.cameraremote.utils;
  
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Set;
  
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import android.util.Log;
  
  import com.almalence.sony.cameraremote.SimpleRemoteApi;
  
  public final class SimpleRemoteApiHelper {
  
      private static final String TAG = SimpleRemoteApiHelper.class.getSimpleName();
  
      private SimpleRemoteApiHelper() {
  
      }
  
      /**
       * Prepare request params and calls SimpleRemoteApi method to get date list
       * of storage contents. Request JSON data is such like as below.
       * 
       * <pre>
       * {
       *   "method": "getContentList",
       *   "params": [{
       *      "sort" : "ascending"
       *      "view": "date"
       *      "uri": "storage:memoryCard1"
       *      }],
       *   "id": 2,
       *   "version": "1.3"
       * }
       * </pre>
       * 
       * @param object of SimpleRemoteAPi
       * @return JSON data of response
       * @throws IOException all errors and exception are wrapped by this
       *             Exception.
       */
      public static JSONObject getContentDateList(SimpleRemoteApi simpleRemoteApi) throws IOException {
  
          try {
              List<String> uri = getSupportedStorages(simpleRemoteApi);
  
              if (uri == null) {
                  Log.w(TAG, "supported Uri is null");
                  throw new IOException();
              }
  
              JSONObject replyJson = null;
              JSONObject paramObj = new JSONObject().put("sort", "ascending").put("view", "date")
                      .put("uri", uri.get(0));
              JSONArray params = new JSONArray().put(0, paramObj);
  
              replyJson = simpleRemoteApi.getContentList(params);
              return replyJson;
  
          } catch (JSONException e) {
              throw new IOException(e);
          }
      }
  
      /**
       * Prepare request params and calls SimpleRemoteApi method to get contents
       * list of storage. Request JSON data is such like as below.
       * 
       * <pre>
       * {
       *   "method": "getContentList",
       *   "params": [{
       *      "sort" : "ascending"
       *      "view": "date"
       *      "type" : [
       *          "still",
       *          "movie_mp4",
       *          "movie_xavcs"
       *       ],
       *      "uri": "storage:memoryCard1?path=2014-03-31"
       *      }],
       *   "id": 2,
       *   "version": "1.3"
       * }
       * </pre>
       * 
       * @param simpleRemoteApi object of simpleRemoteApi
       * @param uri uri of target date
       * @param isStreamSupported set true if target device supported streaming
       *            playback
       * @return JSON data of response
       * @throws IOException IOException all errors and exception are wrapped by
       *             this Exception.
       */
      public static JSONObject
              getContentListOfDay(SimpleRemoteApi simpleRemoteApi, String uri, //
                      Boolean isStreamSupported) throws IOException {
  
          try {
              JSONObject replyJson = null;
              JSONArray typeParam;
              if (isStreamSupported) {
                  // Device supports streaming API.
                  // get still and movie contents.
                  typeParam = new JSONArray().put("still").put("movie_mp4").put("movie_xavcs");
              } else {
                  // Device does not support streaming API.
                  // get only still contents.
                  typeParam = new JSONArray().put("still");
              }
              JSONObject paramObj =
                      new JSONObject().put("sort", "ascending").put("view", "date") //
                              .put("type", typeParam).put("uri", uri);
              JSONArray params = new JSONArray().put(0, paramObj);
  
              replyJson = simpleRemoteApi.getContentList(params);
              return replyJson;
  
          } catch (JSONException e) {
              throw new IOException(e);
          }
      }
  
      private static List<String> getSupportedStorages(SimpleRemoteApi simpleRemoteApi) //
              throws IOException, JSONException {
  
          // Confirm Scheme
          JSONObject replyJsonScheme = simpleRemoteApi.getSchemeList();
  
          if (SimpleRemoteApi.isErrorReply(replyJsonScheme)) {
              JSONArray resultsObjScheme = replyJsonScheme.getJSONArray("error");
              int resultCode = resultsObjScheme.getInt(0);
              Log.w(TAG, "getSchemeList Error:" + resultCode);
              throw new IOException();
          }
  
          Set<String> schemeSet = new HashSet<String>();
          JSONArray resultsObjScheme = replyJsonScheme.getJSONArray("result").getJSONArray(0);
  
          for (int i = 0; i < resultsObjScheme.length(); i++) {
              schemeSet.add(resultsObjScheme.getJSONObject(i).getString("scheme"));
          }
  
          if (!schemeSet.contains("storage")) {
              Log.w(TAG, "This device does not support storage.");
              throw new IOException();
          }
  
          // Confirm Source
          JSONObject replyJsonSource = simpleRemoteApi.getSourceList("storage");
  
          if (SimpleRemoteApi.isErrorReply(replyJsonSource)) {
              JSONArray resultsObjSource = replyJsonSource.getJSONArray("error");
              int resultCode = resultsObjSource.getInt(0);
              Log.w(TAG, "getSourceList Error:" + resultCode);
              throw new IOException();
          }
  
          List<String> sourceList = new ArrayList<String>();
          JSONArray resultsObjSource = replyJsonSource.getJSONArray("result").getJSONArray(0);
  
          for (int i = 0; i < resultsObjSource.length(); i++) {
              sourceList.add(resultsObjSource.getJSONObject(i).getString("source"));
          }
  
          return sourceList;
      }
  
  }
  