package ca.uwaterloo.uwfoodservices; import java.util.ArrayList; import java.util.List; import org.json.JSONObject; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TabHost; import android.widget.TabHost.TabContentFactory; import android.widget.TextView; import ca.uwaterloo.uwfoodservicesutility.MenuUtilities; import ca.uwaterloo.uwfoodservicesutility.ParseProductInfo; import ca.uwaterloo.uwfoodservicesutility.ProductInfoHolder; import ca.uwaterloo.uwfoodservicesutility.RestaurantMenuHolder; import ca.uwaterloo.uwfoodservicesutility.RestaurantMenuItem; public class ProductInfoDialog extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener, TabContentFactory { int restaurantPosition; long productDay; String selectedItem; int currentPosition; int weekDay; ArrayList<Integer> productIds; int tabPosition; ArrayList<RestaurantMenuItem> productList; static List<String> productInfoUrls; static List<String> productNames; RestaurantMenuHolder menuHolder; SharedPreferences.Editor editor; SharedPreferences pref; static ParseProductInfo productInfoParser; static ProductInfoHolder productInfoHolder = null; AsyncDataFetcher dataFetcher = new AsyncDataFetcher(); static boolean loaded = false; private ViewPager mViewPager; private TabHost mTabHost; private ProductInfoAdapter mPagerContent; static Typeface tf; static TextView item_nutrition; static TextView item_percent; private static ProgressDialog dialog; @SuppressWarnings("unchecked") @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.fragment_product_info_dialog); tf = Typeface.createFromAsset(this.getAssets(), "Roboto-Light.ttf"); dialog = new ProgressDialog(this); pref = PreferenceManager.getDefaultSharedPreferences(this); ProductInfoHolder.resetInstance(); loaded = false; Intent intent = getIntent(); restaurantPosition = intent.getIntExtra("Restaurant Position", -1); productDay = intent.getLongExtra("Product Day", -1); currentPosition = intent.getIntExtra("Current Position", -1); weekDay = intent.getIntExtra("Weekday", -1); selectedItem = intent.getStringExtra("Selected Item"); productIds = new ArrayList<Integer>(); productNames = new ArrayList<String>(); menuHolder = RestaurantMenuHolder.getInstance(); if (menuHolder.getRestaurantMenu().get(restaurantPosition).getMenu()[weekDay].getLunch() != null) { if (currentPosition > menuHolder.getRestaurantMenu() .get(restaurantPosition).getMenu()[weekDay].getLunch().size()) { productList = menuHolder.getRestaurantMenu().get(restaurantPosition).getMenu()[weekDay].getDinner(); } else { productList = menuHolder.getRestaurantMenu().get(restaurantPosition).getMenu()[weekDay].getLunch(); } for (int i = 0; i < productList.size(); i++) { if (productList.get(i).getProductID() != null) { productIds.add(productList.get(i).getProductID()); productNames.add(productList.get(i).getProductName()); } } } productInfoUrls = new ArrayList<String>(); for (Integer id:productIds) { if (id != null) { productInfoUrls.add("http://api.uwaterloo.ca/public/v2/foodservices/product/" + id + ".json?key=98bbbd30b3e4f621d9cb544a790086d6"); } } productInfoParser = new ParseProductInfo(); dataFetcher.execute(productInfoUrls); tabPosition = 0; for (int i = 0; i < productNames.size(); i ++) { if (productNames.get(i).equals(selectedItem)) { tabPosition = i; } } mViewPager = (ViewPager) findViewById(R.id.pager); mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.setup(); for (int i = 0; i < productNames.size(); i++) { mTabHost.addTab(mTabHost.newTabSpec("tab" + i).setContent(this).setIndicator(productNames.get(i))); } mTabHost.setOnTabChangedListener(this); mTabHost.setCurrentTab(tabPosition); // ViewPager initialization mViewPager.setOnPageChangeListener(this); dialog.setOnDismissListener(new OnDismissListener(){ @Override public void onDismiss(DialogInterface arg0) { if(!dataFetcher.isCancelled()){ mPagerContent = new ProductInfoAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mPagerContent); mViewPager.setCurrentItem(tabPosition); mViewPager.setOffscreenPageLimit(1); } else{ Intent returnIntent = new Intent(); setResult(RESULT_CANCELED, returnIntent); finish(); } } }); dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { dataFetcher.cancel(true); dialog.dismiss(); } }); } private static class AsyncDataFetcher extends AsyncTask<List<String>, Void, Void> { public AsyncDataFetcher() { } @Override protected void onPreExecute() { dialog.setCanceledOnTouchOutside(false); dialog.show(); dialog.setMessage("Please wait.."); } @Override protected Void doInBackground(List<String>... urls) { List<JSONObject> jsonList = new ArrayList<JSONObject>(); JSONParser json_parse = new JSONParser(); for (int i = 0; i < urls[0].size(); i ++) { jsonList.add(json_parse.getJSONFromUrl(urls[0].get(i))); } if(jsonList != null){ productInfoParser.Parse(jsonList); loaded = true; } return null; } @Override protected void onPostExecute(Void result) { if (dialog.isShowing()) { dialog.dismiss(); } } } public static class ProductInfoAdapter extends FragmentPagerAdapter { private ArrayList<ProductInfoFragment> mFragments; public ProductInfoAdapter(FragmentManager fm) { super(fm); mFragments = new ArrayList<ProductInfoFragment>(); for (int i = 0; i < productInfoUrls.size(); i++) { mFragments.add(new ProductInfoFragment()); } } @Override public int getCount() { return productInfoUrls.size(); } @Override public Fragment getItem(int position) { Fragment fragment = new ProductInfoFragment(); Bundle args = new Bundle(); args.putInt(ProductInfoFragment.ARG_SECTION_NUMBER, position); fragment.setArguments(args); return fragment; } } public static class ProductInfoFragment extends Fragment { public static final String ARG_SECTION_NUMBER = "section_number"; int position; List<String> left_list = new ArrayList<String>(); List<String> right_list = new ArrayList<String>(); String serving; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_product_info, container, false); Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "Roboto-Light.ttf"); position = getArguments().getInt(ARG_SECTION_NUMBER); ListView listView = (ListView) rootView.findViewById(R.id.list_menu); TextView textIngredients = (TextView) rootView.findViewById(R.id.textIngredients); textIngredients.setTypeface(tf); while(loaded == false) { } productInfoHolder = ProductInfoHolder.getInstance(); left_list.clear(); right_list.clear(); serving = "Per " + productInfoHolder.productInfo.get(position).get_serving_size(); left_list.add(serving); right_list.add(""); left_list.add("Amount"); right_list.add("% Daily Value"); left_list.add("Calories " + productInfoHolder.productInfo.get(position).get_calories()); right_list.add(""); left_list.add("Fat " + productInfoHolder.productInfo.get(position).get_total_fat_g() + " g"); right_list.add(productInfoHolder.productInfo.get(position).get_total_fat_percent() + " %"); if (productInfoHolder.productInfo.get(position).get_fat_saturated_g() != null) { left_list.add(" Saturated " + productInfoHolder.productInfo.get(position).get_fat_saturated_g() + " g"); if (productInfoHolder.productInfo.get(position).get_fat_saturated_percent() != null) { right_list.add(productInfoHolder.productInfo.get(position).get_fat_saturated_percent() + " %"); } else { right_list.add(""); } } if (productInfoHolder.productInfo.get(position).get_fat_trans_g() != null) { left_list.add(" Trans " + productInfoHolder.productInfo.get(position).get_fat_trans_g() + " g"); if (productInfoHolder.productInfo.get(position).get_fat_trans_percent() != null) { right_list.add(productInfoHolder.productInfo.get(position).get_fat_trans_percent() + " %"); } else { right_list.add(""); } } left_list.add("Cholesterol " + productInfoHolder.productInfo.get(position).get_cholesterol_mg() + " mg"); right_list.add(""); left_list.add("Sodium " + productInfoHolder.productInfo.get(position).get_sodium_mg() + " mg"); right_list.add(productInfoHolder.productInfo.get(position).get_sodium_percent() + " %"); if (productInfoHolder.productInfo.get(position).get_carbo_g() != null) { left_list.add("Carbohydrate " + productInfoHolder.productInfo.get(position).get_carbo_g() + " g"); right_list.add(productInfoHolder.productInfo.get(position).get_carbo_percent() + " %"); if (productInfoHolder.productInfo.get(position).get_carbo_fibre_g() != null) { left_list.add(" Fibre " + productInfoHolder.productInfo.get(position).get_carbo_fibre_g() + " g"); right_list.add(""); } if (productInfoHolder.productInfo.get(position).get_carbo_fibre_percent() != null) { left_list.add(" Sugars " + productInfoHolder.productInfo.get(position).get_carbo_fibre_percent() + " g"); right_list.add(""); } } left_list.add("Protein " + productInfoHolder.productInfo.get(position).get_protein_g() + " g"); right_list.add(""); if (productInfoHolder.productInfo.get(position).get_vitamin_a_percent() != null) { left_list.add("Vitamin A"); right_list.add(productInfoHolder.productInfo.get(position).get_vitamin_a_percent() + " %"); } if (productInfoHolder.productInfo.get(position).get_vitamin_c_percent() != null) { left_list.add("Vitamin C"); right_list.add(productInfoHolder.productInfo.get(position).get_vitamin_c_percent() + " %"); } if (productInfoHolder.productInfo.get(position).get_calcium_percent() != null) { left_list.add("Calcium"); right_list.add(productInfoHolder.productInfo.get(position).get_calcium_percent() + " %"); } if (productInfoHolder.productInfo.get(position).get_iron_percent() != null) { left_list.add("Iron"); right_list.add(productInfoHolder.productInfo.get(position).get_iron_percent() + " %"); } ProductInfoAdapter productInfoAdapter = new ProductInfoAdapter(getActivity()); listView.setAdapter(productInfoAdapter); if (productInfoHolder.productInfo.get(position).get_ingredients() != null) { String ingredients = "Ingredients: "; List<String> ingredientList = productInfoHolder.productInfo.get(position).get_ingredients(); ingredients += ingredientList.get(0); for (int i = 1; i < ingredientList.size(); i++) { ingredients += ", " + ingredientList.get(i); } textIngredients.setPadding(0, (left_list.size() * 48) + 45, 0, 0); textIngredients.setText(ingredients); } MenuUtilities.setListViewHeightBasedOnChildren(listView); return rootView; } private class ProductInfoAdapter extends BaseAdapter { private final Context mContext; public ProductInfoAdapter(Context context) { mContext = context; } @Override public int getCount() { return left_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) { convertView = LayoutInflater.from(mContext).inflate(R.layout.lv_nutrition, parent, false); item_nutrition = (TextView)convertView.findViewById(R.id.lv_item_nutrition); item_nutrition.setText(left_list.get(position)); item_nutrition.setTypeface(tf); item_percent = (TextView)convertView.findViewById(R.id.lv_item_percent); item_percent.setText(right_list.get(position)); item_percent.setTypeface(tf); return convertView; } } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { mTabHost.setCurrentTab(position); } @Override public void onTabChanged(String tabId) { mViewPager.setCurrentItem(Integer.parseInt(tabId.substring(tabId .length() - 1)), true); } @Override public View createTabContent(String tag) { View dummyContent = new View(this); dummyContent.setMinimumHeight(0); return dummyContent; } @Override public void onPause() { super.onPause(); dialog.cancel(); } }