package dk.dr.radio.afspilning;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.Display;
import android.view.WindowManager;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import dk.dr.radio.data.Grunddata;
import dk.dr.radio.data.Lydkilde;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
import dk.dr.radio.net.Diverse;
/**
* Created by json on 09-07-14.
*/
class GemiusStatistik {
static final String RAPPORTERINGSURL = "http://www.dr.dk/mu-online/api/1.0/reporting/gemius";
private static final String NØGLE = "Gemius sporingsnøgle";
private static SimpleDateFormat servertidsformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssSSSZ", Locale.US); // "2014-07-09T09:54:32.086603Z" +01:00 springes over da kolon i +01:00 er ikke-standard Java
private SharedPreferences prefs;
private JSONObject json;
private String sporingsnøgle;
private ArrayList hændelser = new ArrayList();
private Lydkilde lydkilde;
GemiusStatistik() {
String påkrævedeFelter =
"{\"ScreenResolution\":{\"X\":1024,\"Y\":768}"
+ ",\"VideoResolution\":{\"X\":1024,\"Y\":768}"
+ ",\"ScreenColorDepth\":24"
+ ",\"PlayerEvents\":[{\"MaterialOffsetSeconds\":0,\"Started\":\"FirstPlay\",\"Created\":\"2014-07-09T09:54:32.086603Z\"}]"
+ ",\"ChannelType\":\"RADIO\""
+ ",\"Testmode\":\"true\""
// +",\"Testmode\":"+!App.PRODUKTION
+ "}";
try {
json = new JSONObject(påkrævedeFelter);
json.put("AutoStarted", false);
//json.put("Platform", "dr.android." + App.versionsnavn);
// json.put("Platform", "dr.android.KAN_MAN_SE_DETTE_ekstrafelter_vaek");
json.put("Platform", "dr.android.test_fra_main");
// json.put("Telefonmodel", Build.MODEL + " " + Build.PRODUCT);
// json.put("Android_v", Build.VERSION.RELEASE);
/* Behøves, men har ingen meningsfulde værdier
json.put("ScreenResolution", );
json.put("ScreenResolution = new Resolution(1024, 768),
json.put("VideoResolution = new Resolution(1024, 768),
json.put("ScreenColorDepth = 24
*/
if (App.instans != null) {
prefs = App.instans.getSharedPreferences(NØGLE, 0);
sporingsnøgle = prefs.getString(NØGLE, null);
if (sporingsnøgle==null) {
sporingsnøgle = App.prefs.getString(NØGLE, null);
if (sporingsnøgle!=null) { // 28 nov 2014 - flyt data fra fælles prefs til separat fil - kan fjernes ultimo 2015
App.prefs.edit().remove(NØGLE).commit();
prefs.edit().putString(NØGLE, sporingsnøgle).commit();
}
}
json.put("CorrelationId", sporingsnøgle);
Display display = ((WindowManager) App.instans.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth(); // deprecated
int height = display.getHeight(); // deprecated
json.put("ScreenResolution", new JSONObject().put("X", width).put("Y", height));
}
} catch (JSONException e) {
Log.rapporterFejl(e);
json = new JSONObject();
}
}
void testSetlydkilde() throws JSONException {
hændelser.clear();
setLydkilde(null);
registérHændelse(PlayerAction.FirstPlay, 0);
}
void setLydkilde(Lydkilde nyLydkilde) {
Log.d("Gemius setLydkilde " + lydkilde);
if (hændelser.size() > 0) {
Log.d("Gemius setLydkilde, hov, havde ikke sendt disse hændelser: " + hændelser);
startSendData();
}
if (nyLydkilde != null && lydkilde != nyLydkilde) {
lydkilde = nyLydkilde;
registérHændelse(PlayerAction.FirstPlay, 0);
}
}
void startSendData() {
if (!App.ÆGTE_DR) hændelser.clear();
if (hændelser.isEmpty()) return;
try {
// json.put("Url", "http://test.com"); // behøves ikke?
// json.put("InitialLoadTime", 0); // behøves ikke?
// json.put("TimezoneOffsetInMinutes", -120); // behøves ikke?
json.put("PlayerEvents", new JSONArray(hændelser));
if (lydkilde != null) {
json.put("IsLiveStream", lydkilde.erDirekte());
json.put("Id", findSlug(lydkilde.getUdsendelse(), lydkilde));
json.put("Channel", findSlug(lydkilde.getKanal(), lydkilde));
} else {
if (App.instans != null) { // Hvis dette er en kørende app, så rapporter en fejl med dette
Log.rapporterFejl(new IllegalStateException("Gemius lydkilde er null"));
}
json.put("IsLiveStream", false);
json.put("Id", "matador-24-24");// kan ikke være "ukendt"
json.put("Channel", "ukendt");
}
} catch (Exception e) {
Log.rapporterFejl(e, "for " + lydkilde);
}
hændelser.clear();
final String data = json.toString();
if (App.fejlsøgning) Log.d("Gemius startSendData json=" + data);
//new Exception().printStackTrace();
new Thread(new Runnable() {
@Override
public void run() {
try {
JSONObject res = Diverse.postJson(RAPPORTERINGSURL, data);
String nySporingsnøgle = res.optString("CorrelationId");
if (nySporingsnøgle.length() > 0 && !nySporingsnøgle.equals(sporingsnøgle)) {
json.put("CorrelationId", nySporingsnøgle);
sporingsnøgle = nySporingsnøgle;
if (prefs != null) prefs.edit().putString(NØGLE, sporingsnøgle).commit();
}
if (App.fejlsøgning) Log.d("Gemius res=" + res);
} catch (IOException ioe) {
Log.d("data json=" + data);
Log.e(ioe);
} catch (Exception e) {
Log.rapporterFejl(e, "data json=" + data);
}
}
}).start();
}
/**
* Find slug ud fra en lydkilde
* @param lk lydkilden
* @param lk0 hvis den ikke kan findes ud fra lk, så prøv den her lydkilde
* @return slug, eller "ukendt"
*/
private String findSlug(Lydkilde lk, Lydkilde lk0) {
if (lk==null || lk==Grunddata.ukendtKanal) return findSlug(lk0, null);
if (lk.slug!=null && lk.slug.length()>0) return lk.slug;
if (lk0 != null) return findSlug(lk0, null);
return "ukendt";
}
static enum PlayerAction {
FirstPlay,
Play,
Pause,
Seeking,
Completed,
Quit,
Stopped
}
void registérHændelse(PlayerAction hvad, long mediaOffsetISekunder) {
try {
JSONObject hændelse = new JSONObject();
hændelse.put("Started", hvad.toString());
hændelse.put("Created", servertidsformat.format(new Date())); // "2014-07-09T09:54:32.086603Z"
hændelse.put("MaterialOffsetSeconds", mediaOffsetISekunder);
Log.d("Gemius registérHændelse " + hændelse);
hændelser.add(hændelse);
} catch (Exception e) {
Log.rapporterFejl(e);
}
}
/**
* Til afprøvning
*/
public static void main(String[] a) throws Exception {
GemiusStatistik g = new GemiusStatistik();
for (int n = 0; n < 100; n++) {
g.testSetlydkilde();
g.registérHændelse(PlayerAction.Play, 0);
Thread.sleep(1000);
g.registérHændelse(PlayerAction.Completed, 2);
g.startSendData();
Thread.sleep(1000);
}
}
}