From 43745246f0dc0f33b082d8c2f5ab7626248173c4 Mon Sep 17 00:00:00 2001 From: vdeconinck Date: Wed, 3 May 2023 10:56:15 +0200 Subject: [PATCH] Added location tracking + Only log in case of significant difference + Renamed Orientation object to Direction + Gradle update to 7.4.2 --- Main/build.gradle | 1 + Main/src/main/AndroidManifest.xml | 3 +- .../inclinometer/DataMonitorActivity.java | 48 ++-- .../deconinck/inclinometer/GpsTracker.java | 224 ++++++++++++++++++ .../inclinometer/SplashActivity.java | 18 +- .../inclinometer/model/Direction.java | 67 ++++++ .../inclinometer/model/Orientation.java | 51 ---- .../inclinometer/persistence/AppDatabase.java | 6 +- .../persistence/DirectionDao.java | 33 +++ .../persistence/OrientationDao.java | 33 --- Main/src/main/res/values/strings.xml | 2 + 11 files changed, 370 insertions(+), 116 deletions(-) create mode 100644 Main/src/main/java/info/deconinck/inclinometer/GpsTracker.java create mode 100644 Main/src/main/java/info/deconinck/inclinometer/model/Direction.java delete mode 100644 Main/src/main/java/info/deconinck/inclinometer/model/Orientation.java create mode 100644 Main/src/main/java/info/deconinck/inclinometer/persistence/DirectionDao.java delete mode 100644 Main/src/main/java/info/deconinck/inclinometer/persistence/OrientationDao.java diff --git a/Main/build.gradle b/Main/build.gradle index 279ec42..a900102 100644 --- a/Main/build.gradle +++ b/Main/build.gradle @@ -50,6 +50,7 @@ android { signingConfig signingConfigs.release } } + namespace 'info.deconinck.inclinometer' } dependencies { diff --git a/Main/src/main/AndroidManifest.xml b/Main/src/main/AndroidManifest.xml index 401b33e..a87344c 100644 --- a/Main/src/main/AndroidManifest.xml +++ b/Main/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> diff --git a/Main/src/main/java/info/deconinck/inclinometer/DataMonitorActivity.java b/Main/src/main/java/info/deconinck/inclinometer/DataMonitorActivity.java index 7d4324f..16775fe 100644 --- a/Main/src/main/java/info/deconinck/inclinometer/DataMonitorActivity.java +++ b/Main/src/main/java/info/deconinck/inclinometer/DataMonitorActivity.java @@ -4,7 +4,6 @@ import static info.deconinck.inclinometer.view.InclinometerView.MAX_TILT; import static info.deconinck.inclinometer.view.InclinometerView.getAngleColor; -import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; @@ -18,7 +17,6 @@ import android.bluetooth.BluetoothDevice; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -71,7 +69,7 @@ import info.deconinck.inclinometer.dialog.AddressDialog; import info.deconinck.inclinometer.dialog.AngleDialog; import info.deconinck.inclinometer.dialog.SmoothingDialog; -import info.deconinck.inclinometer.model.Orientation; +import info.deconinck.inclinometer.model.Direction; import info.deconinck.inclinometer.model.Session; import info.deconinck.inclinometer.persistence.AppDatabase; import info.deconinck.inclinometer.util.SharedUtil; @@ -132,7 +130,8 @@ public class DataMonitorActivity extends FragmentActivity implements OnClickList private BluetoothAdapter mBluetoothAdapter = null; private BluetoothService mBluetoothService = null; private String mConnectedDeviceName = null; - private static final String ACTION_USB_PERMISSION = "cn.wch.wchusbdriver.USB_PERMISSION"; + private GpsTracker mGpsTracker = null; + public byte[] writeBuffer; public byte[] readBuffer; private Switch outputSwitch; @@ -163,6 +162,7 @@ public class DataMonitorActivity extends FragmentActivity implements OnClickList private Long sessionId; private static long nextLogTime; private Session selectedSession; + private Direction lastDirection = null; private float norm(float x[]) { @@ -491,7 +491,7 @@ public void recordData(byte fieldTypeByte) { threshold = threshold.minusMonths(DB_PURGE_AFTER_MONTHS); List obsoleteSessions = db.sessionDao().getSessionsOlderThan(threshold); for (Session obsoleteSession : obsoleteSessions) { - db.orientationDao().deleteOrientationsForSession(obsoleteSession.id); + db.directionDao().deleteDirectionsForSession(obsoleteSession.id); db.sessionDao().delete(obsoleteSession); } @@ -517,8 +517,11 @@ public void recordData(byte fieldTypeByte) { float tilt = angle[1] - tiltCompensationAngle; // Log values to DB - Orientation orientation = new Orientation(sessionId, roll, tilt); - db.orientationDao().insert(orientation); + Direction direction = new Direction(sessionId, mGpsTracker.getLongitude(), mGpsTracker.getLatitude(), roll, tilt); + if (direction.differsEnoughFrom(lastDirection)) { + db.directionDao().insert(direction); + lastDirection = direction; + } // Show them as a notification displayNotifications(roll, tilt); @@ -634,15 +637,6 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //requestWindowFeature(Window.FEATURE_NO_TITLE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_LOCATION_REQUEST_CODE); - } - if (this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_LOCATION_REQUEST_CODE); - } - } - Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); @@ -693,6 +687,8 @@ public void onCreate(Bundle savedInstanceState) { try { + mGpsTracker = new GpsTracker(DataMonitorActivity.this); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { new AlertDialog.Builder(DataMonitorActivity.this) @@ -1395,14 +1391,14 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { case REQUEST_CREATE_FILE: if (selectedSession != null) { Toast.makeText(this, "Saving session " + selectedSession.id, Toast.LENGTH_SHORT).show(); - new AsyncTask>() { + new AsyncTask>() { @Override - protected List doInBackground(Void... voids) { - return db.orientationDao().getOrientationsBySession(selectedSession.id); + protected List doInBackground(Void... voids) { + return db.directionDao().getDirectionsBySession(selectedSession.id); } @Override - protected void onPostExecute(List orientations) { + protected void onPostExecute(List directions) { try { OutputStream outputStream = getContentResolver().openOutputStream(data.getData()); @@ -1420,11 +1416,11 @@ protected void onPostExecute(List orientations) { serializer.attribute("", "creator", getString(R.string.app_name)); serializer.attribute("", "version", getString(R.string.app_version)); - for (Orientation orientation : orientations) { + for (Direction direction : directions) { // Write the waypoint element serializer.startTag("", "wpt"); - serializer.attribute("", "lat", String.valueOf(orientation.latitude)); - serializer.attribute("", "lon", String.valueOf(orientation.longitude)); + serializer.attribute("", "lat", String.valueOf(direction.latitude)); + serializer.attribute("", "lon", String.valueOf(direction.longitude)); // Write the child elements of the waypoint element // serializer.startTag("", "ele"); @@ -1432,7 +1428,7 @@ protected void onPostExecute(List orientations) { // serializer.endTag("", "ele"); serializer.startTag("", "time"); - serializer.text(String.valueOf(orientation.getISOTimestamp())); + serializer.text(String.valueOf(direction.getISOTimestamp())); serializer.endTag("", "time"); // serializer.startTag("", "name"); @@ -1448,10 +1444,10 @@ protected void onPostExecute(List orientations) { serializer.startTag(INCLINOMETER_NS, "wptExtension"); serializer.startTag(INCLINOMETER_NS, "tilt"); - serializer.text(String.valueOf(orientation.tilt)); + serializer.text(String.valueOf(direction.tilt)); serializer.endTag(INCLINOMETER_NS, "tilt"); serializer.startTag(INCLINOMETER_NS, "roll"); - serializer.text(String.valueOf(orientation.roll)); + serializer.text(String.valueOf(direction.roll)); serializer.endTag(INCLINOMETER_NS, "roll"); serializer.endTag(INCLINOMETER_NS, "wptExtension"); diff --git a/Main/src/main/java/info/deconinck/inclinometer/GpsTracker.java b/Main/src/main/java/info/deconinck/inclinometer/GpsTracker.java new file mode 100644 index 0000000..34bddd1 --- /dev/null +++ b/Main/src/main/java/info/deconinck/inclinometer/GpsTracker.java @@ -0,0 +1,224 @@ +package info.deconinck.inclinometer; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Service; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import android.os.IBinder; +import android.provider.Settings; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +/** + * Taken from sample at https://www.howtodoandroid.com/get-current-location-android/ + */ +public class GpsTracker extends Service implements LocationListener { + + public static final String TAG = GpsTracker.class.getName(); + private final Context mContext; + + // flag for GPS status + boolean isGPSEnabled = false; + + // flag for network status + boolean isNetworkEnabled = false; + + // flag for GPS status + boolean canGetLocation = false; + + Location location; // location + double latitude; // latitude + double longitude; // longitude + + // The minimum distance to change Updates in meters + private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters + + // The minimum time between updates in milliseconds + private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute + + // Declaring a Location Manager + protected LocationManager locationManager; + + public GpsTracker(Context context) { + this.mContext = context; + getLocation(); + } + + public Location getLocation() { + try { + locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); + + // getting GPS status + isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + + // getting network status + isNetworkEnabled = locationManager + .isProviderEnabled(LocationManager.NETWORK_PROVIDER); + + if (!isGPSEnabled && !isNetworkEnabled) { + // no network provider is enabled + } else { + this.canGetLocation = true; + // First get location from Network Provider + if (isNetworkEnabled) { + //check the network permission + if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions((Activity) mContext, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101); + } + locationManager.requestLocationUpdates( + LocationManager.NETWORK_PROVIDER, + MIN_TIME_BW_UPDATES, + MIN_DISTANCE_CHANGE_FOR_UPDATES, this); + + Log.d(TAG, "Network"); + if (locationManager != null) { + location = locationManager + .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + + if (location != null) { + latitude = location.getLatitude(); + longitude = location.getLongitude(); + } + } + } + + // if GPS Enabled get lat/long using GPS Services + if (isGPSEnabled) { + if (location == null) { + //check the network permission + if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions((Activity) mContext, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101); + } + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, + MIN_TIME_BW_UPDATES, + MIN_DISTANCE_CHANGE_FOR_UPDATES, this); + + Log.d(TAG, "GPS Enabled"); + if (locationManager != null) { + location = locationManager + .getLastKnownLocation(LocationManager.GPS_PROVIDER); + + if (location != null) { + latitude = location.getLatitude(); + longitude = location.getLongitude(); + } + } + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return location; + } + + /** + * Stop using GPS listener + * Calling this function will stop using GPS in your app + * */ + + public void stopUsingGPS(){ + if(locationManager != null){ + locationManager.removeUpdates(GpsTracker.this); + } + } + + /** + * Function to get latitude + * */ + + public double getLatitude(){ + if(location != null){ + latitude = location.getLatitude(); + } + + // return latitude + return latitude; + } + + /** + * Function to get longitude + * */ + + public double getLongitude(){ + if(location != null){ + longitude = location.getLongitude(); + } + + // return longitude + return longitude; + } + + /** + * Function to check GPS/wifi enabled + * @return boolean + * */ + + public boolean canGetLocation() { + return this.canGetLocation; + } + + /** + * Function to show settings alert dialog + * On pressing Settings button will lauch Settings Options + * */ + + public void showSettingsAlert(){ + AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); + + // Setting Dialog Title + alertDialog.setTitle("GPS is settings"); + + // Setting Dialog Message + alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); + + // On pressing Settings button + alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + mContext.startActivity(intent); + } + }); + + // on pressing cancel button + alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + alertDialog.show(); + } + + @Override + public void onLocationChanged(Location location) { + } + + @Override + public void onProviderDisabled(String provider) { + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public IBinder onBind(Intent arg0) { + return null; + } +} \ No newline at end of file diff --git a/Main/src/main/java/info/deconinck/inclinometer/SplashActivity.java b/Main/src/main/java/info/deconinck/inclinometer/SplashActivity.java index 2786248..29ae64e 100644 --- a/Main/src/main/java/info/deconinck/inclinometer/SplashActivity.java +++ b/Main/src/main/java/info/deconinck/inclinometer/SplashActivity.java @@ -19,6 +19,8 @@ public class SplashActivity extends AppCompatActivity { public static final int BLUETOOTH_SCAN_REQUEST_CODE = 0; public static final int BLUETOOTH_CONNECT_REQUEST_CODE = 1; + public static final int ACCESS_FINE_LOCATION_REQUEST_CODE = 2; + public static final int ACCESS_COARSE_LOCATION_REQUEST_CODE = 3; @Override protected void onCreate(Bundle savedInstanceState) { @@ -28,13 +30,19 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void run() { - // 1. Check required permissions (bluetooth) + // 1. Check required permissions (bluetooth & GPS) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { checkPermission(Manifest.permission.BLUETOOTH_SCAN, BLUETOOTH_SCAN_REQUEST_CODE, getString(R.string.bluetooth_scan_permission_text)); checkPermission(Manifest.permission.BLUETOOTH_CONNECT, BLUETOOTH_CONNECT_REQUEST_CODE, getString(R.string.bluetooth_connect_permission_text)); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, ACCESS_COARSE_LOCATION_REQUEST_CODE, getString(R.string.network_location_permission_text)); + checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, ACCESS_FINE_LOCATION_REQUEST_CODE, getString(R.string.gps_location_permission_text)); + } + + // 2. Start the Data Monitor activity Intent intent; @@ -80,6 +88,14 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis permission = Manifest.permission.BLUETOOTH_CONNECT; permissionText = getString(R.string.bluetooth_connect_permission_text); break; + case ACCESS_FINE_LOCATION_REQUEST_CODE: + permission = Manifest.permission.ACCESS_FINE_LOCATION; + permissionText = getString(R.string.gps_location_permission_text); + break; + case ACCESS_COARSE_LOCATION_REQUEST_CODE: + permission = Manifest.permission.ACCESS_COARSE_LOCATION; + permissionText = getString(R.string.network_location_permission_text); + break; default: new AlertDialog.Builder(this) .setTitle("Unknown Permission result !") diff --git a/Main/src/main/java/info/deconinck/inclinometer/model/Direction.java b/Main/src/main/java/info/deconinck/inclinometer/model/Direction.java new file mode 100644 index 0000000..a9c7795 --- /dev/null +++ b/Main/src/main/java/info/deconinck/inclinometer/model/Direction.java @@ -0,0 +1,67 @@ +package info.deconinck.inclinometer.model; + +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +@Entity +public class Direction { + private static final double LONGITUDE_CHANGE_THRESHOLD = 0.001f; + private static final double LATITUDE_CHANGE_THRESHOLD = 0.001f; + private static final double ROLL_CHANGE_THRESHOLD = 0.1f; + private static final double TILT_CHANGE_THRESHOLD = 0.1f; + + @PrimaryKey(autoGenerate = true) + public int id; + + public OffsetDateTime time = OffsetDateTime.now(); + + @ColumnInfo(name = "session_id") + public long sessionId; + + public double longitude; + + public double latitude; + + public double roll; + + public double tilt; + + public Direction(Long sessionId, double longitude, double latitude, double roll, double tilt) { + this.sessionId = sessionId; + this.longitude = longitude; + this.latitude = latitude; + this.roll = roll; + this.tilt = tilt; + } + + public String getISOTimestamp() { + return time.format(DateTimeFormatter.ISO_DATE_TIME); + } + + @Override + public String toString() { + return "Orientation{" + + "id=" + id + + ", time=" + time + + ", sessionId=" + sessionId + + ", longitude=" + longitude + + ", latitude=" + latitude + + ", roll=" + roll + + ", tilt=" + tilt + + '}'; + } + + public boolean differsEnoughFrom(Direction otherDirection) { + return + otherDirection == null + || Math.abs(otherDirection.longitude - this.longitude) > LONGITUDE_CHANGE_THRESHOLD + || Math.abs(otherDirection.latitude - this.latitude) > LATITUDE_CHANGE_THRESHOLD + || Math.abs(otherDirection.roll - this.roll) > ROLL_CHANGE_THRESHOLD + || Math.abs(otherDirection.tilt - this.tilt) > TILT_CHANGE_THRESHOLD + ; + } +} diff --git a/Main/src/main/java/info/deconinck/inclinometer/model/Orientation.java b/Main/src/main/java/info/deconinck/inclinometer/model/Orientation.java deleted file mode 100644 index 93b1263..0000000 --- a/Main/src/main/java/info/deconinck/inclinometer/model/Orientation.java +++ /dev/null @@ -1,51 +0,0 @@ -package info.deconinck.inclinometer.model; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.FormatStyle; - -@Entity -public class Orientation { - @PrimaryKey(autoGenerate = true) - public int id; - - public OffsetDateTime time = OffsetDateTime.now(); - - @ColumnInfo(name = "session_id") - public long sessionId; - - public float longitude; - - public float latitude; - - public float roll; - - public float tilt; - - public Orientation(Long sessionId, float roll, float tilt) { - this.sessionId = sessionId; - this.roll = roll; - this.tilt = tilt; - } - - public String getISOTimestamp() { - return time.format(DateTimeFormatter.ISO_DATE_TIME); - } - - @Override - public String toString() { - return "Orientation{" + - "id=" + id + - ", time=" + time + - ", sessionId=" + sessionId + - ", longitude=" + longitude + - ", latitude=" + latitude + - ", roll=" + roll + - ", tilt=" + tilt + - '}'; - } -} diff --git a/Main/src/main/java/info/deconinck/inclinometer/persistence/AppDatabase.java b/Main/src/main/java/info/deconinck/inclinometer/persistence/AppDatabase.java index dfdf29e..86daa55 100644 --- a/Main/src/main/java/info/deconinck/inclinometer/persistence/AppDatabase.java +++ b/Main/src/main/java/info/deconinck/inclinometer/persistence/AppDatabase.java @@ -5,12 +5,12 @@ import androidx.room.TypeConverters; import info.deconinck.inclinometer.model.DateTypeConverter; -import info.deconinck.inclinometer.model.Orientation; +import info.deconinck.inclinometer.model.Direction; import info.deconinck.inclinometer.model.Session; -@Database(entities = {Session.class, Orientation.class}, version = 1) +@Database(entities = {Session.class, Direction.class}, version = 1) @TypeConverters({DateTypeConverter.class}) public abstract class AppDatabase extends RoomDatabase { public abstract SessionDao sessionDao(); - public abstract OrientationDao orientationDao(); + public abstract DirectionDao directionDao(); } diff --git a/Main/src/main/java/info/deconinck/inclinometer/persistence/DirectionDao.java b/Main/src/main/java/info/deconinck/inclinometer/persistence/DirectionDao.java new file mode 100644 index 0000000..274ebe0 --- /dev/null +++ b/Main/src/main/java/info/deconinck/inclinometer/persistence/DirectionDao.java @@ -0,0 +1,33 @@ +package info.deconinck.inclinometer.persistence; + +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.Query; + +import java.util.List; + +import info.deconinck.inclinometer.model.Direction; + +@Dao +public interface DirectionDao { + @Query("SELECT * FROM direction where id=:id") + List getDirection(int id); + + @Query("SELECT * FROM direction") + List getAllDirections(); + + @Query("SELECT * FROM direction where session_id = :sessionId") + List getDirectionsBySession(int sessionId); + + @Insert + void insert(Direction direction); + + @Insert + void insertDirections(Direction... directions); + + @Delete + void delete(Direction direction); + @Query("DELETE FROM direction WHERE session_id = :sessionId") + void deleteDirectionsForSession(int sessionId); +} \ No newline at end of file diff --git a/Main/src/main/java/info/deconinck/inclinometer/persistence/OrientationDao.java b/Main/src/main/java/info/deconinck/inclinometer/persistence/OrientationDao.java deleted file mode 100644 index 754668c..0000000 --- a/Main/src/main/java/info/deconinck/inclinometer/persistence/OrientationDao.java +++ /dev/null @@ -1,33 +0,0 @@ -package info.deconinck.inclinometer.persistence; - -import androidx.room.Dao; -import androidx.room.Delete; -import androidx.room.Insert; -import androidx.room.Query; - -import java.util.List; - -import info.deconinck.inclinometer.model.Orientation; - -@Dao -public interface OrientationDao { - @Query("SELECT * FROM orientation where id=:id") - List getOrientation(int id); - - @Query("SELECT * FROM orientation") - List getAllOrientations(); - - @Query("SELECT * FROM orientation where session_id = :sessionId") - List getOrientationsBySession(int sessionId); - - @Insert - void insert(Orientation orientation); - - @Insert - void insertOrientations(Orientation... orientations); - - @Delete - void delete(Orientation orientation); - @Query("DELETE FROM orientation WHERE session_id = :sessionId") - void deleteOrientationsForSession(int sessionId); -} \ No newline at end of file diff --git a/Main/src/main/res/values/strings.xml b/Main/src/main/res/values/strings.xml index 01d1f4c..2fd17f6 100644 --- a/Main/src/main/res/values/strings.xml +++ b/Main/src/main/res/values/strings.xml @@ -164,6 +164,8 @@ Disable debug info Bluetooth Scan Bluetooth Connect + GPS Location + Network location %1$s Permission Required This app only works with WitMotion bluetooth accelerometers. Grant Permission