package edu.mit.mitmobile2.dining; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Set; import android.annotation.SuppressLint; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.NewModuleActivity; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.SimpleArrayAdapter; import edu.mit.mitmobile2.dining.DiningModel.DailyMeals; import edu.mit.mitmobile2.dining.DiningModel.DailyMealsSchedule; import edu.mit.mitmobile2.dining.DiningModel.DiningVenues; import edu.mit.mitmobile2.dining.DiningModel.HouseDiningHall; @SuppressLint("DefaultLocale") public class DiningHouseInfoActivity extends NewModuleActivity { private static String HOUSE_DINING_HALL_ID_KEY = "hall_id"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dining_hall_house_info); DiningVenues venues = DiningModel.getDiningVenues(); if (venues == null) { // fail gracefully finish(); return; } String houseID = getIntent().getStringExtra(HOUSE_DINING_HALL_ID_KEY); final HouseDiningHall house = venues.getHouseDiningHall(houseID); long selectedTime = DiningModel.currentTimeMillis(); DiningHallHeaderView headerView = (DiningHallHeaderView) findViewById(R.id.diningHallHouseInfoHeader); headerView.setHall(house, selectedTime); headerView.setBackgroundColor(Color.TRANSPARENT); ListView infoLV = (ListView) findViewById(R.id.diningHallHouseInfoTopLV); infoLV.setAdapter(new SimpleArrayAdapter<InfoItem>(this, getHouseInfo(house), R.layout.dining_hall_info_item_row) { @Override public void updateView(InfoItem item, View view) { TextView label = (TextView) view.findViewById(R.id.diningHallInfoLabel); TextView value = (TextView) view.findViewById(R.id.diningHallInfoValue); ImageView img = (ImageView) view.findViewById(R.id.diningInfoItemRowActionIcon); label.setText(item.getInfoLabel()); value.setText(item.getInfoValue()); if (item.getInfoActionId() > 0) { img.setVisibility(View.VISIBLE); img.setImageResource(item.getInfoActionId()); } else { img.setVisibility(View.GONE); } } @Override public boolean isEnabled(int position) { return position == 0; // only location position is enabled } @Override public boolean areAllItemsEnabled() { return true; // need to be true so dividers show up } }); infoLV.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { if (position == 0) { String locationName = house.getLocation().mDescription; String url = "mitmobile://map/search?" + locationName; CommonActions.doAction(DiningHouseInfoActivity.this, url); } } }); List <ScheduleItem> schedules = getHouseSchedule(house); Log.d("INFOSCHEDULE", "Schedules size :: "+schedules.size()); ListView scheduleLV = (ListView) findViewById(R.id.diningHallHouseInfoScheduleLV); scheduleLV.setAdapter(new SimpleArrayAdapter<ScheduleItem>(this, schedules, R.layout.dining_hall_house_schedule_item_row) { @Override public void updateView(ScheduleItem item, View view) { TextView label = (TextView) view.findViewById(R.id.diningHallInfoLabel); TextView mealTV = (TextView) view.findViewById(R.id.diningScheduleMealName); TextView timeTV = (TextView) view.findViewById(R.id.diningScheduleMealTimes); label.setText(item.getSpanString()); String mealName = item.getMealNameString(); if (!mealName.isEmpty()) { mealTV.setText(item.getMealNameString()); } else { mealTV.setText("Closed"); } timeTV.setText(item.getMealTimeString()); } }); } private List<InfoItem> getHouseInfo(HouseDiningHall hall) { InfoItem locationInfo = new InfoItem(getString(R.string.dining_location_info_label), hall.getLocation().mDescription, R.drawable.action_map); InfoItem paymentInfo = new InfoItem(getString(R.string.dining_payment_info_label), hall.getPaymentOptionString(), 0); ArrayList<InfoItem> list = new ArrayList<InfoItem>(); list.add(locationInfo); list.add(paymentInfo); return list; } private List<ScheduleItem> getHouseSchedule(HouseDiningHall hall) { long selectedTime = DiningModel.currentTimeMillis(); GregorianCalendar cal = new GregorianCalendar(); cal.setTimeInMillis(selectedTime); DailyMealsSchedule mealSchedule = hall.getSchedule(); List<DailyMeals> days = mealSchedule.getDailyMealsForCurrentWeek(cal); DailyMeals previousDay = null; ArrayList <ScheduleItem> scheduleLists = new ArrayList<ScheduleItem>(); for (DailyMeals mealDay : days) { if (previousDay == null) { // first time through loop add day, set previousDay. ScheduleItem item = new ScheduleItem(); item.setStartDay(mealDay.getDay()); item.setEndDay(mealDay.getDay()); item.setMealSummary(mealDay.getMealTimes()); scheduleLists.add(item); } else { long oneDayInMillis = 60 * 60 * 24 * 1000; if (DiningModel.compareDates(previousDay.getDay(), mealDay.getDay()) <= oneDayInMillis) { // day is adjacent, need to compare schedules ScheduleItem lastSchedule = scheduleLists.get(scheduleLists.size() - 1); if (lastSchedule.getMealSummary().equals(mealDay.getMealTimes())) { // comparison is equal, need to bump last schedule end date lastSchedule.setEndDay(mealDay.getDay()); } else { // comparison is not equal add new schedule item ScheduleItem item = new ScheduleItem(); item.setStartDay(mealDay.getDay()); item.setEndDay(mealDay.getDay()); item.setMealSummary(mealDay.getMealTimes()); scheduleLists.add(item); } } else { // days are not adjacent, add new ScheduleItem ScheduleItem item = new ScheduleItem(); item.setStartDay(mealDay.getDay()); item.setEndDay(mealDay.getDay()); item.setMealSummary(mealDay.getMealTimes()); scheduleLists.add(item); } } previousDay = mealDay; // update reference for look behind } return scheduleLists; } @Override protected NewModule getNewModule() { return new DiningModule(); } @Override protected boolean isScrollable() { return false; } @Override protected List<String> getMenuItemBlackList() { ArrayList<String> list = new ArrayList<String>(); list.add(DiningModule.FILTER_ITEM_ID); list.add(DiningModule.LISTVIEW_ITEM_ID); list.add(DiningModule.MAPVIEW_ITEM_ID); return list; } @Override protected void onOptionSelected(String optionId) { } @Override protected boolean isModuleHomeActivity() { return false; } /****************************************************/ /*** Helper Object Definitions ***********/ /****************************************************/ private static class ScheduleItem { private Calendar mStartDay; private Calendar mEndDay; private HashMap<String, String> mMealSummary; static SimpleDateFormat sFormat = new SimpleDateFormat("EEE", Locale.US); // public Calendar getStartDay() { // return mStartDay; // } // // public Calendar getEndDay() { // return mEndDay; // } public HashMap<String, String> getMealSummary() { return mMealSummary; } public void setStartDay(Calendar start) { mStartDay = start; } public void setEndDay(Calendar end) { mEndDay = end; } public void setMealSummary(HashMap<String, String> map) { mMealSummary = map; } @SuppressLint("DefaultLocale") public String getSpanString() { if (DiningModel.compareDates(mStartDay, mEndDay) == 0) { String daySpan = sFormat.format(mStartDay.getTime()); return daySpan.toLowerCase(Locale.ENGLISH); } String startStr = sFormat.format(mStartDay.getTime()); String endStr = sFormat.format(mEndDay.getTime()); return startStr.toLowerCase(Locale.ENGLISH) + " - " + endStr.toLowerCase(); } public String getMealNameString() { Set<String> mealStrings = mMealSummary.keySet(); String nameString = ""; int i = 0; int lastIndex = mealStrings.size() - 1; for (String s : mealStrings) { nameString += s; if (i != lastIndex ) nameString += "\n"; i++; } return nameString; } public String getMealTimeString() { Collection<String> values = mMealSummary.values(); String timeString = ""; int i = 0; int lastIndex = values.size() - 1; for (String s : values) { timeString += s; if (i != lastIndex) timeString += "\n"; i++; } return timeString; } } }