From 59e1132d3ead95af59428083b1cb05bdf6a4c0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20Norman=20Hauk=C3=A5s?= Date: Sat, 18 Apr 2015 22:58:48 +0200 Subject: [PATCH] Progressed. Getting closer to completing the contentprovider. --- .idea/misc.xml | 2 +- .../no/nilsnh/uibevents/ApplicationTest.java | 39 ++++++- .../java/no/nilsnh/uibevents/TestUtils.java | 33 ++++++ app/src/main/AndroidManifest.xml | 5 + .../java/no/nilsnh/uibevents/data/Event.java | 21 ++++ .../nilsnh/uibevents/data/EventContract.java | 23 ++-- .../nilsnh/uibevents/data/EventDbHelper.java | 104 +++++++++++++++--- .../nilsnh/uibevents/data/EventProvider.java | 3 +- app/src/main/res/values/strings.xml | 1 + 9 files changed, 198 insertions(+), 33 deletions(-) create mode 100644 app/src/androidTest/java/no/nilsnh/uibevents/TestUtils.java create mode 100644 app/src/main/java/no/nilsnh/uibevents/data/Event.java diff --git a/.idea/misc.xml b/.idea/misc.xml index e4a5fa4..e284b1d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,7 +13,7 @@ - + diff --git a/app/src/androidTest/java/no/nilsnh/uibevents/ApplicationTest.java b/app/src/androidTest/java/no/nilsnh/uibevents/ApplicationTest.java index 266caaf..098e3e1 100644 --- a/app/src/androidTest/java/no/nilsnh/uibevents/ApplicationTest.java +++ b/app/src/androidTest/java/no/nilsnh/uibevents/ApplicationTest.java @@ -1,21 +1,50 @@ package no.nilsnh.uibevents; import android.app.Application; +import android.content.ContentValues; +import android.test.AndroidTestCase; import android.test.ApplicationTestCase; +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; + import no.nilsnh.uibevents.data.EventContract; import no.nilsnh.uibevents.data.EventDbHelper; /** * Testing Fundamentals */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); +public class ApplicationTest extends AndroidTestCase { + public void setUp() {} + + public void testFetchFromApi() throws Throwable { + EventDbHelper db = new EventDbHelper(); + String result = db.fetchWebEventData(); + assertNotNull(result); } - public void testEventDb() throws Throwable { + public void testParseJsonEvent() { + ArrayList events = null; + try { + events = EventDbHelper.parseJsonEvents(TestUtils.getExampleJson()); + } catch (JSONException e) { + e.printStackTrace(); + } + assertTrue(events.size() == 2); + } + + public void testInsertIntoTextFile() { + ArrayList events = null; + try { + events = EventDbHelper.parseJsonEvents(TestUtils.getExampleJson()); + } catch (JSONException e) { + e.printStackTrace(); + } + getContext().getContentResolver() + .insert(EventContract.EventEntry.CONTENT_URI, events.get(0)); EventDbHelper db = new EventDbHelper(); - db.fetchWebEventData(); + assertTrue(db.getStoredData().contains(events.get(0))); } } \ No newline at end of file diff --git a/app/src/androidTest/java/no/nilsnh/uibevents/TestUtils.java b/app/src/androidTest/java/no/nilsnh/uibevents/TestUtils.java new file mode 100644 index 0000000..d948c38 --- /dev/null +++ b/app/src/androidTest/java/no/nilsnh/uibevents/TestUtils.java @@ -0,0 +1,33 @@ +package no.nilsnh.uibevents; + +public class TestUtils { + + public static String getExampleJson() { + return "{\n" + + " \"from_date\": \"2015-04-16T16:40:41+02:00\",\n" + + " \"events\": [\n" + + " {\n" + + " \"type\": \"exhibition\",\n" + + " \"title\": \" The Norwegian Constitution \\\"VI: 1814 - 2014\\\"\",\n" + + " \"date_from\": \"2014-05-11 22:00:00Z\",\n" + + " \"date_to\": \"2016-12-31 15:00:00Z\",\n" + + " \"location\": null,\n" + + " \"lead\": null,\n" + + " \"id\": 70450,\n" + + " \"path\": \"universitymuseum/70450/norwegian-constitution-vi-1814-2014\"\n" + + " },\n" + + " {\n" + + " \"type\": \"exhibition\",\n" + + " \"title\": \"Grunnlovsutstillingen \\\"Vi 1814-2014\\\"\",\n" + + " \"date_from\": \"2014-05-12 10:00:00Z\",\n" + + " \"date_to\": \"2016-12-31 11:00:00Z\",\n" + + " \"location\": \"De kulturhistoriske samlinger, Haakon Sheteligs plass 10\",\n" + + " \"lead\": \"En annerledes og nyskapende utstilling om demokrati for ungdom og voksne. \",\n" + + " \"id\": 48468,\n" + + " \"path\": \"grunnlovsjubileet2014/48468/grunnlovsutstillingen-vi-1814-2014\"\n" + + " }\n" + + " ]\n" + + "}"; + } + +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e76da8..d672f0d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,11 @@ + diff --git a/app/src/main/java/no/nilsnh/uibevents/data/Event.java b/app/src/main/java/no/nilsnh/uibevents/data/Event.java new file mode 100644 index 0000000..e4159e9 --- /dev/null +++ b/app/src/main/java/no/nilsnh/uibevents/data/Event.java @@ -0,0 +1,21 @@ +package no.nilsnh.uibevents.data; + +import android.content.ContentValues; +import android.net.Uri; + +import java.util.Date; + +public class Event { + + private String id; + private String type; + private String title; + private Date dateFrom; + private Date dateTo; + private String location; + private String details; + private Uri url; + + public Event(ContentValues values) { + } +} diff --git a/app/src/main/java/no/nilsnh/uibevents/data/EventContract.java b/app/src/main/java/no/nilsnh/uibevents/data/EventContract.java index eb907ca..bc1e46d 100644 --- a/app/src/main/java/no/nilsnh/uibevents/data/EventContract.java +++ b/app/src/main/java/no/nilsnh/uibevents/data/EventContract.java @@ -2,6 +2,7 @@ package no.nilsnh.uibevents.data; import android.content.ContentResolver; import android.content.ContentUris; +import android.content.ContentValues; import android.net.Uri; import android.provider.BaseColumns; @@ -13,25 +14,27 @@ public class EventContract { public static final String PATH_EVENT = "event"; public static final class EventEntry implements BaseColumns { - public static final Uri CONTENT_URI = BASE_CONTENT_URI; + public static final Uri CONTENT_URI = + BASE_CONTENT_URI.buildUpon().appendPath(PATH_EVENT).build(); public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_EVENT; public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_EVENT; - public static final Integer COLUMN_EVENT_ID = 1; - public static final Integer COLUMN_EVENT_TYPE = 2; - public static final Integer COLUMN_EVENT_TITLE = 3; - public static final Integer COLUMN_EVENT_DATE_FROM = 4; - public static final Integer COLUMN_EVENT_DATE_TO = 5; - public static final Integer COLUMN_EVENT_DATE_LOCATION = 6; - public static final Integer COLUMN_EVENT_DETAILS = 7; - public static final Integer COLUMN_EVENT_URL = 8; + public static final String TABLE_NAME = "event"; + + public static final String COLUMN_EVENT_ID = "id"; + public static final String COLUMN_EVENT_TYPE = "type"; + public static final String COLUMN_EVENT_TITLE = "title"; + public static final String COLUMN_EVENT_DATE_FROM = "date_from"; + public static final String COLUMN_EVENT_DATE_TO = "date_to"; + public static final String COLUMN_EVENT_LOCATION = "location"; + public static final String COLUMN_EVENT_DETAILS = "details"; + public static final String COLUMN_EVENT_URL = "url"; public static Uri buildEventUri(long id) { return ContentUris.withAppendedId(CONTENT_URI, id); } } - } diff --git a/app/src/main/java/no/nilsnh/uibevents/data/EventDbHelper.java b/app/src/main/java/no/nilsnh/uibevents/data/EventDbHelper.java index 5cafc6b..425414a 100644 --- a/app/src/main/java/no/nilsnh/uibevents/data/EventDbHelper.java +++ b/app/src/main/java/no/nilsnh/uibevents/data/EventDbHelper.java @@ -4,7 +4,9 @@ import android.content.ContentValues; import android.content.Context; import android.util.Log; +import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -17,6 +19,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; +import java.util.HashSet; public class EventDbHelper { @@ -34,7 +38,7 @@ public class EventDbHelper { this.ctx = context; } - public void fetchWebEventData() { + public String fetchWebEventData() { // These two need to be declared outside the try/catch // so that they can be closed in the finally block. HttpURLConnection urlConnection = null; @@ -55,7 +59,7 @@ public class EventDbHelper { StringBuffer buffer = new StringBuffer(); if (inputStream == null) { // Nothing to do. - return; + return eventJsonStr; } reader = new BufferedReader(new InputStreamReader(inputStream)); @@ -69,7 +73,7 @@ public class EventDbHelper { if (buffer.length() == 0) { // Stream was empty. No point in parsing. - return; + return eventJsonStr; } eventJsonStr = buffer.toString(); } catch (IOException e) { @@ -88,7 +92,36 @@ public class EventDbHelper { } } } - return; + return eventJsonStr; + } + + public static ArrayList parseJsonEvents(String data) throws JSONException { + ArrayList parsedEvents = new ArrayList<>(); + JSONArray events = new JSONObject(data).getJSONArray("events"); + for (int i = 0; i < events.length(); i++) { + JSONObject event = events.getJSONObject(i); + + Integer id = event.getInt("id"); + String type = event.getString("type"); + String title = event.getString("title"); + String date_from = event.getString("date_from"); + String date_to = event.getString("date_to"); + String location = event.getString("location"); + String details = event.getString("lead"); + String url = event.getString("path"); + + ContentValues cValues = new ContentValues(); + event.put(EventContract.EventEntry.COLUMN_EVENT_ID, id); + event.put(EventContract.EventEntry.COLUMN_EVENT_TYPE, type); + event.put(EventContract.EventEntry.COLUMN_EVENT_TITLE, title); + event.put(EventContract.EventEntry.COLUMN_EVENT_DATE_FROM, date_from); + event.put(EventContract.EventEntry.COLUMN_EVENT_DATE_TO, date_to); + event.put(EventContract.EventEntry.COLUMN_EVENT_LOCATION, location); + event.put(EventContract.EventEntry.COLUMN_EVENT_DETAILS, details); + event.put(EventContract.EventEntry.COLUMN_EVENT_URL, url); + parsedEvents.add(cValues); + } + return parsedEvents; } public void saveFile(String data) { @@ -104,40 +137,81 @@ public class EventDbHelper { } } - public String getStoredData() { + public ArrayList getStoredData() { File file = new File(filename); if(file.exists()){ - //Read text from file - StringBuilder text = new StringBuilder(); - + ArrayList eventStrings = new ArrayList<>(); try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; - while ((line = br.readLine()) != null) { - text.append(line); - text.append('n'); + eventStrings.add(line); } } catch (IOException e) { e.printStackTrace(); } - return text.toString(); + + String[] eventDetailsString = null; + ContentValues eventDetailsCValue = new ContentValues(); + ArrayList events = new ArrayList<>(); + for (String event: eventStrings) { + eventDetailsString = event.split(";"); + eventDetailsCValue.put("id", eventDetailsString[0]); + eventDetailsCValue.put("type", eventDetailsString[1]); + eventDetailsCValue.put("title", eventDetailsString[2]); + eventDetailsCValue.put("date_from", eventDetailsString[3]); + eventDetailsCValue.put("date_to", eventDetailsString[4]); + eventDetailsCValue.put("location", eventDetailsString[5]); + eventDetailsCValue.put("details", eventDetailsString[6]); + eventDetailsCValue.put("url", eventDetailsString[7]); + events.add(eventDetailsCValue); + } + return events; } else { - return "Was not able to find file"; + Log.d(LOG_TAG, "Was not able to find file"); + return null; } } public Long insert(ContentValues values) { + File file = new File(ctx.getFilesDir(),filename); + //First retrieve all data,then check if the value is already stored. + ArrayList storedValues = getStoredData(); + + //If no data exist already create new arrayList + if (storedValues == null) storedValues = new ArrayList<>(); + + //If the new data is already there stop execution. + if (storedValues.contains(values)) return null; + + storedValues.add(values); + Integer storedDataPosition = storedValues.indexOf(values); + + //Write new data to textFile try { + + if (!file.exists()) file.createNewFile(); + BufferedWriter buf = new BufferedWriter(new FileWriter(filename, true)); + for (ContentValues event : storedValues) { + buf.write(event.getAsString("id") + ";"); + buf.write(event.getAsString("type") + ";"); + buf.write(event.getAsString("title") + ";"); + buf.write(event.getAsString("date_from") + ";"); + buf.write(event.getAsString("date_to") + ";"); + buf.write(event.getAsString("location") + ";"); + buf.write(event.getAsString("details") + ";"); + buf.write(event.getAsString("url")); + buf.newLine(); + } + buf.close(); } catch (IOException e) { e.printStackTrace(); } - - return null; + return Long.valueOf(storedDataPosition); } } diff --git a/app/src/main/java/no/nilsnh/uibevents/data/EventProvider.java b/app/src/main/java/no/nilsnh/uibevents/data/EventProvider.java index bdf7ffd..82949f3 100644 --- a/app/src/main/java/no/nilsnh/uibevents/data/EventProvider.java +++ b/app/src/main/java/no/nilsnh/uibevents/data/EventProvider.java @@ -6,13 +6,12 @@ import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; -public class EventProvider extends ContentProvider{ +public class EventProvider extends ContentProvider { private EventDbHelper eventDbHelper; private static final UriMatcher sUriMatcher = buildUriMatcher(); static final int EVENT = 100; - @Override public boolean onCreate() { eventDbHelper = new EventDbHelper(getContext()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58e04b2..2d1038e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,4 +3,5 @@ Hello world! Settings + no.nilsnh.uibevents