Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release/3.1.0.1 to develop #3922

Merged
merged 23 commits into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
a897212
Merge pull request #3725 from dhis2/release/3.0.0.2
andresmr Jul 11, 2024
5c94555
Merge pull request #3731 from dhis2/release/3.0.1
andresmr Aug 27, 2024
9d020a5
ci: set status in progress for release APK in Google Play
andresmr Aug 27, 2024
1499881
Merge pull request #3861 from dhis2/release/3.1.0-RC
xavimolloy Nov 19, 2024
0acd8b7
ci: fix deploy release job
xavimolloy Nov 19, 2024
9c763ac
Merge pull request #3891 from dhis2/fix-deploy-release-job
andresmr Nov 19, 2024
0778ab2
ci: Fix deploy release job (#3892)
xavimolloy Nov 20, 2024
7c32c47
ci: update vName
xavimolloy Nov 20, 2024
abc9265
fix: [ANDROAPP-6665] Clear filters when navigating back (#3895)
xavimolloy Nov 26, 2024
a837538
fix: [ANDROAPP-6691] Null pointer on show dialog (#3904)
andresmr Nov 27, 2024
b16db7a
update SDK version for 3.1.0.1 hotfix (#3911)
taridepaco Nov 29, 2024
964ef10
hotfix: Handle large option sets (#3901)
Balcan Nov 29, 2024
f0fddc8
build: update sdk and mobile ui to release artifacts
xavimolloy Dec 3, 2024
ffd2b1b
build: update version code
xavimolloy Dec 3, 2024
062be4f
Merge pull request #3914 from dhis2/update-mobile-ui-and-sdk-versions…
xavimolloy Dec 3, 2024
c6c0d83
build: 3.1.0.1 release
xavimolloy Dec 3, 2024
3a43b54
Merge pull request #3918 from dhis2/modify-release-notes-md-and-whats…
xavimolloy Dec 4, 2024
2ee4dbf
fix: options not hiding/showing with program rules
Balcan Dec 4, 2024
ba3b8cd
fix: remove code smells
Balcan Dec 4, 2024
5786295
Merge pull request #3919 from dhis2/optionset_fix
xavimolloy Dec 4, 2024
b72122f
fix: [ANDROAPP-6703] refresh selected item when inputCardData list is…
xavimolloy Dec 5, 2024
f4d6779
Merge pull request #3921 from dhis2/ANDROAPP-6703-Option-is-not-marke…
xavimolloy Dec 5, 2024
4160a9d
Merge branch 'develop' into release/3.1.0.1
andresmr Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 5 additions & 54 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,58 +1,9 @@
# Release notes - Android App for DHIS2 - 3.1.0.1

## NEW FUNCTIONALITY AND WEB PARITY
### Bug

**New Capture Coordinates process:** The 3.1 version introduces a list of new features designed to enhance the capture coordinates process. These improvements aim to provide greater accuracy, flexibility, and control over location data capture.
- **Accuracy:** The capture coordinates process now includes a feature that displays the precision of the captured location. This allows users to see how accurate their location data is in real-time. This parameter can also be restricted using the Android Settings WebApp.
- **Search Functionality:** A new search functionality has been added, allowing users to look up specific locations by name or address. Users are also able to navigate through the map and perform area searches to discover other locations within a specified region.
- **Block Manual Capture:** Using the Android Settings Web App, administrators now have the option to block manual location capture. When this setting is enabled, users can only capture the current location and cannot manually select or search a different one. This ensures that location data remains consistent and accurate.
[ANDROAPP-6653](https://dhis2.atlassian.net/browse/ANDROAPP-6653) Large option sets freeze the app

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-6330) | [Card1](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-disabled-manual-capture.png) | [Card2](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-map-accuracy.png) | [Card3](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-map-search.png) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_common_features_map_accuracy)
[ANDROAPP-6665](https://dhis2.atlassian.net/browse/ANDROAPP-6665) Filters persists when exiting the program or data set

**Improve transfers flow:** Significant enhancements to the transfer flow, aimed at making the process more user-friendly and transparent. The transfer button has been moved to a more accessible location within the three dot menu in the TEI Dashboard, ensuring that users can easily find and initiate transfers without unnecessary navigation. It also has introduced new dialogs throughout the transfer process. These dialogs provide clear, step-by-step guidance, ensuring that users understand each part of the process.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-6228) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_transfers)

**New relationship section:** Major updates have been made in the relationship tabs, enhancing both functionality and user experience. Relationship cards have been updated with the new design to offer a more intuitive and visually appealing experience. The new design emphasizes clarity and usability, making it easier to view and manage relationships at a glance.

To prevent accidental deletions and enhance user control, a new confirmation dialog also has been added when deleting a relationship. This dialog will prompt users to confirm their action, ensuring that relationships are only deleted intentionally.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-6362) | [Card1](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-relationship-sections.png) | [Card2](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-new-relationship-cards.png) | [Card3](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-relationship-deletion.png) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_common_features_relationships)

**Sort of unique attributes in the search screen:** Aimed at aligning it with the web instance for a more consistent user experience, this version of the Android app, by default, sorts the unique attributes (QR, barcode) at the top of the list of searchable attributes. Users can quickly and easily find the attributes for a more exact search.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-6039) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_unique_qrBar_search)

