diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java index b3ce1332..e69706a3 100644 --- a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java +++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java @@ -34,6 +34,8 @@ public class GBDaoGenerator { public static void main(String[] args) throws Exception { Schema schema = new Schema(7, MAIN_PACKAGE + ".entities"); + addActivityDescription(schema); + Entity userAttributes = addUserAttributes(schema); Entity user = addUserInfo(schema, userAttributes); @@ -46,6 +48,14 @@ public class GBDaoGenerator { new DaoGenerator().generateAll(schema, "app/src/main/java"); } + private static Entity addActivityDescription(Schema schema) { + Entity activityDescription = addEntity(schema, "ActivityDescription"); + activityDescription.addIdProperty(); + activityDescription.addIntProperty("fromTimestamp").notNull(); + activityDescription.addIntProperty("toTimestamp"); + return activityDescription; + } + private static Entity addUserInfo(Schema schema, Entity userAttributes) { Entity user = addEntity(schema, "User"); user.addIdProperty(); @@ -53,11 +63,23 @@ public class GBDaoGenerator { user.addDateProperty("birthday").notNull(); user.addIntProperty("gender").notNull(); Property userId = userAttributes.addLongProperty("userId").notNull().getProperty(); - user.addToMany(userAttributes, userId); + + // sorted by the from-date, newest first + Property userAttributesSortProperty = getPropertyByName(userAttributes, VALID_FROM_UTC); + user.addToMany(userAttributes, userId).orderDesc(userAttributesSortProperty); return user; } + private static Property getPropertyByName(Entity entity, String propertyName) { + for (Property prop : entity.getProperties()) { + if (propertyName.equals(prop.getPropertyName())) { + return prop; + } + } + throw new IllegalStateException("Could not find property " + propertyName + " in entity " + entity.getClassName()); + } + private static Entity addUserAttributes(Schema schema) { // additional properties of a user, which may change during the lifetime of a user // this allows changing attributes while preserving user identity @@ -80,7 +102,9 @@ public class GBDaoGenerator { device.addStringProperty("manufacturer").notNull(); device.addStringProperty("identifier").notNull().unique().javaDocGetterAndSetter("The fixed identifier, i.e. MAC address of the device."); Property deviceId = deviceAttributes.addLongProperty("deviceId").notNull().getProperty(); - device.addToMany(deviceAttributes, deviceId); + // sorted by the from-date, newest first + Property deviceAttributesSortProperty = getPropertyByName(deviceAttributes, VALID_FROM_UTC); + device.addToMany(deviceAttributes, deviceId).orderDesc(deviceAttributesSortProperty); return device; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHelper.java index 33b54865..a4be8fd0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHelper.java @@ -134,22 +134,35 @@ public class DBHelper { public static User getUser(DaoSession session) { UserDao userDao = session.getUserDao(); List users = userDao.loadAll(); + ActivityUser prefsUser = new ActivityUser(); + User user; if (users.isEmpty()) { - User user = createUser(session); - return user; + user = createUser(prefsUser, session); + } else { + user = users.get(0); // TODO: multiple users support? } - return users.get(0); // TODO: multiple users support? + ensureUserAttributes(user, prefsUser, session); + + return user; } - private static User createUser(DaoSession session) { - ActivityUser prefsUser = new ActivityUser(); + private static User createUser(ActivityUser prefsUser, DaoSession session) { User user = new User(); user.setName(prefsUser.getName()); user.setBirthday(prefsUser.getUserBirthday()); user.setGender(prefsUser.getGender()); session.getUserDao().insert(user); - List userAttributes = user.getUserAttributesList(); + ensureUserAttributes(user, prefsUser, session); + + return user; + } + + private static void ensureUserAttributes(User user, ActivityUser prefsUser, DaoSession session) { + List userAttributes = user.getUserAttributesList(); + if (hasUpToDateUserAttributes(userAttributes, prefsUser)) { + return; + } UserAttributes attributes = new UserAttributes(); attributes.setValidFromUTC(DateTimeUtils.todayUTC()); attributes.setHeightCM(prefsUser.getHeightCm()); @@ -158,8 +171,21 @@ public class DBHelper { session.getUserAttributesDao().insert(attributes); userAttributes.add(attributes); + } - return user; + private static boolean hasUpToDateUserAttributes(List userAttributes, ActivityUser prefsUser) { + for (UserAttributes attr : userAttributes) { + if (!isActive(attr)) { + return false; + } + if (isEqual(attr, prefsUser)) { + return true; + } + } + return false; + } + + private static boolean isEqual(UserAttributes attr, ActivityUser prefsUser) { } public static Device getDevice(GBDevice gbDevice, DaoSession session) {