package dk.dr.radio.data;
import java.io.File;
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import dk.dr.radio.diverse.App;
import dk.dr.radio.diverse.Log;
import dk.dr.radio.diverse.Serialisering;
/**
* Created by j on 08-03-14.
*/
public class SenestLyttede {
public static class SenestLyttet implements Serializable {
private static final long serialVersionUID = 1L;
public Lydkilde lydkilde;
public Date tidpunkt;
public int positionMs;
public String toString() {
return tidpunkt + " / " + positionMs;
}
}
private LinkedHashMap<String, SenestLyttet> liste;
private String FILNAVN = App.instans == null ? null : App.instans.getFilesDir() + "/SenestLyttede.ser";
private void tjekDataOprettet() {
if (liste != null) return;
if (new File(FILNAVN).exists()) try {
liste = (LinkedHashMap<String, SenestLyttet>) Serialisering.hent(FILNAVN);
for (Iterator<SenestLyttet> sli = liste.values().iterator(); sli.hasNext(); ) {
SenestLyttet sl = sli.next();
if (sl.lydkilde instanceof Kanal) {
// Serialiserede kanaler skal altid erstattes med instansværdier
Kanal serialiseretKanal = (Kanal) sl.lydkilde;
sl.lydkilde = DRData.instans.grunddata.kanalFraKode.get(serialiseretKanal.kode);
// Forsvundne kanaler fjernes bare
if (sl.lydkilde==null || sl.lydkilde==Grunddata.ukendtKanal) sli.remove();
}
else if (sl.lydkilde instanceof Udsendelse) {
// Serialiserede udsendelser skal med i slug-listen
Udsendelse serialiseretUds = (Udsendelse) sl.lydkilde;
if (!DRData.instans.udsendelseFraSlug.containsKey(serialiseretUds.slug)) {
DRData.instans.udsendelseFraSlug.put(serialiseretUds.slug, serialiseretUds);
}
}
}
return;
} catch (Exception e) {
Log.rapporterFejl(e);
}
liste = new LinkedHashMap<String, SenestLyttet>();
gemListe.run(); // Indlæsning gik galt - vi gemmer en ny liste for ikke at få flere fejlmeldinger
}
private Runnable gemListe = new Runnable() {
@Override
public void run() {
App.forgrundstråd.removeCallbacks(gemListe);
try {
long tid = System.currentTimeMillis();
Serialisering.gem(liste, FILNAVN);
if (!App.PRODUKTION) Log.d("SenestLyttede: " + liste);
Log.d("SenestLyttede: Gemning tog " + (System.currentTimeMillis() - tid) + " ms - filstr:" + new File(FILNAVN).length());
} catch (Exception e) { // her kan ske en java.util.ConcurrentModificationException hvis forgrundstråden ændrer i listen samtidigt
Log.rapporterFejl(e);
}
}
};
public java.util.Collection<SenestLyttet> getListe() {
tjekDataOprettet();
return liste.values();
}
public void registrérLytning(Lydkilde lydkilde) {
if (lydkilde instanceof Kanal || lydkilde instanceof Udsendelse) {
tjekDataOprettet();
SenestLyttet senestLyttet = liste.remove(lydkilde.slug);
if (senestLyttet == null) senestLyttet = new SenestLyttet();
senestLyttet.lydkilde = lydkilde;
senestLyttet.tidpunkt = new Date(App.serverCurrentTimeMillis());
liste.put(lydkilde.slug, senestLyttet);
if (liste.size() > 50) liste.remove(0); // Husk kun de seneste 50
App.forgrundstråd.removeCallbacks(gemListe);
App.forgrundstråd.postDelayed(gemListe, 10000); // Gem listen om 10 sekunder
} else {
Log.d("SenestLyttede: ignorer lytning der ikker er en kanal eller udsendelse: "+lydkilde);
}
}
public void sætStartposition(Lydkilde lydkilde, int pos) {
try {
liste.get(lydkilde.slug).positionMs = pos;
} catch (Exception e) {
Log.rapporterFejl(e, lydkilde);
}
App.forgrundstråd.removeCallbacks(gemListe);
App.forgrundstråd.postDelayed(gemListe, 10000); // Gem listen om 10 sekunder
}
public int getStartposition(Lydkilde lydkilde) {
SenestLyttet sl = liste.get(lydkilde.slug);
if (sl==null) return 0; // kan ske for en dk.dr.radio.afspilning.AlarmLydkilde
return sl.positionMs;
}
}