diff options
Diffstat (limited to 'app/src')
6 files changed, 390 insertions, 34 deletions
diff --git a/app/src/main/java/com/camilstaps/common/Date.java b/app/src/main/java/com/camilstaps/common/Date.java new file mode 100644 index 0000000..2823e35 --- /dev/null +++ b/app/src/main/java/com/camilstaps/common/Date.java @@ -0,0 +1,184 @@ +package com.camilstaps.common; + +import android.util.Log; + +import java.text.ParseException; +import java.util.Calendar; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by camilstaps on 7-4-15. + */ +public class Date implements Comparable<Date> { + + private int year, month, day; + + public Date() { + Calendar cal = Calendar.getInstance(); + year = cal.get(Calendar.YEAR); + month = cal.get(Calendar.MONTH) + 1; + day = cal.get(Calendar.DAY_OF_MONTH); + } + + public Date(int year, int month, int day) { + this.year = year; + this.month = month; + this.day = day; + } + + public Date(String format) throws ParseException { + Pattern pat = Pattern.compile("(\\d*)-(\\d*)-(\\d*)"); + Matcher match = pat.matcher(format); + if (match.find()) { + year = Integer.parseInt(match.group(1)); + month = Integer.parseInt(match.group(2)); + day = Integer.parseInt(match.group(3)); + } else { + throw new ParseException("Wrong date format", 0); + } + } + + public Date(Date copy) { + year = copy.year; + month = copy.month; + day = copy.day; + } + + public int getYear() { + return year; + } + + public int getMonth() { + return month; + } + + public int getDay() { + return day; + } + + public void addYears(int n) { + year += n; + } + + public void addMonths(int n) { + for (int i = 0; i < n; i++) { + month++; + if (month >= 13) { + month = 1; + addYears(1); + } + } + } + + public void addDays(int n) { + for (int i = 0; i < n; i++) { + day++; + if (day >= daysOfMonth()) { + day = 1; + addMonths(1); + } + } + } + + public boolean equals(Date date) { + return year == date.year && month == date.month && day == date.day; + } + + @Override + public String toString() { + return Integer.toString(year) + "-" + Integer.toString(month) + "-" + Integer.toString(day); + } + + public static boolean isLeapYear(int year) { + if (year % 4 != 0) + return false; + if (year % 100 != 0) + return true; + if (year % 400 != 0) + return false; + return true; + } + + public boolean isLeapYear() { + return isLeapYear(year); + } + + public static int daysOfYear(int year) { + return isLeapYear(year) ? 366 : 365; + } + + public int daysOfYear() { + return daysOfYear(year); + } + + public static int daysOfMonth(int year, int month) { + switch (month) { + case 2: return isLeapYear(year) ? 29 : 28; + case 1: + case 3: + case 5: + case 8: + case 10: + case 12: + return 31; + default: + return 30; + } + } + + public int daysOfMonth() { + return daysOfMonth(year, month); + } + + public int diffDays(Date withDate) { + Date smaller, bigger; + if (compareTo(withDate) > 0) { + smaller = new Date(this); + bigger = new Date(withDate); + } else { + smaller = new Date(withDate); + bigger = new Date(this); + } + if (smaller.equals(bigger)) { + return 0; + } + int i = 0; + while (!smaller.equals(bigger)) { + smaller.addDays(1); + i++; + } + return i; + } + + @Override + public int compareTo(Date another) { + if (another.year != year) + return Integer.compare(another.year, year); + if (another.month != month) + return Integer.compare(another.month, month); + if (another.day != day) + return Integer.compare(another.day, day); + return 0; + } + + public int getDayOfWeek() { + // See: http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#A_tabular_method_to_calculate_the_day_of_the_week + int months[] = {isLeapYear() ? 6 : 0, isLeapYear() ? 2 : 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}; + return (day + months[month - 1] + (year % 100) + (int) Math.floor((year % 100) / 4) + 2 * (3 - ((int) Math.floor(year / 100) % 4))) % 7; + } + + public String getDayOfWeekName() { + String days[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; + return days[getDayOfWeek()]; + } + + public String getMonthName() { + String months[] = {"January","February","March","April","May","June","July","August","September","October","November","December"}; + return months[month - 1]; + } + + public String toNiceString() { + return getDayOfWeekName() + ", " + day + " " + getMonthName() + " " + year; + } +} diff --git a/app/src/main/java/com/camilstaps/taize/BibleText.java b/app/src/main/java/com/camilstaps/taize/BibleText.java index db73a78..6a9dba8 100644 --- a/app/src/main/java/com/camilstaps/taize/BibleText.java +++ b/app/src/main/java/com/camilstaps/taize/BibleText.java @@ -43,6 +43,20 @@ public class BibleText { this.end_verse = end_verse; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(book); + sb.append(' ').append(Integer.toString(start_chap)).append(':').append(Integer.toString(start_verse)); + if (start_chap != end_chap || start_verse != end_verse) { + sb.append('-'); + if (start_chap != end_chap) { + sb.append(Integer.toString(end_chap)).append('-'); + } + sb.append(Integer.toString(end_verse)); + } + return sb.toString(); + } + /** * Get the text (without verse numbers, line breaks, etc.) of this passage * @param context diff --git a/app/src/main/java/com/camilstaps/taize/DailyReading.java b/app/src/main/java/com/camilstaps/taize/DailyReading.java index 71acc2b..71c38ac 100644 --- a/app/src/main/java/com/camilstaps/taize/DailyReading.java +++ b/app/src/main/java/com/camilstaps/taize/DailyReading.java @@ -3,10 +3,11 @@ package com.camilstaps.taize; import org.json.JSONException; import org.json.JSONObject; -import java.io.Serializable; import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.camilstaps.common.Date; /** * Created by camilstaps on 7-4-15. @@ -16,8 +17,6 @@ public class DailyReading { private final Date date; private final String text; - private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); - public DailyReading(Date date, String text) { this.date = date; this.text = text; @@ -31,11 +30,21 @@ public class DailyReading { return date; } + public String getTextWithoutReference() { + Matcher bible_ref_m = referenceMatcher(); + + if (bible_ref_m.find()) { + return text.substring(0, bible_ref_m.start() - 1); + } else { + return text; + } + } + @Override public String toString() { JSONObject json = new JSONObject(); try { - json.put("date", dateFormatter.format(date)); + json.put("date", date.toString()); json.put("text", text); } catch (JSONException e) {} return json.toString(); @@ -43,6 +52,21 @@ public class DailyReading { public static DailyReading fromString(String s) throws JSONException, ParseException { JSONObject json = new JSONObject(s); - return new DailyReading(dateFormatter.parse(json.getString("date")), json.getString("text")); + return new DailyReading(new Date(json.getString("date")), json.getString("text")); + } + + public BibleText getBibleReference() { + final Matcher bible_ref_m = referenceMatcher(); + + if (!bible_ref_m.find()) { + return null; + } + + return 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))); + } + + private Matcher referenceMatcher() { + Pattern bible_ref = Pattern.compile("\\((\\d? ?[a-zA-Z]+) (\\d{1,2})(?::|,)(\\d+)-?(\\d+?)\\)"); + return bible_ref.matcher(text); } } diff --git a/app/src/main/java/com/camilstaps/taize/MainActivity.java b/app/src/main/java/com/camilstaps/taize/MainActivity.java index 8382683..505674a 100644 --- a/app/src/main/java/com/camilstaps/taize/MainActivity.java +++ b/app/src/main/java/com/camilstaps/taize/MainActivity.java @@ -9,6 +9,7 @@ import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -17,8 +18,12 @@ import android.view.ViewGroup; import android.support.v4.widget.DrawerLayout; import android.widget.TextView; +import com.camilstaps.common.Date; +import com.camilstaps.common.Listener; import com.camilstaps.common.NullListener; +import java.util.HashSet; + public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { @@ -52,7 +57,7 @@ public class MainActivity extends ActionBarActivity @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { switch (key) { - case "dailyreading": + case "dailyreadings": case "dailyreadingbible": setupContent(); break; @@ -80,11 +85,38 @@ public class MainActivity extends ActionBarActivity } private void setDailyReading() { - ((TextView) findViewById(R.id.textDailyReading)).setText(PreferenceManager.getDefaultSharedPreferences(this).getString("dailyreading", "No daily reading found.")); + Date date = new Date(); + + Taize.getDailyReading(this, new Listener<DailyReading>() { + @Override + public void success(DailyReading data) { + ((TextView) findViewById(R.id.textDailyReading)).setText(data.getTextWithoutReference()); + BibleText bt = data.getBibleReference(); + if (bt != null) + ((TextView) findViewById(R.id.refDailyReadingBibleText)).setText(bt.toString()); + } + + @Override + public void failure() { + ((TextView) findViewById(R.id.textDailyReading)).setText("No reading found."); + } + }, date); + + ((TextView) findViewById(R.id.dateDailyReading)).setText(date.toNiceString()); } private void setDailyReadingBibleText() { - ((TextView) findViewById(R.id.textDailyReadingBibleText)).setText(PreferenceManager.getDefaultSharedPreferences(this).getString("dailyreadingbible", "Could not fetch bible text.")); + Taize.getDailyReadingBibleText(this, new Listener<String>() { + @Override + public void success(String data) { + ((TextView) findViewById(R.id.textDailyReadingBibleText)).setText(data); + } + + @Override + public void failure() { + ((TextView) findViewById(R.id.textDailyReadingBibleText)).setText("No bible text found."); + } + }); } @Override diff --git a/app/src/main/java/com/camilstaps/taize/SettingsActivity.java b/app/src/main/java/com/camilstaps/taize/SettingsActivity.java index 13ba910..3fe43d1 100644 --- a/app/src/main/java/com/camilstaps/taize/SettingsActivity.java +++ b/app/src/main/java/com/camilstaps/taize/SettingsActivity.java @@ -12,6 +12,8 @@ import android.util.Log; import com.camilstaps.common.NullListener; +import java.util.HashSet; + public class SettingsActivity extends PreferenceActivity { @Override @@ -19,16 +21,17 @@ public class SettingsActivity extends PreferenceActivity { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); - PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { + SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (key.equals(SettingsFragment.PREF_LANGUAGE_READINGS)) { // If we select a new language, set the fetch time to 0 to refetch on next request - Taize.forceNewDailyReading(getApplicationContext(), new NullListener<String>()); - } else if (key.equals(SettingsFragment.PREF_VERSION_BIBLE)) { // If we select a new bible, set the fetch time to 0 to refetch on next request + if (key.equals(SettingsFragment.PREF_LANGUAGE_READINGS)) { + Taize.clearDailyReadingsSet(getApplicationContext()); + } else if (key.equals(SettingsFragment.PREF_VERSION_BIBLE)) { Taize.forceNewDailyReadingBibleText(getApplicationContext(), new NullListener<String>()); } } - }); + }; + PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } private static Preference.OnPreferenceChangeListener onPreferenceChangeListener = new Preference.OnPreferenceChangeListener() { @@ -44,15 +47,6 @@ public class SettingsActivity extends PreferenceActivity { pref.setSummary(stringValue); } - // If the preference actually changed ... - /*if (!PreferenceManager.getDefaultSharedPreferences(pref.getContext()).getString(pref.getKey(), "").equals(stringValue)) { - if (pref.getKey().equals(SettingsFragment.PREF_LANGUAGE_READINGS)) { // If we select a new language, set the fetch time to 0 to refetch on next request - Taize.forceNewDailyReading(pref.getContext(), new NullListener<String>()); - } else if (pref.getKey().equals(SettingsFragment.PREF_VERSION_BIBLE)) { // If we select a new bible, set the fetch time to 0 to refetch on next request - Taize.forceNewDailyReadingBibleText(pref.getContext(), new NullListener<String>()); - } - }*/ - return true; } }; diff --git a/app/src/main/java/com/camilstaps/taize/Taize.java b/app/src/main/java/com/camilstaps/taize/Taize.java index d743e13..6bea168 100644 --- a/app/src/main/java/com/camilstaps/taize/Taize.java +++ b/app/src/main/java/com/camilstaps/taize/Taize.java @@ -8,11 +8,18 @@ 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; @@ -26,6 +33,8 @@ 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 @@ -53,23 +62,18 @@ public class Taize { @Override public void success(String reading) { - Pattern bible_ref = Pattern.compile("\\((\\d? ?[a-zA-Z]+) (\\d{1,2}):(\\d+)-?(\\d+?)\\)"); - final Matcher bible_ref_m = bible_ref.matcher(reading); - - if (!bible_ref_m.find()) { + BibleText text = null; + text = new DailyReading(new Date(), reading).getBibleReference(); + if (text == null) { 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<String>() { @Override public void onResponse(String s) { - String formatted_text = "Text: " + bible_ref_m.group(0) + "\n\n" + s; - - PreferenceManager.getDefaultSharedPreferences(context).edit().putString("dailyreadingbible", formatted_text).apply(); - listener.success(formatted_text); + PreferenceManager.getDefaultSharedPreferences(context).edit().putString("dailyreadingbible", s).apply(); + listener.success(s); } }, new Response.ErrorListener() { @Override @@ -221,6 +225,110 @@ public class Taize { } } + public static void getDailyReading(final Context context, final Listener<DailyReading> listener, Date date) { + + Set<DailyReading> 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<DailyReading> listener, final Date date) { + + RetrieveFeedTask retrieve = new RetrieveFeedTask(); + retrieve.setRssDownloadListener(new Listener<RssParser>() { + @Override + public void success(RssParser parser) { + try { + String text = parser.getItem(0).description.trim(); + DailyReading reading = new DailyReading(date, text); + + Set<DailyReading> 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<DailyReading> getDailyReadingsSet(Context context) { + Set<DailyReading> dailyReadings= new HashSet<DailyReading>(); + for (String s : PreferenceManager.getDefaultSharedPreferences(context).getStringSet("dailyreadings", new HashSet<String>())) { + 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<DailyReading> set) { + SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit(); + Set<String> 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<DailyReading>()); + } + + public static void cleanDailyReadingsSet(Context context) { + Set<DailyReading> set = getDailyReadingsSet(context); + Iterator<DailyReading> 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 } |