package kidozen.client.analytics;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import com.google.gson.Gson;
import org.apache.http.HttpStatus;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import kidozen.client.AnalyticsLog;
import kidozen.client.ServiceEvent;
import kidozen.client.ServiceEventListener;
/**
* Created by christian on 10/22/14.
*/
public class Uploader {
static Uploader mSingleton = null;
private Context mContext = null;
private String TAG = this.getClass().getSimpleName();
private Session mSession = null;
private Handler mUploaderHandler = new Handler();
private Runnable mUploaderTimerTask;
private AnalyticsLog mLogger;
public void StopUploaderTransmissionTimer() {
if (mUploaderHandler!=null) mUploaderHandler.removeCallbacksAndMessages(0);
}
public void StartUploaderTransitionTimer() {
if (mUploaderHandler!=null) mUploaderHandler.removeCallbacksAndMessages(0);
final int timerTimeout = mSession.getSessionTimeoutInSeconds();
this.mUploaderTimerTask = new Runnable() {
public void run() {
uploadCurrentEvents();
mUploaderHandler.postDelayed(this, timerTimeout);
}
};
this.mUploaderHandler.postDelayed(mUploaderTimerTask, timerTimeout);
}
private void uploadCurrentEvents() {
String events = mSession.GetEventsSerializedAsJson();
if ( events!=null && !events.isEmpty()) {
this.mUploaderHandler.removeCallbacksAndMessages(0);
Log.d(TAG, "Uploading events after session timeout : " + events);
mLogger.Write(events,new ServiceEventListener() {
@Override
public void onFinish(ServiceEvent e) {
if (e.StatusCode== HttpStatus.SC_CREATED) {
mSession.ResetEvents();
Log.d(TAG, "Upload events after session timeout");
}
StartUploaderTransitionTimer();
}
});
}
}
public void UploadSession() {
String events = mSession.GetEventsSerializedAsJson();
try {
String sessionDetails = mSession.LoadSessionInformationFromDisk();
Gson gson = new Gson();
SessionDetails details = gson.fromJson(sessionDetails,SessionDetails.class);
details.EndDate = new Date().getTime();
details.length = details.EndDate - details.StartDate;
details.eventAttr.sessionLength = TimeUnit.MILLISECONDS.toSeconds(details.length) % 60;
//serialize again to upload to server
sessionDetails = gson.toJson(details);
String sessionAndEvents = "[" + sessionDetails + "]";
// If there was events, adds the session details to events array
if ( events!=null && !events.isEmpty()) {
int endJsonArray = events.lastIndexOf("]");
if (endJsonArray>0) {
String message = events.substring(0,endJsonArray);
sessionAndEvents = message + "," + sessionDetails + "]";
}
}
this.mUploaderHandler.removeCallbacksAndMessages(0);
Log.d(TAG, "Uploading session & events after session timeout : " + sessionAndEvents);
mLogger.Write(sessionAndEvents,new ServiceEventListener() {
@Override
public void onFinish(ServiceEvent e) {
if (e.StatusCode== HttpStatus.SC_CREATED) {
mSession.ResetEvents();
mSession.RemoveCurrentSession();
Log.d(TAG, "Upload session & events after session timeout");
}
StartUploaderTransitionTimer();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public Uploader(Context context, Session session, AnalyticsLog log) {
mContext = context;
mSession = session;
mLogger = log;
}
public static Uploader getInstance(Context context, Session session, AnalyticsLog log) {
if (mSingleton == null) {
mSingleton = new Uploader(context,session, log);
}
return mSingleton;
}
}