diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java index e35c8935..33415489 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java @@ -5,6 +5,7 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteStatement; import android.widget.Toast; import org.slf4j.Logger; @@ -138,6 +139,30 @@ public class ActivityDatabaseHandler extends SQLiteOpenHelper implements DBHandl } } + @Override + public void addGBActivitySamples(GBActivitySample[] activitySamples) { + try (SQLiteDatabase db = this.getWritableDatabase()) { + + String sql = "INSERT INTO " + TABLE_GBACTIVITYSAMPLES + " (" + KEY_TIMESTAMP + "," + + KEY_PROVIDER + "," + KEY_INTENSITY + "," + KEY_STEPS + "," + KEY_TYPE + ")" + + " VALUES (?,?,?,?,?);"; + SQLiteStatement statement = db.compileStatement(sql); + db.beginTransaction(); + + for (GBActivitySample activitySample : activitySamples) { + statement.clearBindings(); + statement.bindLong(1, activitySample.getTimestamp()); + statement.bindLong(2, activitySample.getProvider().getID()); + statement.bindLong(3, activitySample.getRawIntensity()); + statement.bindLong(4, activitySample.getSteps()); + statement.bindLong(5, activitySample.getRawKind()); + statement.execute(); + } + db.setTransactionSuccessful(); + db.endTransaction(); + } + } + public ArrayList getSleepSamples(int timestamp_from, int timestamp_to, SampleProvider provider) { return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_SLEEP, provider); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java index 7ea09634..e50d3c61 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java @@ -7,10 +7,11 @@ import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.impl.GBActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; public interface DBHandler { - public SQLiteOpenHelper getHelper(); + SQLiteOpenHelper getHelper(); /** * Releases the DB handler. No access may be performed after calling this method. @@ -26,5 +27,7 @@ public interface DBHandler { void addGBActivitySample(int timestamp, byte provider, short intensity, short steps, byte kind); + void addGBActivitySamples(GBActivitySample[] activitySamples); + SQLiteDatabase getWritableDatabase(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java index cc29ca22..1a835b04 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/AppMessageHandlerMisfit.java @@ -17,7 +17,8 @@ import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes; -import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.devices.pebble.MisfitSampleProvider; +import nodomain.freeyourgadget.gadgetbridge.impl.GBActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; public class AppMessageHandlerMisfit extends AppMessageHandler { @@ -38,6 +39,8 @@ public class AppMessageHandlerMisfit extends AppMessageHandler { super(uuid, pebbleProtocol); } + private final MisfitSampleProvider sampleProvider = new MisfitSampleProvider(); + @Override public GBDeviceEvent[] handleMessage(ArrayList> pairs) { for (Pair pair : pairs) { @@ -49,14 +52,6 @@ public class AppMessageHandlerMisfit extends AppMessageHandler { LOG.info("incoming data end"); break; case KEY_INCOMING_DATA: - DBHandler db = null; - try { - db = GBApplication.acquireDB(); - } catch (GBException e) { - LOG.error("Error acquiring database", e); - return null; - } - byte[] data = (byte[]) pair.second; ByteBuffer buf = ByteBuffer.wrap(data); buf.order(ByteOrder.LITTLE_ENDIAN); @@ -76,11 +71,13 @@ public class AppMessageHandlerMisfit extends AppMessageHandler { int steps = 0; int totalSteps = 0; + GBActivitySample[] activitySamples = new GBActivitySample[samples]; for (int i = 0; i < samples; i++) { short sample = buf.getShort(); if ((sample & 0x0001) == 0 || (sample & 0xff00) == 0) { // 16-??? steps encoded in bits 1-7 steps = (sample & 0x00fe); - } else if ((sample & 0xfc71) == 0xfc71) { // 0-14 steps encoded in bits 1-3, bits 8-9 unknown, all other seem to be all 1 in this case + } else if ((sample & 0x0001) == 0x0001) { // 0-14 steps encoded in bits 1-3, most of the time fc71 bits are set in that case + // 0040 also set always? steps = (sample & 0x000e); } else { steps = 0; @@ -91,12 +88,21 @@ public class AppMessageHandlerMisfit extends AppMessageHandler { if (steps > 0) { activityKind = ActivityKind.TYPE_ACTIVITY; } - db.addGBActivitySample(timestamp + i * 60, SampleProvider.PROVIDER_PEBBLE_MISFIT, (short) steps, (short) steps, activityKind); + activitySamples[i] = new GBActivitySample(sampleProvider, timestamp + i * 60, (short) steps, (short) steps, activityKind); } LOG.info("total steps for above period: " + totalSteps); - if (db != null) { - db.release(); + DBHandler db = null; + try { + db = GBApplication.acquireDB(); + db.addGBActivitySamples(activitySamples); + } catch (GBException e) { + LOG.error("Error acquiring database", e); + return null; + } finally { + if (db != null) { + db.release(); + } } break; default: