com.eugene.fithealthmaingit.UI.NavFragments.FragmentJournalMainHome.java Source code

Java tutorial

Introduction

Here is the source code for com.eugene.fithealthmaingit.UI.NavFragments.FragmentJournalMainHome.java

Source

/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.eugene.fithealthmaingit.UI.NavFragments;

import android.app.Activity;
import android.app.AlertDialog;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
import android.text.format.DateFormat;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.RemoteViews;
import android.widget.ScrollView;
import android.widget.TextView;

import com.eugene.fithealthmaingit.CalTesting.CalendarTesting;
import com.eugene.fithealthmaingit.Custom.TextViewFont;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.CalSQLiteDatabase.DailyCalorieAdapter;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.CalSQLiteDatabase.DailyCalorieIntake;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.CalSQLiteDatabase.DatabaseHandler;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterAll;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterBreakfast;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterCalories;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterDinner;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterLunch;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogAdapterSnack;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogFood.LogMeal;
import com.eugene.fithealthmaingit.FitBit.FitBitCaloriesBurned;
import com.eugene.fithealthmaingit.HomeScreenWidget.FitHealthWidget;
import com.eugene.fithealthmaingit.R;
import com.eugene.fithealthmaingit.UI.ChooseAddMealActivity;
import com.eugene.fithealthmaingit.Utilities.DateCompare;
import com.eugene.fithealthmaingit.Utilities.Equations;
import com.eugene.fithealthmaingit.Utilities.Globals;
import com.eugene.fithealthmaingit.Utilities.SetListHeight.SetBreakfastListHeight;
import com.eugene.fithealthmaingit.Utilities.SetListHeight.SetDinnerListHeight;
import com.eugene.fithealthmaingit.Utilities.SetListHeight.SetLunchListHeight;
import com.eugene.fithealthmaingit.Utilities.SetListHeight.SetSnackListHeight;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;

import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import github.chenupt.dragtoplayout.AttachUtil;
import github.chenupt.dragtoplayout.DragTopLayout;

/**
 * Main journal that displays:
 * list of item that are added
 * nutrition information
 */
