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

[V5] Sync stats enhancements #920

Merged
merged 7 commits into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION_NAME=5.2.1-SNAPSHOT
VERSION_NAME=5.2.2-SNAPSHOT
VERSION_CODE=1
GROUP=org.smartregister
POM_SETTING_DESCRIPTION=OpenSRP Client Core Application
Expand Down
106 changes: 105 additions & 1 deletion opensrp-core/res/layout/fragment_stats.xml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,32 @@

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">

<TextView
android:id="@+id/unprocessed_events_label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/unprocessed_events"
android:textColor="@color/text_black"
android:textSize="18sp" />

<TextView
android:id="@+id/unprocessed_events"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="@color/text_black"
android:textSize="18sp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down Expand Up @@ -220,7 +246,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/synced_vaccine_events"
android:text="@string/unsynced_vaccine_events"
android:textColor="@color/text_black"
android:textSize="18sp" />

Expand Down Expand Up @@ -286,6 +312,32 @@

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal"
android:weightSum="2">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/last_synced_server_version"
android:textColor="@color/text_black"
android:textSize="18sp" />

<TextView
android:id="@+id/last_sync_date"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="@color/text_black"
android:textSize="18sp" />

</LinearLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down Expand Up @@ -495,6 +547,58 @@

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/app_install_date"
android:textColor="@color/text_black"
android:textSize="18sp" />

<TextView
android:id="@+id/app_install_date_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textAlignment="viewStart"
android:textColor="@color/text_black"
android:textSize="18sp" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/app_updated_date"
android:textColor="@color/text_black"
android:textSize="18sp" />

<TextView
android:id="@+id/app_update_date_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textAlignment="viewStart"
android:textColor="@color/text_black"
android:textSize="18sp" />

</LinearLayout>


<TextView
android:layout_width="match_parent"
Expand Down
53 changes: 31 additions & 22 deletions opensrp-core/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -446,35 +446,44 @@
<string name="view_sync_stats">Show Sync Stats</string>
<string name="export_db_notification">Exporting Database…</string>
<string name="database_download_success">Database download successful</string>
<string name="synced_events">Synced events:</string>
<string name="unsynced_events">Unsynced events:</string>
<string name="synced_clients">Synced clients:</string>
<string name="unsynced_clients">Unsynced clients:</string>
<string name="validated_events">Validated events:</string>
<string name="validated_clients">Validated clients:</string>
<string name="task_unprocessed_events">Task unprocessed events:</string>
<string name="refresh">Refresh</string>
<string name="return_to_register">Return</string>
<string name="summary_forms">Other Forms</string>
<string name="permission_write_external_storage_rationale">Write access to the device internal storage is required for database download.</string>
<string name="sync">Sync</string>

<string name="app_version_name">App Version Name:</string>
<string name="app_version_code">App Version Code:</string>
<string name="database_version">Database Version:</string>
<string name="sync_statistics">Sync Statistics</string>
<string name="synced_events">Synced Events:</string>
<string name="unsynced_events">Unsynced Events:</string>
<string name="unprocessed_events">Unprocessed Events:</string>
<string name="task_unprocessed_events">Task Unprocessed Events:</string>
<string name="synced_clients">Synced Clients:</string>
<string name="unsynced_clients">Unsynced Clients:</string>
<string name="validated_events">Validated Events:</string>
<string name="validated_clients">Validated Clients:</string>
<string name="unsynced_vaccine_events">Unsynced Vaccine Events:</string>
<string name="unsynced_weight_events">Unsynced Weight Events:</string>
<string name="unsynced_height_events">Unsynced Height Events:</string>
<string name="last_synced_server_version">Last Synced Server Version:</string>

<string name="user_info">User Info</string>
<string name="user">User:</string>
<string name="team">Team:</string>
<string name="locality">Locality:</string>
<string name="sync">Sync</string>

<string name="app_info">App Info</string>
<string name="app_version_name">App Version Name:</string>
<string name="app_version_code">App Version Code:</string>
<string name="database_version">Database Version:</string>
<string name="build_date">Build Date:</string>
<string name="app_install_date">App First Install Date:</string>
<string name="app_updated_date">App Last Update Date:</string>

<string name="device_info">Device Info</string>
<string name="manufacturer">Manufacturer:</string>
<string name="device">Device:</string>
<string name="os_version">OS Version:</string>
<string name="sync_statistics">Sync Statistics</string>
<string name="user_info">User Info</string>
<string name="build_date">Build Date:</string>
<string name="date">Date:</string>
<string name="user">User:</string>
<string name="synced_vaccine_events">Unsynced vaccine events:</string>
<string name="unsynced_weight_events">Unsynced weight events:</string>
<string name="unsynced_height_events">Unsynced height events:</string>
<!-- /Sync Statistics View -->

