@@ -54,7 +54,7 @@
import de.j4velin.pedometer.util.Logger;
import de.j4velin.pedometer.util.Util;

public class FragmentOverviewController extends Fragment implements SensorEventListener {
public class FragmentOverviewController extends Fragment {

private TextView stepsView, totalView, averageView;

@@ -92,7 +92,6 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe
@Override
public void onClick(final View view) {
showSteps = !showSteps;
stepsDistanceChanged();
}
});

@@ -102,80 +101,6 @@ public void onClick(final View view) {
return v;
}

@Override
public void onResume() {
super.onResume();
getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);

DatabaseManager db = DatabaseManager.getInstance(getActivity());

if (BuildConfig.DEBUG) db.logState();
// read todays offset
todayOffset = db.getSteps(Util.getToday());

SharedPreferences prefs =
getActivity().getSharedPreferences("pedometer", Context.MODE_MULTI_PROCESS);

goal = prefs.getInt("goal", FragmentSettings.DEFAULT_GOAL);
since_boot = db.getCurrentSteps(); // do not use the value from the sharedPreferences
int pauseDifference = since_boot - prefs.getInt("pauseCount", since_boot);

// register a sensorlistener to live update the UI if a step is taken
if (!prefs.contains("pauseCount")) {
SensorManager sm =
(SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_UI, 0);
}

since_boot -= pauseDifference;

total_start = db.getTotalWithoutToday();
total_days = db.getDays();

db.close();

stepsDistanceChanged();
}

/**
* Call this method if the Fragment should update the "steps"/"km" text in
* the pie graph as well as the pie and the bars graphs.
*/
private void stepsDistanceChanged() {
if (showSteps) {
((TextView) getView().findViewById(R.id.unit)).setText(getString(R.string.steps));
} else {
String unit =
getActivity().getSharedPreferences("pedometer", Context.MODE_MULTI_PROCESS)
.getString("stepsize_unit", FragmentSettings.DEFAULT_STEP_UNIT);
if (unit.equals("cm")) {
unit = "km";
} else {
unit = "mi";
}
((TextView) getView().findViewById(R.id.unit)).setText(unit);
}

updatePie();
updateBars();
}

@Override
public void onPause() {
super.onPause();
try {
SensorManager sm =
(SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
sm.unregisterListener(this);
} catch (Exception e) {
e.printStackTrace();
}
DatabaseManager db = DatabaseManager.getInstance(getActivity());
db.saveCurrentSteps(since_boot);
db.close();
}

@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
@@ -196,60 +121,16 @@ public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case R.id.action_split_count:
DialogSplit.getDialog(getActivity(),
total_start + Math.max(todayOffset + since_boot, 0)).show();
return true;
case R.id.action_pause:
SensorManager sm =
(SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
Drawable d;
if (getActivity().getSharedPreferences("pedometer", Context.MODE_MULTI_PROCESS)
.contains("pauseCount")) { // currently paused -> now resumed
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_UI, 0);
item.setTitle(R.string.pause);
d = getResources().getDrawable(R.drawable.ic_pause);
} else {
sm.unregisterListener(this);
item.setTitle(R.string.resume);
d = getResources().getDrawable(R.drawable.ic_resume);
}
d.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
item.setIcon(d);
getActivity().startService(new Intent(getActivity(), PedometerManager.class)
.putExtra("action", PedometerManager.ACTION_PAUSE));
return true;
default:
return ((ActivityMain) getActivity()).optionsItemSelected(item);
}
}

@Override
public void onAccuracyChanged(final Sensor sensor, int accuracy) {
// won't happen
}

@Override
public void onSensorChanged(final SensorEvent event) {
if (BuildConfig.DEBUG)
Logger.log("UI - sensorChanged | todayOffset: " + todayOffset + " since boot: " +
event.values[0]);
if (event.values[0] > Integer.MAX_VALUE || event.values[0] == 0) {
return;
}
if (todayOffset == Integer.MIN_VALUE) {
// no values for today
// we dont know when the reboot was, so set todays steps to 0 by
// initializing them with -STEPS_SINCE_BOOT
todayOffset = -(int) event.values[0];
DatabaseManager db = DatabaseManager.getInstance(getActivity());
db.insertNewDay(Util.getToday(), (int) event.values[0]);
db.close();
}
since_boot = (int) event.values[0];
updatePie();
}



