remove old db code

This commit is contained in:
Milos Kozak 2021-05-29 23:38:19 +02:00
parent 91ad9a3ca9
commit 9d29cafbe6
74 changed files with 137 additions and 3184 deletions

View file

@ -6,7 +6,6 @@ import android.content.IntentFilter
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import android.os.Build import android.os.Build
import com.j256.ormlite.android.apptools.OpenHelperManager
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.DaggerApplication import dagger.android.DaggerApplication
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
@ -15,11 +14,10 @@ import info.nightscout.androidaps.database.entities.UserEntry
import info.nightscout.androidaps.database.transactions.InsertIfNewByTimestampTherapyEventTransaction import info.nightscout.androidaps.database.transactions.InsertIfNewByTimestampTherapyEventTransaction
import info.nightscout.androidaps.database.transactions.VersionChangeTransaction import info.nightscout.androidaps.database.transactions.VersionChangeTransaction
import info.nightscout.androidaps.db.CompatDBHelper import info.nightscout.androidaps.db.CompatDBHelper
import info.nightscout.androidaps.db.DatabaseHelper import info.nightscout.androidaps.di.StaticInjector
import info.nightscout.androidaps.db.StaticInjector
import info.nightscout.androidaps.dependencyInjection.DaggerAppComponent import info.nightscout.androidaps.dependencyInjection.DaggerAppComponent
import info.nightscout.androidaps.interfaces.ConfigBuilder
import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.interfaces.ConfigBuilder
import info.nightscout.androidaps.interfaces.PluginBase import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
@ -63,7 +61,6 @@ class MainApp : DaggerApplication() {
super.onCreate() super.onCreate()
aapsLogger.debug("onCreate") aapsLogger.debug("onCreate")
update(this) update(this)
dbHelper = OpenHelperManager.getHelper(this, DatabaseHelper::class.java)
var gitRemote: String? = BuildConfig.REMOTE var gitRemote: String? = BuildConfig.REMOTE
var commitHash: String? = BuildConfig.HEAD var commitHash: String? = BuildConfig.HEAD
@ -134,9 +131,4 @@ class MainApp : DaggerApplication() {
keepAliveManager.cancelAlarm(this) keepAliveManager.cancelAlarm(this)
super.onTerminate() super.onTerminate()
} }
companion object {
lateinit var dbHelper: DatabaseHelper
}
} }

View file

@ -182,7 +182,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
addPreferencesFromResourceIfEnabled(automationPlugin, rootKey) addPreferencesFromResourceIfEnabled(automationPlugin, rootKey)
addPreferencesFromResourceIfEnabled(wearPlugin, rootKey) addPreferencesFromResourceIfEnabled(wearPlugin, rootKey)
addPreferencesFromResourceIfEnabled(statusLinePlugin, rootKey) addPreferencesFromResourceIfEnabled(statusLinePlugin, rootKey)
addPreferencesFromResource(R.xml.pref_alerts, rootKey) // TODO not organized well addPreferencesFromResource(R.xml.pref_alerts, rootKey)
addPreferencesFromResource(R.xml.pref_datachoices, rootKey) addPreferencesFromResource(R.xml.pref_datachoices, rootKey)
addPreferencesFromResourceIfEnabled(maintenancePlugin, rootKey) addPreferencesFromResourceIfEnabled(maintenancePlugin, rootKey)
addPreferencesFromResourceIfEnabled(openHumansUploader, rootKey) addPreferencesFromResourceIfEnabled(openHumansUploader, rootKey)

View file

@ -31,7 +31,7 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.T

View file

@ -24,7 +24,7 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.activities.fragments.TreatmentsCareportalFragment.RecyclerViewAdapter.TherapyEventsViewHolder import info.nightscout.androidaps.activities.fragments.TreatmentsCareportalFragment.RecyclerViewAdapter.TherapyEventsViewHolder
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy

View file

@ -29,7 +29,7 @@ import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientR
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData
import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
import info.nightscout.androidaps.plugins.profile.local.events.EventLocalProfileChanged import info.nightscout.androidaps.plugins.profile.local.events.EventLocalProfileChanged
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFragment.RecyclerProfileViewAdapter.ProfileSwitchViewHolder import info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFragment.RecyclerProfileViewAdapter.ProfileSwitchViewHolder
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy

View file

@ -28,7 +28,7 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.activities.fragments.TreatmentsTempTargetFragment.RecyclerViewAdapter.TempTargetsViewHolder import info.nightscout.androidaps.activities.fragments.TreatmentsTempTargetFragment.RecyclerViewAdapter.TempTargetsViewHolder
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy

View file

@ -19,7 +19,7 @@ import info.nightscout.androidaps.interfaces.ImportExportPrefs
import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.T

View file

