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.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; /** * Force fetching a new bible text for the daily reading * @see this#getDailyReadingBibleText * @param context * @param listener */ public static void forceNewDailyReadingBibleText(final Context context, final Listener listener) { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); editor.putLong("dailyreadingbiblefetch", 0); editor.putLong("englishdailyreadingfetch", 0); editor.commit(); getDailyReadingBibleText(context, listener); } /** * Fetch the bible text corresponding to the daily reading * @see this#forceNewDailyReadingBibleText * @param context * @param listener */ public static void getDailyReadingBibleText(final Context context, final Listener listener) { if (System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context).getLong("dailyreadingbiblefetch", 0) > 3600000) { getEnglishDailyReading(context, new Listener() { @Override public void success(String reading) { BibleText text = null; text = new DailyReading(new Date(), reading).getBibleReference(); if (text == null) { failure(); return; } text.getText(context, new Response.Listener() { @Override public void onResponse(String s) { PreferenceManager.getDefaultSharedPreferences(context).edit().putString("dailyreadingbible", s).apply(); listener.success(s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("NET", "Failed to fetch bible text."); } }); } @Override public void failure() { Toast.makeText(context, "Failed to fetch bible text.", Toast.LENGTH_SHORT).show(); listener.failure(); } }); PreferenceManager.getDefaultSharedPreferences(context).edit().putLong("dailyreadingbiblefetch", System.currentTimeMillis()).apply(); } else { listener.success(PreferenceManager.getDefaultSharedPreferences(context).getString("dailyreadingbible", "No bible text found.")); } } /** * Force fetching a new English daily reading * @see this#getEnglishDailyReading * @param context * @param listener */ private static void forceNewEnglishDailyReading(final Context context, final Listener listener) { PreferenceManager.getDefaultSharedPreferences(context).edit().putLong("englishdailyreadingfetch", 0).commit(); getEnglishDailyReading(context, listener); } /** * Get the English daily reading (needed for the English Bible reference) * @see this#forceNewEnglishDailyReading * @param context * @param listener */ private static void getEnglishDailyReading(final Context context, final Listener listener) { if (System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context).getLong("englishdailyreadingfetch", 0) > 3600000) { RetrieveFeedTask retrieve = new RetrieveFeedTask(); retrieve.setRssDownloadListener(new Listener() { @Override public void success(RssParser parser) { try { String reading = parser.getItem(0).description.trim(); SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); editor.putString("englishdailyreading", reading); editor.putLong("englishdailyreadingfetch", System.currentTimeMillis()); editor.apply(); listener.success(reading); } catch (Exception e) { failure(); } } @Override public void failure() { listener.failure(); } }); try { retrieve.execute(url_reading_feed_en).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } else { listener.success(PreferenceManager.getDefaultSharedPreferences(context).getString("englishdailyreading", "No daily reading found.")); } } /** * Force fetching a new daily reading * @see this#getDailyReading * @param context * @param listener */ public static void forceNewDailyReading(final Context context, final Listener listener) { PreferenceManager.getDefaultSharedPreferences(context).edit().putLong("dailyreadingfetch", 0).commit(); getDailyReading(context, listener); } /** * Fetch the daily reading * @see this#forceNewDailyReading * @param context * @param listener */ public static void getDailyReading(final Context context, final Listener listener) { if (System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context).getLong("dailyreadingfetch", 0) > 3600000) { RetrieveFeedTask retrieve = new RetrieveFeedTask(); retrieve.setRssDownloadListener(new Listener() { @Override public void success(RssParser parser) { try { String reading = parser.getItem(0).description.trim(); if (!reading.equals(PreferenceManager.getDefaultSharedPreferences(context).getString("dailyreading", ""))) { forceNewDailyReadingBibleText(context, new NullListener()); } SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); editor.putString("dailyreading", reading); editor.putLong("dailyreadingfetch", System.currentTimeMillis()); editor.apply(); 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")).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } else { listener.success(PreferenceManager.getDefaultSharedPreferences(context).getString("dailyreading", "No daily reading found.")); } } public static void getDailyReading(final Context context, final Listener listener, Date date) { Set dailyReadings = getDailyReadingsSet(context); 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); Set dailyReadings = getDailyReadingsSet(context); dailyReadings.add(reading); putDailyReadingsSet(context, dailyReadings); 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 (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } public static Set getDailyReadingsSet(Context context) { Set dailyReadings= new HashSet(); for (String s : PreferenceManager.getDefaultSharedPreferences(context).getStringSet("dailyreadings", new HashSet())) { try { dailyReadings.add(DailyReading.fromString(s)); } catch (JSONException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } return dailyReadings; } private static void putDailyReadingsSet(Context context, Set set) { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); Set putSet = new HashSet<>(); for (DailyReading reading : set) { putSet.add(reading.toString()); } editor.putStringSet("dailyreadings", putSet); editor.apply(); } public static void clearDailyReadingsSet(Context context) { putDailyReadingsSet(context, new HashSet()); } public static void cleanDailyReadingsSet(Context context) { Set set = getDailyReadingsSet(context); 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; } } } } putDailyReadingsSet(context, set); } //http://www.taize.fr/pdcrss.xml }