// Note that this method makes a synchronous Graph API call, so should not be called from the main
  // thread.
  public static FetchedAppSettings queryAppSettings(
      final String applicationId, final boolean forceRequery) {

    // Cache the last app checked results.
    if (!forceRequery && fetchedAppSettings.containsKey(applicationId)) {
      return fetchedAppSettings.get(applicationId);
    }

    Bundle appSettingsParams = new Bundle();
    appSettingsParams.putString(APPLICATION_FIELDS, TextUtils.join(",", APP_SETTING_FIELDS));

    Request request = Request.newGraphPathRequest(null, applicationId, null);
    request.setParameters(appSettingsParams);

    GraphObject supportResponse = request.executeAndWait().getGraphObject();
    FetchedAppSettings result =
        new FetchedAppSettings(
            safeGetBooleanFromResponse(supportResponse, SUPPORTS_ATTRIBUTION),
            safeGetBooleanFromResponse(supportResponse, SUPPORTS_IMPLICIT_SDK_LOGGING),
            safeGetStringFromResponse(supportResponse, NUX_CONTENT),
            safeGetBooleanFromResponse(supportResponse, NUX_ENABLED));

    fetchedAppSettings.put(applicationId, result);

    return result;
  }
  private void query(JSONArray args, CallbackContext callbackContext) throws JSONException {
    Log.d(TAG, "executing query: " + args.getString(0));

    Request request = new Request(Session.getActiveSession(), args.getString(0));

    Response response = request.executeAndWait();

    if (response.getError() != null) {
      callbackContext.error(response.getError().toString());
    } else {
      callbackContext.success(response.getGraphObject().getInnerJSONObject());
    }
  }
  @Override
  protected Void doInBackground(Void... voids) {
    final VKRequest vkRequest = Requests.vkFriendsRequest(Requests.LOCALE_RUS);

    vkRequest.executeWithListener(
        new VKRequest.VKRequestListener() {
          @Override
          public void onComplete(VKResponse response) {
            super.onComplete(response);
            vkTask = new ParseVkResponseTask(vkFriends, listener, response);
            vkTask.setShowResults(false);
            vkTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
          }
        });

    while (vkTask == null) {}

    try {
      vkTask.get();
      Request fbRequest = Requests.fbFriendsRequest();
      Response response = fbRequest.executeAndWait();
      fbTask = new ParseFbResponseTask(fbFriends, listener, response);
      fbTask.setShowResults(false);
      Handler mainHandler = new Handler(Looper.getMainLooper());
      mainHandler.post(
          new Runnable() {
            @Override
            public void run() {
              fbTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            }
          });
      fbTask.get();
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }

    fillSyncContactsList();
    storeSyncContacts();

    return null;
  }
  private void publish(JSONArray args, CallbackContext callbackContext) throws JSONException {
    JSONObject actionParams = args.getJSONObject(0);

    if (actionParams.has("object")) {
      RequestBatch requestBatch = new RequestBatch();

      OpenGraphObject object = buildOpenGraphObject(actionParams);

      Request objectRequest =
          Request.newPostOpenGraphObjectRequest(Session.getActiveSession(), object, null);
      objectRequest.setBatchEntryName("objectCreate");

      OpenGraphAction action =
          OpenGraphAction.Factory.createForPost(actionParams.getString("action"));

      action.setMessage(actionParams.getString("message"));
      action.setProperty("place", actionParams.getLong("place"));
      action.setExplicitlyShared(actionParams.getBoolean("explicitlyShared"));
      action.setProperty(actionParams.getString("objectType"), "{result=objectCreate:$.id}");

      Request request =
          Request.newPostOpenGraphActionRequest(Session.getActiveSession(), action, null);
      request.setBatchEntryDependsOn("objectCreate");

      requestBatch.add(objectRequest);
      requestBatch.add(request);

      List<Response> responses = requestBatch.executeAndWait();
      Response lastResponse = null;

      for (Response response : responses) {

        if (response.getError() != null) {
          callbackContext.error(response.getError().toString());
          return;
        }

        lastResponse = response;
      }

      callbackContext.success(lastResponse.getGraphObject().getInnerJSONObject());
    } else {
      OpenGraphAction action =
          OpenGraphAction.Factory.createForPost(actionParams.getString("action"));

      action.setMessage(actionParams.getString("message"));
      action.setProperty("place", actionParams.getLong("place"));
      action.setExplicitlyShared(actionParams.getBoolean("explicitlyShared"));
      action.setProperty(actionParams.getString("objectType"), actionParams.getString("objectId"));

      Request request =
          Request.newPostOpenGraphActionRequest(Session.getActiveSession(), action, null);

      Response response = request.executeAndWait();

      if (response.getError() != null) {
        callbackContext.error(response.getError().toString());
      } else {
        callbackContext.success(response.getGraphObject().getInnerJSONObject());
      }
    }
  }