package org.ohmage.fragments;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.view.Gravity;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import org.ohmage.ConfigHelper;
import org.ohmage.R;
import org.ohmage.activity.SubActionClickListener;
import org.ohmage.adapters.SurveyListCursorAdapter;
import org.ohmage.db.DbContract.Campaigns;
import org.ohmage.db.DbContract.Surveys;
import org.ohmage.db.Models.Survey;
import org.ohmage.db.utils.SelectionBuilder;
import org.ohmage.logprobe.Analytics;
import org.ohmage.ui.OhmageFilterable.CampaignFilter;
/**
* <p>The {@link SurveyListFragment} shows a list of surveys</p>
*
* <p>The {@link SurveyListFragment} accepts {@link CampaignFilter#EXTRA_CAMPAIGN_URN} as an extra</p>
* @author cketcham
*
*/
public class SurveyListFragment extends FilterableListFragment implements SubActionClickListener {
/**
* Pass in the arguments to determine if this should show the pending surveys or all surveys.
* true for pending, false for all
*/
public static final String KEY_PENDING = "key_pending";
private static final String TAG = "SurveyListFragment";
private boolean mShowPending = false;
private CursorAdapter mAdapter;
private OnSurveyActionListener mListener;
public interface OnSurveyActionListener {
public void onSurveyActionView(Uri surveyUri);
public void onSurveyActionStart(Uri surveyUri);
public void onSurveyActionUnavailable(Uri surveyUri);
public void onSurveyActionError(Uri surveyUri, int status);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getArguments() != null)
mShowPending = getArguments().getBoolean(KEY_PENDING, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setShowPending();
// style the empty text
TextView emptyView = (TextView)getListView().getEmptyView();
emptyView.setGravity(Gravity.LEFT);
emptyView.setPadding(25, 25, 25, 0);
mAdapter = new SurveyListCursorAdapter(getActivity(), null, this, 0);
setListAdapter(mAdapter);
// Start out with a progress indicator.
setListShown(false);
getLoaderManager().initLoader(0, null, this);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnSurveyActionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnSurveyActionListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Cursor cursor = (Cursor) getListAdapter().getItem(position);
String campaignUrn = cursor.getString(cursor.getColumnIndex(Surveys.CAMPAIGN_URN));
String surveyId = cursor.getString(cursor.getColumnIndex(Surveys.SURVEY_ID));
Analytics.widget(v, null, campaignUrn + ":" + surveyId);
Uri uri = Campaigns.buildSurveysUri(campaignUrn, surveyId);
mListener.onSurveyActionView(uri);
}
@Override
public void onSubActionClicked(Uri uri) {
if(uri == null)
mListener.onSurveyActionError(uri, 0);
else
mListener.onSurveyActionStart(uri);
// mListener.onSurveyActionUnavailable();
}
public void setShowPending(boolean showPending) {
mShowPending = showPending;
if(isVisible()) {
setShowPending();
getLoaderManager().restartLoader(0, null, this);
}
}
private void setShowPending() {
if (mShowPending) {
if(ConfigHelper.isSingleCampaignMode())
setEmptyText(getString(R.string.surveys_empty_pending_single));
else
setEmptyText(getString(R.string.surveys_empty_pending));
} else {
if(ConfigHelper.isSingleCampaignMode())
setEmptyText(getString(R.string.single_campaign_error));
else
setEmptyText(getString(R.string.surveys_empty_all));
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = Surveys.CONTENT_URI;
SelectionBuilder builder = new SelectionBuilder();
if (getCampaignUrn() != null) {
baseUri = Campaigns.buildSurveysUri(getCampaignUrn());
}
if (mShowPending) {
builder.where(Surveys.SURVEY_STATUS + "=" + Survey.STATUS_TRIGGERED);
}
return new CursorLoader(getActivity(), baseUri, null, builder.getSelection(), builder.getSelectionArgs(), Surveys._ID);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}