blob: 0ed52a0a84e6e31f3a85a20a83392ba7c1c95579 [file] [log] [blame]
package org.wordpress.android.networking;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.AccountHelper;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.CrashlyticsUtils;
import android.os.Handler;
import android.os.Looper;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Interceptor;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class GravatarApi {
public static final String API_BASE_URL = "https://api.gravatar.com/v1/";
public interface GravatarUploadListener {
void onSuccess();
void onError();
}
private static OkHttpClient createClient(final String restEndpointUrl) {
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
//// uncomment the following line to add logcat logging
//httpClientBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
// add oAuth token usage
httpClientBuilder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
String siteId = AuthenticatorRequest.extractSiteIdFromUrl(restEndpointUrl, original.url()
.toString());
String token = OAuthAuthenticator.getAccessToken(siteId);
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", "Bearer " + token)
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
return httpClientBuilder.build();
}
public static Request prepareGravatarUpload(String email, File file) {
return new Request.Builder()
.url(API_BASE_URL + "upload-image")
.post(new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("account", email)
.addFormDataPart("filedata", file.getName(), new StreamingRequest(file))
.build())
.build();
}
public static void uploadGravatar(final File file, final GravatarUploadListener gravatarUploadListener) {
Request request = prepareGravatarUpload(AccountHelper.getDefaultAccount().getEmail(), file);
createClient(API_BASE_URL).newCall(request).enqueue(
new Callback() {
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (!response.isSuccessful()) {
Map<String, Object> properties = new HashMap<>();
properties.put("network_response_code", response.code());
// response's body can only be read once so, keep it in a local variable
String responseBody;
try {
responseBody = response.body().string();
} catch (IOException e) {
responseBody = "null";
}
properties.put("network_response_body", responseBody);
AnalyticsTracker.track(AnalyticsTracker.Stat.ME_GRAVATAR_UPLOAD_UNSUCCESSFUL,
properties);
AppLog.w(AppLog.T.API, "Network call unsuccessful trying to upload Gravatar: " +
responseBody);
}
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (response.isSuccessful()) {
gravatarUploadListener.onSuccess();
} else {
gravatarUploadListener.onError();
}
}
});
}
@Override
public void onFailure(okhttp3.Call call, final IOException e) {
Map<String, Object> properties = new HashMap<>();
properties.put("network_exception_class", e != null ? e.getClass().getCanonicalName() : "null");
properties.put("network_exception_message", e != null ? e.getMessage() : "null");
AnalyticsTracker.track(AnalyticsTracker.Stat.ME_GRAVATAR_UPLOAD_EXCEPTION, properties);
CrashlyticsUtils.logException(e, CrashlyticsUtils.ExceptionType.SPECIFIC,
AppLog.T.API, "Network call failure trying to upload Gravatar!");
AppLog.w(AppLog.T.API, "Network call failure trying to upload Gravatar!" + (e != null ?
e.getMessage() : "null"));
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
gravatarUploadListener.onError();
}
});
}
});
}
}