@ -1,296 +0,0 @@
package info.nightscout.androidaps.db;
import android.content.Context;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.CloseableIterator;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.PreparedQuery;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.general.openhumans.OpenHumansUploader;
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin;
import info.nightscout.androidaps.utils.DateUtil;
/**
* This Helper contains all resource to provide a central DB management functionality. Only methods handling
* data-structure (and not the DB content) should be contained in here (meaning DDL and not SQL).
* <p>
* This class can safely be called from Services, but should not call Services to avoid circular dependencies.
* One major issue with this (right now) are the scheduled events, which are put into the service. Therefor all
* direct calls to the corresponding methods (eg. resetDatabases) should be done by a central service.
*/
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
@Inject AAPSLogger aapsLogger;
@Inject RxBusWrapper rxBus;
@Inject VirtualPumpPlugin virtualPumpPlugin;
@Inject OpenHumansUploader openHumansUploader;
@Inject ActivePlugin activePlugin;
@Inject DateUtil dateUtil;
public static final String DATABASE_NAME = "AndroidAPSDb";
private static final int DATABASE_VERSION = 13;
public static Long earliestDataChange = null;
private int oldVersion = 0;
private int newVersion = 0;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
StaticInjector.Companion.getInstance().androidInjector().inject(this);
onCreate(getWritableDatabase(), getConnectionSource());
//onUpgrade(getWritableDatabase(), getConnectionSource(), 1,1);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
aapsLogger.info(LTag.DATABASE, "onCreate");
TableUtils.createTableIfNotExists(connectionSource, OmnipodHistoryRecord.class);
TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class);
} catch (SQLException e) {
aapsLogger.error("Can't create database", e);
throw new RuntimeException(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
this.oldVersion = oldVersion;
this.newVersion = newVersion;
if (oldVersion < 7) {
aapsLogger.info(LTag.DATABASE, "onUpgrade");
onCreate(database, connectionSource);
}
TableUtils.createTableIfNotExists(connectionSource, OHQueueItem.class);
} catch (SQLException e) {
aapsLogger.error("Can't drop databases", e);
throw new RuntimeException(e);
}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
aapsLogger.info(LTag.DATABASE, "Do nothing for downgrading...");
aapsLogger.info(LTag.DATABASE, "oldVersion: {}, newVersion: {}", oldVersion, newVersion);
}
public int getOldVersion() {
return oldVersion;
}
public int getNewVersion() {
return newVersion;
}
public long size(String database) {
return DatabaseUtils.queryNumEntries(getReadableDatabase(), database);
}
// --------------------- DB resets ---------------------
public void resetDatabases() {
try {
TableUtils.dropTable(connectionSource, OmnipodHistoryRecord.class, true);
TableUtils.createTableIfNotExists(connectionSource, OmnipodHistoryRecord.class);
updateEarliestDataChange(0);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
virtualPumpPlugin.setFakingStatus(true);
new java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
rxBus.send(new EventRefreshOverview("resetDatabases", false));
}
},
3000
);
}
// ------------------ getDao -------------------------------------------
private Dao<OmnipodHistoryRecord, Long> getDaoPodHistory() throws SQLException {
return getDao(OmnipodHistoryRecord.class);
}
private Dao<OHQueueItem, Long> getDaoOpenHumansQueue() throws SQLException {
return getDao(OHQueueItem.class);
}
public static void updateEarliestDataChange(long newDate) {
if (earliestDataChange == null) {
earliestDataChange = newDate;
return;
}
if (newDate < earliestDataChange) {
earliestDataChange = newDate;
}
}
// ---------------- Food handling ---------------
// ---------------- PodHistory handling ---------------
public void createOrUpdate(OmnipodHistoryRecord omnipodHistoryRecord) {
try {
getDaoPodHistory().createOrUpdate(omnipodHistoryRecord);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public List<OmnipodHistoryRecord> getAllOmnipodHistoryRecordsFromTimeStamp(long from, boolean ascending) {
try {
Dao<OmnipodHistoryRecord, Long> daoPodHistory = getDaoPodHistory();
List<OmnipodHistoryRecord> podHistories;
QueryBuilder<OmnipodHistoryRecord, Long> queryBuilder = daoPodHistory.queryBuilder();
queryBuilder.orderBy("date", ascending);
//queryBuilder.limit(100L);
Where where = queryBuilder.where();
where.ge("date", from);
PreparedQuery<OmnipodHistoryRecord> preparedQuery = queryBuilder.prepare();
podHistories = daoPodHistory.query(preparedQuery);
return podHistories;
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return new ArrayList<>();
}
public OmnipodHistoryRecord findOmnipodHistoryRecordByPumpId(long pumpId) {
try {
Dao<OmnipodHistoryRecord, Long> daoPodHistory = getDaoPodHistory();
QueryBuilder<OmnipodHistoryRecord, Long> queryBuilder = daoPodHistory.queryBuilder();
queryBuilder.orderBy("date", false);
Where<OmnipodHistoryRecord, Long> where = queryBuilder.where();
where.eq("pumpId", pumpId);
PreparedQuery<OmnipodHistoryRecord> preparedQuery = queryBuilder.prepare();
return daoPodHistory.queryForFirst(preparedQuery);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return null;
}
/*
TODO implement again for database branch // Copied from xDrip+
String calculateDirection(BgReading bgReading) {
// Rework to get bgreaings from internal DB and calculate on that base
List<BgReading> bgReadingsList = MainApp.getDbHelper().getAllBgreadingsDataFromTime(bgReading.date - T.mins(10).msecs(), false);
if (bgReadingsList == null || bgReadingsList.size() < 2)
return "NONE";
BgReading current = bgReadingsList.get(1);
BgReading previous = bgReadingsList.get(0);
if (bgReadingsList.get(1).date < bgReadingsList.get(0).date) {
current = bgReadingsList.get(0);
previous = bgReadingsList.get(1);
}
double slope;
// Avoid division by 0
if (current.date == previous.date)
slope = 0;
else
slope = (previous.value - current.value) / (previous.date - current.date);
// aapsLogger.error(LTag.GLUCOSE, "Slope is :" + slope + " delta " + (previous.value - current.value) + " date difference " + (current.date - previous.date));
double slope_by_minute = slope * 60000;
String arrow = "NONE";
if (slope_by_minute <= (-3.5)) {
arrow = "DoubleDown";
} else if (slope_by_minute <= (-2)) {
arrow = "SingleDown";
} else if (slope_by_minute <= (-1)) {
arrow = "FortyFiveDown";
} else if (slope_by_minute <= (1)) {
arrow = "Flat";
} else if (slope_by_minute <= (2)) {
arrow = "FortyFiveUp";
} else if (slope_by_minute <= (3.5)) {
arrow = "SingleUp";
} else if (slope_by_minute <= (40)) {
arrow = "DoubleUp";
}
// aapsLogger.error(LTag.GLUCOSE, "Direction set to: " + arrow);
return arrow;
}
*/
// ---------------- Open Humans Queue handling ---------------
public void clearOpenHumansQueue() {
try {
TableUtils.clearTable(connectionSource, OHQueueItem.class);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public void createOrUpdate(OHQueueItem item) {
try {
getDaoOpenHumansQueue().createOrUpdate(item);
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public void removeAllOHQueueItemsWithIdSmallerThan(long id) {
try {
DeleteBuilder<OHQueueItem, Long> deleteBuilder = getDaoOpenHumansQueue().deleteBuilder();
deleteBuilder.where().le("id", id);
deleteBuilder.delete();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public List<OHQueueItem> getAllOHQueueItems(Long maxEntries) {
try {
return getDaoOpenHumansQueue()
.queryBuilder()
.orderBy("id", true)
.limit(maxEntries)
.query();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return Collections.emptyList();
}
public long getOHQueueSize() {
try {
return getDaoOpenHumansQueue().countOf();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return 0L;
}
}

View file

@ -1,84 +0,0 @@
package info.nightscout.androidaps.db;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.j256.ormlite.dao.CloseableIterator;
import java.sql.SQLException;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
@Deprecated
@Singleton
public class DatabaseHelperProvider implements DatabaseHelperInterface {
@Inject DatabaseHelperProvider() {
}
@Override public void createOrUpdate(@NonNull OmnipodHistoryRecord record) {
MainApp.Companion.getDbHelper().createOrUpdate(record);
}
@Override public boolean createOrUpdate(@NonNull TemporaryBasal tempBasal) {
// return MainApp.Companion.getDbHelper().createOrUpdate(tempBasal);
return false;
}
@Nullable @Override public TemporaryBasal findTempBasalByPumpId(long id) {
// return MainApp.Companion.getDbHelper().findTempBasalByPumpId(id);
return null;
}
@Deprecated
@NonNull @Override public List<TemporaryBasal> getTemporaryBasalsDataFromTime(long mills, boolean ascending) {
// return MainApp.Companion.getDbHelper().getTemporaryBasalsDataFromTime(mills, ascending);
return null;
}
@NonNull @Override public List<OmnipodHistoryRecord> getAllOmnipodHistoryRecordsFromTimestamp(long timestamp, boolean ascending) {
return MainApp.Companion.getDbHelper().getAllOmnipodHistoryRecordsFromTimeStamp(timestamp, ascending);
}
@Nullable @Override public OmnipodHistoryRecord findOmnipodHistoryRecordByPumpId(long pumpId) {
return MainApp.Companion.getDbHelper().findOmnipodHistoryRecordByPumpId(pumpId);
}
@Override public void delete(@NonNull ExtendedBolus extendedBolus) {
// MainApp.Companion.getDbHelper().delete(extendedBolus);
}
@Nullable @Override public ExtendedBolus getExtendedBolusByPumpId(long pumpId) {
// return MainApp.Companion.getDbHelper().getExtendedBolusByPumpId(pumpId);
return null;
}
@Override public void resetDatabases() {
MainApp.Companion.getDbHelper().resetDatabases();
}
@Override public void createOrUpdate(@NonNull OHQueueItem record) {
MainApp.Companion.getDbHelper().createOrUpdate(record);
}
@NonNull @Override public List<OHQueueItem> getAllOHQueueItems(long maxEntries) {
return MainApp.Companion.getDbHelper().getAllOHQueueItems(maxEntries);
}
@Override public long getOHQueueSize() {
return MainApp.Companion.getDbHelper().getOHQueueSize();
}
@Override public void clearOpenHumansQueue() {
MainApp.Companion.getDbHelper().clearOpenHumansQueue();
}
@Override public void removeAllOHQueueItemsWithIdSmallerThan(long id) {
MainApp.Companion.getDbHelper().removeAllOHQueueItemsWithIdSmallerThan(id);
}
}

View file

@ -1,2 +0,0 @@
package info.nightscout.androidaps.db

View file

@ -8,7 +8,6 @@ import dagger.Provides
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.db.DatabaseHelperProvider
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
@ -20,7 +19,6 @@ import info.nightscout.androidaps.plugins.general.nsclient.DataSyncSelectorImple
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.pump.PumpSyncImplementation import info.nightscout.androidaps.plugins.pump.PumpSyncImplementation
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.queue.CommandQueue import info.nightscout.androidaps.queue.CommandQueue
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.androidNotification.NotificationHolderImpl import info.nightscout.androidaps.utils.androidNotification.NotificationHolderImpl
@ -56,9 +54,7 @@ open class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideStorage(): Storage { fun provideStorage(): Storage = FileStorage()
return FileStorage()
}
@Provides @Provides
@Singleton @Singleton
@ -66,9 +62,8 @@ open class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideProfileFunction(aapsLogger: AAPSLogger, sp: SP, resourceHelper: ResourceHelper, activePlugin: ActivePlugin, repository: AppRepository, dateUtil: DateUtil): ProfileFunction { fun provideProfileFunction(aapsLogger: AAPSLogger, sp: SP, resourceHelper: ResourceHelper, activePlugin: ActivePlugin, repository: AppRepository, dateUtil: DateUtil): ProfileFunction =
return ProfileFunctionImplementation(aapsLogger, sp, resourceHelper, activePlugin, repository, dateUtil) ProfileFunctionImplementation(aapsLogger, sp, resourceHelper, activePlugin, repository, dateUtil)
}
@Module @Module
interface AppBindings { interface AppBindings {
@ -79,11 +74,7 @@ open class AppModule {
@Binds fun bindCommandQueueProvider(commandQueue: CommandQueue): CommandQueueProvider @Binds fun bindCommandQueueProvider(commandQueue: CommandQueue): CommandQueueProvider
@Binds fun bindConfigInterface(config: ConfigImpl): Config @Binds fun bindConfigInterface(config: ConfigImpl): Config
@Binds @Binds fun bindConfigBuilderInterface(configBuilderPlugin: ConfigBuilderPlugin): ConfigBuilder
fun bindConfigBuilderInterface(configBuilderPlugin: ConfigBuilderPlugin): ConfigBuilder
@Binds fun bindTreatmentsInterface(treatmentsPlugin: TreatmentsPlugin): TreatmentsInterface
@Binds fun bindDatabaseHelperInterface(databaseHelperProvider: DatabaseHelperProvider): DatabaseHelperInterface
@Binds fun bindNotificationHolderInterface(notificationHolder: NotificationHolderImpl): NotificationHolder @Binds fun bindNotificationHolderInterface(notificationHolder: NotificationHolderImpl): NotificationHolder
@Binds fun bindImportExportPrefsInterface(importExportPrefs: ImportExportPrefsImpl): ImportExportPrefs @Binds fun bindImportExportPrefsInterface(importExportPrefs: ImportExportPrefsImpl): ImportExportPrefs
@Binds fun bindIconsProviderInterface(iconsProvider: IconsProviderImplementation): IconsProvider @Binds fun bindIconsProviderInterface(iconsProvider: IconsProviderImplementation): IconsProvider
@ -93,7 +84,6 @@ open class AppModule {
@Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector @Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector
@Binds fun bindPumpSync(pumpSyncImplementation: PumpSyncImplementation): PumpSync @Binds fun bindPumpSync(pumpSyncImplementation: PumpSyncImplementation): PumpSync
} }
} }

View file

@ -2,9 +2,7 @@ package info.nightscout.androidaps.dependencyInjection
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import info.nightscout.androidaps.db.DatabaseHelper
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
import info.nightscout.androidaps.plugins.treatments.TreatmentService
import info.nightscout.androidaps.utils.wizard.BolusWizard import info.nightscout.androidaps.utils.wizard.BolusWizard
import info.nightscout.androidaps.utils.wizard.QuickWizardEntry import info.nightscout.androidaps.utils.wizard.QuickWizardEntry
@ -14,9 +12,6 @@ abstract class DataClassesModule {
@ContributesAndroidInjector abstract fun glucoseStatusInjector(): GlucoseStatus @ContributesAndroidInjector abstract fun glucoseStatusInjector(): GlucoseStatus
@ContributesAndroidInjector abstract fun databaseHelperInjector(): DatabaseHelper
@ContributesAndroidInjector abstract fun treatmentServiceInjector(): TreatmentService
@ContributesAndroidInjector abstract fun bolusWizardInjector(): BolusWizard @ContributesAndroidInjector abstract fun bolusWizardInjector(): BolusWizard
@ContributesAndroidInjector abstract fun quickWizardEntryInjector(): QuickWizardEntry @ContributesAndroidInjector abstract fun quickWizardEntryInjector(): QuickWizardEntry
} }

View file

@ -25,7 +25,6 @@ import info.nightscout.androidaps.plugins.general.dataBroadcaster.DataBroadcastP
import info.nightscout.androidaps.plugins.general.food.FoodPlugin import info.nightscout.androidaps.plugins.general.food.FoodPlugin
import info.nightscout.androidaps.plugins.general.maintenance.MaintenancePlugin import info.nightscout.androidaps.plugins.general.maintenance.MaintenancePlugin
import info.nightscout.androidaps.plugins.general.nsclient.NSClientPlugin import info.nightscout.androidaps.plugins.general.nsclient.NSClientPlugin
import info.nightscout.androidaps.plugins.general.openhumans.OpenHumansUploader
import info.nightscout.androidaps.plugins.general.overview.OverviewPlugin import info.nightscout.androidaps.plugins.general.overview.OverviewPlugin
import info.nightscout.androidaps.plugins.general.persistentNotification.PersistentNotificationPlugin import info.nightscout.androidaps.plugins.general.persistentNotification.PersistentNotificationPlugin
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
@ -40,14 +39,11 @@ import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
import info.nightscout.androidaps.plugins.pump.combo.ComboPlugin import info.nightscout.androidaps.plugins.pump.combo.ComboPlugin
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin
import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin
import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
import info.nightscout.androidaps.plugins.source.* import info.nightscout.androidaps.plugins.source.*
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import javax.inject.Qualifier import javax.inject.Qualifier
@Module @Module
@ -203,12 +199,6 @@ abstract class PluginsModule {
@IntKey(250) @IntKey(250)
abstract fun bindAutomationPlugin(plugin: AutomationPlugin): PluginBase abstract fun bindAutomationPlugin(plugin: AutomationPlugin): PluginBase
@Binds
@AllConfigs
@IntoMap
@IntKey(260)
abstract fun bindTreatmentsPlugin(plugin: TreatmentsPlugin): PluginBase
@Binds @Binds
@AllConfigs @AllConfigs
@IntoMap @IntoMap

View file

@ -0,0 +1,3 @@
package info.nightscout.androidaps.events
class EventTreatmentUpdateGui : EventUpdateGui()

View file

@ -1,6 +1,6 @@
package info.nightscout.androidaps.plugins.aps.logger package info.nightscout.androidaps.plugins.aps.logger
import info.nightscout.androidaps.db.StaticInjector import info.nightscout.androidaps.di.StaticInjector
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import org.mozilla.javascript.ScriptableObject import org.mozilla.javascript.ScriptableObject

View file

@ -114,7 +114,6 @@ class ConfigBuilderFragment : DaggerFragment() {
createViewsForPlugins(R.string.configbuilder_loop, R.string.configbuilder_loop_description, PluginType.LOOP, activePlugin.getSpecificPluginsVisibleInList(PluginType.LOOP)) createViewsForPlugins(R.string.configbuilder_loop, R.string.configbuilder_loop_description, PluginType.LOOP, activePlugin.getSpecificPluginsVisibleInList(PluginType.LOOP))
createViewsForPlugins(R.string.constraints, R.string.configbuilder_constraints_description, PluginType.CONSTRAINTS, activePlugin.getSpecificPluginsVisibleInList(PluginType.CONSTRAINTS)) createViewsForPlugins(R.string.constraints, R.string.configbuilder_constraints_description, PluginType.CONSTRAINTS, activePlugin.getSpecificPluginsVisibleInList(PluginType.CONSTRAINTS))
} }
createViewsForPlugins(R.string.configbuilder_treatments, R.string.configbuilder_treatments_description, PluginType.TREATMENT, activePlugin.getSpecificPluginsVisibleInList(PluginType.TREATMENT))
createViewsForPlugins(R.string.configbuilder_general, R.string.configbuilder_general_description, PluginType.GENERAL, activePlugin.getSpecificPluginsVisibleInList(PluginType.GENERAL)) createViewsForPlugins(R.string.configbuilder_general, R.string.configbuilder_general_description, PluginType.GENERAL, activePlugin.getSpecificPluginsVisibleInList(PluginType.GENERAL))
} }
@ -139,22 +138,15 @@ class ConfigBuilderFragment : DaggerFragment() {
@Suppress("InflateParams") @Suppress("InflateParams")
val baseView: LinearLayout = fragment.layoutInflater.inflate(R.layout.configbuilder_single_plugin, null) as LinearLayout val baseView: LinearLayout = fragment.layoutInflater.inflate(R.layout.configbuilder_single_plugin, null) as LinearLayout
private val enabledExclusive: RadioButton private val enabledExclusive: RadioButton = baseView.findViewById(R.id.plugin_enabled_exclusive)
private val enabledInclusive: CheckBox private val enabledInclusive: CheckBox = baseView.findViewById(R.id.plugin_enabled_inclusive)
private val pluginIcon: ImageView private val pluginIcon: ImageView = baseView.findViewById(R.id.plugin_icon)
private val pluginName: TextView private val pluginName: TextView = baseView.findViewById(R.id.plugin_name)
private val pluginDescription: TextView private val pluginDescription: TextView = baseView.findViewById(R.id.plugin_description)
private val pluginPreferences: ImageButton private val pluginPreferences: ImageButton = baseView.findViewById(R.id.plugin_preferences)
private val pluginVisibility: CheckBox private val pluginVisibility: CheckBox = baseView.findViewById(R.id.plugin_visibility)
init { init {
enabledExclusive = baseView.findViewById(R.id.plugin_enabled_exclusive)
enabledInclusive = baseView.findViewById(R.id.plugin_enabled_inclusive)
pluginIcon = baseView.findViewById(R.id.plugin_icon)
pluginName = baseView.findViewById(R.id.plugin_name)
pluginDescription = baseView.findViewById(R.id.plugin_description)
pluginPreferences = baseView.findViewById(R.id.plugin_preferences)
pluginVisibility = baseView.findViewById(R.id.plugin_visibility)
pluginVisibility.setOnClickListener { pluginVisibility.setOnClickListener {
plugin.setFragmentVisible(pluginType, pluginVisibility.isChecked) plugin.setFragmentVisible(pluginType, pluginVisibility.isChecked)

View file

@ -120,7 +120,6 @@ class ConfigBuilderPlugin @Inject constructor(
for (p in activePlugin.getPluginsList()) { for (p in activePlugin.getPluginsList()) {
aapsLogger.debug(LTag.CONFIGBUILDER, p.name + ":" + aapsLogger.debug(LTag.CONFIGBUILDER, p.name + ":" +
(if (p.isEnabled(PluginType.GENERAL)) " GENERAL" else "") + (if (p.isEnabled(PluginType.GENERAL)) " GENERAL" else "") +
(if (p.isEnabled(PluginType.TREATMENT)) " TREATMENT" else "") +
(if (p.isEnabled(PluginType.SENSITIVITY)) " SENSITIVITY" else "") + (if (p.isEnabled(PluginType.SENSITIVITY)) " SENSITIVITY" else "") +
(if (p.isEnabled(PluginType.PROFILE)) " PROFILE" else "") + (if (p.isEnabled(PluginType.PROFILE)) " PROFILE" else "") +
(if (p.isEnabled(PluginType.APS)) " APS" else "") + (if (p.isEnabled(PluginType.APS)) " APS" else "") +
@ -185,7 +184,6 @@ class ConfigBuilderPlugin @Inject constructor(
PluginType.APS -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(APS::class.java) PluginType.APS -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(APS::class.java)
PluginType.PROFILE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(ProfileSource::class.java) PluginType.PROFILE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(ProfileSource::class.java)
PluginType.BGSOURCE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(BgSource::class.java) PluginType.BGSOURCE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(BgSource::class.java)
PluginType.TREATMENT -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(TreatmentsInterface::class.java)
PluginType.PUMP -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(Pump::class.java) PluginType.PUMP -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(Pump::class.java)
else -> { else -> {

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.plugins.configBuilder package info.nightscout.androidaps.plugins.configBuilder
import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
@ -21,7 +20,6 @@ class PluginStore @Inject constructor(
private var activeAPSStore: APS? = null private var activeAPSStore: APS? = null
private var activeInsulinStore: Insulin? = null private var activeInsulinStore: Insulin? = null
private var activeSensitivityStore: Sensitivity? = null private var activeSensitivityStore: Sensitivity? = null
private var activeTreatmentsStore: TreatmentsInterface? = null
fun loadDefaults() { fun loadDefaults() {
verifySelectionInCategories() verifySelectionInCategories()
@ -121,16 +119,6 @@ class PluginStore @Inject constructor(
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting PumpInterface") aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting PumpInterface")
} }
setFragmentVisibilities((activePumpStore as PluginBase).name, pluginsInCategory, PluginType.PUMP) setFragmentVisibilities((activePumpStore as PluginBase).name, pluginsInCategory, PluginType.PUMP)
// PluginType.TREATMENT
pluginsInCategory = getSpecificPluginsList(PluginType.TREATMENT)
activeTreatmentsStore = getTheOneEnabledInArray(pluginsInCategory, PluginType.TREATMENT) as TreatmentsInterface?
if (activeTreatmentsStore == null) {
activeTreatmentsStore = getDefaultPlugin(PluginType.TREATMENT) as TreatmentsInterface
(activeTreatmentsStore as PluginBase).setPluginEnabled(PluginType.TREATMENT, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting PumpInterface")
}
setFragmentVisibilities((activeTreatmentsStore as PluginBase).name, pluginsInCategory, PluginType.TREATMENT)
} }
private fun setFragmentVisibilities(activePluginName: String, pluginsInCategory: ArrayList<PluginBase>, private fun setFragmentVisibilities(activePluginName: String, pluginsInCategory: ArrayList<PluginBase>,
@ -175,10 +163,6 @@ class PluginStore @Inject constructor(
get() = activeSensitivityStore get() = activeSensitivityStore
?: checkNotNull(activeSensitivityStore) { "No sensitivity selected" } ?: checkNotNull(activeSensitivityStore) { "No sensitivity selected" }
override val activeTreatments: TreatmentsInterface
get() = activeTreatmentsStore
?: checkNotNull(activeTreatmentsStore) { "No treatments selected" }
override val activeOverview: Overview override val activeOverview: Overview
get() = getSpecificPluginsListByInterface(Overview::class.java).first() as Overview get() = getSpecificPluginsListByInterface(Overview::class.java).first() as Overview

View file

@ -45,6 +45,7 @@ class ObjectivesPlugin @Inject constructor(
var objectives: MutableList<Objective> = ArrayList() var objectives: MutableList<Objective> = ArrayList()
companion object { companion object {
const val FIRST_OBJECTIVE = 0 const val FIRST_OBJECTIVE = 0
@Suppress("unused") const val USAGE_OBJECTIVE = 1 @Suppress("unused") const val USAGE_OBJECTIVE = 1
@Suppress("unused") const val EXAM_OBJECTIVE = 2 @Suppress("unused") const val EXAM_OBJECTIVE = 2
@ -60,7 +61,6 @@ class ObjectivesPlugin @Inject constructor(
public override fun onStart() { public override fun onStart() {
super.onStart() super.onStart()
convertSP()
setupObjectives() setupObjectives()
} }
@ -68,26 +68,6 @@ class ObjectivesPlugin @Inject constructor(
return activePlugin.activePump.pumpDescription.isTempBasalCapable return activePlugin.activePump.pumpDescription.isTempBasalCapable
} }
// convert 2.3 SP version
private fun convertSP() {
doConvertSP(0, "config")
doConvertSP(1, "openloop")
doConvertSP(2, "maxbasal")
doConvertSP(3, "maxiobzero")
doConvertSP(4, "maxiob")
doConvertSP(5, "autosens")
doConvertSP(6, "ama")
doConvertSP(7, "smb")
}
private fun doConvertSP(number: Int, name: String) {
if (!sp.contains("Objectives_" + name + "_started")) {
sp.putLong("Objectives_" + name + "_started", sp.getLong("Objectives" + number + "started", 0L))
sp.putLong("Objectives_" + name + "_accomplished", sp.getLong("Objectives" + number + "accomplished", 0L))
}
// TODO: we can remove Objectives1accomplished sometimes later
}
private fun setupObjectives() { private fun setupObjectives() {
objectives.clear() objectives.clear()
objectives.add(Objective0(injector)) objectives.add(Objective0(injector))
@ -125,7 +105,7 @@ class ObjectivesPlugin @Inject constructor(
val requestCode = sp.getString(R.string.key_objectives_request_code, "") val requestCode = sp.getString(R.string.key_objectives_request_code, "")
var url = sp.getString(R.string.key_nsclientinternal_url, "").lowercase(Locale.getDefault()) var url = sp.getString(R.string.key_nsclientinternal_url, "").lowercase(Locale.getDefault())
if (!url.endsWith("/")) url = "$url/" if (!url.endsWith("/")) url = "$url/"
@Suppress("DEPRECATION") val hashNS = Hashing.sha1().hashString(url + BuildConfig.APPLICATION_ID + "/" + requestCode, Charsets.UTF_8).toString() @Suppress("DEPRECATION", "UnstableApiUsage") val hashNS = Hashing.sha1().hashString(url + BuildConfig.APPLICATION_ID + "/" + requestCode, Charsets.UTF_8).toString()
if (request.equals(hashNS.substring(0, 10), ignoreCase = true)) { if (request.equals(hashNS.substring(0, 10), ignoreCase = true)) {
sp.putLong("Objectives_" + "openloop" + "_started", dateUtil.now()) sp.putLong("Objectives_" + "openloop" + "_started", dateUtil.now())
sp.putLong("Objectives_" + "openloop" + "_accomplished", dateUtil.now()) sp.putLong("Objectives_" + "openloop" + "_accomplished", dateUtil.now())

View file

@ -72,7 +72,7 @@ class MaintenancePlugin @Inject constructor(
} }
Arrays.sort(files) { f1: File, f2: File -> f1.name.compareTo(f2.name) } Arrays.sort(files) { f1: File, f2: File -> f1.name.compareTo(f2.name) }
var delFiles = listOf(*files) var delFiles = listOf(*files)
val amount = sp.getInt(R.string.key_logshipper_amount, 2) val amount = sp.getInt(R.string.key_logshipper_amount, 5)
val keepIndex = amount - 1 val keepIndex = amount - 1
if (keepIndex < delFiles.size) { if (keepIndex < delFiles.size) {
delFiles = delFiles.subList(keepIndex, delFiles.size) delFiles = delFiles.subList(keepIndex, delFiles.size)

View file

@ -16,7 +16,6 @@ import info.nightscout.androidaps.events.EventConfigBuilderChange
import info.nightscout.androidaps.events.EventPreferenceChange import info.nightscout.androidaps.events.EventPreferenceChange
import info.nightscout.androidaps.interfaces.Config import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.interfaces.DataSyncSelector import info.nightscout.androidaps.interfaces.DataSyncSelector
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
import info.nightscout.androidaps.interfaces.PluginType import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
@ -71,7 +70,6 @@ class NSClientService : DaggerService() {
@Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var nsSettingsStatus: NSSettingsStatus @Inject lateinit var nsSettingsStatus: NSSettingsStatus
@Inject lateinit var nsDeviceStatus: NSDeviceStatus @Inject lateinit var nsDeviceStatus: NSDeviceStatus
@Inject lateinit var databaseHelper: DatabaseHelperInterface
@Inject lateinit var rxBus: RxBusWrapper @Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var sp: SP @Inject lateinit var sp: SP
@ -199,7 +197,7 @@ class NSClientService : DaggerService() {
.build()) .build())
} }
fun processAuthAck(ack: NSAuthAck) { private fun processAuthAck(ack: NSAuthAck) {
var connectionStatus = "Authenticated (" var connectionStatus = "Authenticated ("
if (ack.read) connectionStatus += "R" if (ack.read) connectionStatus += "R"
if (ack.write) connectionStatus += "W" if (ack.write) connectionStatus += "W"

View file

@ -29,7 +29,9 @@ class OHUploadWorker(context: Context, workerParameters: WorkerParameters)
lateinit var resourceHelper: ResourceHelper lateinit var resourceHelper: ResourceHelper
@kotlin.ExperimentalStdlibApi @kotlin.ExperimentalStdlibApi
override fun createWork(): Single<Result> = Single.defer { override fun createWork(): Single<Result> =Single.just(Result.success())
/*
= Single.defer {
// Here we inject every time we create work // Here we inject every time we create work
// We could build our own WorkerFactory with dagger but this will create conflicts with other Workers // We could build our own WorkerFactory with dagger but this will create conflicts with other Workers
@ -50,7 +52,7 @@ class OHUploadWorker(context: Context, workerParameters: WorkerParameters)
Single.just(Result.retry()) Single.just(Result.retry())
} }
} }
*/
private fun createForegroundInfo(): ForegroundInfo { private fun createForegroundInfo(): ForegroundInfo {
val title = resourceHelper.gs(info.nightscout.androidaps.R.string.open_humans) val title = resourceHelper.gs(info.nightscout.androidaps.R.string.open_humans)

View file

@ -11,7 +11,6 @@ import androidx.work.WorkManager
import dagger.android.support.DaggerFragment import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.Event import info.nightscout.androidaps.events.Event
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
@ -38,24 +37,23 @@ class OpenHumansFragment : DaggerFragment() {
@Inject lateinit var openHumansUploader: OpenHumansUploader @Inject lateinit var openHumansUploader: OpenHumansUploader
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var databaseHelper: DatabaseHelperInterface
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
compositeDisposable += Single.fromCallable { databaseHelper.getOHQueueSize() } // compositeDisposable += Single.fromCallable { databaseHelper.getOHQueueSize() }
.subscribeOn(aapsSchedulers.io) // .subscribeOn(aapsSchedulers.io)
.repeatWhen { // .repeatWhen {
rxBus.toObservable(UpdateViewEvent::class.java) // rxBus.toObservable(UpdateViewEvent::class.java)
.cast(Any::class.java) // .cast(Any::class.java)
.mergeWith(rxBus.toObservable(UpdateQueueEvent::class.java) // .mergeWith(rxBus.toObservable(UpdateQueueEvent::class.java)
.throttleLatest(5, TimeUnit.SECONDS)) // .throttleLatest(5, TimeUnit.SECONDS))
.toFlowable(BackpressureStrategy.LATEST) // .toFlowable(BackpressureStrategy.LATEST)
} // }
.observeOn(aapsSchedulers.main) // .observeOn(aapsSchedulers.main)
.subscribe({ // .subscribe({
queueSizeValue = it // queueSizeValue = it
updateGUI() // updateGUI()
}, {}) // }, {})
context?.applicationContext?.let { appContext -> context?.applicationContext?.let { appContext ->
WorkManager.getInstance(appContext).getWorkInfosForUniqueWorkLiveData(OpenHumansUploader.WORK_NAME).observe(this, { WorkManager.getInstance(appContext).getWorkInfosForUniqueWorkLiveData(OpenHumansUploader.WORK_NAME).observe(this, {
val workInfo = it.lastOrNull() val workInfo = it.lastOrNull()

View file

@ -21,14 +21,13 @@ import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.database.entities.TherapyEvent import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.db.* import info.nightscout.androidaps.db.*
import info.nightscout.androidaps.events.EventPreferenceChange import info.nightscout.androidaps.events.EventPreferenceChange
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface import info.nightscout.androidaps.extensions.toConstant
import info.nightscout.androidaps.interfaces.PluginBase import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.extensions.toConstant
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
@ -60,7 +59,6 @@ class OpenHumansUploader @Inject constructor(
private val sp: SP, private val sp: SP,
private val rxBus: RxBusWrapper, private val rxBus: RxBusWrapper,
private val context: Context, private val context: Context,
private val databaseHelper: DatabaseHelperInterface,
val repository: AppRepository val repository: AppRepository
) : PluginBase( ) : PluginBase(
PluginDescription() PluginDescription()
@ -306,11 +304,11 @@ class OpenHumansUploader @Inject constructor(
jsonObject.put("structureVersion", structureVersion) jsonObject.put("structureVersion", structureVersion)
jsonObject.put("queuedOn", System.currentTimeMillis()) jsonObject.put("queuedOn", System.currentTimeMillis())
generator(jsonObject) generator(jsonObject)
val queueItem = OHQueueItem( // val queueItem = OHQueueItem(
file = file, // file = file,
content = jsonObject.toString() // content = jsonObject.toString()
) // )
databaseHelper.createOrUpdate(queueItem) // databaseHelper.createOrUpdate(queueItem)
rxBus.send(OpenHumansFragment.UpdateQueueEvent) rxBus.send(OpenHumansFragment.UpdateQueueEvent)
} catch (e: JSONException) { } catch (e: JSONException) {
e.printStackTrace() e.printStackTrace()
@ -340,7 +338,7 @@ class OpenHumansUploader @Inject constructor(
isSetup = false isSetup = false
oAuthTokens = null oAuthTokens = null
projectMemberId = null projectMemberId = null
databaseHelper.clearOpenHumansQueue() // databaseHelper.clearOpenHumansQueue()
rxBus.send(OpenHumansFragment.UpdateViewEvent) rxBus.send(OpenHumansFragment.UpdateViewEvent)
} }
@ -353,18 +351,18 @@ class OpenHumansUploader @Inject constructor(
//Updating the notification for every item drastically slows down the operation //Updating the notification for every item drastically slows down the operation
if (currentProgress % 1000L == 0L) showOngoingNotification(maxProgress, currentProgress) if (currentProgress % 1000L == 0L) showOngoingNotification(maxProgress, currentProgress)
} }
copyDisposable = Completable.fromCallable { databaseHelper.clearOpenHumansQueue() } // copyDisposable = Completable.fromCallable { databaseHelper.clearOpenHumansQueue() }
// .andThen(Single.defer { Single.just(databaseHelper.getCountOfAllRows() + treatmentsPlugin.service.count()) }) // .andThen(Single.defer { Single.just(databaseHelper.getCountOfAllRows() + treatmentsPlugin.service.count()) })
// .doOnSuccess { maxProgress = it } // .doOnSuccess { maxProgress = it }
// .flatMapObservable { Observable.defer { Observable.fromIterable(treatmentsPlugin.service.getTreatmentData()) } } // .flatMapObservable { Observable.defer { Observable.fromIterable(treatmentsPlugin.service.getTreatmentData()) } }
// .map { enqueueTreatment(it); increaseCounter() } // .map { enqueueTreatment(it); increaseCounter() }
// .ignoreElements() // .ignoreElements()
.andThen(Observable.defer { Observable.fromIterable(repository.compatGetBgReadingsDataFromTime(0, true).blockingGet()) }) // .andThen(Observable.defer { Observable.fromIterable(repository.compatGetBgReadingsDataFromTime(0, true).blockingGet()) })
.map { enqueueBGReading(it); increaseCounter() } // .map { enqueueBGReading(it); increaseCounter() }
.ignoreElements() // .ignoreElements()
.andThen(Observable.defer { Observable.fromIterable(repository.compatGetTherapyEventDataFromTime(0, true).blockingGet()) }) // .andThen(Observable.defer { Observable.fromIterable(repository.compatGetTherapyEventDataFromTime(0, true).blockingGet()) })
.map { enqueueTherapyEvent(it); increaseCounter() } // .map { enqueueTherapyEvent(it); increaseCounter() }
.ignoreElements() // .ignoreElements()
// .andThen(Observable.defer { Observable.fromIterable(databaseHelper.getAllExtendedBoluses()) }) // .andThen(Observable.defer { Observable.fromIterable(databaseHelper.getAllExtendedBoluses()) })
// .map { enqueueExtendedBolus(it); increaseCounter() } // .map { enqueueExtendedBolus(it); increaseCounter() }
// .ignoreElements() // .ignoreElements()
@ -377,30 +375,30 @@ class OpenHumansUploader @Inject constructor(
// .andThen(Observable.defer { Observable.fromIterable(databaseHelper.getAllTemporaryBasals()) }) // .andThen(Observable.defer { Observable.fromIterable(databaseHelper.getAllTemporaryBasals()) })
// .map { enqueueTemporaryBasal(it); increaseCounter() } // .map { enqueueTemporaryBasal(it); increaseCounter() }
// .ignoreElements() // .ignoreElements()
.andThen(Observable.defer { Observable.fromIterable(repository.compatGetTemporaryTargetData().blockingGet()) }) // .andThen(Observable.defer { Observable.fromIterable(repository.compatGetTemporaryTargetData().blockingGet()) })
.map { enqueueTempTarget(it); increaseCounter() } // .map { enqueueTempTarget(it); increaseCounter() }
.ignoreElements() // .ignoreElements()
.doOnSubscribe { // .doOnSubscribe {
wakeLock.acquire(TimeUnit.MINUTES.toMillis(30)) // wakeLock.acquire(TimeUnit.MINUTES.toMillis(30))
showOngoingNotification() // showOngoingNotification()
} // }
.doOnComplete { // .doOnComplete {
isSetup = true // isSetup = true
scheduleWorker(false) // scheduleWorker(false)
showSetupFinishedNotification() // showSetupFinishedNotification()
} // }
.doOnError { // .doOnError {
logout() // logout()
showSetupFailedNotification() // showSetupFailedNotification()
} // }
.doFinally { // .doFinally {
copyDisposable = null // copyDisposable = null
NotificationManagerCompat.from(context).cancel(COPY_NOTIFICATION_ID) // NotificationManagerCompat.from(context).cancel(COPY_NOTIFICATION_ID)
wakeLock.release() // wakeLock.release()
} // }
.onErrorComplete() // .onErrorComplete()
.subscribeOn(aapsSchedulers.io) // .subscribeOn(aapsSchedulers.io)
.subscribe() // .subscribe()
} }
private fun showOngoingNotification(maxProgress: Long? = null, currentProgress: Long? = null) { private fun showOngoingNotification(maxProgress: Long? = null, currentProgress: Long? = null) {
@ -438,7 +436,7 @@ class OpenHumansUploader @Inject constructor(
val notificationManager = NotificationManagerCompat.from(context) val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(FAILURE_NOTIFICATION_ID, notification) notificationManager.notify(FAILURE_NOTIFICATION_ID, notification)
} }
/*
@kotlin.ExperimentalStdlibApi @kotlin.ExperimentalStdlibApi
fun uploadDataSegmentally(): Completable = fun uploadDataSegmentally(): Completable =
uploadData(UPLOAD_SEGMENT_SIZE) uploadData(UPLOAD_SEGMENT_SIZE)
@ -478,7 +476,7 @@ class OpenHumansUploader @Inject constructor(
.doOnSubscribe { .doOnSubscribe {
aapsLogger.info(LTag.OHUPLOADER, "Starting upload") aapsLogger.info(LTag.OHUPLOADER, "Starting upload")
} }
*/
private fun uploadFile(accessToken: String, uploadData: UploadData) = Completable.defer { private fun uploadFile(accessToken: String, uploadData: UploadData) = Completable.defer {
openHumansAPI.prepareFileUpload(accessToken, uploadData.fileName, uploadData.metadata) openHumansAPI.prepareFileUpload(accessToken, uploadData.fileName, uploadData.metadata)
.flatMap { openHumansAPI.uploadFile(it.uploadURL, uploadData.content).andThen(Single.just(it.fileId)) } .flatMap { openHumansAPI.uploadFile(it.uploadURL, uploadData.content).andThen(Single.just(it.fileId)) }
@ -495,7 +493,7 @@ class OpenHumansUploader @Inject constructor(
Single.just(oAuthTokens.accessToken) Single.just(oAuthTokens.accessToken)
} }
} }
/*
@kotlin.ExperimentalStdlibApi @kotlin.ExperimentalStdlibApi
private fun gatherData(maxEntries: Long) = Single.defer { private fun gatherData(maxEntries: Long) = Single.defer {
val items = databaseHelper.getAllOHQueueItems(maxEntries) val items = databaseHelper.getAllOHQueueItems(maxEntries)
@ -571,7 +569,7 @@ class OpenHumansUploader @Inject constructor(
highestQueueId = items.map { it.id }.maxOrNull() highestQueueId = items.map { it.id }.maxOrNull()
)) ))
} }
*/
private fun ZipOutputStream.writeFile(name: String, bytes: ByteArray) { private fun ZipOutputStream.writeFile(name: String, bytes: ByteArray) {
putNextEntry(ZipEntry(name)) putNextEntry(ZipEntry(name))
write(bytes) write(bytes)
@ -579,7 +577,7 @@ class OpenHumansUploader @Inject constructor(
} }
private fun removeUploadedEntriesFromQueue(highestId: Long) = Completable.fromCallable { private fun removeUploadedEntriesFromQueue(highestId: Long) = Completable.fromCallable {
databaseHelper.removeAllOHQueueItemsWithIdSmallerThan(highestId) // databaseHelper.removeAllOHQueueItemsWithIdSmallerThan(highestId)
} }
private fun handleSignOut() { private fun handleSignOut() {
@ -649,4 +647,5 @@ class OpenHumansUploader @Inject constructor(
private fun onSharedPreferenceChanged(event: EventPreferenceChange) { private fun onSharedPreferenceChanged(event: EventPreferenceChange) {
if (event.changedKey == "key_oh_charging_only" && isSetup) scheduleWorker(true) if (event.changedKey == "key_oh_charging_only" && isSetup) scheduleWorker(true)
} }
} }

View file

@ -3,10 +3,8 @@ package info.nightscout.androidaps.plugins.general.overview.graphExtensions
import android.graphics.Color import android.graphics.Color
import info.nightscout.androidaps.Constants import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.core.R import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.database.entities.TherapyEvent import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.interfaces.GlucoseUnit import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.interfaces.Interval
import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.utils.Translator import info.nightscout.androidaps.utils.Translator
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
@ -17,7 +15,7 @@ class TherapyEventDataPoint @Inject constructor(
private val resourceHelper: ResourceHelper, private val resourceHelper: ResourceHelper,
private val profileFunction: ProfileFunction, private val profileFunction: ProfileFunction,
private val translator: Translator private val translator: Translator
) : DataPointWithLabelInterface, Interval { ) : DataPointWithLabelInterface {
private var yValue = 0.0 private var yValue = 0.0
@ -52,7 +50,7 @@ class TherapyEventDataPoint @Inject constructor(
if (data.note != null) data.note if (data.note != null) data.note
else translator.translate(data.type) else translator.translate(data.type)
override fun getDuration(): Long = end() - start() override fun getDuration(): Long = data.duration
override fun getShape(): PointsWithLabelGraphSeries.Shape = override fun getShape(): PointsWithLabelGraphSeries.Shape =
when { when {
data.type == TherapyEvent.Type.NS_MBG -> PointsWithLabelGraphSeries.Shape.MBG data.type == TherapyEvent.Type.NS_MBG -> PointsWithLabelGraphSeries.Shape.MBG
@ -74,22 +72,4 @@ class TherapyEventDataPoint @Inject constructor(
TherapyEvent.Type.APS_OFFLINE -> Color.GRAY and -0x7f000001 TherapyEvent.Type.APS_OFFLINE -> Color.GRAY and -0x7f000001
else -> Color.GRAY else -> Color.GRAY
} }
// Interval interface
private var cutEnd: Long? = null
override fun durationInMsec(): Long = data.duration
override fun start(): Long = data.timestamp
override fun originalEnd(): Long = data.timestamp + durationInMsec()
override fun end(): Long = cutEnd ?: originalEnd()
override fun cutEndTo(end: Long) {
cutEnd = end
}
override fun match(time: Long): Boolean = start() <= time && end() >= time
override fun before(time: Long): Boolean = end() < time
override fun after(time: Long): Boolean = start() > time
override val isInProgress: Boolean get() = match(System.currentTimeMillis())
override val isEndingEvent: Boolean get() = durationInMsec() == 0L
override val isValid: Boolean get() = data.type == TherapyEvent.Type.APS_OFFLINE
} }

View file

@ -28,6 +28,8 @@ import info.nightscout.androidaps.utils.*
import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.ui.SpinnerHelper
import info.nightscout.androidaps.utils.ui.TimeListEdit
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.plusAssign
import java.text.DecimalFormat import java.text.DecimalFormat

View file

@ -1,540 +0,0 @@
package info.nightscout.androidaps.plugins.treatments;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.android.apptools.OrmLiteBaseService;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.stmt.PreparedQuery;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import javax.inject.Inject;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.interfaces.TreatmentServiceInterface;
import info.nightscout.androidaps.interfaces.UpdateReturn;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.general.openhumans.OpenHumansUploader;
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.rx.AapsSchedulers;
/**
* Created by mike on 24.09.2017.
*/
public class TreatmentService extends OrmLiteBaseService<DatabaseHelper> implements TreatmentServiceInterface {
@Inject AAPSLogger aapsLogger;
@Inject FabricPrivacy fabricPrivacy;
@Inject RxBusWrapper rxBus;
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
@Inject DatabaseHelperInterface databaseHelper;
@Inject OpenHumansUploader openHumansUploader;
@Inject AapsSchedulers aapsSchedulers;
public TreatmentService(HasAndroidInjector injector) {
injector.androidInjector().inject(this);
onCreate();
dbInitialize();
}
/**
* This method is a simple re-implementation of the database create and up/downgrade functionality
* in SQLiteOpenHelper#getDatabaseLocked method.
* <p>
* It is implemented to be able to late initialize separate plugins of the application.
*/
protected void dbInitialize() {
DatabaseHelper helper = OpenHelperManager.getHelper(this, DatabaseHelper.class);
int newVersion = helper.getNewVersion();
int oldVersion = helper.getOldVersion();
if (oldVersion > newVersion) {
onDowngrade(this.getConnectionSource(), oldVersion, newVersion);
} else {
onUpgrade(this.getConnectionSource(), oldVersion, newVersion);
}
}
public TreatmentDaoWrapper getDao() {
try {
return new TreatmentDaoWrapper(DaoManager.createDao(this.getConnectionSource(), Treatment.class));
} catch (SQLException e) {
aapsLogger.error("Cannot create Dao for Treatment.class");
}
return null;
}
class TreatmentDaoWrapper {
private final Dao<Treatment, Long> wrapped;
TreatmentDaoWrapper(Dao<Treatment, Long> wrapped) {
this.wrapped = wrapped;
}
public void executeRaw(String statement, String... arguments) throws SQLException {
wrapped.executeRaw(statement, arguments);
}
public List<Treatment> queryForAll() throws SQLException {
return wrapped.queryForAll();
}
public Treatment queryForId(long id) throws SQLException {
return wrapped.queryForId(id);
}
public QueryBuilder<Treatment, Long> queryBuilder() {
return wrapped.queryBuilder();
}
public List<Treatment> query(PreparedQuery<Treatment> data) throws SQLException {
return wrapped.query(data);
}
public long countOf() throws SQLException {
return wrapped.countOf();
}
}
@Override
public void onCreate() {
super.onCreate();
try {
aapsLogger.info(LTag.DATATREATMENTS, "onCreate");
TableUtils.createTableIfNotExists(this.getConnectionSource(), Treatment.class);
} catch (SQLException e) {
aapsLogger.error("Can't create database", e);
throw new RuntimeException(e);
}
}
public void onUpgrade(ConnectionSource connectionSource, int oldVersion, int newVersion) {
if (oldVersion == 7 && newVersion == 8) {
aapsLogger.debug("Upgrading database from v7 to v8");
try {
TableUtils.dropTable(connectionSource, Treatment.class, true);
TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
} catch (SQLException e) {
aapsLogger.error("Can't create database", e);
throw new RuntimeException(e);
}
} else if (oldVersion == 8 && newVersion == 9) {
aapsLogger.debug("Upgrading database from v8 to v9");
try {
getDao().executeRaw("ALTER TABLE `" + Treatment.TABLE_TREATMENTS + "` ADD COLUMN boluscalc STRING;");
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
} else {
aapsLogger.info(LTag.DATATREATMENTS, "onUpgrade");
// this.resetFood();
}
}
public void onDowngrade(ConnectionSource connectionSource, int oldVersion, int newVersion) {
if (oldVersion == 9 && newVersion == 8) {
try {
getDao().executeRaw("ALTER TABLE `" + Treatment.TABLE_TREATMENTS + "` DROP COLUMN boluscalc STRING;");
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
}
}
public long count() {
try {
return this.getDao().countOf();
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return 0L;
}
/*
{
"_id": "551ee3ad368e06e80856e6a9",
"type": "food",
"category": "Zakladni",
"subcategory": "Napoje",
"name": "Mleko",
"portion": 250,
"carbs": 12,
"gi": 1,
"created_at": "2015-04-14T06:59:16.500Z",
"unit": "ml"
}
*/
// return true if new record is created
public UpdateReturn createOrUpdate(Treatment treatment) {
/*
if (treatment != null && treatment.source == Source.NONE) {
aapsLogger.error("Coder error: source is not set for treatment: " + treatment, new Exception());
//FabricPrivacy.logException(new Exception("Coder error: source is not set for treatment: " + treatment));
}
try {
Treatment old;
treatment.date = databaseHelper.roundDateToSec(treatment.date);
if (treatment.source == Source.PUMP) {
// check for changed from pump change in NS
Treatment existingTreatment = getPumpRecordById(treatment.pumpId);
if (existingTreatment != null) {
boolean equalRePumpHistory = existingTreatment.equalsRePumpHistory(treatment);
boolean sameSource = existingTreatment.source == treatment.source;
if (!equalRePumpHistory) {
// another treatment exists. Update it with the treatment coming from the pump
aapsLogger.debug(LTag.DATATREATMENTS, "Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
long oldDate = existingTreatment.date;
//preserve carbs
if (existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0) {
treatment.carbs = existingTreatment.carbs;
// preserve insulin
} else if (existingTreatment.isValid && existingTreatment.insulin > 0 && treatment.insulin == 0) {
treatment.insulin = existingTreatment.insulin;
}
getDao().delete(existingTreatment); // need to delete/create because date may change too
existingTreatment.copyBasics(treatment);
getDao().create(existingTreatment);
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(existingTreatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(sameSource, false); //updating a pump treatment with another one from the pump is not counted as clash
}
return new UpdateReturn(equalRePumpHistory, false);
}
existingTreatment = getDao().queryForId(treatment.date);
if (existingTreatment != null) {
// another treatment exists with different pumpID. Update it with the treatment coming from the pump
boolean equalRePumpHistory = existingTreatment.equalsRePumpHistory(treatment);
boolean sameSource = existingTreatment.source == treatment.source;
long oldDate = existingTreatment.date;
aapsLogger.debug(LTag.DATATREATMENTS, "Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
//preserve carbs
if (existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0) {
treatment.carbs = existingTreatment.carbs;
}
getDao().delete(existingTreatment); // need to delete/create because date may change too
existingTreatment.copyFrom(treatment);
getDao().create(existingTreatment);
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(existingTreatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(equalRePumpHistory || sameSource, false);
}
getDao().create(treatment);
aapsLogger.debug(LTag.DATATREATMENTS, "New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(true, true);
}
if (treatment.source == Source.NIGHTSCOUT) {
old = getDao().queryForId(treatment.date);
if (old != null) {
if (!old.isEqual(treatment)) {
boolean historyChange = old.isDataChanging(treatment);
long oldDate = old.date;
getDao().delete(old); // need to delete/create because date may change too
old.copyFrom(treatment);
getDao().create(old);
aapsLogger.debug(LTag.DATATREATMENTS, "Updating record by date from: " + Source.getString(treatment.source) + " " + old.toString());
if (historyChange) {
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(old.date);
}
scheduleTreatmentChange(treatment, false);
return new UpdateReturn(true, true);
}
aapsLogger.debug(LTag.DATATREATMENTS, "Equal record by date from: " + Source.getString(treatment.source) + " " + old.toString());
return new UpdateReturn(true, false);
}
// find by NS _id
if (treatment._id != null) {
old = findByNSId(treatment._id);
if (old != null) {
if (!old.isEqual(treatment)) {
boolean historyChange = old.isDataChanging(treatment);
long oldDate = old.date;
getDao().delete(old); // need to delete/create because date may change too
old.copyFrom(treatment);
getDao().create(old);
aapsLogger.debug(LTag.DATATREATMENTS, "Updating record by _id from: " + Source.getString(treatment.source) + " " + old.toString());
if (historyChange) {
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(old.date);
}
scheduleTreatmentChange(treatment, false);
return new UpdateReturn(true, true);
}
aapsLogger.debug(LTag.DATATREATMENTS, "Equal record by _id from: " + Source.getString(treatment.source) + " " + old.toString());
return new UpdateReturn(true, false);
}
}
getDao().create(treatment);
aapsLogger.debug(LTag.DATATREATMENTS, "New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment, false);
return new UpdateReturn(true, true);
}
if (treatment.source == Source.USER) {
getDao().create(treatment);
aapsLogger.debug(LTag.DATATREATMENTS, "New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(true, true);
}
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
*/
return new UpdateReturn(false, false);
}
@NotNull public UpdateReturn createOrUpdateMedtronic(@NotNull Treatment treatment, boolean fromNightScout) {
/*
if (MedtronicHistoryData.doubleBolusDebug)
aapsLogger.debug(LTag.DATATREATMENTS, "DoubleBolusDebug: createOrUpdateMedtronic:: originalTreatment={}, fromNightScout={}", treatment, fromNightScout);
try {
treatment.date = databaseHelper.roundDateToSec(treatment.date);
Treatment existingTreatment = getRecord(treatment.pumpId, treatment.date);
if (MedtronicHistoryData.doubleBolusDebug)
aapsLogger.debug(LTag.DATATREATMENTS, "DoubleBolusDebug: createOrUpdateMedtronic:: existingTreatment={}", treatment);
if (existingTreatment == null) {
getDao().create(treatment);
aapsLogger.debug(LTag.DATATREATMENTS, "New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(true, true);
} else {
if (existingTreatment.date == treatment.date) {
if (MedtronicHistoryData.doubleBolusDebug)
aapsLogger.debug(LTag.DATATREATMENTS, "DoubleBolusDebug: createOrUpdateMedtronic::(existingTreatment.date==treatment.date)");
// we will do update only, if entry changed
if (!optionalTreatmentCopy(existingTreatment, treatment, fromNightScout)) {
return new UpdateReturn(true, false);
}
getDao().update(existingTreatment);
DatabaseHelper.updateEarliestDataChange(existingTreatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(true, false);
} else {
if (MedtronicHistoryData.doubleBolusDebug)
aapsLogger.debug(LTag.DATATREATMENTS, "DoubleBolusDebug: createOrUpdateMedtronic::(existingTreatment.date != treatment.date)");
// date is different, we need to remove entry
getDao().delete(existingTreatment);
optionalTreatmentCopy(existingTreatment, treatment, fromNightScout);
getDao().create(existingTreatment);
DatabaseHelper.updateEarliestDataChange(existingTreatment.date);
scheduleTreatmentChange(treatment, true);
return new UpdateReturn(true, false); //updating a pump treatment with another one from the pump is not counted as clash
}
}
} catch (SQLException e) {
aapsLogger.error("Unhandled SQL exception: {}", e.getMessage(), e);
}
*/
return new UpdateReturn(false, false);
}
private boolean optionalTreatmentCopy(Treatment oldTreatment, Treatment newTreatment, boolean fromNightScout) {
aapsLogger.debug(LTag.DATATREATMENTS, "optionalTreatmentCopy [old={}, new={}]", oldTreatment.toString(), newTreatment.toString());
boolean changed = false;
if (oldTreatment.date != newTreatment.date) {
oldTreatment.date = newTreatment.date;
changed = true;
}
if (oldTreatment.isSMB != newTreatment.isSMB) {
if (!oldTreatment.isSMB) {
oldTreatment.isSMB = newTreatment.isSMB;
changed = true;
}
}
if (!isSame(oldTreatment.carbs, newTreatment.carbs)) {
if (isSame(oldTreatment.carbs, 0.0d)) {
oldTreatment.carbs = newTreatment.carbs;
changed = true;
}
}
if (oldTreatment.mealBolus != (oldTreatment.carbs > 0)) {
oldTreatment.mealBolus = (oldTreatment.carbs > 0);
changed = true;
}
if (!isSame(oldTreatment.insulin, newTreatment.insulin)) {
if (!fromNightScout) {
oldTreatment.insulin = newTreatment.insulin;
changed = true;
}
}
if (!StringUtils.equals(oldTreatment._id, newTreatment._id)) {
if (StringUtils.isBlank(oldTreatment._id)) {
oldTreatment._id = newTreatment._id;
changed = true;
}
}
int source = Source.NONE;
if (oldTreatment.pumpId == 0) {
if (newTreatment.pumpId > 0) {
oldTreatment.pumpId = newTreatment.pumpId;
source = Source.PUMP;
changed = true;
}
}
if (source == Source.NONE) {
if (oldTreatment.source == newTreatment.source) {
source = oldTreatment.source;
} else {
source = (oldTreatment.source == Source.NIGHTSCOUT || newTreatment.source == Source.NIGHTSCOUT) ? Source.NIGHTSCOUT : Source.USER;
}
}
if (oldTreatment.source != source) {
oldTreatment.source = source;
changed = true;
}
aapsLogger.debug(LTag.DATATREATMENTS, "optionalTreatmentCopy [changed={}, newAfterChange={}]", changed, oldTreatment.toString());
return changed;
}
public static boolean isSame(Double d1, Double d2) {
double diff = d1 - d2;
return (Math.abs(diff) <= 0.00001);
}
public Treatment getRecord(long pumpId, long date) {
Treatment record = null;
if (pumpId > 0) {
record = getPumpRecordById(pumpId);
if (record != null) {
return record;
}
}
try {
record = getDao().queryForId(date);
} catch (SQLException ex) {
aapsLogger.error("Error getting entry by id ({}", date);
}
return record;
}
/**
* Returns the record for the given id, null if none, throws RuntimeException
* if multiple records with the same pump id exist.
*/
@Nullable
public Treatment getPumpRecordById(long pumpId) {
try {
QueryBuilder<Treatment, Long> queryBuilder = getDao().queryBuilder();
Where where = queryBuilder.where();
where.eq("pumpId", pumpId);
queryBuilder.orderBy("date", true);
List<Treatment> result = getDao().query(queryBuilder.prepare());
if (result.isEmpty())
return null;
if (result.size() > 1)
aapsLogger.warn(LTag.DATATREATMENTS, "Multiple records with the same pump id found (returning first one): " + result.toString());
return result.get(0);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* finds treatment by its NS Id.
*
* @param _id
* @return
*/
@Nullable
public Treatment findByNSId(String _id) {
try {
TreatmentDaoWrapper daoTreatments = getDao();
QueryBuilder<Treatment, Long> queryBuilder = daoTreatments.queryBuilder();
Where where = queryBuilder.where();
where.eq("_id", _id);
queryBuilder.limit(10L);
PreparedQuery<Treatment> preparedQuery = queryBuilder.prepare();
List<Treatment> trList = daoTreatments.query(preparedQuery);
if (trList.size() != 1) {
//log.debug("Treatment findTreatmentById query size: " + trList.size());
return null;
} else {
//log.debug("Treatment findTreatmentById found: " + trList.get(0).log());
return trList.get(0);
}
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
return null;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}

View file

@ -1,306 +0,0 @@
package info.nightscout.androidaps.plugins.treatments;
import android.content.Context;
import java.util.List;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.database.AppRepository;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.interfaces.TreatmentServiceInterface;
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.resources.ResourceHelper;
import info.nightscout.androidaps.utils.rx.AapsSchedulers;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
import io.reactivex.disposables.CompositeDisposable;
@Singleton
public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface {
private final SP sp;
private final RxBusWrapper rxBus;
private final ProfileFunction profileFunction;
private final ActivePlugin activePlugin;
private final FabricPrivacy fabricPrivacy;
private final DateUtil dateUtil;
private final DatabaseHelperInterface databaseHelper;
private final AppRepository repository;
private final CompositeDisposable disposable = new CompositeDisposable();
protected TreatmentServiceInterface service;
@Inject
public TreatmentsPlugin(
HasAndroidInjector injector,
AAPSLogger aapsLogger,
RxBusWrapper rxBus,
AapsSchedulers aapsSchedulers,
ResourceHelper resourceHelper,
Context context,
SP sp,
ProfileFunction profileFunction,
ActivePlugin activePlugin,
FabricPrivacy fabricPrivacy,
DateUtil dateUtil,
DatabaseHelperInterface databaseHelper,
AppRepository repository
) {
super(new PluginDescription()
.mainType(PluginType.TREATMENT)
.pluginIcon(R.drawable.ic_treatments)
.pluginName(R.string.treatments)
.shortName(R.string.treatments_shortname)
.alwaysEnabled(true)
.description(R.string.description_treatments)
.setDefault(),
aapsLogger, resourceHelper, injector
);
this.rxBus = rxBus;
this.sp = sp;
this.profileFunction = profileFunction;
this.activePlugin = activePlugin;
this.fabricPrivacy = fabricPrivacy;
this.dateUtil = dateUtil;
this.databaseHelper = databaseHelper;
this.repository = repository;
}
@Override
protected void onStart() {
this.service = new TreatmentService(getInjector());
super.onStart();
// disposable.add(rxBus
// .toObservable(EventReloadProfileSwitchData.class)
// .observeOn(aapsSchedulers.getIo())
// .subscribe(event -> initializeProfileSwitchData(range()),
// fabricPrivacy::logException
// ));
}
@Override
protected void onStop() {
disposable.clear();
super.onStop();
}
@Override
public TreatmentServiceInterface getService() {
return this.service;
}
protected long range() {
double dia = Constants.defaultDIA;
if (profileFunction.getProfile() != null)
dia = profileFunction.getProfile().getDia();
return (long) (60 * 60 * 1000L * (24 + dia));
}
/**
* Returns all Treatments after specified timestamp. Also returns invalid entries (required to
* map "Fill Cannula" entries to history (and not to add double bolus for it)
*
* @param fromTimestamp
* @return
*/
@Deprecated
@Override
public List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long fromTimestamp) {
return repository.getBolusesIncludingInvalidFromTimeToTime(fromTimestamp, dateUtil.now(), true)
.blockingGet()
.stream()
.map(bolus -> new Treatment(getInjector(), bolus))
.collect(Collectors.toList());
/*
List<Treatment> in5minback = new ArrayList<>();
long time = System.currentTimeMillis();
synchronized (treatments) {
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: AllTreatmentsInDb: " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(treatments));
for (Treatment t : treatments) {
if (t.date >= fromTimestamp && t.date <= time)
in5minback.add(t);
}
// getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: FilteredTreatments: AfterTime={}, Items={} " + fromTimestamp + " " + new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(in5minback));
return in5minback;
}
*/
}
/*
@Override
public long getLastBolusTime() {
Treatment last = getService().getLastBolus(false);
if (last == null) {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: NOTHING FOUND");
return 0;
} else {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last.date));
return last.date;
}
}
public long getLastBolusTime(boolean excludeSMB) {
Treatment last = getService().getLastBolus(excludeSMB);
if (last == null) {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: NOTHING FOUND");
return 0;
} else {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last.date));
return last.date;
}
}
public long getLastCarbTime() {
Treatment last = getService().getLastCarb();
if (last == null) {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last Carb time: NOTHING FOUND");
return 0;
} else {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last Carb time: " + dateUtil.dateAndTimeString(last.date));
return last.date;
}
}
*/
@Deprecated
@Override
public boolean addToHistoryExtendedBolus(ExtendedBolus extendedBolus) {
throw new IllegalStateException("Migrate to new DB");
//log.debug("Adding new ExtentedBolus record" + extendedBolus.log());
/*
boolean newRecordCreated = databaseHelper.createOrUpdate(extendedBolus);
if (newRecordCreated) {
if (extendedBolus.durationInMinutes == 0) {
if (activePlugin.getActivePump().isFakingTempsByExtendedBoluses())
nsUpload.uploadTempBasalEnd(extendedBolus.date, true, extendedBolus.pumpId);
else
nsUpload.uploadExtendedBolusEnd(extendedBolus.date, extendedBolus.pumpId);
} else if (activePlugin.getActivePump().isFakingTempsByExtendedBoluses())
nsUpload.uploadTempBasalStartAbsolute(new TemporaryBasal(extendedBolus), extendedBolus.insulin);
else
nsUpload.uploadExtendedBolus(extendedBolus);
}
return newRecordCreated;
*/
}
@Deprecated
@Override
public boolean addToHistoryTempBasal(TemporaryBasal tempBasal) {
throw new IllegalStateException("Migrate to new DB");
/*
//log.debug("Adding new TemporaryBasal record" + tempBasal.toString());
boolean newRecordCreated = databaseHelper.createOrUpdate(tempBasal);
if (newRecordCreated) {
if (tempBasal.durationInMinutes == 0)
nsUpload.uploadTempBasalEnd(tempBasal.date, false, tempBasal.pumpId);
else if (tempBasal.isAbsolute)
nsUpload.uploadTempBasalStartAbsolute(tempBasal, null);
else
nsUpload.uploadTempBasalStartPercent(tempBasal, profileFunction.getProfile(tempBasal.date));
}
return newRecordCreated;
*/
}
@Deprecated
public TreatmentUpdateReturn createOrUpdateMedtronic(Treatment treatment, boolean fromNightScout) {
throw new IllegalStateException("Migrate to new DB");
/*
UpdateReturn resultRecord = getService().createOrUpdateMedtronic(treatment, fromNightScout);
return new TreatmentUpdateReturn(resultRecord.getSuccess(), resultRecord.getNewRecord());
*/
}
// return true if new record is created
@Deprecated
@Override
public boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo, boolean allowUpdate) {
throw new IllegalStateException("Migrate to new DB");
/*
boolean medtronicPump = activePlugin.getActivePump() instanceof MedtronicPumpPlugin;
getAapsLogger().debug(MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: addToHistoryTreatment::isMedtronicPump={} " + medtronicPump);
Treatment treatment = new Treatment();
treatment.date = detailedBolusInfo.timestamp;
treatment.source = (detailedBolusInfo.getPumpType() == PumpType.USER) ? Source.USER : Source.PUMP;
treatment.pumpId = detailedBolusInfo.getBolusPumpId() != null ? detailedBolusInfo.getBolusPumpId() : 0;
treatment.insulin = detailedBolusInfo.insulin;
treatment.isValid = detailedBolusInfo.getBolusType() != DetailedBolusInfo.BolusType.PRIMING;
treatment.isSMB = detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB;
if (detailedBolusInfo.carbTime == 0)
treatment.carbs = detailedBolusInfo.carbs;
treatment.mealBolus = treatment.carbs > 0;
// treatment.boluscalc = detailedBolusInfo.boluscalc != null ? detailedBolusInfo.boluscalc.toString() : null;
treatment.boluscalc = null;
UpdateReturn creatOrUpdateResult;
getAapsLogger().debug(medtronicPump && MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: addToHistoryTreatment::treatment={} " + treatment);
if (!medtronicPump)
creatOrUpdateResult = getService().createOrUpdate(treatment);
else
creatOrUpdateResult = getService().createOrUpdateMedtronic(treatment, false);
boolean newRecordCreated = creatOrUpdateResult.getNewRecord();
//log.debug("Adding new Treatment record" + treatment.toString());
if (detailedBolusInfo.carbTime != 0) {
Treatment carbsTreatment = new Treatment();
carbsTreatment.source = (detailedBolusInfo.getPumpType() == PumpType.USER) ? Source.USER : Source.PUMP;
carbsTreatment.pumpId = detailedBolusInfo.getCarbsPumpId() != null ? detailedBolusInfo.getCarbsPumpId() : 0; // but this should never happen
carbsTreatment.date = detailedBolusInfo.timestamp + detailedBolusInfo.carbTime * 60 * 1000L + 1000L; // add 1 sec to make them different records
carbsTreatment.carbs = detailedBolusInfo.carbs;
getAapsLogger().debug(medtronicPump && MedtronicHistoryData.doubleBolusDebug, LTag.DATATREATMENTS, "DoubleBolusDebug: carbTime!=0, creating second treatment. CarbsTreatment={}" + carbsTreatment);
if (!medtronicPump)
getService().createOrUpdate(carbsTreatment);
else
getService().createOrUpdateMedtronic(carbsTreatment, false);
//log.debug("Adding new Treatment record" + carbsTreatment);
}
if (newRecordCreated && detailedBolusInfo.getBolusType() != DetailedBolusInfo.BolusType.PRIMING)
nsUpload.uploadTreatmentRecord(detailedBolusInfo);
if (!allowUpdate && !creatOrUpdateResult.getSuccess()) {
getAapsLogger().error("Treatment could not be added to DB", new Exception());
String status = String.format(resourceHelper.gs(R.string.error_adding_treatment_message), treatment.insulin, (int) treatment.carbs, dateUtil.dateAndTimeString(treatment.date));
ErrorHelperActivity.Companion.runAlarm(context, status, resourceHelper.gs(R.string.error_adding_treatment_title), R.raw.error);
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_ID, "TreatmentClash");
bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_NAME, status);
fabricPrivacy.logCustom(bundle);
}
return newRecordCreated;
*/
}
}

View file

@ -1,5 +0,0 @@
package info.nightscout.androidaps.plugins.treatments.events
import info.nightscout.androidaps.events.EventUpdateGui
class EventTreatmentUpdateGui : EventUpdateGui()

View file

@ -1,10 +1,9 @@
package info.nightscout.androidaps.utils package info.nightscout.androidaps.utils.ui
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.utils.ui.NumberPicker
class NumberPickerVertical : NumberPicker { class NumberPickerVertical : NumberPicker {

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils; package info.nightscout.androidaps.utils.ui;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils; package info.nightscout.androidaps.utils.ui;
import android.content.Context; import android.content.Context;
import android.text.Editable; import android.text.Editable;
@ -26,7 +26,10 @@ import java.util.List;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.SafeParse;
import info.nightscout.androidaps.utils.ui.NumberPicker; import info.nightscout.androidaps.utils.ui.NumberPicker;
import info.nightscout.androidaps.utils.ui.SpinnerHelper;
/** /**
* Created by mike on 29.12.2016. * Created by mike on 29.12.2016.

View file

@ -20,13 +20,13 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
<info.nightscout.androidaps.utils.NumberPickerVertical <info.nightscout.androidaps.utils.ui.NumberPickerVertical
android:id="@+id/timelistedit_edit1" android:id="@+id/timelistedit_edit1"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="100dp" android:layout_height="100dp"
android:layout_marginRight="5dp" /> android:layout_marginRight="5dp" />
<info.nightscout.androidaps.utils.NumberPickerVertical <info.nightscout.androidaps.utils.ui.NumberPickerVertical
android:id="@+id/timelistedit_edit2" android:id="@+id/timelistedit_edit2"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="100dp" /> android:layout_height="100dp" />

View file

@ -135,8 +135,6 @@
<string name="configbuilder_pump">Pump</string> <string name="configbuilder_pump">Pump</string>
<string name="configbuilder_pump_description">Which pump would you like to use with AndroidAPS?</string> <string name="configbuilder_pump_description">Which pump would you like to use with AndroidAPS?</string>
<string name="configbuilder_treatments">Treatments</string>
<string name="configbuilder_treatments_description">Which plugin should be used for treatment handling?</string>
<string name="configbuilder_profile">Profile</string> <string name="configbuilder_profile">Profile</string>
<string name="configbuilder_profile_description">Which profile should AndroidAPS use?</string> <string name="configbuilder_profile_description">Which profile should AndroidAPS use?</string>
<string name="configbuilder_aps">APS</string> <string name="configbuilder_aps">APS</string>

View file

@ -23,7 +23,6 @@ open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin @Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var treatmentsInterface: TreatmentsInterface
@Mock lateinit var iobCobCalculator: IobCobCalculator @Mock lateinit var iobCobCalculator: IobCobCalculator
@Mock lateinit var fabricPrivacy: FabricPrivacy @Mock lateinit var fabricPrivacy: FabricPrivacy
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction

View file

@ -4,9 +4,6 @@ import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.TestBaseWithProfile import info.nightscout.androidaps.TestBaseWithProfile
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.db.TemporaryBasal
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.junit.Test import org.junit.Test
@ -17,23 +14,14 @@ import org.powermock.modules.junit4.PowerMockRunner
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
@RunWith(PowerMockRunner::class) @RunWith(PowerMockRunner::class)
@PrepareForTest(FabricPrivacy::class, DatabaseHelperInterface::class, AppRepository::class) @PrepareForTest(FabricPrivacy::class, AppRepository::class)
class TreatmentsPluginTest : TestBaseWithProfile() { class TreatmentsPluginTest : TestBaseWithProfile() {
@Mock lateinit var sp: SP @Mock lateinit var sp: SP
@Mock lateinit var treatmentService: TreatmentService
@Mock lateinit var repository: AppRepository @Mock lateinit var repository: AppRepository
@Mock lateinit var databaseHelper: DatabaseHelperInterface
val injector = HasAndroidInjector { val injector = HasAndroidInjector {
AndroidInjector { AndroidInjector {
if (it is TemporaryBasal) {
it.aapsLogger = aapsLogger
it.activePlugin = activePluginProvider
it.profileFunction = profileFunction
it.sp = sp
it.dateUtil = DateUtil(context)
}
} }
} }

View file

@ -66,7 +66,6 @@ class ActionStartTempTargetTest : ActionsTestBase() {
} }
val updated = mutableListOf<TemporaryTarget>().apply { val updated = mutableListOf<TemporaryTarget>().apply {
// TODO insert all updated TTs
} }
`when`( `when`(

View file

@ -32,7 +32,6 @@ class ComboPluginTest : TestBase() {
@Mock lateinit var pumpSync: PumpSync @Mock lateinit var pumpSync: PumpSync
@Mock lateinit var sp: SP @Mock lateinit var sp: SP
@Mock lateinit var context: Context @Mock lateinit var context: Context
@Mock lateinit var databaseHelper: DatabaseHelperInterface
@Mock lateinit var dateUtil: DateUtil @Mock lateinit var dateUtil: DateUtil
val injector = HasAndroidInjector { val injector = HasAndroidInjector {

View file

@ -1,72 +0,0 @@
package info.nightscout.androidaps.data
import androidx.collection.LongSparseArray
import info.nightscout.androidaps.interfaces.Interval
import java.util.*
/**
* Created by mike on 09.05.2017.
*/
// Zero duration means end of interval
abstract class Intervals<T : Interval> {
var rawData: LongSparseArray<T> = LongSparseArray()// oldest at index 0
@Synchronized fun reset(): Intervals<T> {
rawData = LongSparseArray()
return this
}
protected abstract fun merge()
/**
* The List must be sorted by `T.start()` in ascending order
*/
@Synchronized fun add(list: List<T>) {
for (interval in list) {
rawData.put(interval.start(), interval)
}
merge()
}
@Synchronized fun add(interval: T) {
rawData.put(interval.start(), interval)
merge()
}
@get:Synchronized val list: List<T>
get() {
val list: MutableList<T> = ArrayList()
for (i in 0 until rawData.size()) list.add(rawData.valueAt(i))
return list
}
@get:Synchronized val reversedList: List<T>
get() {
val list: MutableList<T> = ArrayList()
for (i in rawData.size() - 1 downTo 0) list.add(rawData.valueAt(i))
return list
}
@Synchronized protected fun binarySearch(value: Long): Int {
var lo = 0
var hi = rawData.size() - 1
while (lo <= hi) {
val mid = lo + hi ushr 1
val midVal: Interval = rawData.valueAt(mid)
when {
midVal.before(value) -> lo = mid + 1
midVal.after(value) -> hi = mid - 1
midVal.match(value) -> return mid // value found
}
}
return lo.inv() // value not present
}
abstract fun getValueByInterval(time: Long): T?
@Synchronized fun size(): Int = rawData.size()
@Synchronized operator fun get(index: Int): T? = rawData.valueAt(index)
@Synchronized fun getReversed(index: Int): T = rawData.valueAt(size() - 1 - index)
}

View file

@ -1,26 +0,0 @@
package info.nightscout.androidaps.data
import info.nightscout.androidaps.interfaces.Interval
class NonOverlappingIntervals<T : Interval> : Intervals<T> {
constructor() : super()
constructor(other: Intervals<T>) {
rawData = other.rawData.clone()
}
@Synchronized public override fun merge() {
for (index in 0 until rawData.size() - 1) {
val i: T = rawData.valueAt(index)
val startOfNewer = rawData.valueAt(index + 1).start()
if (i.originalEnd() > startOfNewer) {
i.cutEndTo(startOfNewer)
}
}
}
@Synchronized override fun getValueByInterval(time: Long): T? {
val index = binarySearch(time)
return if (index >= 0) rawData.valueAt(index) else null
}
}

View file

@ -1,38 +0,0 @@
package info.nightscout.androidaps.data
import info.nightscout.androidaps.interfaces.Interval
class OverlappingIntervals<T : Interval> : Intervals<T> {
constructor() : super()
constructor(other: Intervals<T>) {
rawData = other.rawData.clone()
}
@Synchronized override fun merge() {
var needToCut = false
var cutTime: Long = 0
for (index in rawData.size() - 1 downTo 0) { //begin with newest
val cur: Interval = rawData.valueAt(index)
if (cur.isEndingEvent) {
needToCut = true
cutTime = cur.start()
} else {
//event that is no EndingEvent might need to be stopped by an ending event
if (needToCut && cur.end() > cutTime) {
cur.cutEndTo(cutTime)
}
}
}
}
@Synchronized override fun getValueByInterval(time: Long): T? {
for (index in rawData.size() - 1 downTo 0) { //begin with newest
val cur = rawData.valueAt(index)
if (cur!!.match(time)) {
return cur
}
}
return null
}
}

View file

@ -1,115 +0,0 @@
package info.nightscout.androidaps.data
import androidx.collection.LongSparseArray
import info.nightscout.androidaps.interfaces.Interval
import java.util.*
// Zero duration means profile is valid until is changed
// When no interval match the latest record without duration is used
class ProfileIntervals<T : Interval> {
private var rawData: LongSparseArray<T> // oldest at index 0
constructor() {
rawData = LongSparseArray()
}
constructor(other: ProfileIntervals<T>) {
rawData = other.rawData.clone()
}
@Synchronized fun reset(): ProfileIntervals<T> {
rawData = LongSparseArray()
return this
}
@Synchronized fun add(newInterval: T) {
if (newInterval.isValid) {
rawData.put(newInterval.start(), newInterval)
merge()
}
}
@Synchronized fun add(list: List<T>) {
for (interval in list) {
if (interval.isValid) rawData.put(interval.start(), interval)
}
merge()
}
@Synchronized private fun merge() {
for (index in 0 until rawData.size() - 1) {
val i: T = rawData.valueAt(index)
val startOfNewer = rawData.valueAt(index + 1)!!.start()
if (i.originalEnd() > startOfNewer) {
i.cutEndTo(startOfNewer)
}
}
}
@Synchronized fun getValueToTime(time: Long): Interval? {
var index = binarySearch(time)
if (index >= 0) return rawData.valueAt(index)
// if we request data older than first record, use oldest with zero duration instead
index = 0
while (index < rawData.size()) {
if (rawData.valueAt(index)!!.durationInMsec() == 0L) {
//log.debug("Requested profile for time: " + DateUtil.dateAndTimeString(time) + ". Providing oldest record: " + rawData.valueAt(0).toString());
return rawData.valueAt(index)
}
index++
}
return null
}
@get:Synchronized val list: List<T>
get() {
val list: MutableList<T> = ArrayList()
for (i in 0 until rawData.size()) list.add(rawData.valueAt(i))
return list
}
@get:Synchronized val reversedList: List<T>
get() {
val list: MutableList<T> = ArrayList()
for (i in rawData.size() - 1 downTo 0) list.add(rawData.valueAt(i))
return list
}
@Synchronized private fun binarySearch(value: Long): Int {
if (rawData.size() == 0) return -1
var lo = 0
var hi = rawData.size() - 1
while (lo <= hi) {
val mid = lo + hi ushr 1
val midVal: Interval = rawData.valueAt(mid)
when {
midVal.match(value) -> return mid // value found
midVal.before(value) -> lo = mid + 1
midVal.after(value) -> hi = mid - 1
}
}
// not found, try nearest older with duration 0
lo -= 1
while (lo >= 0 && lo < rawData.size()) {
if (rawData.valueAt(lo)!!.isEndingEvent) return lo
lo--
}
return -1 // value not present
}
@Synchronized fun size(): Int {
return rawData.size()
}
@Synchronized operator fun get(index: Int): T? {
return rawData.valueAt(index)
}
@Synchronized fun getReversed(index: Int): T {
return rawData.valueAt(size() - 1 - index)
}
override fun toString(): String {
return rawData.toString()
}
}

View file

@ -1,306 +0,0 @@
package info.nightscout.androidaps.db;
/**
* Created by mike on 21.05.2017.
*/
import android.graphics.Color;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import org.json.JSONObject;
import java.util.Objects;
import javax.inject.Inject;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.Insulin;
import info.nightscout.androidaps.interfaces.Interval;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.JsonHelper;
import info.nightscout.androidaps.utils.Round;
/**
* Created by mike on 21.05.2017.
*/
@Deprecated
@DatabaseTable(tableName = "ExtendedBoluses")
public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
@Inject ActivePlugin activePlugin;
@Inject DateUtil dateUtil;
private HasAndroidInjector injector;
@DatabaseField(id = true)
public long date;
@DatabaseField
public boolean isValid = true;
@DatabaseField(index = true)
public long pumpId = 0;
@DatabaseField
public int source = Source.NONE;
@DatabaseField
public String _id = null; // NS _id
@DatabaseField
public double insulin = 0d;
@DatabaseField
public int durationInMinutes = 0; // duration == 0 means end of extended bolus
@DatabaseField
public int insulinInterfaceID = Insulin.InsulinType.OREF_RAPID_ACTING.getValue();
@DatabaseField
public double dia = Constants.defaultDIA;
@Deprecated
public ExtendedBolus() {
injector = StaticInjector.Companion.getInstance();
injector.androidInjector().inject(this);
}
public ExtendedBolus(HasAndroidInjector injector) {
this.injector = injector;
injector.androidInjector().inject(this);
}
public ExtendedBolus(HasAndroidInjector injector, long date) {
this(injector);
this.date = date;
}
public ExtendedBolus date(long date) {
this.date = date;
return this;
}
public ExtendedBolus insulin(double insulin) {
this.insulin = insulin;
return this;
}
public ExtendedBolus pumpId(long pumpId) {
this.pumpId = pumpId;
return this;
}
public ExtendedBolus source(int source) {
this.source = source;
return this;
}
public ExtendedBolus durationInMinutes(int durationInMinutes) {
this.durationInMinutes = durationInMinutes;
return this;
}
public ExtendedBolus _id(String _id) {
this._id = _id;
return this;
}
public boolean isEqual(ExtendedBolus other) {
if (date != other.date) {
return false;
}
if (durationInMinutes != other.durationInMinutes)
return false;
if (insulin != other.insulin)
return false;
if (pumpId != other.pumpId)
return false;
if (!Objects.equals(_id, other._id))
return false;
return true;
}
public void copyFrom(ExtendedBolus t) {
date = t.date;
_id = t._id;
durationInMinutes = t.durationInMinutes;
insulin = t.insulin;
pumpId = t.pumpId;
}
public static ExtendedBolus createFromJson(HasAndroidInjector injector, JSONObject json) {
ExtendedBolus extendedBolus = new ExtendedBolus(injector)
.source(Source.NIGHTSCOUT)
.date(JsonHelper.safeGetLong(json, "mills"))
.durationInMinutes(JsonHelper.safeGetInt(json, "duration"))
.insulin(JsonHelper.safeGetDouble(json, "relative") / 60 * JsonHelper.safeGetInt(json, "duration"))
._id(JsonHelper.safeGetString(json, "_id"))
.pumpId(JsonHelper.safeGetLong(json, "pumpId"));
return extendedBolus;
}
// -------- Interval interface ---------
Long cuttedEnd = null;
public long durationInMsec() {
return durationInMinutes * 60 * 1000L;
}
public long start() {
return date;
}
// planned end time at time of creation
public long originalEnd() {
return date + durationInMinutes * 60 * 1000L;
}
// end time after cut
public long end() {
if (cuttedEnd != null)
return cuttedEnd;
return originalEnd();
}
public void cutEndTo(long end) {
cuttedEnd = end;
}
public boolean match(long time) {
if (start() <= time && end() >= time)
return true;
return false;
}
public boolean before(long time) {
if (end() < time)
return true;
return false;
}
public boolean after(long time) {
if (start() > time)
return true;
return false;
}
@Override
public boolean isInProgress() {
return match(System.currentTimeMillis());
}
@Override
public boolean isEndingEvent() {
return durationInMinutes == 0;
}
@Override
public boolean isValid() {
return true;
}
// -------- Interval interface end ---------
public String log() {
return "ExtendedBolus{" +
"date= " + date +
", date= " + dateUtil.dateAndTimeString(date) +
", isValid=" + isValid +
", _id= " + _id +
", pumpId= " + pumpId +
", insulin= " + insulin +
", durationInMinutes= " + durationInMinutes +
"}";
}
public double absoluteRate() {
return Round.roundTo(insulin / durationInMinutes * 60, 0.01);
}
public double insulinSoFar() {
return absoluteRate() * getRealDuration() / 60d;
}
public int getRealDuration() {
return getDurationToTime(System.currentTimeMillis());
}
private int getDurationToTime(long time) {
long endTime = Math.min(time, end());
long msecs = endTime - date;
return Math.round(msecs / 60f / 1000);
}
public int getPlannedRemainingMinutes() {
float remainingMin = (end() - System.currentTimeMillis()) / 1000f / 60;
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
}
public String toString() {
return "E " + DecimalFormatter.INSTANCE.to2Decimal(absoluteRate()) + "U/h @" +
dateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "min";
}
public String toStringMedium() {
return DecimalFormatter.INSTANCE.to2Decimal(absoluteRate()) + "U/h "
+ getRealDuration() + "/" + durationInMinutes + "'";
}
public String toStringTotal() {
return DecimalFormatter.INSTANCE.to2Decimal(insulin) + "U ( " +
DecimalFormatter.INSTANCE.to2Decimal(absoluteRate()) + " U/h )";
}
// -------- DataPointWithLabelInterface --------
@Override
public double getX() {
return date;
}
// default when no sgv around available
private double yValue = 0;
@Override
public double getY() {
return yValue;
}
@Override
public void setY(double y) {
yValue = y;
}
@Override
public String getLabel() {
return toStringTotal();
}
@Override
public long getDuration() {
return durationInMinutes * 60 * 1000L;
}
@Override
public PointsWithLabelGraphSeries.Shape getShape() {
return PointsWithLabelGraphSeries.Shape.EXTENDEDBOLUS;
}
@Override
public float getSize() {
return 10;
}
@Override
public int getColor() {
return Color.CYAN;
}
}

View file

@ -1,27 +0,0 @@
package info.nightscout.androidaps.db;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "InsightBolusIDs")
public class InsightBolusID {
@DatabaseField(generatedId = true)
public Long id;
@DatabaseField
public String pumpSerial;
@DatabaseField
public Long timestamp;
@DatabaseField
public Integer bolusID;
@DatabaseField
public Long startID;
@DatabaseField
public Long endID;
}

View file

@ -1,14 +0,0 @@
package info.nightscout.androidaps.db;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "InsightHistoryOffsets")
public class InsightHistoryOffset {
@DatabaseField(id = true, canBeNull = false)
public String pumpSerial;
@DatabaseField
public long offset;
}

View file

@ -1,24 +0,0 @@
package info.nightscout.androidaps.db;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "InsightPumpIDs")
public class InsightPumpID {
@DatabaseField(generatedId = true)
public Long id;
@DatabaseField
public long timestamp;
@DatabaseField
public String eventType;
@DatabaseField
public String pumpSerial;
@DatabaseField
public long eventID;
}

View file

@ -1,14 +0,0 @@
package info.nightscout.androidaps.db
import com.j256.ormlite.field.DatabaseField
import com.j256.ormlite.table.DatabaseTable
@DatabaseTable(tableName = "OpenHumansQueue")
data class OHQueueItem @JvmOverloads constructor(
@DatabaseField(generatedId = true)
val id: Long = 0,
@DatabaseField
val file: String = "",
@DatabaseField
val content: String = ""
)

View file

@ -1,24 +0,0 @@
package info.nightscout.androidaps.db;
/**
* Created by mike on 21.05.2017.
*/
public class Source {
public final static int NONE = 0;
public final static int PUMP = 1; // Pump history
public final static int NIGHTSCOUT = 2; // created in NS
public final static int USER = 3; // created by user or driver not using history
public static String getString(int source) {
switch (source) {
case PUMP:
return "PUMP";
case NIGHTSCOUT:
return "NIGHTSCOUT";
case USER:
return "USER";
}
return "NONE";
}
}

View file

@ -1,370 +0,0 @@
package info.nightscout.androidaps.db;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import java.util.Objects;
import javax.inject.Inject;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.Interval;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
/**
* Created by mike on 21.05.2017.
*/
@Deprecated
@DatabaseTable(tableName = "TemporaryBasals")
public class TemporaryBasal implements Interval {
@Inject public AAPSLogger aapsLogger;
@Inject public ProfileFunction profileFunction;
@Inject public ActivePlugin activePlugin;
@Inject public SP sp;
@Inject public DateUtil dateUtil;
private HasAndroidInjector injector;
@DatabaseField(id = true)
public long date;
@DatabaseField
public boolean isValid = true;
@DatabaseField(index = true)
public long pumpId = 0;
@DatabaseField
public int source = Source.NONE;
@DatabaseField
public String _id = null; // NS _id
@DatabaseField
public int durationInMinutes = 0; // duration == 0 means end of temp basal
@DatabaseField
public boolean isAbsolute = false;
public boolean isFakeExtended = false;
@DatabaseField
public int percentRate = 0;
@DatabaseField
public double absoluteRate = 0d;
public double netExtendedRate = 0d;
@Deprecated
public TemporaryBasal() {
injector = StaticInjector.Companion.getInstance();
injector.androidInjector().inject(this);
}
public TemporaryBasal(HasAndroidInjector injector) {
this.injector = injector;
injector.androidInjector().inject(this);
}
public TemporaryBasal date(long date) {
this.date = date;
return this;
}
public TemporaryBasal duration(int durationInMinutes) {
this.durationInMinutes = durationInMinutes;
return this;
}
public TemporaryBasal absolute(double absoluteRate) {
this.absoluteRate = absoluteRate;
this.isAbsolute = true;
return this;
}
public TemporaryBasal percent(int percentRate) {
this.percentRate = percentRate;
this.isAbsolute = false;
return this;
}
public TemporaryBasal source(int source) {
this.source = source;
return this;
}
public TemporaryBasal pumpId(long pumpId) {
this.pumpId = pumpId;
return this;
}
public TemporaryBasal(ExtendedBolus extendedBolus) {
injector = StaticInjector.Companion.getInstance();
injector.androidInjector().inject(this);
double basal = profileFunction.getProfile(extendedBolus.date).getBasal(extendedBolus.date);
this.date = extendedBolus.date;
this.isValid = extendedBolus.isValid;
this.source = extendedBolus.source;
this._id = extendedBolus._id;
this.durationInMinutes = extendedBolus.durationInMinutes;
this.isAbsolute = true;
this.isFakeExtended = true;
this.netExtendedRate = extendedBolus.absoluteRate();
this.absoluteRate = basal + extendedBolus.absoluteRate();
this.pumpId = extendedBolus.pumpId;
}
public TemporaryBasal clone() {
TemporaryBasal t = new TemporaryBasal(injector);
t.date = date;
t.isValid = isValid;
t.source = source;
t._id = _id;
t.pumpId = pumpId;
t.durationInMinutes = durationInMinutes;
t.isAbsolute = isAbsolute;
t.percentRate = percentRate;
t.absoluteRate = absoluteRate;
return t;
}
public boolean isEqual(TemporaryBasal other) {
if (date != other.date) {
return false;
}
if (durationInMinutes != other.durationInMinutes)
return false;
if (isAbsolute != other.isAbsolute)
return false;
if (percentRate != other.percentRate)
return false;
if (absoluteRate != other.absoluteRate)
return false;
if (netExtendedRate != other.netExtendedRate)
return false;
if (isFakeExtended != other.isFakeExtended)
return false;
if (pumpId != other.pumpId)
return false;
if (!Objects.equals(_id, other._id))
return false;
return true;
}
public void copyFrom(TemporaryBasal t) {
date = t.date;
_id = t._id;
durationInMinutes = t.durationInMinutes;
isAbsolute = t.isAbsolute;
percentRate = t.percentRate;
absoluteRate = t.absoluteRate;
pumpId = t.pumpId;
isFakeExtended = t.isFakeExtended;
netExtendedRate = t.netExtendedRate;
}
public void copyFromPump(TemporaryBasal t) {
durationInMinutes = t.durationInMinutes;
isAbsolute = t.isAbsolute;
percentRate = t.percentRate;
absoluteRate = t.absoluteRate;
pumpId = t.pumpId;
}
// -------- Interval interface ---------
Long cuttedEnd = null;
public long durationInMsec() {
return durationInMinutes * 60 * 1000L;
}
public long start() {
return date;
}
// planned end time at time of creation
public long originalEnd() {
return date + durationInMinutes * 60 * 1000L;
}
// end time after cut
public long end() {
if (cuttedEnd != null)
return cuttedEnd;
return originalEnd();
}
public void cutEndTo(long end) {
cuttedEnd = end;
}
public boolean match(long time) {
if (start() <= time && end() >= time)
return true;
return false;
}
public boolean before(long time) {
if (end() < time)
return true;
return false;
}
public boolean after(long time) {
if (start() > time)
return true;
return false;
}
@Override
public boolean isInProgress() {
return match(System.currentTimeMillis());
}
@Override
public boolean isEndingEvent() {
return durationInMinutes == 0;
}
@Override
public boolean isValid() {
return true;
}
// -------- Interval interface end ---------
public int getRealDuration() {
return getDurationToTime(System.currentTimeMillis());
}
private int getDurationToTime(long time) {
long endTime = Math.min(time, end());
long msecs = endTime - date;
return Math.round(msecs / 60f / 1000);
}
public int getPlannedRemainingMinutes() {
float remainingMin = (end() - System.currentTimeMillis()) / 1000f / 60;
return (remainingMin < 0) ? 0 : Math.round(remainingMin);
}
public int getPlannedRemainingMinutesRoundedUp() {
float remainingMin = (end() - System.currentTimeMillis()) / 1000f / 60;
return (remainingMin < 0) ? 0 : (int) Math.ceil(remainingMin);
}
public double tempBasalConvertedToAbsolute(long time, Profile profile) {
if (isFakeExtended) {
return profile.getBasal(time) + netExtendedRate;
} else if (isAbsolute) {
return absoluteRate;
} else {
return profile.getBasal(time) * percentRate / 100;
}
}
public int tempBasalConvertedToPercent(long time, Profile profile) {
if (isFakeExtended) {
return (int) ((profile.getBasal(time) + netExtendedRate) / profile.getBasal(time)) * 100;
} else if (isAbsolute) {
return (int) (absoluteRate / profile.getBasal(time) * 100);
} else {
return percentRate;
}
}
public String toString() {
return "TemporaryBasal{" +
"date=" + date +
", date=" + dateUtil.dateAndTimeString(date) +
", isValid=" + isValid +
", pumpId=" + pumpId +
", _id=" + _id +
", percentRate=" + percentRate +
", absoluteRate=" + absoluteRate +
", durationInMinutes=" + durationInMinutes +
", isAbsolute=" + isAbsolute +
", isFakeExtended=" + isFakeExtended +
", netExtendedRate=" + netExtendedRate +
'}';
}
public String toStringFull() {
if (isFakeExtended) {
Profile profile = profileFunction.getProfile();
if (profile == null)
return "null";
Double currentBasalRate = profile.getBasal();
double rate = currentBasalRate + netExtendedRate;
return DecimalFormatter.INSTANCE.to2Decimal(rate) + "U/h (" + DecimalFormatter.INSTANCE.to2Decimal(netExtendedRate) + "E) @" +
dateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "'";
} else if (isAbsolute) {
return DecimalFormatter.INSTANCE.to2Decimal(absoluteRate) + "U/h @" +
dateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "'";
} else { // percent
return percentRate + "% @" +
dateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "'";
}
}
public String toStringShort() {
if (isAbsolute || isFakeExtended) {
double rate;
if (isFakeExtended) {
Profile profile = profileFunction.getProfile();
if (profile == null)
return "null";
double currentBasalRate = profile.getBasal();
rate = currentBasalRate + netExtendedRate;
} else {
rate = absoluteRate;
}
return DecimalFormatter.INSTANCE.to2Decimal(rate) + "U/h";
} else { // percent
return percentRate + "%";
}
}
public String toStringVeryShort() {
Profile profile = profileFunction.getProfile();
if (profile == null)
return "null";
if (isAbsolute || isFakeExtended) {
double rate;
if (isFakeExtended) {
double currentBasalRate = profile.getBasal();
rate = currentBasalRate + netExtendedRate;
} else {
rate = absoluteRate;
}
return DecimalFormatter.INSTANCE.to2Decimal(rate) + "U/h";
} else { // percent
return percentRate + "%";
}
}
public long getDate() {
return this.date;
}
public long getPumpId() {
return this.pumpId;
}
}

View file

@ -1,280 +0,0 @@
package info.nightscout.androidaps.db;
import android.graphics.Color;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Objects;
import javax.inject.Inject;
import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.core.R;
import info.nightscout.androidaps.database.entities.Bolus;
import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.Insulin;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.DefaultValueHelper;
import info.nightscout.androidaps.utils.JsonHelper;
import info.nightscout.androidaps.utils.resources.ResourceHelper;
@Deprecated
@DatabaseTable(tableName = Treatment.TABLE_TREATMENTS)
public class Treatment implements DataPointWithLabelInterface {
@Inject public DefaultValueHelper defaultValueHelper;
@Inject public ResourceHelper resourceHelper;
@Inject public ProfileFunction profileFunction;
@Inject public ActivePlugin activePlugin;
@Inject public DateUtil dateUtil;
public static final String TABLE_TREATMENTS = "Treatments";
@DatabaseField(id = true)
public long date;
@DatabaseField
public boolean isValid = true;
@DatabaseField(index = true)
public long pumpId = 0;
@DatabaseField
public int source = Source.NONE;
@DatabaseField
public String _id;
@DatabaseField
public double insulin = 0d;
@DatabaseField
public double carbs = 0d;
@DatabaseField
public boolean mealBolus = true; // true for meal bolus , false for correction bolus
@DatabaseField
public boolean isSMB = false;
@DatabaseField
public int insulinInterfaceID = Insulin.InsulinType.OREF_RAPID_ACTING.getValue(); // currently unused, will be used in the future
@DatabaseField
public double dia = Constants.defaultDIA; // currently unused, will be used in the future
@DatabaseField
public String boluscalc;
public Treatment() {
StaticInjector.Companion.getInstance().androidInjector().inject(this); // TODO it will be removed by new database
}
public Treatment(HasAndroidInjector injector) {
injector.androidInjector().inject(this);
}
public Treatment(HasAndroidInjector injector, Bolus bolus) {
this(injector);
date = bolus.getTimestamp();
isValid = bolus.isValid();
pumpId = (bolus.getInterfaceIDs().getPumpId() != null) ? bolus.getInterfaceIDs().getPumpId() : 0;
source = (bolus.getInterfaceIDs().getPumpId() != null) ? Source.PUMP : Source.USER;
_id = bolus.getInterfaceIDs().getNightscoutId();
insulin = bolus.getAmount();
isSMB = bolus.getType() == Bolus.Type.SMB;
}
@NonNull public String toString() {
return "Treatment{" +
"date= " + date +
", date= " + dateUtil.dateAndTimeString(date) +
", isValid= " + isValid +
", isSMB= " + isSMB +
", _id= " + _id +
", pumpId= " + pumpId +
", insulin= " + insulin +
", carbs= " + carbs +
", mealBolus= " + mealBolus +
", source= " + source +
"}";
}
public boolean isDataChanging(Treatment other) {
if (date != other.date)
return true;
if (!isSame(insulin, other.insulin))
return true;
if (!isSame(carbs, other.carbs))
return true;
return false;
}
public boolean isEqual(Treatment other) {
if (date != other.date)
return false;
if (!isSame(insulin, other.insulin))
return false;
if (!isSame(carbs, other.carbs))
return false;
if (mealBolus != other.mealBolus)
return false;
if (pumpId != other.pumpId)
return false;
if (isSMB != other.isSMB)
return false;
if (!Objects.equals(_id, other._id))
return false;
return true;
}
public boolean isEqualWithoutPumpId(Treatment other) {
if (date != other.date)
return false;
if (!isSame(insulin, other.insulin))
return false;
if (!isSame(carbs, other.carbs))
return false;
if (mealBolus != other.mealBolus)
return false;
if (isSMB != other.isSMB)
return false;
if (!Objects.equals(_id, other._id))
return false;
return true;
}
public boolean isSame(Double d1, Double d2) {
double diff = d1 - d2;
return (Math.abs(diff) <= 0.000001);
}
@Nullable
public JSONObject getBoluscalc() {
try {
if (boluscalc != null)
return new JSONObject(boluscalc);
} catch (JSONException ignored) {
}
return null;
}
public double getIc() {
JSONObject bw = getBoluscalc();
if (bw == null || !bw.has("ic")) {
Profile profile = profileFunction.getProfile(date);
return profile.getIc(date);
}
return JsonHelper.safeGetDouble(bw, "ic");
}
/*
* mealBolus, _id and isSMB cannot be known coming from pump. Only compare rest
* TODO: remove debug toasts
*/
public boolean equalsRePumpHistory(Treatment other) {
if (date != other.date) {
return false;
}
if (!isSame(insulin, other.insulin))
return false;
if (!isSame(carbs, other.carbs))
return false;
return true;
}
public void copyFrom(Treatment t) {
date = t.date;
_id = t._id;
insulin = t.insulin;
carbs = t.carbs;
mealBolus = t.mealBolus;
pumpId = t.pumpId;
isSMB = t.isSMB;
}
public void copyBasics(Treatment t) {
date = t.date;
insulin = t.insulin;
carbs = t.carbs;
pumpId = t.pumpId;
source = t.source;
}
// ----------------- DataPointInterface --------------------
@Override
public double getX() {
return date;
}
// default when no sgv around available
private double yValue = 0;
@Override
public double getY() {
return isSMB ? defaultValueHelper.determineLowLine() : yValue;
}
@Override
public String getLabel() {
String label = "";
if (insulin > 0)
label += DecimalFormatter.INSTANCE.toPumpSupportedBolus(insulin, activePlugin.getActivePump(), resourceHelper);
if (carbs > 0)
label += "~" + resourceHelper.gs(R.string.format_carbs, (int) carbs);
return label;
}
@Override
public long getDuration() {
return 0;
}
@Override
public PointsWithLabelGraphSeries.Shape getShape() {
if (isSMB)
return PointsWithLabelGraphSeries.Shape.SMB;
else
return PointsWithLabelGraphSeries.Shape.BOLUS;
}
@Override
public float getSize() {
return 2;
}
@Override
public int getColor() {
if (isSMB)
return resourceHelper.gc(R.color.tempbasal);
else if (isValid)
return Color.CYAN;
else
return resourceHelper.gc(android.R.color.holo_red_light);
}
@Override
public void setY(double y) {
yValue = y;
}
// ----------------- DataPointInterface end --------------------
public long getDate() {
return this.date;
}
public long getPumpId() {
return this.pumpId;
}
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.db package info.nightscout.androidaps.di
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector

View file

@ -40,11 +40,6 @@ interface ActivePlugin {
*/ */
val activeSensitivity: Sensitivity val activeSensitivity: Sensitivity
/**
* Currently selected Treatments plugin
*/
val activeTreatments: TreatmentsInterface
/** /**
* Currently selected Overview plugin * Currently selected Overview plugin
* Always OverviewPlugin * Always OverviewPlugin

View file

@ -1,29 +0,0 @@
package info.nightscout.androidaps.interfaces
import info.nightscout.androidaps.db.*
interface DatabaseHelperInterface {
fun resetDatabases()
fun createOrUpdate(record: OmnipodHistoryRecord)
fun createOrUpdate(record: OHQueueItem)
fun delete(extendedBolus: ExtendedBolus)
fun createOrUpdate(tempBasal: TemporaryBasal): Boolean
@Deprecated("Use new DB")
fun findTempBasalByPumpId(id: Long): TemporaryBasal?
@Deprecated("Use new DB")
fun getTemporaryBasalsDataFromTime(mills: Long, ascending: Boolean): List<TemporaryBasal>
fun getAllOmnipodHistoryRecordsFromTimestamp(timestamp: Long, ascending: Boolean): List<OmnipodHistoryRecord>
fun findOmnipodHistoryRecordByPumpId(pumpId: Long): OmnipodHistoryRecord?
@Deprecated("Use new DB")
fun getExtendedBolusByPumpId(pumpId: Long): ExtendedBolus?
fun getAllOHQueueItems(maxEntries: Long): List<OHQueueItem>
// old DB model
fun getOHQueueSize(): Long
fun clearOpenHumansQueue()
fun removeAllOHQueueItemsWithIdSmallerThan(id: Long)
}

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.interfaces
interface Interval {
fun durationInMsec(): Long
fun start(): Long
// planned end time at time of creation
fun originalEnd(): Long
// end time after cut
fun end(): Long
fun cutEndTo(end: Long)
fun match(time: Long): Boolean
fun before(time: Long): Boolean
fun after(time: Long): Boolean
val isInProgress: Boolean
val isEndingEvent: Boolean
val isValid: Boolean
}

View file

@ -6,5 +6,5 @@ package info.nightscout.androidaps.interfaces
* set by [info.nightscout.androidaps.interfaces.PluginDescription.mainType] * set by [info.nightscout.androidaps.interfaces.PluginDescription.mainType]
*/ */
enum class PluginType { enum class PluginType {
GENERAL, TREATMENT, SENSITIVITY, PROFILE, APS, PUMP, CONSTRAINTS, LOOP, BGSOURCE, INSULIN GENERAL, SENSITIVITY, PROFILE, APS, PUMP, CONSTRAINTS, LOOP, BGSOURCE, INSULIN
} }

View file

@ -1,9 +0,0 @@
package info.nightscout.androidaps.interfaces
import info.nightscout.androidaps.db.Treatment
interface TreatmentServiceInterface {
fun createOrUpdateMedtronic(treatment: Treatment, fromNightScout: Boolean): UpdateReturn
fun createOrUpdate(treatment: Treatment): UpdateReturn
}

View file

@ -1,29 +0,0 @@
package info.nightscout.androidaps.interfaces;
import java.util.List;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.plugins.treatments.TreatmentUpdateReturn;
/**
* Created by mike on 14.06.2016.
*/
public interface TreatmentsInterface {
TreatmentServiceInterface getService();
@Deprecated
List<Treatment> getTreatmentsFromHistoryAfterTimestamp(long timestamp);
boolean addToHistoryTempBasal(TemporaryBasal tempBasal);
boolean addToHistoryExtendedBolus(ExtendedBolus extendedBolus);
boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo, boolean allowUpdate);
TreatmentUpdateReturn createOrUpdateMedtronic(Treatment treatment, boolean fromNightScout);
}

View file

@ -1,11 +0,0 @@
package info.nightscout.androidaps.interfaces
class UpdateReturn(var success: Boolean, var newRecord: Boolean) {
override fun toString(): String {
return "UpdateReturn [" +
"newRecord=" + newRecord +
", success=" + success +
']'
}
}

View file

@ -4,7 +4,11 @@ import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.data.ProfileSealed import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.extensions.pureProfileFromJson import info.nightscout.androidaps.extensions.pureProfileFromJson
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.interfaces.ProfileStore
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.utils.DefaultValueHelper
@ -21,7 +25,6 @@ open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin @Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var treatmentsInterface: TreatmentsInterface
@Mock lateinit var fabricPrivacy: FabricPrivacy @Mock lateinit var fabricPrivacy: FabricPrivacy
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var defaultValueHelper: DefaultValueHelper @Mock lateinit var defaultValueHelper: DefaultValueHelper

View file

@ -1,55 +0,0 @@
package info.nightscout.androidaps.data
import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.db.TemporaryBasal
import info.nightscout.androidaps.utils.T
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.modules.junit4.PowerMockRunner
@RunWith(PowerMockRunner::class)
class NonOverlappingIntervalsTest : TestBase() {
private val startDate = System.currentTimeMillis()
var list = NonOverlappingIntervals<TemporaryBasal>()
val injector = HasAndroidInjector { AndroidInjector {} }
@Test
fun doTests() {
// create one 10h interval and test value in and out
list.add(TemporaryBasal(injector).date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
// stop temp after 5h
list.add(TemporaryBasal(injector).date(startDate + T.hours(5).msecs()).duration(0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01)
Assert.assertEquals(1.0, list.getValueByInterval(startDate + T.hours(5).msecs() - 1)!!.absoluteRate, 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(5).msecs() + 1))
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
// insert 1h interval inside
list.add(TemporaryBasal(injector).date(startDate + T.hours(3).msecs()).duration(T.hours(1).mins().toInt()).absolute(2.0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(5).msecs() - 1))
Assert.assertEquals(2.0, list.getValueByInterval(startDate + T.hours(3).msecs())!!.absoluteRate, 0.01)
Assert.assertEquals(2.0, list.getValueByInterval(startDate + T.hours(4).msecs() - 1)!!.absoluteRate, 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(4).msecs() + 1))
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
}
@Test
fun testCopyConstructor() {
list.reset()
list.add(TemporaryBasal(injector).date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0))
val list2 = NonOverlappingIntervals(list)
Assert.assertEquals(1, list2.list.size.toLong())
}
}

View file

@ -1,58 +0,0 @@
package info.nightscout.androidaps.data
import info.nightscout.androidaps.utils.T
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.modules.junit4.PowerMockRunner
import java.util.*
@RunWith(PowerMockRunner::class)
class OverlappingIntervalsTest {
private val startDate = System.currentTimeMillis()
private var list = OverlappingIntervals<TempTargetTest>()
@Test fun doTests() {
// create one 10h interval and test value in and out
list.add(TempTargetTest().date(startDate).duration(T.hours(10).mins()).low(100.0).high(100.0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(100.0, list.getValueByInterval(startDate)!!.target(), 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
// stop temp target after 5h
list.add(TempTargetTest().date(startDate + T.hours(5).msecs()).duration(0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(100.0, list.getValueByInterval(startDate)!!.target(), 0.01)
Assert.assertEquals(100.0, list.getValueByInterval(startDate + T.hours(5).msecs() - 1)!!.target(), 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(5).msecs() + 1))
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
// insert 1h interval inside
list.add(TempTargetTest().date(startDate + T.hours(3).msecs()).duration(T.hours(1).mins()).low(200.0).high(200.0))
Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs()))
Assert.assertEquals(100.0, list.getValueByInterval(startDate)!!.target(), 0.01)
Assert.assertEquals(100.0, list.getValueByInterval(startDate + T.hours(5).msecs() - 1)!!.target(), 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(5).msecs() + 1))
Assert.assertEquals(200.0, list.getValueByInterval(startDate + T.hours(3).msecs())!!.target(), 0.01)
Assert.assertEquals(100.0, list.getValueByInterval(startDate + T.hours(4).msecs() + 1)!!.target(), 0.01)
Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1))
}
@Test fun testCopyConstructor() {
list.reset()
list.add(TempTargetTest().date(startDate).duration(T.hours(10).mins()).low(100.0).high(100.0))
val list2 = OverlappingIntervals(list)
Assert.assertEquals(1, list2.list.size.toLong())
}
@Test fun testReversingArrays() {
val someList: MutableList<TempTargetTest> = ArrayList()
someList.add(TempTargetTest().date(startDate).duration(T.hours(3).mins()).low(200.0).high(200.0))
someList.add(TempTargetTest().date(startDate + T.hours(1).msecs()).duration(T.hours(1).mins()).low(100.0).high(100.0))
list.reset()
list.add(someList)
Assert.assertEquals(startDate, list[0]?.data?.timestamp)
Assert.assertEquals(startDate + T.hours(1).msecs(), list.getReversed(0).data.timestamp)
Assert.assertEquals(startDate + T.hours(1).msecs(), list.reversedList[0].data.timestamp)
}
}

View file

@ -1,82 +0,0 @@
package info.nightscout.androidaps.data
import info.nightscout.androidaps.TestBaseWithProfile
import info.nightscout.androidaps.TestPumpPlugin
import info.nightscout.androidaps.utils.T
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.powermock.modules.junit4.PowerMockRunner
import java.util.*
@RunWith(PowerMockRunner::class)
class ProfileIntervalsTest : TestBaseWithProfile() {
@Test
fun fake() {}
/*
lateinit var testPumpPlugin: TestPumpPlugin
private val startDate = System.currentTimeMillis()
var list = ProfileIntervals<ProfileSwitch>()
@Before
fun mock() {
testPumpPlugin = TestPumpPlugin(profileInjector)
`when`(activePluginProvider.activePump).thenReturn(testPumpPlugin)
}
@Test
fun doTests() {
// create one 10h interval and test value in and out
list.add(ProfileSwitch(profileInjector).date(startDate).duration(T.hours(10).mins().toInt()).profileName("1").profile(validProfile))
// for older date first record should be returned only if has zero duration
Assert.assertEquals(null, list.getValueToTime(startDate - T.secs(1).msecs()))
Assert.assertEquals("1", (list.getValueToTime(startDate) as ProfileSwitch).profileName)
Assert.assertEquals(null, list.getValueToTime(startDate + T.hours(10).msecs() + 1))
list.reset()
list.add(ProfileSwitch(profileInjector).date(startDate).profileName("1").profile(validProfile))
Assert.assertEquals("1", (list.getValueToTime(startDate - T.secs(1).msecs()) as ProfileSwitch?)!!.profileName)
Assert.assertEquals("1", (list.getValueToTime(startDate) as ProfileSwitch).profileName)
Assert.assertEquals("1", (list.getValueToTime(startDate + T.hours(10).msecs() + 1) as ProfileSwitch?)!!.profileName)
// switch to different profile after 5h
list.add(ProfileSwitch(profileInjector).date(startDate + T.hours(5).msecs()).duration(0).profileName("2").profile(validProfile))
Assert.assertEquals("1", (list.getValueToTime(startDate - T.secs(1).msecs()) as ProfileSwitch?)!!.profileName)
Assert.assertEquals("1", (list.getValueToTime(startDate + T.hours(5).msecs() - 1) as ProfileSwitch?)!!.profileName)
Assert.assertEquals("2", (list.getValueToTime(startDate + T.hours(5).msecs() + 1) as ProfileSwitch?)!!.profileName)
// insert 1h interval inside
list.add(ProfileSwitch(profileInjector).date(startDate + T.hours(6).msecs()).duration(T.hours(1).mins().toInt()).profileName("3").profile(validProfile))
Assert.assertEquals("2", (list.getValueToTime(startDate + T.hours(6).msecs() - 1) as ProfileSwitch?)!!.profileName)
Assert.assertEquals("3", (list.getValueToTime(startDate + T.hours(6).msecs() + 1) as ProfileSwitch?)!!.profileName)
Assert.assertEquals("2", (list.getValueToTime(startDate + T.hours(7).msecs() + 1) as ProfileSwitch?)!!.profileName)
}
@Test
fun testCopyConstructor() {
list.reset()
list.add(ProfileSwitch(profileInjector).date(startDate).duration(T.hours(10).mins().toInt()).profileName("4").profile(validProfile))
val list2 = ProfileIntervals(list)
Assert.assertEquals(1, list2.list.size.toLong())
}
@Test fun invalidProfilesShouldNotBeReturned() {
list.reset()
list.add(ProfileSwitch(profileInjector).date(startDate + T.hours(1).msecs()).profileName("6"))
Assert.assertEquals(null, list[0])
}
@Test fun testReversingArrays() {
val someList: MutableList<ProfileSwitch> = ArrayList()
someList.add(ProfileSwitch(profileInjector).date(startDate).duration(T.hours(3).mins().toInt()).profileName("5").profile(validProfile))
someList.add(ProfileSwitch(profileInjector).date(startDate + T.hours(1).msecs()).duration(T.hours(1).mins().toInt()).profileName("6").profile(validProfile))
list.reset()
list.add(someList)
Assert.assertEquals(startDate, list[0]?.date)
Assert.assertEquals(startDate + T.hours(1).msecs(), list.getReversed(0).date)
Assert.assertEquals(startDate + T.hours(1).msecs(), list.reversedList[0].date)
}
*/
}

View file

@ -1,86 +0,0 @@
package info.nightscout.androidaps.data
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.database.interfaces.end
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.Interval
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.resources.ResourceHelper
import java.util.concurrent.TimeUnit
class TempTargetTest(
var data: TemporaryTarget = TemporaryTarget(
timestamp = 0,
utcOffset = 0,
reason = TemporaryTarget.Reason.CUSTOM,
highTarget = 0.0,
lowTarget = 0.0,
duration = 0
)
) : Interval {
fun date(timestamp: Long): TempTargetTest {
data.timestamp = timestamp
return this
}
fun duration(duration: Long): TempTargetTest {
data.duration = T.mins(duration).msecs()
return this
}
fun low(low: Double): TempTargetTest {
data.lowTarget = low
return this
}
fun high(high: Double): TempTargetTest {
data.highTarget = high
return this
}
fun target(): Double {
return (data.lowTarget + data.highTarget) / 2
}
// -------- Interval interface ---------
private var cuttedEnd: Long? = null
override fun durationInMsec(): Long = data.duration
override fun start(): Long = data.timestamp
override fun originalEnd(): Long = data.end // planned end time at time of creation
override fun end(): Long = cuttedEnd ?: originalEnd() // end time after cut
override fun cutEndTo(end: Long) {
cuttedEnd = end
}
override fun match(time: Long): Boolean = start() <= time && end() >= time
override fun before(time: Long): Boolean = end() < time
override fun after(time: Long): Boolean = start() > time
override val isInProgress: Boolean get() = match(System.currentTimeMillis())
override val isEndingEvent: Boolean get() = data.duration == 0L
override val isValid: Boolean get() = true
// -------- Interval interface end ---------
/*
fun lowValueToUnitsToString(units: String): String =
if (units == Constants.MGDL) DecimalFormatter.to0Decimal(data.lowTarget)
else DecimalFormatter.to1Decimal(data.lowTarget * Constants.MGDL_TO_MMOLL)
fun highValueToUnitsToString(units: String): String =
if (units == Constants.MGDL) DecimalFormatter.to0Decimal(data.highTarget)
else DecimalFormatter.to1Decimal(data.highTarget * Constants.MGDL_TO_MMOLL)
override fun toString(): String = data.toString()
fun friendlyDescription(units: String, resourceHelper: ResourceHelper): String =
Profile.toTargetRangeString(data.lowTarget, data.highTarget, GlucoseUnit.MGDL, units) +
units +
"@" + resourceHelper.gs(R.string.format_mins, TimeUnit.MILLISECONDS.toMinutes(data.duration)) + "(" + data.reason.text + ")"
*/
}

View file

@ -21,7 +21,6 @@ open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin @Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var treatmentsInterface: TreatmentsInterface
@Mock lateinit var fabricPrivacy: FabricPrivacy @Mock lateinit var fabricPrivacy: FabricPrivacy
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var defaultValueHelper: DefaultValueHelper @Mock lateinit var defaultValueHelper: DefaultValueHelper

View file

@ -21,7 +21,6 @@ import info.nightscout.androidaps.danar.DanaRPlugin;
import info.nightscout.androidaps.interfaces.ActivePlugin; import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.CommandQueueProvider; import info.nightscout.androidaps.interfaces.CommandQueueProvider;
import info.nightscout.androidaps.interfaces.ConfigBuilder; import info.nightscout.androidaps.interfaces.ConfigBuilder;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.interfaces.PumpSync; import info.nightscout.androidaps.interfaces.PumpSync;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;

View file

@ -21,7 +21,6 @@ open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin @Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var treatmentsInterface: TreatmentsInterface
@Mock lateinit var fabricPrivacy: FabricPrivacy @Mock lateinit var fabricPrivacy: FabricPrivacy
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var defaultValueHelper: DefaultValueHelper @Mock lateinit var defaultValueHelper: DefaultValueHelper

View file

@ -21,7 +21,6 @@ open class TestBaseWithProfile : TestBase() {
@Mock lateinit var activePluginProvider: ActivePlugin @Mock lateinit var activePluginProvider: ActivePlugin
@Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var treatmentsInterface: TreatmentsInterface
@Mock lateinit var fabricPrivacy: FabricPrivacy @Mock lateinit var fabricPrivacy: FabricPrivacy
@Mock lateinit var profileFunction: ProfileFunction @Mock lateinit var profileFunction: ProfileFunction
@Mock lateinit var defaultValueHelper: DefaultValueHelper @Mock lateinit var defaultValueHelper: DefaultValueHelper

View file

@ -852,7 +852,7 @@ class MedtronicPumpPlugin @Inject constructor(
//aapsLogger.debug(LTag.PUMP, "HST: Target Date: " + targetDate); //aapsLogger.debug(LTag.PUMP, "HST: Target Date: " + targetDate);
val responseTask2 = rileyLinkMedtronicService.medtronicUIComm.executeCommand(MedtronicCommandType.GetHistoryData, val responseTask2 = rileyLinkMedtronicService.medtronicUIComm.executeCommand(MedtronicCommandType.GetHistoryData,
arrayListOf(/*lastPumpHistoryEntry*/ null, targetDate) as ArrayList<Any>?) arrayListOf(/*lastPumpHistoryEntry*/ null, targetDate) as? ArrayList<Any>?)
if (debugHistory) aapsLogger.debug(LTag.PUMP, "HST: After task") if (debugHistory) aapsLogger.debug(LTag.PUMP, "HST: After task")
val historyResult = responseTask2.result as PumpHistoryResult? val historyResult = responseTask2.result as PumpHistoryResult?
if (debugHistory) aapsLogger.debug(LTag.PUMP, "HST: History Result: " + historyResult.toString()) if (debugHistory) aapsLogger.debug(LTag.PUMP, "HST: History Result: " + historyResult.toString())

View file

@ -4,9 +4,7 @@ import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.data.DetailedBolusInfo import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.db.*
import info.nightscout.androidaps.interfaces.ActivePlugin import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
import info.nightscout.androidaps.interfaces.PumpSync import info.nightscout.androidaps.interfaces.PumpSync
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
@ -49,7 +47,6 @@ class MedtronicHistoryData @Inject constructor(
val medtronicUtil: MedtronicUtil, val medtronicUtil: MedtronicUtil,
val medtronicPumpHistoryDecoder: MedtronicPumpHistoryDecoder, val medtronicPumpHistoryDecoder: MedtronicPumpHistoryDecoder,
val medtronicPumpStatus: MedtronicPumpStatus, val medtronicPumpStatus: MedtronicPumpStatus,
val databaseHelper: DatabaseHelperInterface,
val pumpSync: PumpSync, val pumpSync: PumpSync,
val pumpSyncStorage: info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncStorage val pumpSyncStorage: info.nightscout.androidaps.plugins.pump.common.sync.PumpSyncStorage
) { ) {
@ -81,7 +78,7 @@ class MedtronicHistoryData @Inject constructor(
if (entryByPumpId != null && entryByPumpId.hasBolusChanged(validEntry)) { if (entryByPumpId != null && entryByPumpId.hasBolusChanged(validEntry)) {
newEntries.add(validEntry) newEntries.add(validEntry)
allHistory.remove(entryByPumpId) allHistory.remove(entryByPumpId)
allPumpIds.remove(validEntry.pumpId); allPumpIds.remove(validEntry.pumpId)
} }
} }
} }
@ -479,11 +476,11 @@ class MedtronicHistoryData @Inject constructor(
if (bolusDTO.bolusType == PumpBolusType.Extended) { if (bolusDTO.bolusType == PumpBolusType.Extended) {
addExtendedBolus(bolus, bolusDTO, multiwave) addExtendedBolus(bolus, bolusDTO, multiwave)
continue; continue
} else if (bolusDTO.bolusType == PumpBolusType.Multiwave) { } else if (bolusDTO.bolusType == PumpBolusType.Multiwave) {
multiwave = true multiwave = true
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "Multiwave bolus from pump, extended bolus and normal bolus will be added.")) aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "Multiwave bolus from pump, extended bolus and normal bolus will be added."))
addExtendedBolus(bolus, bolusDTO, multiwave); addExtendedBolus(bolus, bolusDTO, multiwave)
} }
val deliveredAmount: Double = if (multiwave) bolusDTO.immediateAmount!! else bolusDTO.deliveredAmount val deliveredAmount: Double = if (multiwave) bolusDTO.immediateAmount!! else bolusDTO.deliveredAmount

View file

@ -648,10 +648,12 @@ public class OmnipodErosPumpPlugin extends PumpPluginBase implements Pump, Riley
return deliverBolus(detailedBolusInfo); return deliverBolus(detailedBolusInfo);
} else { } else {
// no bolus required, carb only treatment // no bolus required, carb only treatment
activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, true); // activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, true);
return new PumpEnactResult(getInjector()).success(true).enacted(true).bolusDelivered(0d) // return new PumpEnactResult(getInjector()).success(true).enacted(true).bolusDelivered(0d)
.carbsDelivered(detailedBolusInfo.carbs); // .carbsDelivered(detailedBolusInfo.carbs);
// Needs refactor
throw new IllegalStateException("Not implemented");
} }
} }

View file

@ -16,14 +16,13 @@ import javax.inject.Singleton;
import dagger.android.HasAndroidInjector; import dagger.android.HasAndroidInjector;
import info.nightscout.androidaps.activities.ErrorHelperActivity; import info.nightscout.androidaps.activities.ErrorHelperActivity;
import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.OmnipodHistoryRecord; import info.nightscout.androidaps.db.OmnipodHistoryRecord;
import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.extensions.PumpStateExtensionKt; import info.nightscout.androidaps.extensions.PumpStateExtensionKt;
import info.nightscout.androidaps.interfaces.ActivePlugin; import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface; import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.interfaces.PumpSync; import info.nightscout.androidaps.interfaces.PumpSync;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
@ -97,7 +96,6 @@ public class AapsOmnipodErosManager {
private final ActivePlugin activePlugin; private final ActivePlugin activePlugin;
private final SP sp; private final SP sp;
private final OmnipodManager delegate; private final OmnipodManager delegate;
private final DatabaseHelperInterface databaseHelper;
private final OmnipodAlertUtil omnipodAlertUtil; private final OmnipodAlertUtil omnipodAlertUtil;
private final Context context; private final Context context;
private final PumpSync pumpSync; private final PumpSync pumpSync;
@ -128,7 +126,6 @@ public class AapsOmnipodErosManager {
ResourceHelper resourceHelper, ResourceHelper resourceHelper,
HasAndroidInjector injector, HasAndroidInjector injector,
ActivePlugin activePlugin, ActivePlugin activePlugin,
DatabaseHelperInterface databaseHelper,
OmnipodAlertUtil omnipodAlertUtil, OmnipodAlertUtil omnipodAlertUtil,
Context context, Context context,
PumpSync pumpSync) { PumpSync pumpSync) {
@ -141,7 +138,6 @@ public class AapsOmnipodErosManager {
this.resourceHelper = resourceHelper; this.resourceHelper = resourceHelper;
this.injector = injector; this.injector = injector;
this.activePlugin = activePlugin; this.activePlugin = activePlugin;
this.databaseHelper = databaseHelper;
this.omnipodAlertUtil = omnipodAlertUtil; this.omnipodAlertUtil = omnipodAlertUtil;
this.context = context; this.context = context;
this.pumpSync = pumpSync; this.pumpSync = pumpSync;
@ -704,13 +700,15 @@ public class AapsOmnipodErosManager {
carbInfo.setCarbsTimestamp(detailedBolusInfo.getCarbsTimestamp()); carbInfo.setCarbsTimestamp(detailedBolusInfo.getCarbsTimestamp());
carbInfo.carbs = detailedBolusInfo.carbs; carbInfo.carbs = detailedBolusInfo.carbs;
carbInfo.setPumpType(PumpType.USER); carbInfo.setPumpType(PumpType.USER);
activePlugin.getActiveTreatments().addToHistoryTreatment(carbInfo, false); // activePlugin.getActiveTreatments().addToHistoryTreatment(carbInfo, false);
// Needs refactor
// remove carbs from bolusInfo to not trigger any unwanted code paths in // remove carbs from bolusInfo to not trigger any unwanted code paths in
// TreatmentsPlugin.addToHistoryTreatment() method // TreatmentsPlugin.addToHistoryTreatment() method
detailedBolusInfo.carbs = 0; detailedBolusInfo.carbs = 0;
} }
activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, false); // activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, false);
// Needs refactor
throw new IllegalStateException("Not implemented");
} }
public synchronized void createSuspendedFakeTbrIfNotExists() { public synchronized void createSuspendedFakeTbrIfNotExists() {
@ -749,8 +747,9 @@ public class AapsOmnipodErosManager {
public boolean hasSuspendedFakeTbr() { public boolean hasSuspendedFakeTbr() {
PumpSync.PumpState pumpState = pumpSync.expectedPumpState(); PumpSync.PumpState pumpState = pumpSync.expectedPumpState();
if (pumpState.getTemporaryBasal() != null && pumpState.getTemporaryBasal().getPumpId() != null) { if (pumpState.getTemporaryBasal() != null && pumpState.getTemporaryBasal().getPumpId() != null) {
OmnipodHistoryRecord historyRecord = databaseHelper.findOmnipodHistoryRecordByPumpId(pumpState.getTemporaryBasal().getPumpId()); // OmnipodHistoryRecord historyRecord = databaseHelper.findOmnipodHistoryRecordByPumpId(pumpState.getTemporaryBasal().getPumpId());
return historyRecord != null && PodHistoryEntryType.getByCode(historyRecord.getPodEntryTypeCode()).equals(PodHistoryEntryType.SET_FAKE_SUSPENDED_TEMPORARY_BASAL); // return historyRecord != null && PodHistoryEntryType.getByCode(historyRecord.getPodEntryTypeCode()).equals(PodHistoryEntryType.SET_FAKE_SUSPENDED_TEMPORARY_BASAL);
throw new IllegalStateException("Not implemented");
} }
return false; return false;
} }
@ -853,9 +852,9 @@ public class AapsOmnipodErosManager {
omnipodHistoryRecord.setSuccess(success); omnipodHistoryRecord.setSuccess(success);
omnipodHistoryRecord.setPodSerial(podStateManager.hasPodState() ? String.valueOf(podStateManager.getAddress()) : "None"); omnipodHistoryRecord.setPodSerial(podStateManager.hasPodState() ? String.valueOf(podStateManager.getAddress()) : "None");
databaseHelper.createOrUpdate(omnipodHistoryRecord); // databaseHelper.createOrUpdate(omnipodHistoryRecord);
// return omnipodHistoryRecord.getPumpId();
return omnipodHistoryRecord.getPumpId(); throw new IllegalStateException("Not implemented");
} }
private void executeCommand(Runnable runnable) { private void executeCommand(Runnable runnable) {

View file

@ -9,7 +9,6 @@ import org.apache.commons.lang3.StringUtils;
import javax.inject.Inject; import javax.inject.Inject;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpDeviceState; import info.nightscout.androidaps.plugins.pump.common.defs.PumpDeviceState;
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager; import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyLinkCommunicationManager;
@ -37,7 +36,6 @@ public class RileyLinkOmnipodService extends RileyLinkService {
@Inject OmnipodErosPumpPlugin omnipodErosPumpPlugin; @Inject OmnipodErosPumpPlugin omnipodErosPumpPlugin;
@Inject AapsOmnipodUtil aapsOmnipodUtil; @Inject AapsOmnipodUtil aapsOmnipodUtil;
@Inject PodStateManager podStateManager; @Inject PodStateManager podStateManager;
@Inject DatabaseHelperInterface databaseHelper;
@Inject AapsOmnipodErosManager aapsOmnipodErosManager; @Inject AapsOmnipodErosManager aapsOmnipodErosManager;
@Inject OmnipodRileyLinkCommunicationManager omnipodRileyLinkCommunicationManager; @Inject OmnipodRileyLinkCommunicationManager omnipodRileyLinkCommunicationManager;

View file

@ -10,11 +10,10 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
@ -24,14 +23,13 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.db.OmnipodHistoryRecord; import info.nightscout.androidaps.db.OmnipodHistoryRecord;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface; import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup; import info.nightscout.androidaps.plugins.pump.common.defs.PumpHistoryEntryGroup;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType; import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
import info.nightscout.androidaps.plugins.pump.common.defs.TempBasalPair;
import info.nightscout.androidaps.plugins.pump.common.utils.ProfileUtil; import info.nightscout.androidaps.plugins.pump.common.utils.ProfileUtil;
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R; import info.nightscout.androidaps.plugins.pump.omnipod.eros.R;
import info.nightscout.androidaps.plugins.pump.omnipod.eros.definition.PodHistoryEntryType; import info.nightscout.androidaps.plugins.pump.omnipod.eros.definition.PodHistoryEntryType;
@ -43,7 +41,6 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
@Inject AAPSLogger aapsLogger; @Inject AAPSLogger aapsLogger;
@Inject AapsOmnipodUtil aapsOmnipodUtil; @Inject AapsOmnipodUtil aapsOmnipodUtil;
@Inject ResourceHelper resourceHelper; @Inject ResourceHelper resourceHelper;
@Inject DatabaseHelperInterface databaseHelper;
private Spinner historyTypeSpinner; private Spinner historyTypeSpinner;
private TextView statusView; private TextView statusView;
@ -69,9 +66,9 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
GregorianCalendar gc = new GregorianCalendar(); GregorianCalendar gc = new GregorianCalendar();
gc.add(Calendar.HOUR_OF_DAY, -24); gc.add(Calendar.HOUR_OF_DAY, -24);
databaseHelper.getAllOmnipodHistoryRecordsFromTimestamp(gc.getTimeInMillis(), false); // databaseHelper.getAllOmnipodHistoryRecordsFromTimestamp(gc.getTimeInMillis(), false);
// fullHistoryList.addAll(databaseHelper.getAllOmnipodHistoryRecordsFromTimestamp(gc.getTimeInMillis(), true));
fullHistoryList.addAll(databaseHelper.getAllOmnipodHistoryRecordsFromTimestamp(gc.getTimeInMillis(), true)); throw new IllegalStateException("Not implemented");
} }