public class FragmentJournalMainHome extends Fragment
        implements View.OnClickListener, SlidingUpPanelLayout.PanelSlideListener, DragTopLayout.PanelListener {

    private View v;

    private SharedPreferences sharedPreferences;

    private Date mDate = new Date();
    private DecimalFormat df = new DecimalFormat("0");

    private int slide_down_padding = 0;

    private LinearLayout mCaloriePullDownView, pullDownItems;
    private SlidingUpPanelLayout mSlidingLayout;
    private RelativeLayout mSliderLayoutHelper;
    private LogAdapterSnack mLogSnackAdapter;
    private LogAdapterBreakfast mLogBreakfastAdapter;
    private LogAdapterLunch mLogLunchAdapter;
    private LogAdapterDinner mLogDinnerAdapter;
    private LogAdapterAll mLogAdapterAll;
    private ListView mListSnack, mListBreakfast, mListLunch, mListDinner;
    private ProgressBar mPbCalories, mPbFat, mPbCarbs, mPbProtein;
    private TextView mCalories, mCaloriesRemainder;
    LinearLayout mNoSnacks, mNoBreakfast, mNoLunch, mNoDinner;
    private TextView mFatRemainder, mCarbRemainder, mProteinRemainder;
    private TextView mCalSnack, mCalBreakfast, mCalLunch, mCalDinner;
    private ImageView icSnack, icBreakfast, icLunch, icDinner;
    private int mYear, mMonth, mDay;
    private double mCalorieGoalMeal;
    LinearLayout llFitBit;
    TextView fbCaloriesNew;
    TextViewFont txtDate;
    LinearLayout changeDate;

    /**
     * Get the saved date before the views are created/updated
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            mDate = (Date) savedInstanceState.getSerializable(Globals.JOURNAL_DATE);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putSerializable(Globals.JOURNAL_DATE, mDate);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        savedState = savedInstanceState;
        v = inflater.inflate(R.layout.fragment_journal_main_home, container, false);
        // Initiate PreferenceManager to get user saved information
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        if (getArguments() != null) {
            mDate = (Date) getArguments().getSerializable("DATE");
        }
        /**
         * Convert Date To Calendar
         */
        final Calendar c = DateCompare.DateToCalendar(mDate);
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        /**
         * Originally tried to set two different fonts for toolbar title
         * Fit = Roboto-Light
         * Journal = Roboto-Bold
         * TODO: remove this statement and just update the Toolbar Title to custom font
         */
        txtDate = (TextViewFont) v.findViewById(R.id.txtDate);
        changeDate = (LinearLayout) v.findViewById(R.id.changeDate);
        changeDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCallbacks.openCal();
            }
        });

        Toolbar mToolbar = (Toolbar) v.findViewById(R.id.toolbar_journal_main);
        mToolbar.inflateMenu(R.menu.menu_main_journal);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCallbacks.openNavigationDrawer();
            }
        });
        mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int menuItem = item.getItemId();
                switch (menuItem) {
                // Initiate Search Fragment
                case R.id.action_search:
                    mCallbacks.searchFragment();
                    break;
                default:
                    break;
                }
                return false;
            }
        });
        // Bottom sheet that displays meals
        InitializeSlidingPanelLayout();
        // PullDown view that displays nutrition information
        InitializeDragTopLayout();
        // Set onClickLister
        v.findViewById(R.id.txtQuickAddSnack).setOnClickListener(this);
        v.findViewById(R.id.txtQuickAddBreakfast).setOnClickListener(this);
        v.findViewById(R.id.txtQuickAddLunch).setOnClickListener(this);
        v.findViewById(R.id.txtQuickAddDinner).setOnClickListener(this);
        v.findViewById(R.id.suggestion).setOnClickListener(this);
        v.findViewById(R.id.suggestion1).setOnClickListener(this);
        v.findViewById(R.id.suggestion2).setOnClickListener(this);
        v.findViewById(R.id.suggestion3).setOnClickListener(this);
        v.findViewById(R.id.snackInfo).setOnClickListener(this);
        v.findViewById(R.id.breakfastInfo).setOnClickListener(this);
        v.findViewById(R.id.lunchInfo).setOnClickListener(this);
        v.findViewById(R.id.dinnerInfo).setOnClickListener(this);

        // initialize lists for context menu and onItemClickListeners
        mListSnack = (ListView) v.findViewById(R.id.listSnack);
        mListBreakfast = (ListView) v.findViewById(R.id.listBreakfast);
        mListLunch = (ListView) v.findViewById(R.id.listLunch);
        mListDinner = (ListView) v.findViewById(R.id.listDinner);
        registerForContextMenu(mListSnack);
        registerForContextMenu(mListBreakfast);
        registerForContextMenu(mListLunch);
        registerForContextMenu(mListDinner);
        mListSnack.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                LogMeal meals = mLogSnackAdapter.getItem(position);
                mCallbacks.viewMeal(meals.getId(), meals.getMealChoice(), position, mDate);
            }
        });
        mListBreakfast.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                LogMeal meals = mLogBreakfastAdapter.getItem(position);
                mCallbacks.viewMeal(meals.getId(), meals.getMealChoice(), position, mDate);
            }
        });
        mListLunch.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                LogMeal meals = mLogLunchAdapter.getItem(position);
                mCallbacks.viewMeal(meals.getId(), meals.getMealChoice(), position, mDate);
            }
        });
        mListDinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                LogMeal meals = mLogDinnerAdapter.getItem(position);
                mCallbacks.viewMeal(meals.getId(), meals.getMealChoice(), position, mDate);
            }
        });

        // Nutrition Widgets
        fbCaloriesNew = (TextView) v.findViewById(R.id.fbCaloriesNew);

        mCalSnack = (TextView) v.findViewById(R.id.calSnack);
        mCalBreakfast = (TextView) v.findViewById(R.id.calBreakfast);
        mCalLunch = (TextView) v.findViewById(R.id.calLunch);
        mCalDinner = (TextView) v.findViewById(R.id.calDinner);
        mNoSnacks = (LinearLayout) v.findViewById(R.id.txtItemSnack);
        mNoBreakfast = (LinearLayout) v.findViewById(R.id.txtItemBreakfast);
        mNoLunch = (LinearLayout) v.findViewById(R.id.txtItemLunch);
        mNoDinner = (LinearLayout) v.findViewById(R.id.txtItemDinner);
        mPbCalories = (ProgressBar) v.findViewById(R.id.pbCal);
        mPbFat = (ProgressBar) v.findViewById(R.id.pbFat);
        mPbCarbs = (ProgressBar) v.findViewById(R.id.pbCarbs);
        mPbProtein = (ProgressBar) v.findViewById(R.id.pbProtein);
        mFatRemainder = (TextView) v.findViewById(R.id.txtRemainderFat);
        mCarbRemainder = (TextView) v.findViewById(R.id.txtRemainderCarbs);
        mProteinRemainder = (TextView) v.findViewById(R.id.txtRemainderProtein);
        icSnack = (ImageView) v.findViewById(R.id.icSnack);
        icBreakfast = (ImageView) v.findViewById(R.id.icBreakfast);
        icLunch = (ImageView) v.findViewById(R.id.icLunch);
        icDinner = (ImageView) v.findViewById(R.id.icDinner);
        // Set Adapters based on Current date or updated date
        initializeAdapters(mDate);
        // Checks adapters if they are empty and notifies the user
        updateListViews();
        // Set toolbar subtitle to the current date or updated date
        handleDateChanges(mDate);
        /**
         * Design Support Library
         * Due to the error within the library: set margin manually till it is updated
         */
        FloatingActionButton mFab = (FloatingActionButton) v.findViewById(R.id.fab);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) mFab.getLayoutParams();
            p.setMargins(0, 0, Equations.dpToPx(getActivity(), 8), 0); // get rid of margins since shadow area is now the margin
            mFab.setLayoutParams(p);
        }
        mFab.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
                return false;
            }
        });

        return v;
    }

    @Override
    public void onClick(View v) {
        Intent i = new Intent(getActivity(), ChooseAddMealActivity.class);
        switch (v.getId()) {
        //Sliding Panel
        case R.id.slide_helper:
            mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            break;
        case R.id.btnSnack:
            mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            i.putExtra(Globals.MEAL_TYPE, Globals.MEAL_TYPE_SNACK);
            startActivity(i);
            break;
        case R.id.btnBreakfast:
            mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            i.putExtra(Globals.MEAL_TYPE, Globals.MEAL_TYPE_BREAKFAST);
            startActivity(i);
            break;
        case R.id.btnLunch:
            mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            i.putExtra(Globals.MEAL_TYPE, Globals.MEAL_TYPE_LUNCH);
            startActivity(i);
            break;
        case R.id.btnDinner:
            mSlidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
            i.putExtra(Globals.MEAL_TYPE, Globals.MEAL_TYPE_DINNER);
            startActivity(i);
            break;
        case R.id.txtQuickAddSnack:
            mCallbacks.openQuickAdd(Globals.MEAL_TYPE_SNACK);
            break;
        case R.id.txtQuickAddBreakfast:
            mCallbacks.openQuickAdd(Globals.MEAL_TYPE_BREAKFAST);
            break;
        case R.id.txtQuickAddLunch:
            mCallbacks.openQuickAdd(Globals.MEAL_TYPE_LUNCH);
            break;
        case R.id.txtQuickAddDinner:
            mCallbacks.openQuickAdd(Globals.MEAL_TYPE_DINNER);
            break;
        //Suggestion
        case R.id.suggestion:
            mCallbacks.viewSuggestion("Snack", mDate);
            break;
        case R.id.suggestion1:
            mCallbacks.viewSuggestion("Breakfast", mDate);
            break;
        case R.id.suggestion2:
            mCallbacks.viewSuggestion("Lunch", mDate);
            break;
        case R.id.suggestion3:
            mCallbacks.viewSuggestion("Dinner", mDate);
            break;

        // Calorie Goal Dialog
        case R.id.snackInfo:
            calorieInfoDialog(Globals.MEAL_TYPE_SNACK);
            break;
        case R.id.breakfastInfo:
            calorieInfoDialog(Globals.MEAL_TYPE_BREAKFAST);
            break;
        case R.id.lunchInfo:
            calorieInfoDialog(Globals.MEAL_TYPE_LUNCH);
            break;
        case R.id.dinnerInfo:
            calorieInfoDialog(Globals.MEAL_TYPE_DINNER);
            break;
        default:
            break;
        }
    }

    /**
     * Updated toobar subtitle to the date
     *
     * @param date current date or updated date
     */
    private void handleDateChanges(Date date) {
        if (DateCompare.areDatesEqual(new Date(), date)) { // Are Dates Equal Today
            txtDate.setText("Today");
        } else if (DateCompare.areDatesEqualYesterday(new Date(), date)) { // Are Dates Equal Yesterday
            txtDate.setText("Yesterday");
        } else if (DateCompare.areDatesEqualTomorrow(new Date(), date)) { // Are Dates Equal Yesterday
            txtDate.setText("Tomorrow");
        } else {
            txtDate.setText(DateFormat.format("MMM d, EE", date));
        }

    }

    /**
     * Set Adapters based on Current Date or Updated Date
     * Set List Adapters
     *
     * @param date current date or updated date
     */
    private void initializeAdapters(Date date) {
        mLogSnackAdapter = new LogAdapterSnack(getActivity(), 0, LogMeal.logSortByMealChoice("Snack", date));
        mListSnack.setAdapter(mLogSnackAdapter);
        SetSnackListHeight.setListViewHeight(mListSnack);

        mLogBreakfastAdapter = new LogAdapterBreakfast(getActivity(), 0,
                LogMeal.logSortByMealChoice("Breakfast", date));
        mListBreakfast.setAdapter(mLogBreakfastAdapter);
        SetBreakfastListHeight.setListViewHeight(mListBreakfast);

        mLogLunchAdapter = new LogAdapterLunch(getActivity(), 0, LogMeal.logSortByMealChoice("Lunch", date));
        mListLunch.setAdapter(mLogLunchAdapter);
        SetLunchListHeight.setListViewHeight(mListLunch);

        mLogDinnerAdapter = new LogAdapterDinner(getActivity(), 0, LogMeal.logSortByMealChoice("Dinner", date));
        mListDinner.setAdapter(mLogDinnerAdapter);
        SetDinnerListHeight.setListViewHeight(mListDinner);

        mLogAdapterAll = new LogAdapterAll(getActivity(), 0, LogMeal.logsByDate(date));
        InitiateFitBit(date);

        setAdapter(new Date());
    }

    /**
     * Checks adapters sizes and
     * notifies user no items have been saved/added
     */
    private void updateListViews() {
        if (mLogSnackAdapter.getCount() > 0)
            mNoSnacks.setVisibility(View.GONE);
        else
            mNoSnacks.setVisibility(View.VISIBLE);
        if (mLogBreakfastAdapter.getCount() > 0)
            mNoBreakfast.setVisibility(View.GONE);
        else
            mNoBreakfast.setVisibility(View.VISIBLE);
        if (mLogLunchAdapter.getCount() > 0)
            mNoLunch.setVisibility(View.GONE);
        else
            mNoLunch.setVisibility(View.VISIBLE);
        if (mLogDinnerAdapter.getCount() > 0)
            mNoDinner.setVisibility(View.GONE);
        else
            mNoDinner.setVisibility(View.VISIBLE);

        /**
         * Setting a post delay due to the progress bars not updating after an item is added through quick add.
         */
        Runnable mMyRunnable = new Runnable() {
            @Override
            public void run() {
                equations();
            }
        };
        Handler myHandler = new Handler();
        myHandler.postDelayed(mMyRunnable, 10);
    }

    /**
     * Refreshed Adapters and ListVies after an Items has been deleted
     */
    private void refreshOnDelete() {
        mListSnack.setAdapter(mLogSnackAdapter);
        SetSnackListHeight.setListViewHeight(mListSnack);
        mListBreakfast.setAdapter(mLogBreakfastAdapter);
        SetBreakfastListHeight.setListViewHeight(mListBreakfast);
        mListLunch.setAdapter(mLogLunchAdapter);
        SetLunchListHeight.setListViewHeight(mListLunch);
        mListDinner.setAdapter(mLogDinnerAdapter);
        SetDinnerListHeight.setListViewHeight(mListDinner);
        updateListViews();
    }

    /**
     * Equation for all of the Nutrition and Meal information
     */
    private void equations() {
        double mCalorieGoal = Double.valueOf(sharedPreferences.getString(Globals.USER_CALORIES_TO_REACH_GOAL, ""));
        double mFatGoal = Double.valueOf(sharedPreferences.getString(Globals.USER_DAILY_FAT, ""));
        double mCarbGoal = Double.valueOf(sharedPreferences.getString(Globals.USER_DAILY_CARBOHYDRATES, ""));
        double mProteinGoal = Double.valueOf(sharedPreferences.getString(Globals.USER_DAILY_PROTEIN, ""));
        mCalorieGoalMeal = Double.valueOf(sharedPreferences.getString(Globals.USER_CALORIES_TO_REACH_GOAL, "")) / 4;

        icSnack = (ImageView) v.findViewById(R.id.icSnack);
        icBreakfast = (ImageView) v.findViewById(R.id.icBreakfast);
        icLunch = (ImageView) v.findViewById(R.id.icLunch);
        icDinner = (ImageView) v.findViewById(R.id.icDinner);

        // _________________________Calories Snack_____________________________
        double mCalConsumedSnack = 0;
        for (LogMeal logMeal : mLogSnackAdapter.getLogs()) {
            mCalConsumedSnack += logMeal.getCalorieCount();
        }
        mCalSnack.setText(df.format(mCalConsumedSnack));

        // Set icon visible and color based on calories consumed for meal.
        if (mCalConsumedSnack >= mCalorieGoalMeal + 100) {
            icSnack.setImageResource(R.mipmap.ic_check_circle);
            icSnack.setColorFilter(Color.parseColor("#F44336"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else if (mCalConsumedSnack > mCalorieGoalMeal - 100 && mCalConsumedSnack < mCalorieGoalMeal + 99) {
            icSnack.setImageResource(R.mipmap.ic_check_circle);
            icSnack.setColorFilter(Color.parseColor("#4CAF50"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else {
            icSnack.setImageResource(R.mipmap.ic_check);
            icSnack.setColorFilter(Color.parseColor("#6D6D6D"), android.graphics.PorterDuff.Mode.MULTIPLY);
        }

        // _________________________Calories Breakfast_____________________________
        double mCalConsumedBreakfast = 0;
        for (LogMeal logMeal : mLogBreakfastAdapter.getLogs()) {
            mCalConsumedBreakfast += logMeal.getCalorieCount();
        }
        mCalBreakfast.setText(df.format(mCalConsumedBreakfast));

        // Set icon visible and color based on calories consumed for meal.
        if (mCalConsumedBreakfast >= mCalorieGoalMeal + 100) {
            icBreakfast.setColorFilter(Color.parseColor("#F44336"), android.graphics.PorterDuff.Mode.MULTIPLY);
            icBreakfast.setImageResource(R.mipmap.ic_check_circle);
        } else if (mCalConsumedBreakfast > mCalorieGoalMeal - 100
                && mCalConsumedBreakfast < mCalorieGoalMeal + 99) {
            icBreakfast.setColorFilter(Color.parseColor("#4CAF50"), android.graphics.PorterDuff.Mode.MULTIPLY);
            icBreakfast.setImageResource(R.mipmap.ic_check_circle);
        } else {
            icBreakfast.setImageResource(R.mipmap.ic_check);
            icBreakfast.setColorFilter(Color.parseColor("#6D6D6D"), android.graphics.PorterDuff.Mode.MULTIPLY);
        }

        // _________________________Calories Lunch_____________________________
        double mCalConsumedLunch = 0;
        for (LogMeal logMeal : mLogLunchAdapter.getLogs()) {
            mCalConsumedLunch += logMeal.getCalorieCount();
        }
        mCalLunch.setText(df.format(mCalConsumedLunch));

        // Set icon visible and color based on calories consumed for meal.
        if (mCalConsumedLunch >= mCalorieGoalMeal + 100) {
            icLunch.setImageResource(R.mipmap.ic_check_circle);
            icLunch.setColorFilter(Color.parseColor("#F44336"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else if (mCalConsumedLunch > mCalorieGoalMeal - 100 && mCalConsumedLunch < mCalorieGoalMeal + 99) {
            icLunch.setImageResource(R.mipmap.ic_check_circle);
            icLunch.setColorFilter(Color.parseColor("#4CAF50"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else {
            icLunch.setImageResource(R.mipmap.ic_check);
            icLunch.setColorFilter(Color.parseColor("#6D6D6D"), android.graphics.PorterDuff.Mode.MULTIPLY);
        }

        // _________________________Calories Lunch_____________________________
        double mCalConsumedDinner = 0;
        for (LogMeal logMeal : mLogDinnerAdapter.getLogs()) {
            mCalConsumedDinner += logMeal.getCalorieCount();
        }
        mCalDinner.setText(df.format(mCalConsumedDinner));

        // Set icon visible and color based on calories consumed for meal.
        if (mCalConsumedDinner >= mCalorieGoalMeal + 100) {
            icDinner.setImageResource(R.mipmap.ic_check_circle);
            icDinner.setColorFilter(Color.parseColor("#F44336"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else if (mCalConsumedDinner > mCalorieGoalMeal - 100 && mCalConsumedDinner < mCalorieGoalMeal + 99) {
            icDinner.setImageResource(R.mipmap.ic_check_circle);
            icDinner.setColorFilter(Color.parseColor("#4CAF50"), android.graphics.PorterDuff.Mode.MULTIPLY);
        } else {
            icDinner.setImageResource(R.mipmap.ic_check);
            icDinner.setColorFilter(Color.parseColor("#6D6D6D"), android.graphics.PorterDuff.Mode.MULTIPLY);
        }

        // _________________________Calories, Fat, Carbs, Protein All_____________________________
        // Nutrition Consumed
        double mAllCaloriesConsumed = 0;
        double mAllFatConsumed = 0;
        double mAllCarbsConsumed = 0;
        double mAllProteinConsumed = 0;

        for (LogMeal logMeal : mLogAdapterAll.getLogs()) {
            mAllCaloriesConsumed += logMeal.getCalorieCount();
            mAllFatConsumed += logMeal.getFatCount();
            mAllCarbsConsumed += logMeal.getCarbCount();
            mAllProteinConsumed += logMeal.getProteinCount();
        }
        // Nutrition Goals
        // Remainder Nutrition
        mCaloriesRemainder.setText(df.format(mCalorieGoal - mAllCaloriesConsumed) + " Left");
        mFatRemainder.setText(df.format(mFatGoal - mAllFatConsumed) + " Left");
        mCarbRemainder.setText(df.format(mCarbGoal - mAllCarbsConsumed) + " Left");
        mProteinRemainder.setText(df.format(mProteinGoal - mAllProteinConsumed) + " Left");
        // Progress bars

        mPbCalories.setMax(Integer.valueOf(df.format(mCalorieGoal)));
        mPbCalories.setProgress(Integer.valueOf(df.format(mAllCaloriesConsumed)));
        mPbFat.setMax(Integer.valueOf(df.format(mFatGoal)));
        mPbFat.setProgress(Integer.valueOf(df.format(mAllFatConsumed)));
        mPbCarbs.setMax(Integer.valueOf(df.format(mCarbGoal)));
        mPbCarbs.setProgress(Integer.valueOf(df.format(mAllCarbsConsumed)));
        mPbProtein.setMax(Integer.valueOf(df.format(mProteinGoal)));
        mPbProtein.setProgress(Integer.valueOf(df.format(mAllProteinConsumed)));

        /**
         * Update Widget
         */
        Context context = getActivity();
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        if (appWidgetManager != null) {
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
            ComponentName thisWidget = new ComponentName(context, FitHealthWidget.class);

            views.setProgressBar(R.id.pbCal, Integer.valueOf(df.format(mCalorieGoal)),
                    Integer.valueOf(df.format(mAllCaloriesConsumed)), false);
            views.setProgressBar(R.id.pbFat, Integer.valueOf(df.format(mFatGoal)),
                    Integer.valueOf(df.format(mAllFatConsumed)), false);
            views.setProgressBar(R.id.pbCarb, Integer.valueOf(df.format(mCarbGoal)),
                    Integer.valueOf(df.format(mAllCarbsConsumed)), false);
            views.setProgressBar(R.id.pbPro, Integer.valueOf(df.format(mProteinGoal)),
                    Integer.valueOf(df.format(mAllProteinConsumed)), false);

            views.setTextViewText(R.id.txtRemainderCal, df.format(mCalorieGoal - mAllCaloriesConsumed));
            views.setTextViewText(R.id.txtRemainderFat, df.format(mFatGoal - mAllFatConsumed));
            views.setTextViewText(R.id.txtRemainderCarb, df.format(mCarbGoal - mAllCarbsConsumed));
            views.setTextViewText(R.id.txtRemainderPro, df.format(mProteinGoal - mAllProteinConsumed));

            appWidgetManager.updateAppWidget(thisWidget, views);
        }
    }

    /**
     * Bottom Sheet Initiation
     * Sliding Panel Layout
     * After Fab clicked, displays which meal type you would like to add (snack, breakfast, lunch, dinner)
     */
    private void InitializeSlidingPanelLayout() {
        mSlidingLayout = (SlidingUpPanelLayout) v.findViewById(R.id.sliding_layout);
        mSlidingLayout.setPanelSlideListener(this);
        mSliderLayoutHelper = (RelativeLayout) v.findViewById(R.id.slide_helper);
        mSliderLayoutHelper.setOnClickListener(this);
        v.findViewById(R.id.btnSnack).setOnClickListener(this);
        v.findViewById(R.id.btnBreakfast).setOnClickListener(this);
        v.findViewById(R.id.btnLunch).setOnClickListener(this);
        v.findViewById(R.id.btnDinner).setOnClickListener(this);
    }

    // Helper to prevent views below sheet from being clicked
    @Override
    public void onPanelSlide(View view, float v) {
        mSliderLayoutHelper.setVisibility(View.VISIBLE);
        mSliderLayoutHelper.setAlpha(v);
    }

    @Override
    public void onPanelCollapsed(View view) {
        mSliderLayoutHelper.setVisibility(View.GONE);
    }

    @Override
    public void onPanelExpanded(View view) {
        mSliderLayoutHelper.setVisibility(View.VISIBLE);
    }

    @Override
    public void onPanelAnchored(View view) {

    }

    @Override
    public void onPanelHidden(View view) {

    }

    /**
     * DragTopLayout displays the nutrition information
     * Attached to ScrollView
     * When the scrollView y coordinates equal 0, the pull down is enabled
     */

    private void InitializeDragTopLayout() {
        final DragTopLayout mDragLayout = (DragTopLayout) v.findViewById(R.id.drag_layout);
        mDragLayout.setOverDrag(false);
        mDragLayout.toggleTopView();
        mDragLayout.listener(this);
        final ScrollView mScrollView = (ScrollView) v.findViewById(R.id.scrollView);
        mScrollView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mDragLayout.setTouchMode(AttachUtil.isScrollViewAttach(mScrollView));
                return false;
            }
        });
        mCaloriePullDownView = (LinearLayout) v.findViewById(R.id.view4);
        Equations.dpToPx(getActivity(), 100);
        pullDownItems = (LinearLayout) v.findViewById(R.id.pullDownIems);
        mCalories = (TextView) v.findViewById(R.id.txtCalories);
        mCaloriesRemainder = (TextView) v.findViewById(R.id.txtRemainderCalories);
        mCalories.setTextSize(0);
        mCaloriesRemainder.setTextSize(0);
        View v1 = v.findViewById(R.id.view1);
        View v2 = v.findViewById(R.id.view2);
        View v3 = v.findViewById(R.id.view3);
        slide_down_padding = Math.round(Equations.dpToPx(getActivity(), 90));
        v1.setPadding(slide_down_padding, 0, slide_down_padding, 0);
        v2.setPadding(slide_down_padding, 0, slide_down_padding, 0);
        v3.setPadding(slide_down_padding, 0, slide_down_padding, 0);
    }

    // Animation of views
    @Override
    public void onSliding(float v) {
        int padding = Integer.valueOf(df.format(this.slide_down_padding * v));
        mCaloriePullDownView.setPadding(padding, 0, padding, 0);
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics());
        int tes = Integer.valueOf(df.format((double) v * px));
        float max = 32 * v;
        if (max >= 14)
            max = 14;
        mCalories.setTextSize(max);
        mCalories.setAlpha(v);
        mCalories.setPadding(tes, tes - 2, tes, tes);
        mCaloriesRemainder.setTextSize(max);
        mCaloriesRemainder.setAlpha(v);
        mCaloriesRemainder.setPadding(tes, tes, tes, tes);
        pullDownItems.setAlpha(v);
    }

    @Override
    public void onPanelStateChanged(DragTopLayout.PanelState panelState) {
    }

    @Override
    public void onRefresh() {
    }

    /**
     * Context Menu Initiation
     * Move Meal or Delete Meal
     */
    private int contextListChoice;
    private int contextListPosition;

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        String[] menuItems = getResources().getStringArray(R.array.context_menu);
        switch (v.getId()) {
        case R.id.listSnack:
            for (int i = 0; i < menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }
            contextListChoice = 1;
            break;
        case R.id.listBreakfast:
            for (int i = 0; i < menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }
            contextListChoice = 2;
            break;
        case R.id.listLunch:
            for (int i = 0; i < menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }
            contextListChoice = 3;
            break;
        case R.id.listDinner:
            for (int i = 0; i < menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }
            contextListChoice = 4;
            break;
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        int menuItemIndex = item.getItemId();
        contextListPosition = info.position;
        AlertDialog.Builder builderSingle = new AlertDialog.Builder(getActivity()).setTitle("Move Meal To:");
        final ArrayAdapter<String> mAdapterMoveMeal = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1);
        mAdapterMoveMeal.add("Snack");
        mAdapterMoveMeal.add("Breakfast");
        mAdapterMoveMeal.add("Lunch");
        mAdapterMoveMeal.add("Dinner");
        builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builderSingle.setAdapter(mAdapterMoveMeal, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String strName = mAdapterMoveMeal.getItem(which);
                if (contextListChoice == 1) {
                    LogMeal logMeals = mLogSnackAdapter.getItem(contextListPosition);
                    logMeals.setMealChoice(strName);
                    logMeals.edit();
                    initializeAdapters(mDate);
                }
                if (contextListChoice == 2) {
                    LogMeal logMeals = mLogBreakfastAdapter.getItem(contextListPosition);
                    logMeals.setMealChoice(strName);
                    logMeals.edit();
                    initializeAdapters(mDate);
                }
                if (contextListChoice == 3) {
                    LogMeal logMeals = mLogLunchAdapter.getItem(contextListPosition);
                    logMeals.setMealChoice(strName);
                    logMeals.edit();
                    initializeAdapters(mDate);
                }
                if (contextListChoice == 4) {
                    LogMeal logMeals = mLogDinnerAdapter.getItem(contextListPosition);
                    logMeals.setMealChoice(strName);
                    logMeals.edit();
                    initializeAdapters(mDate);
                }
                updateListViews();
            }

        });
        switch (contextListChoice) {
        case 1:
            switch (menuItemIndex) {
            case 0:
                LogMeal logMeals = mLogSnackAdapter.getItem(contextListPosition);
                logMeals.delete();
                mLogSnackAdapter.remove(logMeals);
                mLogSnackAdapter.notifyDataSetChanged();
                testing();
                initializeAdapters(new Date());
                refreshOnDelete();
                updateListViews();
                equations();
                break;
            case 1:
                builderSingle.show();
                break;
            }
            break;
        case 2:
            switch (menuItemIndex) {
            case 0:
                LogMeal logMeals = mLogBreakfastAdapter.getItem(contextListPosition);
                logMeals.delete();
                mLogBreakfastAdapter.remove(logMeals);
                mLogBreakfastAdapter.notifyDataSetChanged();
                testing();
                initializeAdapters(new Date());
                refreshOnDelete();
                updateListViews();
                equations();
                break;
            case 1:
                builderSingle.show();
                break;
            }
            break;
        case 3:
            switch (menuItemIndex) {
            case 0:
                LogMeal logMeals = mLogLunchAdapter.getItem(contextListPosition);
                logMeals.delete();
                mLogLunchAdapter.remove(logMeals);
                mLogLunchAdapter.notifyDataSetChanged();
                testing();
                initializeAdapters(new Date());
                refreshOnDelete();
                updateListViews();
                equations();
                break;
            case 1:
                builderSingle.show();
                break;
            }
            break;
        case 4:
            switch (menuItemIndex) {
            case 0:
                LogMeal logMeals = mLogDinnerAdapter.getItem(contextListPosition);
                logMeals.delete();
                mLogDinnerAdapter.remove(logMeals);
                mLogDinnerAdapter.notifyDataSetChanged();
                testing();
                initializeAdapters(new Date());
                refreshOnDelete();
                updateListViews();
                equations();
                break;
            case 1:
                builderSingle.show();
                break;
            }
            break;
        default:
            break;
        }
        return true;
    }

    /**
     * Display Calorie Goal Indicator Information
     */
    private void calorieInfoDialog(String s) {
        double calMin = mCalorieGoalMeal - 100;
        double calMax = mCalorieGoalMeal + 100;
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(s + " Calorie Goal")
                .setMessage("Goal:   " + df.format(calMin) + "  -  " + df.format(calMax) + " Calories")
                .setPositiveButton("Done", null);
        LayoutInflater inflater = getActivity().getLayoutInflater();
        FrameLayout f1 = new FrameLayout(getActivity());
        f1.addView(inflater.inflate(R.layout.dialog_calorie_info, f1, false));
        builder.setView(f1);
        AlertDialog alert = builder.create();
        alert.show();
    }

    /**
     * FitBit Ini
     */
    Bundle savedState;
    TextView fbCaloriesBurned;
    ImageView fbRefresh;
    ProgressBar pbLoad;
    TextView fbCaloriesGoal, fbCaloriesConsumed;

    private void InitiateFitBit(final Date date) {
        llFitBit = (LinearLayout) v.findViewById(R.id.llFitBit);
        fbCaloriesBurned = (TextView) v.findViewById(R.id.fbCaloriesBurned);
        pbLoad = (ProgressBar) v.findViewById(R.id.pbLoad);

        if (sharedPreferences.getString("FITBIT_CONNECTION_STATUS", "").equals("CONNECTED")) {
            llFitBit.setVisibility(View.VISIBLE);
            fbRefresh = (ImageView) v.findViewById(R.id.fbRefresh);
            fbRefresh.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new FitBitCaloriesBurned(getActivity(), date).execute();
                }
            });
            new FitBitCaloriesBurned(getActivity(), date).execute();
        } else {
            llFitBit.setVisibility(View.GONE);
        }
        //todo

    }

    public void FitBit(String s) {
        fbCaloriesBurned.setText(s);
        pbLoad.setVisibility(View.GONE);
        fbRefresh.setVisibility(View.VISIBLE);
        int caloriesBurned = Integer.valueOf(s);
        double mCalorieGoal = Double.valueOf(sharedPreferences.getString(Globals.USER_CALORIES_TO_REACH_GOAL, ""))
                + caloriesBurned;
        fbCaloriesNew.setText("" + df.format(mCalorieGoal));
        fbCaloriesGoal = (TextView) v.findViewById(R.id.fbCaloriesGoalNew);
        fbCaloriesGoal.setText("" + df.format(mCalorieGoal));
        fbCaloriesConsumed = (TextView) v.findViewById(R.id.fbCaloriesConsumed);
        double mAllCaloriesConsumed = 0;
        for (LogMeal logMeal : mLogAdapterAll.getLogs()) {
            mAllCaloriesConsumed += logMeal.getCalorieCount();
        }
        fbCaloriesConsumed.setText(df.format(mAllCaloriesConsumed));
        ProgressBar progressFitbit = (ProgressBar) v.findViewById(R.id.progressFitbit);
        progressFitbit.setMax(Integer.valueOf(df.format(mCalorieGoal)));
        progressFitbit.setProgress(Integer.valueOf(df.format(mAllCaloriesConsumed)));
    }

    public void FitBitLoading() {
        fbCaloriesBurned.setText("...");
        pbLoad.setVisibility(View.VISIBLE);
        fbRefresh.setVisibility(View.GONE);
    }

    private DatabaseHandler db;
    List<DailyCalorieIntake> dailyCalorieIntakes;
    private DailyCalorieAdapter dailyCalorieAdapter;

    private void testing() {
        LogAdapterCalories logAdapterCalories = new LogAdapterCalories(getActivity(), 0,
                LogMeal.logsByDate(new Date()));
        if (dailyCalorieIntakes.size() > 0) {
            double caloriesUpdate = 0;
            for (LogMeal logMeal1 : logAdapterCalories.getLogs()) {
                caloriesUpdate += logMeal1.getCalorieCount();
            }
            DailyCalorieIntake c = dailyCalorieAdapter.getItem(0);
            c.setCalorieIntake(caloriesUpdate);
            db.updateCalories(c);
        } else {
            LogMeal logMeal = logAdapterCalories.getItem(0);
            db.addContact(
                    new DailyCalorieIntake("", logMeal.getCalorieCount(), DateCompare.dateToString(new Date())));
        }
    }

    private void setAdapter(Date newDate) {
        db = new DatabaseHandler(getActivity());
        String date = DateCompare.dateToString(newDate); // Convert date to string
        dailyCalorieIntakes = db.getContactsByDate(date); // filter by string
        dailyCalorieAdapter = new DailyCalorieAdapter(getActivity(), 0, dailyCalorieIntakes);
        if (dailyCalorieIntakes.size() > 0) {
            DailyCalorieIntake c = dailyCalorieAdapter.getItem(0);
        }
    }

    /**
     * Interface to communicate to the parent activity (MainActivity.java)
     */
    private FragmentCallbacks mCallbacks;

    public interface FragmentCallbacks {
        void openNavigationDrawer();

        void openQuickAdd(String mealType);

        void viewMeal(int mId, String MealType, int position, Date d);

        void viewSuggestion(String s, Date d);

        void searchFragment();

        void openCal();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mCallbacks = (FragmentCallbacks) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement Fragment One.");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallbacks = null;
    }

}