package org.ohmage.fragments;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
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.R;
import org.ohmage.activity.SubActionClickListener;
import org.ohmage.adapters.CampaignListCursorAdapter;
import org.ohmage.db.DbContract.Campaigns;
import org.ohmage.db.Models.Campaign;
import org.ohmage.logprobe.Analytics;
import org.ohmage.logprobe.Log;
public class CampaignListFragment extends ListFragment implements SubActionClickListener, LoaderCallbacks<Cursor> {
private static final String TAG = "CampaignListFragment";
public static final int MODE_MY_CAMPAIGNS = 0;
public static final int MODE_ADD_CAMPAIGNS = 1;
private static final String EXTRA_MODE = "extra_mode";
private int mMode = MODE_MY_CAMPAIGNS;
private CursorAdapter mAdapter;
private OnCampaignActionListener mListener;
public interface OnCampaignActionListener {
public void onCampaignActionView(String campaignUrn);
public void onCampaignActionDownload(String campaignUrn);
public void onCampaignActionSurveys(String campaignUrn);
public void onCampaignActionError(String campaignUrn, int status);
}
public static Fragment newInstance(int mode) {
CampaignListFragment f = new CampaignListFragment();
Bundle args = new Bundle();
args.putInt(EXTRA_MODE, mode);
f.setArguments(args);
return f;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(getArguments() != null && getArguments().containsKey(EXTRA_MODE))
mMode = getArguments().getInt(EXTRA_MODE);
switch(mMode) {
case MODE_ADD_CAMPAIGNS:
setEmptyText(getActivity().getString(R.string.campaign_add_list_empty));
break;
case MODE_MY_CAMPAIGNS:
setEmptyText(getActivity().getString(R.string.campaign_list_empty));
break;
}
// style the empty text, too
TextView emptyView = (TextView)getListView().getEmptyView();
emptyView.setGravity(Gravity.LEFT);
emptyView.setPadding(25, 25, 25, 0);
mAdapter = new CampaignListCursorAdapter(getActivity(), null, this, 0);
setListAdapter(mAdapter);
// Start out with a progress indicator.
setListShown(false);
getLoaderManager().initLoader(0, null, this);
}
// TODO: we may need to override onCreateView here to load up a layout with a customized empty text view, too
// consult FilterableListFragment for an example
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnCampaignActionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnCampaignActionListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Cursor c = (Cursor) getListAdapter().getItem(position);
String campaignUrn = c.getString(c.getColumnIndex(Campaigns.CAMPAIGN_URN));
Analytics.widget(v, null, campaignUrn);
mListener.onCampaignActionView(campaignUrn);
}
@Override
public void onSubActionClicked(Uri uri) {
Cursor cursor = null;
try {
cursor = getActivity().getContentResolver().query(uri, new String [] {Campaigns._ID, Campaigns.CAMPAIGN_URN, Campaigns.CAMPAIGN_STATUS}, null, null, null);
if (cursor.getCount() == 1) {
cursor.moveToFirst();
String campaignUrn = cursor.getString(cursor.getColumnIndexOrThrow(Campaigns.CAMPAIGN_URN));
int status = cursor.getInt(cursor.getColumnIndexOrThrow(Campaigns.CAMPAIGN_STATUS));
switch (status) {
case Campaign.STATUS_REMOTE:
mListener.onCampaignActionDownload(campaignUrn);
break;
case Campaign.STATUS_READY:
mListener.onCampaignActionSurveys(campaignUrn);
break;
case Campaign.STATUS_STOPPED:
case Campaign.STATUS_OUT_OF_DATE:
case Campaign.STATUS_INVALID_USER_ROLE:
case Campaign.STATUS_NO_EXIST:
case Campaign.STATUS_VAGUE:
mListener.onCampaignActionError(campaignUrn, status);
break;
case Campaign.STATUS_DOWNLOADING:
//do nothing while downloading
break;
default:
//campaign is in some unknown state!
break;
}
} else {
Log.e(TAG, "onSubActionClicked: more than one campaign read from content provider!");
}
}
finally {
if (cursor != null)
cursor.close();
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = Campaigns.CONTENT_URI;
String select;
if (mMode == MODE_ADD_CAMPAIGNS) {
select = Campaigns.CAMPAIGN_STATUS + " = " + Campaign.STATUS_REMOTE + " OR " + Campaigns.CAMPAIGN_STATUS + " = " + Campaign.STATUS_DOWNLOADING;
} else {
select = Campaigns.CAMPAIGN_STATUS + " != " + Campaign.STATUS_REMOTE + " AND " + Campaigns.CAMPAIGN_STATUS + " != " + Campaign.STATUS_DOWNLOADING;
}
return new CursorLoader(getActivity(), baseUri, new String [] {Campaigns._ID, Campaigns.CAMPAIGN_URN, Campaigns.CAMPAIGN_NAME, Campaigns.CAMPAIGN_STATUS, Campaigns.CAMPAIGN_ICON}, select, null, Campaigns.CAMPAIGN_NAME);
}
@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);
}
}