package cgeo.geocaching.twitter;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.log.LogEntry;
import cgeo.geocaching.log.LogTemplateProvider;
import cgeo.geocaching.log.LogTemplateProvider.LogContext;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.models.Trackable;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.OAuth;
import cgeo.geocaching.network.OAuthTokens;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.DataStore;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public final class Twitter {
private static final int MAX_TWEET_SIZE = 140;
private Twitter() {
// Utility class
}
public static void postTweetCache(final String geocode, @Nullable final LogEntry logEntry) {
final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
if (cache != null) {
postTweet(getStatusMessage(cache, logEntry));
}
}
public static void postTweetTrackable(final String geocode, @Nullable final LogEntry logEntry) {
final Trackable trackable = DataStore.loadTrackable(geocode);
if (trackable != null) {
postTweet(getStatusMessage(trackable, logEntry));
}
}
private static void postTweet(final String status) {
if (!Settings.isUseTwitter() || !Settings.isTwitterLoginValid()) {
return;
}
try {
final String trimmed = StringUtils.trim(status);
final String truncated = StringUtils.length(trimmed) <= MAX_TWEET_SIZE ? trimmed : StringUtils.substring(trimmed, 0, MAX_TWEET_SIZE - 1) + CgeoApplication.getInstance().getString(R.string.ellipsis);
final Parameters parameters = new Parameters("status", truncated);
OAuth.signOAuth("api.twitter.com", "/1.1/statuses/update.json", "POST", true, parameters,
new OAuthTokens(Settings.getTokenPublic(), Settings.getTokenSecret()), Settings.getTwitterKeyConsumerPublic(), Settings.getTwitterKeyConsumerSecret());
try {
Network.completeWithSuccess(Network.postRequest("https://api.twitter.com/1.1/statuses/update.json", parameters));
Log.i("Tweet posted");
} catch (final Exception ignored) {
Log.e("Tweet could not be posted");
}
} catch (final Exception e) {
Log.e("Twitter.postTweet", e);
}
}
private static void appendHashTag(final StringBuilder status, final String tag) {
if (status.length() + 1 + tag.length() <= MAX_TWEET_SIZE && !StringUtils.contains(status, tag)) {
status.append(' ').append(tag);
}
}
@NonNull
static String getStatusMessage(@NonNull final Geocache cache, @Nullable final LogEntry logEntry) {
return appendHashTags(LogTemplateProvider.applyTemplatesNoIncrement(Settings.getCacheTwitterMessage(), new LogContext(cache, logEntry)));
}
@NonNull
static String getStatusMessage(@NonNull final Trackable trackable, @Nullable final LogEntry logEntry) {
return appendHashTags(LogTemplateProvider.applyTemplates(Settings.getTrackableTwitterMessage(), new LogContext(trackable, logEntry)));
}
private static String appendHashTags(final String status) {
final StringBuilder builder = new StringBuilder(status);
appendHashTag(builder, "#cgeo");
appendHashTag(builder, "#geocaching");
return builder.toString();
}
}