From 895389cd480e9a6601cdfcc9c17b9ebc6dba6317 Mon Sep 17 00:00:00 2001 From: Pablo Pajuelo Date: Mon, 1 Oct 2018 17:35:35 +0200 Subject: [PATCH] 1.0.3 bugfixing --- app/build.gradle | 2 +- .../java/org/dhis2/Bindings/Bindings.java | 11 ++-- .../org/dhis2/data/forms/EventRepository.java | 15 ++++-- .../dataentry/ProgramStageRepository.java | 15 ++++-- .../EventSummaryRepositoryImpl.java | 15 ++++-- .../dhis2/usescases/login/LoginActivity.java | 2 +- .../dhis2/usescases/login/LoginPresenter.java | 14 ++--- .../main/program/HomeRepositoryImpl.java | 4 +- .../ProgramEventDetailActivity.java | 13 +++++ .../ProgramEventDetailAdapter.java | 2 +- .../ProgramEventDetailPresenter.java | 2 +- .../ProgramEventDetailRepositoryImpl.java | 29 +++++++++-- .../ProgramEventDetailViewHolder.java | 6 ++- .../searchTrackEntity/SearchTEActivity.java | 35 +++++++++---- .../eventDetail/EventDetailModel.java | 14 ++--- .../dhis2/utils/CustomViews/DateAdapter.java | 3 +- .../main/java/org/dhis2/utils/ValueUtils.java | 20 +++++++ .../main/res/layout/item_program_event.xml | 52 ++++++++++++------- build.gradle | 2 +- 19 files changed, 182 insertions(+), 74 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3e5c206f4e..ab11e018fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,7 +32,7 @@ android { minSdkVersion 19 targetSdkVersion 27 versionCode 33 - versionName "1.0.2" + versionName "1.0.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true multiDexEnabled true diff --git a/app/src/main/java/org/dhis2/Bindings/Bindings.java b/app/src/main/java/org/dhis2/Bindings/Bindings.java index e4d1ed4ebd..4016abc32f 100644 --- a/app/src/main/java/org/dhis2/Bindings/Bindings.java +++ b/app/src/main/java/org/dhis2/Bindings/Bindings.java @@ -33,7 +33,6 @@ import org.dhis2.data.tuples.Pair; import org.dhis2.utils.CatComboAdapter; import org.dhis2.utils.DateUtils; -import org.hisp.dhis.android.core.category.CategoryComboModel; import org.hisp.dhis.android.core.category.CategoryOptionComboModel; import org.hisp.dhis.android.core.common.State; import org.hisp.dhis.android.core.enrollment.EnrollmentModel; @@ -429,7 +428,7 @@ public static void setEventIcon(ImageView view, EventModel event, EnrollmentMode .observeOn(AndroidSchedulers.mainThread()) .subscribe( program -> { - if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType()!=null?eventProgramStage.periodType():program.expiryPeriodType())) { + if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType() != null ? eventProgramStage.periodType() : program.expiryPeriodType())) { view.setImageDrawable(ContextCompat.getDrawable(view.getContext(), R.drawable.ic_eye_red)); } else { view.setImageDrawable(ContextCompat.getDrawable(view.getContext(), R.drawable.ic_edit)); @@ -479,7 +478,7 @@ public static void setEventText(TextView view, EventModel event, EnrollmentModel .observeOn(AndroidSchedulers.mainThread()) .subscribe( program -> { - if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType()!=null?eventProgramStage.periodType():program.expiryPeriodType())) { + if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType() != null ? eventProgramStage.periodType() : program.expiryPeriodType())) { view.setText(view.getContext().getString(R.string.event_expired)); } else { view.setText(view.getContext().getString(R.string.event_open)); @@ -495,7 +494,7 @@ public static void setEventText(TextView view, EventModel event, EnrollmentModel .observeOn(AndroidSchedulers.mainThread()) .subscribe( program -> { - if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType()!=null?eventProgramStage.periodType():program.expiryPeriodType())) { + if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType() != null ? eventProgramStage.periodType() : program.expiryPeriodType())) { view.setText(view.getContext().getString(R.string.event_expired)); } else { view.setText(view.getContext().getString(R.string.event_completed)); @@ -511,7 +510,7 @@ public static void setEventText(TextView view, EventModel event, EnrollmentModel .observeOn(AndroidSchedulers.mainThread()) .subscribe( program -> { - if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType()!=null?eventProgramStage.periodType():program.expiryPeriodType())) { + if (DateUtils.getInstance().hasExpired(event, program.expiryDays(), program.completeEventsExpiryDays(), eventProgramStage.periodType() != null ? eventProgramStage.periodType() : program.expiryPeriodType())) { view.setText(view.getContext().getString(R.string.event_expired)); } else { view.setText(view.getContext().getString(R.string.event_schedule)); @@ -632,8 +631,10 @@ public static void setCategoryOptionComboName(TextView textView, String category .subscribe( categoryOptionModel -> { if (!categoryOptionModel.isDefault()) { + textView.setVisibility(View.VISIBLE); textView.setText(categoryOptionComboModel.displayName()); } else { + textView.setVisibility(View.GONE); textView.setText(""); } }, diff --git a/app/src/main/java/org/dhis2/data/forms/EventRepository.java b/app/src/main/java/org/dhis2/data/forms/EventRepository.java index a994646639..aca3380933 100644 --- a/app/src/main/java/org/dhis2/data/forms/EventRepository.java +++ b/app/src/main/java/org/dhis2/data/forms/EventRepository.java @@ -109,7 +109,9 @@ public class EventRepository implements FormRepository { " Field.allowFutureDate,\n" + " Event.status,\n" + " Field.formLabel,\n" + - " Field.displayDescription\n" + + " Field.displayDescription,\n" + + " Field.formOrder,\n" + + " Field.sectionOrder\n" + "FROM Event\n" + " LEFT OUTER JOIN (\n" + " SELECT\n" + @@ -121,11 +123,13 @@ public class EventRepository implements FormRepository { " ProgramStageDataElement.sortOrder AS formOrder,\n" + " ProgramStageDataElement.programStage AS stage,\n" + " ProgramStageDataElement.compulsory AS mandatory,\n" + - " ProgramStageDataElement.programStageSection AS section,\n" + + " ProgramStageSectionDataElementLink.programStageSection AS section,\n" + " ProgramStageDataElement.allowFutureDate AS allowFutureDate,\n" + - " DataElement.displayDescription AS displayDescription\n" + + " DataElement.displayDescription AS displayDescription,\n" + + " ProgramStageSectionDataElementLink.sortOrder AS sectionOrder\n" + " FROM ProgramStageDataElement\n" + " INNER JOIN DataElement ON DataElement.uid = ProgramStageDataElement.dataElement\n" + + " LEFT JOIN ProgramStageSectionDataElementLink ON ProgramStageSectionDataElementLink.dataElement = ProgramStageDataElement.dataElement\n" + " ) AS Field ON (Field.stage = Event.programStage)\n" + " LEFT OUTER JOIN TrackedEntityDataValue AS Value ON (\n" + " Value.event = Event.uid AND Value.dataElement = Field.id\n" + @@ -134,7 +138,10 @@ public class EventRepository implements FormRepository { " Field.optionSet = Option.optionSet AND Value.value = Option.code\n" + " )\n" + " %s " + - "ORDER BY Field.formOrder ASC;"; + "ORDER BY CASE" + + " WHEN Field.sectionOrder IS NULL THEN Field.formOrder" + + " WHEN Field.sectionOrder IS NOT NULL THEN Field.sectionOrder" + + " END ASC;"; @NonNull private final BriteDatabase briteDatabase; diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramStageRepository.java b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramStageRepository.java index 477fabd8ec..c5972c2ee1 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramStageRepository.java +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramStageRepository.java @@ -43,7 +43,9 @@ final class ProgramStageRepository implements DataEntryRepository { " Field.allowFutureDate,\n" + " Event.status,\n" + " Field.formLabel,\n" + - " Field.displayDescription\n" + + " Field.displayDescription,\n" + + " Field.formOrder,\n" + + " Field.sectionOrder\n" + "FROM Event\n" + " LEFT OUTER JOIN (\n" + " SELECT\n" + @@ -55,11 +57,13 @@ final class ProgramStageRepository implements DataEntryRepository { " ProgramStageDataElement.sortOrder AS formOrder,\n" + " ProgramStageDataElement.programStage AS stage,\n" + " ProgramStageDataElement.compulsory AS mandatory,\n" + - " ProgramStageDataElement.programStageSection AS section,\n" + + " ProgramStageSectionDataElementLink.programStageSection AS section,\n" + " ProgramStageDataElement.allowFutureDate AS allowFutureDate,\n" + - " DataElement.displayDescription AS displayDescription\n" + + " DataElement.displayDescription AS displayDescription,\n" + + " ProgramStageSectionDataElementLink.sortOrder AS sectionOrder\n" + //This should override dataElement formOrder " FROM ProgramStageDataElement\n" + " INNER JOIN DataElement ON DataElement.uid = ProgramStageDataElement.dataElement\n" + + " LEFT JOIN ProgramStageSectionDataElementLink ON ProgramStageSectionDataElementLink.dataElement = ProgramStageDataElement.dataElement\n" + " ) AS Field ON (Field.stage = Event.programStage)\n" + " LEFT OUTER JOIN TrackedEntityDataValue AS Value ON (\n" + " Value.event = Event.uid AND Value.dataElement = Field.id\n" + @@ -68,7 +72,10 @@ final class ProgramStageRepository implements DataEntryRepository { " Field.optionSet = Option.optionSet AND Value.value = Option.code\n" + " )\n" + " %s " + - "ORDER BY Field.formOrder ASC;"; + "ORDER BY CASE" + + " WHEN Field.sectionOrder IS NULL THEN Field.formOrder" + + " WHEN Field.sectionOrder IS NOT NULL THEN Field.sectionOrder" + + " END ASC;"; private static final String SECTION_RENDERING_TYPE = "SELECT ProgramStageSection.mobileRenderType FROM ProgramStageSection WHERE ProgramStageSection.uid = ?"; private static final String ACCESS_QUERY = "SELECT ProgramStage.accessDataWrite FROM ProgramStage JOIN Event ON Event.programStage = ProgramStage.uid WHERE Event.uid = ?"; diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventSummary/EventSummaryRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventSummary/EventSummaryRepositoryImpl.java index 99d8d311a0..ec73c13a22 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventSummary/EventSummaryRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventSummary/EventSummaryRepositoryImpl.java @@ -89,7 +89,9 @@ public class EventSummaryRepositoryImpl implements EventSummaryRepository { " Field.allowFutureDate,\n" + " Event.status,\n" + " Field.formLabel,\n" + - " Field.displayDescription\n" + + " Field.displayDescription,\n" + + " Field.formOrder,\n" + + " Field.sectionOrder\n" + "FROM Event\n" + " LEFT OUTER JOIN (\n" + " SELECT\n" + @@ -101,11 +103,13 @@ public class EventSummaryRepositoryImpl implements EventSummaryRepository { " ProgramStageDataElement.sortOrder AS formOrder,\n" + " ProgramStageDataElement.programStage AS stage,\n" + " ProgramStageDataElement.compulsory AS mandatory,\n" + - " ProgramStageDataElement.programStageSection AS section,\n" + + " ProgramStageSectionDataElementLink.programStageSection AS section,\n" + " ProgramStageDataElement.allowFutureDate AS allowFutureDate,\n" + - " DataElement.displayDescription AS displayDescription\n" + + " DataElement.displayDescription AS displayDescription,\n" + + " ProgramStageSectionDataElementLink.sortOrder AS sectionOrder\n" + " FROM ProgramStageDataElement\n" + " INNER JOIN DataElement ON DataElement.uid = ProgramStageDataElement.dataElement\n" + + " LEFT JOIN ProgramStageSectionDataElementLink ON ProgramStageSectionDataElementLink.dataElement = ProgramStageDataElement.dataElement\n" + " ) AS Field ON (Field.stage = Event.programStage)\n" + " LEFT OUTER JOIN TrackedEntityDataValue AS Value ON (\n" + " Value.event = Event.uid AND Value.dataElement = Field.id\n" + @@ -114,7 +118,10 @@ public class EventSummaryRepositoryImpl implements EventSummaryRepository { " Field.optionSet = Option.optionSet AND Value.value = Option.code\n" + " )\n" + " %s " + - "ORDER BY Field.formOrder ASC;"; + "ORDER BY CASE" + + " WHEN Field.sectionOrder IS NULL THEN Field.formOrder" + + " WHEN Field.sectionOrder IS NOT NULL THEN Field.sectionOrder" + + " END ASC;"; private static final String QUERY_EVENT = "SELECT Event.uid,\n" + diff --git a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.java b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.java index c8cd2d59b9..e155cc7933 100644 --- a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.java +++ b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.java @@ -52,7 +52,7 @@ public class LoginActivity extends ActivityGlobalAbstract implements LoginContra private boolean isPinScreenVisible = false; enum SyncState { - METADATA, EVENTS, TEI + METADATA, EVENTS, TEI, RESERVED_VALUES } @Override diff --git a/app/src/main/java/org/dhis2/usescases/login/LoginPresenter.java b/app/src/main/java/org/dhis2/usescases/login/LoginPresenter.java index 11fef7a22e..5dfa9f94aa 100644 --- a/app/src/main/java/org/dhis2/usescases/login/LoginPresenter.java +++ b/app/src/main/java/org/dhis2/usescases/login/LoginPresenter.java @@ -191,11 +191,13 @@ public void syncNext(LoginActivity.SyncState syncState, SyncResult syncResult) { syncEvents(); break; case EVENTS: - syncReservedValues(); - syncAggregatesData(); +// syncAggregatesData(); syncTrackedEntities(); break; case TEI: + syncReservedValues(); + break; + case RESERVED_VALUES: Intent intent = new Intent(view.getContext(), MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); view.getContext().startActivity(intent); @@ -324,10 +326,7 @@ public void syncTrackedEntities() { disposable.add(trackerData() .subscribeOn(Schedulers.io()) - .map(response -> { -// userManager.getD2().syncAllTrackedEntityAttributeReservedValues(); - return SyncResult.success(); - }) + .map(response -> SyncResult.success()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(throwable -> SyncResult.failure( throwable.getMessage() == null ? "" : throwable.getMessage())) @@ -350,10 +349,11 @@ public void syncReservedValues() { userManager.getD2().syncAllTrackedEntityAttributeReservedValues(); return true; }) + .map(response -> SyncResult.success()) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .subscribe( - data -> Timber.log(1, "DONE"), + update(LoginActivity.SyncState.RESERVED_VALUES), Timber::d ) ); diff --git a/app/src/main/java/org/dhis2/usescases/main/program/HomeRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/main/program/HomeRepositoryImpl.java index 57c085572f..0c3555dc2d 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/HomeRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/main/program/HomeRepositoryImpl.java @@ -68,7 +68,7 @@ class HomeRepositoryImpl implements HomeRepository { "Program.trackedEntityType," + "Program.description " + "FROM Program LEFT JOIN ObjectStyle ON ObjectStyle.uid = Program.uid " + - "JOIN OrganisationUnitProgramLink ON OrganisationUnitProgramLink.program = Program.uid GROUP BY Program.uid " + + "JOIN OrganisationUnitProgramLink ON OrganisationUnitProgramLink.program = Program.uid GROUP BY Program.uid "/* + "UNION " + "SELECT DataSet.uid, " + "DataSet.displayName, " + @@ -78,7 +78,7 @@ class HomeRepositoryImpl implements HomeRepository { "'', " + "DataSet.description " + "FROM DataSet " + - "JOIN DataSetOrganisationUnitLink ON DataSetOrganisationUnitLink.dataSet = DataSet.uid GROUP BY DataSet.uid"; + "JOIN DataSetOrganisationUnitLink ON DataSetOrganisationUnitLink.dataSet = DataSet.uid GROUP BY DataSet.uid"*/; private final static String AGGREGATE_FROM_DATASET = "SELECT * FROM DataSetDataElementLink " + "WHERE dataSet = ? "; diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailActivity.java b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailActivity.java index 072aa81609..223313bc0c 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailActivity.java +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailActivity.java @@ -191,6 +191,7 @@ public void showRageDatePicker() { binding.buttonPeriodText.setText(textToShow); presenter.setFilters(selectedDates, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(selectedDates, currentPeriod, orgUnitFilter.toString()); @@ -219,6 +220,7 @@ public void showRageDatePicker() { binding.buttonPeriodText.setText(text); presenter.setFilters(date, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(date, currentPeriod, orgUnitFilter.toString()); } @@ -235,6 +237,7 @@ public void showRageDatePicker() { day.add(dates[0]); presenter.setFilters(day, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(day, currentPeriod, orgUnitFilter.toString()); binding.buttonPeriodText.setText(DateUtils.getInstance().formatDate(dates[0])); @@ -278,6 +281,7 @@ public void showTimeUnitPicker() { switch (currentPeriod) { case NONE: presenter.setFilters(null, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(null, currentPeriod, orgUnitFilter.toString()); textToShow = getString(R.string.period); @@ -290,6 +294,7 @@ public void showTimeUnitPicker() { if (!datesD.isEmpty() && datesD.size() > 1) textToShow += "... "; presenter.setFilters(datesD, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(datesD, currentPeriod, orgUnitFilter.toString()); break; @@ -302,6 +307,7 @@ public void showTimeUnitPicker() { if (!chosenDateWeek.isEmpty() && chosenDateWeek.size() > 1) textToShow += "... "; presenter.setFilters(chosenDateWeek, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateWeek, currentPeriod, orgUnitFilter.toString()); break; @@ -313,6 +319,7 @@ public void showTimeUnitPicker() { if (!chosenDateMonth.isEmpty() && chosenDateMonth.size() > 1) textToShow += "... "; presenter.setFilters(chosenDateMonth, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateMonth, currentPeriod, orgUnitFilter.toString()); break; @@ -322,6 +329,7 @@ public void showTimeUnitPicker() { if (!chosenDateYear.isEmpty() && chosenDateYear.size() > 1) textToShow += "... "; presenter.setFilters(chosenDateYear, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateYear, currentPeriod, orgUnitFilter.toString()); break; @@ -488,6 +496,7 @@ public void apply() { case NONE: presenter.setFilters(null, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(null, currentPeriod, orgUnitFilter.toString()); break; @@ -495,21 +504,25 @@ public void apply() { ArrayList datesD = new ArrayList<>(); datesD.add(chosenDateDay); presenter.setFilters(datesD, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(datesD, currentPeriod, orgUnitFilter.toString()); break; case WEEKLY: presenter.setFilters(chosenDateWeek, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateWeek, currentPeriod, orgUnitFilter.toString()); break; case MONTHLY: presenter.setFilters(chosenDateMonth, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateMonth, currentPeriod, orgUnitFilter.toString()); break; case YEARLY: presenter.setFilters(chosenDateYear, currentPeriod, orgUnitFilter.toString()); + endlessScrollListener.resetState(0); pageProcessor.onNext(0); // presenter.getProgramEventsWithDates(chosenDateYear, currentPeriod, orgUnitFilter.toString()); break; diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailAdapter.java b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailAdapter.java index 2db9289112..fc7399aa8e 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailAdapter.java +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailAdapter.java @@ -15,7 +15,7 @@ import java.util.List; /** - * Created by Cristian on 13/02/2018. + * QUADRAM. Created by Cristian on 13/02/2018. */ public class ProgramEventDetailAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenter.java b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenter.java index 7026e1eac1..3f0e120da7 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenter.java +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenter.java @@ -129,7 +129,7 @@ public void getProgramEventsWithDates() { compositeDisposable.add( view.currentPage() .startWith(0) - .flatMap(page -> eventRepository.filteredProgramEvents(programId, dates, period, categoryOptionComboModel, orgUnitQuery, page)) + .flatMap(page -> eventRepository.filteredProgramEvents(programId, dates, period, categoryOptionComboModel, orgUnitQuery, page).distinctUntilChanged()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailRepositoryImpl.java index 8124b480f9..6274744fb0 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailRepositoryImpl.java @@ -12,6 +12,7 @@ import org.hisp.dhis.android.core.category.CategoryComboModel; import org.hisp.dhis.android.core.category.CategoryOptionComboModel; import org.hisp.dhis.android.core.common.State; +import org.hisp.dhis.android.core.common.ValueType; import org.hisp.dhis.android.core.event.EventModel; import org.hisp.dhis.android.core.event.EventStatus; import org.hisp.dhis.android.core.organisationunit.OrganisationUnitModel; @@ -42,9 +43,26 @@ public class ProgramEventDetailRepositoryImpl implements ProgramEventDetailRepos "AND TrackedEntityDataValue.dataElement IN\n" + "(SELECT ProgramStageDataElement.dataElement FROM ProgramStageDataElement\n" + "WHERE ProgramStageDataElement.displayInReports = '1'\n" + - "ORDER BY ProgramStageDataElement.sortOrder ASC\n" + + "ORDER BY ProgramStageDataElement.sortOrder ASC LIMIT 3\n" + ")"; + private final String EVENT_DATA_VALUES = "SELECT " + + "DE.uid, " + + "DE.displayName, " + + "DE.valueType, " + + "DE.optionSet, " + + "TrackedEntityDataValue.value " + + "FROM TrackedEntityDataValue " + + "JOIN (" + + "SELECT DataElement.uid AS uid, " + + "DataElement.displayName AS displayName, " + + "DataElement.valueType AS valueType, " + + "DataElement.optionSet AS optionSet " + + "FROM ProgramStageDataElement " + + "JOIN DataElement ON DataElement.uid = ProgramStageDataElement.dataElement " + + "WHERE ProgramStageDataElement.displayInReports = 1 GROUP BY DataElement.uid) AS DE ON DE.uid = TrackedEntityDataValue.dataElement " + + "WHERE TrackedEntityDataValue.event = ?"; + private final BriteDatabase briteDatabase; ProgramEventDetailRepositoryImpl(BriteDatabase briteDatabase) { @@ -226,10 +244,15 @@ public Observable> catCombo(String categoryComboU public Observable> eventDataValuesNew(EventModel eventModel) { List values = new ArrayList<>(); String id = eventModel == null || eventModel.uid() == null ? "" : eventModel.uid(); - Cursor cursor = briteDatabase.query(EVENT_DATA_VALUES_NEW, id); + Cursor cursor = briteDatabase.query(EVENT_DATA_VALUES, id); if (cursor != null && cursor.moveToFirst()) { for (int i = 0; i < cursor.getCount(); i++) { - String value = ValueUtils.transform(briteDatabase, cursor).value(); + String value = cursor.getString(cursor.getColumnIndex("value")); + if(cursor.getString(cursor.getColumnIndex("optionSet"))!=null) + value = ValueUtils.optionSetCodeToDisplayName(briteDatabase,cursor.getString(cursor.getColumnIndex("optionSet")),value); + else if(cursor.getString(cursor.getColumnIndex("valueType")).equals(ValueType.ORGANISATION_UNIT.name())) + value = ValueUtils.orgUnitUidToDisplayName(briteDatabase,value); + values.add(value); cursor.moveToNext(); } diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewHolder.java b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewHolder.java index 14002096be..6cd170f90a 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewHolder.java +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewHolder.java @@ -3,8 +3,8 @@ import android.support.v7.widget.RecyclerView; import com.android.databinding.library.baseAdapters.BR; -import org.dhis2.databinding.ItemProgramEventBinding; +import org.dhis2.databinding.ItemProgramEventBinding; import org.hisp.dhis.android.core.event.EventModel; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -41,7 +41,9 @@ public void bind(ProgramEventDetailContract.Presenter presenter, EventModel even int valuesSize = values.size() > 3 ? 3 : values.size(); for (int i = 0; i < valuesSize; i++) { if (values.get(i) != null) - stringBuilder.append(values.get(i)).append("\n"); + stringBuilder.append(values.get(i)); + if (i != valuesSize - 1) + stringBuilder.append("\n"); } binding.dataValue.setText(stringBuilder); }, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java index 2d9c052c2b..d415f46647 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java @@ -46,7 +46,6 @@ import org.dhis2.utils.EndlessRecyclerViewScrollListener; import org.dhis2.utils.HelpManager; import org.dhis2.utils.NetworkUtils; - import org.hisp.dhis.android.core.program.ProgramModel; import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeModel; @@ -248,7 +247,7 @@ public void setTutorial() { HelpManager.getInstance().setScreenHelp(getClass().getName(), steps); - if (!prefs.getBoolean("TUTO_SEARCH_SHOWN", false)&& !BuildConfig.DEBUG) { + if (!prefs.getBoolean("TUTO_SEARCH_SHOWN", false) && !BuildConfig.DEBUG) { HelpManager.getInstance().showHelp();/* getAbstractActivity().fancyShowCaseQueue.show();*/ prefs.edit().putBoolean("TUTO_SEARCH_SHOWN", true).apply(); } @@ -312,15 +311,14 @@ public void setPrograms(List programModels) { // Set popupWindow height to 500px popupWindow.setHeight(500); - } - catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) { + } catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) { // silently fail... } binding.programSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int pos, long id) { if (pos > 0) { - ProgramModel selectedProgram = (ProgramModel) adapterView.getItemAtPosition(pos -1); + ProgramModel selectedProgram = (ProgramModel) adapterView.getItemAtPosition(pos - 1); setProgramColor(presenter.getProgramColor(selectedProgram.uid())); presenter.setProgram((ProgramModel) adapterView.getItemAtPosition(pos - 1)); binding.enrollmentButton.setVisibility(View.VISIBLE); @@ -351,7 +349,6 @@ public void setProgramColor(String color) { int programColor = ColorUtils.getColorFrom(this, color); - SharedPreferences prefs = getAbstracContext().getSharedPreferences( Constants.SHARE_PREFS, Context.MODE_PRIVATE); if (programTheme != -1) { @@ -361,15 +358,33 @@ public void setProgramColor(String color) { binding.appbatlayout.setBackgroundColor(programColor); } else { prefs.edit().remove(Constants.PROGRAM_THEME).apply(); - binding.enrollmentButton.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.colorPrimary))); - binding.mainToolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary)); - binding.appbatlayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary)); + int colorPrimary; + switch (prefs.getInt(Constants.THEME, R.style.AppTheme)) { + case R.style.AppTheme: + colorPrimary = R.color.colorPrimary; + break; + case R.style.RedTheme: + colorPrimary = R.color.colorPrimaryRed; + break; + case R.style.OrangeTheme: + colorPrimary = R.color.colorPrimaryOrange; + break; + case R.style.GreenTheme: + colorPrimary = R.color.colorPrimaryGreen; + break; + default: + colorPrimary = R.color.colorPrimary; + break; + } + binding.enrollmentButton.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, colorPrimary))); + binding.mainToolbar.setBackgroundColor(ContextCompat.getColor(this, colorPrimary)); + binding.appbatlayout.setBackgroundColor(ContextCompat.getColor(this, colorPrimary)); } binding.executePendingBindings(); setTheme(prefs.getInt(Constants.PROGRAM_THEME, prefs.getInt(Constants.THEME, R.style.AppTheme))); - if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); TypedValue typedValue = new TypedValue(); diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/eventDetail/EventDetailModel.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/eventDetail/EventDetailModel.java index da08bab463..a40a61352f 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/eventDetail/EventDetailModel.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/eventDetail/EventDetailModel.java @@ -26,7 +26,7 @@ public class EventDetailModel extends BaseObservable { private final List dataElemets; private final List stageSections; - private final HashMap> fieldsElements; +// private final HashMap> fieldsElements; private final ProgramStageModel programStage; private final List optionComboList; private final ProgramModel programModel; @@ -43,17 +43,17 @@ public class EventDetailModel extends BaseObservable { this.dataElemets = programStageDataElementModelList; this.stageSections = programStageSectionModelList; this.programStage = programStage; - fieldsElements = new HashMap<>(); +// fieldsElements = new HashMap<>(); this.orgUnit = orgUnit; this.catComboName = optionComboList.val0(); this.optionComboList = optionComboList.val1(); this.programModel = programModel; - setUpFields(); +// setUpFields(); } - private void setUpFields() { + /* private void setUpFields() { ArrayList sectionDataElements = new ArrayList<>(); for (ProgramStageDataElementModel de : dataElemets) { @@ -69,12 +69,12 @@ private void setUpFields() { sectionDataElements.add(de); fieldsElements.put(section.uid(), sectionDataElements); } - } + }*/ EventModel getEventModel() { return eventModel; } - +/* List getStageSections() { return stageSections; } @@ -92,7 +92,7 @@ String getValueForDE(String dataelementUid) { return trackedEntityDataValueModel.value(); } return null; - } + }*/ public ProgramStageModel getProgramStage() { return programStage; diff --git a/app/src/main/java/org/dhis2/utils/CustomViews/DateAdapter.java b/app/src/main/java/org/dhis2/utils/CustomViews/DateAdapter.java index ce5528986c..a24b32800e 100644 --- a/app/src/main/java/org/dhis2/utils/CustomViews/DateAdapter.java +++ b/app/src/main/java/org/dhis2/utils/CustomViews/DateAdapter.java @@ -8,6 +8,7 @@ import org.dhis2.R; import org.dhis2.databinding.ItemDateBinding; +import org.dhis2.utils.DateUtils; import org.dhis2.utils.Period; import java.text.SimpleDateFormat; @@ -36,7 +37,7 @@ public class DateAdapter extends RecyclerView.Adapter { public DateAdapter(Period period) { currentPeriod = period; - Calendar calendar = Calendar.getInstance(); + Calendar calendar = DateUtils.getInstance().getCalendar(); calendar.add(Calendar.YEAR, 1); //let's the user select dates in the next year int year = calendar.get(Calendar.YEAR); diff --git a/app/src/main/java/org/dhis2/utils/ValueUtils.java b/app/src/main/java/org/dhis2/utils/ValueUtils.java index a405f544e5..976a78e5d3 100644 --- a/app/src/main/java/org/dhis2/utils/ValueUtils.java +++ b/app/src/main/java/org/dhis2/utils/ValueUtils.java @@ -61,4 +61,24 @@ public static TrackedEntityAttributeValueModel transform(BriteDatabase briteData return teAttrValue; } + public static String optionSetCodeToDisplayName(BriteDatabase briteDatabase, String optionSet, String optionSetCode) { + String displayName = optionSetCode; + Cursor optionsCursor = briteDatabase.query("SELECT * FROM Option WHERE optionSet = ? AND code = ? LIMIT 1", optionSet, optionSetCode); + if (optionsCursor != null && optionsCursor.moveToFirst()) { + OptionModel optionModel = OptionModel.create(optionsCursor); + displayName = optionModel.displayName(); + optionsCursor.close(); + } + return displayName; + } + + public static String orgUnitUidToDisplayName(BriteDatabase briteDatabase, String value) { + String displayName = value; + Cursor orgUnitCursor = briteDatabase.query("SELECT OrganisationUnit.displayName FROM OrganisationUnit WHERE OrganisationUnit.uid = ?", value); + if (orgUnitCursor != null && orgUnitCursor.moveToFirst()) { + displayName = orgUnitCursor.getString(0); + orgUnitCursor.close(); + } + return displayName; + } } diff --git a/app/src/main/res/layout/item_program_event.xml b/app/src/main/res/layout/item_program_event.xml index d4d31e834b..1dd06b9e00 100644 --- a/app/src/main/res/layout/item_program_event.xml +++ b/app/src/main/res/layout/item_program_event.xml @@ -21,9 +21,8 @@ + android:padding="10dp"> - + + + + + - - @@ -112,11 +124,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - app:layout_constraintTop_toTopOf="@id/status_icon" - app:layout_constraintBottom_toBottomOf="@id/status_icon" - app:layout_constraintEnd_toStartOf="@id/status_icon" android:layout_marginStart="9dp" app:eventWithoutRegistrationStatusText='@{event}' + app:layout_constraintBottom_toBottomOf="@id/status_icon" + app:layout_constraintEnd_toStartOf="@id/status_icon" + app:layout_constraintTop_toTopOf="@id/status_icon" tools:text="@string/event_open" /> diff --git a/build.gradle b/build.gradle index f3c56fb39f..b97ec35edb 100644 --- a/build.gradle +++ b/build.gradle @@ -60,7 +60,7 @@ ext { dagger : "2.11", timber : "4.5.0", leakcanary : "1.5", - dhis2sdk : "0.11.6-SNAPSHOT", + dhis2sdk : "0.11.8-SNAPSHOT", ruleEngine : "1.0.3-SNAPSHOT", rxjava : "2.1.0", rxandroid : "2.1.0",