package dk.dr.radio.data; import android.content.SharedPreferences; import com.android.volley.Request; import org.json.JSONObject; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import dk.dr.radio.diverse.App; import dk.dr.radio.diverse.Log; import dk.dr.radio.net.volley.DrVolleyResonseListener; import dk.dr.radio.net.volley.DrVolleyStringRequest; /** * Håndtering af favoritter. * Created by j on 08-03-14. */ public class Favoritter { private static final String PREF_NØGLE = "favorit til startdato"; private HashMap<String, String> favoritTilStartdato; HashMap<String, Integer> favoritTilAntalDagsdato = new HashMap<String, Integer>(); private int antalNyeUdsendelser = -1; public List<Runnable> observatører = new ArrayList<Runnable>(); private SharedPreferences prefs; private void tjekDataOprettet() { if (favoritTilStartdato != null) return; prefs = App.instans.getSharedPreferences(PREF_NØGLE, 0); String str = prefs.getString(PREF_NØGLE, ""); if (str.length()==0) { // 28 nov 2014 - flyt data fra fælles prefs til separat fil - kan fjernes ultimo 2015 str = App.prefs.getString(PREF_NØGLE, ""); if (str.length()!=0) { App.prefs.edit().remove(PREF_NØGLE).commit(); prefs.edit().putString(PREF_NØGLE, str).commit(); } } Log.d("Favoritter: læst " + str); favoritTilStartdato = strengTilMap(str); if (favoritTilStartdato.isEmpty()) antalNyeUdsendelser = 0; } private void gem() { String str = mapTilStreng(favoritTilStartdato); Log.d("Favoritter: gemmer " + str); prefs.edit().putString(PREF_NØGLE, str).commit(); } public void sætFavorit(String programserieSlug, boolean checked) { tjekDataOprettet(); if (checked) { long iMorgen = 24 * 60 * 60 * 1000 + App.serverCurrentTimeMillis(); /* if (!App.PRODUKTION) { App.kortToast("Udvikler: Favoritter sættes sådan at de starter for en uge siden, for at lette afprøvning"); iMorgen -= 24 * 60 * 60 * 1000 * 7; } */ favoritTilStartdato.put(programserieSlug, DRJson.apiDatoFormat.format(new Date(iMorgen))); favoritTilAntalDagsdato.put(programserieSlug, 0); } else { favoritTilStartdato.remove(programserieSlug); } gem(); beregnAntalNyeUdsendelser.run(); for (Runnable r : observatører) r.run(); // Informér observatører } public boolean erFavorit(String programserieSlug) { tjekDataOprettet(); return favoritTilStartdato.containsKey(programserieSlug); } /** * Giver antallet af nye udsendelser * @param programserieSlug * @return antallet, eller -1 hvis det ikke er en favorit, -2 hvis data for aktuelle antal udsendelser mangler */ public int getAntalNyeUdsendelser(String programserieSlug) { tjekDataOprettet(); Integer antalNye = favoritTilAntalDagsdato.get(programserieSlug); if (antalNye == null) return -1; return antalNye; } public Runnable startOpdaterAntalNyeUdsendelser = new Runnable() { @Override public void run() { tjekDataOprettet(); //if (dd.equals(dato) && favoritTilAntalDagsdato.keySet().equals(favoritTilStartdato.keySet())) return; Log.d("Favoritter: Opdaterer favoritTilStartdato=" + favoritTilStartdato + " favoritTilAntalDagsdato=" + favoritTilAntalDagsdato); for (final String programserieSlug : favoritTilStartdato.keySet()) { String dato = favoritTilStartdato.get(programserieSlug); startOpdaterAntalNyeUdsendelserForProgramserie(programserieSlug, dato); } } }; void startOpdaterAntalNyeUdsendelserForProgramserie(final String programserieSlug, String dato) { String url = DRData.getNyeProgrammerSiden(programserieSlug, dato); Request<?> req = new DrVolleyStringRequest(url, new DrVolleyResonseListener() { @Override public void fikSvar(String json, boolean fraCache, boolean uændret) throws Exception { if (!uændret && json != null && !"null".equals(json)) { JSONObject data = new JSONObject(json); favoritTilAntalDagsdato.put(programserieSlug, data.getInt("TotalPrograms")); } //Log.d("favoritter fikSvar(" + fraCache + " " + url + " " + json + " så nu er favoritTilAntalDagsdato=" + favoritTilAntalDagsdato); App.forgrundstråd.postDelayed(beregnAntalNyeUdsendelser, 500); // Vent 1/2 sekund på eventuelt andre svar } }) { public Priority getPriority() { return Priority.LOW; } }; App.volleyRequestQueue.add(req); } Runnable beregnAntalNyeUdsendelser = new Runnable() { @Override public void run() { App.forgrundstråd.removeCallbacks(this); int antalNyeIAlt = 0; for (Map.Entry<String, Integer> e : favoritTilAntalDagsdato.entrySet()) { String programserieSlug = e.getKey(); Integer antalNye = e.getValue(); antalNyeIAlt += antalNye; Log.d("Favoritter: " + programserieSlug + " har " + antalNye + ", antalNyeIAlt=" + antalNyeIAlt); } if (antalNyeUdsendelser != antalNyeIAlt) { Log.d("Favoritter: Ny favoritTilStartdato=" + favoritTilStartdato); Log.d("Favoritter: Fortæller observatører at antalNyeUdsendelser er ændret fra " + antalNyeUdsendelser + " til " + antalNyeIAlt); antalNyeUdsendelser = antalNyeIAlt; for (Runnable r : new ArrayList<Runnable>(observatører)) r.run(); // Informér observatører - i forgrundstråden } } }; public Set<String> getProgramserieSlugSæt() { tjekDataOprettet(); return favoritTilStartdato.keySet(); } public int getAntalNyeUdsendelser() { tjekDataOprettet(); return antalNyeUdsendelser; } /* <string name="favorit til startdato">,p1-radioavis 2014-09-25,p3-nyheder 2014-09-25,pressen 2014-09-25</string> */ public static HashMap<String, String> strengTilMap(String str) { HashMap<String, String> map = new HashMap<String, String>(); for (String linje : str.split(",")) { if (linje.length() == 0) continue; String[] d = linje.split(" "); map.put(d[0], d[1]); } return map; } public static String mapTilStreng(HashMap<String, String> map) { StringBuilder sb = new StringBuilder(map.size() * 64); for (Map.Entry<String, String> e : map.entrySet()) { sb.append(',').append(e.getKey()).append(' ').append(e.getValue()); } return sb.toString(); } }