Skip to content

Commit 016bcea

Browse files
authored
Merge pull request #1347 from Avjeet/Avi_graphe
feat: Added SensorGraphViewActivity to visualize and export data in CSV format
2 parents 898e461 + ae06d5f commit 016bcea

28 files changed

+1206
-128
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ dependencies {
5252
implementation "com.afollestad.material-dialogs:core:$rootProject.materialDialogsVersion"
5353
implementation "com.jakewharton:butterknife:$rootProject.butterKnifeVersion"
5454
implementation "com.android.support:support-v4:$rootProject.supportLibraryVersion"
55+
implementation 'com.android.support:support-v4:27.1.1'
56+
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
5557
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion"
5658
implementation "com.github.medyo:android-about-page:$rootProject.androidAboutPageVersion"
5759
implementation "com.github.tiagohm.MarkdownView:library:$rootProject.markDownViewVersion"
@@ -65,6 +67,7 @@ dependencies {
6567
implementation "org.osmdroid:osmdroid-mapsforge:$rootProject.mapsforgeVersion"
6668
implementation "org.osmdroid:osmdroid-geopackage:$rootProject.geoPackageVersion"
6769
implementation "com.android.support:multidex:$rootProject.multiDexVersion"
70+
implementation 'io.realm:android-adapters:2.1.1'
6871

6972
testImplementation "junit:junit:$rootProject.junitVersion"
7073
androidTestImplementation("com.android.support.test:runner:$rootProject.testRunnerRulesVersion") {

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@
4343
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
4444
android:resource="@xml/device_filter" />
4545
</activity>
46-
47-
<activity android:name=".activity.SettingsActivity"/>
48-
46+
<activity android:name=".activity.SettingsActivity" />
4947
<activity android:name=".activity.ShowLoggedData" />
5048
<activity
5149
android:name=".activity.PerformExperimentActivity"
@@ -77,14 +75,13 @@
7775
android:name=".activity.LuxMeterActivity"
7876
android:configChanges="orientation|screenSize|keyboardHidden" />
7977
<activity android:name=".activity.AccelerometerActivity" />
80-
78+
<activity android:name=".activity.DataLoggerActivity" />
8179
<activity
8280
android:name=".activity.Barometer_activity"
83-
android:configChanges="keyboardHidden|screenSize|orientation"/>
84-
85-
<activity android:name=".activity.CompassActivity"
86-
android:screenOrientation="portrait"/>
87-
81+
android:configChanges="keyboardHidden|screenSize|orientation" />
82+
<activity
83+
android:name=".activity.CompassActivity"
84+
android:screenOrientation="portrait" />
8885
<activity android:name=".activity.MapsActivity" />
8986

9087
<receiver android:name=".receivers.USBDetachReceiver" />
@@ -97,7 +94,7 @@
9794
<activity android:name=".sensors.SensorSHT21" />
9895
<activity android:name=".sensors.SensorMPU6050" />
9996
<activity android:name=".sensors.SensorTSL2561" />
100-
97+
<activity android:name=".activity.SensorGraphViewActivity"></activity>
10198
</application>
10299

103100
</manifest>

app/src/main/java/io/pslab/PSLabApplication.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Application;
44

55
import io.realm.Realm;
6+
import io.realm.RealmConfiguration;
67

78
/**
89
* Created by viveksb007 on 4/8/17.
@@ -14,5 +15,9 @@ public class PSLabApplication extends Application {
1415
public void onCreate() {
1516
super.onCreate();
1617
Realm.init(this);
18+
RealmConfiguration.Builder v = new RealmConfiguration.Builder().name(Realm.DEFAULT_REALM_NAME)
19+
.schemaVersion(0)
20+
.deleteRealmIfMigrationNeeded();
21+
Realm.setDefaultConfiguration(v.build());
1722
}
1823
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package io.pslab.activity;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.app.AppCompatActivity;
5+
import android.support.v7.widget.DividerItemDecoration;
6+
import android.support.v7.widget.LinearLayoutManager;
7+
import android.support.v7.widget.RecyclerView;
8+
import android.support.v7.widget.Toolbar;
9+
import android.view.MenuItem;
10+
11+
import butterknife.BindView;
12+
import butterknife.ButterKnife;
13+
import io.pslab.R;
14+
import io.pslab.adapters.SensorLoggerListAdapter;
15+
import io.pslab.models.SensorLogged;
16+
import io.realm.Realm;
17+
import io.realm.RealmResults;
18+
import io.realm.Sort;
19+
20+
/**
21+
* Created by Avjeet on 05/08/18.
22+
*/
23+
24+
public class DataLoggerActivity extends AppCompatActivity {
25+
public static final String CALLER_ACTIVITY = "Caller";
26+
@BindView(R.id.recycler_view)
27+
RecyclerView recyclerView;
28+
29+
@BindView(R.id.toolbar)
30+
Toolbar toolbar;
31+
32+
@Override
33+
protected void onCreate(Bundle savedInstanceState) {
34+
super.onCreate(savedInstanceState);
35+
setContentView(R.layout.activity_data_logger);
36+
ButterKnife.bind(this);
37+
setSupportActionBar(toolbar);
38+
Realm realm = Realm.getDefaultInstance();
39+
String caller = getIntent().getStringExtra(CALLER_ACTIVITY);
40+
if (caller == null)
41+
caller = "";
42+
43+
RealmResults<SensorLogged> results;
44+
String title;
45+
switch (caller) {
46+
case "Lux Meter":
47+
results = realm.where(SensorLogged.class).equalTo("sensor", caller)
48+
.findAll()
49+
.sort("dateTimeStart", Sort.DESCENDING);
50+
title = caller + " Data";
51+
break;
52+
default:
53+
results = realm.where(SensorLogged.class)
54+
.findAll()
55+
.sort("dateTimeStart", Sort.DESCENDING);
56+
title = getString(R.string.logged_data);
57+
}
58+
if (getSupportActionBar() != null) {
59+
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
60+
getSupportActionBar().setDisplayShowHomeEnabled(true);
61+
getSupportActionBar().setTitle(title);
62+
}
63+
SensorLoggerListAdapter adapter = new SensorLoggerListAdapter(results, this);
64+
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
65+
recyclerView.setLayoutManager(linearLayoutManager);
66+
67+
DividerItemDecoration itemDecor = new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL);
68+
recyclerView.addItemDecoration(itemDecor);
69+
recyclerView.setAdapter(adapter);
70+
}
71+
72+
@Override
73+
public void onBackPressed() {
74+
finish();
75+
}
76+
77+
@Override
78+
public boolean onOptionsItemSelected(MenuItem item) {
79+
switch (item.getItemId()) {
80+
case android.R.id.home:
81+
finish();
82+
return true;
83+
}
84+
return super.onOptionsItemSelected(item);
85+
}
86+
}

app/src/main/java/io/pslab/activity/LuxMeterActivity.java

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,18 @@
3030
import android.widget.TextView;
3131
import android.widget.Toast;
3232

33+
import butterknife.BindView;
34+
import butterknife.ButterKnife;
3335
import io.pslab.R;
3436
import io.pslab.fragment.LuxMeterFragmentConfig;
3537
import io.pslab.fragment.LuxMeterFragmentData;
38+
import io.pslab.fragment.SettingsFragment;
3639
import io.pslab.others.CSVLogger;
3740
import io.pslab.others.CustomSnackBar;
3841
import io.pslab.others.GPSLogger;
3942
import io.pslab.others.MathUtils;
40-
import io.pslab.fragment.SettingsFragment;
4143
import io.pslab.others.SwipeGestureDetector;
4244

43-
import butterknife.BindView;
44-
import butterknife.ButterKnife;
45-
4645
public class LuxMeterActivity extends AppCompatActivity {
4746

4847
private static final String PREF_NAME = "customDialogPreference";
@@ -85,13 +84,16 @@ public class LuxMeterActivity extends AppCompatActivity {
8584
private boolean checkGpsOnResume = false;
8685
public boolean locationPref;
8786
private LuxMeterFragmentData selectedFragment;
87+
public static final String NAME = "realmData";
88+
private SharedPreferences realmPreferences;
8889

8990
@Override
9091
protected void onCreate(Bundle savedInstanceState) {
9192
super.onCreate(savedInstanceState);
9293
setContentView(R.layout.activity_lux_main);
9394
ButterKnife.bind(this);
9495
setSupportActionBar(toolbar);
96+
realmPreferences = getSharedPreferences(NAME, Context.MODE_PRIVATE);
9597
setUpBottomSheet();
9698
bottomNavigationView.setOnNavigationItemSelectedListener
9799
(new BottomNavigationView.OnNavigationItemSelectedListener() {
@@ -215,36 +217,34 @@ public boolean onPrepareOptionsMenu(Menu menu) {
215217
public boolean onOptionsItemSelected(MenuItem item) {
216218
switch (item.getItemId()) {
217219
case R.id.record_data:
218-
if (ContextCompat.checkSelfPermission(this,
219-
Manifest.permission.WRITE_EXTERNAL_STORAGE)
220-
!= PackageManager.PERMISSION_GRANTED) {
221-
ActivityCompat.requestPermissions(this,
222-
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA);
223-
return true;
224-
}
225220
if (recordData) {
226-
((LuxMeterFragmentData)selectedFragment).stopSensorFetching();
221+
((LuxMeterFragmentData) selectedFragment).stopSensorFetching();
227222
invalidateOptionsMenu();
223+
Long uniqueRef = realmPreferences.getLong("uniqueCount", 0);
224+
selectedFragment.saveDataInRealm(uniqueRef,locationPref,gpsLogger);
225+
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.exp_data_saved), null, null);
226+
SharedPreferences.Editor editor = realmPreferences.edit();
227+
editor.putLong("uniqueCount", uniqueRef + 1);
228+
editor.commit();
228229
recordData = false;
229230
} else {
230-
luxLogger = new CSVLogger(getString(R.string.lux_meter));
231-
luxLogger.writeCSVFile("Timestamp,X,Y,Z\n");
232-
recordData = true;
233-
((LuxMeterFragmentData)selectedFragment).startSensorFetching();
234-
invalidateOptionsMenu();
235231
if (locationPref) {
236232
gpsLogger = new GPSLogger(this, (LocationManager) getSystemService(Context.LOCATION_SERVICE));
237233
if (gpsLogger.isGPSEnabled()) {
238234
recordData = true;
239-
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_enabled), null, null);
235+
((LuxMeterFragmentData) selectedFragment).startSensorFetching();
236+
invalidateOptionsMenu();
240237
} else {
241238
checkGpsOnResume = true;
242239
}
243240
gpsLogger.startFetchingLocation();
244241
} else {
245242
recordData = true;
246-
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_disabled), null, null);
243+
((LuxMeterFragmentData) selectedFragment).startSensorFetching();
244+
invalidateOptionsMenu();
247245
}
246+
String snackText = getString(R.string.data_recording_start)+"\n"+(locationPref?getString(R.string.location_enabled):getString(R.string.location_disabled));
247+
CustomSnackBar.showSnackBar(coordinatorLayout, snackText, null, null);
248248
}
249249
break;
250250
case R.id.show_map:
@@ -260,6 +260,12 @@ public boolean onOptionsItemSelected(MenuItem item) {
260260
break;
261261
case R.id.settings:
262262
startActivity(new Intent(this, SettingsActivity.class));
263+
break;
264+
case R.id.show_logged_data:
265+
Intent intent = new Intent(this, DataLoggerActivity.class);
266+
intent.putExtra(DataLoggerActivity.CALLER_ACTIVITY, "Lux Meter");
267+
startActivity(intent);
268+
263269
break;
264270
default:
265271
break;
@@ -273,38 +279,27 @@ protected void onResume() {
273279
if (checkGpsOnResume) {
274280
if (gpsLogger.isGPSEnabled()) {
275281
recordData = true;
276-
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start), null, null);
282+
((LuxMeterFragmentData) selectedFragment).startSensorFetching();
283+
invalidateOptionsMenu();
284+
gpsLogger.startFetchingLocation();
285+
CustomSnackBar.showSnackBar(coordinatorLayout,getString(R.string.data_recording_start)+getString(R.string.location_enabled) , null, null);
277286
} else {
278287
recordData = false;
279288
Toast.makeText(getApplicationContext(), getString(R.string.gps_not_enabled),
280289
Toast.LENGTH_SHORT).show();
290+
gpsLogger.removeUpdate();
281291
}
292+
checkGpsOnResume = false;
282293
}
283294
locationPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getBoolean(SettingsFragment.KEY_INCLUDE_LOCATION, false);
295+
if(!locationPref && gpsLogger!=null){
296+
gpsLogger = null;
297+
}
284298
}
285299

286300
@Override
287301
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
288-
if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_DATA) {
289-
if (grantResults.length > 0
290-
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
291-
if (locationPref) {
292-
gpsLogger = new GPSLogger(this, (LocationManager) getSystemService(Context.LOCATION_SERVICE));
293-
if (gpsLogger.isGPSEnabled()) {
294-
recordData = true;
295-
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_enabled), null, null);
296-
} else {
297-
checkGpsOnResume = true;
298-
}
299-
gpsLogger.startFetchingLocation();
300-
} else {
301-
recordData = true;
302-
CustomSnackBar.showSnackBar(coordinatorLayout, getString(R.string.data_recording_start) + "\n" + getString(R.string.location_disabled), null, null);
303-
}
304-
} else {
305-
Toast.makeText(this, R.string.prmsn_denied_storage, Toast.LENGTH_SHORT).show();
306-
}
307-
} else if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS
302+
if (requestCode == MY_PERMISSIONS_REQUEST_STORAGE_FOR_MAPS
308303
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
309304
Intent MAP = new Intent(getApplicationContext(), MapsActivity.class);
310305
startActivity(MAP);

app/src/main/java/io/pslab/activity/MainActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
270270
case R.id.nav_app_version:
271271
setTitleColor(R.color.gray);
272272
break;
273+
case R.id.sensor_data_logger:
274+
if (drawer != null) {
275+
drawer.closeDrawers();
276+
}
277+
startActivity(new Intent(MainActivity.this, DataLoggerActivity.class));
278+
break;
273279
default:
274280
navItemIndex = 0;
275281
}

0 commit comments

Comments
 (0)