package com.muzima.adapters.concept; import android.os.AsyncTask; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckedTextView; import android.widget.Toast; import com.muzima.R; import com.muzima.adapters.ListAdapter; import com.muzima.api.model.Provider; import com.muzima.controller.ProviderController; import com.muzima.view.preferences.ProviderPreferenceActivity; import java.util.Arrays; import java.util.List; /** * Created by vikas on 16/03/15. */ public class SelectedProviderAdapter extends ListAdapter<Provider> { private final String TAG = SelectedProviderAdapter.class.getSimpleName(); protected ProviderController providerController; public SelectedProviderAdapter(ProviderPreferenceActivity context, int textViewResourceId, ProviderController providerController) { super(context, textViewResourceId); this.providerController = providerController; } public boolean doesProviderAlreadyExist(Provider selectedProvider) { try { return providerController.getAllProviders().contains(selectedProvider); } catch (ProviderController.ProviderLoadException e) { Log.e(TAG, "Error while loading providers", e); } return false; } private class ViewHolder { private CheckedTextView name; private ViewHolder(View providerView) { name = (CheckedTextView) providerView.findViewById(R.id.provider_name); } } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(getContext()); convertView = layoutInflater.inflate(R.layout.item_provider_list, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } holder = (ViewHolder) convertView.getTag(); Provider provider = getItem(position); if (provider != null) { holder.name.setText(provider.getName()); } return convertView; } @Override public void remove(Provider provider) { super.remove(provider); try { providerController.deleteProvider(provider); } catch (ProviderController.ProviderDeleteException e) { Log.e(TAG, "Error while deleting the provider", e); } } public void removeAll(List<Provider> providersToDelete) { List<Provider> allProviders = null; try { allProviders = providerController.getAllProviders(); allProviders.removeAll(providersToDelete); try { providerController.deleteProviders(providersToDelete); } catch (ProviderController.ProviderDeleteException e) { Log.e(TAG, "Error while deleting the providers", e); } this.clear(); this.addAll(allProviders); } catch (ProviderController.ProviderLoadException e) { Log.e(TAG, "Error while fetching the providers", e); } } @Override public void reloadData() { new BackgroundSaveAndQueryTask().execute(); } /** * Responsible to save the providers into DB on selection from AutoComplete. And also fetches to Providers from DB to display in the page. */ public class BackgroundSaveAndQueryTask extends AsyncTask<Provider, Void, List<Provider>> { @Override protected List<Provider> doInBackground(Provider... providers) { List<Provider> selectedProviders = null; List<Provider> providersList = Arrays.asList(providers); try { if (providers.length > 0) { // Called with Provider which is selected in the AutoComplete menu. providerController.saveProviders(providersList); } if(providerController.newProviders().size() > 0){ // called when new providers are downloaded as part of new form template return providerController.newProviders(); } try { selectedProviders = providerController.getAllProviders(); } catch (ProviderController.ProviderLoadException e) { Log.w(TAG, "Exception occurred while fetching providers from local data repository!", e); } } catch (ProviderController.ProviderSaveException e) { Log.w(TAG, "Exception occurred while saving provider to local data repository!", e); } return selectedProviders; } @Override protected void onPostExecute(List<Provider> providers) { if (providers == null) { Toast.makeText(getContext(), getContext().getString(R.string.error_provider_fetch), Toast.LENGTH_SHORT).show(); return; } clear(); addAll(providers); notifyDataSetChanged(); } } public void addProvider(Provider provider) { new BackgroundSaveAndQueryTask().execute(provider); } public void clearSelectedProviders() { notifyDataSetChanged(); } }