aboutsummaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/java/com/camilstaps/common/Date.java184
-rw-r--r--app/src/main/java/com/camilstaps/taize/BibleText.java14
-rw-r--r--app/src/main/java/com/camilstaps/taize/DailyReading.java38
-rw-r--r--app/src/main/java/com/camilstaps/taize/MainActivity.java38
-rw-r--r--app/src/main/java/com/camilstaps/taize/SettingsActivity.java22
-rw-r--r--app/src/main/java/com/camilstaps/taize/Taize.java128
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
}