public void doGetAction() {
    if (!StringUtils.isEmpty(actionId)
        && (currentAction == null || !currentAction.getId().equals(actionId))) {

      int id = Integer.parseInt(actionId);

      // TODO: this should be able to process generic actions.
      CommentUtils.getComment(
          getActivity(),
          new CommentGetListener() {
            @Override
            public void onError(SocializeException error) {
              countdown();
              showError(getContext(), error);
            }

            @Override
            public void onGet(Comment entity) {
              ActionDetailLayoutView.this.currentAction = entity;
              content.setAction(entity);
              if (entity.getUser() != null) {
                doGetUserProfile(entity.getUser().getId(), entity);
              } else if (!StringUtils.isEmpty(userId)) {
                doGetUserProfile(Long.parseLong(userId), entity);
              }
            }
          },
          id);
    } else if (!StringUtils.isEmpty(userId)) {
      doGetUserProfile(Long.parseLong(userId), null);
    }
  }
  /**
   * Returns a simple one-line address based on city and country
   *
   * @param address
   * @return
   */
  public String getSimpleLocation(Address address) {
    StringBuilder builder = new StringBuilder();
    String locality = address.getLocality();
    String countryName = address.getCountryName();

    if (!StringUtils.isEmpty(locality)) {
      builder.append(locality);
    } else if (!StringUtils.isEmpty(countryName)) {
      builder.append(countryName);
    }

    return builder.toString();
  }
 protected void doGetUserProfile(SocializeAction action) {
   if (action != null && action.getUser() != null) {
     doGetUserProfile(action.getUser().getId(), action);
   } else if (!StringUtils.isEmpty(userId)) {
     doGetUserProfile(Long.parseLong(userId), action);
   }
 }
  /*
   * (non-Javadoc)
   * @see com.socialize.networks.AbstractSocialNetworkSharer#doShare(android.app.Activity, com.socialize.entity.Entity, com.socialize.entity.PropagationUrlSet, java.lang.String, com.socialize.networks.SocialNetworkListener, com.socialize.api.action.ActionType)
   */
  @Override
  protected void doShare(
      Activity context,
      Entity entity,
      PropagationInfo urlSet,
      String comment,
      SocialNetworkListener listener,
      ActionType type) {

    Tweet tweet = new Tweet();

    switch (type) {
      case SHARE:
        if (StringUtils.isEmpty(comment)) comment = "Shared " + entity.getDisplayName();
        break;
      case LIKE:
        comment = "\u2764 likes " + entity.getDisplayName();
        break;
      case VIEW:
        comment = "Viewed " + entity.getDisplayName();
        break;
    }

    StringBuilder status = new StringBuilder();

    if (StringUtils.isEmpty(comment)) {
      status.append(entity.getDisplayName());
    } else {
      status.append(comment);
    }

    status.append(", ");
    status.append(urlSet.getEntityUrl());

    tweet.setText(status.toString());

    UserSettings settings = UserUtils.getUserSettings(context);

    if (settings != null && settings.isLocationEnabled()) {
      tweet.setLocation(LocationUtils.getLastKnownLocation(context));
      tweet.setShareLocation(true);
    }

    TwitterUtils.tweet(context, tweet, listener);
  }
  @SuppressWarnings("deprecation")
  public boolean validateSessionAuthDataLegacy(SocializeSession loaded, AuthProviderData data) {

    if (data.getAuthProviderType().equals(AuthProviderType.SOCIALIZE)) {
      return true;
    }

    if (data.getAuthProviderType() != null && !StringUtils.isEmpty(data.getAppId3rdParty())) {
      AuthProviderType loadedAuthProviderType = loaded.getAuthProviderType();
      String loadedAppId3rdParty = loaded.get3rdPartyAppId();

      if (loadedAuthProviderType != null
          && !StringUtils.isEmpty(loadedAppId3rdParty)
          && loadedAuthProviderType.equals(data.getAuthProviderType())
          && loadedAppId3rdParty.equals(data.getAppId3rdParty())) {
        return true;
      }
    }

    return false;
  }
  public void setUserDetails(User user, SocializeAction action) {

    String profilePicData = user.getSmallImageUri();
    final ImageView userIcon = content.getProfilePicture();

    if (!StringUtils.isEmpty(profilePicData)) {
      userIcon.getBackground().setAlpha(64);

      imageLoader.loadImageByUrl(
          profilePicData,
          new ImageLoadListener() {
            @Override
            public void onImageLoadFail(ImageLoadRequest request, Exception error) {
              Log.e(SocializeLogger.LOG_TAG, error.getMessage(), error);
              userIcon.post(
                  new Runnable() {
                    public void run() {
                      userIcon.setImageDrawable(defaultProfilePicture);
                      userIcon.getBackground().setAlpha(255);
                    }
                  });
            }

            @Override
            public void onImageLoad(ImageLoadRequest request, final SafeBitmapDrawable drawable) {
              // Must be run on UI thread
              userIcon.post(
                  new Runnable() {
                    public void run() {
                      drawable.setAlpha(255);
                      userIcon.setImageDrawable(drawable);
                      userIcon.getBackground().setAlpha(255);
                    }
                  });
            }
          });
    } else {
      userIcon.setImageDrawable(defaultProfilePicture);
      userIcon.getBackground().setAlpha(255);
    }

    content.getDisplayName().setText(user.getDisplayName());
    content.loadUserActivity(user, action);
  }
  @Override
  public void post(
      Activity parent,
      Entity entity,
      String message,
      PropagationInfo propInfo,
      SocialNetworkListener listener) {

    String caption = "Download the app now to join the conversation.";
    String linkName = appUtils.getAppName();
    String link = propInfo.getAppUrl();
    String appId = getSocialize().getConfig().getProperty(SocializeConfig.FACEBOOK_APP_ID);

    if (!StringUtils.isEmpty(appId)) {
      post(parent, appId, linkName, message, link, caption, listener);
    } else {
      String msg =
          "Cannot post message to Facebook.  No app id found.  Make sure you specify facebook.app.id in socialize.properties";
      onError(parent, msg, new SocializeException(msg), listener);
    }
  }
  @Override
  public void postPhoto(
      Activity parent, Share share, String comment, Uri photoUri, SocialNetworkListener listener) {
    PropagationInfoResponse propagationInfoResponse = share.getPropagationInfoResponse();
    PropagationInfo propInfo = propagationInfoResponse.getPropagationInfo(ShareType.FACEBOOK);

    if (propInfo != null) {
      String link = propInfo.getAppUrl();
      String appId = getSocialize().getConfig().getProperty(SocializeConfig.FACEBOOK_APP_ID);

      if (!StringUtils.isEmpty(appId)) {
        postPhoto(parent, appId, link, comment, photoUri, listener);
      } else {
        String msg =
            "Cannot post message to Facebook.  No app id found.  Make sure you specify facebook.app.id in socialize.properties";
        onError(parent, msg, new SocializeException(msg), listener);
      }
    } else {
      String msg = "Cannot post message to Facebook.  No propagation info found";
      onError(parent, msg, new SocializeException(msg), listener);
    }
  }
  private final String prepareEndpoint(String host, String endpoint, boolean secure) {
    endpoint = endpoint.trim();

    if (StringUtils.isEmpty(host)) {
      logger.warn("The session did not have a host configured, using the config");
      host = config.getProperty(SocializeConfig.API_HOST);
    }

    if (host != null) {

      if (!host.startsWith("http")) {
        if (secure) {
          host = "https://" + host;
        } else {
          host = "http://" + host;
        }
      }

      if (!host.endsWith("/")) {
        if (!endpoint.startsWith("/")) {
          host += "/";
        }
      } else if (endpoint.startsWith("/")) {
        endpoint = endpoint.substring(1, endpoint.length());
      }

      endpoint = host + endpoint;
    } else {
      logger.error("Could not locate host property in session or config!");
    }

    if (!endpoint.endsWith("/")) {
      endpoint += "/";
    }

    return endpoint;
  }
  private ListResult<T> doListTypeRequest(
      HttpUriRequest request, ActionType type, boolean isJSONResponse) throws SocializeException {
    List<T> results = null;
    List<ActionError> errors = null;
    HttpEntity entity = null;

    ListResult<T> result = null;

    if (!clientFactory.isDestroyed()) {

      try {
        HttpClient client = clientFactory.getClient();

        if (logger != null && logger.isDebugEnabled()) {
          logger.debug("Request: " + request.getMethod() + " " + request.getRequestLine().getUri());
        }

        HttpResponse response = executeRequest(client, request);

        if (logger != null && logger.isDebugEnabled()) {
          logger.debug("Response: " + response.getStatusLine().getStatusCode());
        }

        entity = response.getEntity();

        if (httpUtils.isHttpError(response)) {

          if (sessionPersister != null && httpUtils.isAuthError(response)) {
            sessionPersister.delete(context);
          }

          String msg = ioUtils.readSafe(entity.getContent());
          throw new SocializeApiError(httpUtils, response.getStatusLine().getStatusCode(), msg);
        } else {

          result = new ListResult<T>();

          if (isJSONResponse) {
            // Read the json just for logging
            String json = ioUtils.readSafe(entity.getContent());

            if (logger != null && logger.isDebugEnabled()) {
              logger.debug("JSON Response: " + json);
            }

            if (!StringUtils.isEmpty(json)) {
              JSONObject object = jsonParser.parseObject(json);

              if (object.has(JSON_ATTR_ERRORS) && !object.isNull(JSON_ATTR_ERRORS)) {

                JSONArray errorList = object.getJSONArray(JSON_ATTR_ERRORS);

                int length = errorList.length();

                errors = new ArrayList<ActionError>(length);

                for (int i = 0; i < length; i++) {
                  JSONObject jsonObject = errorList.getJSONObject(i);
                  ActionError error = errorFactory.fromJSON(jsonObject);
                  errors.add(error);
                }

                result.setErrors(errors);
              }

              if (object.has(JSON_ATTR_ITEMS) && !object.isNull(JSON_ATTR_ITEMS)) {
                JSONArray list = object.getJSONArray(JSON_ATTR_ITEMS);

                int length = list.length();

                results = new ArrayList<T>(length);

                for (int i = 0; i < length; i++) {
                  results.add(fromJSON(list.getJSONObject(i), type));
                }

                result.setItems(results);
              }

              if (object.has(JSON_ATTR_COUNT) && !object.isNull(JSON_ATTR_COUNT)) {
                result.setTotalCount(object.getInt(JSON_ATTR_COUNT));
              }
            }
          }
        }
      } catch (Throwable e) {
        throw SocializeException.wrap(e);
      } finally {
        closeEntity(entity);
      }

      return result;
    } else {
      if (logger != null) {
        logger.warn("Attempt to access HttpClientFactory that was already destroyed");
      }

      return null;
    }
  }
  @Override
  public SocializeSession authenticate(
      String endpoint, String key, String secret, AuthProviderData data, String uuid)
      throws SocializeException {
    try {
      SessionLock.lock();

      WritableSession session = loadSession(endpoint, key, secret);

      if (session != null) {

        if (validateSession(session, data)) {
          return session;
        } else {
          session = setProviderCredentialsForUser(data, session);
        }
      }

      if (session == null) {
        session = sessionFactory.create(key, secret, data);
      }

      endpoint = prepareEndpoint(session, endpoint, true);

      if (!clientFactory.isDestroyed()) {

        HttpClient client = clientFactory.getClient();

        HttpEntity entity = null;

        try {
          HttpUriRequest request = requestFactory.getAuthRequest(session, endpoint, uuid, data);

          if (logger != null && logger.isDebugEnabled()) {
            logger.debug("Calling authenticate endpoint for device [" + uuid + "]");
          }

          HttpResponse response = executeRequest(client, request);

          entity = response.getEntity();

          if (httpUtils.isHttpError(response)) {

            if (sessionPersister != null && httpUtils.isAuthError(response)) {
              sessionPersister.delete(context);
            }

            String msg = ioUtils.readSafe(entity.getContent());

            throw new SocializeApiError(httpUtils, response.getStatusLine().getStatusCode(), msg);
          } else {

            JSONObject json = jsonParser.parseObject(entity.getContent());

            User user = userFactory.fromJSON(json.getJSONObject("user"));

            String oauth_token = json.getString("oauth_token");
            String oauth_token_secret = json.getString("oauth_token_secret");

            if (StringUtils.isEmpty(oauth_token)) {
              throw new SocializeException("oauth_token was empty in response from server");
            }

            if (StringUtils.isEmpty(oauth_token_secret)) {
              throw new SocializeException("oauth_token_secret was empty in response from server");
            }

            session.setConsumerToken(oauth_token);
            session.setConsumerTokenSecret(oauth_token_secret);
            session.setUser(user);

            setProviderCredentialsForUser(data, session);

            // Ensure the user credentials match the user auth data returned from the server
            verifyProviderCredentialsForUser(session, user);

            saveSession(session);
          }
        } catch (Exception e) {
          throw SocializeException.wrap(e);
        } finally {
          closeEntity(entity);
        }
      } else {
        if (logger != null) {
          logger.warn("Attempt to access HttpClientFactory that was already destroyed");
        }
      }

      return session;
    } finally {
      SessionLock.unlock();
    }
  }