aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/com/camilstaps/taize/Bible.java
blob: 0e90ccbb9931c5b30fbd232a4aeb5978bd763e24 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.camilstaps.taize;

import android.content.Context;
import android.preference.PreferenceManager;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * Use the Bible API of getbible.net
 *
 * @author Camil Staps
 */
public class Bible {

    /**
     * Base URL of the API
     */
    private static final String BASE_URL = "https://getbible.net/json?";

    /**
     * Request data from the API
     * @param context context to handle from
     * @param query_string Query string with parameters for the API
     * @param listener listener; passed on to Volley, for processing the result
     * @param errorListener errorListener for when some error occurs
     */
    private static void request(Context context, String query_string, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        RequestQueue queue = Volley.newRequestQueue(context);
        StringRequest request = new StringRequest(Request.Method.GET, BASE_URL + "v=" + getVersion(context) + "&" + query_string, listener, errorListener);
        queue.add(request);
    }

    /**
     * Get the Bible version (i.e., the translation) from the preferences of the user
     * @param context context to handle from
     * @return the version from the preferences
     */
    public static String getVersion(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getString(SettingsActivity.GeneralSettingsFragment.PREF_VERSION_BIBLE, context.getResources().getString(R.string.pref_version_bible_default));
    }

    /**
     * Get a passage from the API
     * @param context context to handle from
     * @param passage indicator for the passage, using English full book names (i.e. "Mark 7:13-18")
     * @param listener listener; passed on to Volley, for processing the result
     * @param errorListener errorListener for when some error occurs
     */
    public static void getPassage(Context context, String passage, final Response.Listener<String> listener, final Response.ErrorListener errorListener) {
        request(context, "p=" + URLEncoder.encode(passage), new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                // There are different types of API responses (one with a 'book' array, one without). We need to try both.
                StringBuilder passage = new StringBuilder();
                try {
                    JSONObject response = new JSONObject(s.substring(1, s.length() - 2));
                    JSONArray books = response.getJSONArray("book");
                    for (int b = 0; b < books.length(); b++) {
                        JSONObject chapter = books.getJSONObject(b).getJSONObject("chapter");

                        List<String> sortedKeys = new ArrayList<String>();
                        Iterator<?> verses = chapter.keys();
                        while (verses.hasNext()) {
                            String verse_number = (String) verses.next();
                            sortedKeys.add(verse_number);
                        }
                        Collections.sort(sortedKeys);
                        for (String verse_number : sortedKeys) {
                            JSONObject verse = chapter.getJSONObject(verse_number);
                            passage.append(verse.getString("verse")).append(" ");
                        }
                    }
                } catch (JSONException e) {
                    try {
                        JSONObject response = new JSONObject(s.substring(1, s.length() - 2));
                        JSONObject chapter = response.getJSONObject("chapter");

                        List<String> sortedKeys = new ArrayList<String>();
                        Iterator<?> verses = chapter.keys();
                        while (verses.hasNext()) {
                            String verse_number = (String) verses.next();
                            sortedKeys.add(verse_number);
                        }
                        Collections.sort(sortedKeys);
                        for (String verse_number : sortedKeys) {
                            JSONObject verse = chapter.getJSONObject(verse_number);
                            passage.append(verse.getString("verse")).append(" ");
                        }
                    } catch (JSONException e2) {
                        errorListener.onErrorResponse(null);
                    }
                }

                listener.onResponse(passage.toString());
            }
        }, errorListener);
    }

}