package com.eugene.fithealthmaingit.UI.NavFragments; import android.app.Activity; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.StrictMode; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.text.format.DateFormat; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.eugene.fithealthmaingit.Custom.TextViewFont; import com.eugene.fithealthmaingit.FitBit.FitBitActivityAdapter; import com.eugene.fithealthmaingit.FitBit.FitBitActivityResult; import com.eugene.fithealthmaingit.R; import com.eugene.fithealthmaingit.Utilities.Globals; import com.eugene.fithealthmaingit.Utilities.SetListHeight.SetActivityListHeight; import com.temboo.Library.Fitbit.Activities.GetActivities; import com.temboo.Library.Fitbit.Activities.GetActivityDailyGoals; import com.temboo.Library.Fitbit.Devices.GetDevices; import com.temboo.Library.Fitbit.Statistics.GetTimeSeriesByDateRange; import com.temboo.core.TembooSession; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; public class FragmentFitbit extends Fragment { View v; DecimalFormat df = new DecimalFormat("0"); DecimalFormat dfT = new DecimalFormat("0.00"); DecimalFormat dfTwo = new DecimalFormat("00"); private SharedPreferences sharedPreferences; public static String customerKey = "d067e7c1b4d326a71add49b73f573f2f"; public static String customerSecret = "4ea2779049ad25c145b2c83b0496a207"; private TextView stepsGoal; private TextView stepsWalked; private TextView diatanceGoal; private TextView diatanceWalked; TextView device; TextView date; TextView caloriesBurned; ProgressBar progressSteps; ProgressBar progressDistance; ProgressBar fitbitRefreshing, fitbitLoadingActivities; Toolbar toolbar; ImageView deviceType, batteryStatus; int year = 0; int month = 0; int day = 0; String dateChange; TextView sedentary; TextView light; TextView fairly; TextView very; /** * ACTIVITIES */ private ArrayList<FitBitActivityResult> mItem; TextView noActivities; ListView listActivities; FitBitActivityAdapter fitBitActivityAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.fragment_fit_bit, container, false); if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); TextViewFont txtTitle = (TextViewFont) v.findViewById(R.id.txtTitle); txtTitle.setText("Fitbit"); toolbar = (Toolbar) v.findViewById(R.id.toolbar_fitbit); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallbacks.openNavigationDrawer(); } }); fitbitRefreshing = (ProgressBar) v.findViewById(R.id.fitbitRefreshing); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.action_refresh) { toolbar.getMenu().clear(); fitbitRefreshing.setVisibility(View.VISIBLE); new FitbitGetActivityStats().execute(); } return false; } }); stepsGoal = (TextView) v.findViewById(R.id.stepsGoal); stepsWalked = (TextView) v.findViewById(R.id.stepsWalked); diatanceGoal = (TextView) v.findViewById(R.id.diatanceGoal); diatanceWalked = (TextView) v.findViewById(R.id.diatanceWalked); device = (TextView) v.findViewById(R.id.device); deviceType = (ImageView) v.findViewById(R.id.deviceType); batteryStatus = (ImageView) v.findViewById(R.id.batteryStatus); caloriesBurned = (TextView) v.findViewById(R.id.caloriesBurned); date = (TextView) v.findViewById(R.id.date); date.setText("Today, " + DateFormat.format("MMM d", new Date())); progressSteps = (ProgressBar) v.findViewById(R.id.progressSteps); progressDistance = (ProgressBar) v.findViewById(R.id.progressDistance); fitbitLoadingActivities = (ProgressBar) v.findViewById(R.id.fitbitLoadingActivities); /** * Activities */ sedentary = (TextView) v.findViewById(R.id.sedentary); light = (TextView) v.findViewById(R.id.light); fairly = (TextView) v.findViewById(R.id.fairly); very = (TextView) v.findViewById(R.id.very); mItem = new ArrayList<>(); noActivities = (TextView) v.findViewById(R.id.noActivities); listActivities = (ListView) v.findViewById(R.id.listActivities); fitBitActivityAdapter = new FitBitActivityAdapter(getActivity(), mItem); listActivities.setAdapter(fitBitActivityAdapter); SetActivityListHeight.setListViewHeight(listActivities); LoadSavedData(); if (savedInstanceState == null) { new FitbitGetActivityStats().execute(); fitbitRefreshing.setVisibility(View.VISIBLE); } else { fitbitRefreshing.setVisibility(View.GONE); toolbar.getMenu().clear(); toolbar.inflateMenu(R.menu.menu_fit_bit_fragment); fitbitLoadingActivities.setVisibility(View.GONE); updateActivityList(); } return v; } private void updateActivityList() { if (mItem.size() > 0) { listActivities.setVisibility(View.VISIBLE); noActivities.setVisibility(View.GONE); } else { listActivities.setVisibility(View.GONE); noActivities.setVisibility(View.VISIBLE); } } String distance = "0"; String steps = "0"; String distanceGO = "0"; String stepsGo = "0"; String productName = "No Device"; String lastSyncTime = "No Data"; String battery = "No Data"; int calories = 0; String sedentaryMinutes = "0"; String lightlyActiveMinutes = "0"; String fairlyActiveMinutes = "0"; String veryActiveMinutes = "0"; String caloriesOut = "0"; public class FitbitGetActivityStats extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { try { // Set the times Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); year = cal.get(Calendar.YEAR); month = cal.get(Calendar.MONTH) + 1; day = cal.get(Calendar.DAY_OF_MONTH); dateChange = year + "-" + dfTwo.format(month) + "-" + dfTwo.format(day); // Initiate Temboo Session TembooSession session = new TembooSession("eugeneh", "FitHealth", "Gj74tL9HVPoTM84UvJaJjtMaMslhVWE7"); /** * Device connected information */ GetDevices getDevicesChoreo = new GetDevices(session); GetDevices.GetDevicesInputSet getDevicesInputs = getDevicesChoreo.newInputSet(); getDevicesInputs.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getDevicesInputs.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); getDevicesInputs.set_ConsumerSecret(Globals.CUSTOMER_SECRET); getDevicesInputs.set_ConsumerKey(Globals.CUSTOMER_KEY); GetDevices.GetDevicesResultSet getDevicesResults = getDevicesChoreo.execute(getDevicesInputs); try { JSONObject devices = new JSONArray(getDevicesResults.get_Response()).getJSONObject(0); productName = devices.getString("deviceVersion"); lastSyncTime = devices.getString("lastSyncTime"); battery = devices.getString("battery"); } catch (Exception e) { Log.e("ERROR_DEVICE", e.toString()); } /** * Goals */ GetActivityDailyGoals getActivityDailyGoalsChoreo = new GetActivityDailyGoals(session); GetActivityDailyGoals.GetActivityDailyGoalsInputSet getActivityDailyGoalsInputs = getActivityDailyGoalsChoreo.newInputSet(); getActivityDailyGoalsInputs.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getActivityDailyGoalsInputs.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); getActivityDailyGoalsInputs.set_ConsumerSecret(customerSecret); getActivityDailyGoalsInputs.set_ConsumerKey(customerKey); GetActivityDailyGoals.GetActivityDailyGoalsResultSet getActivityDailyGoalsResults = getActivityDailyGoalsChoreo.execute(getActivityDailyGoalsInputs); try { steps = getActivityDailyGoalsResults.get_Steps(); double distanceKmToMiles = Double.valueOf(getActivityDailyGoalsResults.get_Distance()) * 0.62137; distance = String.valueOf(distanceKmToMiles); } catch (Exception e) { Log.e("ERROR_GOALS", e.toString()); } /** * Steps */ GetTimeSeriesByDateRange getTimeSeriesByDateRangeChoreo = new GetTimeSeriesByDateRange(session); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeInputSet getTimeSeriesByDateRangeInputs = getTimeSeriesByDateRangeChoreo.newInputSet(); getTimeSeriesByDateRangeInputs.set_EndDate(dateChange); getTimeSeriesByDateRangeInputs.set_StartDate(dateChange); getTimeSeriesByDateRangeInputs.set_ResourcePath("activities/log/steps"); getTimeSeriesByDateRangeInputs.set_ConsumerSecret(Globals.CUSTOMER_SECRET); getTimeSeriesByDateRangeInputs.set_ConsumerKey(Globals.CUSTOMER_KEY); getTimeSeriesByDateRangeInputs.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getTimeSeriesByDateRangeInputs.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeResultSet getTimeSeriesByDateRangeResults = getTimeSeriesByDateRangeChoreo.execute(getTimeSeriesByDateRangeInputs); try { JSONObject logSteps = new JSONObject(getTimeSeriesByDateRangeResults.get_Response()); JSONArray jsonArray = logSteps.getJSONArray("activities-log-steps"); JSONObject stepsWalked = jsonArray.getJSONObject(0); stepsGo = stepsWalked.get("value").toString(); } catch (JSONException e) { Log.e("ERROR_STEPS", e.toString()); } /** * Distance */ GetTimeSeriesByDateRange getTimeSeriesByDateRangeChoreoDistance = new GetTimeSeriesByDateRange(session); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeInputSet getTimeSeriesByDateRangeInputsDistance = getTimeSeriesByDateRangeChoreoDistance.newInputSet(); getTimeSeriesByDateRangeInputsDistance.set_EndDate(dateChange); getTimeSeriesByDateRangeInputsDistance.set_StartDate(dateChange); getTimeSeriesByDateRangeInputsDistance.set_ResourcePath("activities/log/distance"); getTimeSeriesByDateRangeInputsDistance.set_ConsumerSecret(Globals.CUSTOMER_SECRET); getTimeSeriesByDateRangeInputsDistance.set_ConsumerKey(Globals.CUSTOMER_KEY); getTimeSeriesByDateRangeInputsDistance.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getTimeSeriesByDateRangeInputsDistance.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeResultSet getTimeSeriesByDateRangeResultsDistance = getTimeSeriesByDateRangeChoreoDistance.execute(getTimeSeriesByDateRangeInputsDistance); try { JSONObject logDistance = new JSONObject(getTimeSeriesByDateRangeResultsDistance.get_Response()); JSONArray jsonArrayDistance = logDistance.getJSONArray("activities-log-distance"); JSONObject distance = jsonArrayDistance.getJSONObject(0); double distanceWalkedKmToMiles = Double.valueOf(distance.get("value").toString()) * 0.62137; distanceGO = String.valueOf(distanceWalkedKmToMiles); } catch (Exception e) { Log.e("ERROR_DISTANCE", e.toString()); } /** * Calories Burned */ GetTimeSeriesByDateRange getTimeSeriesByDateRangeChoreoCalories = new GetTimeSeriesByDateRange(session); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeInputSet getTimeSeriesByDateRangeInputsCalories = getTimeSeriesByDateRangeChoreoCalories.newInputSet(); getTimeSeriesByDateRangeInputsCalories.set_EndDate(dateChange); getTimeSeriesByDateRangeInputsCalories.set_StartDate(dateChange); getTimeSeriesByDateRangeInputsCalories.set_ResourcePath("activities/log/activityCalories"); getTimeSeriesByDateRangeInputsCalories.set_ResponseFormat("json"); getTimeSeriesByDateRangeInputsCalories.set_ConsumerSecret(Globals.CUSTOMER_SECRET); getTimeSeriesByDateRangeInputsCalories.set_ConsumerKey(Globals.CUSTOMER_KEY); getTimeSeriesByDateRangeInputsCalories.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getTimeSeriesByDateRangeInputsCalories.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); GetTimeSeriesByDateRange.GetTimeSeriesByDateRangeResultSet getTimeSeriesByDateRangeResultsCalories = getTimeSeriesByDateRangeChoreo.execute(getTimeSeriesByDateRangeInputsCalories); try { JSONObject jsonObject = new JSONObject(getTimeSeriesByDateRangeResultsCalories.get_Response()); JSONArray lifetime = jsonObject.getJSONArray("activities-log-activityCalories"); JSONObject test = lifetime.getJSONObject(0); calories = test.getInt("value"); } catch (JSONException e) { Log.e("ERROR_CALORIES", e.toString()); e.printStackTrace(); } /** *Activity */ GetActivities getActivitiesChoreo = new GetActivities(session); GetActivities.GetActivitiesInputSet getActivitiesInputs = getActivitiesChoreo.newInputSet(); getActivitiesInputs.set_Date(dateChange); getActivitiesInputs.set_ConsumerSecret(Globals.CUSTOMER_SECRET); getActivitiesInputs.set_ConsumerKey(Globals.CUSTOMER_KEY); getActivitiesInputs.set_AccessToken(sharedPreferences.getString("FITBIT_ACCESS_TOKEN", "")); getActivitiesInputs.set_AccessTokenSecret(sharedPreferences.getString("FITBIT_ACCESS_TOKEN_SECRET", "")); GetActivities.GetActivitiesResultSet getActivitiesResults = getActivitiesChoreo.execute(getActivitiesInputs); try { JSONObject jsonResponse = new JSONObject(getActivitiesResults.get_Response()); JSONObject activityGoals = jsonResponse.getJSONObject("goals"); caloriesOut = activityGoals.getString("caloriesOut"); JSONArray activities = jsonResponse.getJSONArray("activities"); for (int i = 0; i < activities.length(); i++) { JSONObject activity = activities.getJSONObject(i); String activity_name = activity.getString("name"); String caloriesBurned = activity.getString("calories"); mItem.add(new FitBitActivityResult(activity_name, caloriesBurned)); } JSONObject summary = jsonResponse.getJSONObject("summary"); sedentaryMinutes = summary.getString("sedentaryMinutes"); lightlyActiveMinutes = summary.getString("lightlyActiveMinutes"); fairlyActiveMinutes = summary.getString("fairlyActiveMinutes"); veryActiveMinutes = summary.getString("veryActiveMinutes"); } catch (Exception e) { Log.e("ERROR_ACTVITY", e.toString()); } } catch (Exception e) { Log.e("ERROR_MAIN", e.toString()); e.printStackTrace(); } return null; } Date convertedDate; @Override protected void onPostExecute(String result) { stepsGoal.setText(steps); stepsWalked.setText(stepsGo); diatanceGoal.setText(dfT.format(Double.valueOf(distance))); diatanceWalked.setText(dfT.format(Double.valueOf(distanceGO))); progressSteps.setMax(Integer.valueOf(steps)); progressSteps.setProgress(Integer.valueOf(stepsGo)); double distanceMax = Double.valueOf(distance) * 100; double distanceCurrent = Double.valueOf(distanceGO) * 100; progressDistance.setMax(Integer.valueOf(df.format(distanceMax))); progressDistance.setProgress(Integer.valueOf(df.format(distanceCurrent))); device.setText(productName); String dateString = lastSyncTime; String str = dateString.replace('T', ' '); String cutString = str.substring(0, 19); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); convertedDate = new Date(); if (productName.equals("Flex")) { deviceType.setImageResource(R.drawable.flex); } else if (productName.equals("Zip")) { deviceType.setImageResource(R.drawable.zip); } else if (productName.equals("One")) { deviceType.setImageResource(R.drawable.one); } else if (productName.equals("Charge")) { deviceType.setImageResource(R.drawable.charge); } else if (productName.equals("ChargeHR")) { deviceType.setImageResource(R.drawable.chargehr); } else if (productName.equals("Surge")) { deviceType.setImageResource(R.drawable.surge); } else { deviceType.setImageResource(R.drawable.flex); } if (battery.equals("Full")) { batteryStatus.setImageResource(R.mipmap.ic_battery_full); } else if (battery.equals("High")) { batteryStatus.setImageResource(R.mipmap.ic_battery_high); } else if (battery.equals("Medium")) { batteryStatus.setImageResource(R.mipmap.ic_battery_medium); } else if (battery.equals("Low")) { batteryStatus.setImageResource(R.mipmap.ic_battery_low); } caloriesBurned.setText(String.valueOf(calories)); savePreferences("DEVICE_NAME", productName); savePreferences("STEPS_GOAL", steps); savePreferences("STEPS_ACTUAL", stepsGo); savePreferences("DISTANCE_GOAL", dfT.format(Double.valueOf(distance))); savePreferences("DISTANCE_ACTUAL", dfT.format(Double.valueOf(distanceGO))); savePreferences("CALORIES_BURNED", String.valueOf(calories)); /** * Activity */ savePreferences("SEDENTARY", sedentaryMinutes); savePreferences("LIGHT_ACTIVITY", lightlyActiveMinutes); savePreferences("FAIR_ACTIVITY", fairlyActiveMinutes); savePreferences("VERY_ACTIVITY", veryActiveMinutes); fitbitRefreshing.setVisibility(View.GONE); toolbar.inflateMenu(R.menu.menu_fit_bit_fragment); fitbitLoadingActivities.setVisibility(View.GONE); fitBitActivityAdapter.notifyDataSetChanged(); updateActivityList(); sedentary.setText(ConvertTime(Integer.valueOf(sedentaryMinutes))); light.setText(ConvertTime(Integer.valueOf(lightlyActiveMinutes))); fairly.setText(ConvertTime(Integer.valueOf(fairlyActiveMinutes))); very.setText(ConvertTime(Integer.valueOf(veryActiveMinutes))); } } private String ConvertTime(int hour) { int hoursS = Integer.valueOf(hour) / 60; int minutesS = Integer.valueOf(hour) % 60; return hoursS + " hours " + minutesS + " minutes"; } private void LoadSavedData() { stepsGoal.setText(sharedPreferences.getString("STEPS_GOAL", "...")); stepsWalked.setText(sharedPreferences.getString("STEPS_ACTUAL", "...")); diatanceGoal.setText(sharedPreferences.getString("DISTANCE_GOAL", "...")); diatanceWalked.setText(sharedPreferences.getString("DISTANCE_ACTUAL", "...")); progressSteps.setMax(Integer.valueOf(sharedPreferences.getString("STEPS_GOAL", "0"))); progressSteps.setProgress(Integer.valueOf(sharedPreferences.getString("STEPS_ACTUAL", "0"))); double distanceMax = Double.valueOf(sharedPreferences.getString("DISTANCE_GOAL", "0")) * 100; double distanceCurrent = Double.valueOf(sharedPreferences.getString("DISTANCE_ACTUAL", "0")) * 100; progressDistance.setMax(Integer.valueOf(df.format(distanceMax))); progressDistance.setProgress(Integer.valueOf(df.format(distanceCurrent))); device.setText(sharedPreferences.getString("DEVICE_NAME", "Device")); productName = sharedPreferences.getString("DEVICE_NAME", "Device"); if (productName.equals("Flex")) { deviceType.setImageResource(R.drawable.flex); } else if (productName.equals("Zip")) { deviceType.setImageResource(R.drawable.zip); } else if (productName.equals("One")) { deviceType.setImageResource(R.drawable.one); } else if (productName.equals("Charge")) { deviceType.setImageResource(R.drawable.charge); } else if (productName.equals("Charge HR")) { deviceType.setImageResource(R.drawable.chargehr); } else if (productName.equals("Surge")) { deviceType.setImageResource(R.drawable.surge); } else { deviceType.setImageResource(R.drawable.flex); } caloriesBurned.setText(sharedPreferences.getString("CALORIES_BURNED", "0")); sedentary.setText(ConvertTime(Integer.valueOf(sharedPreferences.getString("SEDENTARY", "0")))); light.setText(ConvertTime(Integer.valueOf(sharedPreferences.getString("LIGHT_ACTIVITY", "0")))); fairly.setText(ConvertTime(Integer.valueOf(sharedPreferences.getString("FAIR_ACTIVITY", "0")))); very.setText(ConvertTime(Integer.valueOf(sharedPreferences.getString("VERY_ACTIVITY", "0")))); } private void savePreferences(String key, String value) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(key, value).apply(); } private FragmentCallbacks mCallbacks; public interface FragmentCallbacks { void openNavigationDrawer(); } @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; } }