diff --git a/app/build.gradle b/app/build.gradle
index d48b62d95..db826bb5c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -52,6 +52,8 @@ dependencies {
implementation "com.afollestad.material-dialogs:core:$rootProject.materialDialogsVersion"
implementation "com.jakewharton:butterknife:$rootProject.butterKnifeVersion"
implementation "com.android.support:support-v4:$rootProject.supportLibraryVersion"
+ implementation 'com.android.support:support-v4:27.1.1'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.2'
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion"
implementation "com.github.medyo:android-about-page:$rootProject.androidAboutPageVersion"
implementation "com.github.tiagohm.MarkdownView:library:$rootProject.markDownViewVersion"
@@ -65,6 +67,7 @@ dependencies {
implementation "org.osmdroid:osmdroid-mapsforge:$rootProject.mapsforgeVersion"
implementation "org.osmdroid:osmdroid-geopackage:$rootProject.geoPackageVersion"
implementation "com.android.support:multidex:$rootProject.multiDexVersion"
+ implementation 'io.realm:android-adapters:2.1.1'
testImplementation "junit:junit:$rootProject.junitVersion"
androidTestImplementation("com.android.support.test:runner:$rootProject.testRunnerRulesVersion") {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f7b59593b..7369108fc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -43,9 +43,7 @@
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
-
-
-
+
-
+
-
-
-
+ android:configChanges="keyboardHidden|screenSize|orientation" />
+
@@ -97,7 +94,7 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/java/io/pslab/PSLabApplication.java b/app/src/main/java/io/pslab/PSLabApplication.java
index cbe23e0e9..7c80ccd66 100644
--- a/app/src/main/java/io/pslab/PSLabApplication.java
+++ b/app/src/main/java/io/pslab/PSLabApplication.java
@@ -3,6 +3,7 @@
import android.app.Application;
import io.realm.Realm;
+import io.realm.RealmConfiguration;
/**
* Created by viveksb007 on 4/8/17.
@@ -14,5 +15,9 @@ public class PSLabApplication extends Application {
public void onCreate() {
super.onCreate();
Realm.init(this);
+ RealmConfiguration.Builder v = new RealmConfiguration.Builder().name(Realm.DEFAULT_REALM_NAME)
+ .schemaVersion(0)
+ .deleteRealmIfMigrationNeeded();
+ Realm.setDefaultConfiguration(v.build());
}
}
diff --git a/app/src/main/java/io/pslab/activity/DataLoggerActivity.java b/app/src/main/java/io/pslab/activity/DataLoggerActivity.java
new file mode 100644
index 000000000..9bde96b67
--- /dev/null
+++ b/app/src/main/java/io/pslab/activity/DataLoggerActivity.java
@@ -0,0 +1,86 @@
+package io.pslab.activity;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.DividerItemDecoration;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import io.pslab.R;
+import io.pslab.adapters.SensorLoggerListAdapter;
+import io.pslab.models.SensorLogged;
+import io.realm.Realm;
+import io.realm.RealmResults;
+import io.realm.Sort;
+
+/**
+ * Created by Avjeet on 05/08/18.
+ */
+
+public class DataLoggerActivity extends AppCompatActivity {
+ public static final String CALLER_ACTIVITY = "Caller";
+ @BindView(R.id.recycler_view)
+ RecyclerView recyclerView;
+
+ @BindView(R.id.toolbar)
+ Toolbar toolbar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_data_logger);
+ ButterKnife.bind(this);
+ setSupportActionBar(toolbar);
+ Realm realm = Realm.getDefaultInstance();
+ String caller = getIntent().getStringExtra(CALLER_ACTIVITY);
+ if (caller == null)
+ caller = "";
+
+ RealmResults results;
+ String title;
+ switch (caller) {
+ case "Lux Meter":
+ results = realm.where(SensorLogged.class).equalTo("sensor", caller)
+ .findAll()
+ .sort("dateTimeStart", Sort.DESCENDING);
+ title = caller + " Data";
+ break;
+ default:
+ results = realm.where(SensorLogged.class)
+ .findAll()
+ .sort("dateTimeStart", Sort.DESCENDING);
+ title = getString(R.string.logged_data);
+ }
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+ getSupportActionBar().setTitle(title);
+ }
+ SensorLoggerListAdapter adapter = new SensorLoggerListAdapter(results, this);
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
+ recyclerView.setLayoutManager(linearLayoutManager);
+
+ DividerItemDecoration itemDecor = new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL);
+ recyclerView.addItemDecoration(itemDecor);
+ recyclerView.setAdapter(adapter);
+ }
+
+ @Override
+ public void onBackPressed() {
+ finish();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/app/src/main/java/io/pslab/activity/LuxMeterActivity.java b/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
index 7340f25c1..f4570c2bc 100644
--- a/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
+++ b/app/src/main/java/io/pslab/activity/LuxMeterActivity.java
@@ -30,19 +30,18 @@
import android.widget.TextView;
import android.widget.Toast;
+import butterknife.BindView;
+import butterknife.ButterKnife;
import io.pslab.R;
import io.pslab.fragment.LuxMeterFragmentConfig;
import io.pslab.fragment.LuxMeterFragmentData;
+import io.pslab.fragment.SettingsFragment;
import io.pslab.others.CSVLogger;
import io.pslab.others.CustomSnackBar;
import io.pslab.others.GPSLogger;
import io.pslab.others.MathUtils;
-import io.pslab.fragment.SettingsFragment;
import io.pslab.others.SwipeGestureDetector;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-
public class LuxMeterActivity extends AppCompatActivity {
private static final String PREF_NAME = "customDialogPreference";
@@ -85,6 +84,8 @@ public class LuxMeterActivity extends AppCompatActivity {
private boolean checkGpsOnResume = false;
public boolean locationPref;
private LuxMeterFragmentData selectedFragment;
+ public static final String NAME = "realmData";
+ private SharedPreferences realmPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -92,6 +93,7 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_lux_main);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
+ realmPreferences = getSharedPreferences(NAME, Context.MODE_PRIVATE);
setUpBottomSheet();
bottomNavigationView.setOnNavigationItemSelectedListener
(new BottomNavigationView.OnNavigationItemSelectedListener() {
@@ -215,36 +217,34 @@ public boolean onPrepareOptionsMenu(Menu menu) {
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.record_data:
- if (ContextCompat.checkSelfPermission(this,
- Manifest.permission.WRITE_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA);
- return true;
- }
if (recordData) {
- ((LuxMeterFragmentData)selectedFragment).stopSensorFetching();
+ ((LuxMeterFragmentData) selectedFragment).stopSensorFetching();
invalidateOptionsMenu();
+ Long uniqueRef = realmPreferences.getLong("uniqueCount", 0);
+ selectedFragment.saveDataInRealm(uniqueRef,locationPref,gpsLogger);
+ CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.exp_data_saved), null, null);
+ SharedPreferences.Editor editor = realmPreferences.edit();
+ editor.putLong("uniqueCount", uniqueRef + 1);
+ editor.commit();
recordData = false;
} else {
- luxLogger = new CSVLogger(getString(R.string.lux_meter));
- luxLogger.writeCSVFile("Timestamp,X,Y,Z\n");
- recordData = true;
- ((LuxMeterFragmentData)selectedFragment).startSensorFetching();
- invalidateOptionsMenu();
if (locationPref) {
gpsLogger = new GPSLogger(this, (LocationManager) getSystemService(Context.LOCATION_SERVICE));
if (gpsLogger.isGPSEnabled()) {
recordData = true;
- CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_enabled), null, null);
+ ((LuxMeterFragmentData) selectedFragment).startSensorFetching();
+ invalidateOptionsMenu();
} else {
checkGpsOnResume = true;
}
gpsLogger.startFetchingLocation();
} else {
recordData = true;
- CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_disabled), null, null);
+ ((LuxMeterFragmentData) selectedFragment).startSensorFetching();
+ invalidateOptionsMenu();
}
+ String snackText = getString(R.string.data_recording_start)+"\n"+(locationPref?getString(R.string.location_enabled):getString(R.string.location_disabled));
+ CustomSnackBar.showSnackBar(coordinatorLayout, snackText, null, null);
}
break;
case R.id.show_map:
@@ -260,6 +260,12 @@ public boolean onOptionsItemSelected(MenuItem item) {
break;
case R.id.settings:
startActivity(new Intent(this, SettingsActivity.class));
+ break;
+ case R.id.show_logged_data:
+ Intent intent = new Intent(this, DataLoggerActivity.class);
+ intent.putExtra(DataLoggerActivity.CALLER_ACTIVITY, "Lux Meter");
+ startActivity(intent);
+
break;
default:
break;
@@ -273,38 +279,27 @@ protected void onResume() {
if (checkGpsOnResume) {
if (gpsLogger.isGPSEnabled()) {
recordData = true;
- CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start), null, null);
+ ((LuxMeterFragmentData) selectedFragment).startSensorFetching();
+ invalidateOptionsMenu();
+ gpsLogger.startFetchingLocation();
+ CustomSnackBar.showSnackBar(coordinatorLayout,getString(R.string.data_recording_start)+getString(R.string.location_enabled) , null, null);
} else {
recordData = false;
Toast.makeText(getApplicationContext(), getString(R.string.gps_not_enabled),
Toast.LENGTH_SHORT).show();
+ gpsLogger.removeUpdate();
}
+ checkGpsOnResume = false;
}
locationPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getBoolean(SettingsFragment.KEY_INCLUDE_LOCATION, false);
+ if(!locationPref && gpsLogger!=null){
+ gpsLogger = null;
+ }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA) {
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- if (locationPref) {
- gpsLogger = new GPSLogger(this, (LocationManager) getSystemService(Context.LOCATION_SERVICE));
- if (gpsLogger.isGPSEnabled()) {
- recordData = true;
- CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_enabled), null, null);
- } else {
- checkGpsOnResume = true;
- }
- gpsLogger.startFetchingLocation();
- } else {
- recordData = true;
- CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_disabled), null, null);
- }
- } else {
- Toast.makeText(this, R.string.prmsn_denied_storage, Toast.LENGTH_SHORT).show();
- }
- } else if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS
+ if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent MAP = new Intent(getApplicationContext(), MapsActivity.class);
startActivity(MAP);
diff --git a/app/src/main/java/io/pslab/activity/MainActivity.java b/app/src/main/java/io/pslab/activity/MainActivity.java
index 73267a629..8e38882ef 100644
--- a/app/src/main/java/io/pslab/activity/MainActivity.java
+++ b/app/src/main/java/io/pslab/activity/MainActivity.java
@@ -270,6 +270,12 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
case R.id.nav_app_version:
setTitleColor(R.color.gray);
break;
+ case R.id.sensor_data_logger:
+ if (drawer != null) {
+ drawer.closeDrawers();
+ }
+ startActivity(new Intent(MainActivity.this, DataLoggerActivity.class));
+ break;
default:
navItemIndex = 0;
}
diff --git a/app/src/main/java/io/pslab/activity/SensorGraphViewActivity.java b/app/src/main/java/io/pslab/activity/SensorGraphViewActivity.java
new file mode 100644
index 000000000..f82eb2c48
--- /dev/null
+++ b/app/src/main/java/io/pslab/activity/SensorGraphViewActivity.java
@@ -0,0 +1,319 @@
+package io.pslab.activity;
+
+import android.Manifest;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.github.mikephil.charting.charts.LineChart;
+import com.github.mikephil.charting.components.Legend;
+import com.github.mikephil.charting.components.XAxis;
+import com.github.mikephil.charting.components.YAxis;
+import com.github.mikephil.charting.data.Entry;
+import com.github.mikephil.charting.data.LineData;
+import com.github.mikephil.charting.data.LineDataSet;
+
+import org.osmdroid.api.IMapController;
+import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
+import org.osmdroid.util.GeoPoint;
+import org.osmdroid.views.MapView;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import io.pslab.R;
+import io.pslab.models.LuxData;
+import io.pslab.others.CSVLogger;
+import io.pslab.others.CustomSnackBar;
+import io.realm.Realm;
+import io.realm.RealmResults;
+
+public class SensorGraphViewActivity extends AppCompatActivity {
+ public static final String TYPE_SENSOR = "sensor";
+ public static final String DATA_FOREIGN_KEY = "foreignKey";
+ public static final String DATE_TIME_START = "dateTimeStart";
+ public static final String LATITUDE = "latitude";
+ public static final String LONGITUDE = "longitude";
+ private static final int MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA = 101;
+ private static final int MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS = 102;
+ public static final String DATE_TIME_END = "dateTimeEnd";
+ public static final String TIME_ZONE = "timezone";
+
+
+ @BindView(R.id.chart_lux_meter)
+ LineChart mChart;
+
+ @BindView(R.id.toolbar)
+ Toolbar toolbar;
+
+ @BindView(R.id.date_rec)
+ TextView tv_date;
+
+ @BindView(R.id.time_rec)
+ TextView tv_time;
+
+ @BindView(R.id.data_view_cl)
+ CoordinatorLayout cl;
+
+ @BindView(R.id.osmmap)
+ MapView map;
+
+ @BindView(R.id.loc_lat)
+ TextView tv_lat;
+
+ @BindView(R.id.loc_long)
+ TextView tv_long;
+
+ private Resources resources;
+ private ArrayList entries;
+ private SimpleDateFormat sdd = new SimpleDateFormat("dd MMM yyyy");
+ private SimpleDateFormat sdt = new SimpleDateFormat("HH:mm:ss");
+ private Date startDate;
+ private double latitude;
+ private double longitude;
+ private Date endDate;
+ private String timeZone;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_sensor_graph_view);
+ ButterKnife.bind(this);
+ resources = getResources();
+ Intent intent = getIntent();
+ String sensorType = intent.getStringExtra(TYPE_SENSOR);
+ setSupportActionBar(toolbar);
+
+ map.setTileSource(TileSourceFactory.MAPNIK);
+ map.setBuiltInZoomControls(true);
+ map.setMultiTouchControls(true);
+
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+ getSupportActionBar().setTitle(sensorType + " " + getResources().getString(R.string.data));
+ }
+
+ timeZone = intent.getStringExtra(TIME_ZONE);
+ startDate = new Date(intent.getLongExtra(DATE_TIME_START, 0));
+ endDate = new Date(intent.getLongExtra(DATE_TIME_END, 0));
+ tv_date.setText(sdd.format(startDate));
+ tv_time.setText(sdt.format(startDate));
+
+ latitude = intent.getDoubleExtra(LATITUDE, 0.0);
+ longitude = intent.getDoubleExtra(LONGITUDE, 0.0);
+
+ Thread thread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ IMapController mapController = map.getController();
+ mapController.setZoom((double) 9);
+ GeoPoint startPoint = new GeoPoint(latitude, latitude);
+ mapController.setCenter(startPoint);
+ }
+ });
+
+ if (latitude != 0.0 && longitude != 0.0) {
+ tv_lat.setText(String.valueOf(latitude));
+ tv_long.setText(String.valueOf(longitude));
+ thread.start();
+ } else {
+ tv_lat.setText("NA");
+ tv_long.setText("NA");
+ }
+
+ Long foreignKey = intent.getLongExtra(DATA_FOREIGN_KEY, -1);
+ Realm realm = Realm.getDefaultInstance();
+ entries = new ArrayList<>();
+ RealmResults results = realm.where(LuxData.class).equalTo(DATA_FOREIGN_KEY, foreignKey).findAll();
+ for (LuxData item : results) {
+ entries.add(new Entry((float) item.getTimeElapsed(), item.getLux()));
+ }
+
+ XAxis x = mChart.getXAxis();
+ YAxis y = mChart.getAxisLeft();
+ YAxis y2 = mChart.getAxisRight();
+
+ mChart.setTouchEnabled(true);
+ mChart.setHighlightPerDragEnabled(true);
+ mChart.setDragEnabled(true);
+ mChart.setScaleEnabled(true);
+ mChart.setDrawGridBackground(false);
+ mChart.setPinchZoom(true);
+ mChart.setScaleYEnabled(false);
+ mChart.setBackgroundColor(Color.BLACK);
+ mChart.getDescription().setEnabled(false);
+
+ LineData data = new LineData();
+ mChart.setData(data);
+
+ Legend l = mChart.getLegend();
+ l.setForm(Legend.LegendForm.LINE);
+ l.setTextColor(Color.WHITE);
+
+ x.setTextColor(Color.WHITE);
+ x.setDrawGridLines(true);
+ x.setAvoidFirstLastClipping(true);
+
+ y.setTextColor(Color.WHITE);
+ y.setDrawGridLines(true);
+ y.setLabelCount(10);
+
+ y2.setDrawGridLines(false);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ LineDataSet dataSet = new LineDataSet(entries, getString(R.string.lux));
+ LineData data = new LineData(dataSet);
+ dataSet.setDrawCircles(false);
+ dataSet.setDrawValues(false);
+ dataSet.setLineWidth(2);
+ mChart.setData(data);
+ mChart.invalidate();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.activity_show_item_logged_data, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ case R.id.export_logged_data:
+ if (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA);
+ } else {
+ exportData();
+ }
+ break;
+ case R.id.simulate:
+ simulateData();
+ }
+ return false;
+ }
+
+ private void exportData() {
+ boolean firstDataRow = true;
+
+ CSVLogger luxLogger = new CSVLogger(getResources().getString(R.string.lux_meter));
+ luxLogger.writeCSVFile(resources.getString(R.string.time_elapsed)
+ + "," + resources.getString(R.string.lux)
+ + "," + resources.getString(R.string.date_of_rec)
+ + "," + getString(R.string.start_time)
+ + "," + getString(R.string.end_time)
+ + "," + resources.getString(R.string.latitude)
+ + "," + resources.getString(R.string.longitude)
+ + "," + getString(R.string.timezone)
+ + "," + getString(R.string.dev_model)
+ + "," + getString(R.string.dev_brand)
+ + "," + getString(R.string.dev_android_sdk) + "\n");
+
+ String data;
+ for (Entry item : entries) {
+ if (firstDataRow) {
+ data = String.valueOf(item.getX())
+ + "," + String.valueOf(item.getY())
+ + "," + sdd.format(startDate)
+ + "," + sdt.format(startDate)
+ + "," + sdt.format(endDate);
+
+ if (latitude != 0.0 && longitude != 0.0) {
+ data += "," + String.valueOf(latitude) + "," + String.valueOf(longitude);
+ } else {
+ data += ",NA,NA";
+ }
+
+ data += "," + timeZone
+ + "," + Build.MODEL
+ + "," + Build.MANUFACTURER
+ + "," + String.valueOf(Build.VERSION.SDK_INT) + "\n";
+
+ firstDataRow = false;
+ } else {
+ data = String.valueOf(item.getX()) + "," + String.valueOf(item.getY()) + "\n";
+ }
+ luxLogger.writeCSVFile(data);
+ }
+ CustomSnackBar.showSnackBar(cl, getResources().getString(R.string.csv_store_text) + luxLogger.getCurrentFilePath(), null, null);
+ }
+
+ private void simulateData() {
+ mChart.clear();
+ mChart.invalidate();
+ final ArrayList simulateData = new ArrayList<>();
+
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ for (Entry item : entries) {
+ simulateData.add(item);
+ LineDataSet dataSet = new LineDataSet(simulateData, getString(R.string.lux));
+ LineData data = new LineData(dataSet);
+ dataSet.setDrawCircles(false);
+ dataSet.setDrawValues(false);
+ dataSet.setLineWidth(2);
+
+ mChart.setData(data);
+ mChart.invalidate();
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ };
+ Thread thread = new Thread(runnable);
+ thread.start();
+ }
+
+ @Override
+ public void onBackPressed() {
+ finish();
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+
+ if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA) {
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ exportData();
+ } else {
+ Toast.makeText(this, R.string.prmsn_denied_storage, Toast.LENGTH_SHORT).show();
+ }
+ } else if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ Intent MAP = new Intent(getApplicationContext(), MapsActivity.class);
+ startActivity(MAP);
+ }
+ }
+}
diff --git a/app/src/main/java/io/pslab/activity/ShowLoggedData.java b/app/src/main/java/io/pslab/activity/ShowLoggedData.java
index 087faa299..5fd1222fa 100644
--- a/app/src/main/java/io/pslab/activity/ShowLoggedData.java
+++ b/app/src/main/java/io/pslab/activity/ShowLoggedData.java
@@ -42,6 +42,7 @@
/**
* Created by viveksb007 on 12/8/17.
+ * deprecated
*/
public class ShowLoggedData extends AppCompatActivity {
@@ -289,7 +290,7 @@ public void onBackPressed() {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_show_logged_data, menu);
+ getMenuInflater().inflate(R.menu.activity_show_item_logged_data, menu);
return true;
}
diff --git a/app/src/main/java/io/pslab/adapters/SensorLoggerListAdapter.java b/app/src/main/java/io/pslab/adapters/SensorLoggerListAdapter.java
new file mode 100644
index 000000000..4c91ee071
--- /dev/null
+++ b/app/src/main/java/io/pslab/adapters/SensorLoggerListAdapter.java
@@ -0,0 +1,95 @@
+package io.pslab.adapters;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.pslab.R;
+import io.pslab.activity.SensorGraphViewActivity;
+import io.pslab.models.LuxData;
+import io.pslab.models.SensorLogged;
+import io.realm.Realm;
+import io.realm.RealmRecyclerViewAdapter;
+import io.realm.RealmResults;
+
+/**
+ * Created by Avjeet on 03-08-2018.
+ */
+public class SensorLoggerListAdapter extends RealmRecyclerViewAdapter {
+
+
+ private Activity context;
+ private SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
+ private Realm realm;
+
+ public SensorLoggerListAdapter(RealmResults results, Activity context) {
+ super(results, true, true);
+ this.context = context;
+ realm = Realm.getDefaultInstance();
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.logger_data_item, parent, false);
+ return new ViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
+ SensorLogged temp = getItem(position);
+ holder.sensor.setText(temp.getSensor());
+ Date date = new Date(temp.getDateTimeStart());
+ holder.dateTime.setText(String.valueOf(sdf.format(date)));
+ holder.cardView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ SensorLogged item = getItem(holder.getAdapterPosition());
+ Intent intent = new Intent(context, SensorGraphViewActivity.class);
+ intent.putExtra(SensorGraphViewActivity.TYPE_SENSOR, item.getSensor());
+ intent.putExtra(SensorGraphViewActivity.DATA_FOREIGN_KEY, item.getUniqueRef());
+ intent.putExtra(SensorGraphViewActivity.DATE_TIME_START,item.getDateTimeStart());
+ intent.putExtra(SensorGraphViewActivity.DATE_TIME_END,item.getDateTimeEnd());
+ intent.putExtra(SensorGraphViewActivity.TIME_ZONE,item.getTimeZone());
+ intent.putExtra(SensorGraphViewActivity.LATITUDE,item.getLatitude());
+ intent.putExtra(SensorGraphViewActivity.LONGITUDE,item.getLongitude());
+ context.startActivity(intent);
+ }
+ });
+ holder.deleteIcon.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ RealmResults sensorItem = realm.where(SensorLogged.class).equalTo("uniqueRef", getItem(holder.getAdapterPosition()).getUniqueRef()).findAll();
+ RealmResults results = realm.where(LuxData.class).equalTo("foreignKey", getItem(holder.getAdapterPosition()).getUniqueRef()).findAll();
+ realm.beginTransaction();
+ results.deleteAllFromRealm();
+ sensorItem.deleteAllFromRealm();
+ realm.commitTransaction();
+ }
+ });
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder {
+ private TextView sensor, dateTime;
+ private ImageView deleteIcon;
+ private CardView cardView;
+
+ public ViewHolder(View itemView) {
+ super(itemView);
+ dateTime = itemView.findViewById(R.id.date_time);
+ sensor = itemView.findViewById(R.id.sensor_name);
+ deleteIcon = itemView.findViewById(R.id.delete_item);
+ cardView = itemView.findViewById(R.id.data_item_card);
+ }
+ }
+}
diff --git a/app/src/main/java/io/pslab/fragment/LuxMeterFragmentData.java b/app/src/main/java/io/pslab/fragment/LuxMeterFragmentData.java
index 53bee4270..4d8eb346a 100644
--- a/app/src/main/java/io/pslab/fragment/LuxMeterFragmentData.java
+++ b/app/src/main/java/io/pslab/fragment/LuxMeterFragmentData.java
@@ -1,8 +1,6 @@
package io.pslab.fragment;
import android.annotation.SuppressLint;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
@@ -11,9 +9,9 @@
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.support.design.widget.CoordinatorLayout;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -28,24 +26,24 @@
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
-import io.pslab.R;
-import io.pslab.activity.LuxMeterActivity;
-import io.pslab.communication.ScienceLab;
-import io.pslab.communication.sensors.BH1750;
-import io.pslab.communication.sensors.TSL2561;
-import io.pslab.others.CSVLogger;
-import io.pslab.others.GPSLogger;
-import io.pslab.others.ScienceLabCommon;
-import io.pslab.communication.peripherals.I2C;
-import io.pslab.others.CustomSnackBar;
-
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
+import java.util.TimeZone;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
+import io.pslab.R;
+import io.pslab.communication.ScienceLab;
+import io.pslab.communication.peripherals.I2C;
+import io.pslab.communication.sensors.BH1750;
+import io.pslab.communication.sensors.TSL2561;
+import io.pslab.models.LuxData;
+import io.pslab.models.SensorLogged;
+import io.pslab.others.GPSLogger;
+import io.pslab.others.ScienceLabCommon;
+import io.realm.Realm;
import static android.content.Context.SENSOR_SERVICE;
@@ -74,8 +72,10 @@ public class LuxMeterFragmentData extends Fragment {
private Sensor sensor;
private ScienceLab scienceLab;
private long startTime;
+ private long endTime;
private int flag;
private ArrayList entries;
+ private ArrayList luxRealmData;
private float currentMin;
private float currentMax;
private YAxis y;
@@ -84,6 +84,7 @@ public class LuxMeterFragmentData extends Fragment {
private long previousTimeElapsed = (System.currentTimeMillis() - startTime) / 1000;
private GPSLogger gpsLogger;
private Runnable runnable;
+ private Realm realm;
public static LuxMeterFragmentData newInstance() {
return new LuxMeterFragmentData();
@@ -102,6 +103,8 @@ public void onCreate(Bundle savedInstanceState) {
currentMin = 10000;
currentMax = 30;
entries = new ArrayList<>();
+ luxRealmData = new ArrayList<>();
+ realm = Realm.getDefaultInstance();
switch (sensorType) {
case 0:
sensorManager = (SensorManager) getContext().getSystemService(SENSOR_SERVICE);
@@ -304,64 +307,18 @@ private void visualizeData() {
lightMeter.setPointerColor(Color.RED);
else
lightMeter.setPointerColor(Color.WHITE);
-
timeElapsed = ((System.currentTimeMillis() - startTime) / 1000);
if (timeElapsed != previousTimeElapsed) {
previousTimeElapsed = timeElapsed;
- entries.add(new Entry((float) timeElapsed, data));
- final LuxMeterActivity parent = (LuxMeterActivity) getActivity();
- for (Entry item : entries) {
- assert parent != null;
-
- if (parent.recordData) {
- gpsLogger = parent.gpsLogger;
- String data = String.valueOf(System.currentTimeMillis()) + "," +
- item.getX() + "," + item.getY() + "\n";
- parent.luxLogger.writeCSVFile(data);
- }
-
- if (parent.exportData) {
- parent.exportData = false;
- if (parent.locationPref && gpsLogger != null) {
- String data;
- Location location = gpsLogger.getBestLocation();
- if (location != null) {
- data = "\nLocation" + "," + String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude() + "\n");
- } else {
- data = "\nLocation" + "," + "null" + "," + "null";
- }
- parent.luxLogger.writeCSVFile(data);
- gpsLogger.removeUpdate();
- }
- CustomSnackBar.showSnackBar((CoordinatorLayout) parent.findViewById(R.id.cl),
- getString(R.string.csv_store_text) + " " + parent.luxLogger.getCurrentFilePath()
- , getString(R.string.delete_capital), new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- new AlertDialog.Builder(parent, R.style.AlertDialogStyle)
- .setTitle(R.string.delete_file)
- .setMessage(R.string.delete_warning)
- .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- parent.luxLogger.deleteFile();
- }
- })
- .setNegativeButton(R.string.cancel, null)
- .create()
- .show();
- }
- });
- }
+ Entry entry = new Entry((float) timeElapsed, data);
+ entries.add(entry);
+ Long currentTime = System.currentTimeMillis();
+ LuxData tempObject = new LuxData(data, currentTime, timeElapsed);
+ luxRealmData.add(tempObject);
- count++;
- sum += item.getY();
- }
- try {
- statMean.setText(Float.toString(Float.valueOf(df.format(sum / count))));
- } catch (NumberFormatException e) {
- statMean.setText(getString(R.string.lux_meter_none));
- }
+ count++;
+ sum += entry.getY();
+ statMean.setText(Float.toString(Float.valueOf(df.format(sum / count))));
LineDataSet dataSet = new LineDataSet(entries, getString(R.string.lux));
LineData data = new LineData(dataSet);
@@ -395,12 +352,15 @@ public void startSensorFetching() {
monitor = true;
flag = 0;
lightMeter.setWithTremble(true);
+
Thread dataThread = new Thread(runnable);
+
dataThread.start();
}
public void stopSensorFetching() {
monitor = false;
+ endTime = System.currentTimeMillis();
if (sensor != null && sensorDataFetch != null) {
sensorManager.unregisterListener(sensorDataFetch);
sensorDataFetch.cancel(true);
@@ -410,4 +370,46 @@ public void stopSensorFetching() {
}
}
+ public void saveDataInRealm(Long uniqueRef, boolean includeLocation, GPSLogger gpsLogger) {
+ realm.beginTransaction();
+
+ SensorLogged sensorLogged = realm.createObject(SensorLogged.class, uniqueRef);
+ sensorLogged.setSensor("Lux Meter");
+ sensorLogged.setDateTimeStart(startTime);
+ sensorLogged.setDateTimeEnd(endTime);
+ sensorLogged.setTimeZone(TimeZone.getDefault().getDisplayName());
+
+ if (includeLocation && gpsLogger != null) {
+ Location location = gpsLogger.getBestLocation();
+ if (location != null) {
+ sensorLogged.setLatitude(location.getLatitude());
+ sensorLogged.setLongitude(location.getLongitude());
+ } else {
+ sensorLogged.setLatitude(0.0);
+ sensorLogged.setLongitude(0.0);
+ }
+ gpsLogger.removeUpdate();
+ } else {
+ sensorLogged.setLatitude(0.0);
+ sensorLogged.setLongitude(0.0);
+ }
+
+ for (int i = 0; i < luxRealmData.size(); i++) {
+ LuxData tempObject = luxRealmData.get(i);
+ tempObject.setId(i);
+ tempObject.setForeignKey(uniqueRef);
+ realm.copyToRealm(tempObject);
+ Log.i("dataResult", String.valueOf(tempObject.getLux()));
+ }
+ realm.copyToRealm(sensorLogged);
+ realm.commitTransaction();
+ luxRealmData.clear();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mChart.clear();
+ mChart.invalidate();
+ }
}
diff --git a/app/src/main/java/io/pslab/models/LuxData.java b/app/src/main/java/io/pslab/models/LuxData.java
new file mode 100644
index 000000000..3db2e43e7
--- /dev/null
+++ b/app/src/main/java/io/pslab/models/LuxData.java
@@ -0,0 +1,53 @@
+package io.pslab.models;
+
+
+import io.realm.RealmObject;
+
+
+/**
+ * Created by Your name on 31-07-2018.
+ */
+public class LuxData extends RealmObject {
+ private long foreignKey;
+ private long id;
+ private long time;
+ private float lux;
+ private long timeElapsed;
+
+ public LuxData() {
+ }
+
+ public LuxData(float lux, long time, long timeElapsed) {
+ this.lux = lux;
+ this.time = time;
+ this.timeElapsed = timeElapsed;
+ }
+ public long getForeignKey() {
+ return foreignKey;
+ }
+
+ public void setForeignKey(long foreignKey) {
+ this.foreignKey = foreignKey;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+
+ public long getTime() {
+ return time;
+ }
+
+ public float getLux() {
+ return lux;
+ }
+
+ public long getTimeElapsed() {
+ return timeElapsed;
+ }
+}
diff --git a/app/src/main/java/io/pslab/models/SensorLogged.java b/app/src/main/java/io/pslab/models/SensorLogged.java
index 4d30a25c3..26b71f1ff 100644
--- a/app/src/main/java/io/pslab/models/SensorLogged.java
+++ b/app/src/main/java/io/pslab/models/SensorLogged.java
@@ -1,6 +1,7 @@
package io.pslab.models;
import io.realm.RealmObject;
+import io.realm.annotations.PrimaryKey;
/**
* Created by viveksb007 on 15/8/17.
@@ -9,6 +10,14 @@
public class SensorLogged extends RealmObject {
private String sensor;
+ private long dateTimeStart;
+ @PrimaryKey
+ private long uniqueRef;
+ private double latitude;
+ private double longitude;
+ private long dateTimeEnd;
+ private String timeZone;
+
public SensorLogged() {
}
@@ -24,4 +33,54 @@ public String getSensor() {
public void setSensor(String sensor) {
this.sensor = sensor;
}
+
+ public long getDateTimeStart() {
+ return dateTimeStart;
+ }
+
+ public void setDateTimeStart(long dateTimeStart) {
+ this.dateTimeStart = dateTimeStart;
+ }
+
+ public long getUniqueRef() {
+ return uniqueRef;
+ }
+
+ public void setUniqueRef(long uniqueRef) {
+ this.uniqueRef = uniqueRef;
+ }
+
+ public double getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(double latitude) {
+ this.latitude = latitude;
+ }
+
+ public double getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(double longitude) {
+ this.longitude = longitude;
+ }
+
+
+ public long getDateTimeEnd() {
+ return dateTimeEnd;
+ }
+
+ public void setDateTimeEnd(long dateTimeEnd) {
+ this.dateTimeEnd = dateTimeEnd;
+ }
+
+
+ public String getTimeZone() {
+ return timeZone;
+ }
+
+ public void setTimeZone(String timeZone) {
+ this.timeZone = timeZone;
+ }
}
diff --git a/app/src/main/res/drawable/ic_delete_red_24dp.xml b/app/src/main/res/drawable/ic_delete_red_24dp.xml
new file mode 100644
index 000000000..3e7908563
--- /dev/null
+++ b/app/src/main/res/drawable/ic_delete_red_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_export_file.xml b/app/src/main/res/drawable/ic_export_file.xml
new file mode 100644
index 000000000..88b8e4673
--- /dev/null
+++ b/app/src/main/res/drawable/ic_export_file.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_play_button.xml b/app/src/main/res/drawable/ic_play_button.xml
new file mode 100644
index 000000000..bf2ad5b07
--- /dev/null
+++ b/app/src/main/res/drawable/ic_play_button.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_wifi_tethering_black_24dp.xml b/app/src/main/res/drawable/ic_wifi_tethering_black_24dp.xml
new file mode 100644
index 000000000..4e021adaa
--- /dev/null
+++ b/app/src/main/res/drawable/ic_wifi_tethering_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_data_logger.xml b/app/src/main/res/layout/activity_data_logger.xml
new file mode 100644
index 000000000..56d0232bc
--- /dev/null
+++ b/app/src/main/res/layout/activity_data_logger.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_sensor_graph_view.xml b/app/src/main/res/layout/activity_sensor_graph_view.xml
new file mode 100644
index 000000000..718790e28
--- /dev/null
+++ b/app/src/main/res/layout/activity_sensor_graph_view.xml
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/logged_sensor_data.xml b/app/src/main/res/layout/logged_sensor_data.xml
index e4f87ca76..dea63178e 100644
--- a/app/src/main/res/layout/logged_sensor_data.xml
+++ b/app/src/main/res/layout/logged_sensor_data.xml
@@ -6,8 +6,8 @@
+ android:layout_height="wrap_content"
+ android:scrollbars="vertical" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/logger_data_item.xml b/app/src/main/res/layout/logger_data_item.xml
new file mode 100644
index 000000000..3c65bc69d
--- /dev/null
+++ b/app/src/main/res/layout/logger_data_item.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/lux_realm_data_item.xml b/app/src/main/res/layout/lux_realm_data_item.xml
new file mode 100644
index 000000000..5aea52481
--- /dev/null
+++ b/app/src/main/res/layout/lux_realm_data_item.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
index d52da6207..72f7e54bf 100644
--- a/app/src/main/res/menu/activity_main_drawer.xml
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -9,6 +9,10 @@
android:id="@+id/nav_device"
android:icon="@drawable/ic_developer_board_black_24dp"
android:title="@string/nav_device" />
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_show_logged_data.xml b/app/src/main/res/menu/activity_show_logged_data.xml
deleted file mode 100644
index 972453b01..000000000
--- a/app/src/main/res/menu/activity_show_logged_data.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
\ No newline at end of file
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 494ad9931..58281310a 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,10 @@
android:icon="@drawable/ic_record_white"
android:title="@string/record_csv_data"
app:showAsAction="always" />
+
- #ff7043
#40c72c2c
#546E7A
+ #EEEEEE
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 242fea5e2..292479af2 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -358,6 +358,24 @@
20dp
200dp
+ 3dp
+ 20dp
9sp
+ 10dp
+ 5dp
+ 5dp
+ 10dp
+ 10dp
+ 10dp
+ 15dp
+ 5dp
+ 10dp
+ 5dp
+ 5dp
+ 20dp
+ 20dp
+ 40dp
+ 10dp
+ 10dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5ab3aa2e9..7f35acab6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1001,6 +1001,27 @@
Right now, we are not having an option to make and save custom experiments. But we will implement it soon.
You can submit your reviews, feature requests and feedback through our Feedback and Issues page.
+ DATE OF RECORDING
+ TIME OF RECORDING
+ Date of Rec
+ Time of Rec
+ Latitude
+ Longitude
+ Location
+
+ Start Time
+ End Time
+ Timezone
+ Device Model
+ Device Brand
+ Device Android SDK
+
+
+ Logged Data
+ Show Logged Data
+ Time Elapsed
+ Experiment Logged Data Saved
+
Lux Meter
\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