/*
* Copyright (c) 2014. The Trustees of Indiana University.
*
* This version of the code is licensed under the MPL 2.0 Open Source license with additional
* healthcare disclaimer. If the user is an entity intending to commercialize any application
* that uses this code in a for-profit venture, please contact the copyright holder.
*/
package com.muzima.view.patients;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.view.Menu;
import com.muzima.MuzimaApplication;
import com.muzima.R;
import com.muzima.adapters.patients.PatientAdapterHelper;
import com.muzima.api.model.Patient;
import com.muzima.api.model.User;
import com.muzima.controller.EncounterController;
import com.muzima.controller.FormController;
import com.muzima.controller.NotificationController;
import com.muzima.controller.ObservationController;
import com.muzima.controller.PatientController;
import com.muzima.service.JSONInputOutputToDisk;
import com.muzima.utils.Constants;
import com.muzima.view.BaseActivity;
import com.muzima.view.encounters.EncountersActivity;
import com.muzima.view.forms.PatientFormsActivity;
import com.muzima.view.notifications.PatientNotificationActivity;
import com.muzima.view.observations.ObservationsActivity;
import java.io.IOException;
import java.util.List;
import static com.muzima.utils.DateUtils.getFormattedDate;
public class PatientSummaryActivity extends BaseActivity {
private static final String TAG = "PatientSummaryActivity";
public static final String PATIENT = "patient";
private BackgroundQueryTask mBackgroundQueryTask;
private Patient patient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_summary);
Bundle intentExtras = getIntent().getExtras();
if (intentExtras != null) {
patient = (Patient) intentExtras.getSerializable(PATIENT);
}
try {
setupPatientMetadata();
notifyOfIdChange();
} catch (PatientController.PatientLoadException e) {
Toast.makeText(this, R.string.error_patient_fetch, Toast.LENGTH_SHORT).show();
finish();
}
}
private void notifyOfIdChange() {
final JSONInputOutputToDisk jsonInputOutputToDisk = new JSONInputOutputToDisk(getApplication());
List list = null;
try {
list = jsonInputOutputToDisk.readList();
} catch (IOException e) {
Log.e(TAG, "Exception thrown when reading to phone disk", e);
}
if(list.size()==0){
return;
}
final String patientIdentifier = patient.getIdentifier();
if(list.contains(patientIdentifier)){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true)
.setIcon(getResources().getDrawable(R.drawable.ic_warning))
.setTitle("Notice")
.setMessage(getString(R.string.info_client_identifier_change))
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
patient.removeIdentifier(Constants.LOCAL_PATIENT);
try {
jsonInputOutputToDisk.remove(patientIdentifier);
} catch (IOException e) {
Log.e(TAG, "Error occurred while saving patient which has local identifier removed!", e);
}
}
}).create().show();
}
}
@Override
protected void onResume() {
super.onResume();
executeBackgroundTask();
}
@Override
protected void onStop() {
if (mBackgroundQueryTask != null) {
mBackgroundQueryTask.cancel(true);
}
super.onStop();
}
private void setupPatientMetadata() throws PatientController.PatientLoadException {
TextView patientName = (TextView) findViewById(R.id.patientName);
patientName.setText(PatientAdapterHelper.getPatientFormattedName(patient));
ImageView genderIcon = (ImageView) findViewById(R.id.genderImg);
int genderDrawable = patient.getGender().equalsIgnoreCase("M") ? R.drawable.ic_male : R.drawable.ic_female;
genderIcon.setImageDrawable(getResources().getDrawable(genderDrawable));
TextView dob = (TextView) findViewById(R.id.dob);
dob.setText("DOB: " + getFormattedDate(patient.getBirthdate()));
TextView patientIdentifier = (TextView) findViewById(R.id.patientIdentifier);
patientIdentifier.setText(patient.getIdentifier());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.client_summary, menu);
super.onCreateOptionsMenu(menu);
return true;
}
public void showForms(View v) {
Intent intent = new Intent(this, PatientFormsActivity.class);
intent.putExtra(PATIENT, patient);
startActivity(intent);
}
public void showNotifications(View v) {
Intent intent = new Intent(this, PatientNotificationActivity.class);
intent.putExtra(PATIENT, patient);
startActivity(intent);
}
public void showObservations(View v) {
Intent intent = new Intent(this, ObservationsActivity.class);
intent.putExtra(PATIENT, patient);
startActivity(intent);
}
public void showEncounters(View v) {
Intent intent = new Intent(this, EncountersActivity.class);
intent.putExtra(PATIENT, patient);
startActivity(intent);
}
private static class PatientSummaryActivityMetadata {
int recommendedForms;
int incompleteForms;
int completeForms;
int newNotifications;
int totalNotifications;
int observations;
int encounters;
}
public class BackgroundQueryTask extends AsyncTask<Void, Void, PatientSummaryActivityMetadata> {
@Override
protected PatientSummaryActivityMetadata doInBackground(Void... voids) {
MuzimaApplication muzimaApplication = (MuzimaApplication) getApplication();
PatientSummaryActivityMetadata patientSummaryActivityMetadata = new PatientSummaryActivityMetadata();
FormController formController = muzimaApplication.getFormController();
NotificationController notificationController = muzimaApplication.getNotificationController();
ObservationController observationController = muzimaApplication.getObservationController();
EncounterController encounterController = muzimaApplication.getEncounterController();
try {
patientSummaryActivityMetadata.recommendedForms = formController.getRecommendedFormsCount();
patientSummaryActivityMetadata.completeForms = formController.getCompleteFormsCountForPatient(patient.getUuid());
patientSummaryActivityMetadata.incompleteForms = formController.getIncompleteFormsCountForPatient(patient.getUuid());
patientSummaryActivityMetadata.observations = observationController.getObservationsCountByPatient(patient.getUuid());
patientSummaryActivityMetadata.encounters = encounterController.getEncountersCountByPatient(patient.getUuid());
User authenticatedUser = ((MuzimaApplication) getApplicationContext()).getAuthenticatedUser();
if (authenticatedUser != null) {
patientSummaryActivityMetadata.newNotifications =
notificationController.getNotificationsCountForPatient(patient.getUuid(), authenticatedUser.getPerson().getUuid(),
Constants.NotificationStatusConstants.NOTIFICATION_UNREAD);
patientSummaryActivityMetadata.totalNotifications =
notificationController.getNotificationsCountForPatient(patient.getUuid(), authenticatedUser.getPerson().getUuid(), null);
} else {
patientSummaryActivityMetadata.newNotifications = 0;
patientSummaryActivityMetadata.totalNotifications = 0;
}
} catch (FormController.FormFetchException e) {
Log.w(TAG, "FormFetchException occurred while fetching metadata in MainActivityBackgroundTask", e);
} catch (NotificationController.NotificationFetchException e) {
Log.w(TAG, "NotificationFetchException occurred while fetching metadata in MainActivityBackgroundTask", e);
} catch (IOException e) {
e.printStackTrace();
}
return patientSummaryActivityMetadata;
}
@Override
protected void onPostExecute(PatientSummaryActivityMetadata patientSummaryActivityMetadata) {
TextView formsDescription = (TextView) findViewById(R.id.formDescription);
formsDescription.setText(patientSummaryActivityMetadata.incompleteForms + " Incomplete, "
+ patientSummaryActivityMetadata.completeForms + " Complete, "
+ patientSummaryActivityMetadata.recommendedForms + " Recommended");
TextView notificationsDescription = (TextView) findViewById(R.id.notificationDescription);
notificationsDescription.setText(patientSummaryActivityMetadata.newNotifications + " New Notifications, "
+ patientSummaryActivityMetadata.totalNotifications + " Total Notifications");
TextView observationDescription = (TextView) findViewById(R.id.observationDescription);
observationDescription.setText(patientSummaryActivityMetadata.observations + " Observations");
TextView encounterDescription = (TextView) findViewById(R.id.encounterDescription);
encounterDescription.setText(patientSummaryActivityMetadata.encounters + " Encounters");
}
}
private void executeBackgroundTask() {
mBackgroundQueryTask = new BackgroundQueryTask();
mBackgroundQueryTask.execute();
}
}