package com.camilstaps.taize; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import android.widget.Toast; import com.android.volley.Response; import com.android.volley.VolleyError; import com.camilstaps.common.Date; import com.camilstaps.common.DatedString; import com.camilstaps.common.DatedStringPreferenceSet; import com.camilstaps.common.Listener; import com.camilstaps.common.NullListener; import com.camilstaps.rss.RetrieveFeedTask; import com.camilstaps.rss.RssParser; import org.json.JSONException; import java.text.ParseException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Class specific to methods for Taize * @author Camil Staps */ public class Taize { private static final String url_reading_feed = "http://www.taize.fr/readingrss.php"; private static final String url_reading_feed_en = "http://www.taize.fr/readingrss.php?lang=en"; private static final int MAX_DIFFDATE_READING = 10; /** * Fetch the bible text corresponding to the daily reading * @param context * @param listener */ public static void getDailyReadingBibleText(final Context context, final Listener listener, Date date) { Set texts = (Set) DatedStringPreferenceSet.get(context, "dailyreadingbibletexts", DatedString.class); for (DatedString text : texts) { if (text.getDate().equals(date)) { listener.success(text.getString()); return; } } fetchDailyReadingBibleText(context, listener, date); } private static void fetchDailyReadingBibleText(final Context context, final Listener listener, final Date date) { DatedStringPreferenceSet.add(context, "dailyreadingbibletexts", new DatedString(date, "Fetching bible text...")); getEnglishDailyReading(context, new Listener() { @Override public void success(DailyReading reading) { BibleText text = reading.getBibleReference(); if (text == null) { failure(); return; } text.getText(context, new Response.Listener() { @Override public void onResponse(String s) { DatedStringPreferenceSet.updateOrAdd(context, "dailyreadingbibletexts", new DatedString(date, s)); listener.success(s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { failure(); } }); } @Override public void failure() { listener.failure(); DatedStringPreferenceSet.remove(context, "dailyreadingbibletexts", date); } }, date); } /** * Get the English daily reading (needed for the English Bible reference) * @param context * @param listener */ private static void getEnglishDailyReading(final Context context, final Listener listener, Date date) { Set englishDailyReadings = (Set) DatedStringPreferenceSet.get(context, "englishdailyreadings", DailyReading.class); for (DailyReading reading : englishDailyReadings) { if (reading.getDate().equals(date)) { listener.success(reading); return; } } fetchEnglishDailyReading(context, listener, date); } private static void fetchEnglishDailyReading(final Context context, final Listener listener, final Date date) { RetrieveFeedTask retrieve = new RetrieveFeedTask(); retrieve.setRssDownloadListener(new Listener() { @Override public void success(RssParser parser) { try { String text = parser.getItem(0).description.trim(); DailyReading reading = new DailyReading(date, text); DatedStringPreferenceSet.add(context, "englishdailyreadings", reading); listener.success(reading); } catch (Exception e) { failure(); } } @Override public void failure() { Toast.makeText(context, "Failed to fetch daily reading.", Toast.LENGTH_SHORT).show(); listener.failure(); } }); try { retrieve.execute(url_reading_feed_en + "&date=" + date.toString()).get(); } catch (Exception e) { e.printStackTrace(); listener.failure(); } } public static void getDailyReading(final Context context, final Listener listener, Date date) { Set dailyReadings = (Set) DatedStringPreferenceSet.get(context, "dailyreadings", DailyReading.class); for (DailyReading reading : dailyReadings) { if (reading.getDate().equals(date)) { listener.success(reading); return; } } fetchDailyReading(context, listener, date); } private static void fetchDailyReading(final Context context, final Listener listener, final Date date) { RetrieveFeedTask retrieve = new RetrieveFeedTask(); retrieve.setRssDownloadListener(new Listener() { @Override public void success(RssParser parser) { try { String text = parser.getItem(0).description.trim(); DailyReading reading = new DailyReading(date, text); DatedStringPreferenceSet.add(context, "dailyreadings", reading); listener.success(reading); } catch (Exception e) { failure(); } } @Override public void failure() { Toast.makeText(context, "Failed to fetch daily reading.", Toast.LENGTH_SHORT).show(); listener.failure(); } }); try { retrieve.execute(url_reading_feed + "?lang=" + PreferenceManager.getDefaultSharedPreferences(context).getString(SettingsActivity.SettingsFragment.PREF_LANGUAGE_READINGS, "en") + "&date=" + date.toString() ).get(); } catch (Exception e) { e.printStackTrace(); listener.failure(); } } public static void cleanTextSets(Context context) { cleanDailyReadingsSet(context, "dailyreadings"); cleanDailyReadingsSet(context, "englishdailyreadings"); DatedStringPreferenceSet.clear(context, "dailyreadingbibletexts"); } public static void cleanDailyReadingsSet(Context context, String key) { Set set = (Set) DatedStringPreferenceSet.get(context, key, DailyReading.class); Iterator iterator = set.iterator(); while (iterator.hasNext()) { DailyReading reading = iterator.next(); if (reading.getDate().diffDays(new Date()) > MAX_DIFFDATE_READING) { // Remove too old / too new iterator.remove(); } else { // Remove duplicates for (DailyReading r : set) { if (r.getDate().equals(reading.getDate())) { iterator.remove(); break; } } } } DatedStringPreferenceSet.put(context, key, (Set) set); } //http://www.taize.fr/pdcrss.xml }