package com.mopub.network; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import com.mopub.common.event.MoPubEvents; import com.mopub.common.logging.MoPubLog; import com.mopub.volley.DefaultRetryPolicy; import com.mopub.volley.NetworkResponse; import com.mopub.volley.Request; import com.mopub.volley.RequestQueue; import com.mopub.volley.Response; import com.mopub.volley.VolleyError; import com.mopub.volley.toolbox.HttpHeaderParser; import java.util.*; public class TrackingRequest extends Request<Void> { public interface Listener extends Response.ErrorListener { public void onResponse(); } @Nullable private final TrackingRequest.Listener mListener; private TrackingRequest(@NonNull final String url, @Nullable final Listener listener) { super(Method.GET, url, listener); mListener = listener; setShouldCache(false); setRetryPolicy(new DefaultRetryPolicy( DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); } @Override protected Response<Void> parseNetworkResponse(final NetworkResponse networkResponse) { if (networkResponse.statusCode != 200) { return Response.error( new MoPubNetworkError("Failed to log tracking request. Response code: " + networkResponse.statusCode + " for url: " + getUrl(), MoPubNetworkError.Reason.TRACKING_FAILURE)); } return Response.success(null, HttpHeaderParser.parseCacheHeaders(networkResponse)); } @Override public void deliverResponse(final Void aVoid) { if (mListener != null) { mListener.onResponse(); } } /////////////////////////////////////////////////////////////// // Static helper methods that can be used as utilities: ////////////////////////////////////////////////////////////// public static void makeTrackingHttpRequest(final Iterable<String> urls, final Context context) { makeTrackingHttpRequest(urls, context, null, null); } public static void makeTrackingHttpRequest(final Iterable<String> urls, final Context context, final MoPubEvents.Type type) { makeTrackingHttpRequest(urls, context, null, type); } public static void makeTrackingHttpRequest(final Iterable<String> urls, final Context context, @Nullable final Listener listener, final MoPubEvents.Type type) { if (urls == null || context == null) { return; } final RequestQueue requestQueue = Networking.getRequestQueue(context); for (final String url : urls) { if (TextUtils.isEmpty(url)) { continue; } final TrackingRequest.Listener internalListener = new TrackingRequest.Listener() { @Override public void onResponse() { MoPubLog.d("Successfully hit tracking endpoint: " + url); if (listener != null) { listener.onResponse(); } } @Override public void onErrorResponse(final VolleyError volleyError) { MoPubLog.d("Failed to hit tracking endpoint: " + url); if (listener != null) { listener.onErrorResponse(volleyError); } } }; final TrackingRequest trackingRequest = new TrackingRequest(url, internalListener); requestQueue.add(trackingRequest); } } public static void makeTrackingHttpRequest(final String url, final Context context) { makeTrackingHttpRequest(url, context, null, null); } public static void makeTrackingHttpRequest(final String url, final Context context, @Nullable Listener listener) { makeTrackingHttpRequest(url, context, listener, null); } public static void makeTrackingHttpRequest(final String url, final Context context, final MoPubEvents.Type type) { makeTrackingHttpRequest(url, context, null, type); } public static void makeTrackingHttpRequest(final String url, final Context context, @Nullable Listener listener, final MoPubEvents.Type type) { makeTrackingHttpRequest(Arrays.asList(url), context, listener, type); } }