<string name="refresh">Refresh</string>
<string name="return_to_register">Return</string>
<string name="summary_forms">Other Forms</string>
<string name="permission_write_external_storage_rationale">Write access to the device internal storage is required for database download.</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -589,16 +589,20 @@ public interface SyncInfo {
String VALID_CLIENTS = "validClients";
String INVALID_CLIENTS = "INValidClients";
String TASK_UNPROCESSED_EVENTS = "taskUnprocessedEvents";
String UNPROCESSED_EVENTS = "unprocessedEvents";
String NULL_EVENT_SYNC_STATUS = "nullEventSyncStatus";
String USER_NAME = "user";
String USER_TEAM = "user_team";
String USER_LOCALITY = "user_locality";
String APP_VERSION_NAME = "app_ver_name";
String APP_VERSION_CODE = "app_ver_code";
String APP_BUILD_DATE = "app_build_date";
String APP_INSTALL_DATE = "app_install_date";
String APP_UPDATED_DATE = "app_updated_date";
String UNSYNCED_VACCINE_EVENTS = "unsynced_vaccine_events";
String UNSYNCED_WEIGHT_EVENTS = "unsynced_weight_events";
String UNSYNCED_HEIGHT_EVENTS = "unsynced_height_events";
String LAST_SYNCED_SERVER_VERSION = "last_sync_server_version";
}

