diff --git a/app/src/main/java/io/pslab/activity/LuxMeterActivity.java b/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
index 1b8ded58e..b092d7247 100644
--- a/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
+++ b/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
@@ -96,7 +96,8 @@ public Fragment getSensorFragment() {
@Override
public void getDataFromDataLogger() {
if (getIntent().getExtras() != null && getIntent().getExtras().getBoolean(KEY_LOG)) {
- playingData = true;
+ //playingData = true;
+ viewingData = true;
recordedLuxData = LocalDataLog.with()
.getBlockOfLuxRecords(getIntent().getExtras().getLong(DATA_BLOCK));
String title = titleFormat.format(recordedLuxData.get(0).getTime());
diff --git a/app/src/main/java/io/pslab/fragment/LuxMeterDataFragment.java b/app/src/main/java/io/pslab/fragment/LuxMeterDataFragment.java
index 9cb5741d5..1c9bb85fe 100644
--- a/app/src/main/java/io/pslab/fragment/LuxMeterDataFragment.java
+++ b/app/src/main/java/io/pslab/fragment/LuxMeterDataFragment.java
@@ -10,6 +10,7 @@
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -88,7 +89,6 @@ private enum LUX_SENSOR {INBUILT_SENSOR, BH1750_SENSOR, TSL2561_SENSOR}
private LuxData sensorData;
private float currentMin = 10000;
private float currentMax = 0;
- private boolean playComplete = false;
private YAxis y;
private Unbinder unbinder;
private long previousTimeElapsed = (System.currentTimeMillis() - startTime) / updatePeriod;
@@ -130,7 +130,12 @@ public void onResume() {
recordedLuxArray = new ArrayList<>();
resetInstrumentData();
playRecordedData();
-
+ } else if (luxSensor.viewingData) {
+ sensorLabel.setText(getResources().getString(R.string.recorder));
+ recordedLuxArray = new ArrayList<>();
+ resetInstrumentData();
+ plotAllRecordedData();
+ // TODO: Display the whole graph with filled data
} else if (!luxSensor.isRecording) {
updateGraphs();
sum = 0;
@@ -158,6 +163,41 @@ public void onDestroyView() {
unbinder.unbind();
}
+ private void plotAllRecordedData() {
+ recordedLuxArray.addAll(luxSensor.recordedLuxData);
+ if (recordedLuxArray.size() != 0) {
+ for (LuxData d: recordedLuxArray) {
+ if (currentMax < d.getLux()) {
+ currentMax = d.getLux();
+ }
+ if (currentMin > d.getLux()) {
+ currentMin = d.getLux();
+ }
+ Entry entry = new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getLux());
+ entries.add(entry);
+ sum += entry.getY();
+ }
+ y.setAxisMaximum(currentMax);
+ y.setAxisMinimum(currentMin);
+ y.setLabelCount(10);
+ statMax.setText(String.valueOf(currentMax));
+ statMin.setText(String.valueOf(currentMin));
+ statMean.setText(String.format(Locale.getDefault(), "%.2f", (sum / recordedLuxArray.size())));
+
+ LineDataSet dataSet = new LineDataSet(entries, getString(R.string.lux));
+ dataSet.setDrawCircles(false);
+ dataSet.setDrawValues(false);
+ dataSet.setLineWidth(2);
+ LineData data = new LineData(dataSet);
+
+ mChart.setData(data);
+ mChart.notifyDataSetChanged();
+ mChart.setVisibleXRangeMaximum(80);
+ mChart.moveViewToX(data.getEntryCount());
+ mChart.invalidate();
+ }
+ }
+
private void playRecordedData() {
recordedLuxArray.addAll(luxSensor.recordedLuxData);
try {
@@ -187,44 +227,49 @@ public void run() {
handler.post(new Runnable() {
@Override
public void run() {
- try {
- playComplete = false;
- LuxData d = recordedLuxArray.get(turns);
- turns++;
- if (currentMax < d.getLux()) {
- currentMax = d.getLux();
- statMax.setText(String.valueOf(d.getLux()));
+ if (luxSensor.playingData) {
+ try {
+ LuxData d = recordedLuxArray.get(turns);
+ turns++;
+ if (currentMax < d.getLux()) {
+ currentMax = d.getLux();
+ statMax.setText(String.valueOf(d.getLux()));
+ }
+ if (currentMin > d.getLux()) {
+ currentMin = d.getLux();
+ statMin.setText(String.valueOf(d.getLux()));
+ }
+ y.setAxisMaximum(currentMax);
+ y.setAxisMinimum(currentMin);
+ y.setLabelCount(10);
+ lightMeter.setWithTremble(false);
+ lightMeter.setSpeedAt(d.getLux());
+
+ Entry entry = new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getLux());
+ entries.add(entry);
+ count++;
+ sum += entry.getY();
+ statMean.setText(String.format(Locale.getDefault(), "%.2f", (sum / count)));
+
+ LineDataSet dataSet = new LineDataSet(entries, getString(R.string.lux));
+ dataSet.setDrawCircles(false);
+ dataSet.setDrawValues(false);
+ dataSet.setLineWidth(2);
+ LineData data = new LineData(dataSet);
+
+ mChart.setData(data);
+ mChart.notifyDataSetChanged();
+ mChart.setVisibleXRangeMaximum(80);
+ mChart.moveViewToX(data.getEntryCount());
+ mChart.invalidate();
+ } catch (IndexOutOfBoundsException e) {
+ graphTimer.cancel();
+ graphTimer = null;
+ turns = 0;
+ luxSensor.playingData = false;
+ luxSensor.startedPlay = false;
+ luxSensor.invalidateOptionsMenu();
}
- if (currentMin > d.getLux()) {
- currentMin = d.getLux();
- statMin.setText(String.valueOf(d.getLux()));
- }
- y.setAxisMaximum(currentMax);
- y.setAxisMinimum(currentMin);
- y.setLabelCount(10);
- lightMeter.setWithTremble(false);
- lightMeter.setSpeedAt(d.getLux());
-
- Entry entry = new Entry((float) (d.getTime() - d.getBlock()) / 1000, d.getLux());
- entries.add(entry);
- count++;
- sum += entry.getY();
- statMean.setText(String.format(Locale.getDefault(), "%.2f", (sum / count)));
-
- LineDataSet dataSet = new LineDataSet(entries, getString(R.string.lux));
- dataSet.setDrawCircles(false);
- dataSet.setDrawValues(false);
- dataSet.setLineWidth(2);
- LineData data = new LineData(dataSet);
-
- mChart.setData(data);
- mChart.notifyDataSetChanged();
- mChart.setVisibleXRangeMaximum(80);
- mChart.moveViewToX(data.getEntryCount());
- mChart.invalidate();
- } catch (IndexOutOfBoundsException e) {
- graphTimer.cancel();
- playComplete = true;
}
}
});
@@ -232,15 +277,27 @@ public void run() {
}, 0, timeGap);
}
- public void saveGraph() {
- if (playComplete) {
- mChart.saveToGallery(luxSensor.dateFormat.format(recordedLuxArray.get(0).getTime()), 100);
- Toast.makeText(getActivity(), "Graph saved to gallery", Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(getActivity(), "Wait until the play is complete", Toast.LENGTH_LONG).show();
+ public void playData() {
+ resetInstrumentData();
+ luxSensor.startedPlay = true;
+ try {
+ if (recordedLuxArray.size() > 1) {
+ LuxData i = recordedLuxArray.get(1);
+ long timeGap = i.getTime() - i.getBlock();
+ processRecordedData(timeGap);
+ } else {
+ processRecordedData(0);
+ }
+ } catch (IllegalArgumentException e) {
+ Toast.makeText(getActivity(),
+ getActivity().getResources().getString(R.string.no_data_fetched), Toast.LENGTH_SHORT).show();
}
}
+ public void saveGraph() {
+ // Todo: Implement export here
+ }
+
private void setupInstruments() {
lightMeter.setMaxSpeed(10000);
diff --git a/app/src/main/java/io/pslab/models/PSLabSensor.java b/app/src/main/java/io/pslab/models/PSLabSensor.java
index 6703931e2..25a641c6c 100644
--- a/app/src/main/java/io/pslab/models/PSLabSensor.java
+++ b/app/src/main/java/io/pslab/models/PSLabSensor.java
@@ -5,12 +5,15 @@
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.LocationManager;
+import android.net.Uri;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.CoordinatorLayout;
+import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
@@ -29,6 +32,8 @@
import org.json.JSONArray;
+import java.io.File;
+import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Locale;
@@ -61,6 +66,8 @@ public abstract class PSLabSensor extends AppCompatActivity {
public boolean checkGPSOnResume = false;
public boolean writeHeaderToFile = true;
public boolean playingData = false;
+ public boolean viewingData = false;
+ public boolean startedPlay = false;
public CoordinatorLayout sensorParentView;
public BottomSheetBehavior bottomSheetBehavior;
@@ -240,12 +247,13 @@ private void fillUpFragment() {
}
private void setUpMenu(Menu menu) {
- if (playingData) {
+ if (playingData || viewingData) {
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}
- menu.findItem(R.id.save_graph).setVisible(playingData);
+ menu.findItem(R.id.save_graph).setVisible(viewingData || playingData);
+ menu.findItem(R.id.play_data).setVisible(viewingData || playingData);
}
@Override
@@ -260,6 +268,8 @@ public boolean onCreateOptionsMenu(Menu menu) {
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem record = menu.findItem(R.id.record_data);
record.setIcon(isRecording ? R.drawable.ic_record_stop_white : R.drawable.ic_record_white);
+ MenuItem play = menu.findItem(R.id.play_data);
+ play.setIcon(playingData ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp);
return super.onPrepareOptionsMenu(menu);
}
@@ -286,13 +296,44 @@ public boolean onOptionsItemSelected(MenuItem item) {
dataRecordingCycle();
} else {
stopRecordSensorData();
- CustomSnackBar.showSnackBar(sensorParentView,
- getString(R.string.data_recording_stopped), null, null);
+ final File logDirectory = new File(
+ Environment.getExternalStorageDirectory().getAbsolutePath() +
+ File.separator + CSVLogger.CSV_DIRECTORY + File.separator + getSensorName());
+ String logLocation;
+ try {
+ logLocation = getString(R.string.log_saved_directory) + logDirectory.getCanonicalPath();
+ } catch (IOException e) {
+ // This message wouldn't appear in usual cases. Added in order to handle ex:
+ logLocation = getString(R.string.log_saved_failed);
+ }
+ CustomSnackBar.showSnackBar(sensorParentView, logLocation, null, null);
+ CustomSnackBar.snackbar.setDuration(Snackbar.LENGTH_INDEFINITE);
+ CustomSnackBar.snackbar.setAction(getString(R.string.open), new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Uri selectedUri = Uri.parse(logDirectory.getAbsolutePath());
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(selectedUri, "resource/folder");
+ if (intent.resolveActivityInfo(getPackageManager(), 0) != null) {
+ startActivity(intent);
+ }
+ }
+ });
isRecording = false;
prepareMarkers();
}
invalidateOptionsMenu();
break;
+ case R.id.play_data:
+ playingData = !playingData;
+ if (!startedPlay) {
+ if (getSensorFragment() instanceof LuxMeterDataFragment) {
+ ((LuxMeterDataFragment) getSupportFragmentManager()
+ .findFragmentByTag(getSensorName())).playData();
+ }
+ }
+ invalidateOptionsMenu();
+ break;
case R.id.show_map:
if (psLabPermission.checkPermissions(PSLabSensor.this,
PSLabPermission.MAP_PERMISSION)) {
diff --git a/app/src/main/java/io/pslab/others/CSVLogger.java b/app/src/main/java/io/pslab/others/CSVLogger.java
index f723d8bdd..64f99f1b7 100644
--- a/app/src/main/java/io/pslab/others/CSVLogger.java
+++ b/app/src/main/java/io/pslab/others/CSVLogger.java
@@ -21,7 +21,7 @@ public class CSVLogger {
private String category;
SimpleDateFormat TIME;
- private static final String CSV_DIRECTORY = "PSLab";
+ public static final String CSV_DIRECTORY = "PSLab";
/**
* Constructor initiate logger with a category folder
diff --git a/app/src/main/java/io/pslab/others/CustomSnackBar.java b/app/src/main/java/io/pslab/others/CustomSnackBar.java
index cd3372e56..795131ae9 100644
--- a/app/src/main/java/io/pslab/others/CustomSnackBar.java
+++ b/app/src/main/java/io/pslab/others/CustomSnackBar.java
@@ -15,14 +15,15 @@
*/
public class CustomSnackBar {
+ public static Snackbar snackbar;
+
public static void showSnackBar(@NonNull CoordinatorLayout holderLayout, @NonNull String displayText,
- String actionText, View.OnClickListener clickListener){
- Snackbar snackbar = Snackbar.make(holderLayout,displayText,Snackbar.LENGTH_LONG)
+ String actionText, View.OnClickListener clickListener) {
+ snackbar = Snackbar.make(holderLayout, displayText, Snackbar.LENGTH_LONG)
.setAction(actionText, clickListener);
-
snackbar.setActionTextColor(ContextCompat.getColor(holderLayout.getContext(), R.color.colorPrimary));
View sbView = snackbar.getView();
- TextView textView = sbView.findViewById(android.support.design.R.id.snackbar_text);
+ TextView textView = sbView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.WHITE);
snackbar.show();
}
diff --git a/app/src/main/res/drawable/ic_pause_white_24dp.xml b/app/src/main/res/drawable/ic_pause_white_24dp.xml
new file mode 100644
index 000000000..baf8f08b3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_pause_white_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml b/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml
new file mode 100644
index 000000000..7e05ffccf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/logger_data_item.xml b/app/src/main/res/layout/logger_data_item.xml
index 617a0ba2d..f4f0f1226 100644
--- a/app/src/main/res/layout/logger_data_item.xml
+++ b/app/src/main/res/layout/logger_data_item.xml
@@ -1,6 +1,7 @@
+ android:tint="@color/colorPrimary"
+ tools:ignore="ContentDescription" />
+ android:padding="5dp"
+ android:src="@drawable/ic_map_red_24dp"
+ tools:ignore="ContentDescription" />
+ android:padding="5dp"
+ android:src="@drawable/ic_delete_red_24dp"
+ tools:ignore="ContentDescription" />
diff --git a/app/src/main/res/menu/lux_data_log_menu.xml b/app/src/main/res/menu/lux_data_log_menu.xml
index 085e6e06f..d0966c31d 100644
--- a/app/src/main/res/menu/lux_data_log_menu.xml
+++ b/app/src/main/res/menu/lux_data_log_menu.xml
@@ -6,6 +6,11 @@
android:icon="@drawable/ic_record_white"
android:title="@string/record_csv_data"
app:showAsAction="ifRoom" />
+
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ef55fdc55..676dffbee 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1058,6 +1058,10 @@
Experiment Logged Data Saved
Lux Meter
+ Log saved in\n
+ Could not save the log. Please check storage permission.
+ Open
+ Play
\u2022 The Lux meter can be used to measure the ambient light intensity. This instruments
is compatible with either the built in light sensor on any android device or the BH-1750 light sensor.\n\n
\u2022 If you want to use the sensor BH-1750, connect the sensor to PSLab device as shown below