package com.jdroid.android.twitter;
import android.support.annotation.MainThread;
import com.jdroid.android.application.AbstractApplication;
import com.jdroid.android.fragment.AbstractFragment;
import com.jdroid.java.exception.ConnectionException;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterApiException;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.models.Tweet;
import com.twitter.sdk.android.tweetui.SearchTimeline;
import com.twitter.sdk.android.tweetui.TimelineResult;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.List;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
// TODO Add support to rotation. The helper is called on each screen rotation
public abstract class TwitterHelper {
public void loadTweets() {
onStartLoadingTweets();
SearchTimeline searchTimeline = createSearchTimeline();
searchTimeline.next(null, new Callback<TimelineResult<Tweet>>() {
@Override
public void success(Result<TimelineResult<Tweet>> result) {
try {
TwitterHelper.this.onSuccess(result.data.items);
} catch (Exception e) {
AbstractApplication.get().getExceptionHandler().logHandledException(e);
}
}
@Override
public void failure(TwitterException e) {
Boolean connectionError = false;
if (e instanceof TwitterApiException) {
TwitterApiException twitterApiException = (TwitterApiException)e;
if (e.getMessage().equals("Unable to resolve host \"api.twitter.com\": No address associated with hostname")) {
connectionError = true;
} else if (e.getMessage().startsWith("failed to connect to ")) {
connectionError = true;
} else {
String errorMessage = twitterApiException.getErrorCode() + " " + twitterApiException.getErrorMessage();
AbstractApplication.get().getAnalyticsSender().trackErrorBreadcrumb(errorMessage);
}
} else if (e.getMessage().equals("Request Failure")) {
if (e.getCause() != null) {
if (e.getCause() instanceof ConnectException) {
connectionError = true;
} else if (e.getCause().getMessage().equals("Unable to resolve host \"api.twitter.com\": No address associated with hostname")) {
connectionError = true;
} else if (e.getCause() instanceof SocketTimeoutException) {
connectionError = true;
} else if (e.getCause() instanceof SSLHandshakeException) {
connectionError = true;
} else if (e.getCause() instanceof SSLException) {
connectionError = true;
} else if (e.getCause().getMessage().startsWith("Failed to connect to api.twitter.com")) {
connectionError = true;
}
}
}
if (connectionError) {
AbstractApplication.get().getExceptionHandler().logHandledException(new ConnectionException(e));
} else {
AbstractApplication.get().getExceptionHandler().logHandledException(e);
}
TwitterHelper.this.onFailure();
}
});
}
protected abstract SearchTimeline createSearchTimeline();
@MainThread
protected void onStartLoadingTweets() {
// Do Nothing
}
@MainThread
protected abstract void onSuccess(List<Tweet> tweets);
@MainThread
protected void onFailure() {
// Do Nothing
}
public abstract AbstractFragment getAbstractFragment();
}