mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-26 18:45:49 +01:00
Import the old samples and map the ranges to overlays for pebble.
This commit is contained in:
parent
3fb558c536
commit
6119f3501a
2
TODO.md
2
TODO.md
@ -1,7 +1,7 @@
|
|||||||
TODO before 0.12.0 release:
|
TODO before 0.12.0 release:
|
||||||
|
|
||||||
* Patch GreenDAO to support composite primary keys
|
* Patch GreenDAO to support composite primary keys
|
||||||
* Support importing Pebble Health data from old database
|
* ~~Support importing Pebble Health data from old database~~ DONE, needs check.
|
||||||
* Fix user attribute table being spammed
|
* Fix user attribute table being spammed
|
||||||
* Add back UUID_CHARACTERISTIC_PAIR support, at least optionally
|
* Add back UUID_CHARACTERISTIC_PAIR support, at least optionally
|
||||||
* CSV Export
|
* CSV Export
|
||||||
|
@ -19,16 +19,20 @@ import de.greenrobot.dao.query.Query;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractSampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractSampleProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleHealthSampleProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.AbstractActivitySample;
|
import nodomain.freeyourgadget.gadgetbridge.entities.AbstractActivitySample;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributes;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributes;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributesDao;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributesDao;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceDao;
|
import nodomain.freeyourgadget.gadgetbridge.entities.DeviceDao;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.entities.PebbleHealthActivityOverlay;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.entities.PebbleHealthActivityOverlayDao;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.User;
|
import nodomain.freeyourgadget.gadgetbridge.entities.User;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.UserAttributes;
|
import nodomain.freeyourgadget.gadgetbridge.entities.UserAttributes;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.UserDao;
|
import nodomain.freeyourgadget.gadgetbridge.entities.UserDao;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.ValidByDate;
|
import nodomain.freeyourgadget.gadgetbridge.model.ValidByDate;
|
||||||
@ -46,7 +50,7 @@ import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.TABLE_GB
|
|||||||
/**
|
/**
|
||||||
* Provides utiliy access to some common entities, so you won't need to use
|
* Provides utiliy access to some common entities, so you won't need to use
|
||||||
* their DAO classes.
|
* their DAO classes.
|
||||||
*
|
* <p/>
|
||||||
* Maybe this code should actually be in the DAO classes themselves, but then
|
* Maybe this code should actually be in the DAO classes themselves, but then
|
||||||
* these should be under revision control instead of 100% generated at build time.
|
* these should be under revision control instead of 100% generated at build time.
|
||||||
*/
|
*/
|
||||||
@ -61,6 +65,7 @@ public class DBHelper {
|
|||||||
* Closes the database and returns its name.
|
* Closes the database and returns its name.
|
||||||
* Important: after calling this, you have to DBHandler#openDb() it again
|
* Important: after calling this, you have to DBHandler#openDb() it again
|
||||||
* to get it back to work.
|
* to get it back to work.
|
||||||
|
*
|
||||||
* @param dbHandler
|
* @param dbHandler
|
||||||
* @return
|
* @return
|
||||||
* @throws IllegalStateException
|
* @throws IllegalStateException
|
||||||
@ -287,7 +292,7 @@ public class DBHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Device getDevice(GBDevice gbDevice, DaoSession session) {
|
public static Device getDevice(GBDevice gbDevice, DaoSession session) {
|
||||||
Device device = findDevice(gbDevice, session);
|
Device device = findDevice(gbDevice, session);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
device = createDevice(session, gbDevice);
|
device = createDevice(session, gbDevice);
|
||||||
}
|
}
|
||||||
@ -355,6 +360,7 @@ public class DBHelper {
|
|||||||
/**
|
/**
|
||||||
* Returns the old activity database handler if there is any content in that
|
* Returns the old activity database handler if there is any content in that
|
||||||
* db, or null otherwise.
|
* db, or null otherwise.
|
||||||
|
*
|
||||||
* @return the old activity db handler or null
|
* @return the old activity db handler or null
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -398,8 +404,21 @@ public class DBHelper {
|
|||||||
String order = "timestamp";
|
String order = "timestamp";
|
||||||
final String where = "provider=" + sampleProvider.getID();
|
final String where = "provider=" + sampleProvider.getID();
|
||||||
|
|
||||||
|
boolean convertActivityTypeToRange = false;
|
||||||
|
int currentTypeRun, previousTypeRun, currentTimeStamp, currentTypeStartTimeStamp, currentTypeEndTimeStamp;
|
||||||
|
List<PebbleHealthActivityOverlay> overlayList = new ArrayList<>();
|
||||||
|
|
||||||
final int BATCH_SIZE = 100000; // 100.000 samples = rougly 20 MB per batch
|
final int BATCH_SIZE = 100000; // 100.000 samples = rougly 20 MB per batch
|
||||||
List<T> newSamples;
|
List<T> newSamples;
|
||||||
|
if (sampleProvider instanceof PebbleHealthSampleProvider) {
|
||||||
|
convertActivityTypeToRange = true;
|
||||||
|
previousTypeRun = ActivitySample.NOT_MEASURED;
|
||||||
|
currentTypeStartTimeStamp = -1;
|
||||||
|
currentTypeEndTimeStamp = -1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
previousTypeRun = currentTypeStartTimeStamp = currentTypeEndTimeStamp = 0;
|
||||||
|
}
|
||||||
try (Cursor cursor = fromDb.query(TABLE_GBACTIVITYSAMPLES, null, where, null, null, null, order)) {
|
try (Cursor cursor = fromDb.query(TABLE_GBACTIVITYSAMPLES, null, where, null, null, null, order)) {
|
||||||
int colTimeStamp = cursor.getColumnIndex(KEY_TIMESTAMP);
|
int colTimeStamp = cursor.getColumnIndex(KEY_TIMESTAMP);
|
||||||
int colIntensity = cursor.getColumnIndex(KEY_INTENSITY);
|
int colIntensity = cursor.getColumnIndex(KEY_INTENSITY);
|
||||||
@ -414,9 +433,33 @@ public class DBHelper {
|
|||||||
newSample.setProvider(sampleProvider);
|
newSample.setProvider(sampleProvider);
|
||||||
newSample.setUserId(userId);
|
newSample.setUserId(userId);
|
||||||
newSample.setDeviceId(deviceId);
|
newSample.setDeviceId(deviceId);
|
||||||
newSample.setTimestamp(cursor.getInt(colTimeStamp));
|
currentTimeStamp = cursor.getInt(colTimeStamp);
|
||||||
newSample.setRawKind(getNullableInt(cursor, colType, ActivitySample.NOT_MEASURED));
|
newSample.setTimestamp(currentTimeStamp);
|
||||||
newSample.setRawIntensity(getNullableInt(cursor, colIntensity, ActivitySample.NOT_MEASURED));
|
newSample.setRawIntensity(getNullableInt(cursor, colIntensity, ActivitySample.NOT_MEASURED));
|
||||||
|
currentTypeRun = getNullableInt(cursor, colType, ActivitySample.NOT_MEASURED);
|
||||||
|
newSample.setRawKind(currentTypeRun);
|
||||||
|
if (convertActivityTypeToRange) {
|
||||||
|
//at the beginning there is no start timestamp
|
||||||
|
if (currentTypeStartTimeStamp == -1) {
|
||||||
|
currentTypeStartTimeStamp = currentTypeEndTimeStamp = currentTimeStamp;
|
||||||
|
previousTypeRun = currentTypeRun;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentTypeRun != previousTypeRun) {
|
||||||
|
//if the Type has changed, the run has ended. Only store light and deep sleep data
|
||||||
|
if (previousTypeRun == 4) {
|
||||||
|
overlayList.add(new PebbleHealthActivityOverlay(currentTypeStartTimeStamp, currentTypeEndTimeStamp, sampleProvider.toRawActivityKind(ActivityKind.TYPE_LIGHT_SLEEP), deviceId, userId, null));
|
||||||
|
} else if (previousTypeRun == 5) {
|
||||||
|
overlayList.add(new PebbleHealthActivityOverlay(currentTypeStartTimeStamp, currentTypeEndTimeStamp, sampleProvider.toRawActivityKind(ActivityKind.TYPE_DEEP_SLEEP), deviceId, userId, null));
|
||||||
|
}
|
||||||
|
currentTypeStartTimeStamp = currentTypeEndTimeStamp = currentTimeStamp;
|
||||||
|
previousTypeRun = currentTypeRun;
|
||||||
|
} else {
|
||||||
|
//just expand the run
|
||||||
|
currentTypeEndTimeStamp = currentTimeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
newSample.setSteps(getNullableInt(cursor, colSteps, ActivitySample.NOT_MEASURED));
|
newSample.setSteps(getNullableInt(cursor, colSteps, ActivitySample.NOT_MEASURED));
|
||||||
if (colCustomShort > -1) {
|
if (colCustomShort > -1) {
|
||||||
newSample.setHeartRate(getNullableInt(cursor, colCustomShort, ActivitySample.NOT_MEASURED));
|
newSample.setHeartRate(getNullableInt(cursor, colCustomShort, ActivitySample.NOT_MEASURED));
|
||||||
@ -435,6 +478,17 @@ public class DBHelper {
|
|||||||
if (!newSamples.isEmpty()) {
|
if (!newSamples.isEmpty()) {
|
||||||
sampleProvider.getSampleDao().insertOrReplaceInTx(newSamples, true);
|
sampleProvider.getSampleDao().insertOrReplaceInTx(newSamples, true);
|
||||||
}
|
}
|
||||||
|
// store the overlay records
|
||||||
|
if (!overlayList.isEmpty()) {
|
||||||
|
try (DBHandler dbHandler = GBApplication.acquireDB()) {
|
||||||
|
DaoSession session = dbHandler.getDaoSession();
|
||||||
|
PebbleHealthActivityOverlayDao overlayDao = session.getPebbleHealthActivityOverlayDao();
|
||||||
|
overlayDao.insertOrReplaceInTx(overlayList);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
//FIXME: this whole try catch is probably in the wrong place.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user