package edu.mit.mitmobile2.dining; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher; import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher.OnRefreshListener; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.SpannableString; import android.text.style.ImageSpan; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TabHost; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.DividerView; import edu.mit.mitmobile2.FullScreenLoader; import edu.mit.mitmobile2.MobileWebApi; import edu.mit.mitmobile2.NewModule; import edu.mit.mitmobile2.NewModuleActivity; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.RemoteImageView; import edu.mit.mitmobile2.SectionHeader; import edu.mit.mitmobile2.TabConfigurator; import edu.mit.mitmobile2.TwoLineActionRow; import edu.mit.mitmobile2.dining.DiningModel.DiningHall; import edu.mit.mitmobile2.dining.DiningModel.DiningLink; import edu.mit.mitmobile2.dining.DiningModel.DiningVenues; import edu.mit.mitmobile2.dining.DiningModel.HouseDiningHall; import edu.mit.mitmobile2.dining.DiningModel.RetailDiningHall; import edu.mit.mitmobile2.facilities.FacilitiesDB; import edu.mit.mitmobile2.facilities.FacilitiesDB.LocationTable; public class DiningHomeActivity extends NewModuleActivity implements OnRefreshListener { public static final String SELECTED_TAB = "dining.selected_tab"; private static int MAP_ACTIVITY_REQUEST_CODE = 1; FullScreenLoader mLoader; DiningVenues mVenues; TabHost mTabHost; private DiningHomeActivity mContext; private FacilitiesDB mFacilitiesDB; private PullToRefreshAttacher mPullToRefreshAttacher; @Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.dining_home); mContext = this; mLoader = (FullScreenLoader) findViewById(R.id.diningHomeLoader); mLoader.showLoading(); // prepare tabs mTabHost = (TabHost) findViewById(R.id.diningHomeTabHost); mTabHost.setup(); TabConfigurator tabConfigurator = new TabConfigurator(this, mTabHost); tabConfigurator.addTab("HOUSE DINING", R.id.diningHomeHouseTab); tabConfigurator.addTab("RETAIL", R.id.diningHomeRetailContent); tabConfigurator.setUnderlineColor(getResources().getColor(R.color.diningTabUnderline)); tabConfigurator.setTextStyleResID(R.style.DiningTabTitle); tabConfigurator.configureTabs(); mFacilitiesDB = FacilitiesDB.getInstance(this); mFacilitiesDB.updateDatabase(this, new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 == MobileWebApi.SUCCESS) { DiningModel.fetchDiningData(mContext, false, new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 == MobileWebApi.SUCCESS) { mLoader.setVisibility(View.GONE); updateDiningData(); } else { mLoader.showError(); } } }); } else { mLoader.showError(); } } }); ScrollView scrollView = (ScrollView) findViewById(R.id.diningHomeMainScrollView); // Create new PullToRefreshAttacher mPullToRefreshAttacher = createPullToRefreshAttacher(); mPullToRefreshAttacher.setRefreshableView(scrollView, this); } private void updateDiningData() { mVenues = DiningModel.getDiningVenues(); displayDiningHalls(); List<DiningLink> links = DiningModel.getDiningLinks(); displayDiningLinks(links); } private HashMap<String, String> mBuildingName = new HashMap<String, String>(); private boolean mRefreshInProgress; private String getBuildingName(String buildingNumber) { if (!mBuildingName.containsKey(buildingNumber)) { Cursor cursor = mFacilitiesDB.getLocationByBuildingNumber(buildingNumber); while (cursor.moveToNext()) { int columnIndex = cursor.getColumnIndexOrThrow(LocationTable.NAME); String name = cursor.getString(columnIndex); if (name != null && name.length() > 0) { cursor.close(); mBuildingName.put(buildingNumber, name); break; } } cursor.close(); } return mBuildingName.get(buildingNumber); } @Override protected void onResume() { super.onResume(); if (mVenues != null) { // need to refresh retail dining because bookmarks may have changed // TODO:: could use SharedPreferenceChangedListener to only update when bookmark has changed displayRetailDiningHalls(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MAP_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { String tabIndex = data.getStringExtra(SELECTED_TAB); mTabHost.setCurrentTabByTag(tabIndex); } } } private void displayDiningHalls() { LinearLayout layout = (LinearLayout) findViewById(R.id.diningHomeHouseContent); layout.removeAllViews(); populateDiningHallRows(R.id.diningHomeHouseContent, mVenues.getHouses(), "Venues"); displayRetailDiningHalls(); View view = findViewById(R.id.diningHomeHouseTab); TextView messageView = (TextView) view.findViewById(R.id.diningHomeMessage); messageView.setText(mVenues.getAnnouncementsPlainText()); messageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SimpleSingleWebViewActivity.launch(DiningHomeActivity.this, mVenues.getAnnouncementsHtml()); } }); } private void displayRetailDiningHalls() { LinearLayout layout = (LinearLayout) findViewById(R.id.diningHomeRetailContent); layout.removeAllViews(); addBookmarkedRetailVenuesToLayout(R.id.diningHomeRetailContent, DiningModel.currentTimeMillis()); Map<String, List<? extends DiningHall>> retailHallsBySection = mVenues.getRetail(); for (String buildingNumber: DiningModel.getDiningVenues().getRetailBuildingNumbers()) { List<? extends DiningHall> halls = retailHallsBySection.get(buildingNumber); String title; if (buildingNumber == "other") { title = "Other"; } else { String buildingName = getBuildingName(buildingNumber); if (buildingName != null) { title = buildingNumber + " - " + buildingName; } else { title = buildingNumber; } } populateDiningHallRows(R.id.diningHomeRetailContent, halls, title); } } private void populateDiningHallRows(int layoutID, List<? extends DiningHall> list, String title) { LinearLayout layout = (LinearLayout) findViewById(layoutID); long currentTime = DiningModel.currentTimeMillis(); SectionHeader header = new SectionHeader(this, title); layout.addView(header, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); boolean first = true; LayoutInflater inflater = getLayoutInflater(); for (final DiningHall diningHall : list) { // add separator if (!first) { layout.addView(new DividerView(this, null)); } else { first = false; } View row = viewForDiningHall(inflater, diningHall, currentTime); layout.addView(row, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } } private View viewForDiningHall(LayoutInflater inflater, final DiningHall diningHall, long currentTime) { // add dining row View row = inflater.inflate(R.layout.dining_hall_row, null); RemoteImageView iconView = (RemoteImageView) row.findViewById(R.id.diningHallRowImage); TextView titleView = (TextView) row.findViewById(R.id.diningHallRowTitle); TextView subtitleView = (TextView) row.findViewById(R.id.diningHallRowSubtitle); TextView statusView = (TextView) row.findViewById(R.id.diningHallRowStatus); if (diningHall.getIconUrl() != null) { iconView.setURL(diningHall.getIconUrl()); } else { iconView.setVisibility(View.GONE); } titleView.setText(diningHall.getName()); String subtitle = diningHall.getTodaysHoursSummary(currentTime); if (subtitle != null && subtitle.length() > 0) { subtitleView.setText(subtitle); } else { subtitleView.setVisibility(View.GONE); } switch (diningHall.getCurrentStatus(currentTime)) { case OPEN: statusView.setText("Open"); statusView.setTextColor(getResources().getColor(R.color.dining_open)); break; case CLOSED: statusView.setText("Closed"); statusView.setTextColor(getResources().getColor(R.color.dining_closed)); break; } row.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mRefreshInProgress) { if (diningHall instanceof HouseDiningHall) { DiningScheduleActivity.launch(DiningHomeActivity.this, diningHall); } else { DiningRetailInfoActivity.launch(DiningHomeActivity.this, diningHall); } } } }); return row; } private void addBookmarkedRetailVenuesToLayout(int layoutID, long currentTime) { LinearLayout layout = (LinearLayout) findViewById(layoutID); List<RetailDiningHall> halls = RetailDiningHall.getBookmarks(this); if (!halls.isEmpty()) { // add favorites sectionheader SectionHeader header = new SectionHeader(this, ""); ImageSpan favIcon = new ImageSpan(this, R.drawable.dining_bookmark_section_header, ImageSpan.ALIGN_BASELINE); SpannableString text = new SpannableString(" Favorites"); text.setSpan(favIcon, 0, 1, SpannableString.SPAN_INCLUSIVE_INCLUSIVE); header.getTextView().setText(text); layout.addView(header, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } LayoutInflater inflater = getLayoutInflater(); boolean first = true; for (RetailDiningHall hall : halls) { // add separator if (!first) { layout.addView(new DividerView(this, null)); } else { first = false; } View row = viewForDiningHall(inflater, hall, currentTime); layout.addView(row, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } } private void displayDiningLinks(List<DiningLink> links) { LinearLayout resourcesLayout = (LinearLayout) findViewById(R.id.diningHomeResources); resourcesLayout.removeAllViews(); for (final DiningLink link : links) { resourcesLayout.addView(new DividerView(this, null)); TwoLineActionRow row = new TwoLineActionRow(this); row.setTitle(link.getTitle()); row.setActionIconResource(R.drawable.action_external); row.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CommonActions.viewURL(DiningHomeActivity.this, link.getUrl()); } }); resourcesLayout.addView(row); } } @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); return list; } @Override protected void onOptionSelected(String optionId) { if (optionId.equals(DiningModule.MAPVIEW_ITEM_ID)) { Intent i = new Intent(this, DiningMapActivity.class); i.putExtra(SELECTED_TAB, mTabHost.getCurrentTabTag()); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(i, MAP_ACTIVITY_REQUEST_CODE); } } @Override protected boolean isModuleHomeActivity() { return true; } @Override public void onRefreshStarted(View view) { mRefreshInProgress = true; DiningModel.fetchDiningData(this, true, new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 == MobileWebApi.SUCCESS) { updateDiningData(); } mPullToRefreshAttacher.setRefreshComplete(); mRefreshInProgress = false; } }); } }