/*
* 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.adapters.observations;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.muzima.R;
import com.muzima.adapters.ListAdapter;
import com.muzima.api.model.Concept;
import com.muzima.api.model.Observation;
import com.muzima.api.model.Patient;
import com.muzima.controller.ConceptController;
import com.muzima.controller.EncounterController;
import com.muzima.controller.ObservationController;
import com.muzima.view.patients.PatientSummaryActivity;
import java.util.ArrayList;
import java.util.List;
public abstract class ObservationsAdapter<T> extends ListAdapter<T> {
private static final String TAG = "ObservationsAdapter";
protected final String patientUuid;
protected ConceptController conceptController;
protected EncounterController encounterController;
protected ObservationController observationController;
protected BackgroundListQueryTaskListener backgroundListQueryTaskListener;
private AsyncTask<?, ?, ?> backgroundQueryTask;
public BackgroundListQueryTaskListener getBackgroundListQueryTaskListener() {
return backgroundListQueryTaskListener;
}
public ObservationsAdapter(FragmentActivity context, int textViewResourceId,
EncounterController encounterController,
ConceptController conceptController, ObservationController observationController) {
super(context, textViewResourceId);
this.encounterController = encounterController;
this.conceptController = conceptController;
this.observationController = observationController;
Patient patient = (Patient) context.getIntent().getSerializableExtra(PatientSummaryActivity.PATIENT);
patientUuid = patient.getUuid();
}
public void setBackgroundListQueryTaskListener(BackgroundListQueryTaskListener backgroundListQueryTaskListener) {
this.backgroundListQueryTaskListener = backgroundListQueryTaskListener;
}
public void cancelBackgroundQueryTask(){
if(backgroundQueryTask != null){
backgroundQueryTask.cancel(true);
}
}
protected void setRunningBackgroundQueryTask(AsyncTask<?,?,?> backgroundQueryTask){
this.backgroundQueryTask = backgroundQueryTask;
}
protected abstract class ViewHolder{
protected LayoutInflater inflater;
protected LinearLayout observationLayout;
List<LinearLayout> observationViewHolders;
protected ViewHolder() {
observationViewHolders = new ArrayList<LinearLayout>();
inflater = LayoutInflater.from(getContext());
}
protected void addEncounterObservations(List<Observation> observations) {
for (int i = 0; i < observations.size(); i++) {
LinearLayout layout = getLinearLayoutForObservation(i);
Observation observation = observations.get(i);
setObservation(layout, observation);
}
shrink(observations.size());
}
protected LinearLayout getLinearLayoutForObservation(int i) {
LinearLayout layout;
if (observationViewHolders.size() <= i) {
layout = (LinearLayout) inflater.inflate(getObservationLayout(), null);
observationViewHolders.add(layout);
observationLayout.addView(layout);
} else {
layout = observationViewHolders.get(i);
}
setStyle(layout);
return layout;
}
protected abstract void setObservation(LinearLayout layout, Observation observation);
protected abstract int getObservationLayout();
private void shrink(int startIndex) {
List<LinearLayout> holdersToRemove = new ArrayList<LinearLayout>();
for (int i = startIndex; i < observationViewHolders.size(); i++) {
holdersToRemove.add(observationViewHolders.get(i));
}
removeObservations(holdersToRemove);
}
private void setStyle(LinearLayout layout) {
int observationPadding = (int) getContext().getResources().getDimension(R.dimen.observation_element_padding);
int width = (int) getContext().getResources().getDimension(getObservationElementHeight());
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, width);
layoutParams.setMargins(observationPadding, observationPadding, observationPadding, observationPadding);
layout.setLayoutParams(layoutParams);
}
protected abstract int getObservationElementHeight();
private void removeObservations(List<LinearLayout> holdersToRemove) {
observationViewHolders.removeAll(holdersToRemove);
for (LinearLayout linearLayout : holdersToRemove) {
observationLayout.removeView(linearLayout);
}
}
protected String getConceptDisplay(Concept concept) {
String text = concept.getName();
if(concept.getConceptType().getName().equals(Concept.NUMERIC_TYPE)){
text += " (" + concept.getUnit() +")";
}
return text;
}
}
}