package org.ohmage.ui; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager.LoaderCallbacks; import java.util.Calendar; import java.util.GregorianCalendar; /** * The {@link OhmageFilterable} class contains definitions for all the filterable options available to the data * and simple implementations to make them easier to use * @author cketcham * */ public class OhmageFilterable { public static interface CampaignFilterable { public void setCampaignUrn(String campaignUrn); public String getCampaignUrn(); } public static class CampaignFilter implements CampaignFilterable { public static final String EXTRA_CAMPAIGN_URN = "extra_campaign_urn"; private String mCampaignUrn; public CampaignFilter(Bundle args) { if(args != null && args.containsKey(EXTRA_CAMPAIGN_URN)) mCampaignUrn = args.getString(EXTRA_CAMPAIGN_URN); } @Override public void setCampaignUrn(String campaignUrn) { mCampaignUrn = campaignUrn; } @Override public String getCampaignUrn() { return mCampaignUrn; } } public static interface SurveyFilterable { public void setSurveyId(String surveyId); public String getSurveyId(); } public static class CampaignSurveyFilter implements CampaignFilterable, SurveyFilterable { public static final String EXTRA_SURVEY_ID = "extra_survey_id"; private final CampaignFilter mCampaignFilter; private String mSurveyId; public CampaignSurveyFilter(Bundle args) { mCampaignFilter = new CampaignFilter(args); if(args != null && args.containsKey(EXTRA_SURVEY_ID)) mSurveyId = args.getString(EXTRA_SURVEY_ID); } @Override public void setSurveyId(String surveyId) { mSurveyId = surveyId; } @Override public String getSurveyId() { return mSurveyId; } @Override public void setCampaignUrn(String campaignUrn) { mCampaignFilter.setCampaignUrn(campaignUrn); mSurveyId = null; } @Override public String getCampaignUrn() { return mCampaignFilter.getCampaignUrn(); } } public static interface TimeFilterable { /** * Returns the time in milliseconds of the time bounds (inclusive) * @return */ public long getStartBounds(); /** * Returns the time in milliseconds of the end bounds (inclusive) * @return */ public long getEndBounds(); public void setDate(int day, int month, int year); public void setMonth(int month, int year); public int getMonth(); public int getYear(); } public static class TimeFilter implements TimeFilterable { public static final String EXTRA_DAY = "extra_day"; public static final String EXTRA_MONTH = "extra_month"; public static final String EXTRA_YEAR = "extra_year"; private int mMonth; private int mYear; private int mDate; private int mCalendarUnit; public TimeFilter(Bundle args) { Calendar calendar = Calendar.getInstance(); int month = calendar.get(Calendar.MONTH); int year = calendar.get(Calendar.YEAR); if(args != null && args.containsKey(EXTRA_MONTH)) month = args.getInt(EXTRA_MONTH); if(args != null && args.containsKey(EXTRA_YEAR)) year = args.getInt(EXTRA_YEAR); if(args != null && args.containsKey(EXTRA_DAY)) setDate(args.getInt(EXTRA_DAY), month, year); else setMonth(month, year); } @Override public void setDate(int day, int month, int year) { mDate = day; mMonth = month; mYear = year; mCalendarUnit = Calendar.DATE; } @Override public void setMonth(int month, int year) { mDate = 1; mMonth = month; mYear = year; mCalendarUnit = Calendar.MONTH; } protected GregorianCalendar getCalendar() { return new GregorianCalendar(mYear, mMonth, mDate); } @Override public long getStartBounds() { return getCalendar().getTimeInMillis(); } @Override public long getEndBounds() { GregorianCalendar calendar = getCalendar(); calendar.add(mCalendarUnit, 1); return calendar.getTimeInMillis() - 1; } @Override public int getMonth() { return mMonth; } @Override public int getYear() { return mYear; } } public interface FilterableFragmentLoader extends CampaignFilterable, SurveyFilterable, TimeFilterable, LoaderCallbacks<Cursor> { public FragmentActivity getActivity(); } }