/**
* Updates the pie graph to show todays steps/distance as well as the
@@ -300,65 +181,4 @@ private void updatePie() {
}
}

/**
* Updates the bar graph to show the steps/distance of the last week. Should
* be called when switching from step count to distance.
*/
private void updateBars() {
DatabaseManager db = DatabaseManager.getInstance(getActivity());
Calendar yesterday = Calendar.getInstance();
yesterday.setTimeInMillis(Util.getToday());
yesterday.add(Calendar.DAY_OF_YEAR, -1);
BarChart barChart = (BarChart) getView().findViewById(R.id.bargraph);
if (barChart.getData().size() > 0) barChart.clearChart();
SimpleDateFormat df = new SimpleDateFormat("E", Locale.getDefault());
yesterday.add(Calendar.DAY_OF_YEAR, -6);
int steps;
float distance, stepsize = FragmentSettings.DEFAULT_STEP_SIZE;
boolean stepsize_cm = true;
if (!showSteps) {
// load some more settings if distance is needed
SharedPreferences prefs =
getActivity().getSharedPreferences("pedometer", Context.MODE_MULTI_PROCESS);
stepsize = prefs.getFloat("stepsize_value", FragmentSettings.DEFAULT_STEP_SIZE);
stepsize_cm = prefs.getString("stepsize_unit", FragmentSettings.DEFAULT_STEP_UNIT)
.equals("cm");
}
barChart.setShowDecimal(!showSteps); // show decimal in distance view only
BarModel bm;
for (int i = 0; i < 7; i++) {
steps = db.getSteps(yesterday.getTimeInMillis());
if (steps > 0) {
bm = new BarModel(df.format(new Date(yesterday.getTimeInMillis())), 0,
steps > goal ? Color.parseColor("#99CC00") : Color.parseColor("#0099cc"));
if (showSteps) {
bm.setValue(steps);
} else {
distance = steps * stepsize;
if (stepsize_cm) {
distance /= 100000;
} else {
distance /= 5280;
}
distance = Math.round(distance * 1000) / 1000f; // 3 decimals
bm.setValue(distance);
}
barChart.addBar(bm);
}
yesterday.add(Calendar.DAY_OF_YEAR, 1);
}
if (barChart.getData().size() > 0) {
barChart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
DialogStatistics.getDialog(getActivity(), since_boot).show();
}
});
barChart.startAnimation();
} else {
barChart.setVisibility(View.GONE);
}
db.close();
}

}
@@ -1,14 +1,23 @@
package de.j4velin.pedometer.ui;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import de.j4velin.pedometer.BuildConfig;
import de.j4velin.pedometer.DatabaseManager;
import de.j4velin.pedometer.R;
import de.j4velin.pedometer.util.Logger;
import de.j4velin.pedometer.util.Util;

/**
* A simple {@link Fragment} subclass.
@@ -18,7 +27,7 @@
* Use the {@link FragmentWorkoutViewController#newInstance} factory method to
* create an instance of this fragment.
*/
public class FragmentWorkoutViewController extends Fragment {
public class FragmentWorkoutViewController extends Fragment implements SensorEventListener {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -59,6 +68,12 @@ public void onCreate(Bundle savedInstanceState) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}

// register a sensorlistener to live update the UI if a step is taken
SensorManager sm =
(SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_UI, 0);
}

@Override
@@ -68,13 +83,53 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
return inflater.inflate(R.layout.fragment_workout_view, container, false);
}

@Override
public void onAccuracyChanged(final Sensor sensor, int accuracy) {
// won't happen
}

@Override
public void onSensorChanged(final SensorEvent event) {
if (BuildConfig.DEBUG)
Logger.log("UI - sensorChanged | todayOffset: " + todayOffset + " since boot: " +
event.values[0]);
if (event.values[0] > Integer.MAX_VALUE || event.values[0] == 0) {
return;
}
if (todayOffset == Integer.MIN_VALUE) {
// no values for today
// we dont know when the reboot was, so set todays steps to 0 by
// initializing them with -STEPS_SINCE_BOOT
todayOffset = -(int) event.values[0];
DatabaseManager db = DatabaseManager.getInstance(getActivity());
db.insertNewDay(Util.getToday(), (int) event.values[0]);
db.close();
}
since_boot = (int) event.values[0];
updatePie();
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}

@Override
public void onResume() {
super.onResume();
}

@Override
public void onPause() {
super.onPause();
// Stop sensor here
DatabaseManager db = DatabaseManager.getInstance(getActivity());
// TODO: Save current data
db.close();
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);

This file was deleted.