/*
* 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;
}
}