From 8e8b31a71aa896cfb5e63dafe4946799695c13ef Mon Sep 17 00:00:00 2001
From: Idelcano
Date: Tue, 2 May 2017 18:50:09 +0200
Subject: [PATCH 01/69] Added inteceptor and cache config to okhttpclient
instance to save and be able to display the cached images
---
.../dashboard/api/utils/PicassoProvider.java | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
index 03fb8567..574f008f 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
@@ -30,13 +30,18 @@
import android.content.Context;
+import com.squareup.okhttp.Cache;
+import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Response;
import com.squareup.picasso.OkHttpDownloader;
import com.squareup.picasso.Picasso;
import org.hisp.dhis.android.dashboard.api.controllers.DhisController;
import org.hisp.dhis.android.dashboard.api.network.RepoManager;
+import java.io.IOException;
+
public final class PicassoProvider {
private static Picasso mPicasso;
@@ -49,6 +54,16 @@ public static Picasso getInstance(Context context) {
OkHttpClient client = RepoManager.provideOkHttpClient(
DhisController.getInstance().getUserCredentials());
+ client.networkInterceptors().add(new Interceptor() {
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Response originalResponse = chain.proceed(chain.request());
+ return originalResponse.newBuilder().header("Cache-Control", "max-age=" + (60 * 60 * 24 * 365)).build();
+ }
+ });
+
+ client.setCache(new Cache(context.getCacheDir(), Integer.MAX_VALUE));
+
mPicasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(client))
.build();
From 787d4ff9dc8c295eaefc363dc85345a65a887d98 Mon Sep 17 00:00:00 2001
From: Idelcano
Date: Thu, 4 May 2017 09:42:04 +0200
Subject: [PATCH 02/69] fix typo
---
.../org/hisp/dhis/android/dashboard/api/models/UserAccount.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UserAccount.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UserAccount.java
index 182185cf..6e4f4a2a 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UserAccount.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UserAccount.java
@@ -151,7 +151,7 @@ public static User toUser(UserAccount userAccount) {
User user = new User();
user.setUId(userAccount.getUId());
user.setAccess(userAccount.getAccess());
- user.setCreated(user.getCreated());
+ user.setCreated(userAccount.getCreated());
user.setLastUpdated(userAccount.getLastUpdated());
user.setName(userAccount.getName());
user.setDisplayName(userAccount.getDisplayName());
From 50973afec0fb0a40edd779e31c83d98c58c97ae2 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Fri, 5 May 2017 02:41:41 +0200
Subject: [PATCH 03/69] Added TextUtil test and gradle dependencies
---
app/build.gradle | 3 +++
app/src/test/java/TextUtilsTest.java | 17 +++++++++++++++++
2 files changed, 20 insertions(+)
create mode 100644 app/src/test/java/TextUtilsTest.java
diff --git a/app/build.gradle b/app/build.gradle
index 59656a3e..3058b6e9 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -43,4 +43,7 @@ dependencies {
// Other
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.github.chrisbanes.photoview:library:1.2.4'
+
+ // Java test dependencies
+ testCompile "junit:junit:4.10"
}
diff --git a/app/src/test/java/TextUtilsTest.java b/app/src/test/java/TextUtilsTest.java
new file mode 100644
index 00000000..8fff2c09
--- /dev/null
+++ b/app/src/test/java/TextUtilsTest.java
@@ -0,0 +1,17 @@
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.dashboard.utils.TextUtils;
+import org.junit.Test;
+
+public class TextUtilsTest {
+
+ @Test
+ public void test_empty_string_is_empty() {
+ assertTrue(TextUtils.isEmpty(""));
+ }
+
+ @Test
+ public void test_null_string_is_empty() {
+ assertTrue(TextUtils.isEmpty(null));
+ }
+}
From b5a8335ebf45e489e06a7c770754615e11376692 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Fri, 5 May 2017 02:42:05 +0200
Subject: [PATCH 04/69] Added test dependencies into api gradle
---
api/build.gradle | 3 +++
1 file changed, 3 insertions(+)
diff --git a/api/build.gradle b/api/build.gradle
index 14b5bbb3..158c896d 100755
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -47,4 +47,7 @@ dependencies {
// Other
compile 'joda-time:joda-time:2.9.2'
+
+ // Java test dependencies
+ testCompile "junit:junit:4.12"
}
From 365ab57448e362c7748f8223676e77eda88832d3 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Fri, 5 May 2017 02:50:15 +0200
Subject: [PATCH 05/69] Added api tests
---
.../dhis/android/core/PreconditionsTests.java | 18 ++
.../android/core/commons/DateTestUtils.java | 27 ++
.../dhis/android/core/commons/JsonParser.java | 15 +
.../core/converters/AccessConverterTests.java | 55 ++++
.../converters/DateTimeConverterTests.java | 51 ++++
.../core/converters/StateConverterTests.java | 56 ++++
.../core/dashboard/DashboardTests.java | 258 ++++++++++++++++++
.../interpretation/InterpretationTests.java | 238 ++++++++++++++++
.../android/core/meta/CredentialsTests.java | 27 ++
.../core/network/ApiExceptionTests.java | 75 +++++
.../core/systeminfo/SystemInfoTests.java | 60 ++++
.../dhis/android/core/user/UserTests.java | 81 ++++++
12 files changed, 961 insertions(+)
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java b/api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java
new file mode 100644
index 00000000..d6e851a6
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java
@@ -0,0 +1,18 @@
+package org.hisp.dhis.android.core;
+
+import org.hisp.dhis.android.dashboard.api.utils.Preconditions;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class PreconditionsTests {
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void precondition_null_exception() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("test_message");
+ Preconditions.isNull(null, "test_message");
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java b/api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java
new file mode 100644
index 00000000..f71391da
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java
@@ -0,0 +1,27 @@
+package org.hisp.dhis.android.core.commons;
+
+import org.joda.time.DateTime;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateTestUtils {
+ public final static String DHIS2_GMT_NEW_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+
+ public static Date parseDate(String date, String format) {
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat(format);
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ return sdf.parse(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static boolean compareParsedDateWithStringDate(DateTime date, String isDate) {
+ return date.toDate().getTime() == (parseDate(isDate, DHIS2_GMT_NEW_DATE_FORMAT).getTime());
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java b/api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java
new file mode 100644
index 00000000..7a586257
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java
@@ -0,0 +1,15 @@
+package org.hisp.dhis.android.core.commons;
+
+import org.hisp.dhis.android.dashboard.api.utils.ObjectMapperProvider;
+
+import java.io.IOException;
+
+public class JsonParser {
+
+
+ public static Object getModelFromJson(Class modelClass, String json) throws IOException {
+ return ObjectMapperProvider.getInstance()
+ .readValue(json, modelClass);
+ }
+
+}
\ No newline at end of file
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java b/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
new file mode 100644
index 00000000..a7476282
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
@@ -0,0 +1,55 @@
+package org.hisp.dhis.android.core.converters;
+
+import static junit.framework.Assert.assertTrue;
+
+import org.hisp.dhis.android.dashboard.api.models.Access;
+import org.hisp.dhis.android.dashboard.api.persistence.converters.AccessConverter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AccessConverterTests {
+ public static final String ACCESS_ALL_TRUE_AS_DATABASE_STRING = "{\"manage\":true,"
+ + "\"externalize\":true,\"write\":true,\"read\":true,\"update\":true,\"delete\":true}";
+ public static final String ACCESS_ALL_FALSE_AS_DATABASE_STRING = "{\"manage\":false,"
+ + "\"externalize\":false,\"write\":false,\"read\":false,\"update\":false,"
+ + "\"delete\":false}";
+ public static Access accessObject;
+ AccessConverter accessConverter = new AccessConverter();
+
+ @Before
+ public void setUp() throws Exception {
+ accessObject = new Access();
+ accessObject.setDelete(true);
+ accessObject.setWrite(true);
+ accessObject.setUpdate(true);
+ accessObject.setRead(true);
+ accessObject.setManage(true);
+ accessObject.setExternalize(true);
+ }
+
+ @Test
+ public void convert_access_object_to_database_string() throws Exception {
+ assertTrue(accessConverter.getDBValue(accessObject).equals(
+ ACCESS_ALL_TRUE_AS_DATABASE_STRING));
+ }
+
+ @Test
+ public void convert_access_all_true_database_string_to_model() {
+ Access access = accessConverter.getModelValue(ACCESS_ALL_TRUE_AS_DATABASE_STRING);
+ assertTrue(access.isDelete());
+ assertTrue(access.isRead());
+ assertTrue(access.isWrite());
+ assertTrue(access.isManage());
+ assertTrue(access.isExternalize());
+ }
+
+ @Test
+ public void convert_access_all_false_database_string_to_model() {
+ Access access = accessConverter.getModelValue(ACCESS_ALL_FALSE_AS_DATABASE_STRING);
+ assertTrue(!access.isDelete());
+ assertTrue(!access.isRead());
+ assertTrue(!access.isWrite());
+ assertTrue(!access.isManage());
+ assertTrue(!access.isExternalize());
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java b/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
new file mode 100644
index 00000000..09050c6d
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
@@ -0,0 +1,51 @@
+package org.hisp.dhis.android.core.converters;
+
+import static junit.framework.Assert.assertTrue;
+
+import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.dashboard.api.persistence.converters.DateTimeConverter;
+import org.joda.time.DateTime;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+
+public class DateTimeConverterTests {
+
+ public static final String DATETIME_AS_STRING = "2016-04-21T15:37:07.740Z";
+ public static final String STATE_TO_POST = "TO_POST";
+
+ DateTimeConverter dateTimeConverter = new DateTimeConverter();
+
+ DateTime dateTime;
+
+ @Before
+ public void setUp() throws Exception {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
+ calendar.set(Calendar.YEAR, 2016);
+ calendar.set(Calendar.MONTH, 04);
+ calendar.set(Calendar.DAY_OF_MONTH, 21);
+ calendar.set(Calendar.HOUR_OF_DAY, 15);
+ calendar.set(Calendar.MINUTE, 37);
+ calendar.set(Calendar.SECOND, 07);
+ calendar.set(Calendar.MILLISECOND, 740);
+ dateTime = new DateTime(calendar);
+ }
+
+ @Test
+ public void convert_datetime_string_to_object() throws Exception {
+ DateTime convertedDate = dateTimeConverter.getModelValue(DATETIME_AS_STRING);
+
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(convertedDate, DATETIME_AS_STRING));
+ }
+
+ @Test
+ public void convert_datetime_object_to_string() throws Exception {
+ String converterDate = dateTimeConverter.getDBValue(dateTime);
+
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dateTime, converterDate));
+ }
+
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java b/api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java
new file mode 100644
index 00000000..7368763f
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java
@@ -0,0 +1,56 @@
+package org.hisp.dhis.android.core.converters;
+
+import static junit.framework.Assert.assertTrue;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.State;
+import org.hisp.dhis.android.dashboard.api.persistence.converters.StateConverter;
+import org.junit.Test;
+
+public class StateConverterTests {
+ public static final String STATE_SYNCED = "SYNCED";
+ public static final String STATE_TO_POST = "TO_POST";
+ public static final String STATE_TO_UPDATE = "TO_UPDATE";
+ public static final String STATE_TO_DELETE = "TO_DELETE";
+
+ StateConverter stateConverter = new StateConverter();
+
+ @Test
+ public void convert_state_to_post_string_to_object() throws Exception {
+ assertTrue(stateConverter.getModelValue(STATE_TO_POST).equals(State.TO_POST));
+ }
+
+ @Test
+ public void convert_state_to_post_object_to_string() throws Exception {
+ assertTrue(stateConverter.getDBValue(State.TO_POST).equals(STATE_TO_POST));
+ }
+
+ @Test
+ public void convert_state_to_delete_string_to_object() throws Exception {
+ assertTrue(stateConverter.getModelValue(STATE_TO_DELETE).equals(State.TO_DELETE));
+ }
+
+ @Test
+ public void convert_state_to_delete_object_to_string() throws Exception {
+ assertTrue(stateConverter.getDBValue(State.TO_DELETE).equals(STATE_TO_DELETE));
+ }
+
+ @Test
+ public void convert_state_to_update_string_to_object() throws Exception {
+ assertTrue(stateConverter.getModelValue(STATE_TO_UPDATE).equals(State.TO_UPDATE));
+ }
+
+ @Test
+ public void convert_state_to_update_object_to_string() throws Exception {
+ assertTrue(stateConverter.getDBValue(State.TO_UPDATE).equals(STATE_TO_UPDATE));
+ }
+
+ @Test
+ public void convert_state_synced_string_to_object() throws Exception {
+ assertTrue(stateConverter.getModelValue(STATE_SYNCED).equals(State.SYNCED));
+ }
+
+ @Test
+ public void convert_state_synced_object_to_string() throws Exception {
+ assertTrue(stateConverter.getDBValue(State.SYNCED).equals(STATE_SYNCED));
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java b/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
new file mode 100644
index 00000000..821f950e
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
@@ -0,0 +1,258 @@
+package org.hisp.dhis.android.core.dashboard;
+
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.JsonParser;
+import org.hisp.dhis.android.dashboard.api.models.Access;
+import org.hisp.dhis.android.dashboard.api.models.Dashboard;
+import org.hisp.dhis.android.dashboard.api.models.DashboardElement;
+import org.hisp.dhis.android.dashboard.api.models.DashboardItem;
+import org.hisp.dhis.android.dashboard.api.models.meta.State;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DashboardTests {
+ private final String DASHBOARD_JSON = "[{\n"
+ + "\t\t\"lastUpdated\": \"2016-10-11T19:24:33.599\",\n"
+ + "\t\t\"created\": \"2013-09-08T21:47:17.960\",\n"
+ + "\t\t\"name\": \"Antenatal Care\",\n"
+ + "\t\t\"id\": \"nghVC4wtyzi\",\n"
+ + "\t\t\"displayName\": \"Antenatal Care\",\n"
+ + "\t\t\"access\": {\n"
+ + "\t\t\t\"read\": true,\n"
+ + "\t\t\t\"update\": true,\n"
+ + "\t\t\t\"externalize\": true,\n"
+ + "\t\t\t\"delete\": true,\n"
+ + "\t\t\t\"write\": true,\n"
+ + "\t\t\t\"manage\": true\n"
+ + "\t\t},\n"
+ + "\t\t\"dashboardItems\": [{\n"
+ + "\t\t\t\"created\": \"2016-10-10T17:24:30.487\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-10-10T17:24:30.487\",\n"
+ + "\t\t\t\"id\": \"cX2przhv9UC\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2016-10-10T17:24:49.196\",\n"
+ + "\t\t\t\t\"created\": \"2016-10-10T17:24:49.196\",\n"
+ + "\t\t\t\t\"name\": \"ANC: ANC IPT 1 Coverage last 12 months districts\",\n"
+ + "\t\t\t\t\"id\": \"VffWmdKFHSq\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: ANC IPT 1 Coverage last 12 months districts\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2016-08-02T11:57:55.229\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-08-02T11:57:55.229\",\n"
+ + "\t\t\t\"id\": \"JcO7yJlKIa3\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2016-10-10T17:08:15.277\",\n"
+ + "\t\t\t\t\"created\": \"2016-10-10T17:08:15.277\",\n"
+ + "\t\t\t\t\"name\": \"ANC: ANC 3 coverage by districts last 4 quarters\",\n"
+ + "\t\t\t\t\"id\": \"CNkMibmx1Zr\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: ANC 3 coverage by districts last 4 quarters\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2015-01-16T11:52:44.928\",\n"
+ + "\t\t\t\"lastUpdated\": \"2015-01-16T11:52:44.928\",\n"
+ + "\t\t\t\"id\": \"OiyMNoXzSdY\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"MAP\",\n"
+ + "\t\t\t\"map\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2013-09-09T16:35:12.062\",\n"
+ + "\t\t\t\t\"created\": \"2012-11-14T12:56:59.322\",\n"
+ + "\t\t\t\t\"name\": \"ANC: LLITN coverage district and facility\",\n"
+ + "\t\t\t\t\"id\": \"ZBjCfSaLSqD\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: LLITN coverage district and facility\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2016-04-21T15:37:07.740\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-04-21T15:37:07.740\",\n"
+ + "\t\t\t\"id\": \"i6NTSuDsk6l\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"MAP\",\n"
+ + "\t\t\t\"map\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2016-10-10T18:16:43.265\",\n"
+ + "\t\t\t\t\"created\": \"2016-10-10T18:16:43.261\",\n"
+ + "\t\t\t\t\"name\": \"ANC: IPT 2 Coverage this year\",\n"
+ + "\t\t\t\t\"id\": \"voX07ulo2Bq\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: IPT 2 Coverage this year\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2015-01-15T16:50:51.427\",\n"
+ + "\t\t\t\"lastUpdated\": \"2015-08-09T22:10:20.307\",\n"
+ + "\t\t\t\"id\": \"YZ7U25Japom\",\n"
+ + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.004\",\n"
+ + "\t\t\t\t\"created\": \"2015-01-15T16:50:34.302\",\n"
+ + "\t\t\t\t\"name\": \"ANC: ANC 1 coverage western chiefdoms this year\",\n"
+ + "\t\t\t\t\"id\": \"zKl0LcQyxPl\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: ANC 1 coverage western chiefdoms this year\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2016-08-02T11:57:59.474\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-10-10T17:11:06.823\",\n"
+ + "\t\t\t\"id\": \"UQeYhQOJ2f1\",\n"
+ + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2016-08-02T11:58:28.517\",\n"
+ + "\t\t\t\t\"created\": \"2016-08-02T11:53:53.607\",\n"
+ + "\t\t\t\t\"name\": \"ANC: IPT 1 Coverage by districts last 4 quarters\",\n"
+ + "\t\t\t\t\"id\": \"DHPu0vtZ2mW\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: IPT 1 Coverage by districts last 4 quarters\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2014-04-03T14:11:10.942\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-10-11T09:29:40.874\",\n"
+ + "\t\t\t\"id\": \"xS4X0ZL6GCI\",\n"
+ + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.312\",\n"
+ + "\t\t\t\t\"created\": \"2014-04-03T14:07:29.442\",\n"
+ + "\t\t\t\t\"name\": \"ANC: Fixed vs Outreach last year\",\n"
+ + "\t\t\t\t\"id\": \"AVZpYsdG44G\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: Fixed vs Outreach last year\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2016-10-11T19:24:21.931\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-10-11T19:24:21.931\",\n"
+ + "\t\t\t\"id\": \"ZF9vWMXob7N\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"MAP\",\n"
+ + "\t\t\t\"map\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2016-10-11T19:23:49.953\",\n"
+ + "\t\t\t\t\"created\": \"2016-10-11T19:23:49.952\",\n"
+ + "\t\t\t\t\"name\": \"ANC: ANC 1 coverage Sierra Leone dark basemap\",\n"
+ + "\t\t\t\t\"id\": \"qTfO4YkQ9xW\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: ANC 1 coverage Sierra Leone dark basemap\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}, {\n"
+ + "\t\t\t\"created\": \"2014-04-03T14:09:47.075\",\n"
+ + "\t\t\t\"lastUpdated\": \"2016-10-11T09:19:35.442\",\n"
+ + "\t\t\t\"id\": \"kHRSFUr3dYe\",\n"
+ + "\t\t\t\"shape\": \"NORMAL\",\n"
+ + "\t\t\t\"type\": \"CHART\",\n"
+ + "\t\t\t\"chart\": {\n"
+ + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.315\",\n"
+ + "\t\t\t\t\"created\": \"2014-04-03T14:09:05.734\",\n"
+ + "\t\t\t\t\"name\": \"ANC: 4+ visits by Facility Type last year\",\n"
+ + "\t\t\t\t\"id\": \"ZfQMIA4o2s3\",\n"
+ + "\t\t\t\t\"displayName\": \"ANC: 4+ visits by Facility Type last year\"\n"
+ + "\t\t\t}\n"
+ + "\t\t}]\n"
+ + "\t}]";
+
+ @Test
+ public void dashboard_shouldMapFromJsonString() throws IOException {
+ Dashboard dashboard = getDashboardsFromJson();
+ assertTrue(dashboard.getState().equals(State.SYNCED));
+ assertTrue(dashboard.getUId().equals("nghVC4wtyzi"));
+ assertTrue(dashboard.getName().equals("Antenatal Care"));
+ assertTrue(dashboard.getDisplayName().equals("Antenatal Care"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboard.getCreated(),
+ "2013-09-08T21:47:17.960"));
+ assertTrue(dashboard.getDashboardItems().size() == 9);
+ }
+
+ @Test
+ public void dashboard_access_shouldMapFromJsonString() throws IOException {
+ Dashboard dashboard = getDashboardsFromJson();
+ Access access = dashboard.getAccess();
+ assertTrue(access.isManage() == true);
+ assertTrue(access.isExternalize() == true);
+ assertTrue(access.isWrite() == true);
+ assertTrue(access.isRead() == true);
+ assertTrue(access.isUpdate() == true);
+ assertTrue(access.isDelete() == true);
+ }
+
+ @Test
+ public void dashboard_item_type_chart_shouldMapFromJsonString() throws IOException {
+ DashboardItem dashboardItem = getDashboardItemWithChart();
+ assertTrue(dashboardItem.getName() == null);
+ assertTrue(dashboardItem.getDisplayName() == null);
+ assertTrue(dashboardItem.getState() == State.SYNCED);
+ assertTrue(dashboardItem.getEventChart() == null);
+ assertTrue(dashboardItem.getEventReport() == null);
+ assertTrue(dashboardItem.getUsers() == null);
+ assertTrue(dashboardItem.getReports() == null);
+ assertTrue(dashboardItem.getResources() == null);
+ assertTrue(dashboardItem.isMessages() == false);
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getCreated(),
+ "2016-10-10T17:24:30.487"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getLastUpdated(),
+ "2016-10-10T17:24:30.487"));
+ assertTrue(dashboardItem.getUId().equals("cX2przhv9UC"));
+ assertTrue(dashboardItem.getShape().equals("NORMAL"));
+ assertTrue(dashboardItem.getType().equals("CHART"));
+ assertTrue(dashboardItem.getAccess() == null);
+
+ DashboardElement dashboardElement = dashboardItem.getChart();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getLastUpdated(),
+ "2016-10-10T17:24:49.196"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getCreated(),
+ "2016-10-10T17:24:49.196"));
+ assertTrue(dashboardElement.getName().equals(
+ "ANC: ANC IPT 1 Coverage last 12 months districts"));
+ assertTrue(dashboardElement.getUId().equals("VffWmdKFHSq"));
+ assertTrue(dashboardElement.getDisplayName().equals(
+ "ANC: ANC IPT 1 Coverage last 12 months districts"));
+ }
+
+ @Test
+ public void dashboard_item_type_map_shouldMapFromJsonString() throws IOException {
+ DashboardItem dashboardItem = getDashboardItemWithMap();
+ assertTrue(dashboardItem.getName() == null);
+ assertTrue(dashboardItem.getDisplayName() == null);
+ assertTrue(dashboardItem.getState() == State.SYNCED);
+ assertTrue(dashboardItem.getEventChart() == null);
+ assertTrue(dashboardItem.getEventReport() == null);
+ assertTrue(dashboardItem.getUsers() == null);
+ assertTrue(dashboardItem.getReports() == null);
+ assertTrue(dashboardItem.getResources() == null);
+ assertTrue(dashboardItem.isMessages() == false);
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getCreated(),
+ "2015-01-16T11:52:44.928"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getLastUpdated(),
+ "2015-01-16T11:52:44.928"));
+ assertTrue(dashboardItem.getUId().equals("OiyMNoXzSdY"));
+ assertTrue(dashboardItem.getShape().equals("NORMAL"));
+ assertTrue(dashboardItem.getType().equals("MAP"));
+ assertTrue(dashboardItem.getAccess() == null);
+ DashboardElement dashboardElement = dashboardItem.getMap();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getLastUpdated(),
+ "2013-09-09T16:35:12.062"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getCreated(),
+ "2012-11-14T12:56:59.322"));
+ assertTrue(dashboardElement.getName().equals("ANC: LLITN coverage district and facility"));
+ assertTrue(dashboardElement.getUId().equals("ZBjCfSaLSqD"));
+ assertTrue(dashboardElement.getDisplayName().equals(
+ "ANC: LLITN coverage district and facility"));
+ }
+
+ private DashboardItem getDashboardItemWithChart() throws IOException {
+ Dashboard dashboard = getDashboardsFromJson();
+ List dashboardItems = dashboard.getDashboardItems();
+ return dashboardItems.get(0);
+ }
+
+ private DashboardItem getDashboardItemWithMap() throws IOException {
+ Dashboard dashboard = getDashboardsFromJson();
+ List dashboardItems = dashboard.getDashboardItems();
+ return dashboardItems.get(2);
+ }
+
+ private Dashboard getDashboardsFromJson() throws IOException {
+ Dashboard[] dashboards = (Dashboard[]) JsonParser.getModelFromJson(Dashboard[].class,
+ DASHBOARD_JSON);
+ return dashboards[0];
+ }
+
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java b/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
new file mode 100644
index 00000000..2b4e25c1
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
@@ -0,0 +1,238 @@
+package org.hisp.dhis.android.core.interpretation;
+
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.JsonParser;
+import org.hisp.dhis.android.dashboard.api.models.Access;
+import org.hisp.dhis.android.dashboard.api.models.Interpretation;
+import org.hisp.dhis.android.dashboard.api.models.InterpretationComment;
+import org.hisp.dhis.android.dashboard.api.models.InterpretationElement;
+import org.hisp.dhis.android.dashboard.api.models.User;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class InterpretationTests {
+
+ private static final String INTERPRETATION_JSON = "{\n"
+ + "\n"
+ + " \"created\": \"2017-10-21T10:10:43.451\",\n"
+ + " \"lastUpdated\": \"2017-10-21T10:10:43.451\",\n"
+ + " \"name\": \"BR11Oy1Q4yR\",\n"
+ + " \"id\": \"BR11Oy1Q4yR\",\n"
+ + " \"displayName\": \"BR11Oy1Q4yR\",\n"
+ + " \"type\": \"CHART\",\n"
+ + " \"text\": \"This chart shows that BCG doses is low for 2014, why is that?\",\n"
+ + " \"access\": {\n"
+ + " \"read\": true,\n"
+ + " \"update\": true,\n"
+ + " \"externalize\": false,\n"
+ + " \"delete\": true,\n"
+ + " \"write\": true,\n"
+ + " \"manage\": true\n"
+ + " },\n"
+ + " \"chart\": {\n"
+ + " \"lastUpdated\": \"2015-07-15T15:25:20.264\",\n"
+ + " \"created\": \"2013-05-29T12:52:54.560\",\n"
+ + " \"name\": \"Immunization: BCG, Measles, YF doses comparison\",\n"
+ + " \"id\": \"R9A0rvAydpn\",\n"
+ + " \"displayName\": \"Immunization: BCG, Measles, YF doses comparison\"\n"
+ + " },\n"
+ + " \"user\": {\n"
+ + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
+ + " \"created\": \"2013-04-18T17:15:08.407\",\n"
+ + " \"name\": \"John Traore\",\n"
+ + " \"id\": \"xE7jOejl9FI\",\n"
+ + " \"displayName\": \"John Traore\"\n"
+ + " },\n"
+ + " \"comments\": [\n"
+ + " {\n"
+ + " \"lastUpdated\": \"2014-10-21T10:11:19.537\",\n"
+ + " \"created\": \"2014-10-21T10:11:19.537\",\n"
+ + " \"id\": \"Eg7x5Kt2XgV\",\n"
+ + " \"text\": \"It might be caused by a stock-out of vaccines.\",\n"
+ + " \"user\": {\n"
+ + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
+ + " \"created\": \"2013-04-18T17:15:08.407\",\n"
+ + " \"name\": \"John Traore\",\n"
+ + " \"id\": \"xE7jOejl9FI\",\n"
+ + " \"displayName\": \"John Traore\"\n"
+ + " }\n"
+ + " },\n"
+ + " {\n"
+ + " \"lastUpdated\": \"2014-10-21T10:11:44.325\",\n"
+ + " \"created\": \"2014-10-21T10:11:44.325\",\n"
+ + " \"id\": \"oRmqfmnCLsQ\",\n"
+ + " \"text\": \"Yes I believe so\",\n"
+ + " \"user\": {\n"
+ + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
+ + " \"created\": \"2013-04-18T17:15:08.407\",\n"
+ + " \"name\": \"John Traore\",\n"
+ + " \"id\": \"xE7jOejl9FI\",\n"
+ + " \"displayName\": \"John Traore\"\n"
+ + " }\n"
+ + " }\n"
+ + " ]\n"
+ + "\n"
+ + "}";
+
+ @Test
+ public void interpretation_shouldMapFromJsonString() throws IOException {
+ Interpretation interpretation = getInterpretationFromJson();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretation.getCreated(),
+ "2017-10-21T10:10:43.451"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretation.getLastUpdated(),
+ "2017-10-21T10:10:43.451"));
+ assertTrue(interpretation.getName().equals("BR11Oy1Q4yR"));
+ assertTrue(interpretation.getUId().equals("BR11Oy1Q4yR"));
+ assertTrue(interpretation.getDisplayName().equals("BR11Oy1Q4yR"));
+ assertTrue(interpretation.getType().equals("CHART"));
+ assertTrue(interpretation.getText().equals(
+ "This chart shows that BCG doses is low for 2014, why is that?"));
+ Access access = getAccessObject();
+ assertTrue(interpretation.getAccess().isDelete() == access.isDelete());
+ assertTrue(interpretation.getAccess().isExternalize() == access.isExternalize());
+ assertTrue(interpretation.getAccess().isManage() == access.isManage());
+ assertTrue(interpretation.getAccess().isRead() == access.isRead());
+ assertTrue(interpretation.getAccess().isWrite() == access.isWrite());
+ }
+
+ @Test
+ public void interpretation_chart_shouldMapFromJsonString() throws IOException {
+ Interpretation interpretation = getInterpretationFromJson();
+ InterpretationElement interpretationElement = interpretation.getChart();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationElement
+ .getCreated(), "2013-05-29T12:52:54.560"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationElement
+ .getLastUpdated(), "2015-07-15T15:25:20.264"));
+ assertTrue(interpretationElement.getName().equals(
+ "Immunization: BCG, Measles, YF doses comparison"));
+ assertTrue(interpretationElement.getUId().equals("R9A0rvAydpn"));
+ assertTrue(interpretationElement.getDisplayName().equals(
+ "Immunization: BCG, Measles, YF doses comparison"));
+ assertTrue(interpretationElement.getType() == null);
+ assertTrue(interpretationElement.getAccess() == null);
+ }
+
+ @Test
+ public void interpretation_user_shouldMapFromJsonString() throws IOException {
+ Interpretation interpretation = getInterpretationFromJson();
+ User user = interpretation.getUser();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user
+ .getCreated(), "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user
+ .getLastUpdated(), "2017-01-19T14:24:04.447"));
+ assertTrue(user.getName().equals(
+ "John Traore"));
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getDisplayName().equals(
+ "John Traore"));
+ }
+
+ @Test
+ public void interpretation_first_comment_shouldMapFromJsonString() throws IOException {
+ InterpretationComment interpretationComment = getFirstCommentFromInterpretationJson();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationComment.getCreated(),
+ "2014-10-21T10:11:19.537"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(
+ interpretationComment.getLastUpdated(),
+ "2014-10-21T10:11:19.537"));
+ assertTrue(interpretationComment.getUId().equals("Eg7x5Kt2XgV"));
+ assertTrue(interpretationComment.getText().equals(
+ "It might be caused by a stock-out of vaccines."));
+ }
+
+ @Test
+ public void interpretation_second_comment_shouldMapFromJsonString() throws IOException {
+ InterpretationComment interpretationComment = getSecondCommentFromInterpretationJson();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationComment.getCreated(),
+ "2014-10-21T10:11:44.325"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(
+ interpretationComment.getLastUpdated(),
+ "2014-10-21T10:11:44.325"));
+ assertTrue(interpretationComment.getUId().equals("oRmqfmnCLsQ"));
+ assertTrue(interpretationComment.getText().equals("Yes I believe so"));
+ }
+
+ @Test
+ public void interpretation_comments_first_user_shouldMapFromJsonString() throws IOException {
+ User user = getUserFromInterpretationJsonFirstComment();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
+ "2017-01-19T14:24:04.447"));
+ assertTrue(user.getName().equals("John Traore"));
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getDisplayName().equals("John Traore"));
+
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
+ "2017-01-19T14:24:04.447"));
+ assertTrue(user.getName().equals("John Traore"));
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getDisplayName().equals("John Traore"));
+ }
+
+ @Test
+ public void interpretation_comments_second_user_shouldMapFromJsonString() throws IOException {
+ User user = getUserFromInterpretationJsonSecondComment();
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
+ "2017-01-19T14:24:04.447"));
+ assertTrue(user.getName().equals("John Traore"));
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getDisplayName().equals("John Traore"));
+
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
+ "2017-01-19T14:24:04.447"));
+ assertTrue(user.getName().equals("John Traore"));
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getDisplayName().equals("John Traore"));
+ }
+
+ private User getUserFromInterpretationJsonSecondComment() throws IOException {
+ Interpretation interpretation = getInterpretationFromJson();
+ InterpretationComment interpretationComment = interpretation.getComments().get(1);
+ return interpretationComment.getUser();
+ }
+
+ private InterpretationComment getFirstCommentFromInterpretationJson() throws IOException {
+ return getInterpretationComment(0);
+ }
+
+ private InterpretationComment getSecondCommentFromInterpretationJson() throws IOException {
+ return getInterpretationComment(1);
+ }
+
+ private InterpretationComment getInterpretationComment(int index) throws IOException {
+ Interpretation interpretation = getInterpretationFromJson();
+ return interpretation.getComments().get(index);
+ }
+
+ private User getUserFromInterpretationJsonFirstComment() throws IOException {
+ InterpretationComment interpretationComment =
+ getFirstCommentFromInterpretationJson();
+ return interpretationComment.getUser();
+ }
+
+ private Interpretation getInterpretationFromJson() throws IOException {
+ return (Interpretation) JsonParser.getModelFromJson(Interpretation.class,
+ INTERPRETATION_JSON);
+ }
+
+ private Access getAccessObject() {
+ Access access = new Access();
+ access.setDelete(true);
+ access.setExternalize(false);
+ access.setManage(true);
+ access.setRead(true);
+ access.setUpdate(true);
+ access.setWrite(true);
+ return access;
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java b/api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java
new file mode 100644
index 00000000..5622f79a
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java
@@ -0,0 +1,27 @@
+package org.hisp.dhis.android.core.meta;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.Credentials;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class CredentialsTests {
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void throw_exception_if_username_is_not_provided() throws Exception {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Username must not be null");
+
+ new Credentials(null, "pwd");
+ }
+
+ @Test
+ public void throw_exception_if_password_is_not_provided() throws Exception {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Password must not be null");
+
+ new Credentials("user", null);
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java b/api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java
new file mode 100644
index 00000000..21ae331f
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java
@@ -0,0 +1,75 @@
+package org.hisp.dhis.android.core.network;
+
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.dashboard.api.network.APIException;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import retrofit.RetrofitError;
+import retrofit.client.Header;
+import retrofit.client.Response;
+import retrofit.converter.ConversionException;
+import retrofit.converter.Converter;
+
+public class ApiExceptionTests {
+
+ Response response;
+ Converter converter;
+ java.lang.reflect.Type type;
+
+ @Test
+ public void retrofit_network_exception_map_to_api_exception() {
+ APIException apiException = getNetworkExceptionFromRetrofit();
+ assertTrue(apiException.getKind().equals(APIException.Kind.NETWORK));
+ assertTrue(apiException.getUrl().equals("test_message"));
+ }
+
+ @Test
+ public void retrofit_conversion_exception_map_to_api_exception() {
+ APIException apiException = APIException.fromRetrofitError(
+ getConversionExceptionFromRetrofit());
+ assertTrue(apiException.getKind().equals(APIException.Kind.CONVERSION));
+ assertTrue(apiException.getUrl().equals("test_message"));
+ }
+
+ @Test
+ public void retrofit_unexpected_exception_map_to_api_exception() {
+ APIException apiException = getUnexpectedExceptionFromRetrofit();
+ assertTrue(apiException.getKind().equals(APIException.Kind.UNEXPECTED));
+ assertTrue(apiException.getUrl().equals("test_message"));
+ }
+
+ @Test
+ public void retrofit_http_error_exception_map_to_api_exception() {
+ APIException apiException = getHttpErrorExceptionFromRetrofit();
+ assertTrue(apiException.getKind().equals(APIException.Kind.HTTP));
+ assertTrue(apiException.getUrl().equals("test_message"));
+ }
+
+
+ private APIException getNetworkExceptionFromRetrofit() {
+ return APIException.fromRetrofitError(
+ RetrofitError.networkError("test_message", new IOException()));
+ }
+
+ private RetrofitError getConversionExceptionFromRetrofit() {
+ return RetrofitError.conversionError("test_message", response, converter,
+ type, new ConversionException("test_message"));
+ }
+
+ private APIException getUnexpectedExceptionFromRetrofit() {
+ return APIException.fromRetrofitError(
+ RetrofitError.unexpectedError("test_message", new IOException()));
+ }
+
+ private APIException getHttpErrorExceptionFromRetrofit() {
+ List headerList = new ArrayList<>();
+ Response response = new Response("test_url", 404, "Not found", headerList, null);
+ return APIException.fromRetrofitError(
+ RetrofitError.httpError("test_message", response, converter, type));
+ }
+}
\ No newline at end of file
diff --git a/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java b/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
new file mode 100644
index 00000000..909d520c
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
@@ -0,0 +1,60 @@
+package org.hisp.dhis.android.core.systeminfo;
+
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.JsonParser;
+import org.hisp.dhis.android.dashboard.api.models.SystemInfo;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+public class SystemInfoTests {
+ private static final String SYSTEM_INFO_JSON = "{\n"
+ + "\n"
+ + " \"contextPath\": \"https://play.dhis2.org/demo\",\n"
+ + " \"userAgent\": \"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 "
+ + "Firefox/53.0\",\n"
+ + " \"calendar\": \"iso8601\",\n"
+ + " \"dateFormat\": \"yyyy-mm-dd\",\n"
+ + " \"serverDate\": \"2017-05-04T16:34:45.957\",\n"
+ + " \"lastAnalyticsTableSuccess\": \"2017-01-26T23:19:34.009\",\n"
+ + " \"intervalSinceLastAnalyticsTableSuccess\": \"2345 h, 15 m, 11 s\",\n"
+ + " \"lastAnalyticsTableRuntime\": \"5 m, 17 s\",\n"
+ + " \"version\": \"2.26\",\n"
+ + " \"revision\": \"f297d4c\",\n"
+ + " \"buildTime\": \"2017-05-04T06:37:32.000\",\n"
+ + " \"jasperReportsVersion\": \"6.3.1\",\n"
+ + " \"environmentVariable\": \"DHIS2_HOME\",\n"
+ + " \"readOnlyMode\": \"off\",\n"
+ + " \"databaseInfo\": {\n"
+ + " \"type\": \"PostgreSQL\",\n"
+ + " \"spatialSupport\": true\n"
+ + " },\n"
+ + " \"encryption\": false,\n"
+ + " \"isMetadataVersionEnabled\": true,\n"
+ + " \"isMetadataSyncEnabled\": false\n"
+ + "\n"
+ + "}";
+
+ @Test
+ public void systemInfo_should_map_from_json_String() throws IOException, ParseException {
+
+ SystemInfo systemInfo = (SystemInfo) JsonParser.getModelFromJson(SystemInfo.class,
+ SYSTEM_INFO_JSON);
+
+ assertTrue(systemInfo.getVersion().equals("2.26"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(systemInfo.getBuildTime(),
+ "2017-05-04T06:37:32.000"));
+ assertTrue(systemInfo.getCalendar().equals("iso8601"));
+ assertTrue(systemInfo.getIntervalSinceLastAnalyticsTableSuccess().equals("2345 h, 15 m, 11 s"));
+ assertTrue(systemInfo.getLastAnalyticsTableSuccess().equals("2017-01-26T23:19:34.009"));
+ assertTrue(systemInfo.getRevision().equals("f297d4c"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(systemInfo.getServerDate(),
+ "2017-05-04T16:34:45.957"));
+ assertTrue(systemInfo.getDateFormat().equals("yyyy-mm-dd"));
+ }
+
+
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java b/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
new file mode 100644
index 00000000..be904603
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
@@ -0,0 +1,81 @@
+package org.hisp.dhis.android.core.user;
+
+import static org.junit.Assert.assertTrue;
+
+import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.JsonParser;
+import org.hisp.dhis.android.dashboard.api.models.User;
+import org.hisp.dhis.android.dashboard.api.models.UserAccount;
+import org.hisp.dhis.android.dashboard.api.models.meta.State;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.io.IOException;
+
+public class UserTests {
+
+ public static final String USER_ACCOUNT_JSON = "{\"created\":\"2013-04-18T17:15:08.407\","
+ + "\"lastUpdated\":\"2017-05-02T17:02:37.817\","
+ + "\"name\":\"John Traore\","
+ + "\"id\":\"xE7jOejl9FI\","
+ + "\"birthday\":\"1971-04-08T00:00:00.000\","
+ + "\"education\":\"Master of super using\","
+ + "\"gender\":\"gender_male\","
+ + "\"languages\":\"English\","
+ + "\"displayName\":\"John Traore\","
+ + "\"jobTitle\":\"Super user\","
+ + "\"firstName\":\"John\","
+ + "\"surname\":\"Traore\","
+ + "\"employer\":\"DHIS\","
+ + "\"interests\":\"Football, swimming, singing, dancing\","
+ + "\"introduction\":\"I am the super user of DHIS 2\","
+ + "\"email\":\"someone@dhis2.org\","
+ + "\"organisationUnits\":[{\"id\":\"ImspTQPwCqd\"}]}";
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void userAccount_should_map_to_user() throws IOException {
+ UserAccount userAccount = getUserAccountFromJson();
+ User user = UserAccount.toUser(userAccount);
+ assertTrue(user.getUId().equals("xE7jOejl9FI"));
+ assertTrue(user.getName().equals("John Traore"));
+ assertTrue(user.getDisplayName().equals("John Traore"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
+ "2017-05-02T17:02:37.817"));
+ assertTrue(user.getAccess() == null);
+ }
+
+ @Test
+ public void user_should_map_from_json_string() throws IOException {
+ UserAccount userAccount = getUserAccountFromJson();
+ assertTrue(userAccount.getUId().equals("xE7jOejl9FI"));
+ assertTrue(userAccount.getName().equals("John Traore"));
+ assertTrue(userAccount.getDisplayName().equals("John Traore"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(userAccount.getCreated(),
+ "2013-04-18T17:15:08.407"));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(userAccount.getLastUpdated(),
+ "2017-05-02T17:02:37.817"));
+ assertTrue(userAccount.getAccess() == null);
+ assertTrue(userAccount.getState().equals(State.SYNCED));
+ assertTrue(userAccount.getFirstName().equals("John"));
+ assertTrue(userAccount.getSurname().equals("Traore"));
+ assertTrue(userAccount.getGender().equals("gender_male"));
+ assertTrue(userAccount.getBirthday().equals("1971-04-08T00:00:00.000"));
+ assertTrue(userAccount.getIntroduction().equals("I am the super user of DHIS 2"));
+ assertTrue(userAccount.getEducation().equals("Master of super using"));
+ assertTrue(userAccount.getEmployer().equals("DHIS"));
+ assertTrue(userAccount.getInterests().equals("Football, swimming, singing, dancing"));
+ assertTrue(userAccount.getJobTitle().equals("Super user"));
+ assertTrue(userAccount.getLanguages().equals("English"));
+ assertTrue(userAccount.getEmail().equals("someone@dhis2.org"));
+ assertTrue(userAccount.getPhoneNumber() == null);
+ }
+
+ private UserAccount getUserAccountFromJson() throws IOException {
+ return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, USER_ACCOUNT_JSON);
+ }
+}
\ No newline at end of file
From 07c25aab02d3eb107b0e9c8bcc6b712539d97ff5 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Fri, 5 May 2017 12:25:34 +0200
Subject: [PATCH 06/69] Move json from String to resources file
---
.../core/api/BasicAuthenticatorTests.java | 117 +++++++++++++++
.../dhis/android/core/commons/FileReader.java | 28 ++++
.../core/converters/AccessConverterTests.java | 22 +--
.../converters/DateTimeConverterTests.java | 1 -
.../core/dashboard/DashboardTests.java | 136 +-----------------
.../interpretation/InterpretationTests.java | 65 +--------
.../core/systeminfo/SystemInfoTests.java | 30 +---
.../dhis/android/core/user/UserTests.java | 21 +--
.../resources/access_all_false_string.txt | 8 ++
.../test/resources/access_all_true_string.txt | 1 +
api/src/test/resources/dashboard.json | 133 +++++++++++++++++
api/src/test/resources/interpretation.json | 59 ++++++++
api/src/test/resources/systeminfo.json | 23 +++
api/src/test/resources/user.json | 21 +++
14 files changed, 409 insertions(+), 256 deletions(-)
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java
create mode 100644 api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java
create mode 100644 api/src/test/resources/access_all_false_string.txt
create mode 100644 api/src/test/resources/access_all_true_string.txt
create mode 100644 api/src/test/resources/dashboard.json
create mode 100644 api/src/test/resources/interpretation.json
create mode 100644 api/src/test/resources/systeminfo.json
create mode 100644 api/src/test/resources/user.json
diff --git a/api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java b/api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java
new file mode 100644
index 00000000..cd7678be
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2017, University of Oslo
+ *
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.hisp.dhis.android.core.api;
+
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+import static okhttp3.Credentials.basic;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
+// ToDo: Solve problem with INFO logs from MockWebServer being interpreted as errors in gradle
+@RunWith(JUnit4.class)
+public class BasicAuthenticatorTests {
+/*
+ @Mock
+ private AuthenticatedUserStore authenticatedUserStore;
+
+ private MockWebServer mockWebServer;
+ private OkHttpClient okHttpClient;
+
+ @Before
+ public void setUp() throws IOException {
+ MockitoAnnotations.initMocks(this);
+
+ mockWebServer = new MockWebServer();
+ mockWebServer.enqueue(new MockResponse());
+ mockWebServer.start();
+
+ okHttpClient = new OkHttpClient.Builder()
+ .addInterceptor(new BasicAuthenticator(authenticatedUserStore))
+ .build();
+ }
+
+ @Test
+ public void authenticator_shouldAddAuthorizationHeader() throws IOException, InterruptedException {
+ AuthenticatedUserModel authenticatedUserModel =
+ AuthenticatedUserModel.builder()
+ .user("test_user")
+ .credentials(base64("test_user", "test_password"))
+ .build();
+
+ when(authenticatedUserStore.query()).thenReturn(Arrays.asList(authenticatedUserModel));
+
+ okHttpClient.newCall(
+ new Request.Builder()
+ .url(mockWebServer.url("/api/me/"))
+ .build())
+ .execute();
+
+ RecordedRequest recordedRequest = mockWebServer.takeRequest();
+ assertThat(recordedRequest.getHeader("Authorization"))
+ .isEqualTo(basic("test_user", "test_password"));
+ }
+
+ @Test
+ public void authenticator_shouldNotModifyRequestIfNoUsers() throws IOException, InterruptedException {
+ when(authenticatedUserStore.query()).thenReturn(new ArrayList());
+
+ okHttpClient.newCall(
+ new Request.Builder()
+ .url(mockWebServer.url("/api/me/"))
+ .build())
+ .execute();
+
+ RecordedRequest recordedRequest = mockWebServer.takeRequest();
+ assertThat(recordedRequest.getHeader("Authorization")).isNull();
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ mockWebServer.shutdown();
+ }
+ */
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java b/api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java
new file mode 100644
index 00000000..5b53187f
--- /dev/null
+++ b/api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java
@@ -0,0 +1,28 @@
+package org.hisp.dhis.android.core.commons;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+public class FileReader {
+ public File getFile(String filename) {
+ ClassLoader classLoader = getClass().getClassLoader();
+ URL resource = classLoader.getResource(filename);
+ return new File(resource.getPath());
+ }
+
+ public String getStringFromFile(String filename) throws IOException {
+ FileInputStream inputStream = new FileInputStream(getFile(filename));
+ InputStreamReader isr = new InputStreamReader(inputStream);
+ BufferedReader bufferedReader = new BufferedReader(isr);
+ StringBuilder sb = new StringBuilder();
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ sb.append(line);
+ }
+ return sb.toString();
+ }
+}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java b/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
index a7476282..b0a9e7f6 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
@@ -2,17 +2,15 @@
import static junit.framework.Assert.assertTrue;
+import org.hisp.dhis.android.core.commons.FileReader;
import org.hisp.dhis.android.dashboard.api.models.Access;
import org.hisp.dhis.android.dashboard.api.persistence.converters.AccessConverter;
import org.junit.Before;
import org.junit.Test;
+import java.io.IOException;
+
public class AccessConverterTests {
- public static final String ACCESS_ALL_TRUE_AS_DATABASE_STRING = "{\"manage\":true,"
- + "\"externalize\":true,\"write\":true,\"read\":true,\"update\":true,\"delete\":true}";
- public static final String ACCESS_ALL_FALSE_AS_DATABASE_STRING = "{\"manage\":false,"
- + "\"externalize\":false,\"write\":false,\"read\":false,\"update\":false,"
- + "\"delete\":false}";
public static Access accessObject;
AccessConverter accessConverter = new AccessConverter();
@@ -29,13 +27,14 @@ public void setUp() throws Exception {
@Test
public void convert_access_object_to_database_string() throws Exception {
- assertTrue(accessConverter.getDBValue(accessObject).equals(
- ACCESS_ALL_TRUE_AS_DATABASE_STRING));
+ String access = new FileReader().getStringFromFile("access_all_true_string.txt");
+ assertTrue(accessConverter.getDBValue(accessObject).equals(access));
}
@Test
- public void convert_access_all_true_database_string_to_model() {
- Access access = accessConverter.getModelValue(ACCESS_ALL_TRUE_AS_DATABASE_STRING);
+ public void convert_access_all_true_database_string_to_model() throws IOException {
+ Access access = accessConverter.getModelValue( new FileReader().getStringFromFile(
+ "access_all_true_string.txt"));
assertTrue(access.isDelete());
assertTrue(access.isRead());
assertTrue(access.isWrite());
@@ -44,8 +43,9 @@ public void convert_access_all_true_database_string_to_model() {
}
@Test
- public void convert_access_all_false_database_string_to_model() {
- Access access = accessConverter.getModelValue(ACCESS_ALL_FALSE_AS_DATABASE_STRING);
+ public void convert_access_all_false_database_string_to_model() throws IOException {
+ Access access = accessConverter.getModelValue( new FileReader().getStringFromFile(
+ "access_all_false_string.txt"));
assertTrue(!access.isDelete());
assertTrue(!access.isRead());
assertTrue(!access.isWrite());
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java b/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
index 09050c6d..89b74161 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
@@ -14,7 +14,6 @@
public class DateTimeConverterTests {
public static final String DATETIME_AS_STRING = "2016-04-21T15:37:07.740Z";
- public static final String STATE_TO_POST = "TO_POST";
DateTimeConverter dateTimeConverter = new DateTimeConverter();
diff --git a/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java b/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
index 821f950e..c53c8ffb 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
@@ -3,6 +3,7 @@
import static org.junit.Assert.assertTrue;
import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.FileReader;
import org.hisp.dhis.android.core.commons.JsonParser;
import org.hisp.dhis.android.dashboard.api.models.Access;
import org.hisp.dhis.android.dashboard.api.models.Dashboard;
@@ -15,139 +16,6 @@
import java.util.List;
public class DashboardTests {
- private final String DASHBOARD_JSON = "[{\n"
- + "\t\t\"lastUpdated\": \"2016-10-11T19:24:33.599\",\n"
- + "\t\t\"created\": \"2013-09-08T21:47:17.960\",\n"
- + "\t\t\"name\": \"Antenatal Care\",\n"
- + "\t\t\"id\": \"nghVC4wtyzi\",\n"
- + "\t\t\"displayName\": \"Antenatal Care\",\n"
- + "\t\t\"access\": {\n"
- + "\t\t\t\"read\": true,\n"
- + "\t\t\t\"update\": true,\n"
- + "\t\t\t\"externalize\": true,\n"
- + "\t\t\t\"delete\": true,\n"
- + "\t\t\t\"write\": true,\n"
- + "\t\t\t\"manage\": true\n"
- + "\t\t},\n"
- + "\t\t\"dashboardItems\": [{\n"
- + "\t\t\t\"created\": \"2016-10-10T17:24:30.487\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-10-10T17:24:30.487\",\n"
- + "\t\t\t\"id\": \"cX2przhv9UC\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2016-10-10T17:24:49.196\",\n"
- + "\t\t\t\t\"created\": \"2016-10-10T17:24:49.196\",\n"
- + "\t\t\t\t\"name\": \"ANC: ANC IPT 1 Coverage last 12 months districts\",\n"
- + "\t\t\t\t\"id\": \"VffWmdKFHSq\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: ANC IPT 1 Coverage last 12 months districts\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2016-08-02T11:57:55.229\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-08-02T11:57:55.229\",\n"
- + "\t\t\t\"id\": \"JcO7yJlKIa3\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2016-10-10T17:08:15.277\",\n"
- + "\t\t\t\t\"created\": \"2016-10-10T17:08:15.277\",\n"
- + "\t\t\t\t\"name\": \"ANC: ANC 3 coverage by districts last 4 quarters\",\n"
- + "\t\t\t\t\"id\": \"CNkMibmx1Zr\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: ANC 3 coverage by districts last 4 quarters\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2015-01-16T11:52:44.928\",\n"
- + "\t\t\t\"lastUpdated\": \"2015-01-16T11:52:44.928\",\n"
- + "\t\t\t\"id\": \"OiyMNoXzSdY\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"MAP\",\n"
- + "\t\t\t\"map\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2013-09-09T16:35:12.062\",\n"
- + "\t\t\t\t\"created\": \"2012-11-14T12:56:59.322\",\n"
- + "\t\t\t\t\"name\": \"ANC: LLITN coverage district and facility\",\n"
- + "\t\t\t\t\"id\": \"ZBjCfSaLSqD\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: LLITN coverage district and facility\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2016-04-21T15:37:07.740\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-04-21T15:37:07.740\",\n"
- + "\t\t\t\"id\": \"i6NTSuDsk6l\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"MAP\",\n"
- + "\t\t\t\"map\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2016-10-10T18:16:43.265\",\n"
- + "\t\t\t\t\"created\": \"2016-10-10T18:16:43.261\",\n"
- + "\t\t\t\t\"name\": \"ANC: IPT 2 Coverage this year\",\n"
- + "\t\t\t\t\"id\": \"voX07ulo2Bq\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: IPT 2 Coverage this year\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2015-01-15T16:50:51.427\",\n"
- + "\t\t\t\"lastUpdated\": \"2015-08-09T22:10:20.307\",\n"
- + "\t\t\t\"id\": \"YZ7U25Japom\",\n"
- + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.004\",\n"
- + "\t\t\t\t\"created\": \"2015-01-15T16:50:34.302\",\n"
- + "\t\t\t\t\"name\": \"ANC: ANC 1 coverage western chiefdoms this year\",\n"
- + "\t\t\t\t\"id\": \"zKl0LcQyxPl\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: ANC 1 coverage western chiefdoms this year\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2016-08-02T11:57:59.474\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-10-10T17:11:06.823\",\n"
- + "\t\t\t\"id\": \"UQeYhQOJ2f1\",\n"
- + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2016-08-02T11:58:28.517\",\n"
- + "\t\t\t\t\"created\": \"2016-08-02T11:53:53.607\",\n"
- + "\t\t\t\t\"name\": \"ANC: IPT 1 Coverage by districts last 4 quarters\",\n"
- + "\t\t\t\t\"id\": \"DHPu0vtZ2mW\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: IPT 1 Coverage by districts last 4 quarters\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2014-04-03T14:11:10.942\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-10-11T09:29:40.874\",\n"
- + "\t\t\t\"id\": \"xS4X0ZL6GCI\",\n"
- + "\t\t\t\"shape\": \"DOUBLE_WIDTH\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.312\",\n"
- + "\t\t\t\t\"created\": \"2014-04-03T14:07:29.442\",\n"
- + "\t\t\t\t\"name\": \"ANC: Fixed vs Outreach last year\",\n"
- + "\t\t\t\t\"id\": \"AVZpYsdG44G\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: Fixed vs Outreach last year\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2016-10-11T19:24:21.931\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-10-11T19:24:21.931\",\n"
- + "\t\t\t\"id\": \"ZF9vWMXob7N\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"MAP\",\n"
- + "\t\t\t\"map\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2016-10-11T19:23:49.953\",\n"
- + "\t\t\t\t\"created\": \"2016-10-11T19:23:49.952\",\n"
- + "\t\t\t\t\"name\": \"ANC: ANC 1 coverage Sierra Leone dark basemap\",\n"
- + "\t\t\t\t\"id\": \"qTfO4YkQ9xW\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: ANC 1 coverage Sierra Leone dark basemap\"\n"
- + "\t\t\t}\n"
- + "\t\t}, {\n"
- + "\t\t\t\"created\": \"2014-04-03T14:09:47.075\",\n"
- + "\t\t\t\"lastUpdated\": \"2016-10-11T09:19:35.442\",\n"
- + "\t\t\t\"id\": \"kHRSFUr3dYe\",\n"
- + "\t\t\t\"shape\": \"NORMAL\",\n"
- + "\t\t\t\"type\": \"CHART\",\n"
- + "\t\t\t\"chart\": {\n"
- + "\t\t\t\t\"lastUpdated\": \"2015-07-15T15:25:20.315\",\n"
- + "\t\t\t\t\"created\": \"2014-04-03T14:09:05.734\",\n"
- + "\t\t\t\t\"name\": \"ANC: 4+ visits by Facility Type last year\",\n"
- + "\t\t\t\t\"id\": \"ZfQMIA4o2s3\",\n"
- + "\t\t\t\t\"displayName\": \"ANC: 4+ visits by Facility Type last year\"\n"
- + "\t\t\t}\n"
- + "\t\t}]\n"
- + "\t}]";
@Test
public void dashboard_shouldMapFromJsonString() throws IOException {
@@ -251,7 +119,7 @@ private DashboardItem getDashboardItemWithMap() throws IOException {
private Dashboard getDashboardsFromJson() throws IOException {
Dashboard[] dashboards = (Dashboard[]) JsonParser.getModelFromJson(Dashboard[].class,
- DASHBOARD_JSON);
+ new FileReader().getStringFromFile("dashboard.json"));
return dashboards[0];
}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java b/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
index 2b4e25c1..5b8446c6 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
@@ -3,6 +3,7 @@
import static org.junit.Assert.assertTrue;
import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.FileReader;
import org.hisp.dhis.android.core.commons.JsonParser;
import org.hisp.dhis.android.dashboard.api.models.Access;
import org.hisp.dhis.android.dashboard.api.models.Interpretation;
@@ -15,68 +16,6 @@
public class InterpretationTests {
- private static final String INTERPRETATION_JSON = "{\n"
- + "\n"
- + " \"created\": \"2017-10-21T10:10:43.451\",\n"
- + " \"lastUpdated\": \"2017-10-21T10:10:43.451\",\n"
- + " \"name\": \"BR11Oy1Q4yR\",\n"
- + " \"id\": \"BR11Oy1Q4yR\",\n"
- + " \"displayName\": \"BR11Oy1Q4yR\",\n"
- + " \"type\": \"CHART\",\n"
- + " \"text\": \"This chart shows that BCG doses is low for 2014, why is that?\",\n"
- + " \"access\": {\n"
- + " \"read\": true,\n"
- + " \"update\": true,\n"
- + " \"externalize\": false,\n"
- + " \"delete\": true,\n"
- + " \"write\": true,\n"
- + " \"manage\": true\n"
- + " },\n"
- + " \"chart\": {\n"
- + " \"lastUpdated\": \"2015-07-15T15:25:20.264\",\n"
- + " \"created\": \"2013-05-29T12:52:54.560\",\n"
- + " \"name\": \"Immunization: BCG, Measles, YF doses comparison\",\n"
- + " \"id\": \"R9A0rvAydpn\",\n"
- + " \"displayName\": \"Immunization: BCG, Measles, YF doses comparison\"\n"
- + " },\n"
- + " \"user\": {\n"
- + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
- + " \"created\": \"2013-04-18T17:15:08.407\",\n"
- + " \"name\": \"John Traore\",\n"
- + " \"id\": \"xE7jOejl9FI\",\n"
- + " \"displayName\": \"John Traore\"\n"
- + " },\n"
- + " \"comments\": [\n"
- + " {\n"
- + " \"lastUpdated\": \"2014-10-21T10:11:19.537\",\n"
- + " \"created\": \"2014-10-21T10:11:19.537\",\n"
- + " \"id\": \"Eg7x5Kt2XgV\",\n"
- + " \"text\": \"It might be caused by a stock-out of vaccines.\",\n"
- + " \"user\": {\n"
- + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
- + " \"created\": \"2013-04-18T17:15:08.407\",\n"
- + " \"name\": \"John Traore\",\n"
- + " \"id\": \"xE7jOejl9FI\",\n"
- + " \"displayName\": \"John Traore\"\n"
- + " }\n"
- + " },\n"
- + " {\n"
- + " \"lastUpdated\": \"2014-10-21T10:11:44.325\",\n"
- + " \"created\": \"2014-10-21T10:11:44.325\",\n"
- + " \"id\": \"oRmqfmnCLsQ\",\n"
- + " \"text\": \"Yes I believe so\",\n"
- + " \"user\": {\n"
- + " \"lastUpdated\": \"2017-01-19T14:24:04.447\",\n"
- + " \"created\": \"2013-04-18T17:15:08.407\",\n"
- + " \"name\": \"John Traore\",\n"
- + " \"id\": \"xE7jOejl9FI\",\n"
- + " \"displayName\": \"John Traore\"\n"
- + " }\n"
- + " }\n"
- + " ]\n"
- + "\n"
- + "}";
-
@Test
public void interpretation_shouldMapFromJsonString() throws IOException {
Interpretation interpretation = getInterpretationFromJson();
@@ -222,7 +161,7 @@ private User getUserFromInterpretationJsonFirstComment() throws IOException {
private Interpretation getInterpretationFromJson() throws IOException {
return (Interpretation) JsonParser.getModelFromJson(Interpretation.class,
- INTERPRETATION_JSON);
+ new FileReader().getStringFromFile("interpretation.json"));
}
private Access getAccessObject() {
diff --git a/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java b/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
index 909d520c..ed19ac70 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
@@ -3,6 +3,7 @@
import static org.junit.Assert.assertTrue;
import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.FileReader;
import org.hisp.dhis.android.core.commons.JsonParser;
import org.hisp.dhis.android.dashboard.api.models.SystemInfo;
import org.junit.Test;
@@ -11,38 +12,11 @@
import java.text.ParseException;
public class SystemInfoTests {
- private static final String SYSTEM_INFO_JSON = "{\n"
- + "\n"
- + " \"contextPath\": \"https://play.dhis2.org/demo\",\n"
- + " \"userAgent\": \"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 "
- + "Firefox/53.0\",\n"
- + " \"calendar\": \"iso8601\",\n"
- + " \"dateFormat\": \"yyyy-mm-dd\",\n"
- + " \"serverDate\": \"2017-05-04T16:34:45.957\",\n"
- + " \"lastAnalyticsTableSuccess\": \"2017-01-26T23:19:34.009\",\n"
- + " \"intervalSinceLastAnalyticsTableSuccess\": \"2345 h, 15 m, 11 s\",\n"
- + " \"lastAnalyticsTableRuntime\": \"5 m, 17 s\",\n"
- + " \"version\": \"2.26\",\n"
- + " \"revision\": \"f297d4c\",\n"
- + " \"buildTime\": \"2017-05-04T06:37:32.000\",\n"
- + " \"jasperReportsVersion\": \"6.3.1\",\n"
- + " \"environmentVariable\": \"DHIS2_HOME\",\n"
- + " \"readOnlyMode\": \"off\",\n"
- + " \"databaseInfo\": {\n"
- + " \"type\": \"PostgreSQL\",\n"
- + " \"spatialSupport\": true\n"
- + " },\n"
- + " \"encryption\": false,\n"
- + " \"isMetadataVersionEnabled\": true,\n"
- + " \"isMetadataSyncEnabled\": false\n"
- + "\n"
- + "}";
@Test
public void systemInfo_should_map_from_json_String() throws IOException, ParseException {
-
SystemInfo systemInfo = (SystemInfo) JsonParser.getModelFromJson(SystemInfo.class,
- SYSTEM_INFO_JSON);
+ new FileReader().getStringFromFile("systeminfo.json"));
assertTrue(systemInfo.getVersion().equals("2.26"));
assertTrue(DateTestUtils.compareParsedDateWithStringDate(systemInfo.getBuildTime(),
diff --git a/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java b/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
index be904603..3e4a14c0 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
@@ -3,6 +3,7 @@
import static org.junit.Assert.assertTrue;
import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.core.commons.FileReader;
import org.hisp.dhis.android.core.commons.JsonParser;
import org.hisp.dhis.android.dashboard.api.models.User;
import org.hisp.dhis.android.dashboard.api.models.UserAccount;
@@ -14,24 +15,6 @@
import java.io.IOException;
public class UserTests {
-
- public static final String USER_ACCOUNT_JSON = "{\"created\":\"2013-04-18T17:15:08.407\","
- + "\"lastUpdated\":\"2017-05-02T17:02:37.817\","
- + "\"name\":\"John Traore\","
- + "\"id\":\"xE7jOejl9FI\","
- + "\"birthday\":\"1971-04-08T00:00:00.000\","
- + "\"education\":\"Master of super using\","
- + "\"gender\":\"gender_male\","
- + "\"languages\":\"English\","
- + "\"displayName\":\"John Traore\","
- + "\"jobTitle\":\"Super user\","
- + "\"firstName\":\"John\","
- + "\"surname\":\"Traore\","
- + "\"employer\":\"DHIS\","
- + "\"interests\":\"Football, swimming, singing, dancing\","
- + "\"introduction\":\"I am the super user of DHIS 2\","
- + "\"email\":\"someone@dhis2.org\","
- + "\"organisationUnits\":[{\"id\":\"ImspTQPwCqd\"}]}";
@Rule
public ExpectedException thrown = ExpectedException.none();
@@ -76,6 +59,6 @@ public void user_should_map_from_json_string() throws IOException {
}
private UserAccount getUserAccountFromJson() throws IOException {
- return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, USER_ACCOUNT_JSON);
+ return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, new FileReader().getStringFromFile("user.json"));
}
}
\ No newline at end of file
diff --git a/api/src/test/resources/access_all_false_string.txt b/api/src/test/resources/access_all_false_string.txt
new file mode 100644
index 00000000..1cd2bc71
--- /dev/null
+++ b/api/src/test/resources/access_all_false_string.txt
@@ -0,0 +1,8 @@
+{
+ "manage": false,
+ "externalize": false,
+ "write": false,
+ "read": false,
+ "update": false,
+ "delete": false
+}
\ No newline at end of file
diff --git a/api/src/test/resources/access_all_true_string.txt b/api/src/test/resources/access_all_true_string.txt
new file mode 100644
index 00000000..86766b27
--- /dev/null
+++ b/api/src/test/resources/access_all_true_string.txt
@@ -0,0 +1 @@
+{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true}
\ No newline at end of file
diff --git a/api/src/test/resources/dashboard.json b/api/src/test/resources/dashboard.json
new file mode 100644
index 00000000..2214b078
--- /dev/null
+++ b/api/src/test/resources/dashboard.json
@@ -0,0 +1,133 @@
+[{
+ "lastUpdated": "2016-10-11T19:24:33.599",
+ "created": "2013-09-08T21:47:17.960",
+ "name": "Antenatal Care",
+ "id": "nghVC4wtyzi",
+ "displayName": "Antenatal Care",
+ "access": {
+ "read": true,
+ "update": true,
+ "externalize": true,
+ "delete": true,
+ "write": true,
+ "manage": true
+ },
+ "dashboardItems": [{
+ "created": "2016-10-10T17:24:30.487",
+ "lastUpdated": "2016-10-10T17:24:30.487",
+ "id": "cX2przhv9UC",
+ "shape": "NORMAL",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2016-10-10T17:24:49.196",
+ "created": "2016-10-10T17:24:49.196",
+ "name": "ANC: ANC IPT 1 Coverage last 12 months districts",
+ "id": "VffWmdKFHSq",
+ "displayName": "ANC: ANC IPT 1 Coverage last 12 months districts"
+ }
+ }, {
+ "created": "2016-08-02T11:57:55.229",
+ "lastUpdated": "2016-08-02T11:57:55.229",
+ "id": "JcO7yJlKIa3",
+ "shape": "NORMAL",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2016-10-10T17:08:15.277",
+ "created": "2016-10-10T17:08:15.277",
+ "name": "ANC: ANC 3 coverage by districts last 4 quarters",
+ "id": "CNkMibmx1Zr",
+ "displayName": "ANC: ANC 3 coverage by districts last 4 quarters"
+ }
+ }, {
+ "created": "2015-01-16T11:52:44.928",
+ "lastUpdated": "2015-01-16T11:52:44.928",
+ "id": "OiyMNoXzSdY",
+ "shape": "NORMAL",
+ "type": "MAP",
+ "map": {
+ "lastUpdated": "2013-09-09T16:35:12.062",
+ "created": "2012-11-14T12:56:59.322",
+ "name": "ANC: LLITN coverage district and facility",
+ "id": "ZBjCfSaLSqD",
+ "displayName": "ANC: LLITN coverage district and facility"
+ }
+ }, {
+ "created": "2016-04-21T15:37:07.740",
+ "lastUpdated": "2016-04-21T15:37:07.740",
+ "id": "i6NTSuDsk6l",
+ "shape": "NORMAL",
+ "type": "MAP",
+ "map": {
+ "lastUpdated": "2016-10-10T18:16:43.265",
+ "created": "2016-10-10T18:16:43.261",
+ "name": "ANC: IPT 2 Coverage this year",
+ "id": "voX07ulo2Bq",
+ "displayName": "ANC: IPT 2 Coverage this year"
+ }
+ }, {
+ "created": "2015-01-15T16:50:51.427",
+ "lastUpdated": "2015-08-09T22:10:20.307",
+ "id": "YZ7U25Japom",
+ "shape": "DOUBLE_WIDTH",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2015-07-15T15:25:20.004",
+ "created": "2015-01-15T16:50:34.302",
+ "name": "ANC: ANC 1 coverage western chiefdoms this year",
+ "id": "zKl0LcQyxPl",
+ "displayName": "ANC: ANC 1 coverage western chiefdoms this year"
+ }
+ }, {
+ "created": "2016-08-02T11:57:59.474",
+ "lastUpdated": "2016-10-10T17:11:06.823",
+ "id": "UQeYhQOJ2f1",
+ "shape": "DOUBLE_WIDTH",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2016-08-02T11:58:28.517",
+ "created": "2016-08-02T11:53:53.607",
+ "name": "ANC: IPT 1 Coverage by districts last 4 quarters",
+ "id": "DHPu0vtZ2mW",
+ "displayName": "ANC: IPT 1 Coverage by districts last 4 quarters"
+ }
+ }, {
+ "created": "2014-04-03T14:11:10.942",
+ "lastUpdated": "2016-10-11T09:29:40.874",
+ "id": "xS4X0ZL6GCI",
+ "shape": "DOUBLE_WIDTH",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2015-07-15T15:25:20.312",
+ "created": "2014-04-03T14:07:29.442",
+ "name": "ANC: Fixed vs Outreach last year",
+ "id": "AVZpYsdG44G",
+ "displayName": "ANC: Fixed vs Outreach last year"
+ }
+ }, {
+ "created": "2016-10-11T19:24:21.931",
+ "lastUpdated": "2016-10-11T19:24:21.931",
+ "id": "ZF9vWMXob7N",
+ "shape": "NORMAL",
+ "type": "MAP",
+ "map": {
+ "lastUpdated": "2016-10-11T19:23:49.953",
+ "created": "2016-10-11T19:23:49.952",
+ "name": "ANC: ANC 1 coverage Sierra Leone dark basemap",
+ "id": "qTfO4YkQ9xW",
+ "displayName": "ANC: ANC 1 coverage Sierra Leone dark basemap"
+ }
+ }, {
+ "created": "2014-04-03T14:09:47.075",
+ "lastUpdated": "2016-10-11T09:19:35.442",
+ "id": "kHRSFUr3dYe",
+ "shape": "NORMAL",
+ "type": "CHART",
+ "chart": {
+ "lastUpdated": "2015-07-15T15:25:20.315",
+ "created": "2014-04-03T14:09:05.734",
+ "name": "ANC: 4+ visits by Facility Type last year",
+ "id": "ZfQMIA4o2s3",
+ "displayName": "ANC: 4+ visits by Facility Type last year"
+ }
+ }]
+}]
\ No newline at end of file
diff --git a/api/src/test/resources/interpretation.json b/api/src/test/resources/interpretation.json
new file mode 100644
index 00000000..38c5f367
--- /dev/null
+++ b/api/src/test/resources/interpretation.json
@@ -0,0 +1,59 @@
+{
+ "created": "2017-10-21T10:10:43.451",
+ "lastUpdated": "2017-10-21T10:10:43.451",
+ "name": "BR11Oy1Q4yR",
+ "id": "BR11Oy1Q4yR",
+ "displayName": "BR11Oy1Q4yR",
+ "type": "CHART",
+ "text": "This chart shows that BCG doses is low for 2014, why is that?",
+ "access": {
+ "read": true,
+ "update": true,
+ "externalize": false,
+ "delete": true,
+ "write": true,
+ "manage": true
+ },
+ "chart": {
+ "lastUpdated": "2015-07-15T15:25:20.264",
+ "created": "2013-05-29T12:52:54.560",
+ "name": "Immunization: BCG, Measles, YF doses comparison",
+ "id": "R9A0rvAydpn",
+ "displayName": "Immunization: BCG, Measles, YF doses comparison"
+ },
+ "user": {
+ "lastUpdated": "2017-01-19T14:24:04.447",
+ "created": "2013-04-18T17:15:08.407",
+ "name": "John Traore",
+ "id": "xE7jOejl9FI",
+ "displayName": "John Traore"
+ },
+ "comments": [
+ {
+ "lastUpdated": "2014-10-21T10:11:19.537",
+ "created": "2014-10-21T10:11:19.537",
+ "id": "Eg7x5Kt2XgV",
+ "text": "It might be caused by a stock-out of vaccines.",
+ "user": {
+ "lastUpdated": "2017-01-19T14:24:04.447",
+ "created": "2013-04-18T17:15:08.407",
+ "name": "John Traore",
+ "id": "xE7jOejl9FI",
+ "displayName": "John Traore"
+ }
+ },
+ {
+ "lastUpdated": "2014-10-21T10:11:44.325",
+ "created": "2014-10-21T10:11:44.325",
+ "id": "oRmqfmnCLsQ",
+ "text": "Yes I believe so",
+ "user": {
+ "lastUpdated": "2017-01-19T14:24:04.447",
+ "created": "2013-04-18T17:15:08.407",
+ "name": "John Traore",
+ "id": "xE7jOejl9FI",
+ "displayName": "John Traore"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/api/src/test/resources/systeminfo.json b/api/src/test/resources/systeminfo.json
new file mode 100644
index 00000000..436de5b4
--- /dev/null
+++ b/api/src/test/resources/systeminfo.json
@@ -0,0 +1,23 @@
+{
+ "contextPath": "https://play.dhis2.org/demo",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0",
+ "calendar": "iso8601",
+ "dateFormat": "yyyy-mm-dd",
+ "serverDate": "2017-05-04T16:34:45.957",
+ "lastAnalyticsTableSuccess": "2017-01-26T23:19:34.009",
+ "intervalSinceLastAnalyticsTableSuccess": "2345 h, 15 m, 11 s",
+ "lastAnalyticsTableRuntime": "5 m, 17 s",
+ "version": "2.26",
+ "revision": "f297d4c",
+ "buildTime": "2017-05-04T06:37:32.000",
+ "jasperReportsVersion": "6.3.1",
+ "environmentVariable": "DHIS2_HOME",
+ "readOnlyMode": "off",
+ "databaseInfo": {
+ "type": "PostgreSQL",
+ "spatialSupport": true
+ },
+ "encryption": false,
+ "isMetadataVersionEnabled": true,
+ "isMetadataSyncEnabled": false
+}
\ No newline at end of file
diff --git a/api/src/test/resources/user.json b/api/src/test/resources/user.json
new file mode 100644
index 00000000..0fbfc01e
--- /dev/null
+++ b/api/src/test/resources/user.json
@@ -0,0 +1,21 @@
+{
+ "created": "2013-04-18T17:15:08.407",
+ "lastUpdated": "2017-05-02T17:02:37.817",
+ "name": "John Traore",
+ "id": "xE7jOejl9FI",
+ "birthday": "1971-04-08T00:00:00.000",
+ "education": "Master of super using",
+ "gender": "gender_male",
+ "languages": "English",
+ "displayName": "John Traore",
+ "jobTitle": "Super user",
+ "firstName": "John",
+ "surname": "Traore",
+ "employer": "DHIS",
+ "interests": "Football, swimming, singing, dancing",
+ "introduction": "I am the super user of DHIS 2",
+ "email": "someone@dhis2.org",
+ "organisationUnits": [{
+ "id": "ImspTQPwCqd"
+ }]
+}
\ No newline at end of file
From 1b5fe911fdd82ee3ba0daffec455a2086d498681 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 8 May 2017 16:34:46 +0200
Subject: [PATCH 07/69] rename package and remove tests
---
.../core/dashboard/DashboardTests.java | 126 -------------
.../interpretation/InterpretationTests.java | 177 ------------------
.../core/systeminfo/SystemInfoTests.java | 34 ----
.../api}/PreconditionsTests.java | 0
.../api}/api/BasicAuthenticatorTests.java | 63 +++----
.../api}/commons/DateTestUtils.java | 0
.../api}/commons/FileReader.java | 0
.../api}/commons/JsonParser.java | 0
.../api}/converters/AccessConverterTests.java | 0
.../converters/DateTimeConverterTests.java | 0
.../api}/converters/StateConverterTests.java | 0
.../api}/meta/CredentialsTests.java | 0
.../api}/network/ApiExceptionTests.java | 0
.../api}/user/UserTests.java | 0
...tring.txt => access_all_false_string.json} | 0
.../resources/access_all_true_string.json | 8 +
.../test/resources/access_all_true_string.txt | 1 -
api/src/test/resources/dashboard.json | 133 -------------
api/src/test/resources/interpretation.json | 59 ------
api/src/test/resources/systeminfo.json | 23 ---
.../resources/{user.json => userAccount.json} | 0
21 files changed, 39 insertions(+), 585 deletions(-)
delete mode 100644 api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
delete mode 100644 api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
delete mode 100644 api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/PreconditionsTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/api/BasicAuthenticatorTests.java (67%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/commons/DateTestUtils.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/commons/FileReader.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/commons/JsonParser.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/converters/AccessConverterTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/converters/DateTimeConverterTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/converters/StateConverterTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/meta/CredentialsTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/network/ApiExceptionTests.java (100%)
rename api/src/test/java/org/hisp/dhis/android/{core => dashboard/api}/user/UserTests.java (100%)
rename api/src/test/resources/{access_all_false_string.txt => access_all_false_string.json} (100%)
create mode 100644 api/src/test/resources/access_all_true_string.json
delete mode 100644 api/src/test/resources/access_all_true_string.txt
delete mode 100644 api/src/test/resources/dashboard.json
delete mode 100644 api/src/test/resources/interpretation.json
delete mode 100644 api/src/test/resources/systeminfo.json
rename api/src/test/resources/{user.json => userAccount.json} (100%)
diff --git a/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java b/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
deleted file mode 100644
index c53c8ffb..00000000
--- a/api/src/test/java/org/hisp/dhis/android/core/dashboard/DashboardTests.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.hisp.dhis.android.core.dashboard;
-
-import static org.junit.Assert.assertTrue;
-
-import org.hisp.dhis.android.core.commons.DateTestUtils;
-import org.hisp.dhis.android.core.commons.FileReader;
-import org.hisp.dhis.android.core.commons.JsonParser;
-import org.hisp.dhis.android.dashboard.api.models.Access;
-import org.hisp.dhis.android.dashboard.api.models.Dashboard;
-import org.hisp.dhis.android.dashboard.api.models.DashboardElement;
-import org.hisp.dhis.android.dashboard.api.models.DashboardItem;
-import org.hisp.dhis.android.dashboard.api.models.meta.State;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.List;
-
-public class DashboardTests {
-
- @Test
- public void dashboard_shouldMapFromJsonString() throws IOException {
- Dashboard dashboard = getDashboardsFromJson();
- assertTrue(dashboard.getState().equals(State.SYNCED));
- assertTrue(dashboard.getUId().equals("nghVC4wtyzi"));
- assertTrue(dashboard.getName().equals("Antenatal Care"));
- assertTrue(dashboard.getDisplayName().equals("Antenatal Care"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboard.getCreated(),
- "2013-09-08T21:47:17.960"));
- assertTrue(dashboard.getDashboardItems().size() == 9);
- }
-
- @Test
- public void dashboard_access_shouldMapFromJsonString() throws IOException {
- Dashboard dashboard = getDashboardsFromJson();
- Access access = dashboard.getAccess();
- assertTrue(access.isManage() == true);
- assertTrue(access.isExternalize() == true);
- assertTrue(access.isWrite() == true);
- assertTrue(access.isRead() == true);
- assertTrue(access.isUpdate() == true);
- assertTrue(access.isDelete() == true);
- }
-
- @Test
- public void dashboard_item_type_chart_shouldMapFromJsonString() throws IOException {
- DashboardItem dashboardItem = getDashboardItemWithChart();
- assertTrue(dashboardItem.getName() == null);
- assertTrue(dashboardItem.getDisplayName() == null);
- assertTrue(dashboardItem.getState() == State.SYNCED);
- assertTrue(dashboardItem.getEventChart() == null);
- assertTrue(dashboardItem.getEventReport() == null);
- assertTrue(dashboardItem.getUsers() == null);
- assertTrue(dashboardItem.getReports() == null);
- assertTrue(dashboardItem.getResources() == null);
- assertTrue(dashboardItem.isMessages() == false);
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getCreated(),
- "2016-10-10T17:24:30.487"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getLastUpdated(),
- "2016-10-10T17:24:30.487"));
- assertTrue(dashboardItem.getUId().equals("cX2przhv9UC"));
- assertTrue(dashboardItem.getShape().equals("NORMAL"));
- assertTrue(dashboardItem.getType().equals("CHART"));
- assertTrue(dashboardItem.getAccess() == null);
-
- DashboardElement dashboardElement = dashboardItem.getChart();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getLastUpdated(),
- "2016-10-10T17:24:49.196"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getCreated(),
- "2016-10-10T17:24:49.196"));
- assertTrue(dashboardElement.getName().equals(
- "ANC: ANC IPT 1 Coverage last 12 months districts"));
- assertTrue(dashboardElement.getUId().equals("VffWmdKFHSq"));
- assertTrue(dashboardElement.getDisplayName().equals(
- "ANC: ANC IPT 1 Coverage last 12 months districts"));
- }
-
- @Test
- public void dashboard_item_type_map_shouldMapFromJsonString() throws IOException {
- DashboardItem dashboardItem = getDashboardItemWithMap();
- assertTrue(dashboardItem.getName() == null);
- assertTrue(dashboardItem.getDisplayName() == null);
- assertTrue(dashboardItem.getState() == State.SYNCED);
- assertTrue(dashboardItem.getEventChart() == null);
- assertTrue(dashboardItem.getEventReport() == null);
- assertTrue(dashboardItem.getUsers() == null);
- assertTrue(dashboardItem.getReports() == null);
- assertTrue(dashboardItem.getResources() == null);
- assertTrue(dashboardItem.isMessages() == false);
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getCreated(),
- "2015-01-16T11:52:44.928"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardItem.getLastUpdated(),
- "2015-01-16T11:52:44.928"));
- assertTrue(dashboardItem.getUId().equals("OiyMNoXzSdY"));
- assertTrue(dashboardItem.getShape().equals("NORMAL"));
- assertTrue(dashboardItem.getType().equals("MAP"));
- assertTrue(dashboardItem.getAccess() == null);
- DashboardElement dashboardElement = dashboardItem.getMap();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getLastUpdated(),
- "2013-09-09T16:35:12.062"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dashboardElement.getCreated(),
- "2012-11-14T12:56:59.322"));
- assertTrue(dashboardElement.getName().equals("ANC: LLITN coverage district and facility"));
- assertTrue(dashboardElement.getUId().equals("ZBjCfSaLSqD"));
- assertTrue(dashboardElement.getDisplayName().equals(
- "ANC: LLITN coverage district and facility"));
- }
-
- private DashboardItem getDashboardItemWithChart() throws IOException {
- Dashboard dashboard = getDashboardsFromJson();
- List dashboardItems = dashboard.getDashboardItems();
- return dashboardItems.get(0);
- }
-
- private DashboardItem getDashboardItemWithMap() throws IOException {
- Dashboard dashboard = getDashboardsFromJson();
- List dashboardItems = dashboard.getDashboardItems();
- return dashboardItems.get(2);
- }
-
- private Dashboard getDashboardsFromJson() throws IOException {
- Dashboard[] dashboards = (Dashboard[]) JsonParser.getModelFromJson(Dashboard[].class,
- new FileReader().getStringFromFile("dashboard.json"));
- return dashboards[0];
- }
-
-}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java b/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
deleted file mode 100644
index 5b8446c6..00000000
--- a/api/src/test/java/org/hisp/dhis/android/core/interpretation/InterpretationTests.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.hisp.dhis.android.core.interpretation;
-
-import static org.junit.Assert.assertTrue;
-
-import org.hisp.dhis.android.core.commons.DateTestUtils;
-import org.hisp.dhis.android.core.commons.FileReader;
-import org.hisp.dhis.android.core.commons.JsonParser;
-import org.hisp.dhis.android.dashboard.api.models.Access;
-import org.hisp.dhis.android.dashboard.api.models.Interpretation;
-import org.hisp.dhis.android.dashboard.api.models.InterpretationComment;
-import org.hisp.dhis.android.dashboard.api.models.InterpretationElement;
-import org.hisp.dhis.android.dashboard.api.models.User;
-import org.junit.Test;
-
-import java.io.IOException;
-
-public class InterpretationTests {
-
- @Test
- public void interpretation_shouldMapFromJsonString() throws IOException {
- Interpretation interpretation = getInterpretationFromJson();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretation.getCreated(),
- "2017-10-21T10:10:43.451"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretation.getLastUpdated(),
- "2017-10-21T10:10:43.451"));
- assertTrue(interpretation.getName().equals("BR11Oy1Q4yR"));
- assertTrue(interpretation.getUId().equals("BR11Oy1Q4yR"));
- assertTrue(interpretation.getDisplayName().equals("BR11Oy1Q4yR"));
- assertTrue(interpretation.getType().equals("CHART"));
- assertTrue(interpretation.getText().equals(
- "This chart shows that BCG doses is low for 2014, why is that?"));
- Access access = getAccessObject();
- assertTrue(interpretation.getAccess().isDelete() == access.isDelete());
- assertTrue(interpretation.getAccess().isExternalize() == access.isExternalize());
- assertTrue(interpretation.getAccess().isManage() == access.isManage());
- assertTrue(interpretation.getAccess().isRead() == access.isRead());
- assertTrue(interpretation.getAccess().isWrite() == access.isWrite());
- }
-
- @Test
- public void interpretation_chart_shouldMapFromJsonString() throws IOException {
- Interpretation interpretation = getInterpretationFromJson();
- InterpretationElement interpretationElement = interpretation.getChart();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationElement
- .getCreated(), "2013-05-29T12:52:54.560"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationElement
- .getLastUpdated(), "2015-07-15T15:25:20.264"));
- assertTrue(interpretationElement.getName().equals(
- "Immunization: BCG, Measles, YF doses comparison"));
- assertTrue(interpretationElement.getUId().equals("R9A0rvAydpn"));
- assertTrue(interpretationElement.getDisplayName().equals(
- "Immunization: BCG, Measles, YF doses comparison"));
- assertTrue(interpretationElement.getType() == null);
- assertTrue(interpretationElement.getAccess() == null);
- }
-
- @Test
- public void interpretation_user_shouldMapFromJsonString() throws IOException {
- Interpretation interpretation = getInterpretationFromJson();
- User user = interpretation.getUser();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user
- .getCreated(), "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user
- .getLastUpdated(), "2017-01-19T14:24:04.447"));
- assertTrue(user.getName().equals(
- "John Traore"));
- assertTrue(user.getUId().equals("xE7jOejl9FI"));
- assertTrue(user.getDisplayName().equals(
- "John Traore"));
- }
-
- @Test
- public void interpretation_first_comment_shouldMapFromJsonString() throws IOException {
- InterpretationComment interpretationComment = getFirstCommentFromInterpretationJson();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationComment.getCreated(),
- "2014-10-21T10:11:19.537"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(
- interpretationComment.getLastUpdated(),
- "2014-10-21T10:11:19.537"));
- assertTrue(interpretationComment.getUId().equals("Eg7x5Kt2XgV"));
- assertTrue(interpretationComment.getText().equals(
- "It might be caused by a stock-out of vaccines."));
- }
-
- @Test
- public void interpretation_second_comment_shouldMapFromJsonString() throws IOException {
- InterpretationComment interpretationComment = getSecondCommentFromInterpretationJson();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(interpretationComment.getCreated(),
- "2014-10-21T10:11:44.325"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(
- interpretationComment.getLastUpdated(),
- "2014-10-21T10:11:44.325"));
- assertTrue(interpretationComment.getUId().equals("oRmqfmnCLsQ"));
- assertTrue(interpretationComment.getText().equals("Yes I believe so"));
- }
-
- @Test
- public void interpretation_comments_first_user_shouldMapFromJsonString() throws IOException {
- User user = getUserFromInterpretationJsonFirstComment();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
- "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
- "2017-01-19T14:24:04.447"));
- assertTrue(user.getName().equals("John Traore"));
- assertTrue(user.getUId().equals("xE7jOejl9FI"));
- assertTrue(user.getDisplayName().equals("John Traore"));
-
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
- "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
- "2017-01-19T14:24:04.447"));
- assertTrue(user.getName().equals("John Traore"));
- assertTrue(user.getUId().equals("xE7jOejl9FI"));
- assertTrue(user.getDisplayName().equals("John Traore"));
- }
-
- @Test
- public void interpretation_comments_second_user_shouldMapFromJsonString() throws IOException {
- User user = getUserFromInterpretationJsonSecondComment();
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
- "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
- "2017-01-19T14:24:04.447"));
- assertTrue(user.getName().equals("John Traore"));
- assertTrue(user.getUId().equals("xE7jOejl9FI"));
- assertTrue(user.getDisplayName().equals("John Traore"));
-
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getCreated(),
- "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(user.getLastUpdated(),
- "2017-01-19T14:24:04.447"));
- assertTrue(user.getName().equals("John Traore"));
- assertTrue(user.getUId().equals("xE7jOejl9FI"));
- assertTrue(user.getDisplayName().equals("John Traore"));
- }
-
- private User getUserFromInterpretationJsonSecondComment() throws IOException {
- Interpretation interpretation = getInterpretationFromJson();
- InterpretationComment interpretationComment = interpretation.getComments().get(1);
- return interpretationComment.getUser();
- }
-
- private InterpretationComment getFirstCommentFromInterpretationJson() throws IOException {
- return getInterpretationComment(0);
- }
-
- private InterpretationComment getSecondCommentFromInterpretationJson() throws IOException {
- return getInterpretationComment(1);
- }
-
- private InterpretationComment getInterpretationComment(int index) throws IOException {
- Interpretation interpretation = getInterpretationFromJson();
- return interpretation.getComments().get(index);
- }
-
- private User getUserFromInterpretationJsonFirstComment() throws IOException {
- InterpretationComment interpretationComment =
- getFirstCommentFromInterpretationJson();
- return interpretationComment.getUser();
- }
-
- private Interpretation getInterpretationFromJson() throws IOException {
- return (Interpretation) JsonParser.getModelFromJson(Interpretation.class,
- new FileReader().getStringFromFile("interpretation.json"));
- }
-
- private Access getAccessObject() {
- Access access = new Access();
- access.setDelete(true);
- access.setExternalize(false);
- access.setManage(true);
- access.setRead(true);
- access.setUpdate(true);
- access.setWrite(true);
- return access;
- }
-}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java b/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
deleted file mode 100644
index ed19ac70..00000000
--- a/api/src/test/java/org/hisp/dhis/android/core/systeminfo/SystemInfoTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.hisp.dhis.android.core.systeminfo;
-
-import static org.junit.Assert.assertTrue;
-
-import org.hisp.dhis.android.core.commons.DateTestUtils;
-import org.hisp.dhis.android.core.commons.FileReader;
-import org.hisp.dhis.android.core.commons.JsonParser;
-import org.hisp.dhis.android.dashboard.api.models.SystemInfo;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.text.ParseException;
-
-public class SystemInfoTests {
-
- @Test
- public void systemInfo_should_map_from_json_String() throws IOException, ParseException {
- SystemInfo systemInfo = (SystemInfo) JsonParser.getModelFromJson(SystemInfo.class,
- new FileReader().getStringFromFile("systeminfo.json"));
-
- assertTrue(systemInfo.getVersion().equals("2.26"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(systemInfo.getBuildTime(),
- "2017-05-04T06:37:32.000"));
- assertTrue(systemInfo.getCalendar().equals("iso8601"));
- assertTrue(systemInfo.getIntervalSinceLastAnalyticsTableSuccess().equals("2345 h, 15 m, 11 s"));
- assertTrue(systemInfo.getLastAnalyticsTableSuccess().equals("2017-01-26T23:19:34.009"));
- assertTrue(systemInfo.getRevision().equals("f297d4c"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(systemInfo.getServerDate(),
- "2017-05-04T16:34:45.957"));
- assertTrue(systemInfo.getDateFormat().equals("yyyy-mm-dd"));
- }
-
-
-}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/PreconditionsTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
similarity index 67%
rename from api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
index cd7678be..9255e9a6 100644
--- a/api/src/test/java/org/hisp/dhis/android/core/api/BasicAuthenticatorTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
@@ -28,38 +28,41 @@
package org.hisp.dhis.android.core.api;
+import static com.squareup.okhttp.Credentials.basic;
+
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.mockito.Mockito.when;
-import static okhttp3.Credentials.basic;
-
+import org.hisp.dhis.android.dashboard.api.models.meta.Credentials;
+import org.hisp.dhis.android.dashboard.api.network.DhisApi;
+import org.hisp.dhis.android.dashboard.api.network.RepoManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.mockwebserver.MockResponse;
-import okhttp3.mockwebserver.MockWebServer;
-import okhttp3.mockwebserver.RecordedRequest;
+import com.squareup.okhttp.HttpUrl;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import com.squareup.okhttp.mockwebserver.RecordedRequest;
// ToDo: Solve problem with INFO logs from MockWebServer being interpreted as errors in gradle
@RunWith(JUnit4.class)
public class BasicAuthenticatorTests {
-/*
- @Mock
- private AuthenticatedUserStore authenticatedUserStore;
+
+ Credentials credentials = new Credentials("test_user","test_password");
private MockWebServer mockWebServer;
private OkHttpClient okHttpClient;
+ private DhisApi mDhisApi;
@Before
public void setUp() throws IOException {
@@ -68,43 +71,39 @@ public void setUp() throws IOException {
mockWebServer = new MockWebServer();
mockWebServer.enqueue(new MockResponse());
mockWebServer.start();
+ okHttpClient=RepoManager.provideOkHttpClient(credentials);
- okHttpClient = new OkHttpClient.Builder()
- .addInterceptor(new BasicAuthenticator(authenticatedUserStore))
- .build();
}
@Test
public void authenticator_shouldAddAuthorizationHeader() throws IOException, InterruptedException {
- AuthenticatedUserModel authenticatedUserModel =
- AuthenticatedUserModel.builder()
- .user("test_user")
- .credentials(base64("test_user", "test_password"))
- .build();
-
- when(authenticatedUserStore.query()).thenReturn(Arrays.asList(authenticatedUserModel));
okHttpClient.newCall(
new Request.Builder()
- .url(mockWebServer.url("/api/me/"))
+ .url(mockWebServer.url("/"))
.build())
.execute();
- RecordedRequest recordedRequest = mockWebServer.takeRequest();
- assertThat(recordedRequest.getHeader("Authorization"))
- .isEqualTo(basic("test_user", "test_password"));
+ RecordedRequest recordedRequest = null;
+ try {
+ recordedRequest = mockWebServer.takeRequest();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ mDhisApi = RepoManager.createService(mockWebServer.url("/system/info/"), credentials);
+ assertThat(recordedRequest.getHeader("Authorization")).isNull();
}
@Test
public void authenticator_shouldNotModifyRequestIfNoUsers() throws IOException, InterruptedException {
- when(authenticatedUserStore.query()).thenReturn(new ArrayList());
-
+ assertThat(okHttpClient.getAuthenticator()).isNull();
+ String base64Credentials = basic(credentials.getUsername(), credentials.getPassword());
okHttpClient.newCall(
new Request.Builder()
- .url(mockWebServer.url("/api/me/"))
+ .url(mockWebServer.url("/system/info/"))
+ .addHeader("Authorization", base64Credentials)
.build())
.execute();
-
RecordedRequest recordedRequest = mockWebServer.takeRequest();
assertThat(recordedRequest.getHeader("Authorization")).isNull();
}
@@ -113,5 +112,5 @@ public void authenticator_shouldNotModifyRequestIfNoUsers() throws IOException,
public void tearDown() throws IOException {
mockWebServer.shutdown();
}
- */
+
}
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/commons/DateTestUtils.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/commons/FileReader.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/commons/JsonParser.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/converters/AccessConverterTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/converters/DateTimeConverterTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/converters/StateConverterTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/meta/CredentialsTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/network/ApiExceptionTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
similarity index 100%
rename from api/src/test/java/org/hisp/dhis/android/core/user/UserTests.java
rename to api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
diff --git a/api/src/test/resources/access_all_false_string.txt b/api/src/test/resources/access_all_false_string.json
similarity index 100%
rename from api/src/test/resources/access_all_false_string.txt
rename to api/src/test/resources/access_all_false_string.json
diff --git a/api/src/test/resources/access_all_true_string.json b/api/src/test/resources/access_all_true_string.json
new file mode 100644
index 00000000..75d73647
--- /dev/null
+++ b/api/src/test/resources/access_all_true_string.json
@@ -0,0 +1,8 @@
+{
+ "manage": true,
+ "externalize": true,
+ "write": true,
+ "read": true,
+ "update": true,
+ "delete": true
+}
\ No newline at end of file
diff --git a/api/src/test/resources/access_all_true_string.txt b/api/src/test/resources/access_all_true_string.txt
deleted file mode 100644
index 86766b27..00000000
--- a/api/src/test/resources/access_all_true_string.txt
+++ /dev/null
@@ -1 +0,0 @@
-{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true}
\ No newline at end of file
diff --git a/api/src/test/resources/dashboard.json b/api/src/test/resources/dashboard.json
deleted file mode 100644
index 2214b078..00000000
--- a/api/src/test/resources/dashboard.json
+++ /dev/null
@@ -1,133 +0,0 @@
-[{
- "lastUpdated": "2016-10-11T19:24:33.599",
- "created": "2013-09-08T21:47:17.960",
- "name": "Antenatal Care",
- "id": "nghVC4wtyzi",
- "displayName": "Antenatal Care",
- "access": {
- "read": true,
- "update": true,
- "externalize": true,
- "delete": true,
- "write": true,
- "manage": true
- },
- "dashboardItems": [{
- "created": "2016-10-10T17:24:30.487",
- "lastUpdated": "2016-10-10T17:24:30.487",
- "id": "cX2przhv9UC",
- "shape": "NORMAL",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2016-10-10T17:24:49.196",
- "created": "2016-10-10T17:24:49.196",
- "name": "ANC: ANC IPT 1 Coverage last 12 months districts",
- "id": "VffWmdKFHSq",
- "displayName": "ANC: ANC IPT 1 Coverage last 12 months districts"
- }
- }, {
- "created": "2016-08-02T11:57:55.229",
- "lastUpdated": "2016-08-02T11:57:55.229",
- "id": "JcO7yJlKIa3",
- "shape": "NORMAL",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2016-10-10T17:08:15.277",
- "created": "2016-10-10T17:08:15.277",
- "name": "ANC: ANC 3 coverage by districts last 4 quarters",
- "id": "CNkMibmx1Zr",
- "displayName": "ANC: ANC 3 coverage by districts last 4 quarters"
- }
- }, {
- "created": "2015-01-16T11:52:44.928",
- "lastUpdated": "2015-01-16T11:52:44.928",
- "id": "OiyMNoXzSdY",
- "shape": "NORMAL",
- "type": "MAP",
- "map": {
- "lastUpdated": "2013-09-09T16:35:12.062",
- "created": "2012-11-14T12:56:59.322",
- "name": "ANC: LLITN coverage district and facility",
- "id": "ZBjCfSaLSqD",
- "displayName": "ANC: LLITN coverage district and facility"
- }
- }, {
- "created": "2016-04-21T15:37:07.740",
- "lastUpdated": "2016-04-21T15:37:07.740",
- "id": "i6NTSuDsk6l",
- "shape": "NORMAL",
- "type": "MAP",
- "map": {
- "lastUpdated": "2016-10-10T18:16:43.265",
- "created": "2016-10-10T18:16:43.261",
- "name": "ANC: IPT 2 Coverage this year",
- "id": "voX07ulo2Bq",
- "displayName": "ANC: IPT 2 Coverage this year"
- }
- }, {
- "created": "2015-01-15T16:50:51.427",
- "lastUpdated": "2015-08-09T22:10:20.307",
- "id": "YZ7U25Japom",
- "shape": "DOUBLE_WIDTH",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2015-07-15T15:25:20.004",
- "created": "2015-01-15T16:50:34.302",
- "name": "ANC: ANC 1 coverage western chiefdoms this year",
- "id": "zKl0LcQyxPl",
- "displayName": "ANC: ANC 1 coverage western chiefdoms this year"
- }
- }, {
- "created": "2016-08-02T11:57:59.474",
- "lastUpdated": "2016-10-10T17:11:06.823",
- "id": "UQeYhQOJ2f1",
- "shape": "DOUBLE_WIDTH",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2016-08-02T11:58:28.517",
- "created": "2016-08-02T11:53:53.607",
- "name": "ANC: IPT 1 Coverage by districts last 4 quarters",
- "id": "DHPu0vtZ2mW",
- "displayName": "ANC: IPT 1 Coverage by districts last 4 quarters"
- }
- }, {
- "created": "2014-04-03T14:11:10.942",
- "lastUpdated": "2016-10-11T09:29:40.874",
- "id": "xS4X0ZL6GCI",
- "shape": "DOUBLE_WIDTH",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2015-07-15T15:25:20.312",
- "created": "2014-04-03T14:07:29.442",
- "name": "ANC: Fixed vs Outreach last year",
- "id": "AVZpYsdG44G",
- "displayName": "ANC: Fixed vs Outreach last year"
- }
- }, {
- "created": "2016-10-11T19:24:21.931",
- "lastUpdated": "2016-10-11T19:24:21.931",
- "id": "ZF9vWMXob7N",
- "shape": "NORMAL",
- "type": "MAP",
- "map": {
- "lastUpdated": "2016-10-11T19:23:49.953",
- "created": "2016-10-11T19:23:49.952",
- "name": "ANC: ANC 1 coverage Sierra Leone dark basemap",
- "id": "qTfO4YkQ9xW",
- "displayName": "ANC: ANC 1 coverage Sierra Leone dark basemap"
- }
- }, {
- "created": "2014-04-03T14:09:47.075",
- "lastUpdated": "2016-10-11T09:19:35.442",
- "id": "kHRSFUr3dYe",
- "shape": "NORMAL",
- "type": "CHART",
- "chart": {
- "lastUpdated": "2015-07-15T15:25:20.315",
- "created": "2014-04-03T14:09:05.734",
- "name": "ANC: 4+ visits by Facility Type last year",
- "id": "ZfQMIA4o2s3",
- "displayName": "ANC: 4+ visits by Facility Type last year"
- }
- }]
-}]
\ No newline at end of file
diff --git a/api/src/test/resources/interpretation.json b/api/src/test/resources/interpretation.json
deleted file mode 100644
index 38c5f367..00000000
--- a/api/src/test/resources/interpretation.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "created": "2017-10-21T10:10:43.451",
- "lastUpdated": "2017-10-21T10:10:43.451",
- "name": "BR11Oy1Q4yR",
- "id": "BR11Oy1Q4yR",
- "displayName": "BR11Oy1Q4yR",
- "type": "CHART",
- "text": "This chart shows that BCG doses is low for 2014, why is that?",
- "access": {
- "read": true,
- "update": true,
- "externalize": false,
- "delete": true,
- "write": true,
- "manage": true
- },
- "chart": {
- "lastUpdated": "2015-07-15T15:25:20.264",
- "created": "2013-05-29T12:52:54.560",
- "name": "Immunization: BCG, Measles, YF doses comparison",
- "id": "R9A0rvAydpn",
- "displayName": "Immunization: BCG, Measles, YF doses comparison"
- },
- "user": {
- "lastUpdated": "2017-01-19T14:24:04.447",
- "created": "2013-04-18T17:15:08.407",
- "name": "John Traore",
- "id": "xE7jOejl9FI",
- "displayName": "John Traore"
- },
- "comments": [
- {
- "lastUpdated": "2014-10-21T10:11:19.537",
- "created": "2014-10-21T10:11:19.537",
- "id": "Eg7x5Kt2XgV",
- "text": "It might be caused by a stock-out of vaccines.",
- "user": {
- "lastUpdated": "2017-01-19T14:24:04.447",
- "created": "2013-04-18T17:15:08.407",
- "name": "John Traore",
- "id": "xE7jOejl9FI",
- "displayName": "John Traore"
- }
- },
- {
- "lastUpdated": "2014-10-21T10:11:44.325",
- "created": "2014-10-21T10:11:44.325",
- "id": "oRmqfmnCLsQ",
- "text": "Yes I believe so",
- "user": {
- "lastUpdated": "2017-01-19T14:24:04.447",
- "created": "2013-04-18T17:15:08.407",
- "name": "John Traore",
- "id": "xE7jOejl9FI",
- "displayName": "John Traore"
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/api/src/test/resources/systeminfo.json b/api/src/test/resources/systeminfo.json
deleted file mode 100644
index 436de5b4..00000000
--- a/api/src/test/resources/systeminfo.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "contextPath": "https://play.dhis2.org/demo",
- "userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0",
- "calendar": "iso8601",
- "dateFormat": "yyyy-mm-dd",
- "serverDate": "2017-05-04T16:34:45.957",
- "lastAnalyticsTableSuccess": "2017-01-26T23:19:34.009",
- "intervalSinceLastAnalyticsTableSuccess": "2345 h, 15 m, 11 s",
- "lastAnalyticsTableRuntime": "5 m, 17 s",
- "version": "2.26",
- "revision": "f297d4c",
- "buildTime": "2017-05-04T06:37:32.000",
- "jasperReportsVersion": "6.3.1",
- "environmentVariable": "DHIS2_HOME",
- "readOnlyMode": "off",
- "databaseInfo": {
- "type": "PostgreSQL",
- "spatialSupport": true
- },
- "encryption": false,
- "isMetadataVersionEnabled": true,
- "isMetadataSyncEnabled": false
-}
\ No newline at end of file
diff --git a/api/src/test/resources/user.json b/api/src/test/resources/userAccount.json
similarity index 100%
rename from api/src/test/resources/user.json
rename to api/src/test/resources/userAccount.json
From 44e0af87c1cc3616d23a5e80b3fe52618690bcd0 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 8 May 2017 17:01:38 +0200
Subject: [PATCH 08/69] Make public the provideDefaultAccess to access it
during test
---
.../java/org/hisp/dhis/android/dashboard/api/models/Access.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/Access.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/Access.java
index bc2c182f..8fc263f9 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/Access.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/Access.java
@@ -58,7 +58,7 @@ public final class Access {
*
* @return new Access object.
*/
- static Access provideDefaultAccess() {
+ public static Access provideDefaultAccess() {
Access access = new Access();
access.setManage(true);
access.setExternalize(true);
From ec19cd2d304b24f6b538b60b9c5a44ce1c54e00e Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 8 May 2017 17:01:50 +0200
Subject: [PATCH 09/69] Refactor tests
---
.../dashboard/api/PreconditionsTests.java | 2 +-
.../api/api/BasicAuthenticatorTests.java | 116 ------------------
.../dashboard/api/commons/DateTestUtils.java | 2 +-
.../dashboard/api/commons/FileReader.java | 2 +-
.../dashboard/api/commons/JsonParser.java | 2 +-
.../api/converters/AccessConverterTests.java | 35 +++---
.../converters/DateTimeConverterTests.java | 38 +++---
.../api/converters/StateConverterTests.java | 2 +-
.../dashboard/api/meta/CredentialsTests.java | 2 +-
.../api/network/ApiExceptionTests.java | 13 +-
.../android/dashboard/api/user/UserTests.java | 42 ++-----
11 files changed, 52 insertions(+), 204 deletions(-)
delete mode 100644 api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java
index d6e851a6..deaf35cc 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/PreconditionsTests.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core;
+package org.hisp.dhis.android.dashboard.api;
import org.hisp.dhis.android.dashboard.api.utils.Preconditions;
import org.junit.Rule;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
deleted file mode 100644
index 9255e9a6..00000000
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/api/BasicAuthenticatorTests.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2017, University of Oslo
- *
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.hisp.dhis.android.core.api;
-
-import static com.squareup.okhttp.Credentials.basic;
-
-import static org.assertj.core.api.Java6Assertions.assertThat;
-import static org.mockito.Mockito.when;
-
-import org.hisp.dhis.android.dashboard.api.models.meta.Credentials;
-import org.hisp.dhis.android.dashboard.api.network.DhisApi;
-import org.hisp.dhis.android.dashboard.api.network.RepoManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.mockito.MockitoAnnotations;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import com.squareup.okhttp.HttpUrl;
-import com.squareup.okhttp.OkHttpClient;
-import com.squareup.okhttp.Request;
-import com.squareup.okhttp.Response;
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-import com.squareup.okhttp.mockwebserver.RecordedRequest;
-
-// ToDo: Solve problem with INFO logs from MockWebServer being interpreted as errors in gradle
-@RunWith(JUnit4.class)
-public class BasicAuthenticatorTests {
-
- Credentials credentials = new Credentials("test_user","test_password");
-
- private MockWebServer mockWebServer;
- private OkHttpClient okHttpClient;
- private DhisApi mDhisApi;
-
- @Before
- public void setUp() throws IOException {
- MockitoAnnotations.initMocks(this);
-
- mockWebServer = new MockWebServer();
- mockWebServer.enqueue(new MockResponse());
- mockWebServer.start();
- okHttpClient=RepoManager.provideOkHttpClient(credentials);
-
- }
-
- @Test
- public void authenticator_shouldAddAuthorizationHeader() throws IOException, InterruptedException {
-
- okHttpClient.newCall(
- new Request.Builder()
- .url(mockWebServer.url("/"))
- .build())
- .execute();
-
- RecordedRequest recordedRequest = null;
- try {
- recordedRequest = mockWebServer.takeRequest();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- mDhisApi = RepoManager.createService(mockWebServer.url("/system/info/"), credentials);
- assertThat(recordedRequest.getHeader("Authorization")).isNull();
- }
-
- @Test
- public void authenticator_shouldNotModifyRequestIfNoUsers() throws IOException, InterruptedException {
- assertThat(okHttpClient.getAuthenticator()).isNull();
- String base64Credentials = basic(credentials.getUsername(), credentials.getPassword());
- okHttpClient.newCall(
- new Request.Builder()
- .url(mockWebServer.url("/system/info/"))
- .addHeader("Authorization", base64Credentials)
- .build())
- .execute();
- RecordedRequest recordedRequest = mockWebServer.takeRequest();
- assertThat(recordedRequest.getHeader("Authorization")).isNull();
- }
-
- @After
- public void tearDown() throws IOException {
- mockWebServer.shutdown();
- }
-
-}
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
index f71391da..e1087ca4 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core.commons;
+package org.hisp.dhis.android.dashboard.api.commons;
import org.joda.time.DateTime;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
index 5b53187f..2bfed03c 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core.commons;
+package org.hisp.dhis.android.dashboard.api.commons;
import java.io.BufferedReader;
import java.io.File;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java
index 7a586257..3512c207 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/JsonParser.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core.commons;
+package org.hisp.dhis.android.dashboard.api.commons;
import org.hisp.dhis.android.dashboard.api.utils.ObjectMapperProvider;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java
index b0a9e7f6..b64e79d4 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/AccessConverterTests.java
@@ -1,40 +1,29 @@
-package org.hisp.dhis.android.core.converters;
+package org.hisp.dhis.android.dashboard.api.converters;
import static junit.framework.Assert.assertTrue;
-import org.hisp.dhis.android.core.commons.FileReader;
+import org.hisp.dhis.android.dashboard.api.commons.FileReader;
import org.hisp.dhis.android.dashboard.api.models.Access;
import org.hisp.dhis.android.dashboard.api.persistence.converters.AccessConverter;
-import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class AccessConverterTests {
- public static Access accessObject;
+ public static final String ACCESS_ALL_FALSE_STRING_TXT = "access_all_false_string.json";
+ public static final String ACCESS_ALL_TRUE_STRING_TXT = "access_all_true_string.json";
AccessConverter accessConverter = new AccessConverter();
- @Before
- public void setUp() throws Exception {
- accessObject = new Access();
- accessObject.setDelete(true);
- accessObject.setWrite(true);
- accessObject.setUpdate(true);
- accessObject.setRead(true);
- accessObject.setManage(true);
- accessObject.setExternalize(true);
- }
-
@Test
public void convert_access_object_to_database_string() throws Exception {
- String access = new FileReader().getStringFromFile("access_all_true_string.txt");
- assertTrue(accessConverter.getDBValue(accessObject).equals(access));
+ String access = getAccessFromJson(ACCESS_ALL_TRUE_STRING_TXT);
+ assertTrue(accessConverter.getDBValue(Access.provideDefaultAccess()).equals(access));
}
@Test
public void convert_access_all_true_database_string_to_model() throws IOException {
- Access access = accessConverter.getModelValue( new FileReader().getStringFromFile(
- "access_all_true_string.txt"));
+ Access access = accessConverter.getModelValue(
+ getAccessFromJson(ACCESS_ALL_TRUE_STRING_TXT));
assertTrue(access.isDelete());
assertTrue(access.isRead());
assertTrue(access.isWrite());
@@ -44,12 +33,16 @@ public void convert_access_all_true_database_string_to_model() throws IOExceptio
@Test
public void convert_access_all_false_database_string_to_model() throws IOException {
- Access access = accessConverter.getModelValue( new FileReader().getStringFromFile(
- "access_all_false_string.txt"));
+ Access access = accessConverter.getModelValue(
+ getAccessFromJson(ACCESS_ALL_FALSE_STRING_TXT));
assertTrue(!access.isDelete());
assertTrue(!access.isRead());
assertTrue(!access.isWrite());
assertTrue(!access.isManage());
assertTrue(!access.isExternalize());
}
+
+ private String getAccessFromJson(String json) throws IOException {
+ return new FileReader().getStringFromFile(json).replaceAll(" ", "").replace("\t", "");
+ }
}
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java
index 89b74161..4820d504 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/DateTimeConverterTests.java
@@ -1,11 +1,10 @@
-package org.hisp.dhis.android.core.converters;
+package org.hisp.dhis.android.dashboard.api.converters;
import static junit.framework.Assert.assertTrue;
-import org.hisp.dhis.android.core.commons.DateTestUtils;
+import org.hisp.dhis.android.dashboard.api.commons.DateTestUtils;
import org.hisp.dhis.android.dashboard.api.persistence.converters.DateTimeConverter;
import org.joda.time.DateTime;
-import org.junit.Before;
import org.junit.Test;
import java.util.Calendar;
@@ -17,22 +16,6 @@ public class DateTimeConverterTests {
DateTimeConverter dateTimeConverter = new DateTimeConverter();
- DateTime dateTime;
-
- @Before
- public void setUp() throws Exception {
- Calendar calendar = Calendar.getInstance();
- calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
- calendar.set(Calendar.YEAR, 2016);
- calendar.set(Calendar.MONTH, 04);
- calendar.set(Calendar.DAY_OF_MONTH, 21);
- calendar.set(Calendar.HOUR_OF_DAY, 15);
- calendar.set(Calendar.MINUTE, 37);
- calendar.set(Calendar.SECOND, 07);
- calendar.set(Calendar.MILLISECOND, 740);
- dateTime = new DateTime(calendar);
- }
-
@Test
public void convert_datetime_string_to_object() throws Exception {
DateTime convertedDate = dateTimeConverter.getModelValue(DATETIME_AS_STRING);
@@ -42,9 +25,22 @@ public void convert_datetime_string_to_object() throws Exception {
@Test
public void convert_datetime_object_to_string() throws Exception {
- String converterDate = dateTimeConverter.getDBValue(dateTime);
+ String converterDate = dateTimeConverter.getDBValue(createStubDateTime());
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(dateTime, converterDate));
+ assertTrue(DateTestUtils.compareParsedDateWithStringDate(createStubDateTime(), converterDate));
}
+
+ private DateTime createStubDateTime(){
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
+ calendar.set(Calendar.YEAR, 2016);
+ calendar.set(Calendar.MONTH, 04);
+ calendar.set(Calendar.DAY_OF_MONTH, 21);
+ calendar.set(Calendar.HOUR_OF_DAY, 15);
+ calendar.set(Calendar.MINUTE, 37);
+ calendar.set(Calendar.SECOND, 07);
+ calendar.set(Calendar.MILLISECOND, 740);
+ return new DateTime(calendar);
+ }
}
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java
index 7368763f..fbe2fa59 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/converters/StateConverterTests.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core.converters;
+package org.hisp.dhis.android.dashboard.api.converters;
import static junit.framework.Assert.assertTrue;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java
index 5622f79a..f35115eb 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/meta/CredentialsTests.java
@@ -1,4 +1,4 @@
-package org.hisp.dhis.android.core.meta;
+package org.hisp.dhis.android.dashboard.api.meta;
import org.hisp.dhis.android.dashboard.api.models.meta.Credentials;
import org.junit.Rule;
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java
index 21ae331f..7451f712 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/network/ApiExceptionTests.java
@@ -1,8 +1,7 @@
-package org.hisp.dhis.android.core.network;
+package org.hisp.dhis.android.dashboard.api.network;
import static org.junit.Assert.assertTrue;
-import org.hisp.dhis.android.dashboard.api.network.APIException;
import org.junit.Test;
import java.io.IOException;
@@ -30,8 +29,7 @@ public void retrofit_network_exception_map_to_api_exception() {
@Test
public void retrofit_conversion_exception_map_to_api_exception() {
- APIException apiException = APIException.fromRetrofitError(
- getConversionExceptionFromRetrofit());
+ APIException apiException = getConversionExceptionFromRetrofit();
assertTrue(apiException.getKind().equals(APIException.Kind.CONVERSION));
assertTrue(apiException.getUrl().equals("test_message"));
}
@@ -56,9 +54,10 @@ private APIException getNetworkExceptionFromRetrofit() {
RetrofitError.networkError("test_message", new IOException()));
}
- private RetrofitError getConversionExceptionFromRetrofit() {
- return RetrofitError.conversionError("test_message", response, converter,
- type, new ConversionException("test_message"));
+ private APIException getConversionExceptionFromRetrofit() {
+ return APIException.fromRetrofitError(
+ RetrofitError.conversionError("test_message", response, converter,
+ type, new ConversionException("test_message")));
}
private APIException getUnexpectedExceptionFromRetrofit() {
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
index 3e4a14c0..205cdee9 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
@@ -1,13 +1,12 @@
-package org.hisp.dhis.android.core.user;
+package org.hisp.dhis.android.dashboard.api.user;
import static org.junit.Assert.assertTrue;
-import org.hisp.dhis.android.core.commons.DateTestUtils;
-import org.hisp.dhis.android.core.commons.FileReader;
-import org.hisp.dhis.android.core.commons.JsonParser;
+import org.hisp.dhis.android.dashboard.api.commons.DateTestUtils;
+import org.hisp.dhis.android.dashboard.api.commons.FileReader;
+import org.hisp.dhis.android.dashboard.api.commons.JsonParser;
import org.hisp.dhis.android.dashboard.api.models.User;
import org.hisp.dhis.android.dashboard.api.models.UserAccount;
-import org.hisp.dhis.android.dashboard.api.models.meta.State;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -19,7 +18,7 @@ public class UserTests {
public ExpectedException thrown = ExpectedException.none();
@Test
- public void userAccount_should_map_to_user() throws IOException {
+ public void userAccount_conversion_to_user() throws IOException {
UserAccount userAccount = getUserAccountFromJson();
User user = UserAccount.toUser(userAccount);
assertTrue(user.getUId().equals("xE7jOejl9FI"));
@@ -32,33 +31,10 @@ public void userAccount_should_map_to_user() throws IOException {
assertTrue(user.getAccess() == null);
}
- @Test
- public void user_should_map_from_json_string() throws IOException {
- UserAccount userAccount = getUserAccountFromJson();
- assertTrue(userAccount.getUId().equals("xE7jOejl9FI"));
- assertTrue(userAccount.getName().equals("John Traore"));
- assertTrue(userAccount.getDisplayName().equals("John Traore"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(userAccount.getCreated(),
- "2013-04-18T17:15:08.407"));
- assertTrue(DateTestUtils.compareParsedDateWithStringDate(userAccount.getLastUpdated(),
- "2017-05-02T17:02:37.817"));
- assertTrue(userAccount.getAccess() == null);
- assertTrue(userAccount.getState().equals(State.SYNCED));
- assertTrue(userAccount.getFirstName().equals("John"));
- assertTrue(userAccount.getSurname().equals("Traore"));
- assertTrue(userAccount.getGender().equals("gender_male"));
- assertTrue(userAccount.getBirthday().equals("1971-04-08T00:00:00.000"));
- assertTrue(userAccount.getIntroduction().equals("I am the super user of DHIS 2"));
- assertTrue(userAccount.getEducation().equals("Master of super using"));
- assertTrue(userAccount.getEmployer().equals("DHIS"));
- assertTrue(userAccount.getInterests().equals("Football, swimming, singing, dancing"));
- assertTrue(userAccount.getJobTitle().equals("Super user"));
- assertTrue(userAccount.getLanguages().equals("English"));
- assertTrue(userAccount.getEmail().equals("someone@dhis2.org"));
- assertTrue(userAccount.getPhoneNumber() == null);
- }
-
private UserAccount getUserAccountFromJson() throws IOException {
- return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, new FileReader().getStringFromFile("user.json"));
+ return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, new FileReader().getStringFromFile(
+
+
+ "userAccount.json"));
}
}
\ No newline at end of file
From 8825ffa3c724e26c1438864fddd80540761703ae Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 8 May 2017 17:07:10 +0200
Subject: [PATCH 10/69] make private some public methods
---
.../hisp/dhis/android/dashboard/api/commons/DateTestUtils.java | 2 +-
.../org/hisp/dhis/android/dashboard/api/commons/FileReader.java | 2 +-
.../org/hisp/dhis/android/dashboard/api/user/UserTests.java | 2 --
3 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
index e1087ca4..d69740ca 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/DateTestUtils.java
@@ -10,7 +10,7 @@
public class DateTestUtils {
public final static String DHIS2_GMT_NEW_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";
- public static Date parseDate(String date, String format) {
+ private static Date parseDate(String date, String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
index 2bfed03c..90dc5bcc 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/commons/FileReader.java
@@ -8,7 +8,7 @@
import java.net.URL;
public class FileReader {
- public File getFile(String filename) {
+ private File getFile(String filename) {
ClassLoader classLoader = getClass().getClassLoader();
URL resource = classLoader.getResource(filename);
return new File(resource.getPath());
diff --git a/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java b/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
index 205cdee9..c642a2f7 100644
--- a/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
+++ b/api/src/test/java/org/hisp/dhis/android/dashboard/api/user/UserTests.java
@@ -33,8 +33,6 @@ public void userAccount_conversion_to_user() throws IOException {
private UserAccount getUserAccountFromJson() throws IOException {
return (UserAccount) JsonParser.getModelFromJson(UserAccount.class, new FileReader().getStringFromFile(
-
-
"userAccount.json"));
}
}
\ No newline at end of file
From 0548c9f0a75eaddeadea15b02aab5e579d34aef3 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Wed, 10 May 2017 21:53:15 +0200
Subject: [PATCH 11/69] refactor repeated image url builder
---
.../api/controllers/DhisController.java | 8 ++++++++
.../DashboardElementDetailActivity.java | 17 +++++------------
.../ui/adapters/DashboardItemAdapter.java | 13 +++----------
.../ui/adapters/InterpretationAdapter.java | 11 ++---------
4 files changed, 18 insertions(+), 31 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
index b0fcd96e..9b30c272 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
@@ -73,6 +73,14 @@ public static DhisController getInstance() {
return mDhisController;
}
+ public static String buildImageUrl(String resource, String id) {
+ return getInstance().getServerUrl().newBuilder()
+ .addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment(
+ "data.png")
+ .addQueryParameter("width", "480").addQueryParameter("height", "320")
+ .toString();
+ }
+
public UserAccount logInUser(HttpUrl serverUrl, Credentials credentials) throws APIException {
return signInUser(serverUrl, credentials);
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
index 8ad0094c..82c72e1b 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
@@ -72,13 +72,6 @@ public static Intent newIntentForInterpretationElement(Activity activity, long i
return intent;
}
- private static String buildImageUrl(String resource, String id) {
- return DhisController.getInstance().getServerUrl().newBuilder()
- .addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment("data.png")
- .addQueryParameter("width", "480").addQueryParameter("height", "320")
- .toString();
- }
-
private long getDashboardElementId() {
return getIntent().getLongExtra(DASHBOARD_ELEMENT_ID, -1);
}
@@ -136,17 +129,17 @@ private void handleDashboardElement(DashboardElement element) {
mToolbar.setTitle(element.getDisplayName());
switch (element.getDashboardItem().getType()) {
case DashboardItemContent.TYPE_CHART: {
- String request = buildImageUrl("charts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case DashboardItemContent.TYPE_EVENT_CHART: {
- String request = buildImageUrl("eventCharts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId());
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case DashboardItemContent.TYPE_MAP: {
- String request = buildImageUrl("maps", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
attachFragment(ImageViewFragment.newInstance(request));
break;
}
@@ -166,12 +159,12 @@ private void handleInterpretationElement(InterpretationElement element) {
mToolbar.setTitle(element.getDisplayName());
switch (element.getInterpretation().getType()) {
case Interpretation.TYPE_CHART: {
- String request = buildImageUrl("charts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case Interpretation.TYPE_MAP: {
- String request = buildImageUrl("maps", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
attachFragment(ImageViewFragment.newInstance(request));
break;
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
index d1c47311..9f1859b7 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
@@ -111,13 +111,6 @@ public DashboardItemAdapter(Context context, Access dashboardAccess,
mImageLoader = PicassoProvider.getInstance(context);
}
- private static String buildImageUrl(String resource, String id) {
- return DhisController.getInstance().getServerUrl().newBuilder()
- .addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment("data.png")
- .addQueryParameter("width", "480").addQueryParameter("height", "320")
- .toString();
- }
-
/* returns type of row depending on item content type. */
@Override
public int getItemViewType(int position) {
@@ -312,13 +305,13 @@ private void handleItemsWithImages(ImageItemViewHolder holder, DashboardItem ite
String request = null;
if (DashboardItemContent.TYPE_CHART.equals(item.getType()) && item.getChart() != null) {
element = item.getChart();
- request = buildImageUrl("charts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
} else if (DashboardItemContent.TYPE_MAP.equals(item.getType()) && item.getMap() != null) {
element = item.getMap();
- request = buildImageUrl("maps", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
} else if (DashboardItemContent.TYPE_EVENT_CHART.equals(item.getType()) && item.getEventChart() != null) {
element = item.getEventChart();
- request = buildImageUrl("eventCharts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId());
}
holder.listener.setDashboardElement(element);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
index 0fe188b3..b4eda684 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
@@ -74,13 +74,6 @@ public InterpretationAdapter(Context context, LayoutInflater inflater,
mImageLoader = PicassoProvider.getInstance(context);
}
- private static String buildImageUrl(String resource, String id) {
- return DhisController.getInstance().getServerUrl().newBuilder()
- .addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment("data.png")
- .addQueryParameter("width", "480").addQueryParameter("height", "320")
- .toString();
- }
-
/* returns type of row depending on item content type. */
@Override
public int getItemViewType(int position) {
@@ -223,10 +216,10 @@ private void handleItemsWithImages(ImageItemViewHolder holder, Interpretation it
String request = null;
if (Interpretation.TYPE_CHART.equals(item.getType()) && item.getChart() != null) {
InterpretationElement element = item.getChart();
- request = buildImageUrl("charts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
} else if (Interpretation.TYPE_MAP.equals(item.getType()) && item.getMap() != null) {
InterpretationElement element = item.getMap();
- request = buildImageUrl("maps", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
}
holder.listener.setInterpretation(item);
From 786a89f45ec2ecaf0a139515a13281b953912c48 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Wed, 10 May 2017 22:02:40 +0200
Subject: [PATCH 12/69] Added pull of images service
---
.../api/controllers/DashboardController.java | 5 ++
.../api/controllers/DhisController.java | 7 ++
.../controllers/InterpretationController.java | 5 ++
.../api/controllers/PullImageController.java | 82 +++++++++++++++++++
.../persistence/preferences/ResourceType.java | 2 +-
.../dhis/android/dashboard/DhisService.java | 25 ++++++
6 files changed, 125 insertions(+), 1 deletion(-)
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
index a27634b4..8936d276 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
@@ -96,6 +96,11 @@ private static List queryDashboards() {
.queryList();
}
+ public static List queryAllDashboardElement() {
+ return new Select().from(DashboardElement.class)
+ .queryList();
+ }
+
private static List queryDashboardItems(Dashboard dashboard) {
Where where = new Select().from(DashboardItem.class)
.where(Condition.column(DashboardItem$Table
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
index 9b30c272..7e7ae850 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
@@ -155,4 +155,11 @@ public void syncDashboards() throws APIException {
public void syncInterpretations() throws APIException {
(new InterpretationController(mDhisApi)).syncInterpretations();
}
+
+ public void pullDashboardImages(Context context) {
+ (new PullImageController(context)).pullDashboardImages();
+ }
+ public void pullInterpretationImages(Context context) {
+ (new PullImageController(context)).pullInterpretationImages();
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/InterpretationController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/InterpretationController.java
index de78a2c8..787dbfd6 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/InterpretationController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/InterpretationController.java
@@ -573,6 +573,11 @@ private static List queryInterpretations() {
.queryList();
}
+ public static List queryAllInterpretationElements() {
+ return new Select().from(InterpretationElement.class)
+ .queryList();
+ }
+
private static List queryInterpretationUsers() {
return new Select().from(User.class).queryList();
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
new file mode 100644
index 00000000..bc9357aa
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
@@ -0,0 +1,82 @@
+package org.hisp.dhis.android.dashboard.api.controllers;
+
+import android.content.Context;
+
+import com.squareup.picasso.NetworkPolicy;
+
+import org.hisp.dhis.android.dashboard.api.models.DashboardElement;
+import org.hisp.dhis.android.dashboard.api.models.DashboardItemContent;
+import org.hisp.dhis.android.dashboard.api.models.Interpretation;
+import org.hisp.dhis.android.dashboard.api.models.InterpretationElement;
+import org.hisp.dhis.android.dashboard.api.network.APIException;
+import org.hisp.dhis.android.dashboard.api.utils.PicassoProvider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class PullImageController {
+ Context mContext;
+
+ public PullImageController(Context context) {
+ mContext = context;
+ }
+
+ public void pullDashboardImages() throws APIException {
+ List requestList = new ArrayList<>();
+ requestList = downloadDashboardImages(requestList);
+ downloadImages(requestList, mContext);
+ }
+
+ public void pullInterpretationImages() throws APIException {
+ List requestList = new ArrayList<>();
+ requestList = downloadInterpretationImages(requestList);
+ downloadImages(requestList, mContext);
+ }
+
+ public static List downloadInterpretationImages(List requestList) {
+ for (InterpretationElement interpretationElement : InterpretationController
+ .queryAllInterpretationElements()) {
+ if (interpretationElement == null || interpretationElement.getType() == null) {
+ continue;
+ }
+ if (Interpretation.TYPE_CHART.equals(interpretationElement.getType())) {
+ requestList.add(DhisController.buildImageUrl("charts", interpretationElement.getUId()));
+ } else if (Interpretation.TYPE_MAP.equals(interpretationElement.getType())) {
+ requestList.add(DhisController.buildImageUrl("maps", interpretationElement.getUId()));
+ }
+ }
+ return requestList;
+ }
+
+ public static List downloadDashboardImages(List requestList) {
+ for (DashboardElement element : DashboardController.queryAllDashboardElement()) {
+ if (element.getDashboardItem().getType() == null) {
+ continue;
+ }
+
+ switch (element.getDashboardItem().getType()) {
+ case DashboardItemContent.TYPE_CHART: {
+ requestList.add(DhisController.buildImageUrl("charts", element.getUId()));
+ break;
+ }
+ case DashboardItemContent.TYPE_EVENT_CHART: {
+ requestList.add(DhisController.buildImageUrl("eventCharts", element.getUId()));
+ break;
+ }
+ case DashboardItemContent.TYPE_MAP: {
+ requestList.add(DhisController.buildImageUrl("maps", element.getUId()));
+ break;
+ }
+ }
+ }
+ return requestList;
+ }
+
+ private static void downloadImages(final List requestUrlList, final Context context) {
+ for (int i = 0; i < requestUrlList.size(); i++) {
+ final String request = requestUrlList.get(i);
+ PicassoProvider.getInstance(context)
+ .load(request).networkPolicy(NetworkPolicy.NO_CACHE).fetch();
+ }
+ }
+}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/ResourceType.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/ResourceType.java
index 943a094a..aefdc8d4 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/ResourceType.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/ResourceType.java
@@ -4,5 +4,5 @@
* @author Araz Abishov .
*/
public enum ResourceType {
- DASHBOARDS_CONTENT, DASHBOARDS, INTERPRETATIONS, USERS,
+ DASHBOARDS_CONTENT, DASHBOARDS, INTERPRETATIONS, USERS, INTERPRETATION_IMAGES, DASHBOARD_IMAGES
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/DhisService.java b/app/src/main/java/org/hisp/dhis/android/dashboard/DhisService.java
index 60e6bb55..6213182e 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/DhisService.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/DhisService.java
@@ -27,6 +27,7 @@
package org.hisp.dhis.android.dashboard;
import android.app.Service;
+import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
@@ -54,6 +55,8 @@ public final class DhisService extends Service {
public static final int SYNC_DASHBOARDS = 5;
public static final int SYNC_DASHBOARD_CONTENT = 6;
public static final int SYNC_INTERPRETATIONS = 7;
+ public static final int PULL_INTERPRETATION_IMAGES = 8;
+ public static final int PULL_DASHBOARD_IMAGES = 9;
private final IBinder mBinder = new ServiceBinder();
private DhisController mDhisController;
@@ -165,6 +168,28 @@ public Object execute() throws APIException {
});
}
+ public void pullInterpretationImages(final Context context) {
+ JobExecutor.enqueueJob(new NetworkJob
+ Steps:
+ 1. Please open or create the .git/hooks/post-commit and .git/hooks/post-checkout files.
+ 2. If the file does not exist, add the following lines:
+ #!/bin/sh
+ gitPath=$(git rev-parse --show-toplevel)
+ sh ${gitPath}/generate_last_commit.sh
+ 2. If the file already exists, you only need add the following lines at the end:
+ gitPath=$(git rev-parse --show-toplevel)
+ sh ${gitPath}/generate_last_commit.sh
+ 3. Run "git checkout".
]]>
+
diff --git a/generate_last_commit.sh b/generate_last_commit.sh
new file mode 100644
index 00000000..08506669
--- /dev/null
+++ b/generate_last_commit.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+gitPath=$(git rev-parse --show-toplevel)
+filePath="${gitPath}/app/src/main/res/raw/lastcommit.txt"
+echo "Last commit path $filePath"
+commit=$(git log -1 HEAD --format=%H)
+echo "Saving last commit: ${commit}"
+echo ${commit} > $filePath
+echo "Done."
From 2bc28f1fc8d1f014a1eeeaa0b5adbcb098f3c118 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Tue, 16 May 2017 14:39:47 +0200
Subject: [PATCH 15/69] Added scroll in about fragment
---
.../org/hisp/dhis/android/dashboard/AboutUsFragment.java | 6 ++++--
app/src/main/res/layout/fragment_about_us.xml | 6 +++++-
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java
index cf05dded..ff3b7c3a 100644
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java
@@ -6,6 +6,7 @@
import android.support.annotation.Nullable;
import android.text.Html;
import android.text.SpannableString;
+import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.util.Log;
@@ -74,7 +75,7 @@ private static StringBuilder convertFromInputStreamToString(InputStream inputStr
return stringBuilder;
}
- public static String getCommitMessage(Context context) {
+ public static Spanned getCommitMessage(Context context) {
String stringCommit = getCommitHash(context);
if (stringCommit.contains(context.getString(R.string.unavailable))) {
@@ -83,7 +84,8 @@ public static String getCommitMessage(Context context) {
} else {
stringCommit = String.format(context.getString(R.string.last_commit), stringCommit);
}
- return stringCommit;
+
+ return Html.fromHtml(stringCommit);
}
public static String getVersionMessage(Context context) {
diff --git a/app/src/main/res/layout/fragment_about_us.xml b/app/src/main/res/layout/fragment_about_us.xml
index b0a2e7e3..be1dab8f 100644
--- a/app/src/main/res/layout/fragment_about_us.xml
+++ b/app/src/main/res/layout/fragment_about_us.xml
@@ -48,6 +48,10 @@
android:layout_margin="8dp"
app:cardCornerRadius="2dp">
+
+
-
+
\ No newline at end of file
From 5dfe1b4127f10e9734bbd74ae77744fef05552b7 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Tue, 16 May 2017 14:41:58 +0200
Subject: [PATCH 16/69] Added buddybuild last commit script
---
buddybuild_postclone.sh | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 buddybuild_postclone.sh
diff --git a/buddybuild_postclone.sh b/buddybuild_postclone.sh
new file mode 100644
index 00000000..8eb58cb5
--- /dev/null
+++ b/buddybuild_postclone.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Definitions
+gitPath=$(git rev-parse --show-toplevel)
+
+# Generate last commit
+sh ${gitPath}/generate_last_commit.sh
\ No newline at end of file
From 9282e5dad6818d5475b39fae6b2219e62c92d397 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Tue, 16 May 2017 16:33:09 +0200
Subject: [PATCH 17/69] refactor package of AboutUsFragment
---
.../android/dashboard/ui/activities/MenuActivity.java | 2 +-
.../dashboard/{ => ui/fragments}/AboutUsFragment.java | 9 ++++-----
2 files changed, 5 insertions(+), 6 deletions(-)
rename app/src/main/java/org/hisp/dhis/android/dashboard/{ => ui/fragments}/AboutUsFragment.java (96%)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/MenuActivity.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/MenuActivity.java
index 3986dcdd..c9c477b4 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/MenuActivity.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/MenuActivity.java
@@ -45,7 +45,7 @@
import android.view.View;
import android.widget.TextView;
-import org.hisp.dhis.android.dashboard.AboutUsFragment;
+import org.hisp.dhis.android.dashboard.ui.fragments.AboutUsFragment;
import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.api.models.UserAccount;
import org.hisp.dhis.android.dashboard.api.persistence.loaders.DbLoader;
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
similarity index 96%
rename from app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java
rename to app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
index ff3b7c3a..e2535469 100644
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/AboutUsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
@@ -1,20 +1,20 @@
-package org.hisp.dhis.android.dashboard;
+package org.hisp.dhis.android.dashboard.ui.fragments;
-import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
+import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
-import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.TextView;
+import org.hisp.dhis.android.dashboard.BuildConfig;
+import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.ui.fragments.BaseFragment;
import org.hisp.dhis.android.dashboard.ui.views.FontTextView;
@@ -25,7 +25,6 @@
import butterknife.Bind;
import butterknife.ButterKnife;
-import android.support.v7.widget.Toolbar;
public class AboutUsFragment extends BaseFragment {
From e1e08b683a6849e08550c30ac8a243f6ffc992d9 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Tue, 16 May 2017 19:17:29 +0200
Subject: [PATCH 18/69] Remove log
---
.../dhis/android/dashboard/ui/fragments/AboutUsFragment.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
index e2535469..e88fb2e7 100644
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
@@ -67,7 +67,6 @@ private static StringBuilder convertFromInputStreamToString(InputStream inputStr
stringBuilder.append(line + "\n");
}
} catch (IOException e) {
- Log.d("AUtils", String.format("Error reading inputStream [%s]", inputStream));
e.printStackTrace();
}
From 3e4d5a6591a94ae7d0102680571c2abcee7771d0 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Tue, 16 May 2017 19:18:13 +0200
Subject: [PATCH 19/69] Remove unused import
---
.../dhis/android/dashboard/ui/fragments/AboutUsFragment.java | 2 --
1 file changed, 2 deletions(-)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
index e88fb2e7..46832f16 100644
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AboutUsFragment.java
@@ -8,14 +8,12 @@
import android.text.SpannableString;
import android.text.Spanned;
import android.text.util.Linkify;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.hisp.dhis.android.dashboard.BuildConfig;
import org.hisp.dhis.android.dashboard.R;
-import org.hisp.dhis.android.dashboard.ui.fragments.BaseFragment;
import org.hisp.dhis.android.dashboard.ui.views.FontTextView;
import java.io.BufferedReader;
From be3f1e910c5dda528579384d4a8066527c1a7aba Mon Sep 17 00:00:00 2001
From: ifoche
Date: Thu, 18 May 2017 19:43:11 +0200
Subject: [PATCH 20/69] added links to about us description
---
app/src/main/res/raw/description | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/src/main/res/raw/description b/app/src/main/res/raw/description
index 2cd9575a..c0db1c11 100644
--- a/app/src/main/res/raw/description
+++ b/app/src/main/res/raw/description
@@ -1,4 +1,4 @@
Android application for DHIS2 which provides basic dashboard functionality.
-Supports DHIS 2 version 2.25, 2.26 at the moment of release.
-Developed by University of Oslo(UiO).
-Maintained by EyeSeeTea.
+Supports DHIS 2 version 2.25, 2.26 at the moment of release.
+Developed by University of Oslo(UiO) (http://www.uio.no).
+Maintained by EyeSeeTea Ltd (http://eyeseetea.com).
From df468b03aa9f2351fe2a509bae6153630e6fcbdc Mon Sep 17 00:00:00 2001
From: ifoche
Date: Thu, 18 May 2017 20:07:49 +0200
Subject: [PATCH 21/69] make links work on about us text
---
app/src/main/res/layout/fragment_about_us.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/src/main/res/layout/fragment_about_us.xml b/app/src/main/res/layout/fragment_about_us.xml
index be1dab8f..6ce814c7 100644
--- a/app/src/main/res/layout/fragment_about_us.xml
+++ b/app/src/main/res/layout/fragment_about_us.xml
@@ -107,6 +107,7 @@
android:text="@string/unavailable"
android:textSize="15sp"
android:textColor="@color/dark_grey_text"
+ android:autoLink="web"
app:font="@string/medium_font_name" />
From dd9788ff86b3c99293d867a818a1426ccd05dbbd Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Wed, 21 Jun 2017 10:12:29 +0200
Subject: [PATCH 22/69] Creating model class EventReport for make url of event
reports tables html.
---
.../dashboard/api/models/EventReport.java | 28 +++++++
.../dashboard/api/models/RelativePeriod.java | 81 +++++++++++++++++++
.../dashboard/api/models/UIDObject.java | 42 ++++++++++
3 files changed, 151 insertions(+)
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
new file mode 100644
index 00000000..5bb62694
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
@@ -0,0 +1,28 @@
+package org.hisp.dhis.android.dashboard.api.models;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
+
+import java.util.List;
+
+@Table(databaseName = DbDhis.NAME)
+public final class EventReport extends BaseIdentifiableObject {
+ @JsonIgnore
+ @Column(name = "id")
+ @PrimaryKey(autoincrement = true)
+ long id;
+
+ @JsonProperty("id")
+ @Column(name = "uId")
+ String uId;
+
+ UIDObject programStage;
+ List organisationUnits;
+ RelativePeriod relativePeriods;
+
+}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
new file mode 100644
index 00000000..bd377962
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
@@ -0,0 +1,81 @@
+package org.hisp.dhis.android.dashboard.api.models;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
+
+@Table(databaseName = DbDhis.NAME)
+public final class RelativePeriod {
+
+ @JsonIgnore
+ @Column(name = "id")
+ @PrimaryKey(autoincrement = true)
+ long id;
+
+ boolean thisYear;
+ boolean quartersLastYear;
+ boolean last52Weeks;
+ boolean thisWeek;
+ boolean lastMonth;
+ boolean last14Days;
+ boolean monthsThisYear;
+ boolean last2SixMonths;
+ boolean yesterday;
+ boolean thisQuarter;
+ boolean last12Months;
+ boolean last5FinancialYears;
+ boolean thisSixMonth;
+ boolean lastQuarter;
+ boolean thisFinancialYear;
+ boolean last4Weeks;
+ boolean last3Months;
+ boolean thisDay;
+ boolean thisMonth;
+ boolean last5Years;
+ boolean last6BiMonths;
+ boolean lastFinancialYear;
+ boolean last6Months;
+ boolean last3Days;
+ boolean quartersThisYear;
+ boolean monthsLastYear;
+ boolean lastWeek;
+ boolean last7Days;
+ boolean thisBimonth;
+ boolean lastBimonth;
+ boolean lastSixMonth;
+ boolean lastYear;
+ boolean last12Weeks;
+ boolean last4Quarters;
+
+ @JsonIgnore
+ private boolean[] periodsList;
+
+
+ public RelativePeriod() {
+ periodsList = new boolean[]{thisYear, quartersLastYear, last52Weeks, thisWeek, lastMonth,
+ last14Days, monthsThisYear, last2SixMonths, yesterday, thisQuarter, last12Months,
+ last5FinancialYears, thisSixMonth, lastQuarter, thisFinancialYear, last4Weeks,
+ last3Months, thisDay, thisMonth, last5Years, last6BiMonths, lastFinancialYear,
+ last6Months, last3Days, quartersThisYear, monthsLastYear, lastWeek, last7Days,
+ thisBimonth, lastBimonth, lastSixMonth, lastYear, last12Weeks, last4Quarters};
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public boolean[] getPeriodsList() {
+ return periodsList;
+ }
+
+ public void setPeriodsList(boolean[] periodsList) {
+ this.periodsList = periodsList;
+ }
+}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
new file mode 100644
index 00000000..cfc66054
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
@@ -0,0 +1,42 @@
+package org.hisp.dhis.android.dashboard.api.models;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
+import com.raizlabs.android.dbflow.annotation.Table;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
+
+@Table(databaseName = DbDhis.NAME)
+public class UIDObject {
+ @JsonIgnore
+ @Column(name = "id")
+ @PrimaryKey(autoincrement = true)
+ long id;
+
+ @JsonProperty("id")
+ @Column(name = "uId")
+ String uId;
+
+ public UIDObject(String uId) {
+ this.uId = uId;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getuId() {
+ return uId;
+ }
+
+ public void setuId(String uId) {
+ this.uId = uId;
+ }
+}
From 002e31c2bac1b88200ce657f1e9a3056020bb700 Mon Sep 17 00:00:00 2001
From: Ignacio Foche
Date: Wed, 21 Jun 2017 11:31:31 +0200
Subject: [PATCH 23/69] Feature codecov coverage integration (#17)
* Add CodeCov integrated with Jacoco and Buddybuild
* fix lint errors and gradlew problems
* add traces to script
* change inflater call to pass lint check
* removing lint failures only for api module
* Introduce abortOnError false
---
api/build.gradle | 15 ++++++++++++++-
app/build.gradle | 10 +++++++++-
.../dashboard/ui/fragments/AccountFragment.java | 2 +-
.../interpretation/InterpretationFragment.java | 2 +-
.../android/dashboard/ui/views/FontButton.java | 2 +-
.../android/dashboard/ui/views/FontCheckBox.java | 3 +--
.../android/dashboard/ui/views/FontEditText.java | 2 +-
.../android/dashboard/ui/views/FontTextView.java | 2 +-
buddybuild_postbuild.sh | 9 +++++++++
buddybuild_postclone.sh | 7 +++++--
build.gradle | 1 +
11 files changed, 44 insertions(+), 11 deletions(-)
create mode 100644 buddybuild_postbuild.sh
diff --git a/api/build.gradle b/api/build.gradle
index 158c896d..4c76294e 100755
--- a/api/build.gradle
+++ b/api/build.gradle
@@ -1,5 +1,6 @@
apply plugin: 'com.android.library'
apply plugin: 'com.neenbedankt.android-apt'
+apply plugin: 'jacoco-android'
android {
compileSdkVersion 25
@@ -17,8 +18,20 @@ android {
targetCompatibility JavaVersion.VERSION_1_7
}
+ packagingOptions {
+ exclude 'META-INF/LICENSE'
+ exclude 'META-INF/NOTICE'
+ }
+
lintOptions {
- disable 'RtlSymmetry', 'RtlHardcoded'
+ disable 'RtlSymmetry', 'RtlHardcoded', 'RestrictedApi'
+ abortOnError false
+ }
+
+ buildTypes {
+ debug {
+ testCoverageEnabled true
+ }
}
}
diff --git a/app/build.gradle b/app/build.gradle
index 3058b6e9..37ff3bd4 100755
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'com.android.application'
+apply plugin: 'jacoco-android'
android {
compileSdkVersion 25
@@ -23,7 +24,14 @@ android {
}
lintOptions {
- disable 'RtlSymmetry', 'RtlHardcoded', 'ContentDescription'
+ disable 'RtlSymmetry', 'RtlHardcoded', 'ContentDescription', 'RestrictedApi'
+ abortOnError false
+ }
+
+ buildTypes {
+ debug {
+ testCoverageEnabled true
+ }
}
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AccountFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AccountFragment.java
index 784b9476..0fae6a12 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AccountFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/AccountFragment.java
@@ -88,7 +88,7 @@ public void onClick(View v) {
});
mAdapter = new AccountFieldAdapter(getActivity().getApplicationContext(),
- getLayoutInflater(savedInstanceState));
+ (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/interpretation/InterpretationFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/interpretation/InterpretationFragment.java
index 70633d16..1708c5a0 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/interpretation/InterpretationFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/interpretation/InterpretationFragment.java
@@ -109,7 +109,7 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
ButterKnife.bind(this, view);
mAdapter = new InterpretationAdapter(getActivity(),
- getLayoutInflater(savedInstanceState), this);
+ (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);
final int spanCount = getResources().getInteger(R.integer.column_nums);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontButton.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontButton.java
index 48d0e288..be33d74e 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontButton.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontButton.java
@@ -38,7 +38,7 @@
import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.utils.TypefaceManager;
-public class FontButton extends Button {
+public class FontButton extends android.support.v7.widget.AppCompatButton {
public FontButton(Context context) {
super(context);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontCheckBox.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontCheckBox.java
index 4cff7b05..55a46e87 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontCheckBox.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontCheckBox.java
@@ -33,12 +33,11 @@
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
-import android.widget.CheckBox;
import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.utils.TypefaceManager;
-public class FontCheckBox extends CheckBox {
+public class FontCheckBox extends android.support.v7.widget.AppCompatCheckBox {
public FontCheckBox(Context context) {
super(context);
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontEditText.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontEditText.java
index ebb5dec3..090980f5 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontEditText.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontEditText.java
@@ -38,7 +38,7 @@
import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.utils.TypefaceManager;
-public class FontEditText extends EditText {
+public class FontEditText extends android.support.v7.widget.AppCompatEditText {
public FontEditText(Context context) {
super(context);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontTextView.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontTextView.java
index 1e1054a4..5a82ce9a 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontTextView.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/views/FontTextView.java
@@ -38,7 +38,7 @@
import org.hisp.dhis.android.dashboard.R;
import org.hisp.dhis.android.dashboard.utils.TypefaceManager;
-public class FontTextView extends TextView {
+public class FontTextView extends android.support.v7.widget.AppCompatTextView {
public FontTextView(Context context) {
super(context);
diff --git a/buddybuild_postbuild.sh b/buddybuild_postbuild.sh
new file mode 100644
index 00000000..507c8e47
--- /dev/null
+++ b/buddybuild_postbuild.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Upload CodeCov report
+echo "ConnectedCheck: "
+./gradlew connectedCheck
+
+echo "Send report to CodeCov"
+bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}
+
diff --git a/buddybuild_postclone.sh b/buddybuild_postclone.sh
index 8eb58cb5..83e8e1f0 100644
--- a/buddybuild_postclone.sh
+++ b/buddybuild_postclone.sh
@@ -1,7 +1,10 @@
-#!/bin/sh
+#!/usr/bin/env bash
# Definitions
gitPath=$(git rev-parse --show-toplevel)
# Generate last commit
-sh ${gitPath}/generate_last_commit.sh
\ No newline at end of file
+sh ${gitPath}/generate_last_commit.sh
+
+echo "Generate Test Coverage Report:"
+./gradlew build jacocoTestReport assembleAndroidTest
diff --git a/build.gradle b/build.gradle
index b1ecb178..9bc13480 100755
--- a/build.gradle
+++ b/build.gradle
@@ -6,6 +6,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
+ classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'
}
}
From 5dfe1bceb9d30bcfe3273672957e0239004a6f14 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Thu, 22 Jun 2017 15:13:54 +0200
Subject: [PATCH 24/69] En model class EventReport
---
.../api/models/DataElementDimension.java | 23 ++++++
.../dashboard/api/models/EventReport.java | 74 ++++++++++++++++---
.../dashboard/api/models/RelativePeriod.java | 18 +++++
3 files changed, 103 insertions(+), 12 deletions(-)
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
new file mode 100644
index 00000000..2a14f797
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
@@ -0,0 +1,23 @@
+package org.hisp.dhis.android.dashboard.api.models;
+
+import com.raizlabs.android.dbflow.annotation.Table;
+
+import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
+
+@Table(databaseName = DbDhis.NAME)
+public class DataElementDimension {
+
+ UIDObject dataElement;
+
+ public DataElementDimension(UIDObject dataElement) {
+ this.dataElement = dataElement;
+ }
+
+ public UIDObject getDataElement() {
+ return dataElement;
+ }
+
+ public void setDataElement(UIDObject dataElement) {
+ this.dataElement = dataElement;
+ }
+}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
index 5bb62694..d0140055 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
@@ -1,9 +1,5 @@
package org.hisp.dhis.android.dashboard.api.models;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.raizlabs.android.dbflow.annotation.Column;
-import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
@@ -12,17 +8,71 @@
@Table(databaseName = DbDhis.NAME)
public final class EventReport extends BaseIdentifiableObject {
- @JsonIgnore
- @Column(name = "id")
- @PrimaryKey(autoincrement = true)
- long id;
-
- @JsonProperty("id")
- @Column(name = "uId")
- String uId;
UIDObject programStage;
List organisationUnits;
RelativePeriod relativePeriods;
+ List dataElementDimensions;
+ UIDObject dataElementValueDimension;
+ String aggregationType;
+ String outputType;
+
+ public UIDObject getProgramStage() {
+ return programStage;
+ }
+
+ public void setProgramStage(UIDObject programStage) {
+ this.programStage = programStage;
+ }
+
+ public List getOrganisationUnits() {
+ return organisationUnits;
+ }
+
+ public void setOrganisationUnits(
+ List organisationUnits) {
+ this.organisationUnits = organisationUnits;
+ }
+
+ public RelativePeriod getRelativePeriods() {
+ return relativePeriods;
+ }
+
+ public void setRelativePeriods(RelativePeriod relativePeriods) {
+ this.relativePeriods = relativePeriods;
+ }
+
+ public List getDataElementDimensions() {
+ return dataElementDimensions;
+ }
+
+ public void setDataElementDimensions(
+ List dataElementDimensions) {
+ this.dataElementDimensions = dataElementDimensions;
+ }
+
+ public UIDObject getDataElementValueDimension() {
+ return dataElementValueDimension;
+ }
+
+ public void setDataElementValueDimension(
+ UIDObject dataElementValueDimension) {
+ this.dataElementValueDimension = dataElementValueDimension;
+ }
+
+ public String getAggregationType() {
+ return aggregationType;
+ }
+
+ public void setAggregationType(String aggregationType) {
+ this.aggregationType = aggregationType;
+ }
+
+ public String getOutputType() {
+ return outputType;
+ }
+ public void setOutputType(String outputType) {
+ this.outputType = outputType;
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
index bd377962..eecbcf72 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
@@ -10,6 +10,17 @@
@Table(databaseName = DbDhis.NAME)
public final class RelativePeriod {
+ @JsonIgnore
+ private static final String[] periodsStrings =
+ {"THIS_YEAR", "QUARTERS_LAST_YEAR", "LAST_52_WEEKS", "THIS_WEEK", "LAST_MONTH",
+ "LAST_14_DAYS", "MONTHS_THIS_YEAR", "LAST_2_SIXMONTHS", "YESTERDAY",
+ "THIS_QUARTER", "LAST_12_MONTHS", "LAST_5_FINANCIAL_YEARS", "THIS_SIX_MONTH",
+ "LAST_QUARTER", "THIS_FINANCIAL_YEAR", "LAST_4_WEEKS", "LAST_3_MONTHS",
+ "THIS_DAY", "THIS_MONTH", "LAST_5_YEARS", "LAST_6_BIMONTHS",
+ "LAST_FINANCIAL_YEAR", "LAST_6_MONTHS", "LAST_3_DAYS", "QUARTERS_THIS_YEAR",
+ "MONTHS_LAST_YEAR", "LAST_WEEK", "LAST_7_DAYS", "THIS_BIMONTH", "LAST_BIMONTH",
+ "LAST_SIX_MONTH", "LAST_YEAR", "LAST_12_WEEKS", "LAST_4_QUARTERS"};
+
@JsonIgnore
@Column(name = "id")
@PrimaryKey(autoincrement = true)
@@ -78,4 +89,11 @@ public boolean[] getPeriodsList() {
public void setPeriodsList(boolean[] periodsList) {
this.periodsList = periodsList;
}
+
+ public String getRelativePeriodString() {
+ for (int i = 0; i < periodsList.length; i++) {
+ if (periodsList[i]) return periodsStrings[i];
+ }
+ return "";
+ }
}
From d56ee2339f36e4fae68a74e1c2ce740153794faf Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Fri, 23 Jun 2017 13:15:39 +0200
Subject: [PATCH 25/69] Solving model DBFlow bugs
---
.../dashboard/api/models/DataElementDimension.java | 13 ++++++++++++-
.../dashboard/api/models/RelativePeriod.java | 3 ++-
.../android/dashboard/api/models/UIDObject.java | 6 +++++-
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
index 2a14f797..98a84a1e 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
@@ -1,14 +1,25 @@
package org.hisp.dhis.android.dashboard.api.models;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.raizlabs.android.dbflow.annotation.Column;
+import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
@Table(databaseName = DbDhis.NAME)
-public class DataElementDimension {
+public class DataElementDimension extends BaseModel {
+ @JsonIgnore
+ @Column
+ @PrimaryKey(autoincrement = true)
+ long id;
UIDObject dataElement;
+ public DataElementDimension() {
+ }
+
public DataElementDimension(UIDObject dataElement) {
this.dataElement = dataElement;
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
index eecbcf72..71dbda78 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
@@ -4,11 +4,12 @@
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
@Table(databaseName = DbDhis.NAME)
-public final class RelativePeriod {
+public final class RelativePeriod extends BaseModel {
@JsonIgnore
private static final String[] periodsStrings =
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
index cfc66054..d4cfc892 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/UIDObject.java
@@ -5,11 +5,12 @@
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
+import com.raizlabs.android.dbflow.structure.BaseModel;
import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
@Table(databaseName = DbDhis.NAME)
-public class UIDObject {
+public class UIDObject extends BaseModel {
@JsonIgnore
@Column(name = "id")
@PrimaryKey(autoincrement = true)
@@ -19,6 +20,9 @@ public class UIDObject {
@Column(name = "uId")
String uId;
+ public UIDObject() {
+ }
+
public UIDObject(String uId) {
this.uId = uId;
}
From 19527d7da4e80b43de64bc60fa945a74a346bcbc Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Fri, 23 Jun 2017 18:56:36 +0200
Subject: [PATCH 26/69] Showing event report table in the detail.
---
.../api/models/DataElementDimension.java | 10 +
.../dashboard/api/models/EventReport.java | 11 +
.../dashboard/api/models/RelativePeriod.java | 284 +++++++++++++++++-
.../dashboard/api/network/DhisApi.java | 13 +
.../DashboardElementDetailActivity.java | 6 +
.../fragments/WebViewEventReportFragment.java | 162 ++++++++++
.../dashboard/DashboardFragment.java | 4 +-
7 files changed, 482 insertions(+), 8 deletions(-)
create mode 100644 app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
index 98a84a1e..17acb1bb 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DataElementDimension.java
@@ -15,6 +15,8 @@ public class DataElementDimension extends BaseModel {
@PrimaryKey(autoincrement = true)
long id;
+ String filter;
+
UIDObject dataElement;
public DataElementDimension() {
@@ -31,4 +33,12 @@ public UIDObject getDataElement() {
public void setDataElement(UIDObject dataElement) {
this.dataElement = dataElement;
}
+
+ public String getFilter() {
+ return filter;
+ }
+
+ public void setFilter(String filter) {
+ this.filter = filter;
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
index d0140055..bdb3da82 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
@@ -9,6 +9,7 @@
@Table(databaseName = DbDhis.NAME)
public final class EventReport extends BaseIdentifiableObject {
+ UIDObject program;
UIDObject programStage;
List organisationUnits;
RelativePeriod relativePeriods;
@@ -17,6 +18,14 @@ public final class EventReport extends BaseIdentifiableObject {
String aggregationType;
String outputType;
+ public UIDObject getProgram() {
+ return program;
+ }
+
+ public void setProgram(UIDObject program) {
+ this.program = program;
+ }
+
public UIDObject getProgramStage() {
return programStage;
}
@@ -75,4 +84,6 @@ public String getOutputType() {
public void setOutputType(String outputType) {
this.outputType = outputType;
}
+
+
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
index 71dbda78..81b76ee8 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
@@ -67,12 +67,6 @@ public final class RelativePeriod extends BaseModel {
public RelativePeriod() {
- periodsList = new boolean[]{thisYear, quartersLastYear, last52Weeks, thisWeek, lastMonth,
- last14Days, monthsThisYear, last2SixMonths, yesterday, thisQuarter, last12Months,
- last5FinancialYears, thisSixMonth, lastQuarter, thisFinancialYear, last4Weeks,
- last3Months, thisDay, thisMonth, last5Years, last6BiMonths, lastFinancialYear,
- last6Months, last3Days, quartersThisYear, monthsLastYear, lastWeek, last7Days,
- thisBimonth, lastBimonth, lastSixMonth, lastYear, last12Weeks, last4Quarters};
}
public long getId() {
@@ -92,9 +86,287 @@ public void setPeriodsList(boolean[] periodsList) {
}
public String getRelativePeriodString() {
+ periodsList = new boolean[]{thisYear, quartersLastYear, last52Weeks, thisWeek, lastMonth,
+ last14Days, monthsThisYear, last2SixMonths, yesterday, thisQuarter, last12Months,
+ last5FinancialYears, thisSixMonth, lastQuarter, thisFinancialYear, last4Weeks,
+ last3Months, thisDay, thisMonth, last5Years, last6BiMonths, lastFinancialYear,
+ last6Months, last3Days, quartersThisYear, monthsLastYear, lastWeek, last7Days,
+ thisBimonth, lastBimonth, lastSixMonth, lastYear, last12Weeks, last4Quarters};
for (int i = 0; i < periodsList.length; i++) {
if (periodsList[i]) return periodsStrings[i];
}
return "";
}
+
+ public boolean isThisYear() {
+ return thisYear;
+ }
+
+ public void setThisYear(boolean thisYear) {
+ this.thisYear = thisYear;
+ }
+
+ public boolean isQuartersLastYear() {
+ return quartersLastYear;
+ }
+
+ public void setQuartersLastYear(boolean quartersLastYear) {
+ this.quartersLastYear = quartersLastYear;
+ }
+
+ public boolean isLast52Weeks() {
+ return last52Weeks;
+ }
+
+ public void setLast52Weeks(boolean last52Weeks) {
+ this.last52Weeks = last52Weeks;
+ }
+
+ public boolean isThisWeek() {
+ return thisWeek;
+ }
+
+ public void setThisWeek(boolean thisWeek) {
+ this.thisWeek = thisWeek;
+ }
+
+ public boolean isLastMonth() {
+ return lastMonth;
+ }
+
+ public void setLastMonth(boolean lastMonth) {
+ this.lastMonth = lastMonth;
+ }
+
+ public boolean isLast14Days() {
+ return last14Days;
+ }
+
+ public void setLast14Days(boolean last14Days) {
+ this.last14Days = last14Days;
+ }
+
+ public boolean isMonthsThisYear() {
+ return monthsThisYear;
+ }
+
+ public void setMonthsThisYear(boolean monthsThisYear) {
+ this.monthsThisYear = monthsThisYear;
+ }
+
+ public boolean isLast2SixMonths() {
+ return last2SixMonths;
+ }
+
+ public void setLast2SixMonths(boolean last2SixMonths) {
+ this.last2SixMonths = last2SixMonths;
+ }
+
+ public boolean isYesterday() {
+ return yesterday;
+ }
+
+ public void setYesterday(boolean yesterday) {
+ this.yesterday = yesterday;
+ }
+
+ public boolean isThisQuarter() {
+ return thisQuarter;
+ }
+
+ public void setThisQuarter(boolean thisQuarter) {
+ this.thisQuarter = thisQuarter;
+ }
+
+ public boolean isLast12Months() {
+ return last12Months;
+ }
+
+ public void setLast12Months(boolean last12Months) {
+ this.last12Months = last12Months;
+ }
+
+ public boolean isLast5FinancialYears() {
+ return last5FinancialYears;
+ }
+
+ public void setLast5FinancialYears(boolean last5FinancialYears) {
+ this.last5FinancialYears = last5FinancialYears;
+ }
+
+ public boolean isThisSixMonth() {
+ return thisSixMonth;
+ }
+
+ public void setThisSixMonth(boolean thisSixMonth) {
+ this.thisSixMonth = thisSixMonth;
+ }
+
+ public boolean isLastQuarter() {
+ return lastQuarter;
+ }
+
+ public void setLastQuarter(boolean lastQuarter) {
+ this.lastQuarter = lastQuarter;
+ }
+
+ public boolean isThisFinancialYear() {
+ return thisFinancialYear;
+ }
+
+ public void setThisFinancialYear(boolean thisFinancialYear) {
+ this.thisFinancialYear = thisFinancialYear;
+ }
+
+ public boolean isLast4Weeks() {
+ return last4Weeks;
+ }
+
+ public void setLast4Weeks(boolean last4Weeks) {
+ this.last4Weeks = last4Weeks;
+ }
+
+ public boolean isLast3Months() {
+ return last3Months;
+ }
+
+ public void setLast3Months(boolean last3Months) {
+ this.last3Months = last3Months;
+ }
+
+ public boolean isThisDay() {
+ return thisDay;
+ }
+
+ public void setThisDay(boolean thisDay) {
+ this.thisDay = thisDay;
+ }
+
+ public boolean isThisMonth() {
+ return thisMonth;
+ }
+
+ public void setThisMonth(boolean thisMonth) {
+ this.thisMonth = thisMonth;
+ }
+
+ public boolean isLast5Years() {
+ return last5Years;
+ }
+
+ public void setLast5Years(boolean last5Years) {
+ this.last5Years = last5Years;
+ }
+
+ public boolean isLast6BiMonths() {
+ return last6BiMonths;
+ }
+
+ public void setLast6BiMonths(boolean last6BiMonths) {
+ this.last6BiMonths = last6BiMonths;
+ }
+
+ public boolean isLastFinancialYear() {
+ return lastFinancialYear;
+ }
+
+ public void setLastFinancialYear(boolean lastFinancialYear) {
+ this.lastFinancialYear = lastFinancialYear;
+ }
+
+ public boolean isLast6Months() {
+ return last6Months;
+ }
+
+ public void setLast6Months(boolean last6Months) {
+ this.last6Months = last6Months;
+ }
+
+ public boolean isLast3Days() {
+ return last3Days;
+ }
+
+ public void setLast3Days(boolean last3Days) {
+ this.last3Days = last3Days;
+ }
+
+ public boolean isQuartersThisYear() {
+ return quartersThisYear;
+ }
+
+ public void setQuartersThisYear(boolean quartersThisYear) {
+ this.quartersThisYear = quartersThisYear;
+ }
+
+ public boolean isMonthsLastYear() {
+ return monthsLastYear;
+ }
+
+ public void setMonthsLastYear(boolean monthsLastYear) {
+ this.monthsLastYear = monthsLastYear;
+ }
+
+ public boolean isLastWeek() {
+ return lastWeek;
+ }
+
+ public void setLastWeek(boolean lastWeek) {
+ this.lastWeek = lastWeek;
+ }
+
+ public boolean isLast7Days() {
+ return last7Days;
+ }
+
+ public void setLast7Days(boolean last7Days) {
+ this.last7Days = last7Days;
+ }
+
+ public boolean isThisBimonth() {
+ return thisBimonth;
+ }
+
+ public void setThisBimonth(boolean thisBimonth) {
+ this.thisBimonth = thisBimonth;
+ }
+
+ public boolean isLastBimonth() {
+ return lastBimonth;
+ }
+
+ public void setLastBimonth(boolean lastBimonth) {
+ this.lastBimonth = lastBimonth;
+ }
+
+ public boolean isLastSixMonth() {
+ return lastSixMonth;
+ }
+
+ public void setLastSixMonth(boolean lastSixMonth) {
+ this.lastSixMonth = lastSixMonth;
+ }
+
+ public boolean isLastYear() {
+ return lastYear;
+ }
+
+ public void setLastYear(boolean lastYear) {
+ this.lastYear = lastYear;
+ }
+
+ public boolean isLast12Weeks() {
+ return last12Weeks;
+ }
+
+ public void setLast12Weeks(boolean last12Weeks) {
+ this.last12Weeks = last12Weeks;
+ }
+
+ public boolean isLast4Quarters() {
+ return last4Quarters;
+ }
+
+ public void setLast4Quarters(boolean last4Quarters) {
+ this.last4Quarters = last4Quarters;
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
index c7a77540..82201bd9 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
@@ -31,6 +31,7 @@
import org.hisp.dhis.android.dashboard.api.models.Dashboard;
import org.hisp.dhis.android.dashboard.api.models.DashboardItem;
import org.hisp.dhis.android.dashboard.api.models.DashboardItemContent;
+import org.hisp.dhis.android.dashboard.api.models.EventReport;
import org.hisp.dhis.android.dashboard.api.models.Interpretation;
import org.hisp.dhis.android.dashboard.api.models.SystemInfo;
import org.hisp.dhis.android.dashboard.api.models.UserAccount;
@@ -141,6 +142,17 @@ Response deleteDashboardItemContent(@Path("dashboardUid") String dashboardUid,
@GET("/reportTables/{id}/data.html")
Response getReportTableData(@Path("id") String id);
+ @Headers("Accept: application/json")
+ @GET("/eventReports/{id}")
+ EventReport getEventReport(@Path("id") String id);
+
+ @Headers("Accept: application/text")
+ @GET("/25/analytics/events/query/{program}"
+ + ".html+css?displayProperty=NAME")
+ Response getEventReportTableData(@Path("program") String program,
+ @Query("stage") String programStage,
+ @Query("dimension") List dimensions);
+
@GET("/eventReports?paging=false")
@Headers("Accept: application/json")
Map> getEventReports(@QueryMap Map queryParams);
@@ -207,4 +219,5 @@ Response putInterpretationComment(@Path("interpretationUid") String interpretati
@DELETE("/interpretations/{interpretationUid}/comments/{commentUid}")
Response deleteInterpretationComment(@Path("interpretationUid") String interpretationUid,
@Path("commentUid") String commentUid);
+
}
\ No newline at end of file
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
index 82c72e1b..82e9ee5b 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
@@ -47,6 +47,7 @@
import org.hisp.dhis.android.dashboard.api.models.InterpretationElement;
import org.hisp.dhis.android.dashboard.api.models.InterpretationElement$Table;
import org.hisp.dhis.android.dashboard.ui.fragments.ImageViewFragment;
+import org.hisp.dhis.android.dashboard.ui.fragments.WebViewEventReportFragment;
import org.hisp.dhis.android.dashboard.ui.fragments.WebViewFragment;
import butterknife.Bind;
@@ -148,6 +149,11 @@ private void handleDashboardElement(DashboardElement element) {
attachFragment(WebViewFragment.newInstance(elementId));
break;
}
+ case DashboardItemContent.TYPE_EVENT_REPORT: {
+ String elementId = element.getUId();
+ attachFragment(WebViewEventReportFragment.newInstance(elementId));
+ break;
+ }
}
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
new file mode 100644
index 00000000..8da56a4a
--- /dev/null
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
@@ -0,0 +1,162 @@
+package org.hisp.dhis.android.dashboard.ui.fragments;
+
+import static android.text.TextUtils.isEmpty;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebView;
+
+import org.hisp.dhis.android.dashboard.DhisApplication;
+import org.hisp.dhis.android.dashboard.R;
+import org.hisp.dhis.android.dashboard.api.controllers.DhisController;
+import org.hisp.dhis.android.dashboard.api.job.Job;
+import org.hisp.dhis.android.dashboard.api.job.JobExecutor;
+import org.hisp.dhis.android.dashboard.api.models.DataElementDimension;
+import org.hisp.dhis.android.dashboard.api.models.EventReport;
+import org.hisp.dhis.android.dashboard.api.models.meta.ResponseHolder;
+import org.hisp.dhis.android.dashboard.api.network.APIException;
+import org.hisp.dhis.android.dashboard.api.network.DhisApi;
+import org.hisp.dhis.android.dashboard.api.network.RepoManager;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+import retrofit.mime.TypedInput;
+
+public class WebViewEventReportFragment extends BaseFragment {
+ private static final String DASHBOARD_ELEMENT_ID = "arg:dashboardElementId";
+
+ @Bind(R.id.web_view_content)
+ WebView mWebView;
+
+ @Bind(R.id.container_layout_progress_bar)
+ View mProgressBarContainer;
+
+ public static WebViewEventReportFragment newInstance(String id) {
+ Bundle args = new Bundle();
+ args.putString(DASHBOARD_ELEMENT_ID, id);
+
+ WebViewEventReportFragment fragment = new WebViewEventReportFragment();
+ fragment.setArguments(args);
+
+ return fragment;
+ }
+
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_web_view, container, false);
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ ButterKnife.bind(this, view);
+
+ mWebView.getSettings().setBuiltInZoomControls(true);
+ if (getArguments() != null && !isEmpty(getArguments()
+ .getString(DASHBOARD_ELEMENT_ID))) {
+ JobExecutor.enqueueJob(new GetEventReportTableJob(this, getArguments()
+ .getString(DASHBOARD_ELEMENT_ID)));
+ }
+ }
+
+ public void onDataDownloaded(ResponseHolder data) {
+ mProgressBarContainer.setVisibility(View.GONE);
+
+ if (data.getApiException() == null) {
+ mWebView.loadData(data.getItem(), "text/html", "UTF-8");
+ } else {
+ if (isAdded()) {
+ ((DhisApplication) (getActivity().getApplication()))
+ .showApiExceptionMessage(data.getApiException());
+ }
+ }
+ }
+
+ static class GetEventReportTableJob extends Job> {
+ static final int JOB_ID = 1546489;
+
+ final WeakReference mFragmentRef;
+ final String mDashboardElementId;
+
+ public GetEventReportTableJob(WebViewEventReportFragment fragment,
+ String dashboardElementId) {
+ super(JOB_ID);
+
+ mFragmentRef = new WeakReference<>(fragment);
+ mDashboardElementId = dashboardElementId;
+ }
+
+
+ static String readInputStream(TypedInput in) {
+ StringBuilder builder = new StringBuilder();
+ try {
+ BufferedReader bufferedStream
+ = new BufferedReader(new InputStreamReader(in.in()));
+ try {
+ String line;
+ while ((line = bufferedStream.readLine()) != null) {
+ builder.append(line);
+ builder.append('\n');
+ }
+ return builder.toString();
+ } finally {
+ bufferedStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public ResponseHolder inBackground() {
+ ResponseHolder responseHolder = new ResponseHolder<>();
+ EventReport eventReport;
+
+ try {
+ DhisApi dhisApi = RepoManager.createService(
+ DhisController.getInstance().getServerUrl(),
+ DhisController.getInstance().getUserCredentials());
+ eventReport = dhisApi.getEventReport(mDashboardElementId);
+ responseHolder.setItem(readInputStream(
+ dhisApi.getEventReportTableData(eventReport.getProgram().getuId(),
+ eventReport.getProgramStage().getuId(),
+ getDimensions(eventReport)).getBody()));
+ } catch (APIException exception) {
+ responseHolder.setApiException(exception);
+ }
+
+ return responseHolder;
+ }
+
+ private List getDimensions(EventReport eventReport) {
+ List dimensions = new ArrayList<>();
+ dimensions.add("pe:" + eventReport.getRelativePeriods().getRelativePeriodString());
+ dimensions.add("ou:" + eventReport.getOrganisationUnits().get(0).getuId());
+ for (DataElementDimension dimension : eventReport.getDataElementDimensions()) {
+ String dimensionUID = "";
+ dimensionUID += dimension.getDataElement().getuId();
+ if (dimension.getFilter() != null && !dimension.getFilter().isEmpty()) {
+ dimensionUID += ":" + dimension.getFilter();
+ }
+ dimensions.add(dimensionUID);
+ }
+ return dimensions;
+ }
+
+ @Override
+ public void onFinish(ResponseHolder result) {
+ if (mFragmentRef.get() != null) {
+ mFragmentRef.get().onDataDownloaded(result);
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
index ac88db14..fa1a8aa7 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
@@ -58,7 +58,6 @@
import org.hisp.dhis.android.dashboard.api.models.meta.State;
import org.hisp.dhis.android.dashboard.api.persistence.loaders.DbLoader;
import org.hisp.dhis.android.dashboard.api.persistence.loaders.Query;
-import org.hisp.dhis.android.dashboard.api.persistence.preferences.ResourceType;
import org.hisp.dhis.android.dashboard.api.utils.EventBusProvider;
import org.hisp.dhis.android.dashboard.ui.activities.DashboardElementDetailActivity;
import org.hisp.dhis.android.dashboard.ui.adapters.DashboardItemAdapter;
@@ -209,7 +208,8 @@ public void onContentClick(DashboardElement element) {
case DashboardItemContent.TYPE_CHART:
case DashboardItemContent.TYPE_EVENT_CHART:
case DashboardItemContent.TYPE_MAP:
- case DashboardItemContent.TYPE_REPORT_TABLE: {
+ case DashboardItemContent.TYPE_REPORT_TABLE:
+ case DashboardItemContent.TYPE_EVENT_REPORT: {
Intent intent = DashboardElementDetailActivity
.newIntentForDashboardElement(getActivity(), element.getId());
startActivity(intent);
From bbd320481f2188aadaed60689114e04d60f56be2 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 26 Jun 2017 14:42:37 +0200
Subject: [PATCH 27/69] Added width/height image size preference
---
.../api/controllers/DhisController.java | 24 +++++--
.../api/controllers/PullImageController.java | 12 ++--
.../preferences/SettingsManager.java | 34 +++++++++
.../DashboardElementDetailActivity.java | 19 ++---
.../ui/adapters/DashboardItemAdapter.java | 10 +--
.../ui/adapters/InterpretationAdapter.java | 4 +-
.../ui/fragments/ImageViewFragment.java | 4 +-
.../ui/fragments/SettingsFragment.java | 44 +++++++++++-
app/src/main/res/layout/fragment_settings.xml | 69 ++++++++++++++++++-
app/src/main/res/values/colors.xml | 2 +
app/src/main/res/values/dimens.xml | 1 +
app/src/main/res/values/strings.xml | 6 ++
12 files changed, 199 insertions(+), 30 deletions(-)
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
index 7e7ae850..5b19cff9 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
@@ -28,6 +28,8 @@
package org.hisp.dhis.android.dashboard.api.controllers;
+import static org.hisp.dhis.android.dashboard.api.utils.Preconditions.isNull;
+
import android.content.Context;
import com.raizlabs.android.dbflow.config.FlowManager;
@@ -41,8 +43,7 @@
import org.hisp.dhis.android.dashboard.api.network.RepoManager;
import org.hisp.dhis.android.dashboard.api.persistence.preferences.DateTimeManager;
import org.hisp.dhis.android.dashboard.api.persistence.preferences.LastUpdatedManager;
-
-import static org.hisp.dhis.android.dashboard.api.utils.Preconditions.isNull;
+import org.hisp.dhis.android.dashboard.api.persistence.preferences.SettingsManager;
public class DhisController {
private static DhisController mDhisController;
@@ -73,11 +74,26 @@ public static DhisController getInstance() {
return mDhisController;
}
- public static String buildImageUrl(String resource, String id) {
+ public static String buildImageUrl(String resource, String id, Context context) {
+ String height = "320";
+ String width = "480";
+
+ String widthUserPreference = SettingsManager.getInstance(context).getPreference(
+ (SettingsManager.CHART_WIDTH), "0");
+ String heightUserPreference = SettingsManager.getInstance(context).getPreference(
+ (SettingsManager.CHART_WIDTH), "0");
+ if (widthUserPreference != null && !widthUserPreference.equals("") && Integer.parseInt(
+ widthUserPreference) > 480) {
+ width = widthUserPreference;
+ }
+ if (heightUserPreference != null && !heightUserPreference.equals("") && Integer.parseInt(
+ heightUserPreference) > 320) {
+ height = heightUserPreference;
+ }
return getInstance().getServerUrl().newBuilder()
.addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment(
"data.png")
- .addQueryParameter("width", "480").addQueryParameter("height", "320")
+ .addQueryParameter("width", width).addQueryParameter("height", height)
.toString();
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
index bc9357aa..41b6ca7b 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
@@ -15,7 +15,7 @@
import java.util.List;
final class PullImageController {
- Context mContext;
+ static Context mContext;
public PullImageController(Context context) {
mContext = context;
@@ -40,9 +40,9 @@ public static List downloadInterpretationImages(List requestList
continue;
}
if (Interpretation.TYPE_CHART.equals(interpretationElement.getType())) {
- requestList.add(DhisController.buildImageUrl("charts", interpretationElement.getUId()));
+ requestList.add(DhisController.buildImageUrl("charts", interpretationElement.getUId(), mContext));
} else if (Interpretation.TYPE_MAP.equals(interpretationElement.getType())) {
- requestList.add(DhisController.buildImageUrl("maps", interpretationElement.getUId()));
+ requestList.add(DhisController.buildImageUrl("maps", interpretationElement.getUId(), mContext));
}
}
return requestList;
@@ -56,15 +56,15 @@ public static List downloadDashboardImages(List requestList) {
switch (element.getDashboardItem().getType()) {
case DashboardItemContent.TYPE_CHART: {
- requestList.add(DhisController.buildImageUrl("charts", element.getUId()));
+ requestList.add(DhisController.buildImageUrl("charts", element.getUId(), mContext));
break;
}
case DashboardItemContent.TYPE_EVENT_CHART: {
- requestList.add(DhisController.buildImageUrl("eventCharts", element.getUId()));
+ requestList.add(DhisController.buildImageUrl("eventCharts", element.getUId(), mContext));
break;
}
case DashboardItemContent.TYPE_MAP: {
- requestList.add(DhisController.buildImageUrl("maps", element.getUId()));
+ requestList.add(DhisController.buildImageUrl("maps", element.getUId(), mContext));
break;
}
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
new file mode 100644
index 00000000..a8793791
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
@@ -0,0 +1,34 @@
+package org.hisp.dhis.android.dashboard.api.persistence.preferences;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class SettingsManager {
+ public static final String CHART_WIDTH = "key:chart_width";
+ public static final String CHART_HEIGHT = "key:chart_height";
+ private static final String PREFERENCES = "preferences:settings";
+ private static SettingsManager mSettingsManager = null;
+ private SharedPreferences mPrefs;
+
+ public SettingsManager(Context context) {
+ mPrefs = context.getSharedPreferences(SettingsManager.PREFERENCES,
+ Context.MODE_PRIVATE);
+ }
+
+ public static SettingsManager getInstance(Context context) {
+ if (mSettingsManager == null) {
+ mSettingsManager = new SettingsManager(context);
+ }
+ return mSettingsManager;
+ }
+
+ public void setPreference(String key, String value) {
+ mPrefs.edit().putString(key, value).commit();
+ }
+
+ public String getPreference(String key, String defaultValue) {
+ return mPrefs.getString(key, defaultValue);
+ }
+
+
+}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
index 82c72e1b..85f8332c 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
@@ -29,6 +29,7 @@
package org.hisp.dhis.android.dashboard.ui.activities;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
@@ -107,7 +108,7 @@ protected void onPostCreate(Bundle savedInstanceState) {
.where(Condition.column(DashboardElement$Table.ID)
.is(getDashboardElementId()))
.querySingle();
- handleDashboardElement(element);
+ handleDashboardElement(element, getApplicationContext());
}
if (interpretationElementId > 0) {
@@ -116,11 +117,11 @@ protected void onPostCreate(Bundle savedInstanceState) {
.where(Condition.column(InterpretationElement$Table
.ID).is(interpretationElementId))
.querySingle();
- handleInterpretationElement(element);
+ handleInterpretationElement(element, getApplicationContext());
}
}
- private void handleDashboardElement(DashboardElement element) {
+ private void handleDashboardElement(DashboardElement element, Context context) {
if (element == null || element.getDashboardItem() == null) {
return;
@@ -129,17 +130,17 @@ private void handleDashboardElement(DashboardElement element) {
mToolbar.setTitle(element.getDisplayName());
switch (element.getDashboardItem().getType()) {
case DashboardItemContent.TYPE_CHART: {
- String request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("charts", element.getUId(), context);
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case DashboardItemContent.TYPE_EVENT_CHART: {
- String request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId(), context);
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case DashboardItemContent.TYPE_MAP: {
- String request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("maps", element.getUId(), context);
attachFragment(ImageViewFragment.newInstance(request));
break;
}
@@ -151,7 +152,7 @@ private void handleDashboardElement(DashboardElement element) {
}
}
- private void handleInterpretationElement(InterpretationElement element) {
+ private void handleInterpretationElement(InterpretationElement element, Context context) {
if (element == null || element.getInterpretation() == null) {
return;
}
@@ -159,12 +160,12 @@ private void handleInterpretationElement(InterpretationElement element) {
mToolbar.setTitle(element.getDisplayName());
switch (element.getInterpretation().getType()) {
case Interpretation.TYPE_CHART: {
- String request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("charts", element.getUId(), context);
attachFragment(ImageViewFragment.newInstance(request));
break;
}
case Interpretation.TYPE_MAP: {
- String request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
+ String request = DhisController.getInstance().buildImageUrl("maps", element.getUId(), context);
attachFragment(ImageViewFragment.newInstance(request));
break;
}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
index 9f1859b7..812e9d74 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
@@ -285,7 +285,7 @@ private IElementContentViewHolder onCreateElementContentViewHolder(ViewGroup par
private void onBindElementContentViewHolder(IElementContentViewHolder holder, int viewType, int position) {
switch (viewType) {
case ITEM_WITH_IMAGE_TYPE: {
- handleItemsWithImages((ImageItemViewHolder) holder, getItem(position));
+ handleItemsWithImages((ImageItemViewHolder) holder, getItem(position), getContext());
break;
}
case ITEM_WITH_TABLE_TYPE: {
@@ -300,18 +300,18 @@ private void onBindElementContentViewHolder(IElementContentViewHolder holder, in
}
/* builds the URL to image data and loads it by means of Picasso. */
- private void handleItemsWithImages(ImageItemViewHolder holder, DashboardItem item) {
+ private void handleItemsWithImages(ImageItemViewHolder holder, DashboardItem item, Context context) {
DashboardElement element = null;
String request = null;
if (DashboardItemContent.TYPE_CHART.equals(item.getType()) && item.getChart() != null) {
element = item.getChart();
- request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("charts", element.getUId(), context);
} else if (DashboardItemContent.TYPE_MAP.equals(item.getType()) && item.getMap() != null) {
element = item.getMap();
- request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("maps", element.getUId(), context);
} else if (DashboardItemContent.TYPE_EVENT_CHART.equals(item.getType()) && item.getEventChart() != null) {
element = item.getEventChart();
- request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId(), context);
}
holder.listener.setDashboardElement(element);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
index b4eda684..4718ac82 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/InterpretationAdapter.java
@@ -216,10 +216,10 @@ private void handleItemsWithImages(ImageItemViewHolder holder, Interpretation it
String request = null;
if (Interpretation.TYPE_CHART.equals(item.getType()) && item.getChart() != null) {
InterpretationElement element = item.getChart();
- request = DhisController.getInstance().buildImageUrl("charts", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("charts", element.getUId(), getContext());
} else if (Interpretation.TYPE_MAP.equals(item.getType()) && item.getMap() != null) {
InterpretationElement element = item.getMap();
- request = DhisController.getInstance().buildImageUrl("maps", element.getUId());
+ request = DhisController.getInstance().buildImageUrl("maps", element.getUId(), getContext());
}
holder.listener.setInterpretation(item);
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/ImageViewFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/ImageViewFragment.java
index 68d54850..70bfa160 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/ImageViewFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/ImageViewFragment.java
@@ -36,6 +36,7 @@
import android.widget.ImageView;
import org.hisp.dhis.android.dashboard.R;
+import org.hisp.dhis.android.dashboard.api.persistence.preferences.SettingsManager;
import org.hisp.dhis.android.dashboard.api.utils.PicassoProvider;
import uk.co.senab.photoview.PhotoViewAttacher;
@@ -60,7 +61,8 @@ public static ImageViewFragment newInstance(String imageUrl) {
}
private String getImageUrl() {
- return getArguments().getString(IMAGE_URL);
+ String imageSimplePath = getArguments().getString(IMAGE_URL);
+ return imageSimplePath;
}
@Nullable @Override
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
index 24ef3431..48f17500 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
@@ -1,9 +1,13 @@
package org.hisp.dhis.android.dashboard.ui.fragments;
+import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -11,8 +15,11 @@
import com.squareup.otto.Subscribe;
import org.hisp.dhis.android.dashboard.R;
+import org.hisp.dhis.android.dashboard.api.persistence.preferences.DateTimeManager;
+import org.hisp.dhis.android.dashboard.api.persistence.preferences.SettingsManager;
import org.hisp.dhis.android.dashboard.ui.activities.LauncherActivity;
import org.hisp.dhis.android.dashboard.ui.events.UiEvent;
+import org.hisp.dhis.android.dashboard.ui.views.FontEditText;
import butterknife.Bind;
import butterknife.ButterKnife;
@@ -22,14 +29,20 @@
* Created by arazabishov on 7/27/15.
*/
public final class SettingsFragment extends BaseFragment {
-
@Bind(R.id.toolbar)
Toolbar mToolbar;
+ FontEditText widthEditText;
+ FontEditText heightEditText;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return inflater.inflate(R.layout.fragment_settings, container, false);
+ View view = inflater.inflate(R.layout.fragment_settings, container, false);
+ widthEditText = (FontEditText) view.findViewById(R.id.update_width_edit);
+ heightEditText =(FontEditText) view.findViewById(R.id.update_height_edit);
+ widthEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_WIDTH));
+ widthEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_HEIGHT));
+ return view;
}
@Override
@@ -44,6 +57,11 @@ public void onClick(View v) {
toggleNavigationDrawer();
}
});
+ Integer width = Integer.parseInt(SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_WIDTH), "0"));
+ Integer height = Integer.parseInt(SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_HEIGHT), "0"));
+ widthEditText.setText(width+"");
+ heightEditText.setText(height+"");
+
}
@OnClick(R.id.delete_and_log_out_button)
@@ -62,4 +80,26 @@ public void onLogOut(UiEvent event) {
getActivity().finish();
}
}
+
+ private class CustomTextWatcher implements TextWatcher{
+
+ final String preference;
+ public CustomTextWatcher(String preference){
+ this.preference = preference;
+ }
+ @Override
+ public void afterTextChanged(Editable s) {}
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start,
+ int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start,
+ int before, int count) {
+ SettingsManager.getInstance(getContext()).setPreference(preference, s.toString());
+ }
+ }
+
}
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index df6b7975..fbb562a3 100755
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -53,13 +53,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#FF223F5C
#FF113151
#FF0C243C
+
+ #9f9f9f
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 921db573..59aed7c9 100755
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -6,6 +6,7 @@
3dp
6dp
13dp
+ 22sp
1
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5bb935c7..e6c4b583 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -132,4 +132,10 @@
sh ${gitPath}/generate_last_commit.sh
3. Run "git checkout".
]]>
+
+
+
+ "Images size (Default=0)"
+ "Width:"
+ "Height:"
From 96cc40f89c1b6bd15c5174fe7308d1d96e9ff0ac Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Mon, 26 Jun 2017 14:56:31 +0200
Subject: [PATCH 28/69] Refactor remove WebViewEventReportFragment.
---
.../DashboardElementDetailActivity.java | 12 +-
.../fragments/WebViewEventReportFragment.java | 162 ------------------
.../ui/fragments/WebViewFragment.java | 69 +++++++-
3 files changed, 67 insertions(+), 176 deletions(-)
delete mode 100644 app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
index 82e9ee5b..1522a513 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/activities/DashboardElementDetailActivity.java
@@ -47,7 +47,6 @@
import org.hisp.dhis.android.dashboard.api.models.InterpretationElement;
import org.hisp.dhis.android.dashboard.api.models.InterpretationElement$Table;
import org.hisp.dhis.android.dashboard.ui.fragments.ImageViewFragment;
-import org.hisp.dhis.android.dashboard.ui.fragments.WebViewEventReportFragment;
import org.hisp.dhis.android.dashboard.ui.fragments.WebViewFragment;
import butterknife.Bind;
@@ -144,14 +143,11 @@ private void handleDashboardElement(DashboardElement element) {
attachFragment(ImageViewFragment.newInstance(request));
break;
}
- case DashboardItemContent.TYPE_REPORT_TABLE: {
- String elementId = element.getUId();
- attachFragment(WebViewFragment.newInstance(elementId));
- break;
- }
+ case DashboardItemContent.TYPE_REPORT_TABLE:
case DashboardItemContent.TYPE_EVENT_REPORT: {
String elementId = element.getUId();
- attachFragment(WebViewEventReportFragment.newInstance(elementId));
+ attachFragment(WebViewFragment.newInstance(elementId,
+ element.getDashboardItem().getType()));
break;
}
}
@@ -176,7 +172,7 @@ private void handleInterpretationElement(InterpretationElement element) {
}
case Interpretation.TYPE_REPORT_TABLE: {
String elementId = element.getUId();
- attachFragment(WebViewFragment.newInstance(elementId));
+ attachFragment(WebViewFragment.newInstance(elementId, element.getType()));
break;
}
case Interpretation.TYPE_DATA_SET_REPORT: {
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
deleted file mode 100644
index 8da56a4a..00000000
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewEventReportFragment.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.hisp.dhis.android.dashboard.ui.fragments;
-
-import static android.text.TextUtils.isEmpty;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-
-import org.hisp.dhis.android.dashboard.DhisApplication;
-import org.hisp.dhis.android.dashboard.R;
-import org.hisp.dhis.android.dashboard.api.controllers.DhisController;
-import org.hisp.dhis.android.dashboard.api.job.Job;
-import org.hisp.dhis.android.dashboard.api.job.JobExecutor;
-import org.hisp.dhis.android.dashboard.api.models.DataElementDimension;
-import org.hisp.dhis.android.dashboard.api.models.EventReport;
-import org.hisp.dhis.android.dashboard.api.models.meta.ResponseHolder;
-import org.hisp.dhis.android.dashboard.api.network.APIException;
-import org.hisp.dhis.android.dashboard.api.network.DhisApi;
-import org.hisp.dhis.android.dashboard.api.network.RepoManager;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-import butterknife.Bind;
-import butterknife.ButterKnife;
-import retrofit.mime.TypedInput;
-
-public class WebViewEventReportFragment extends BaseFragment {
- private static final String DASHBOARD_ELEMENT_ID = "arg:dashboardElementId";
-
- @Bind(R.id.web_view_content)
- WebView mWebView;
-
- @Bind(R.id.container_layout_progress_bar)
- View mProgressBarContainer;
-
- public static WebViewEventReportFragment newInstance(String id) {
- Bundle args = new Bundle();
- args.putString(DASHBOARD_ELEMENT_ID, id);
-
- WebViewEventReportFragment fragment = new WebViewEventReportFragment();
- fragment.setArguments(args);
-
- return fragment;
- }
-
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- return inflater.inflate(R.layout.fragment_web_view, container, false);
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- ButterKnife.bind(this, view);
-
- mWebView.getSettings().setBuiltInZoomControls(true);
- if (getArguments() != null && !isEmpty(getArguments()
- .getString(DASHBOARD_ELEMENT_ID))) {
- JobExecutor.enqueueJob(new GetEventReportTableJob(this, getArguments()
- .getString(DASHBOARD_ELEMENT_ID)));
- }
- }
-
- public void onDataDownloaded(ResponseHolder data) {
- mProgressBarContainer.setVisibility(View.GONE);
-
- if (data.getApiException() == null) {
- mWebView.loadData(data.getItem(), "text/html", "UTF-8");
- } else {
- if (isAdded()) {
- ((DhisApplication) (getActivity().getApplication()))
- .showApiExceptionMessage(data.getApiException());
- }
- }
- }
-
- static class GetEventReportTableJob extends Job> {
- static final int JOB_ID = 1546489;
-
- final WeakReference mFragmentRef;
- final String mDashboardElementId;
-
- public GetEventReportTableJob(WebViewEventReportFragment fragment,
- String dashboardElementId) {
- super(JOB_ID);
-
- mFragmentRef = new WeakReference<>(fragment);
- mDashboardElementId = dashboardElementId;
- }
-
-
- static String readInputStream(TypedInput in) {
- StringBuilder builder = new StringBuilder();
- try {
- BufferedReader bufferedStream
- = new BufferedReader(new InputStreamReader(in.in()));
- try {
- String line;
- while ((line = bufferedStream.readLine()) != null) {
- builder.append(line);
- builder.append('\n');
- }
- return builder.toString();
- } finally {
- bufferedStream.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return builder.toString();
- }
-
- @Override
- public ResponseHolder inBackground() {
- ResponseHolder responseHolder = new ResponseHolder<>();
- EventReport eventReport;
-
- try {
- DhisApi dhisApi = RepoManager.createService(
- DhisController.getInstance().getServerUrl(),
- DhisController.getInstance().getUserCredentials());
- eventReport = dhisApi.getEventReport(mDashboardElementId);
- responseHolder.setItem(readInputStream(
- dhisApi.getEventReportTableData(eventReport.getProgram().getuId(),
- eventReport.getProgramStage().getuId(),
- getDimensions(eventReport)).getBody()));
- } catch (APIException exception) {
- responseHolder.setApiException(exception);
- }
-
- return responseHolder;
- }
-
- private List getDimensions(EventReport eventReport) {
- List dimensions = new ArrayList<>();
- dimensions.add("pe:" + eventReport.getRelativePeriods().getRelativePeriodString());
- dimensions.add("ou:" + eventReport.getOrganisationUnits().get(0).getuId());
- for (DataElementDimension dimension : eventReport.getDataElementDimensions()) {
- String dimensionUID = "";
- dimensionUID += dimension.getDataElement().getuId();
- if (dimension.getFilter() != null && !dimension.getFilter().isEmpty()) {
- dimensionUID += ":" + dimension.getFilter();
- }
- dimensions.add(dimensionUID);
- }
- return dimensions;
- }
-
- @Override
- public void onFinish(ResponseHolder result) {
- if (mFragmentRef.get() != null) {
- mFragmentRef.get().onDataDownloaded(result);
- }
- }
- }
-}
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
index 52e7f30f..9bb2e628 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
@@ -28,6 +28,10 @@
package org.hisp.dhis.android.dashboard.ui.fragments;
+import static android.text.TextUtils.isEmpty;
+
+import static org.hisp.dhis.android.dashboard.api.models.DashboardItemContent.TYPE_REPORT_TABLE;
+
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,6 +43,8 @@
import org.hisp.dhis.android.dashboard.api.controllers.DhisController;
import org.hisp.dhis.android.dashboard.api.job.Job;
import org.hisp.dhis.android.dashboard.api.job.JobExecutor;
+import org.hisp.dhis.android.dashboard.api.models.DataElementDimension;
+import org.hisp.dhis.android.dashboard.api.models.EventReport;
import org.hisp.dhis.android.dashboard.api.models.meta.ResponseHolder;
import org.hisp.dhis.android.dashboard.api.network.APIException;
import org.hisp.dhis.android.dashboard.api.network.DhisApi;
@@ -48,15 +54,16 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.mime.TypedInput;
-import static android.text.TextUtils.isEmpty;
-
public class WebViewFragment extends BaseFragment {
private static final String DASHBOARD_ELEMENT_ID = "arg:dashboardElementId";
+ private static final String DASHBOARD_TYPE = "dashboardType";
@Bind(R.id.web_view_content)
WebView mWebView;
@@ -64,9 +71,10 @@ public class WebViewFragment extends BaseFragment {
@Bind(R.id.container_layout_progress_bar)
View mProgressBarContainer;
- public static WebViewFragment newInstance(String id) {
+ public static WebViewFragment newInstance(String id, String dashboardType) {
Bundle args = new Bundle();
args.putString(DASHBOARD_ELEMENT_ID, id);
+ args.putString(DASHBOARD_TYPE, dashboardType);
WebViewFragment fragment = new WebViewFragment();
fragment.setArguments(args);
@@ -84,9 +92,16 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
mWebView.getSettings().setBuiltInZoomControls(true);
if (getArguments() != null && !isEmpty(getArguments()
- .getString(DASHBOARD_ELEMENT_ID))) {
- JobExecutor.enqueueJob(new GetReportTableJob(this, getArguments()
- .getString(DASHBOARD_ELEMENT_ID)));
+ .getString(DASHBOARD_ELEMENT_ID)) && !isEmpty(getArguments()
+ .getString(DASHBOARD_TYPE))) {
+ if (getArguments()
+ .getString(DASHBOARD_TYPE).equals(TYPE_REPORT_TABLE)) {
+ JobExecutor.enqueueJob(new GetReportTableJob(this, getArguments()
+ .getString(DASHBOARD_ELEMENT_ID)));
+ } else {
+ JobExecutor.enqueueJob(new GetEventReportTableJob(this, getArguments()
+ .getString(DASHBOARD_ELEMENT_ID)));
+ }
}
}
@@ -159,4 +174,46 @@ public void onFinish(ResponseHolder result) {
}
}
}
+
+ static class GetEventReportTableJob extends GetReportTableJob {
+ public GetEventReportTableJob(WebViewFragment fragment, String dashboardElementId) {
+ super(fragment, dashboardElementId);
+ }
+
+ @Override
+ public ResponseHolder inBackground() {
+ ResponseHolder responseHolder = new ResponseHolder<>();
+ EventReport eventReport;
+
+ try {
+ DhisApi dhisApi = RepoManager.createService(
+ DhisController.getInstance().getServerUrl(),
+ DhisController.getInstance().getUserCredentials());
+ eventReport = dhisApi.getEventReport(mDashboardElementId);
+ responseHolder.setItem(readInputStream(
+ dhisApi.getEventReportTableData(eventReport.getProgram().getuId(),
+ eventReport.getProgramStage().getuId(),
+ getDimensions(eventReport)).getBody()));
+ } catch (APIException exception) {
+ responseHolder.setApiException(exception);
+ }
+
+ return responseHolder;
+ }
+
+ private List getDimensions(EventReport eventReport) {
+ List dimensions = new ArrayList<>();
+ dimensions.add("pe:" + eventReport.getRelativePeriods().getRelativePeriodString());
+ dimensions.add("ou:" + eventReport.getOrganisationUnits().get(0).getuId());
+ for (DataElementDimension dimension : eventReport.getDataElementDimensions()) {
+ String dimensionUID = "";
+ dimensionUID += dimension.getDataElement().getuId();
+ if (dimension.getFilter() != null && !dimension.getFilter().isEmpty()) {
+ dimensionUID += ":" + dimension.getFilter();
+ }
+ dimensions.add(dimensionUID);
+ }
+ return dimensions;
+ }
+ }
}
\ No newline at end of file
From c60bc54862cf63b45c4a64756d0d7f384ca85dd3 Mon Sep 17 00:00:00 2001
From: Idelcano
Date: Mon, 26 Jun 2017 19:04:42 +0200
Subject: [PATCH 29/69] Check if a dashboard is null before loop it
---
.../android/dashboard/api/controllers/PullImageController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
index bc9357aa..939220ae 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/PullImageController.java
@@ -50,7 +50,7 @@ public static List downloadInterpretationImages(List requestList
public static List downloadDashboardImages(List requestList) {
for (DashboardElement element : DashboardController.queryAllDashboardElement()) {
- if (element.getDashboardItem().getType() == null) {
+ if (element.getDashboardItem() == null || element.getDashboardItem().getType() == null) {
continue;
}
From 686371dc6341e78804e135d8bb75bb93591a7f13 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Tue, 27 Jun 2017 11:07:06 +0200
Subject: [PATCH 30/69] Add order to dashboard items
---
.../api/controllers/DashboardController.java | 3 +++
.../android/dashboard/api/models/DashboardItem.java | 12 ++++++++++++
.../ui/fragments/dashboard/DashboardFragment.java | 3 ++-
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
index 8936d276..2b9fc053 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
@@ -188,8 +188,11 @@ private List updateDashboards(DateTime lastUpdated) throws APIExcepti
continue;
}
+ int i=0;
for (DashboardItem item : dashboard.getDashboardItems()) {
item.setDashboard(dashboard);
+ item.setOrderPosition(i);
+ i++;
}
}
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DashboardItem.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DashboardItem.java
index 8749f701..f83af67f 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DashboardItem.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/DashboardItem.java
@@ -108,6 +108,10 @@ public final class DashboardItem extends BaseIdentifiableObject {
@JsonProperty("messages")
boolean messages;
+ @JsonIgnore
+ @Column
+ int orderPosition;
+
public DashboardItem() {
state = State.SYNCED;
shape = SHAPE_NORMAL;
@@ -425,4 +429,12 @@ public State getState() {
public void setState(State state) {
this.state = state;
}
+
+ public int getOrderPosition() {
+ return orderPosition;
+ }
+
+ public void setOrderPosition(int orderPosition) {
+ this.orderPosition = orderPosition;
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
index ac88db14..f7ab9f50 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardFragment.java
@@ -277,7 +277,8 @@ public List query(Context context) {
DashboardItemContent.TYPE_EVENT_REPORT,
DashboardItemContent.TYPE_USERS,
DashboardItemContent.TYPE_REPORTS,
- DashboardItemContent.TYPE_RESOURCES))
+ DashboardItemContent.TYPE_RESOURCES)
+ ).orderBy(DashboardItem$Table.ORDERPOSITION)
.queryList();
if (dashboardItems != null && !dashboardItems.isEmpty()) {
for (DashboardItem dashboardItem : dashboardItems) {
From 673609bff6f15ed621412514e7cbeb729433575d Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Tue, 4 Jul 2017 11:57:50 +0200
Subject: [PATCH 31/69] Solved bug not updating dashboard items
---
.../api/controllers/DashboardController.java | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
index 8936d276..c0fb9d28 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
@@ -28,6 +28,13 @@
package org.hisp.dhis.android.dashboard.api.controllers;
+import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.merge;
+import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.toListIds;
+import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.toMap;
+import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.findLocationHeader;
+import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.handleApiException;
+import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.unwrapResponse;
+
import android.net.Uri;
import com.raizlabs.android.dbflow.sql.builder.Condition;
@@ -61,13 +68,6 @@
import retrofit.client.Header;
import retrofit.client.Response;
-import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.merge;
-import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.toListIds;
-import static org.hisp.dhis.android.dashboard.api.models.BaseIdentifiableObject.toMap;
-import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.findLocationHeader;
-import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.handleApiException;
-import static org.hisp.dhis.android.dashboard.api.utils.NetworkUtils.unwrapResponse;
-
final class DashboardController {
final DhisApi mDhisApi;
@@ -169,7 +169,8 @@ private List updateDashboards(DateTime lastUpdated) throws APIExcepti
"]");
if (lastUpdated != null) {
- QUERY_MAP_FULL.put("filter", "lastUpdated:gt:" + lastUpdated.toString());
+ QUERY_MAP_FULL.put("filter",
+ "lastUpdated:gt:" + lastUpdated.toLocalDateTime().toString());
}
// List of dashboards with UUIDs (without content). This list is used
From 074f910dc580f19bc3179f39a463e255263f0e21 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Wed, 5 Jul 2017 11:51:29 +0200
Subject: [PATCH 32/69] Saving always the dashboard items in the db to save the
order of it. Making the migration to add orderPos column to dashboardItem.
---
.../dashboard/api/models/meta/DbDhis.java | 2 +-
.../MigrationAddOrderPosToDashboardItem.java | 20 +++++++++++++++++++
.../android/dashboard/api/utils/DbUtils.java | 5 +----
3 files changed, 22 insertions(+), 5 deletions(-)
create mode 100644 api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/DbDhis.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/DbDhis.java
index 0d8492e9..bfc838c6 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/DbDhis.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/DbDhis.java
@@ -34,5 +34,5 @@
@Database(name = DbDhis.NAME, version = DbDhis.VERSION)
public final class DbDhis {
public static final String NAME = "dhis";
- public static final int VERSION = 3;
+ public static final int VERSION = 4;
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
new file mode 100644
index 00000000..2dbabb11
--- /dev/null
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
@@ -0,0 +1,20 @@
+package org.hisp.dhis.android.dashboard.api.models.meta.migrations;
+
+import com.raizlabs.android.dbflow.annotation.Migration;
+import com.raizlabs.android.dbflow.sql.migration.AlterTableMigration;
+
+import org.hisp.dhis.android.dashboard.api.models.DashboardItem;
+import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
+
+@Migration(version = 4, databaseName = DbDhis.NAME)
+public class MigrationAddOrderPosToDashboardItem extends AlterTableMigration {
+ public MigrationAddOrderPosToDashboardItem(
+ Class table) {
+ super(table);
+ }
+
+ @Override
+ public void onPreMigrate() {
+ addColumn(Integer.class, "orderPosition");
+ }
+}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/DbUtils.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/DbUtils.java
index 6d830bd2..6235b397 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/DbUtils.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/DbUtils.java
@@ -94,14 +94,11 @@ public static List createOperati
continue;
}
- // if the last updated field in up to date model is after the same
- // field in persisted model, it means we need to update it.
- if (newModel.getLastUpdated().isAfter(oldModel.getLastUpdated())) {
+ //always updating to save changes not from the server
// note, we need to pass database primary id to updated model
// in order to avoid creation of new object.
newModel.setId(oldModel.getId());
ops.add(DbOperation.update(newModel));
- }
// as we have processed given old (persisted) model,
// we can remove it from map of new models.
From a07cb373dd9da6f622d57f27a1ed1756f542a911 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Wed, 5 Jul 2017 12:09:59 +0200
Subject: [PATCH 33/69] Solved migration bug
---
.../migrations/MigrationAddOrderPosToDashboardItem.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
index 2dbabb11..ba34e06c 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/meta/migrations/MigrationAddOrderPosToDashboardItem.java
@@ -8,9 +8,10 @@
@Migration(version = 4, databaseName = DbDhis.NAME)
public class MigrationAddOrderPosToDashboardItem extends AlterTableMigration {
- public MigrationAddOrderPosToDashboardItem(
- Class table) {
- super(table);
+
+
+ public MigrationAddOrderPosToDashboardItem() {
+ super(DashboardItem.class);
}
@Override
From 3a56cc3520ab47a12ac6227044de6b2fd96e7825 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Fri, 7 Jul 2017 13:49:43 +0200
Subject: [PATCH 34/69] Solved bug crashing app when rotating screen and
service is null.
---
.../ui/fragments/dashboard/DashboardViewPagerFragment.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardViewPagerFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardViewPagerFragment.java
index da427918..fa06be94 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardViewPagerFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/dashboard/DashboardViewPagerFragment.java
@@ -122,11 +122,11 @@ public boolean onMenuItemClick(MenuItem item) {
}
boolean isLoading = isDhisServiceBound() &&
- getDhisService().isJobRunning(DhisService.SYNC_DASHBOARDS)
+ (getDhisService().isJobRunning(DhisService.SYNC_DASHBOARDS)
||
getDhisService().isJobRunning(DhisService.SYNC_DASHBOARD_CONTENT)
||
- getDhisService().isJobRunning(DhisService.PULL_DASHBOARD_IMAGES);
+ getDhisService().isJobRunning(DhisService.PULL_DASHBOARD_IMAGES));
if ((savedInstanceState != null &&
savedInstanceState.getBoolean(IS_LOADING)) || isLoading) {
mProgressBar.setVisibility(View.VISIBLE);
From ea52df65ac37fb5b697637c69cda407842ebc7b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jorge=20Sa=CC=81nchez?=
Date: Mon, 10 Jul 2017 10:28:49 +0200
Subject: [PATCH 35/69] set expected format date also to DashboardItems request
---
.../android/dashboard/api/controllers/DashboardController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
index c0fb9d28..2828a8ec 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DashboardController.java
@@ -219,7 +219,7 @@ private List updateDashboardItems(List dashboards, Dat
QUERY_MAP_BASIC.put("fields", "id,created,lastUpdated,shape");
if (lastUpdated != null) {
- QUERY_MAP_BASIC.put("filter", "lastUpdated:gt:" + lastUpdated.toString());
+ QUERY_MAP_BASIC.put("filter", "lastUpdated:gt:" + lastUpdated.toLocalDateTime().toString());
}
// List of actual dashboard items.
From 6a89572cef44acfb19842dd6b12d7b554ffb54db Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 10 Jul 2017 11:41:32 +0200
Subject: [PATCH 36/69] fix height and width preference values, added
validation
---
.../api/controllers/DhisController.java | 17 ++--------
.../preferences/SettingsManager.java | 2 ++
.../ui/fragments/SettingsFragment.java | 31 ++++++++++++++-----
app/src/main/res/values/strings.xml | 3 +-
4 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
index 5b19cff9..5f1f718b 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
@@ -75,25 +75,14 @@ public static DhisController getInstance() {
}
public static String buildImageUrl(String resource, String id, Context context) {
- String height = "320";
- String width = "480";
-
String widthUserPreference = SettingsManager.getInstance(context).getPreference(
- (SettingsManager.CHART_WIDTH), "0");
+ (SettingsManager.CHART_WIDTH), SettingsManager.DEFAULT_WIDTH);
String heightUserPreference = SettingsManager.getInstance(context).getPreference(
- (SettingsManager.CHART_WIDTH), "0");
- if (widthUserPreference != null && !widthUserPreference.equals("") && Integer.parseInt(
- widthUserPreference) > 480) {
- width = widthUserPreference;
- }
- if (heightUserPreference != null && !heightUserPreference.equals("") && Integer.parseInt(
- heightUserPreference) > 320) {
- height = heightUserPreference;
- }
+ (SettingsManager.CHART_HEIGHT), SettingsManager.DEFAULT_HEIGHT);
return getInstance().getServerUrl().newBuilder()
.addPathSegment("api").addPathSegment(resource).addPathSegment(id).addPathSegment(
"data.png")
- .addQueryParameter("width", width).addQueryParameter("height", height)
+ .addQueryParameter("width", widthUserPreference).addQueryParameter("height", heightUserPreference)
.toString();
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
index a8793791..24200850 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/persistence/preferences/SettingsManager.java
@@ -6,6 +6,8 @@
public class SettingsManager {
public static final String CHART_WIDTH = "key:chart_width";
public static final String CHART_HEIGHT = "key:chart_height";
+ public static final String DEFAULT_WIDTH = "480";
+ public static final String DEFAULT_HEIGHT = "320";
private static final String PREFERENCES = "preferences:settings";
private static SettingsManager mSettingsManager = null;
private SharedPreferences mPrefs;
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
index 48f17500..915ce135 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
@@ -11,6 +11,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.EditText;
import com.squareup.otto.Subscribe;
@@ -33,6 +34,8 @@ public final class SettingsFragment extends BaseFragment {
Toolbar mToolbar;
FontEditText widthEditText;
FontEditText heightEditText;
+ public static final String MINIMUM_WIDTH = "480";
+ public static final String MINIMUM_HEIGHT = "320";
@Nullable
@Override
@@ -40,8 +43,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
View view = inflater.inflate(R.layout.fragment_settings, container, false);
widthEditText = (FontEditText) view.findViewById(R.id.update_width_edit);
heightEditText =(FontEditText) view.findViewById(R.id.update_height_edit);
- widthEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_WIDTH));
- widthEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_HEIGHT));
+ widthEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_WIDTH, SettingsManager.DEFAULT_WIDTH, widthEditText));
+ heightEditText.addTextChangedListener(new CustomTextWatcher(SettingsManager.CHART_HEIGHT, SettingsManager.DEFAULT_HEIGHT, heightEditText));
return view;
}
@@ -57,10 +60,10 @@ public void onClick(View v) {
toggleNavigationDrawer();
}
});
- Integer width = Integer.parseInt(SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_WIDTH), "0"));
- Integer height = Integer.parseInt(SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_HEIGHT), "0"));
- widthEditText.setText(width+"");
- heightEditText.setText(height+"");
+ String width = SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_WIDTH), SettingsManager.DEFAULT_WIDTH);
+ String height = SettingsManager.getInstance(getContext()).getPreference((SettingsManager.CHART_HEIGHT), SettingsManager.DEFAULT_HEIGHT);
+ widthEditText.setText(width);
+ heightEditText.setText(height);
}
@@ -84,8 +87,12 @@ public void onLogOut(UiEvent event) {
private class CustomTextWatcher implements TextWatcher{
final String preference;
- public CustomTextWatcher(String preference){
+ final int minimumValue;
+ final EditText mEditText;
+ public CustomTextWatcher(String preference, String minimumValue, EditText editText){
this.preference = preference;
+ this.minimumValue = Integer.parseInt(minimumValue);
+ this.mEditText = editText;
}
@Override
public void afterTextChanged(Editable s) {}
@@ -98,7 +105,15 @@ public void beforeTextChanged(CharSequence s, int start,
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
- SettingsManager.getInstance(getContext()).setPreference(preference, s.toString());
+ if(s.toString().length()>0) {
+ if (Integer.parseInt(s.toString())>= minimumValue) {
+ mEditText.setError(null);
+ SettingsManager.getInstance(getContext()).setPreference(preference,
+ s.toString());
+ }else{
+ mEditText.setError(getContext().getString(R.string.invalid_value)+" "+minimumValue);
+ }
+ }
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e6c4b583..cfab2668 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -135,7 +135,8 @@
- "Images size (Default=0)"
+ "Images size"
"Width:"
"Height:"
+ The value is not valid, please enter a value greater than
From 586e92333d2b89c14647e97d5499c6773c475716 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 10 Jul 2017 11:50:00 +0200
Subject: [PATCH 37/69] remove imports
---
.../dhis/android/dashboard/ui/fragments/SettingsFragment.java | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
index 915ce135..1abc6970 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/SettingsFragment.java
@@ -1,8 +1,6 @@
package org.hisp.dhis.android.dashboard.ui.fragments;
-import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
@@ -16,7 +14,6 @@
import com.squareup.otto.Subscribe;
import org.hisp.dhis.android.dashboard.R;
-import org.hisp.dhis.android.dashboard.api.persistence.preferences.DateTimeManager;
import org.hisp.dhis.android.dashboard.api.persistence.preferences.SettingsManager;
import org.hisp.dhis.android.dashboard.ui.activities.LauncherActivity;
import org.hisp.dhis.android.dashboard.ui.events.UiEvent;
From f3663322bbe118ce227180897bba49d65053ab81 Mon Sep 17 00:00:00 2001
From: idelcano
Date: Mon, 10 Jul 2017 11:50:13 +0200
Subject: [PATCH 38/69] modify settings text colors
---
app/src/main/res/layout/fragment_settings.xml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index fbb562a3..4445be8c 100755
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -65,7 +65,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/chart_preferences_title"
- android:textColor="@color/darker_grey"
+ android:textColor="@color/grey"
android:textSize="@dimen/medium_text_size"
app:font="@string/light_font_name" />
@@ -87,7 +87,7 @@
android:layout_height="wrap_content"
android:layout_weight="0.6"
android:inputType="number"
- android:textColor="@color/darker_grey"
+ android:textColor="@color/grey"
android:textSize="@dimen/medium_text_size"
app:font="@string/light_font_name" />
@@ -102,7 +102,7 @@
android:layout_height="wrap_content"
android:layout_weight="0.4"
android:text="@string/height_title"
- android:textColor="@color/darker_grey"
+ android:textColor="@color/dark_grey_text"
android:textSize="@dimen/medium_text_size"
app:font="@string/light_font_name" />
@@ -111,7 +111,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.6"
- android:textColor="@color/darker_grey"
+ android:textColor="@color/grey"
android:textSize="@dimen/medium_text_size"
android:inputType="number"
app:font="@string/light_font_name" />
From dfffd3773034135ea28780c82487861d9899caff Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Mon, 10 Jul 2017 13:25:47 +0200
Subject: [PATCH 39/69] Save the request to server in cache if there is no
internet connection use the files saved in cache.
---
api/src/main/AndroidManifest.xml | 1 +
.../api/controllers/DhisController.java | 10 +--
.../dashboard/api/network/RepoManager.java | 61 ++++++++++++++++---
.../dashboard/api/utils/PicassoProvider.java | 2 +-
.../ui/fragments/WebViewFragment.java | 22 ++++---
5 files changed, 77 insertions(+), 19 deletions(-)
diff --git a/api/src/main/AndroidManifest.xml b/api/src/main/AndroidManifest.xml
index 2dbf51c3..b04cd600 100755
--- a/api/src/main/AndroidManifest.xml
+++ b/api/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="org.hisp.dhis.android.dashboard.api">
+
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
index 7e7ae850..b3a8af63 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/controllers/DhisController.java
@@ -28,6 +28,8 @@
package org.hisp.dhis.android.dashboard.api.controllers;
+import static org.hisp.dhis.android.dashboard.api.utils.Preconditions.isNull;
+
import android.content.Context;
import com.raizlabs.android.dbflow.config.FlowManager;
@@ -42,14 +44,14 @@
import org.hisp.dhis.android.dashboard.api.persistence.preferences.DateTimeManager;
import org.hisp.dhis.android.dashboard.api.persistence.preferences.LastUpdatedManager;
-import static org.hisp.dhis.android.dashboard.api.utils.Preconditions.isNull;
-
public class DhisController {
private static DhisController mDhisController;
private Session mSession;
private DhisApi mDhisApi;
+ private Context mContext;
private DhisController(Context context) {
+ mContext = context;
FlowManager.init(context);
LastUpdatedManager.init(context);
DateTimeManager.init(context);
@@ -98,7 +100,7 @@ public void logOutUser() throws APIException {
private UserAccount signInUser(HttpUrl serverUrl, Credentials credentials) throws APIException {
DhisApi dhisApi = RepoManager
- .createService(serverUrl, credentials);
+ .createService(serverUrl, credentials, mContext);
UserAccount user = (new UserController(dhisApi)
.logInUser(serverUrl, credentials));
@@ -132,7 +134,7 @@ private void readSession() {
mDhisApi = RepoManager.createService(
mSession.getServerUrl(),
mSession.getCredentials()
- );
+ , mContext);
}
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/RepoManager.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/RepoManager.java
index 17cf63af..c06a851c 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/RepoManager.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/RepoManager.java
@@ -28,6 +28,13 @@
package org.hisp.dhis.android.dashboard.api.network;
+import static com.squareup.okhttp.Credentials.basic;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
+import com.squareup.okhttp.Cache;
import com.squareup.okhttp.HttpUrl;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.OkHttpClient;
@@ -38,19 +45,19 @@
import org.hisp.dhis.android.dashboard.api.models.meta.Credentials;
import org.hisp.dhis.android.dashboard.api.utils.ObjectMapperProvider;
+import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.concurrent.TimeUnit;
import retrofit.ErrorHandler;
+import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.OkClient;
import retrofit.converter.Converter;
import retrofit.converter.JacksonConverter;
-import static com.squareup.okhttp.Credentials.basic;
-
public final class RepoManager {
static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 15 * 1000; // 15s
@@ -61,13 +68,15 @@ private RepoManager() {
// no instances
}
- public static DhisApi createService(HttpUrl serverUrl, Credentials credentials) {
+ public static DhisApi createService(HttpUrl serverUrl, Credentials credentials,
+ final Context context) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(provideServerUrl(serverUrl))
.setConverter(provideJacksonConverter())
- .setClient(provideOkClient(credentials))
+ .setClient(provideOkClient(credentials, context))
.setErrorHandler(new RetrofitErrorHandler())
.setLogLevel(RestAdapter.LogLevel.BASIC)
+ .setRequestInterceptor(new ConnectionInterceptor(context))
.build();
return restAdapter.create(DhisApi.class);
}
@@ -82,19 +91,28 @@ private static Converter provideJacksonConverter() {
return new JacksonConverter(ObjectMapperProvider.getInstance());
}
- private static OkClient provideOkClient(Credentials credentials) {
- return new OkClient(provideOkHttpClient(credentials));
+ private static OkClient provideOkClient(Credentials credentials, Context context) {
+ return new OkClient(provideOkHttpClient(credentials, context));
}
- public static OkHttpClient provideOkHttpClient(Credentials credentials) {
+ public static OkHttpClient provideOkHttpClient(Credentials credentials, Context context) {
+
OkHttpClient client = new OkHttpClient();
client.interceptors().add(provideInterceptor(credentials));
client.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ client.setCache(provideCache(context));
return client;
}
+ private static Cache provideCache(Context context) {
+ File httpCacheDirectory = new File(context.getCacheDir(), "responses");
+ Cache cache = null;
+ cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
+ return cache;
+ }
+
private static Interceptor provideInterceptor(Credentials credentials) {
return new AuthInterceptor(credentials.getUsername(), credentials.getPassword());
}
@@ -132,4 +150,33 @@ public Throwable handleError(RetrofitError cause) {
return APIException.fromRetrofitError(cause);
}
}
+
+ private static boolean isOnline(Context context) {
+ ConnectivityManager cm =
+ (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo netInfo = cm.getActiveNetworkInfo();
+ return netInfo != null && netInfo.isConnectedOrConnecting();
+ }
+
+ private static class ConnectionInterceptor implements RequestInterceptor {
+ private Context mContext;
+
+ public ConnectionInterceptor(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public void intercept(RequestFacade request) {
+ request.addHeader("Accept", "application/json;versions=1");
+ if (isOnline(mContext)) {
+ int maxAge = 0; // no read cache if there is internet
+ request.addHeader("Cache-Control", "public, max-age=" + maxAge);
+ } else {
+ int maxStale = 60 * 60 * 24 * 365; // tolerate 1 year state
+ request.addHeader("Cache-Control",
+ "public, only-if-cached, max-stale=" + maxStale);
+ }
+ }
+ }
+
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
index 574f008f..0d0070e1 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/utils/PicassoProvider.java
@@ -52,7 +52,7 @@ private PicassoProvider() {
public static Picasso getInstance(Context context) {
if (mPicasso == null) {
OkHttpClient client = RepoManager.provideOkHttpClient(
- DhisController.getInstance().getUserCredentials());
+ DhisController.getInstance().getUserCredentials(), context);
client.networkInterceptors().add(new Interceptor() {
@Override
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
index 52e7f30f..f9104abd 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
@@ -28,7 +28,11 @@
package org.hisp.dhis.android.dashboard.ui.fragments;
+import static android.text.TextUtils.isEmpty;
+
+import android.content.Context;
import android.os.Bundle;
+import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -53,10 +57,9 @@
import butterknife.ButterKnife;
import retrofit.mime.TypedInput;
-import static android.text.TextUtils.isEmpty;
-
public class WebViewFragment extends BaseFragment {
private static final String DASHBOARD_ELEMENT_ID = "arg:dashboardElementId";
+ private Context mContext;
@Bind(R.id.web_view_content)
WebView mWebView;
@@ -75,6 +78,7 @@ public static WebViewFragment newInstance(String id) {
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ mContext = getContext();
return inflater.inflate(R.layout.fragment_web_view, container, false);
}
@@ -86,10 +90,9 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
if (getArguments() != null && !isEmpty(getArguments()
.getString(DASHBOARD_ELEMENT_ID))) {
JobExecutor.enqueueJob(new GetReportTableJob(this, getArguments()
- .getString(DASHBOARD_ELEMENT_ID)));
+ .getString(DASHBOARD_ELEMENT_ID), mContext));
}
}
-
public void onDataDownloaded(ResponseHolder data) {
mProgressBarContainer.setVisibility(View.GONE);
@@ -108,12 +111,15 @@ static class GetReportTableJob extends Job> {
final WeakReference mFragmentRef;
final String mDashboardElementId;
+ Context mContext;
- public GetReportTableJob(WebViewFragment fragment, String dashboardElementId) {
+ public GetReportTableJob(WebViewFragment fragment, String dashboardElementId,
+ Context context) {
super(JOB_ID);
mFragmentRef = new WeakReference<>(fragment);
mDashboardElementId = dashboardElementId;
+ mContext = context;
}
static String readInputStream(TypedInput in) {
@@ -142,8 +148,10 @@ public ResponseHolder inBackground() {
ResponseHolder responseHolder = new ResponseHolder<>();
try {
- DhisApi dhisApi = RepoManager.createService(DhisController.getInstance().getServerUrl(),
- DhisController.getInstance().getUserCredentials());
+ DhisApi dhisApi = RepoManager.createService(DhisController.getInstance()
+ .getServerUrl(),
+ DhisController.getInstance().getUserCredentials(),
+ mContext);
responseHolder.setItem(readInputStream(dhisApi.getReportTableData(mDashboardElementId).getBody()));
} catch (APIException exception) {
responseHolder.setApiException(exception);
From 17d78179a36e77c3a08d178824a568a7e1372d36 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Tue, 11 Jul 2017 13:54:41 +0200
Subject: [PATCH 40/69] Solved bug not showing all types off event report
tables
---
.../dashboard/api/models/EventReport.java | 21 +++++++++++
.../dashboard/api/models/RelativePeriod.java | 35 ++++++++++++++++---
.../dashboard/api/network/DhisApi.java | 8 +++--
.../ui/fragments/WebViewFragment.java | 9 ++++-
4 files changed, 66 insertions(+), 7 deletions(-)
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
index bdb3da82..be56fd1b 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/EventReport.java
@@ -1,5 +1,6 @@
package org.hisp.dhis.android.dashboard.api.models;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import com.raizlabs.android.dbflow.annotation.Table;
import org.hisp.dhis.android.dashboard.api.models.meta.DbDhis;
@@ -8,6 +9,11 @@
@Table(databaseName = DbDhis.NAME)
public final class EventReport extends BaseIdentifiableObject {
+ @JsonIgnore
+ static final String AGGREGATED_VALUES_TYPE = "AGGREGATED_VALUES";
+ @JsonIgnore
+ static final String EVENTS_TYPE = "EVENTS";
+
UIDObject program;
UIDObject programStage;
@@ -17,6 +23,7 @@ public final class EventReport extends BaseIdentifiableObject {
UIDObject dataElementValueDimension;
String aggregationType;
String outputType;
+ String dataType;
public UIDObject getProgram() {
return program;
@@ -85,5 +92,19 @@ public void setOutputType(String outputType) {
this.outputType = outputType;
}
+ public String getDataType() {
+ return dataType;
+ }
+ public void setDataType(String dataType) {
+ this.dataType = dataType;
+ }
+
+ public String getDataTypeString() {
+ if (dataType.equals(AGGREGATED_VALUES_TYPE)) {
+ return "aggregate";
+ } else {
+ return "query";
+ }
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
index 81b76ee8..f8718e40 100644
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/models/RelativePeriod.java
@@ -20,7 +20,8 @@ public final class RelativePeriod extends BaseModel {
"THIS_DAY", "THIS_MONTH", "LAST_5_YEARS", "LAST_6_BIMONTHS",
"LAST_FINANCIAL_YEAR", "LAST_6_MONTHS", "LAST_3_DAYS", "QUARTERS_THIS_YEAR",
"MONTHS_LAST_YEAR", "LAST_WEEK", "LAST_7_DAYS", "THIS_BIMONTH", "LAST_BIMONTH",
- "LAST_SIX_MONTH", "LAST_YEAR", "LAST_12_WEEKS", "LAST_4_QUARTERS"};
+ "LAST_SIX_MONTH", "LAST_YEAR", "LAST_12_WEEKS", "LAST_4_QUARTERS",
+ "BIMONTHS_THIS_YEAR", "WEEKS_THIS_YEAR"};
@JsonIgnore
@Column(name = "id")
@@ -61,6 +62,8 @@ public final class RelativePeriod extends BaseModel {
boolean lastYear;
boolean last12Weeks;
boolean last4Quarters;
+ boolean biMonthsThisYear;
+ boolean weeksThisYear;
@JsonIgnore
private boolean[] periodsList;
@@ -86,16 +89,24 @@ public void setPeriodsList(boolean[] periodsList) {
}
public String getRelativePeriodString() {
+ String result = "";
periodsList = new boolean[]{thisYear, quartersLastYear, last52Weeks, thisWeek, lastMonth,
last14Days, monthsThisYear, last2SixMonths, yesterday, thisQuarter, last12Months,
last5FinancialYears, thisSixMonth, lastQuarter, thisFinancialYear, last4Weeks,
last3Months, thisDay, thisMonth, last5Years, last6BiMonths, lastFinancialYear,
last6Months, last3Days, quartersThisYear, monthsLastYear, lastWeek, last7Days,
- thisBimonth, lastBimonth, lastSixMonth, lastYear, last12Weeks, last4Quarters};
+ thisBimonth, lastBimonth, lastSixMonth, lastYear, last12Weeks, last4Quarters,
+ biMonthsThisYear, weeksThisYear};
for (int i = 0; i < periodsList.length; i++) {
- if (periodsList[i]) return periodsStrings[i];
+ if (periodsList[i]) {
+ if (i == 0) {
+ result += periodsStrings[i];
+ } else {
+ result += ";" + periodsStrings[i];
+ }
+ }
}
- return "";
+ return result;
}
public boolean isThisYear() {
@@ -369,4 +380,20 @@ public boolean isLast4Quarters() {
public void setLast4Quarters(boolean last4Quarters) {
this.last4Quarters = last4Quarters;
}
+
+ public boolean isBiMonthsThisYear() {
+ return biMonthsThisYear;
+ }
+
+ public void setBiMonthsThisYear(boolean biMonthsThisYear) {
+ this.biMonthsThisYear = biMonthsThisYear;
+ }
+
+ public boolean isWeeksThisYear() {
+ return weeksThisYear;
+ }
+
+ public void setWeeksThisYear(boolean weeksThisYear) {
+ this.weeksThisYear = weeksThisYear;
+ }
}
diff --git a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
index 82201bd9..27ff0b79 100755
--- a/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
+++ b/api/src/main/java/org/hisp/dhis/android/dashboard/api/network/DhisApi.java
@@ -147,11 +147,15 @@ Response deleteDashboardItemContent(@Path("dashboardUid") String dashboardUid,
EventReport getEventReport(@Path("id") String id);
@Headers("Accept: application/text")
- @GET("/25/analytics/events/query/{program}"
+ @GET("/analytics/events/{dataType}/{program}"
+ ".html+css?displayProperty=NAME")
Response getEventReportTableData(@Path("program") String program,
@Query("stage") String programStage,
- @Query("dimension") List dimensions);
+ @Query("dimension") List dimensions,
+ @Query("outputType") String outputType,
+ @Query("aggregationType") String aggregationType,
+ @Query("value") String value,
+ @Path("dataType") String dataType);
@GET("/eventReports?paging=false")
@Headers("Accept: application/json")
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
index 9bb2e628..7fd0f23b 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/fragments/WebViewFragment.java
@@ -193,7 +193,14 @@ public ResponseHolder inBackground() {
responseHolder.setItem(readInputStream(
dhisApi.getEventReportTableData(eventReport.getProgram().getuId(),
eventReport.getProgramStage().getuId(),
- getDimensions(eventReport)).getBody()));
+ getDimensions(eventReport),
+ eventReport.getOutputType(),
+ eventReport.getAggregationType(),
+ eventReport.getDataElementValueDimension() != null
+ ? eventReport.getDataElementValueDimension().getuId()
+ : null,
+ eventReport.getDataTypeString())
+ .getBody()));
} catch (APIException exception) {
responseHolder.setApiException(exception);
}
From 277372446f661d17b2d4a4493bc3a2ccd8077698 Mon Sep 17 00:00:00 2001
From: mplazaspalacio
Date: Tue, 11 Jul 2017 14:15:08 +0200
Subject: [PATCH 41/69] Show table image in dashboard items list if it's a
pivot table or an even report table.
---
.../ui/adapters/DashboardItemAdapter.java | 19 ++++++++++++++----
.../main/res/drawable-hdpi/ic_table_small.png | Bin 0 -> 1381 bytes
.../main/res/drawable-mdpi/ic_table_small.png | Bin 0 -> 787 bytes
.../res/drawable-xhdpi/ic_table_small.png | Bin 0 -> 1992 bytes
.../res/drawable-xxhdpi/ic_table_small.png | Bin 0 -> 3422 bytes
.../res/drawable-xxxhdpi/ic_table_small.png | Bin 0 -> 4677 bytes
6 files changed, 15 insertions(+), 4 deletions(-)
create mode 100644 app/src/main/res/drawable-hdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-mdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xhdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xxhdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_table_small.png
diff --git a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
index 812e9d74..f577aba7 100755
--- a/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
+++ b/app/src/main/java/org/hisp/dhis/android/dashboard/ui/adapters/DashboardItemAdapter.java
@@ -122,7 +122,7 @@ public int getItemViewType(int position) {
return ITEM_WITH_IMAGE_TYPE;
case DashboardItemContent.TYPE_REPORT_TABLE:
case DashboardItemContent.TYPE_EVENT_REPORT:
- return ITEM_WITH_TABLE_TYPE;
+ return ITEM_WITH_IMAGE_TYPE;
case DashboardItemContent.TYPE_USERS:
case DashboardItemContent.TYPE_REPORTS:
case DashboardItemContent.TYPE_RESOURCES:
@@ -312,12 +312,23 @@ private void handleItemsWithImages(ImageItemViewHolder holder, DashboardItem ite
} else if (DashboardItemContent.TYPE_EVENT_CHART.equals(item.getType()) && item.getEventChart() != null) {
element = item.getEventChart();
request = DhisController.getInstance().buildImageUrl("eventCharts", element.getUId(), context);
+ } else if (DashboardItemContent.TYPE_REPORT_TABLE.equals(item.getType())
+ && item.getReportTable() != null) {
+ element = item.getReportTable();
+ } else if (DashboardItemContent.TYPE_EVENT_REPORT.equals(item.getType())
+ && item.getEventReport() != null) {
+ element = item.getEventReport();
}
holder.listener.setDashboardElement(element);
- mImageLoader.load(request)
- .placeholder(R.mipmap.ic_stub_dashboard_item)
- .into(holder.imageView);
+ if (request != null) {
+ mImageLoader.load(request)
+ .placeholder(R.mipmap.ic_stub_dashboard_item)
+ .into(holder.imageView);
+ } else {
+ holder.imageView.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.ic_table_small));
+ }
}
/////////////////////////////////////////////////////////////////////////
diff --git a/app/src/main/res/drawable-hdpi/ic_table_small.png b/app/src/main/res/drawable-hdpi/ic_table_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad3a309f2944fbf9628a3cfd81fada7779d232cc
GIT binary patch
literal 1381
zcmV-r1)BPaP)4+F6vn@?9ovcRcuVX!@sik1(xy?$QY2JLD1E33e*#E6fe;d)Qc;k|Lsbf5sf3Dn
zAWul}XMhT7DQUK5by_EBoW@JMjh%Q+VtZ!Ly{@|;8jYGvrGl?yjeUGP^Sj^u&bikN
zp2ERAh0Lf!KdDu#D_vK57X|9}sN3UzZI9FEFA3Xa8L~wsI9>)`*jq_35FnQc&^DH!
zQE|9*?zE^Iib|@j)Vo7J2ppqANnrpOIl##FW@CW|1RhF02L)fm@E7lk;t`cpBYWe_
zu%OWBp=xtLu2e!Um+uLh=Xh|H3d*S{xJ(MaTzp3qkEo;?*_&sE1+GDZa#JfHS3oA)
zo6b@oSLhgTuX>%l_?VUOo6;%PDriUKt9E&TMg
z1WJE+?t8&(wxFkX05X{Zf>3?v;|_)a7=}S`Z5i=c2p5Om6D6Xkq#D$xUw$WaIh{Ch
z>}8ZH9CC%N$K|EJ(`g!E&}ndeauPoOEu8;Yf`XL5+A(y*FMFzIzPmMatyj(voV%sc_;SZWjN2^P=y^`PBirhqqB)-dT?#F749
z^m$w~b|(_UmB~3A@^<3c10GrjQ8tb7c|WWs177Iw#cxFE*#+s9jwaIx#aRsWbirye
zQo!Y47_7b#+ix!|^1>=Kbh#cHofLMWGYvP0TI^(AHwak-lzRzBY!*xtsX>
ztVEu!*@Go2J8ZMiK=56Nl2!x`r
zTU#jf?|+Ts#{4bmp#$L<{HsAUsnuvuRCmVhoe~P$+cc(DDQT=!E+b#uf?BCWlUhY%
zA^l-vqzNOKqSuMaIc$slk78O
z64Ue^
z-42XQ&BM32f(xHWWDhrie&r}tbS;{s9l@ZjdX@CwJL?HJtY%p5s=ATQVT7b2~o>+U3
z6DSvRS^mNT}i23
zh{E^2yqEJR=wxaWo7o(``s^c7`-Z5b2RD~TJ$OIj-wd4*#UmtDmU_qzd5DTABb7?X=n&n4A}T~Q4+Wyu!44r5eL#>x
zhE{^~d5F4%7+sR0kV*+;pA985bn25h`_d?LY{i5_#Ct0rXxxDi3_(+-2hS
zmV+@`0g{zq8YGE4X1=~fciVA!;MNP5NPSHWbb15Wcrq)p$;iNNF`;j85bez;<%19H
zuf=SHMKByiCMlm55M$$TI#$s_<|8o}4Gc^Sg9MkNF<=_OLhRu?L^}b>R
z=0g}6{eb$NTPXO+%hy;_L4_{$ERX95K
z89S;fK?uR{oA>bKt%fH*7nA-u_=6#AE?bKmefO1v{h=tn1?HgDXdp=hd^!ySqo;~f
zd>R^!n(hgr2)i{0Rb?f(**~Nl%yK*odL6t}aTKFt4R2E(3#jlB4Q3
zmK5Xm&{K3O0XNj`MmU~CGL?eEYN5%e=R)wg^Qhtpe-Ku)k>1gG0)il-!dHm?htJS?
zMuFl3wbfWi@eoA`PMa06L=s=7{Mg|2P{ki7XJEIO;jo$!VH32#QjZG*kDn_8H`G-_
zAizv8jIdWxb*-)R9qiupO(
z5=jn^UJT=W>uLGTmDQYFB&h3blRU5z=u&61``0a%MaKRLScYlxj{JXCe+LEiQ7->!
RE$sjR002ovPDHLkV1lyFX7&I8
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xhdpi/ic_table_small.png b/app/src/main/res/drawable-xhdpi/ic_table_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ddb4537aba2e8ebdbb6f7cfd257e5958d0069f5
GIT binary patch
literal 1992
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
J8Uys>{{SC3*@FN8
literal 0
HcmV?d00001
From a76fe1b07303054ad27782cd281c733d5a44ede7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jorge=20Sa=CC=81nchez?=
Date: Tue, 11 Jul 2017 16:47:15 +0200
Subject: [PATCH 42/69] replace image for event reports and set scale type to
CENTER_INSIDE
---
app/src/main/ic_event_report-web.png | Bin 0 -> 17839 bytes
app/src/main/ic_pivot_table-web.png | Bin 0 -> 27668 bytes
.../ui/adapters/DashboardItemAdapter.java | 10 +++++++---
.../main/res/drawable-hdpi/ic_event_report.png | Bin 0 -> 4171 bytes
.../main/res/drawable-hdpi/ic_pivot_table.png | Bin 0 -> 7726 bytes
.../main/res/drawable-hdpi/ic_table_small.png | Bin 1381 -> 0 bytes
.../main/res/drawable-mdpi/ic_event_report.png | Bin 0 -> 2488 bytes
.../main/res/drawable-mdpi/ic_pivot_table.png | Bin 0 -> 4098 bytes
.../main/res/drawable-mdpi/ic_table_small.png | Bin 787 -> 0 bytes
.../main/res/drawable-xhdpi/ic_event_report.png | Bin 0 -> 5917 bytes
.../main/res/drawable-xhdpi/ic_pivot_table.png | Bin 0 -> 12193 bytes
.../main/res/drawable-xhdpi/ic_table_small.png | Bin 1992 -> 0 bytes
.../res/drawable-xxhdpi/ic_event_report.png | Bin 0 -> 8158 bytes
.../main/res/drawable-xxhdpi/ic_pivot_table.png | Bin 0 -> 16914 bytes
.../main/res/drawable-xxhdpi/ic_table_small.png | Bin 3422 -> 0 bytes
.../res/drawable-xxxhdpi/ic_event_report.png | Bin 0 -> 9284 bytes
.../res/drawable-xxxhdpi/ic_pivot_table.png | Bin 0 -> 17942 bytes
.../res/drawable-xxxhdpi/ic_table_small.png | Bin 4677 -> 0 bytes
.../main/res/mipmap-xxhdpi/ic_event_report.png | Bin 0 -> 8158 bytes
.../main/res/mipmap-xxhdpi/ic_pivot_table.png | Bin 0 -> 16914 bytes
20 files changed, 7 insertions(+), 3 deletions(-)
create mode 100644 app/src/main/ic_event_report-web.png
create mode 100644 app/src/main/ic_pivot_table-web.png
create mode 100644 app/src/main/res/drawable-hdpi/ic_event_report.png
create mode 100644 app/src/main/res/drawable-hdpi/ic_pivot_table.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-mdpi/ic_event_report.png
create mode 100644 app/src/main/res/drawable-mdpi/ic_pivot_table.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xhdpi/ic_event_report.png
create mode 100644 app/src/main/res/drawable-xhdpi/ic_pivot_table.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xxhdpi/ic_event_report.png
create mode 100644 app/src/main/res/drawable-xxhdpi/ic_pivot_table.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_table_small.png
create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_event_report.png
create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_pivot_table.png
delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_table_small.png
create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_event_report.png
create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_pivot_table.png
diff --git a/app/src/main/ic_event_report-web.png b/app/src/main/ic_event_report-web.png
new file mode 100644
index 0000000000000000000000000000000000000000..243af003da5753d1dafd4825b8e1f9cda755af80
GIT binary patch
literal 17839
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
bbczSmf{Y$T(@TH5Dtz+znPd4!U9SBfG-CjU
literal 0
HcmV?d00001
diff --git a/app/src/main/ic_pivot_table-web.png b/app/src/main/ic_pivot_table-web.png
new file mode 100644
index 0000000000000000000000000000000000000000..42ecc34fe5a3d0ca4ce2ef8361fa2e8ea45dc16a
GIT binary patch
literal 27668
zcmeFZXIxX=wm!N5=?IDfN>_Rbphysqq6kQr-b?5ufOP37APNZ5dr=5QT4slY^7Ow!Y$r9^Q#bVhTbz_+)YJH|1pTu3x*>`Ic4Dt