From 3513a902ae11a9aa1821b833e1b5b2dc6a0a73a9 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 27 Mar 2016 22:13:06 +0200 Subject: [PATCH 01/35] Work towards using greenDAO #206 --- GBDaoGenerator/.gitignore | 2 + GBDaoGenerator/build.gradle | 28 +++++ .../gadgetbridge/daogen/GBDaoGenerator.java | 112 ++++++++++++++++++ app/build.gradle | 6 + settings.gradle | 2 +- 5 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 GBDaoGenerator/.gitignore create mode 100644 GBDaoGenerator/build.gradle create mode 100644 GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java diff --git a/GBDaoGenerator/.gitignore b/GBDaoGenerator/.gitignore new file mode 100644 index 000000000..81631c695 --- /dev/null +++ b/GBDaoGenerator/.gitignore @@ -0,0 +1,2 @@ +/bin +/build diff --git a/GBDaoGenerator/build.gradle b/GBDaoGenerator/build.gradle new file mode 100644 index 000000000..897609bc5 --- /dev/null +++ b/GBDaoGenerator/build.gradle @@ -0,0 +1,28 @@ +apply plugin: 'java' +//apply plugin: 'maven' +apply plugin:'application' + +archivesBaseName = 'gadgetbridge-daogenerator' +//version = '0.9.2-SNAPSHOT' + +dependencies { + compile 'de.greenrobot:greendao-generator:2.1.0' +} + +sourceSets { + main { + java { + srcDir 'src' + srcDir 'src-gen' + } + } +} + +task (genSources, type: JavaExec) { + main = "nodomain.freeyourgadget.gadgetbridge.daogen.GBDaoGenerator" + classpath = sourceSets.main.runtimeClasspath +} + +artifacts { + archives jar +} diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java new file mode 100644 index 000000000..651b1aa3e --- /dev/null +++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package nodomain.freeyourgadget.gadgetbridge.daogen; + +import de.greenrobot.daogenerator.DaoGenerator; +import de.greenrobot.daogenerator.Entity; +import de.greenrobot.daogenerator.Property; +import de.greenrobot.daogenerator.Schema; + +/** + * Generates entities and DAOs for the example project DaoExample. + * Automatically run during build. + */ +public class GBDaoGenerator { + + public static final String VALID_FROM_UTC = "validFromUTC"; + public static final String VALID_TO_UTC = "validToUTC"; + + public static void main(String[] args) throws Exception { + Schema schema = new Schema(7, "nodomain.freeyourgadget.gadgetbridge.entities"); + + Entity userAttributes = addUserAttributes(schema); + Entity user = addUserInfo(schema, userAttributes); + + Entity deviceAttributes = addDeviceAttributes(schema); + Entity device = addDevice(schema, deviceAttributes); + + addActivitySample(schema, user, device); + + new DaoGenerator().generateAll(schema, "../app/src/main/gen"); + } + + private static Entity addUserInfo(Schema schema, Entity userAttributes) { + Entity user = schema.addEntity("User"); + user.addIdProperty(); + user.addStringProperty("name").notNull(); + user.addDateProperty("birthday").notNull(); + user.addIntProperty("sex").notNull(); + Property userId = userAttributes.addLongProperty("userId").notNull().getProperty(); + user.addToMany(userAttributes, userId); + + return user; + } + + 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 + Entity userAttributes = schema.addEntity("UserAttributes"); + userAttributes.addIdProperty(); + userAttributes.addIntProperty("heightCM").notNull(); + userAttributes.addIntProperty("weightKG").notNull(); + userAttributes.addIntProperty("sleepGoalHPD"); + userAttributes.addIntProperty("stepsGoalSPD"); + userAttributes.addDateProperty(VALID_FROM_UTC); + userAttributes.addDateProperty(VALID_TO_UTC); + + return userAttributes; + } + + private static Entity addDevice(Schema schema, Entity deviceAttributes) { + Entity device = schema.addEntity("Device"); + device.addIdProperty(); + device.addStringProperty("name").notNull(); + device.addStringProperty("manufacturer").notNull(); + device.addStringProperty("identifier").notNull().javaDocGetterAndSetter("The fixed identifier, i.e. MAC address of the device."); + Property deviceId = deviceAttributes.addLongProperty("deviceId").notNull().getProperty(); + device.addToMany(deviceAttributes, deviceId); + + return device; + } + + private static Entity addDeviceAttributes(Schema schema) { + Entity deviceAttributes = schema.addEntity("DeviceAttributes"); + deviceAttributes.addIdProperty(); + deviceAttributes.addStringProperty("firmwareVersion1").notNull(); + deviceAttributes.addStringProperty("firmwareVersion2"); + deviceAttributes.addDateProperty(VALID_FROM_UTC); + deviceAttributes.addDateProperty(VALID_TO_UTC); + + return deviceAttributes; + } + + private static Entity addActivitySample(Schema schema, Entity user, Entity device) { +// public GBActivitySample(SampleProvider provider, int timestamp, int intensity, int steps, int type, int customValue) { + Entity activitySample = schema.addEntity("ActivitySample"); + activitySample.addIdProperty(); + activitySample.addIntProperty("timestamp").notNull(); + activitySample.addIntProperty("intensity").notNull(); + activitySample.addIntProperty("steps").notNull(); + activitySample.addIntProperty("type").notNull(); + activitySample.addIntProperty("customValue").notNull(); + Property userId = activitySample.addLongProperty("userId").getProperty(); + activitySample.addToOne(user, userId); + Property deviceId = activitySample.addLongProperty("deviceId").getProperty(); + activitySample.addToOne(device, deviceId); + + return activitySample; + } +} diff --git a/app/build.gradle b/app/build.gradle index accb84ae6..2da01cac0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,6 +53,12 @@ dependencies { compile 'com.github.PhilJay:MPAndroidChart:v2.2.3' compile 'com.github.pfichtner:durationformatter:0.1.1' compile 'de.cketti.library.changelog:ckchangelog:1.2.2' + compile 'de.greenrobot:greendao:2.1.0' +} + +preBuild.dependsOn(":GBDaoGenerator:genSources") +gradle.beforeProject { + preBuild.dependsOn(":GBDaoGenerator:genSources") } check.dependsOn 'findbugs', 'pmd', 'lint' diff --git a/settings.gradle b/settings.gradle index e7b4def49..6579a81e8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' +include ':app', ':GBDaoGenerator' From 206b0670a4e65c4d839092b682536b0ffe813161 Mon Sep 17 00:00:00 2001 From: Lem Dulfo Date: Sun, 10 Apr 2016 00:18:16 +0800 Subject: [PATCH 02/35] Fixed mainClassName error, fix entity generation --- GBDaoGenerator/build.gradle | 8 +++++--- .../gadgetbridge/daogen/GBDaoGenerator.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/GBDaoGenerator/build.gradle b/GBDaoGenerator/build.gradle index 897609bc5..a708acb1a 100644 --- a/GBDaoGenerator/build.gradle +++ b/GBDaoGenerator/build.gradle @@ -13,14 +13,16 @@ sourceSets { main { java { srcDir 'src' - srcDir 'src-gen' } } } -task (genSources, type: JavaExec) { - main = "nodomain.freeyourgadget.gadgetbridge.daogen.GBDaoGenerator" +mainClassName = "nodomain.freeyourgadget.gadgetbridge.daogen.GBDaoGenerator" + +task genSources(type: JavaExec) { + main = mainClassName classpath = sourceSets.main.runtimeClasspath + workingDir = '../' } artifacts { diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java index 651b1aa3e..5d1cb4579 100644 --- a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java +++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java @@ -40,7 +40,7 @@ public class GBDaoGenerator { addActivitySample(schema, user, device); - new DaoGenerator().generateAll(schema, "../app/src/main/gen"); + new DaoGenerator().generateAll(schema, "app/src/main/java"); } private static Entity addUserInfo(Schema schema, Entity userAttributes) { From 82b4394b40188cee1ce64644e53acbb15b34d0f0 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 10 Apr 2016 21:51:47 +0200 Subject: [PATCH 03/35] Ignore generated entities --- .../nodomain/freeyourgadget/gadgetbridge/entities/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/entities/.gitignore diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/entities/.gitignore b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/entities/.gitignore new file mode 100644 index 000000000..4d5306dbf --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/entities/.gitignore @@ -0,0 +1 @@ +*.java From a45eacf9b83f1b8709018ae0eb301eb737901e8e Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 17 Apr 2016 19:52:51 +0200 Subject: [PATCH 04/35] WIP: schema update, ... #206 --- .../gadgetbridge/daogen/GBDaoGenerator.java | 24 ++++++++++++++----- .../gadgetbridge/GBApplication.java | 17 +++++++++++++ .../gadgetbridge/activities/GBActivity.java | 5 ++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java index 5d1cb4579..3d14794c3 100644 --- a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java +++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java @@ -38,7 +38,8 @@ public class GBDaoGenerator { Entity deviceAttributes = addDeviceAttributes(schema); Entity device = addDevice(schema, deviceAttributes); - addActivitySample(schema, user, device); + addMiBandActivitySample(schema, user, device); + addPebbleActivitySample(schema, user, device); new DaoGenerator().generateAll(schema, "app/src/main/java"); } @@ -93,20 +94,31 @@ public class GBDaoGenerator { return deviceAttributes; } - private static Entity addActivitySample(Schema schema, Entity user, Entity device) { + private static Entity addMiBandActivitySample(Schema schema, Entity user, Entity device) { // public GBActivitySample(SampleProvider provider, int timestamp, int intensity, int steps, int type, int customValue) { - Entity activitySample = schema.addEntity("ActivitySample"); + Entity activitySample = schema.addEntity("MiBandActivitySample"); + addCommonAcivitySampleProperties(schema, activitySample, user, device); + activitySample.addIntProperty("heartrate"); + return activitySample; + } + + private static Entity addPebbleActivitySample(Schema schema, Entity user, Entity device) { +// public GBActivitySample(SampleProvider provider, int timestamp, int intensity, int steps, int type, int customValue) { + Entity activitySample = schema.addEntity("PebbleActivitySample"); + addCommonAcivitySampleProperties(schema, activitySample, user, device); +// activitySample.addIntProperty("heartrate").notNull(); + return activitySample; + } + + private static void addCommonAcivitySampleProperties(Schema schema, Entity activitySample, Entity user, Entity device) { activitySample.addIdProperty(); activitySample.addIntProperty("timestamp").notNull(); activitySample.addIntProperty("intensity").notNull(); activitySample.addIntProperty("steps").notNull(); activitySample.addIntProperty("type").notNull(); - activitySample.addIntProperty("customValue").notNull(); Property userId = activitySample.addLongProperty("userId").getProperty(); activitySample.addToOne(user, userId); Property deviceId = activitySample.addLongProperty("deviceId").getProperty(); activitySample.addToOne(device, deviceId); - - return activitySample; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index f292133af..2667274b8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -6,6 +6,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.os.Build.VERSION; import android.preference.PreferenceManager; @@ -25,6 +26,8 @@ import java.util.concurrent.locks.ReentrantLock; import nodomain.freeyourgadget.gadgetbridge.database.ActivityDatabaseHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBConstants; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoMaster; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService; import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; import nodomain.freeyourgadget.gadgetbridge.model.DeviceService; @@ -50,6 +53,7 @@ public class GBApplication extends Application { //if preferences have to be migrated, increment the following and add the migration logic in migratePrefs below; see http://stackoverflow.com/questions/16397848/how-can-i-migrate-android-preferences-with-a-new-version private static final int CURRENT_PREFS_VERSION = 2; private static LimitedQueue mIDSenderLookup = new LimitedQueue(16); + private static DaoSession daoSession; public static final String ACTION_QUIT = "nodomain.freeyourgadget.gadgetbridge.gbapplication.action.quit"; @@ -99,6 +103,8 @@ public class GBApplication extends Application { // StatusPrinter.print(lc); // Logger logger = LoggerFactory.getLogger(GBApplication.class); + setupDatabase(); + deviceService = createDeviceService(); GB.environment = GBEnvironment.createDeviceEnvironment(); mActivityDatabaseHandler = new ActivityDatabaseHandler(context); @@ -151,6 +157,17 @@ public class GBApplication extends Application { return LoggerFactory.getLogger(GBApplication.class); } + private void setupDatabase() { + DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "test-db", null); + SQLiteDatabase db = helper.getWritableDatabase(); + DaoMaster daoMaster = new DaoMaster(db); + daoSession = daoMaster.newSession(); + } + + public static DaoSession getDaoSession() { + return daoSession; + } + public static Context getContext() { return context; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/GBActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/GBActivity.java index 39c972ea1..5eb566b8c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/GBActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/GBActivity.java @@ -6,6 +6,7 @@ import android.support.v7.app.AppCompatActivity; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; public class GBActivity extends AppCompatActivity { @@ -19,4 +20,8 @@ public class GBActivity extends AppCompatActivity { super.onCreate(savedInstanceState); } + + protected DaoSession getDAOSession() { + return GBApplication.getDaoSession(); + } } From 403a14ce8d4c97a8abac7ec212714da9c0262823 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 29 Apr 2016 22:50:37 +0200 Subject: [PATCH 05/35] Use a different application id until the db refactoring is done This allows installing both versions at the same time and avoids data loss when the database is scrubbed. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 65c680fd0..0e79900b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { buildToolsVersion "23.0.3" defaultConfig { - applicationId "nodomain.freeyourgadget.gadgetbridge" + applicationId "nodomain.freeyourgadget.gadgetbridge.greendao" minSdkVersion 19 targetSdkVersion 23 From b363d08efb03d0c4fc7a097b2ef1423013b09055 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 29 Apr 2016 23:12:30 +0200 Subject: [PATCH 06/35] WIP: a little work towards greendao need to think of how to integrate MiBandActivitySample and PebbleActivitySample into the app. There's GBActivitySample, MiBandSampleProvider, PebbleSampleProvider, etc. --- .../gadgetbridge/GBApplication.java | 6 +- .../database/ActivityDatabaseHandler.java | 42 +-------- .../gadgetbridge/database/DBHandler.java | 5 + .../gadgetbridge/database/DaoHandler.java | 82 ++++++++++++++++ .../database/schema/SchemaMigration.java | 59 ++++++++++++ .../gadgetbridge/impl/GBActivitySample2.java | 94 +++++++++++++++++++ 6 files changed, 247 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DaoHandler.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/SchemaMigration.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBActivitySample2.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index 5cdf5fc9e..c26013d15 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -30,6 +30,7 @@ import ch.qos.logback.core.Appender; import nodomain.freeyourgadget.gadgetbridge.database.ActivityDatabaseHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBConstants; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; +import nodomain.freeyourgadget.gadgetbridge.database.DaoHandler; import nodomain.freeyourgadget.gadgetbridge.entities.DaoMaster; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService; @@ -51,7 +52,7 @@ public class GBApplication extends Application { // Since this class must not log to slf4j, we use plain android.util.Log private static final String TAG = "GBApplication"; private static GBApplication context; - private static ActivityDatabaseHandler mActivityDatabaseHandler; + private static DBHandler mActivityDatabaseHandler; private static final Lock dbLock = new ReentrantLock(); private static DeviceService deviceService; private static SharedPreferences sharedPrefs; @@ -118,7 +119,7 @@ public class GBApplication extends Application { deviceService = createDeviceService(); GB.environment = GBEnvironment.createDeviceEnvironment(); - mActivityDatabaseHandler = new ActivityDatabaseHandler(context); +// mActivityDatabaseHandler = new ActivityDatabaseHandler(context); loadBlackList(); IntentFilter filterLocal = new IntentFilter(); @@ -209,6 +210,7 @@ public class GBApplication extends Application { SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); + mActivityDatabaseHandler = new DaoHandler(daoMaster, helper); } public static DaoSession getDaoSession() { 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 ce9e1ae46..539667afd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/ActivityDatabaseHandler.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.database.schema.ActivityDBCreationScript; +import nodomain.freeyourgadget.gadgetbridge.database.schema.SchemaMigration; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; import nodomain.freeyourgadget.gadgetbridge.impl.GBActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; @@ -52,49 +53,12 @@ public class ActivityDatabaseHandler extends SQLiteOpenHelper implements DBHandl @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - LOG.info("ActivityDatabase: schema upgrade requested from " + oldVersion + " to " + newVersion); - try { - for (int i = oldVersion + 1; i <= newVersion; i++) { - DBUpdateScript updater = getUpdateScript(db, i); - if (updater != null) { - LOG.info("upgrading activity database to version " + i); - updater.upgradeSchema(db); - } - } - LOG.info("activity database is now at version " + newVersion); - } catch (RuntimeException ex) { - GB.toast("Error upgrading database.", Toast.LENGTH_SHORT, GB.ERROR, ex); - throw ex; // reject upgrade - } + new SchemaMigration().onUpgrade(db, oldVersion, newVersion); } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - LOG.info("ActivityDatabase: schema downgrade requested from " + oldVersion + " to " + newVersion); - try { - for (int i = oldVersion; i >= newVersion; i--) { - DBUpdateScript updater = getUpdateScript(db, i); - if (updater != null) { - LOG.info("downgrading activity database to version " + (i - 1)); - updater.downgradeSchema(db); - } - } - LOG.info("activity database is now at version " + newVersion); - } catch (RuntimeException ex) { - GB.toast("Error downgrading database.", Toast.LENGTH_SHORT, GB.ERROR, ex); - throw ex; // reject downgrade - } - } - - private DBUpdateScript getUpdateScript(SQLiteDatabase db, int version) { - try { - Class updateClass = getClass().getClassLoader().loadClass(getClass().getPackage().getName() + ".schema.ActivityDBUpdate_" + version); - return (DBUpdateScript) updateClass.newInstance(); - } catch (ClassNotFoundException e) { - return null; - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException("Error instantiating DBUpdate class for version " + version, e); - } + new SchemaMigration().onDowngrade(db, oldVersion, newVersion); } public void addGBActivitySample(ActivitySample sample) { 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 49dbbd400..b0ad26202 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DBHandler.java @@ -10,6 +10,11 @@ import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; public interface DBHandler { + /** + * Closes the database. + */ + void close(); + SQLiteOpenHelper getHelper(); /** diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DaoHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DaoHandler.java new file mode 100644 index 000000000..6887ac121 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/DaoHandler.java @@ -0,0 +1,82 @@ +package nodomain.freeyourgadget.gadgetbridge.database; + +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoMaster; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; + +public class DaoHandler implements DBHandler { + + private final DaoMaster mDaoMaster; + private final SQLiteOpenHelper openHelper; + + public DaoHandler(DaoMaster master, DaoMaster.DevOpenHelper helper) { + mDaoMaster = master; + openHelper = helper; + } + + @Override + public void close() { + getHelper().close(); + } + + @Override + public SQLiteOpenHelper getHelper() { + return openHelper; + } + + @Override + public void release() { + GBApplication.releaseDB(); + } + + @Override + public List getAllActivitySamples(int tsFrom, int tsTo, SampleProvider provider) { + return null; + } + + @Override + public List getActivitySamples(int tsFrom, int tsTo, SampleProvider provider) { + return null; + } + + @Override + public List getSleepSamples(int tsFrom, int tsTo, SampleProvider provider) { + return null; + } + + @Override + public void addGBActivitySample(int timestamp, int provider, int intensity, int steps, int kind, int heartrate) { + + } + + @Override + public void addGBActivitySamples(ActivitySample[] activitySamples) { + + } + + @Override + public SQLiteDatabase getWritableDatabase() { + return mDaoMaster.getDatabase(); + } + + @Override + public void changeStoredSamplesType(int timestampFrom, int timestampTo, int kind, SampleProvider provider) { + + } + + @Override + public void changeStoredSamplesType(int timestampFrom, int timestampTo, int fromKind, int toKind, SampleProvider provider) { + + } + + @Override + public int fetchLatestTimestamp(SampleProvider provider) { + return 0; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/SchemaMigration.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/SchemaMigration.java new file mode 100644 index 000000000..6e1c959b8 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/SchemaMigration.java @@ -0,0 +1,59 @@ +package nodomain.freeyourgadget.gadgetbridge.database.schema; + +import android.database.sqlite.SQLiteDatabase; +import android.widget.Toast; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + +public class SchemaMigration { + private static final Logger LOG = LoggerFactory.getLogger(SchemaMigration.class); + + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + LOG.info("ActivityDatabase: schema upgrade requested from " + oldVersion + " to " + newVersion); + try { + for (int i = oldVersion + 1; i <= newVersion; i++) { + DBUpdateScript updater = getUpdateScript(db, i); + if (updater != null) { + LOG.info("upgrading activity database to version " + i); + updater.upgradeSchema(db); + } + } + LOG.info("activity database is now at version " + newVersion); + } catch (RuntimeException ex) { + GB.toast("Error upgrading database.", Toast.LENGTH_SHORT, GB.ERROR, ex); + throw ex; // reject upgrade + } + } + + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + LOG.info("ActivityDatabase: schema downgrade requested from " + oldVersion + " to " + newVersion); + try { + for (int i = oldVersion; i >= newVersion; i--) { + DBUpdateScript updater = getUpdateScript(db, i); + if (updater != null) { + LOG.info("downgrading activity database to version " + (i - 1)); + updater.downgradeSchema(db); + } + } + LOG.info("activity database is now at version " + newVersion); + } catch (RuntimeException ex) { + GB.toast("Error downgrading database.", Toast.LENGTH_SHORT, GB.ERROR, ex); + throw ex; // reject downgrade + } + } + + private DBUpdateScript getUpdateScript(SQLiteDatabase db, int version) { + try { + Class updateClass = getClass().getClassLoader().loadClass(getClass().getPackage().getName() + ".schema.ActivityDBUpdate_" + version); + return (DBUpdateScript) updateClass.newInstance(); + } catch (ClassNotFoundException e) { + return null; + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException("Error instantiating DBUpdate class for version " + version, e); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBActivitySample2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBActivitySample2.java new file mode 100644 index 000000000..d01b322ee --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBActivitySample2.java @@ -0,0 +1,94 @@ +package nodomain.freeyourgadget.gadgetbridge.impl; + +import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; +import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; + +public class GBActivitySample2 implements ActivitySample { + private final int timestamp; + private final SampleProvider provider; + private final int intensity; + private final int steps; + private final int type; + private final int customValue; + + public GBActivitySample2(SampleProvider provider, int timestamp, int intensity, int steps, int type) { + this(provider, timestamp, intensity, steps, type, 0); + } + + public GBActivitySample2(SampleProvider provider, int timestamp, int intensity, int steps, int type, int customValue) { + this.timestamp = timestamp; + this.provider = provider; + this.intensity = intensity; + this.steps = steps; + this.customValue = customValue; + this.type = type; + validate(); + } + + private void validate() { + if (steps < 0) { + throw new IllegalArgumentException("steps must be >= 0"); + } + if (intensity < 0) { + throw new IllegalArgumentException("intensity must be >= 0"); + } + if (timestamp < 0) { + throw new IllegalArgumentException("timestamp must be >= 0"); + } + if (customValue < 0) { + throw new IllegalArgumentException("customValue must be >= 0"); + } + } + + @Override + public int getTimestamp() { + return timestamp; + } + + @Override + public SampleProvider getProvider() { + return provider; + } + + @Override + public int getRawIntensity() { + return intensity; + } + + @Override + public float getIntensity() { + return getProvider().normalizeIntensity(getRawIntensity()); + } + + @Override + public int getSteps() { + return steps; + } + + @Override + public int getRawKind() { + return type; + } + + @Override + public int getKind() { + return getProvider().normalizeType(getRawKind()); + } + + @Override + public int getCustomValue() { + return customValue; + } + + @Override + public String toString() { + return "GBActivitySample{" + + "timestamp=" + DateTimeUtils.formatDateTime(DateTimeUtils.parseTimeStamp(timestamp)) + + ", intensity=" + getIntensity() + + ", steps=" + getSteps() + + ", customValue=" + getCustomValue() + + ", type=" + getKind() + + '}'; + } +} From 7d15d4ff4279fc8c076de53f182fdf4ae8fad402 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Fri, 29 Apr 2016 23:19:19 +0200 Subject: [PATCH 07/35] Also update the package name in the manifest --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5d0ac7d12..46564e157 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="nodomain.freeyourgadget.gadgetbridge.greendao"> () { @Override protected Object doInBackground(Object[] params) {