public interface DeviceInfo {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ private boolean pushECToServer(EventClientRepository db) {
Map<String, Object> pendingEventsClients = db.getUnSyncedEvents(getEventBatchSize());

if (pendingEventsClients.isEmpty()) {
Timber.i("pushECToServer-> No pending clients");
break;
}
// create request body
Expand All @@ -334,7 +335,12 @@ private boolean pushECToServer(EventClientRepository db) {
}
}
if (pendingEventsClients.containsKey(AllConstants.KEY.EVENTS)) {
request.put(AllConstants.KEY.EVENTS, pendingEventsClients.get(AllConstants.KEY.EVENTS));
Object events = pendingEventsClients.get(AllConstants.KEY.EVENTS);
request.put(AllConstants.KEY.EVENTS, events);

if (events instanceof List) {
eventsUploadedCount += ((List<?>) events).size();
}
}
} catch (JSONException e) {
Timber.e(e);
Expand All @@ -360,6 +366,7 @@ private boolean pushECToServer(EventClientRepository db) {
String responseData = response.payload();
if (StringUtils.isNotEmpty(responseData)) {
try {
Timber.e("pushECToServer-> Failed to sync: %s for payload: %s", response.payload(), jsonPayload);
JSONObject failedEventClients = new JSONObject(responseData);
failedClients = getFailed(FAILED_CLIENTS, failedEventClients);
failedEvents = getFailed(FAILED_EVENTS, failedEventClients);
Expand All @@ -373,7 +380,7 @@ private boolean pushECToServer(EventClientRepository db) {
Timber.i("Events synced successfully.");

stopTrace(eventSyncTrace);
updateProgress(eventsUploadedCount, totalEventCount);
updateProgress(eventsUploadedCount, Math.max(1, totalEventCount));

if ((totalEventCount - eventsUploadedCount) > 0)
pushECToServer(db);
Expand Down
12 changes: 12 additions & 0 deletions opensrp-core/src/main/java/org/smartregister/util/StatsUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@
import static org.smartregister.AllConstants.DeviceInfo.MODEL;
import static org.smartregister.AllConstants.DeviceInfo.OS_VERSION;
import static org.smartregister.AllConstants.SyncInfo.APP_BUILD_DATE;
import static org.smartregister.AllConstants.SyncInfo.APP_INSTALL_DATE;
import static org.smartregister.AllConstants.SyncInfo.APP_UPDATED_DATE;
import static org.smartregister.AllConstants.SyncInfo.APP_VERSION_CODE;
import static org.smartregister.AllConstants.SyncInfo.APP_VERSION_NAME;
import static org.smartregister.AllConstants.SyncInfo.INVALID_CLIENTS;
import static org.smartregister.AllConstants.SyncInfo.INVALID_EVENTS;
import static org.smartregister.AllConstants.SyncInfo.LAST_SYNCED_SERVER_VERSION;
import static org.smartregister.AllConstants.SyncInfo.NULL_EVENT_SYNC_STATUS;
import static org.smartregister.AllConstants.SyncInfo.SYNCED_CLIENTS;
import static org.smartregister.AllConstants.SyncInfo.SYNCED_EVENTS;
import static org.smartregister.AllConstants.SyncInfo.TASK_UNPROCESSED_EVENTS;
import static org.smartregister.AllConstants.SyncInfo.UNPROCESSED_EVENTS;
import static org.smartregister.AllConstants.SyncInfo.UNSYNCED_CLIENTS;
import static org.smartregister.AllConstants.SyncInfo.UNSYNCED_EVENTS;
import static org.smartregister.AllConstants.SyncInfo.UNSYNCED_HEIGHT_EVENTS;
Expand Down Expand Up @@ -73,10 +77,12 @@ private void populateSyncStatistics() {
syncInfoMap.put(VALID_CLIENTS, "-");
syncInfoMap.put(INVALID_CLIENTS, "-");
syncInfoMap.put(TASK_UNPROCESSED_EVENTS, "-");
syncInfoMap.put(UNPROCESSED_EVENTS, "-");
syncInfoMap.put(NULL_EVENT_SYNC_STATUS, "-");
syncInfoMap.put(UNSYNCED_VACCINE_EVENTS, "-");
syncInfoMap.put(UNSYNCED_WEIGHT_EVENTS, "-");
syncInfoMap.put(UNSYNCED_HEIGHT_EVENTS, "-");
syncInfoMap.put(LAST_SYNCED_SERVER_VERSION, "-");

String eventSyncSql = "select count(*), syncStatus from event group by syncStatus";
String clientSyncSql = "select count(*), syncStatus from client group by syncStatus";
Expand Down Expand Up @@ -148,6 +154,8 @@ private void populateEventSyncInfo(Cursor cursor) {
syncInfoMap.put(UNSYNCED_EVENTS, String.valueOf(cursor.getInt(0)));
} else if (BaseRepository.TYPE_Task_Unprocessed.equals(syncStatus)) {
syncInfoMap.put(TASK_UNPROCESSED_EVENTS, String.valueOf(cursor.getInt(0)));
} else if (BaseRepository.TYPE_Unprocessed.equals(syncStatus)) {
syncInfoMap.put(UNPROCESSED_EVENTS, String.valueOf(cursor.getInt(0)));
} else if (syncStatus == null) {
syncInfoMap.put(NULL_EVENT_SYNC_STATUS, String.valueOf(cursor.getInt(0)));
}
Expand Down Expand Up @@ -185,9 +193,11 @@ public void populateUserInfo() {
String userName = sharedPreferences.fetchRegisteredANM();
String userTeam = sharedPreferences.fetchDefaultTeam(sharedPreferences.fetchRegisteredANM());
String userLocality = sharedPreferences.fetchCurrentLocality();
String lastSyncDate = sharedPreferences.fetchLastSyncDate(0).toString();
syncInfoMap.put(USER_NAME, StringUtils.isNotBlank(userName) ? userName : "-");
syncInfoMap.put(USER_TEAM, StringUtils.isNotBlank(userTeam) ? userTeam : "-");
syncInfoMap.put(USER_LOCALITY, StringUtils.isNotBlank(userLocality) ? userLocality : "-");
syncInfoMap.put(LAST_SYNCED_SERVER_VERSION, StringUtils.isNotBlank(lastSyncDate) ? lastSyncDate : "-");
}

private void populateBuildInfo() {
Expand Down Expand Up @@ -216,6 +226,8 @@ private void populateDeviceInfo() {
syncInfoMap.put(MANUFACTURER, Build.MANUFACTURER);
syncInfoMap.put(MODEL, Build.MODEL);
syncInfoMap.put(APP_BUILD_DATE, Utils.getBuildDate(true));
syncInfoMap.put(APP_INSTALL_DATE, Utils.getAppInstallDate());
syncInfoMap.put(APP_UPDATED_DATE, Utils.getAppUpdatedDate());

String osName = Build.VERSION_CODES.class.getFields()[android.os.Build.VERSION.SDK_INT].getName();
syncInfoMap.put(OS_VERSION, osName);
Expand Down
23 changes: 23 additions & 0 deletions opensrp-core/src/main/java/org/smartregister/util/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand Down Expand Up @@ -1028,4 +1029,26 @@ public static boolean isP2PEnabled() {
SyncConfiguration configuration = CoreLibrary.getInstance().getSyncConfiguration();
return configuration == null || configuration.isP2PEnabled();
}

public static String getAppInstallDate() {
try {
Context context = CoreLibrary.getInstance().context().applicationContext();
Date date = new Date(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).firstInstallTime);
return DateFormat.getDateTimeInstance().format(date);
} catch (Exception e) {
Timber.e(e);
return "Unknown";
}
}

public static String getAppUpdatedDate() {
try {
Context context = CoreLibrary.getInstance().context().applicationContext();
Date date = new Date(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).lastUpdateTime);
return DateFormat.getDateTimeInstance().format(date);
} catch (Exception e) {
Timber.e(e);
return "Unknown";
}
}
}
Loading
Loading