package edu.mit.mitmobile2.dining; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.text.TextUtils.TruncateAt; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.webkit.WebView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.DividerView; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.NewModuleActivity; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.StyledContentHTML; import edu.mit.mitmobile2.dining.DiningModel.DiningHall; import edu.mit.mitmobile2.dining.DiningModel.DiningVenues; import edu.mit.mitmobile2.dining.DiningModel.RetailDiningHall; import edu.mit.mitmobile2.dining.DiningModel.RetailDiningHall.DailyHours; public class DiningRetailInfoActivity extends NewModuleActivity { private static String HOUSE_DINING_HALL_ID_KEY = "hall_id"; private ArrayList<RetailDiningHall> mBookmarkedHalls; private RetailDiningHall mHall; private DiningHallHeaderView mHeaderView; public static void launch(Context context, DiningHall diningHall) { if (diningHall instanceof RetailDiningHall) { Intent intent = new Intent(context, DiningRetailInfoActivity.class); intent.putExtra(HOUSE_DINING_HALL_ID_KEY, diningHall.getID()); context.startActivity(intent); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dining_hall_retail_info); mBookmarkedHalls = new ArrayList<RetailDiningHall>(RetailDiningHall.getBookmarks(this)); DiningVenues venues = DiningModel.getDiningVenues(); if (venues == null) { // fail gracefully finish(); return; } String houseID = getIntent().getStringExtra(HOUSE_DINING_HALL_ID_KEY); mHall = venues.getRetailDiningHall(houseID); long selectedTime = DiningModel.currentTimeMillis(); mHeaderView = (DiningHallHeaderView) findViewById(R.id.diningHallHouseInfoHeader); mHeaderView.setHall(mHall, selectedTime); mHeaderView.setBackgroundColor(Color.TRANSPARENT); mHeaderView.setActionClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mBookmarkedHalls.contains(mHall)) { mBookmarkedHalls.remove(mHall); RetailDiningHall.saveBookmarks(DiningRetailInfoActivity.this, mBookmarkedHalls); mHeaderView.setActionImageResourceId(R.drawable.dining_bookmark); } else { mBookmarkedHalls.add(mHall); RetailDiningHall.saveBookmarks(DiningRetailInfoActivity.this, mBookmarkedHalls); mHeaderView.setActionImageResourceId(R.drawable.dining_bookmark_selected); } } }); layoutDescription(); layoutMenu(); layoutScheduleList(); layoutInfoList(); } @SuppressLint("SetJavaScriptEnabled") private void layoutDescription() { WebView descriptionWV = (WebView)findViewById(R.id.retailDescriptionTV); if (mHall.getDescriptionHtml() != null && !mHall.getDescriptionHtml().isEmpty()) { HashMap<String, String> content = new HashMap<String, String>(); content.put("BODY", mHall.getDescriptionHtml()); String html = StyledContentHTML.populateTemplate(this, "dining/announcement.html", content); descriptionWV.getSettings().setJavaScriptEnabled(true); descriptionWV.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); } else { descriptionWV.setVisibility(View.GONE); } } private void layoutMenu() { View row = findViewById(R.id.menuItemRow); row.setBackgroundResource(R.drawable.highlight_background); int padding = getResources().getDimensionPixelSize(R.dimen.standardPadding); row.setPadding(padding, padding, padding, padding); TextView rowLabel = (TextView) row.findViewById(R.id.diningHallInfoLabel); TextView rowValue = (TextView) row.findViewById(R.id.diningHallInfoValue); ImageView rowAction = (ImageView) row.findViewById(R.id.diningInfoItemRowActionIcon); rowLabel.setText(getString(R.string.dining_menu_info_label)); boolean tempHasMenu = false; if (mHall.getMenuUrl() != null && !mHall.getMenuUrl().isEmpty()) { tempHasMenu = true; rowValue.setText(stripUrlScheme(mHall.getMenuUrl())); rowValue.setEllipsize(TruncateAt.END); rowValue.setSingleLine(true); rowAction.setImageResource(R.drawable.action_external); } else if (mHall.getMenuHtml() != null && !mHall.getMenuHtml().isEmpty()) { tempHasMenu = false; rowAction.setImageResource(R.drawable.action_external); } else { View rowWrapper = findViewById(R.id.menuItemRowWrapper); rowWrapper.setVisibility(View.GONE); } final boolean isExternalMenu = tempHasMenu; row.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isExternalMenu) { // view web page CommonActions.viewURL(DiningRetailInfoActivity.this, mHall.getMenuUrl()); } else { // go to description page SimpleSingleWebViewActivity.launch(DiningRetailInfoActivity.this, mHall.getMenuHtml()); } } }); } private void layoutScheduleList() { LinearLayout scheduleContainer = (LinearLayout)findViewById(R.id.diningHallInfoScheduleContainer); List<ScheduleItem> items = getScheduleInfo(); if (items.size() == 0) { scheduleContainer.setVisibility(View.GONE); return; } LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); boolean first = true; for (ScheduleItem item : items) { // add separator if (!first) { scheduleContainer.addView(new DividerView(this, null)); } else { first = false; } View view = inflater.inflate(R.layout.dining_hall_info_item_row, null); view.setBackgroundColor(Color.WHITE); TextView label = (TextView) view.findViewById(R.id.diningHallInfoLabel); TextView value = (TextView) view.findViewById(R.id.diningHallInfoValue); ImageView img = (ImageView) view.findViewById(R.id.diningInfoItemRowActionIcon); img.setVisibility(View.GONE); if (item.dayStart.getDayAbbreviation().equals(item.dayEnd.getDayAbbreviation())) { label.setText(item.dayStart.getDayAbbreviation()); } else { label.setText(item.dayStart.getDayAbbreviation() + " - " + item.dayEnd.getDayAbbreviation()); } value.setText(item.dayStart.getScheduleSpan()); scheduleContainer.addView(view); } } private void layoutInfoList() { LinearLayout infoContainer = (LinearLayout)findViewById(R.id.diningHallInfoContainer); LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); int standardPadding = getResources().getDimensionPixelOffset(R.dimen.standardPadding); for (InfoItem item : getHallInfo()) { LinearLayout itemLayout = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); itemLayout.setBackgroundColor(Color.WHITE); params.bottomMargin = standardPadding; itemLayout.setLayoutParams(params); View view = inflater.inflate(R.layout.dining_hall_info_item_row, null); 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); } if (item.getInfoActionId() == R.drawable.action_map || item.getInfoActionId() == R.drawable.action_external) { final InfoItem clickItem = item; view.setBackgroundResource(R.drawable.highlight_background); view.setPadding(standardPadding, standardPadding, standardPadding, standardPadding); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (clickItem.getInfoActionId() == R.drawable.action_map) { String locationName = mHall.getLocation().mDescription; String url = "mitmobile://map/search?" + locationName; CommonActions.doAction(DiningRetailInfoActivity.this, url); } else if (clickItem.getInfoActionId() == R.drawable.action_external) { CommonActions.viewURL(DiningRetailInfoActivity.this, mHall.getHomePageUrl()); } } }); } if (item.isSingleLine()) { value.setEllipsize(TruncateAt.END); value.setSingleLine(true); } itemLayout.addView(view); infoContainer.addView(itemLayout); } } private List<ScheduleItem> getScheduleInfo() { List<DailyHours> schedule = mHall.getDailyHours(); ArrayList<ScheduleItem> items = new ArrayList<ScheduleItem>(); ScheduleItem previousItem = null; for (DailyHours hours : schedule) { if (previousItem == null) { // first time through, add schedule item ScheduleItem item = new ScheduleItem(); item.dayStart = hours; item.dayEnd = hours; items.add(item); previousItem = item; } else { int dayDiff = (7 + hours.getDay().get(Calendar.DAY_OF_WEEK) - previousItem.dayEnd.getDay().get(Calendar.DAY_OF_WEEK)) % 7; if (previousItem.dayEnd.getScheduleSpan().equals(hours.getScheduleSpan()) && dayDiff == 1) { // schedule span is equal update previous item daySpan and days are adjacent items.get(items.size() - 1).dayEnd = hours; previousItem = items.get(items.size() - 1); } else { // schedule item is not equal, or not adjacent, add new item to list and update previous item ScheduleItem item = new ScheduleItem(); item.dayStart = hours; item.dayEnd = hours; items.add(item); previousItem = item; } } } return items; } private List<InfoItem> getHallInfo() { ArrayList<InfoItem> items = new ArrayList<InfoItem>(); if (mHall.getCuisineString() != null && !mHall.getCuisineString().isEmpty()) { items.add(new InfoItem(getString(R.string.dining_cuisine_info_label), mHall.getCuisineString(), 0)); } if (mHall.getPaymentOptions() != null && !mHall.getPaymentOptions().isEmpty()) { items.add(new InfoItem(getString(R.string.dining_payment_info_label), mHall.getPaymentOptionString(), 0)); } if (mHall.getLocation().mDescription != null && !mHall.getLocation().mDescription.isEmpty()) { items.add(new InfoItem(getString(R.string.dining_location_info_label), mHall.getLocation().mDescription, R.drawable.action_map)); } if (mHall.getHomePageUrl() != null && !mHall.getHomePageUrl().isEmpty()) { items.add(new InfoItem(getString(R.string.dining_home_page_info_label), stripUrlScheme(mHall.getHomePageUrl()), R.drawable.action_external, true)); } return items; } private String stripUrlScheme(String url) { if (url.startsWith("http://")) { url = url.substring(7); } else if (url.startsWith("https://")) { url = url.substring(8); } return url; } @Override public void onResume() { super.onResume(); if (mBookmarkedHalls.contains(mHall)) { mHeaderView.setActionImageResourceId(R.drawable.dining_bookmark_selected); } else { mHeaderView.setActionImageResourceId(R.drawable.dining_bookmark); } } @Override protected NewModule getNewModule() { return new DiningModule(); } @Override protected boolean isScrollable() { return true; } @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; } private static class ScheduleItem { public DailyHours dayStart; public DailyHours dayEnd; } }