**Support of biometric dialog:** An enhancement to the biometric authentication feature has been made in 3.1.0. When there is only one account configured, the user can configure biometric authentication (fingerprint or face ID).

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-4676) | [Documentation](https://docs.dhis2.org/en/use/android-app/android-specific-features.html#capture_app_generic_biometrics_login)

**Line Listing improvements:** This version of the Android App introduces support for the Category Option Dimension in line listings. This enhancement enables users to apply category options directly within line listings to filter data according to precise criteria, improving data exploration and decision-making processes. This feature greatly enhances the versatility and utility of line listings, empowering users to perform more sophisticated reporting.

Additionally, it has been improved the text alignment within the Line Listing tables to support left alignment. This enhancement ensures better readability and a cleaner presentation of data, making it easier for users to review and analyze their information quickly.

[Jira1](https://dhis2.atlassian.net/browse/ANDROAPP-6353) | [Jira2](https://dhis2.atlassian.net/browse/ANDROAPP-6121) | [Documentation](https://docs.dhis2.org/en/use/android-app/visual-configurations.html#capture_app_visual_event_visualizations)

## USER EXPERIENCE

**Responsive Home Screen:** In this Android App version a new dynamic home screen that adapts to the number of programs available has been implemented. This update replaces the old static list that didn’t adjust to the screen, providing a more responsive and user-friendly interface.The responsive design makes better use of screen real estate, providing a more engaging and functional home screen layout.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-5394) | [Card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-responsive-home-screen.png) | [Documentation](https://docs.dhis2.org/en/use/android-app/android-specific-features.html#capture_app_home)

**Scheduled events dialog:** As a continuation of the new schedule dialog introduced in the version 3.0, a new intuitive and user-friendly schedule dialog has been implemented to enhance the overall user experience, making it easier to book, reschedule, or cancel events.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-6229) | [Card1](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-schedule-new.png) | [Card2](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-enter-cancel-reschedule.png) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_scheduling)

**Improve menus and navigation bar:** A revamped of the menus and navigation bar has been made to be more user-friendly and accessible. It includes a cleaner, more modern look that improves readability and usability. These updates are designed to provide a more efficient and enjoyable user experience.

