package com.camilstaps.taize; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import com.android.volley.Response; import com.android.volley.VolleyError; import com.camilstaps.common.Listener; import com.camilstaps.common.NullListener; import com.camilstaps.rss.RetrieveFeedTask; import com.camilstaps.rss.RssParser; 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"; /** * 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) { Log.i("LOG", "Matching: " + reading); Pattern bible_ref = Pattern.compile("\\((\\d? ?[a-zA-Z]+) (\\d{1,2}):(\\d+)-?(\\d+?)\\)"); Matcher bible_ref_m = bible_ref.matcher(reading); if (!bible_ref_m.find()) { failure(); return; } BibleText text = new BibleText(bible_ref_m.group(1), Integer.parseInt(bible_ref_m.group(2)), Integer.parseInt(bible_ref_m.group(3)), Integer.parseInt(bible_ref_m.group(2)), Integer.parseInt(bible_ref_m.group(4))); text.getText(context, new Response.Listener() { @Override public void onResponse(String s) { Log.i("LOG", "Bible text: " + 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() { 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() { Log.i("LOG", "Failed to update."); 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() { Log.i("LOG", "Failed to update."); 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.")); } } //http://www.taize.fr/pdcrss.xml }