/*
* 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;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.eugene.fithealthmaingit.CalTesting.CalendarTesting;
import com.eugene.fithealthmaingit.Custom.CustomTypefaceSpan;
import com.eugene.fithealthmaingit.HomeScreenWidget.FitHealthWidget;
import com.eugene.fithealthmaingit.UI.ChooseAddMealActivity;
import com.eugene.fithealthmaingit.UI.Dialogs.FragmentSuggestionDialog;
import com.eugene.fithealthmaingit.UI.Dialogs.UpdateWeightDialogFragment;
import com.eugene.fithealthmaingit.UI.MealView.MealViewActivity;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentBlankLoading;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentFitbit;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentHealth;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentJournalMainHome;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentNutritionPager;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentSearch;
import com.eugene.fithealthmaingit.UI.NavFragments.FragmentWeight;
import com.eugene.fithealthmaingit.UI.QuickAddActivity;
import com.eugene.fithealthmaingit.UI.UserInformationActivity;
import com.eugene.fithealthmaingit.Utilities.Globals;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements
FragmentJournalMainHome.FragmentCallbacks,
FragmentNutritionPager.FragmentCallbacks,
FragmentWeight.FragmentCallbacks,
FragmentHealth.FragmentCallbacks,
UpdateWeightDialogFragment.FragmentCallbacks,
FragmentFitbit.FragmentCallbacks {
private DrawerLayout mNavigationDrawer;
private Fragment fragment;
public static final String NAV_ITEM_ID = "navItemId";
private int mNavItemId;
private static final String FIRST_FRAGMENT_ADDED = "is_first_fragment_added";
private boolean isFirstFragmentAdded = false;
private static String FRAGMENT_TAG = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID);
isFirstFragmentAdded = savedInstanceState.getBoolean(FIRST_FRAGMENT_ADDED);
} else {
mNavItemId = R.id.nav_journal;
}
mNavigationDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
// Set menu header text to User Name
TextView mHeaderText = (TextView) findViewById(R.id.txtName);
mHeaderText.setText(PreferenceManager.getDefaultSharedPreferences(this).getString(Globals.USER_NAME, ""));
/**
* Initiate NavigationView
* Inflate Menu based on FitBit connection status
*/
NavigationView mNavigationView = (NavigationView) findViewById(R.id.nav);
if (PreferenceManager.getDefaultSharedPreferences(this).getString("FITBIT_ACCESS_TOKEN", "").equals("")) {
mNavigationView.inflateMenu(R.menu.drawer);
} else {
mNavigationView.inflateMenu(R.menu.drawer_fitbit);
}
mNavigationView.getMenu().findItem(mNavItemId).setChecked(true);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
if (menuItem.getItemId() != R.id.nav_settings) {
mNavItemId = menuItem.getItemId();
switchFragment(menuItem.getItemId());
menuItem.setChecked(true);
Fragment loading = new FragmentBlankLoading();
Bundle b = new Bundle();
b.putInt(NAV_ITEM_ID, mNavItemId);
loading.setArguments(b);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, loading).commit();
} else {
startActivity(new Intent(MainActivity.this, UserInformationActivity.class));
}
handleNavigationDrawer();
return false;
}
});
// Nav Menu Fonts
Menu m = mNavigationView.getMenu();
for (int i = 0; i < m.size(); i++) {
MenuItem mi = m.getItem(i);
//for aapplying a font to subMenu ...
SubMenu subMenu = mi.getSubMenu();
if (subMenu != null && subMenu.size() > 0) {
for (int j = 0; j < subMenu.size(); j++) {
MenuItem subMenuItem = subMenu.getItem(j);
applyFontToMenuItem(subMenuItem);
}
}
//the method we have create in activity
applyFontToMenuItem(mi);
}
switchFragment(mNavItemId);
/**
* Handles Home Screen Widget
* Search and Add
*/
Intent widgetIntent = this.getIntent();
if (widgetIntent != null) {
if (widgetIntent.getAction() != null && savedInstanceState == null) {
if (widgetIntent.getAction().equals(FitHealthWidget.ACTION_SEARCH)) {
// Post delay to allow the app to open and not interfere with animation
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
getSupportFragmentManager().beginTransaction().replace(R.id.containerSearch, new FragmentSearch()).addToBackStack(null).commit();
}
}, 100);
}
if (widgetIntent.getAction().equals(FitHealthWidget.ACTION_ADD)) {
widgetAdd();
}
}
}
}
// Set Nav Menu Fonts
private void applyFontToMenuItem(MenuItem mi) {
Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Regular.ttf");
SpannableString mNewTitle = new SpannableString(mi.getTitle());
mNewTitle.setSpan(new CustomTypefaceSpan("", font), 0, mNewTitle.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
mi.setTitle(mNewTitle);
}
/**
* Handles Navigation Logic
*/
private void switchFragment(int menuId) {
switch (menuId) {
case R.id.nav_journal:
fragment = new FragmentJournalMainHome();
FRAGMENT_TAG = "JOURNAL";
break;
case R.id.nav_nutrition:
fragment = new FragmentNutritionPager();
FRAGMENT_TAG = "NUTRITION";
break;
case R.id.nav_weight:
fragment = new FragmentWeight();
FRAGMENT_TAG = "WEIGHT";
break;
case R.id.nav_health:
fragment = new FragmentHealth();
FRAGMENT_TAG = "HEALTH";
break;
case R.id.nav_fitbit:
fragment = new FragmentFitbit();
FRAGMENT_TAG = "FITBIT";
break;
default:
break;
}
if (fragment != null && !isFirstFragmentAdded) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragment, FRAGMENT_TAG).commit();
isFirstFragmentAdded = true;
}
if (mNavigationDrawer != null)
mNavigationDrawer.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerClosed(View drawerView) {
// Check to see if fragment is NUTRITION, has child fragments.
if (fragment != null && isFirstFragmentAdded && getSupportFragmentManager().findFragmentByTag("NUTRITION") == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragment, FRAGMENT_TAG).commit();
isFirstFragmentAdded = true;
}
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
}
/**
* Interface within all of the fragments controlled by MainActivityController
* Menu icon click within the fragments toolbar
* Opens navigation drawer
*/
@Override
public void openNavigationDrawer() {
handleNavigationDrawer();
}
/**
* Fragment Journal Main Home Listeners
*/
/**
* Interface within FragmentJournalMainHome
* Opens Quick add activity
*
* @param mealType (snack, breakfast, lunch, dinner)
*/
@Override
public void openQuickAdd(String mealType) {
Intent i = new Intent(this, QuickAddActivity.class);
i.putExtra(Globals.MEAL_TYPE, mealType);
startActivity(i);
overridePendingTransition(0, 0);
}
/**
* Interface within FragmentJournalMainHome
* Opens MealViewActivity
* List onItemClickListener
*
* @param mId selected meal Id
* @param MealType (snack, breakfast, lunch, dinner)
* @param position current item selected position
* @param d date the item was added
*/
@Override
public void viewMeal(int mId, String MealType, int position, Date d) {
Intent i = new Intent(this, MealViewActivity.class);
i.putExtra(Globals.DATA_ID, mId);
i.putExtra(Globals.MEAL_TYPE, MealType);
i.putExtra(Globals.MEAL_POSITION, position);
i.putExtra(Globals.MEAL_DATE, d);
startActivity(i);
overridePendingTransition(0, 0);
}
/**
* Interface within FragmentJournalMainHome
* Open suggestion FragmentSuggestionDialog
*
* @param mealType (snack, breakfast, lunch, dinner)
* @param d current date of the fragment
*/
@Override
public void viewSuggestion(String mealType, Date d) {
FragmentManager fm = getSupportFragmentManager();
FragmentSuggestionDialog suggestionFragment = new FragmentSuggestionDialog();
Bundle bundle = new Bundle();
bundle.putString(Globals.MEAL_TYPE, mealType);
bundle.putSerializable(Globals.SUGGESTION_DATE, d);
suggestionFragment.setArguments(bundle);
suggestionFragment.show(fm, FragmentSuggestionDialog.TAG);
}
/**
* Interface within FragmentJournalMainHome
* Opens FragmentSearch
* Search icon menu Item click, quick search to speed up adding meal entries
*/
@Override
public void searchFragment() {
getSupportFragmentManager().beginTransaction().replace(R.id.containerSearch, new FragmentSearch()).addToBackStack(null).commit();
}
public static final int ACTIVITY_ONE_REQUEST = 1; // The request code for ActivityOne
public final static String ACTIVITY_ONE_RESULT = "activity_one"; // Data Argument For Activity One
@Override
public void openCal() {
Intent activityOne = new Intent(this, CalendarTesting.class);
startActivityForResult(activityOne, ACTIVITY_ONE_REQUEST);
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(NAV_ITEM_ID, mNavItemId);
outState.putBoolean(FIRST_FRAGMENT_ADDED, isFirstFragmentAdded);
}
/**
* Used to handle the closing and opening of the Navigation Drawer.
* Prevent repetitive statements
*/
private void handleNavigationDrawer() {
if (mNavigationDrawer != null) {
if (mNavigationDrawer.isDrawerOpen(GravityCompat.START)) {
mNavigationDrawer.closeDrawer(GravityCompat.START);
} else {
mNavigationDrawer.openDrawer(GravityCompat.START);
}
}
}
/**
* Interface within UpdateWeightDialogFragment
* Restarts FragmentWeight to refresh the new new weight saved
* Easier to recall fragment, rather than
*/
@Override
public void updateWeight() {
getSupportFragmentManager().beginTransaction().replace(R.id.container, new FragmentWeight(), "WEIGHT").commit();
}
/**
* Initiate FitBit
*
* @param s calories burned
*/
public void FitBitCaloriesBurned(String s) {
FragmentJournalMainHome fragmentMain = (FragmentJournalMainHome) getSupportFragmentManager().findFragmentByTag("JOURNAL");
if (fragmentMain != null) {
fragmentMain.FitBit(s);
}
}
public void FitBitLoading() {
FragmentJournalMainHome fragmentMain = (FragmentJournalMainHome) getSupportFragmentManager().findFragmentByTag("JOURNAL");
if (fragmentMain != null) {
fragmentMain.FitBitLoading();
}
}
private void widgetAdd() {
AlertDialog.Builder builderSingle = new AlertDialog.Builder(MainActivity.this).setTitle("Choose Meal: ");
final ArrayAdapter<String> mAdapterMoveMeal = new ArrayAdapter<>(MainActivity.this, 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);
Intent i = new Intent(MainActivity.this, ChooseAddMealActivity.class);
i.putExtra(Globals.MEAL_TYPE, strName);
startActivity(i);
}
});
builderSingle.show();
}
/**
* Get the Results from the Other Activities
*
* @param requestCode In this case either 1 = ACTIVITY_ONE_REQUEST or 2 = ACTIVITY_TWO_REQUEST
* @param resultCode Determines whether the request was successful.
* @param data The being sent from other activities via Intent
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ACTIVITY_ONE_REQUEST && resultCode == RESULT_OK) {
if (data.hasExtra(ACTIVITY_ONE_RESULT)) {
Date result = (Date) data.getExtras().get(ACTIVITY_ONE_RESULT);
Fragment fragmentJournalMainHome = new FragmentJournalMainHome();
Bundle bundle = new Bundle();
bundle.putSerializable("DATE", result);
fragmentJournalMainHome.setArguments(bundle);
if (fragmentJournalMainHome != null && result != new Date())
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentJournalMainHome, "JOURNAL").commitAllowingStateLoss();
}
}
}
}