package com.adsdk.sdk.video; import static com.adsdk.sdk.Const.MAX_NUMBER_OF_TRACKING_RETRIES; import java.lang.Thread.UncaughtExceptionHandler; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedList; import java.util.Queue; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import com.adsdk.sdk.Const; public class TrackerService { private static Object sLock = new Object(); private static boolean sThreadRunning = false; private static Queue<TrackEvent> sTrackEvents = new LinkedList<TrackEvent>(); private static Queue<TrackEvent> sRetryTrackEvents = new LinkedList<TrackEvent>(); private static Thread sThread; private static boolean sStopped; public static void requestTrack(TrackEvent[] trackEvents) { synchronized (sLock) { for (TrackEvent trackEvent : trackEvents) { if (!sTrackEvents.contains(trackEvent)) { sTrackEvents.add(trackEvent); } } } if (!sThreadRunning) { startTracking(); } } public static void requestTrack(TrackEvent trackEvent) { synchronized (sLock) { if (!sTrackEvents.contains(trackEvent)) { sTrackEvents.add(trackEvent); } } if (!sThreadRunning) { startTracking(); } } public static void requestRetry(TrackEvent trackEvent) { synchronized (sLock) { if (!sRetryTrackEvents.contains(trackEvent)) { trackEvent.retries++; if (trackEvent.retries <= MAX_NUMBER_OF_TRACKING_RETRIES) { sRetryTrackEvents.add(trackEvent); } } } } private static boolean hasMoreUpdates() { synchronized (sLock) { boolean hasMore = !sTrackEvents.isEmpty(); return hasMore; } } private static TrackEvent getNextUpdate() { synchronized (sLock) { if (sTrackEvents.peek() == null) { return null; } else { TrackEvent nextTrackEvent = sTrackEvents.poll(); return nextTrackEvent; } } } public static void startTracking() { synchronized (sLock) { if (!sThreadRunning) { sThreadRunning = true; sThread = new Thread(new Runnable() { @Override public void run() { sStopped = false; while (!sStopped) { while (hasMoreUpdates() && !sStopped) { TrackEvent event = getNextUpdate(); if (event == null) continue; URL u = null; try { u = new URL(event.url); } catch (MalformedURLException e) { continue; } DefaultHttpClient client = new DefaultHttpClient(); HttpConnectionParams.setSoTimeout( client.getParams(), Const.SOCKET_TIMEOUT); HttpConnectionParams.setConnectionTimeout( client.getParams(), Const.CONNECTION_TIMEOUT); HttpGet get = new HttpGet(u.toString()); HttpResponse response; try { response = client.execute(get); if (response.getStatusLine() .getStatusCode() != HttpURLConnection.HTTP_OK) { requestRetry(event); } } catch (Throwable t) { requestRetry(event); } } if ((!sStopped) && (!sRetryTrackEvents.isEmpty())) { try { Thread.sleep(30000); } catch (Exception e) { } synchronized (sLock) { sTrackEvents.addAll(sRetryTrackEvents); sRetryTrackEvents.clear(); } } else { sStopped = true; } } sStopped = false; sThreadRunning = false; sThread = null; } }); sThread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { sThreadRunning = false; sThread = null; startTracking(); } }); sThread.start(); } } } public static void release() { if (sThread != null) { sStopped = true; } } }