/* * 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.forms; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.muzima.MuzimaApplication; import com.muzima.R; import com.muzima.api.model.Tag; import com.muzima.controller.FormController; import com.muzima.model.AvailableForm; import com.muzima.model.collections.AvailableForms; import com.muzima.utils.StringUtils; import com.muzima.service.MuzimaSyncService; import com.muzima.tasks.FormsAdapterBackgroundQueryTask; import java.util.ArrayList; import java.util.List; /** * Responsible to list down all the available forms in the server including Tags and img to indicate whether downloaded or not. */ public class AllAvailableFormsAdapter extends FormsAdapter<AvailableForm> implements TagsListAdapter.TagsChangedListener { private static final String TAG = "AllAvailableFormsAdapter"; private final MuzimaSyncService muzimaSyncService; public AllAvailableFormsAdapter(Context context, int textViewResourceId, FormController formController) { super(context, textViewResourceId, formController); muzimaSyncService = ((MuzimaApplication) (getContext().getApplicationContext())).getMuzimaSyncService(); } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = super.getView(position, convertView, parent); ViewHolder viewHolder = (ViewHolder) convertView.getTag(); addTags(viewHolder, getItem(position)); markIfDownloaded(viewHolder.downloadedImg, getItem(position)); return convertView; } @Override protected int getFormItemLayout() { return R.layout.item_forms_list_selectable; } private void markIfDownloaded(View downloadedImg, AvailableForm form) { if (form.isDownloaded()) { downloadedImg.setVisibility(View.VISIBLE); } else { downloadedImg.setVisibility(View.GONE); } } protected void addTags(ViewHolder holder, AvailableForm form) { Tag[] tags = form.getTags(); if (tags.length > 0) { holder.tagsScroller.setVisibility(View.VISIBLE); LayoutInflater layoutInflater = LayoutInflater.from(getContext()); //add update tags for (int i = 0; i < tags.length; i++) { TextView textView = null; if (holder.tags.size() <= i) { textView = newTextView(layoutInflater); holder.addTag(textView); } textView = holder.tags.get(i); textView.setBackgroundColor(formController.getTagColor(tags[i].getUuid())); List<Tag> selectedTags = formController.getSelectedTags(); if (selectedTags.isEmpty() || selectedTags.contains(tags[i])) { textView.setText(tags[i].getName()); } else { textView.setText(StringUtils.EMPTY); } } //remove existing extra tags which are present because of recycled list view if (tags.length < holder.tags.size()) { List<TextView> tagsToRemove = new ArrayList<TextView>(); for (int i = tags.length; i < holder.tags.size(); i++) { tagsToRemove.add(holder.tags.get(i)); } holder.removeTags(tagsToRemove); } } else { holder.tagsScroller.setVisibility(View.GONE); } } private TextView newTextView(LayoutInflater layoutInflater) { TextView textView = (TextView) layoutInflater.inflate(R.layout.tag, null, false); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT); layoutParams.setMargins(1, 0, 0, 0); textView.setLayoutParams(layoutParams); return textView; } public void clearSelectedForms() { notifyDataSetChanged(); } @Override public void reloadData() { new BackgroundQueryTask(this).execute(); } public void downloadFormTemplatesAndReload() { new DownloadBackgroundQueryTask(this).execute(); } @Override public void onTagsChanged() { reloadData(); } /** * Responsible to download all the form names based on Tags from Server. */ public class DownloadBackgroundQueryTask extends FormsAdapterBackgroundQueryTask<AvailableForm> { public DownloadBackgroundQueryTask(FormsAdapter adapter) { super(adapter); } @Override protected AvailableForms doInBackground(Void... voids) { AvailableForms allForms = null; if (adapterWeakReference.get() != null) { try { FormsAdapter formsAdapter = adapterWeakReference.get(); muzimaSyncService.downloadForms(); allForms = formsAdapter.getFormController().getAvailableFormByTags(getSelectedTagUuids()); Log.i(TAG, "#Forms: " + allForms.size()); } catch (FormController.FormFetchException e) { Log.w(TAG, "Exception occurred while fetching local forms ", e); } } return allForms; } } /** * Responsible to fetch the forms from the local DB based on the selected tags. */ public class BackgroundQueryTask extends FormsAdapterBackgroundQueryTask<AvailableForm> { public BackgroundQueryTask(FormsAdapter formsAdapter) { super(formsAdapter); } @Override protected AvailableForms doInBackground(Void... voids) { AvailableForms allForms = null; if (adapterWeakReference.get() != null) { try { FormsAdapter formsAdapter = adapterWeakReference.get(); allForms = formsAdapter.getFormController().getAvailableFormByTags(getSelectedTagUuids(), true); Log.i(TAG, "#Forms: " + allForms.size()); } catch (FormController.FormFetchException e) { Log.w(TAG, "Exception occurred while fetching local forms.", e); } } return allForms; } } }