package ca.uwaterloo.uwfoodservices;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import ca.uwaterloo.uwfoodservicesutility.MenuUtilities;
import ca.uwaterloo.uwfoodservicesutility.NetworkReceiver;
import ca.uwaterloo.uwfoodservicesutility.RestaurantMenuHolder;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.MenuItem;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
public class MenuLists extends SlidingMenus implements ActionBar.TabListener{
ViewPager vp;
static String restaurantSelection;
static int positionRestaurant;
RestaurantLocationHolder holder = RestaurantLocationHolder.getInstance();
SharedPreferences.Editor editor;
SharedPreferences pref;
public String networkPref;
private static NetworkReceiver receiver;
public static String formattedDate;
static int weekDay;
static Calendar calendar;
static SimpleDateFormat simpleDateFormat;
static Calendar currentDate;
IntentFilter filter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_lists);
filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
receiver = new NetworkReceiver(this);
this.registerReceiver(receiver, filter);
networkPref = receiver.getNetworkPref();
pref = PreferenceManager.getDefaultSharedPreferences(this);
Intent intent = getIntent();
restaurantSelection = intent.getStringExtra("Restaurant Name");
positionRestaurant = intent.getIntExtra("Restaurant Position", 0);
// Date handling
calendar = Calendar.getInstance();
currentDate = Calendar.getInstance();
simpleDateFormat = new SimpleDateFormat("MMM dd", Locale.CANADA);
formattedDate = simpleDateFormat.format(calendar.getTime());
weekDay = 0;
if (calendar.getTime().toString().split(" ")[0].equals("Mon")) { weekDay = 0; }
if (calendar.getTime().toString().split(" ")[0].equals("Tue")) { weekDay = 1; }
if (calendar.getTime().toString().split(" ")[0].equals("Wed")) { weekDay = 2; }
if (calendar.getTime().toString().split(" ")[0].equals("Thu")) { weekDay = 3; }
if (calendar.getTime().toString().split(" ")[0].equals("Fri")) { weekDay = 4; }
if (calendar.getTime().toString().split(" ")[0].equals("Sat")) { weekDay = 5; }
if (calendar.getTime().toString().split(" ")[0].equals("Sun")) { weekDay = 6; }
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setTitle(restaurantSelection);
actionBar.setIcon(R.drawable.ic_drawer);
actionBar.setDisplayUseLogoEnabled(false);
// Set max text width based on screen resolution
MenuUtilities.setMenuItemTextWidth(550);
int screenWidth = MenuUtilities.getScreenWidth(this);
MenuUtilities.setMenuItemTextWidth((screenWidth * MenuUtilities.getMenuItemTextWidth()) / 768);
vp = (ViewPager) findViewById(R.id.pager);
vp.setAdapter(new MenuAdapter(getSupportFragmentManager()));
vp.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrollStateChanged(int arg0) { }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
break;
default:
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
break;
}
}
});
vp.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < 7; i++) {
actionBar.addTab(actionBar.newTab()
.setText(MenuAdapter.days[i])
.setTabListener(this));
}
vp.setCurrentItem(weekDay);
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
}
public static class MenuAdapter extends FragmentPagerAdapter {
private ArrayList<MenuFragment> mFragments;
public final static String[] days = new String[] {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
public MenuAdapter(FragmentManager fm) {
super(fm);
mFragments = new ArrayList<MenuFragment>();
for (int i = 0; i < days.length; i++) {
mFragments.add(new MenuFragment());
}
}
@Override
public int getCount() {
return days.length;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new MenuFragment();
Bundle args = new Bundle();
args.putInt(MenuFragment.ARG_SECTION_NUMBER, position);
fragment.setArguments(args);
return fragment;
}
}
public static class MenuFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";
public int day;
public static final int HDR_POS1 = 0;
public int[] HDR_POS2 = new int[7];
List<String> LIST = new ArrayList<String>();
List<ArrayList<String>> clickableList = null;
List<ArrayList<String>> dietTypeList = null;
String dietType;
private static final Integer LIST_HEADER = 0;
private static final Integer LIST_ITEM = 1;
public MenuFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_restaurant_menu,
container, false);
if (clickableList == null) {
clickableList = new ArrayList<ArrayList<String>>();
for (int i = 0; i < 7; i ++) {
clickableList.add(new ArrayList<String>());
}
}
if (dietTypeList == null) {
dietTypeList = new ArrayList<ArrayList<String>>();
for (int i = 0; i < 7; i ++) {
dietTypeList.add(new ArrayList<String>());
}
}
day = getArguments().getInt(ARG_SECTION_NUMBER);
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, getArguments().getInt(ARG_SECTION_NUMBER) - weekDay);
simpleDateFormat = new SimpleDateFormat("MMM dd", Locale.CANADA);
if (simpleDateFormat.format(calendar.getTime()).split(" ")[1].startsWith("0")) {
formattedDate = simpleDateFormat.format(calendar.getTime()).split(" ")[0] +
" " + simpleDateFormat.format(calendar.getTime()).split(" ")[1].charAt(1);
} else {
formattedDate = simpleDateFormat.format(calendar.getTime());
}
if (formattedDate.endsWith("1")) {
if (formattedDate.endsWith("11")) {
formattedDate += "th";
} else {
formattedDate += "st";
}
} else if (formattedDate.endsWith("2")) {
if (formattedDate.endsWith("12")) {
formattedDate+= "th";
} else {
formattedDate += "nd";
}
} else if (formattedDate.endsWith("3")) {
if (formattedDate.endsWith("13")) {
formattedDate+= "th";
} else {
formattedDate += "rd";
}
} else {
formattedDate += "th";
}
RestaurantMenuHolder menuHolder = RestaurantMenuHolder.getInstance(null);
TextView textDay = (TextView) rootView.findViewById(R.id.textDay);
if (formattedDate.substring(0,3).equals("Sep")) {
formattedDate = "Sept" + formattedDate.substring(3);
}
SpannableString content = new SpannableString(formattedDate);
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textDay.setText(content);
ListView listView = (ListView) rootView.findViewById(R.id.list_menu);
LIST.clear();
LIST.add("LUNCH");
clickableList.get(day).add("header");
dietTypeList.get(day).add("header");
if (menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getLunch() == null) {
LIST.add("There is nothing on the menu");
clickableList.get(day).add("header");
dietTypeList.get(day).add("header");
} else {
for (int i = 0; i < menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getLunch().size(); i++) {
LIST.add(menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getLunch().get(i).getProductName());
if (menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getLunch().get(i).getProductID() != null) {
clickableList.get(day).add("true");
} else {
clickableList.get(day).add("false");
}
dietType = menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day]
.getLunch().get(i).getDietType();
if (dietType != null) {
dietTypeList.get(day).add(dietType);
} else {
dietTypeList.get(day).add(null);
}
}
}
HDR_POS2[day] = LIST.size();
LIST.add("DINNER");
clickableList.get(day).add("header");
dietTypeList.get(day).add("header");
if (menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getDinner() == null) {
LIST.add("There is nothing on the menu");
clickableList.get(day).add("header");
dietTypeList.get(day).add("header");
} else {
for (int i = 0; i < menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getDinner().size(); i++) {
LIST.add(menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getDinner().get(i).getProductName());
if (menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day].getDinner().get(i).getProductID() != null) {
clickableList.get(day).add("true");
} else {
clickableList.get(day).add("false");
}
dietType = menuHolder.getRestaurantMenu().get(positionRestaurant).getMenu()[day]
.getDinner().get(i).getDietType();
if (dietType != null) {
dietTypeList.get(day).add(dietType);
} else {
dietTypeList.get(day).add(null);
}
}
}
MenuListAdapter menuListAdapter = new MenuListAdapter(getActivity());
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
if (clickableList.get(day).get(arg2).equals("true")) {
if (receiver.isNetwork()) {
final Intent intentProductInfo = new Intent(getActivity(), ProductInfoDialog.class);
Long productDay = currentDate.getTimeInMillis();
intentProductInfo.putExtra("Restaurant Position", positionRestaurant);
intentProductInfo.putExtra("Product Day", productDay);
intentProductInfo.putExtra("Selected Item", LIST.get((int)arg3));
int currentPosition = arg2;
intentProductInfo.putExtra("Current Position", currentPosition);
intentProductInfo.putExtra("Weekday", day);
startActivityForResult(intentProductInfo, 1);
} else {
final Toast toast = Toast.makeText(getActivity(),
"Cannot display product info.\nThere is no network.", Toast.LENGTH_SHORT);
((TextView)((LinearLayout)toast.getView()).getChildAt(0))
.setGravity(Gravity.CENTER_HORIZONTAL);
toast.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
toast.cancel();
}
}, 1000);
}
} else {
if (!clickableList.get(day).get(arg2).equals("header")) {
final Toast toast = Toast.makeText(getActivity(),
"There is no nutritional information for this product.", Toast.LENGTH_SHORT);
toast.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
toast.cancel();
}
}, 800);
}
}
}
});
listView.setAdapter(menuListAdapter);
listView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
return rootView;
}
private class MenuListAdapter extends BaseAdapter{
public int textWidth;
public MenuListAdapter(Context context) {
mContext = context;
}
@Override
public int getCount() {
return LIST.size();
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String headerText = getHeader(position);
if(headerText != null) {
View item = convertView;
if((convertView == null) || (convertView.getTag() == LIST_ITEM)) {
item = LayoutInflater.from(mContext).inflate(
R.layout.lv_header_layout, parent, false);
item.setTag(LIST_HEADER);
}
Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "Roboto-Bold.ttf");
TextView headerTextView = (TextView)item.findViewById(R.id.lv_list_hdr);
headerTextView.setTypeface(tf);
headerTextView.setText(headerText);
return item;
}
View item = convertView;
if((convertView == null) || (convertView.getTag() == LIST_HEADER)) {
item = LayoutInflater.from(mContext).inflate(
R.layout.lv_layout, parent, false);
item.setTag(LIST_ITEM);
}
ImageButton image = (ImageButton)item.findViewById(R.id.button);
if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("null")) {
image.setImageResource(R.drawable.ic_no_information);
} else if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("Halal")) {
image.setImageResource(R.drawable.ic_halal);
} else if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("Vegetarian")) {
image.setImageResource(R.drawable.ic_vegetarian);
} else if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("Vegan")) {
image.setImageResource(R.drawable.ic_vegan);
} else if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("Non Vegetarian")) {
image.setImageResource(R.drawable.ic_non_vegetarian);
} /*else if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("header")) {
image.setAlpha(0.0f);
}*/
if (dietTypeList.get(day).get(position % dietTypeList.get(day).size()).equals("null")) {
image.setTag("No Information");
} else {
image.setTag(dietTypeList.get(day).get(position % dietTypeList.get(day).size()));
}
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!v.getTag().equals("header")) {
final Toast toast = Toast.makeText(getActivity(), v.getTag().toString(),
Toast.LENGTH_SHORT);
int[] location = new int[2];
v.getLocationOnScreen(location);
toast.setGravity(Gravity.TOP|Gravity.LEFT, location[0], location[1]);
toast.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
toast.cancel();
}
}, 800);
}
}
});
TextView header = (TextView)item.findViewById(R.id.lv_item_header);
Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "Roboto-Light.ttf");
header.setText(LIST.get(position % LIST.size()));
if (clickableList.get(day).get(position % clickableList.get(day).size()).equals("true")) {
header.setFocusable(true);
header.setFocusableInTouchMode(true);
} else {
header.setFocusable(false);
header.setFocusableInTouchMode(false);
header.setTextColor(getResources().getColor(R.color.gray));
}
header.setTypeface(tf);
// Measures the width of the text in the textView.
textWidth = MenuUtilities.getTextWidth(LIST.get(position % LIST.size()), header.getPaint());
// The text size is decreased until the text is under the specified width or the textSize
// is under a certain size, inc which case the text will wrap to the next line.
while ((textWidth > MenuUtilities.menuItemTextWidth) && (header.getTextSize() > 33)) {
header.setTextSize((header.getTextSize() - 1)/2); // Black magic happening here.
textWidth = MenuUtilities.getTextWidth(LIST.get(position % LIST.size()), header.getPaint());
}
// The textView is recentered if the textView wraps to a second line.
if (header.getTextSize() == 33.0) {
header.setPadding(header.getPaddingLeft(), 0, header.getPaddingRight(), 0);
}
//Set last divider in a sublist invisible
View divider = item.findViewById(R.id.item_separator);
if((position == (HDR_POS2[day] -1)) || (position == (LIST.size() - 1))) {
divider.setVisibility(View.INVISIBLE);
}
return item;
}
private String getHeader(int position) {
if((position == HDR_POS1) || (position == HDR_POS2[day])) {
return LIST.get(position);
}
return null;
}
private final Context mContext;
}
}
@Override
public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,
android.support.v4.app.FragmentTransaction ft) {
vp.getAdapter().notifyDataSetChanged();
vp.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab,
android.support.v4.app.FragmentTransaction ft) {
}
@Override
public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab,
android.support.v4.app.FragmentTransaction ft) {
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (item.getTitle() == "Settings") {
Intent settingsActivity = new Intent(getBaseContext(), SettingsActivity.class);
startActivity(settingsActivity);
return true;
} else if (itemId == android.R.id.home) {
toggle();
return true;
} else if (item.getTitle() == "Refresh") {
if(receiver.isNetwork()){
Intent intent = new Intent(MenuLists.this, SplashScreen.class);
editor = pref.edit();
editor.putString("refresh", "menu");
editor.putString("restaurant", restaurantSelection);
editor.putInt("position", positionRestaurant);
editor.commit();
startActivity(intent);
finish();
}
else{
Toast.makeText(getApplicationContext(), "Cannot refresh because either there is no network or the network does not match your preferences", Toast.LENGTH_SHORT).show();
}
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onPause() {
super.onPause();
if (receiver != null) {
this.unregisterReceiver(receiver);
}
}
@Override
public void onResume() {
super.onResume();
this.registerReceiver(receiver, filter);
}
}