[Jira1](https://dhis2.atlassian.net/browse/ANDROAPP-6036) | [Jira2](https://dhis2.atlassian.net/browse/ANDROAPP-6113) | [Card1](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-menu.png) | [Card2](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/dhis2-android/release+notes+3.1/release+cards/Android-3-1-navigation-bar.png) | [Documentation
](https://docs.dhis2.org/en/use/android-app/visual-configurations.html#capture_app_visual_menu_bars_update)
## CROSS PRODUCT

**Support for customized Tracker terminology:** Some DHIS2 terminology is not familiar for the end users. For this reason, we are gradually enabling the possibility to customize it to each particular use case. In this version, the term "event" (program label context) is customizable. The admin user will be able to configure it for each program using the Maintenance App, and the Android Capture App will display the customized term instead of the generic one.

[Jira](https://dhis2.atlassian.net/browse/ANDROAPP-5947) | [Documentation](https://docs.dhis2.org/en/use/android-app/program-features.html#capture_app_programs_common_features_customized_terminology)

---

##### **DETAILS**
You can find the list of all new features and all bugs fixed in 3.1.0 [here.](https://dhis2.atlassian.net/projects/ANDROAPP/versions/10851/tab/release-report-all-issues)
[ANDROAPP-6691](https://dhis2.atlassian.net/browse/ANDROAPP-6691) NullPointerException: Dataset table
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@
@AutoValue
public abstract class SpinnerViewModel extends FieldViewModel {

private List<String> optionsToHide;
private List<String> optionGroupsToHide;

@NonNull
public abstract String hint();

Expand Down Expand Up @@ -52,17 +49,4 @@ public FieldViewModel withWarning(@NonNull String warning) {
public FieldViewModel withValue(String data) {
return new AutoValue_SpinnerViewModel(uid(),label(),mandatory(),data,programStageSection(),allowFutureDate(),editable(),warning(),error(),description(),dataElement(), options(), optionsList(), storeBy(), row(), column(),categoryOptionCombo(), catCombo(),hint(),optionSet());
}

public void setOptionsToHide(List<String> optionsToHide, List<String> optionsGroupsToHide) {
this.optionsToHide = optionsToHide;
this.optionGroupsToHide = optionsGroupsToHide;
}

public List<String> getOptionsToHide() {
return optionsToHide;
}

public List<String> getOptionGroupsToHide() {
return optionGroupsToHide;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,8 @@ class DataSetTableActivity : ActivityGlobalAbstract(), DataSetTableContract.View
}
})
.onNoConnectionListener {
val contextView = findViewById<View>(R.id.navigationBar)
Snackbar.make(
contextView,
binding.root,
R.string.sync_offline_check_connection,
Snackbar.LENGTH_SHORT,
).show()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,21 +84,22 @@ class EnrollmentModule(
@PerActivity
fun provideEnrollmentConfiguration(
d2: D2,
metadataIconProvider: MetadataIconProvider,
) = EnrollmentConfiguration(d2, enrollmentUid, metadataIconProvider)
) = EnrollmentConfiguration(d2, enrollmentUid)

@Provides
@PerActivity
fun provideDataEntryRepository(
modelFactory: FieldViewModelFactory,
enrollmentFormLabelsProvider: EnrollmentFormLabelsProvider,
enrollmentConfiguration: EnrollmentConfiguration,
metadataIconProvider: MetadataIconProvider,
): EnrollmentRepository {
return EnrollmentRepository(
fieldFactory = modelFactory,
conf = enrollmentConfiguration,
enrollmentMode = EnrollmentMode.valueOf(enrollmentMode.name),
enrollmentFormLabelsProvider = enrollmentFormLabelsProvider,
metadataIconProvider = metadataIconProvider,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,16 @@ fun ProvideInputDate(
) {
if (uiModel.showField) {
Spacer(modifier = Modifier.height(16.dp))
val textSelection = TextRange(if (uiModel.eventDate.dateValue != null) uiModel.eventDate.dateValue.length else 0)
val textSelection =
TextRange(if (uiModel.eventDate.dateValue != null) uiModel.eventDate.dateValue.length else 0)
var value by remember(uiModel.eventDate.dateValue) {
if (uiModel.eventDate.dateValue != null) {
mutableStateOf(TextFieldValue(formatStoredDateToUI(uiModel.eventDate.dateValue) ?: "", textSelection))
mutableStateOf(
TextFieldValue(
formatStoredDateToUI(uiModel.eventDate.dateValue) ?: "",
textSelection,
),
)
} else {
mutableStateOf(TextFieldValue())
}
Expand All @@ -65,7 +71,10 @@ fun ProvideInputDate(
mutableStateOf(getInputState(uiModel.detailsEnabled))
}
val yearRange = if (uiModel.selectableDates != null) {
IntRange(uiModel.selectableDates.initialDate.substring(4, 8).toInt(), uiModel.selectableDates.endDate.substring(4, 8).toInt())
IntRange(
uiModel.selectableDates.initialDate.substring(4, 8).toInt(),
uiModel.selectableDates.endDate.substring(4, 8).toInt(),
)
} else {
IntRange(1924, 2124)
}
Expand All @@ -77,7 +86,10 @@ fun ProvideInputDate(
visualTransformation = DateTransformation(),
isRequired = uiModel.required,
is24hourFormat = uiModel.is24HourFormat,
selectableDates = uiModel.selectableDates ?: SelectableDates("01011924", "12312124"),
selectableDates = uiModel.selectableDates ?: SelectableDates(
"01011924",
"12312124",
),
yearRange = yearRange,
),
inputTextFieldValue = value,
Expand Down Expand Up @@ -236,15 +248,23 @@ fun ProvideCategorySelector(
selectedItem = null
eventCatComboUiModel.onClearCatCombo(eventCatComboUiModel.category)
},
onItemSelected = { newSelectedDropdownItem ->
onItemSelected = { _, newSelectedDropdownItem ->
selectedItem = newSelectedDropdownItem.label
eventCatComboUiModel.onOptionSelected(selectableOptions.firstOrNull { it.displayName() == newSelectedDropdownItem.label })
},
dropdownItems = dropdownItems,
fetchItem = { index -> dropdownItems[index] },
itemCount = dropdownItems.size,
onSearchOption = { /*no-op*/ },
loadOptions = { /*no-op*/ },
useDropDown = dropdownItems.size < 15,
isRequiredField = eventCatComboUiModel.required,
)
} else {
ProvideEmptyCategorySelector(modifier = modifier, name = eventCatComboUiModel.category.name, option = eventCatComboUiModel.noOptionsText)
ProvideEmptyCategorySelector(
modifier = modifier,
name = eventCatComboUiModel.category.name,
option = eventCatComboUiModel.noOptionsText,
)
}
}

Expand Down Expand Up @@ -306,10 +326,13 @@ fun ProvideEmptyCategorySelector(
onResetButtonClicked = {
selectedItem = ""
},
onItemSelected = { newSelectedDropdownItem ->
onItemSelected = { _, newSelectedDropdownItem ->
selectedItem = newSelectedDropdownItem.label
},
dropdownItems = listOf(DropdownItem(option)),
fetchItem = { DropdownItem(option) },
itemCount = 1,
onSearchOption = { /*no-op*/ },
loadOptions = { /*no-op*/ },
isRequiredField = false,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@

import io.reactivex.Flowable;
import io.reactivex.Observable;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import timber.log.Timber;

public class EventInitialRepositoryImpl implements EventInitialRepository {
Expand Down Expand Up @@ -328,22 +330,12 @@ private FieldUiModel transform(@NonNull ProgramStageDataElement stage, DataEleme
if (!dataValueOptions.isEmpty()) {
dataValue = option.get(0).displayName();
}
optionSetConfig = OptionSetConfiguration.Companion.config(
d2.optionModule().options().byOptionSetUid().eq(optionSet).blockingCount(),
() -> {
List<Option> options = d2.optionModule().options().byOptionSetUid().eq(optionSet).blockingGet();
HashMap<String, MetadataIconData> metadataIconMap = new HashMap<>();
for (Option optionItem : options) {
metadataIconMap.put(
optionItem.uid(),
metadataIconProvider.invoke(optionItem.style()));
}

return new OptionSetConfiguration.OptionConfigData(
options,
metadataIconMap
);
}
optionSetConfig = new OptionSetConfiguration(
null,
query -> null,
OptionSetConfiguration.Companion.optionDataFlow(
d2.optionModule().options().byOptionSetUid().eq(optionSet).getPagingData(10),
option1 -> metadataIconProvider.invoke(option1.style()))
);
}

Expand Down
1 change: 0 additions & 1 deletion app/src/main/java/org/dhis2/usescases/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,6 @@ class MainActivity :
}

override fun onPause() {
presenter.setOpeningFilterToNone()
presenter.onDetach()
super.onPause()
}
Expand Down
5 changes: 2 additions & 3 deletions app/src/main/java/org/dhis2/usescases/main/MainModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import dhis2.org.analytics.charts.Charts
import org.dhis2.commons.di.dagger.PerActivity
import org.dhis2.commons.featureconfig.data.FeatureConfigRepository
import org.dhis2.commons.filters.FilterManager
import org.dhis2.commons.filters.data.FilterRepository
import org.dhis2.commons.matomo.MatomoAnalyticsController
import org.dhis2.commons.prefs.PreferenceProvider
import org.dhis2.commons.resources.ColorUtils
Expand All @@ -32,7 +31,7 @@ class MainModule(val view: MainView, private val forceToNotSynced: Boolean) {
schedulerProvider: SchedulerProvider,
preferences: PreferenceProvider,
workManagerController: WorkManagerController,
filterRepository: FilterRepository,
filterManager: FilterManager,
matomoAnalyticsController: MatomoAnalyticsController,
userManager: UserManager,
deleteUserData: DeleteUserData,
Expand All @@ -47,7 +46,7 @@ class MainModule(val view: MainView, private val forceToNotSynced: Boolean) {
schedulerProvider,
preferences,
workManagerController,
filterRepository,
filterManager,
matomoAnalyticsController,
userManager,
deleteUserData,
Expand Down
Loading
Loading