/**
AirCasting - Share your Air!
Copyright (C) 2011-2012 HabitatMap, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
You can contact the authors by email at <info@habitatmap.org>
*/
package pl.llp.aircasting.activity;
import pl.llp.aircasting.event.ui.StreamUpdateEvent;
import pl.llp.aircasting.model.internal.MeasurementLevel;
import pl.llp.aircasting.R;
import pl.llp.aircasting.event.ui.DoubleTapEvent;
import pl.llp.aircasting.event.ui.ScrollEvent;
import pl.llp.aircasting.event.ui.TapEvent;
import pl.llp.aircasting.model.Measurement;
import pl.llp.aircasting.model.Note;
import pl.llp.aircasting.sensor.ThresholdsHolder;
import pl.llp.aircasting.view.NoisePlot;
import pl.llp.aircasting.view.presenter.MeasurementPresenter;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.TextView;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
import roboguice.inject.InjectView;
import java.util.ArrayList;
import static com.google.common.collect.Iterables.getLast;
import static com.google.common.collect.Lists.newArrayList;
public class GraphActivity extends AirCastingActivity implements View.OnClickListener, MeasurementPresenter.Listener {
@InjectView(R.id.noise_graph) NoisePlot plot;
@InjectView(R.id.graph_begin_time) TextView graphBegin;
@InjectView(R.id.graph_end_time) TextView graphEnd;
@InjectView(R.id.suggest_scroll_left) View scrollLeft;
@InjectView(R.id.suggest_scroll_right) View scrollRight;
@Inject MeasurementPresenter measurementPresenter;
@Inject ThresholdsHolder thresholdsHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.graph);
measurementPresenter.setSensor(sensorManager.getVisibleSensor());
plot.initialize(this, settingsHelper, thresholdsHolder, resourceHelper);
}
@Override
protected void onResume() {
super.onResume();
refresh();
measurementPresenter.registerListener(this);
}
@Override
protected void onPause() {
super.onPause();
measurementPresenter.unregisterListener(this);
}
@Override
protected void addContextSpecificButtons() {
addButton(R.layout.context_button_dashboard);
}
private void refresh() {
runOnUiThread(new Runnable() {
@Override
public void run() {
zoomIn.setEnabled(measurementPresenter.canZoomIn());
zoomOut.setEnabled(measurementPresenter.canZoomOut());
ArrayList<Measurement> measurements = newArrayList(measurementPresenter.getTimelineView());
ArrayList<Note> notes = newArrayList(sessionManager.getNotes());
plot.update(sensorManager.getVisibleSensor(), measurements, notes);
scrollLeft.setVisibility(measurementPresenter.canScrollLeft() ? View.VISIBLE : View.GONE);
scrollRight.setVisibility(measurementPresenter.canScrollRight() ? View.VISIBLE : View.GONE);
updateLabels(measurements);
}
});
}
private void updateLabels(ArrayList<Measurement> measurements) {
if (!measurements.isEmpty()) {
graphBegin.setText(DateFormat.format("hh:mm:ss", measurements.get(0).getTime()));
graphEnd.setText(DateFormat.format("hh:mm:ss", getLast(measurements).getTime()));
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.zoom_in:
zoomIn();
break;
case R.id.zoom_out:
zoomOut();
break;
default:
super.onClick(view);
}
}
@Override
public void onEvent(StreamUpdateEvent event) {
super.onEvent(event);
refresh();
}
private void zoomIn() {
measurementPresenter.zoomIn();
}
private void zoomOut() {
measurementPresenter.zoomOut();
}
@Override
public void onViewUpdated() {
refresh();
}
@Override
public void onAveragedMeasurement(Measurement measurement) {
}
@Subscribe
public void onEvent(TapEvent event) {
if (!plot.onTap(event.getMotionEvent())) {
super.onEvent(event);
}
}
@Override
protected void refreshNotes() {
refresh();
}
@Subscribe
public void onEvent(DoubleTapEvent event) {
zoomIn();
}
@Subscribe
public void onEvent(ScrollEvent event) {
float relativeScroll = event.getDistanceX() / plot.getWidth();
measurementPresenter.scroll(relativeScroll);
}
}