Source plugins injection

This commit is contained in:
Milos Kozak 2019-12-30 23:26:48 +01:00
parent 348936e1b8
commit 1242236821
34 changed files with 746 additions and 936 deletions

View file

@ -81,15 +81,15 @@ import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin;
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.NSClientSourcePlugin;
import info.nightscout.androidaps.plugins.source.RandomBgPlugin; import info.nightscout.androidaps.plugins.source.RandomBgPlugin;
import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin; import info.nightscout.androidaps.plugins.source.DexcomPlugin;
import info.nightscout.androidaps.plugins.source.SourceEversensePlugin; import info.nightscout.androidaps.plugins.source.EversensePlugin;
import info.nightscout.androidaps.plugins.source.SourceGlimpPlugin; import info.nightscout.androidaps.plugins.source.GlimpPlugin;
import info.nightscout.androidaps.plugins.source.SourceMM640gPlugin; import info.nightscout.androidaps.plugins.source.MM640gPlugin;
import info.nightscout.androidaps.plugins.source.SourceNSClientPlugin; import info.nightscout.androidaps.plugins.source.PoctechPlugin;
import info.nightscout.androidaps.plugins.source.SourcePoctechPlugin; import info.nightscout.androidaps.plugins.source.TomatoPlugin;
import info.nightscout.androidaps.plugins.source.SourceTomatoPlugin; import info.nightscout.androidaps.plugins.source.XdripPlugin;
import info.nightscout.androidaps.plugins.source.SourceXdripPlugin;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.receivers.DataReceiver; import info.nightscout.androidaps.receivers.DataReceiver;
import info.nightscout.androidaps.receivers.KeepAliveReceiver; import info.nightscout.androidaps.receivers.KeepAliveReceiver;
@ -149,6 +149,14 @@ public class MainApp extends DaggerApplication {
@Inject OpenAPSSMBPlugin openAPSSMBPlugin; @Inject OpenAPSSMBPlugin openAPSSMBPlugin;
@Inject OverviewPlugin overviewPlugin; @Inject OverviewPlugin overviewPlugin;
@Inject RandomBgPlugin randomBgPlugin; @Inject RandomBgPlugin randomBgPlugin;
@Inject DexcomPlugin dexcomPlugin;
@Inject EversensePlugin eversensePlugin;
@Inject GlimpPlugin glimpPlugin;
@Inject MM640gPlugin mM640GPlugin;
@Inject NSClientSourcePlugin nSClientSourcePlugin;
@Inject PoctechPlugin poctechPlugin;
@Inject TomatoPlugin tomatoPlugin;
@Inject XdripPlugin xdripPlugin;
@Inject StatusLinePlugin statusLinePlugin; @Inject StatusLinePlugin statusLinePlugin;
@Inject TidepoolPlugin tidepoolPlugin; @Inject TidepoolPlugin tidepoolPlugin;
@Inject TreatmentsPlugin treatmentsPlugin; @Inject TreatmentsPlugin treatmentsPlugin;
@ -239,14 +247,14 @@ public class MainApp extends DaggerApplication {
if (Config.APS) pluginsList.add(StorageConstraintPlugin.getPlugin()); if (Config.APS) pluginsList.add(StorageConstraintPlugin.getPlugin());
if (Config.APS) pluginsList.add(SignatureVerifierPlugin.getPlugin()); if (Config.APS) pluginsList.add(SignatureVerifierPlugin.getPlugin());
if (Config.APS) pluginsList.add(objectivesPlugin); if (Config.APS) pluginsList.add(objectivesPlugin);
pluginsList.add(SourceXdripPlugin.getPlugin()); pluginsList.add(xdripPlugin);
pluginsList.add(SourceNSClientPlugin.getPlugin()); pluginsList.add(nSClientSourcePlugin);
pluginsList.add(SourceMM640gPlugin.getPlugin()); pluginsList.add(mM640GPlugin);
pluginsList.add(SourceGlimpPlugin.getPlugin()); pluginsList.add(glimpPlugin);
pluginsList.add(SourceDexcomPlugin.INSTANCE); pluginsList.add(dexcomPlugin);
pluginsList.add(SourcePoctechPlugin.getPlugin()); pluginsList.add(poctechPlugin);
pluginsList.add(SourceTomatoPlugin.getPlugin()); pluginsList.add(tomatoPlugin);
pluginsList.add(SourceEversensePlugin.getPlugin()); pluginsList.add(eversensePlugin);
pluginsList.add(randomBgPlugin); pluginsList.add(randomBgPlugin);
if (!Config.NSCLIENT) pluginsList.add(smsCommunicatorPlugin); if (!Config.NSCLIENT) pluginsList.add(smsCommunicatorPlugin);
pluginsList.add(FoodPlugin.getPlugin()); pluginsList.add(FoodPlugin.getPlugin());

View file

@ -39,7 +39,11 @@ import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin;
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.SourceDexcomPlugin; import info.nightscout.androidaps.plugins.source.DexcomPlugin;
import info.nightscout.androidaps.plugins.source.EversensePlugin;
import info.nightscout.androidaps.plugins.source.GlimpPlugin;
import info.nightscout.androidaps.plugins.source.PoctechPlugin;
import info.nightscout.androidaps.plugins.source.TomatoPlugin;
/** /**
* Created by adrian on 2019-12-23. * Created by adrian on 2019-12-23.
@ -61,6 +65,11 @@ public class MyPreferenceFragment extends PreferenceFragment implements HasAndro
@Inject OpenAPSMAPlugin openAPSMAPlugin; @Inject OpenAPSMAPlugin openAPSMAPlugin;
@Inject OpenAPSSMBPlugin openAPSSMBPlugin; @Inject OpenAPSSMBPlugin openAPSSMBPlugin;
@Inject SafetyPlugin safetyPlugin; @Inject SafetyPlugin safetyPlugin;
@Inject DexcomPlugin dexcomPlugin;
@Inject EversensePlugin eversensePlugin;
@Inject GlimpPlugin glimpPlugin;
@Inject PoctechPlugin poctechPlugin;
@Inject TomatoPlugin tomatoPlugin;
@Inject SmsCommunicatorPlugin smsCommunicatorPlugin; @Inject SmsCommunicatorPlugin smsCommunicatorPlugin;
@Inject StatusLinePlugin statusLinePlugin; @Inject StatusLinePlugin statusLinePlugin;
@Inject TidepoolPlugin tidepoolPlugin; @Inject TidepoolPlugin tidepoolPlugin;
@ -105,7 +114,11 @@ public class MyPreferenceFragment extends PreferenceFragment implements HasAndro
addPreferencesFromResource(R.xml.pref_overview); addPreferencesFromResource(R.xml.pref_overview);
addPreferencesFromResourceIfEnabled(SourceDexcomPlugin.INSTANCE, PluginType.BGSOURCE); addPreferencesFromResourceIfEnabled(eversensePlugin, PluginType.BGSOURCE);
addPreferencesFromResourceIfEnabled(dexcomPlugin, PluginType.BGSOURCE);
addPreferencesFromResourceIfEnabled(tomatoPlugin, PluginType.BGSOURCE);
addPreferencesFromResourceIfEnabled(poctechPlugin, PluginType.BGSOURCE);
addPreferencesFromResourceIfEnabled(glimpPlugin, PluginType.BGSOURCE);
addPreferencesFromResourceIfEnabled(careportalPlugin, PluginType.GENERAL); addPreferencesFromResourceIfEnabled(careportalPlugin, PluginType.GENERAL);
addPreferencesFromResourceIfEnabled(safetyPlugin, PluginType.CONSTRAINTS); addPreferencesFromResourceIfEnabled(safetyPlugin, PluginType.CONSTRAINTS);
if (Config.APS) { if (Config.APS) {

View file

@ -1,15 +1,17 @@
package info.nightscout.androidaps.activities package info.nightscout.androidaps.activities
import android.os.Bundle import android.os.Bundle
import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin import info.nightscout.androidaps.plugins.source.DexcomPlugin
import javax.inject.Inject
class RequestDexcomPermissionActivity : NoSplashAppCompatActivity() { class RequestDexcomPermissionActivity : NoSplashAppCompatActivity() {
@Inject lateinit var dexcomPlugin: DexcomPlugin
private val requestCode = "AndroidAPS <3".map { it.toInt() }.sum() private val requestCode = "AndroidAPS <3".map { it.toInt() }.sum()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
requestPermissions(arrayOf(SourceDexcomPlugin.PERMISSION), requestCode) requestPermissions(arrayOf(dexcomPlugin.PERMISSION), requestCode)
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {

View file

@ -25,7 +25,7 @@ import info.nightscout.androidaps.utils.sharedPreferences.SPImplementation
import javax.inject.Singleton import javax.inject.Singleton
@Module(includes = [AppModule.AppBindings::class]) @Module(includes = [AppModule.AppBindings::class])
class AppModule { open class AppModule {
@Provides @Provides
@Singleton @Singleton

View file

@ -136,6 +136,7 @@ public class ProfileFunctions implements ProfileFunction {
} }
@NotNull @NotNull
@Deprecated
public static String getSystemUnits() { public static String getSystemUnits() {
return SP.getString(R.string.key_units, Constants.MGDL); return SP.getString(R.string.key_units, Constants.MGDL);
} }

View file

@ -87,7 +87,6 @@ import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.aps.loop.APSResult; import info.nightscout.androidaps.plugins.aps.loop.APSResult;
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin; import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin;
import info.nightscout.androidaps.plugins.aps.loop.events.EventNewOpenLoopNotification; import info.nightscout.androidaps.plugins.aps.loop.events.EventNewOpenLoopNotification;
import info.nightscout.androidaps.plugins.bus.RxBus;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
@ -106,8 +105,8 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress;
import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin; import info.nightscout.androidaps.plugins.source.DexcomPlugin;
import info.nightscout.androidaps.plugins.source.SourceXdripPlugin; import info.nightscout.androidaps.plugins.source.XdripPlugin;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback; import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.utils.BolusWizard; import info.nightscout.androidaps.utils.BolusWizard;
@ -139,6 +138,8 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
@Inject ConfigBuilderPlugin configBuilderPlugin; @Inject ConfigBuilderPlugin configBuilderPlugin;
@Inject TreatmentsPlugin treatmentsPlugin; @Inject TreatmentsPlugin treatmentsPlugin;
@Inject IobCobCalculatorPlugin iobCobCalculatorPlugin; @Inject IobCobCalculatorPlugin iobCobCalculatorPlugin;
@Inject DexcomPlugin dexcomPlugin;
@Inject XdripPlugin xdripPlugin;
@Inject NotificationStore notificationStore; @Inject NotificationStore notificationStore;
private CompositeDisposable disposable = new CompositeDisposable(); private CompositeDisposable disposable = new CompositeDisposable();
@ -818,8 +819,8 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
@Override @Override
public void onClick(View v) { public void onClick(View v) {
boolean xdrip = SourceXdripPlugin.getPlugin().isEnabled(PluginType.BGSOURCE); boolean xdrip = xdripPlugin.isEnabled(PluginType.BGSOURCE);
boolean dexcom = SourceDexcomPlugin.INSTANCE.isEnabled(PluginType.BGSOURCE); boolean dexcom = dexcomPlugin.isEnabled(PluginType.BGSOURCE);
FragmentManager manager = getFragmentManager(); FragmentManager manager = getFragmentManager();
// try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days // try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days
@ -843,7 +844,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
calibrationDialog.show(manager, "CalibrationDialog"); calibrationDialog.show(manager, "CalibrationDialog");
} else if (dexcom) { } else if (dexcom) {
try { try {
String packageName = SourceDexcomPlugin.INSTANCE.findDexcomPackageName(); String packageName = dexcomPlugin.findDexcomPackageName();
if (packageName != null) { if (packageName != null) {
Intent i = new Intent("com.dexcom.cgm.activities.MeterEntryActivity"); Intent i = new Intent("com.dexcom.cgm.activities.MeterEntryActivity");
i.setPackage(packageName); i.setPackage(packageName);
@ -860,7 +861,7 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
if (xdrip) if (xdrip)
openCgmApp("com.eveningoutpost.dexdrip"); openCgmApp("com.eveningoutpost.dexdrip");
else if (dexcom) { else if (dexcom) {
String packageName = SourceDexcomPlugin.INSTANCE.findDexcomPackageName(); String packageName = dexcomPlugin.findDexcomPackageName();
if (packageName != null) { if (packageName != null) {
openCgmApp(packageName); openCgmApp(packageName);
} else { } else {
@ -1139,8 +1140,8 @@ public class OverviewFragment extends DaggerFragment implements View.OnClickList
} }
// **** Calibration & CGM buttons **** // **** Calibration & CGM buttons ****
boolean xDripIsBgSource = SourceXdripPlugin.getPlugin().isEnabled(PluginType.BGSOURCE); boolean xDripIsBgSource = xdripPlugin.isEnabled(PluginType.BGSOURCE);
boolean dexcomIsSource = SourceDexcomPlugin.INSTANCE.isEnabled(PluginType.BGSOURCE); boolean dexcomIsSource = dexcomPlugin.isEnabled(PluginType.BGSOURCE);
boolean bgAvailable = DatabaseHelper.actualBg() != null; boolean bgAvailable = DatabaseHelper.actualBg() != null;
if (calibrationButton != null) { if (calibrationButton != null) {
if ((xDripIsBgSource || dexcomIsSource) && bgAvailable && sp.getBoolean(R.string.key_show_calibration_button, true)) { if ((xDripIsBgSource || dexcomIsSource) && bgAvailable && sp.getBoolean(R.string.key_show_calibration_button, true)) {

View file

@ -1,150 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import javax.inject.Inject;
import dagger.android.support.DaggerFragment;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.OKDialog;
import info.nightscout.androidaps.utils.T;
import info.nightscout.androidaps.utils.resources.ResourceHelper;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
/**
* Created by mike on 16.10.2017.
*/
public class BGSourceFragment extends DaggerFragment {
@Inject RxBusWrapper rxBus;
@Inject ResourceHelper resourceHelper;
private CompositeDisposable disposable = new CompositeDisposable();
private RecyclerView recyclerView;
private final long MILLS_TO_THE_PAST = T.hours(12).msecs();
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
try {
View view = inflater.inflate(R.layout.bgsource_fragment, container, false);
recyclerView = view.findViewById(R.id.bgsource_recyclerview);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(view.getContext());
recyclerView.setLayoutManager(llm);
long now = System.currentTimeMillis();
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false));
recyclerView.setAdapter(adapter);
return view;
} catch (Exception e) {
FabricPrivacy.logException(e);
}
return null;
}
@Override
public synchronized void onResume() {
super.onResume();
disposable.add(rxBus
.toObservable(EventAutosensCalculationFinished.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(event -> updateGUI(), FabricPrivacy::logException)
);
}
@Override
public synchronized void onPause() {
disposable.clear();
super.onPause();
}
protected void updateGUI() {
long now = System.currentTimeMillis();
recyclerView.swapAdapter(new RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false)), true);
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.BgReadingsViewHolder> {
List<BgReading> bgReadings;
RecyclerViewAdapter(List<BgReading> bgReadings) {
this.bgReadings = bgReadings;
}
@NonNull
@Override
public BgReadingsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.bgsource_item, viewGroup, false);
return new BgReadingsViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull BgReadingsViewHolder holder, int position) {
BgReading bgReading = bgReadings.get(position);
holder.ns.setVisibility(NSUpload.isIdValid(bgReading._id) ? View.VISIBLE : View.GONE);
holder.invalid.setVisibility(!bgReading.isValid ? View.VISIBLE : View.GONE);
holder.date.setText(DateUtil.dateAndTimeString(bgReading.date));
holder.value.setText(bgReading.valueToUnitsToString(ProfileFunctions.getSystemUnits()));
holder.direction.setText(bgReading.directionToSymbol());
holder.remove.setTag(bgReading);
}
@Override
public int getItemCount() {
return bgReadings.size();
}
class BgReadingsViewHolder extends RecyclerView.ViewHolder {
TextView date;
TextView value;
TextView direction;
TextView invalid;
TextView ns;
TextView remove;
BgReadingsViewHolder(View itemView) {
super(itemView);
date = itemView.findViewById(R.id.bgsource_date);
value = itemView.findViewById(R.id.bgsource_value);
direction = itemView.findViewById(R.id.bgsource_direction);
invalid = itemView.findViewById(R.id.invalid_sign);
ns = itemView.findViewById(R.id.ns_sign);
remove = itemView.findViewById(R.id.bgsource_remove);
remove.setOnClickListener(v -> {
final BgReading bgReading = (BgReading) v.getTag();
OKDialog.showConfirmation(getContext(), resourceHelper.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(ProfileFunctions.getSystemUnits()), () -> {
bgReading.isValid = false;
MainApp.getDbHelper().update(bgReading);
updateGUI();
});
});
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
}
}
}
}

View file

@ -0,0 +1,117 @@
package info.nightscout.androidaps.plugins.source
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished
import info.nightscout.androidaps.plugins.source.BGSourceFragment.RecyclerViewAdapter.BgReadingsViewHolder
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.OKDialog
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.resources.ResourceHelper
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.bgsource_fragment.*
import javax.inject.Inject
class BGSourceFragment : DaggerFragment() {
@Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var profileFunction: ProfileFunction
private val disposable = CompositeDisposable()
private val MILLS_TO_THE_PAST = T.hours(12).msecs()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.bgsource_fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
bgsource_recyclerview.setHasFixedSize(true)
bgsource_recyclerview.layoutManager = LinearLayoutManager(view.context)
val now = System.currentTimeMillis()
bgsource_recyclerview.adapter = RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false))
}
@Synchronized
override fun onResume() {
super.onResume()
disposable.add(rxBus
.toObservable(EventAutosensCalculationFinished::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ updateGUI() }) { FabricPrivacy.logException(it) }
)
}
@Synchronized
override fun onPause() {
disposable.clear()
super.onPause()
}
private fun updateGUI() {
val now = System.currentTimeMillis()
bgsource_recyclerview?.swapAdapter(RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false)), true)
}
inner class RecyclerViewAdapter internal constructor(private var bgReadings: List<BgReading>) : RecyclerView.Adapter<BgReadingsViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): BgReadingsViewHolder {
val v = LayoutInflater.from(viewGroup.context).inflate(R.layout.bgsource_item, viewGroup, false)
return BgReadingsViewHolder(v)
}
override fun onBindViewHolder(holder: BgReadingsViewHolder, position: Int) {
val bgReading = bgReadings[position]
holder.ns.visibility = if (NSUpload.isIdValid(bgReading._id)) View.VISIBLE else View.GONE
holder.invalid.visibility = if (!bgReading.isValid) View.VISIBLE else View.GONE
holder.date.text = DateUtil.dateAndTimeString(bgReading.date)
holder.value.text = bgReading.valueToUnitsToString(profileFunction.getUnits())
holder.direction.text = bgReading.directionToSymbol()
holder.remove.tag = bgReading
}
override fun getItemCount(): Int {
return bgReadings.size
}
inner class BgReadingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var date: TextView = itemView.findViewById(R.id.bgsource_date)
var value: TextView = itemView.findViewById(R.id.bgsource_value)
var direction: TextView = itemView.findViewById(R.id.bgsource_direction)
var invalid: TextView = itemView.findViewById(R.id.invalid_sign)
var ns: TextView = itemView.findViewById(R.id.ns_sign)
var remove: TextView = itemView.findViewById(R.id.bgsource_remove)
init {
remove.setOnClickListener { v: View ->
val bgReading = v.tag as BgReading
activity?.let { activity ->
val text = DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profileFunction.getUnits())
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.removerecord), text, Runnable {
bgReading.isValid = false
MainApp.getDbHelper().update(bgReading)
updateGUI()
})
}
}
remove.paintFlags = remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
}
}
}

View file

@ -13,30 +13,34 @@ import info.nightscout.androidaps.interfaces.BgSourceInterface
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.L import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.T
import org.json.JSONObject import org.json.JSONObject
import org.slf4j.LoggerFactory import javax.inject.Inject
import javax.inject.Singleton
object SourceDexcomPlugin : PluginBase(PluginDescription() @Singleton
class DexcomPlugin @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP,
private val mainApp: MainApp
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE) .mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name) .fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.dexcom_app_patched) .pluginName(R.string.dexcom_app_patched)
.shortName(R.string.dexcom_short) .shortName(R.string.dexcom_short)
.preferencesId(R.xml.pref_bgsource) .preferencesId(R.xml.pref_bgsourcedexcom)
.description(R.string.description_source_dexcom)), BgSourceInterface { .description(R.string.description_source_dexcom)), BgSourceInterface {
private val log = LoggerFactory.getLogger(L.BGSOURCE)
private val PACKAGE_NAMES = arrayOf("com.dexcom.cgm.region1.mgdl", "com.dexcom.cgm.region1.mmol", private val PACKAGE_NAMES = arrayOf("com.dexcom.cgm.region1.mgdl", "com.dexcom.cgm.region1.mmol",
"com.dexcom.cgm.region2.mgdl", "com.dexcom.cgm.region2.mmol", "com.dexcom.cgm.region2.mgdl", "com.dexcom.cgm.region2.mmol",
"com.dexcom.g6.region1.mmol", "com.dexcom.g6.region2.mgdl", "com.dexcom.g6.region1.mmol", "com.dexcom.g6.region2.mgdl",
"com.dexcom.g6.region3.mgdl", "com.dexcom.g6.region3.mmol") "com.dexcom.g6.region3.mgdl", "com.dexcom.g6.region3.mmol")
const val PERMISSION = "com.dexcom.cgm.EXTERNAL_PERMISSION" val PERMISSION = "com.dexcom.cgm.EXTERNAL_PERMISSION"
override fun advancedFilteringSupported(): Boolean { override fun advancedFilteringSupported(): Boolean {
return true return true
@ -44,15 +48,15 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
if (ContextCompat.checkSelfPermission(MainApp.instance(), PERMISSION) != PackageManager.PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(mainApp, PERMISSION) != PackageManager.PERMISSION_GRANTED) {
val intent = Intent(MainApp.instance(), RequestDexcomPermissionActivity::class.java) val intent = Intent(mainApp, RequestDexcomPermissionActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
MainApp.instance().startActivity(intent) mainApp.startActivity(intent)
} }
} }
fun findDexcomPackageName(): String? { fun findDexcomPackageName(): String? {
val packageManager = MainApp.instance().packageManager val packageManager = mainApp.packageManager
for (packageInfo in packageManager.getInstalledPackages(0)) { for (packageInfo in packageManager.getInstalledPackages(0)) {
if (PACKAGE_NAMES.contains(packageInfo.packageName)) return packageInfo.packageName if (PACKAGE_NAMES.contains(packageInfo.packageName)) return packageInfo.packageName
} }
@ -72,10 +76,10 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
bgReading.date = glucoseValue.getLong("timestamp") * 1000 bgReading.date = glucoseValue.getLong("timestamp") * 1000
bgReading.raw = 0.0 bgReading.raw = 0.0
if (MainApp.getDbHelper().createIfNotExists(bgReading, "Dexcom$sensorType")) { if (MainApp.getDbHelper().createIfNotExists(bgReading, "Dexcom$sensorType")) {
if (SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) { if (sp.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Dexcom$sensorType") NSUpload.uploadBg(bgReading, "AndroidAPS-Dexcom$sensorType")
} }
if (SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) { if (sp.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading) NSUpload.sendToXdrip(bgReading)
} }
} }
@ -100,7 +104,7 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
} }
} }
} }
if (SP.getBoolean(R.string.key_dexcom_lognssensorchange, false) && intent.hasExtra("sensorInsertionTime")) { if (sp.getBoolean(R.string.key_dexcom_lognssensorchange, false) && intent.hasExtra("sensorInsertionTime")) {
intent.extras?.let { intent.extras?.let {
val sensorInsertionTime = it.getLong("sensorInsertionTime") * 1000 val sensorInsertionTime = it.getLong("sensorInsertionTime") * 1000
val now = DateUtil.now() val now = DateUtil.now()
@ -115,7 +119,7 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
log.error("Error while processing intent from Dexcom App", e) aapsLogger.error("Error while processing intent from Dexcom App", e)
} }
} }
} }

View file

@ -0,0 +1,117 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.db.CareportalEvent
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.L
import info.nightscout.androidaps.logging.L.isEnabled
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.json.JSONException
import org.json.JSONObject
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class EversensePlugin @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.eversense)
.shortName(R.string.eversense_shortname)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_eversense)
), BgSourceInterface {
override fun advancedFilteringSupported(): Boolean {
return false
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
if (isEnabled(L.BGSOURCE)) {
if (bundle.containsKey("currentCalibrationPhase")) aapsLogger.debug(LTag.BGSOURCE, "currentCalibrationPhase: " + bundle.getString("currentCalibrationPhase"))
if (bundle.containsKey("placementModeInProgress")) aapsLogger.debug(LTag.BGSOURCE, "placementModeInProgress: " + bundle.getBoolean("placementModeInProgress"))
if (bundle.containsKey("glucoseLevel")) aapsLogger.debug(LTag.BGSOURCE, "glucoseLevel: " + bundle.getInt("glucoseLevel"))
if (bundle.containsKey("glucoseTrendDirection")) aapsLogger.debug(LTag.BGSOURCE, "glucoseTrendDirection: " + bundle.getString("glucoseTrendDirection"))
if (bundle.containsKey("glucoseTimestamp")) aapsLogger.debug(LTag.BGSOURCE, "glucoseTimestamp: " + DateUtil.dateAndTimeFullString(bundle.getLong("glucoseTimestamp")))
if (bundle.containsKey("batteryLevel")) aapsLogger.debug(LTag.BGSOURCE, "batteryLevel: " + bundle.getString("batteryLevel"))
if (bundle.containsKey("signalStrength")) aapsLogger.debug(LTag.BGSOURCE, "signalStrength: " + bundle.getString("signalStrength"))
if (bundle.containsKey("transmitterVersionNumber")) aapsLogger.debug(LTag.BGSOURCE, "transmitterVersionNumber: " + bundle.getString("transmitterVersionNumber"))
if (bundle.containsKey("isXLVersion")) aapsLogger.debug(LTag.BGSOURCE, "isXLVersion: " + bundle.getBoolean("isXLVersion"))
if (bundle.containsKey("transmitterModelNumber")) aapsLogger.debug(LTag.BGSOURCE, "transmitterModelNumber: " + bundle.getString("transmitterModelNumber"))
if (bundle.containsKey("transmitterSerialNumber")) aapsLogger.debug(LTag.BGSOURCE, "transmitterSerialNumber: " + bundle.getString("transmitterSerialNumber"))
if (bundle.containsKey("transmitterAddress")) aapsLogger.debug(LTag.BGSOURCE, "transmitterAddress: " + bundle.getString("transmitterAddress"))
if (bundle.containsKey("sensorInsertionTimestamp")) aapsLogger.debug(LTag.BGSOURCE, "sensorInsertionTimestamp: " + DateUtil.dateAndTimeFullString(bundle.getLong("sensorInsertionTimestamp")))
if (bundle.containsKey("transmitterVersionNumber")) aapsLogger.debug(LTag.BGSOURCE, "transmitterVersionNumber: " + bundle.getString("transmitterVersionNumber"))
if (bundle.containsKey("transmitterConnectionState")) aapsLogger.debug(LTag.BGSOURCE, "transmitterConnectionState: " + bundle.getString("transmitterConnectionState"))
}
if (bundle.containsKey("glucoseLevels")) {
val glucoseLevels = bundle.getIntArray("glucoseLevels")
val glucoseRecordNumbers = bundle.getIntArray("glucoseRecordNumbers")
val glucoseTimestamps = bundle.getLongArray("glucoseTimestamps")
if (glucoseLevels != null && glucoseRecordNumbers != null && glucoseTimestamps != null) {
if (isEnabled(L.BGSOURCE)) {
aapsLogger.debug(LTag.BGSOURCE, "glucoseLevels" + Arrays.toString(glucoseLevels))
aapsLogger.debug(LTag.BGSOURCE, "glucoseRecordNumbers" + Arrays.toString(glucoseRecordNumbers))
aapsLogger.debug(LTag.BGSOURCE, "glucoseTimestamps" + Arrays.toString(glucoseTimestamps))
}
for (i in glucoseLevels.indices) {
val bgReading = BgReading()
bgReading.value = glucoseLevels[i].toDouble()
bgReading.date = glucoseTimestamps[i]
bgReading.raw = 0.0
val isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Eversense")
if (isNew && sp.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Eversense")
}
if (isNew && sp.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading)
}
}
}
}
if (bundle.containsKey("calibrationGlucoseLevels")) {
val calibrationGlucoseLevels = bundle.getIntArray("calibrationGlucoseLevels")
val calibrationTimestamps = bundle.getLongArray("calibrationTimestamps")
val calibrationRecordNumbers = bundle.getLongArray("calibrationRecordNumbers")
if (calibrationGlucoseLevels != null && calibrationTimestamps != null && calibrationRecordNumbers != null) {
if (isEnabled(L.BGSOURCE)) {
aapsLogger.debug(LTag.BGSOURCE, "calibrationGlucoseLevels" + Arrays.toString(calibrationGlucoseLevels))
aapsLogger.debug(LTag.BGSOURCE, "calibrationTimestamps" + Arrays.toString(calibrationTimestamps))
aapsLogger.debug(LTag.BGSOURCE, "calibrationRecordNumbers" + Arrays.toString(calibrationRecordNumbers))
}
for (i in calibrationGlucoseLevels.indices) {
try {
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(calibrationTimestamps[i]) == null) {
val data = JSONObject()
data.put("enteredBy", "AndroidAPS-Eversense")
data.put("created_at", DateUtil.toISOString(calibrationTimestamps[i]))
data.put("eventType", CareportalEvent.BGCHECK)
data.put("glucoseType", "Finger")
data.put("glucose", calibrationGlucoseLevels[i])
data.put("units", Constants.MGDL)
NSUpload.uploadCareportalEntryToNS(data)
}
} catch (e: JSONException) {
aapsLogger.error("Unhandled exception", e)
}
}
}
}
}
}

View file

@ -0,0 +1,43 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.BundleLogger
import info.nightscout.androidaps.logging.LTag
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class GlimpPlugin @Inject constructor(
private val aapsLogger: AAPSLogger
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.Glimp)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_glimp)
), BgSourceInterface {
override fun advancedFilteringSupported(): Boolean {
return false
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
aapsLogger.debug(LTag.BGSOURCE, "Received Glimp Data: ${BundleLogger.log(bundle)}")
val bgReading = BgReading()
bgReading.value = bundle.getDouble("mySGV")
bgReading.direction = bundle.getString("myTrend")
bgReading.date = bundle.getLong("myTimestamp")
bgReading.raw = 0.0
MainApp.getDbHelper().createIfNotExists(bgReading, "GLIMP")
}
}

View file

@ -0,0 +1,64 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import org.json.JSONArray
import org.json.JSONException
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class MM640gPlugin @Inject constructor(
private val aapsLogger: AAPSLogger
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.MM640g)
.description(R.string.description_source_mm640g)
), BgSourceInterface {
override fun advancedFilteringSupported(): Boolean {
return false
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
val collection = bundle.getString("collection") ?: return
if (collection == "entries") {
val data = bundle.getString("data")
aapsLogger.debug(LTag.BGSOURCE, "Received MM640g Data: $data")
if (data != null && data.isNotEmpty()) {
try {
val jsonArray = JSONArray(data)
for (i in 0 until jsonArray.length()) {
val json_object = jsonArray.getJSONObject(i)
val type = json_object.getString("type")
when (type) {
"sgv" -> {
val bgReading = BgReading()
bgReading.value = json_object.getDouble("sgv")
bgReading.direction = json_object.getString("direction")
bgReading.date = json_object.getLong("date")
bgReading.raw = json_object.getDouble("sgv")
MainApp.getDbHelper().createIfNotExists(bgReading, "MM640g")
}
else -> aapsLogger.debug(LTag.BGSOURCE, "Unknown entries type: $type")
}
}
} catch (e: JSONException) {
aapsLogger.error("Exception: ", e)
}
}
}
}
}

View file

@ -0,0 +1,79 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSgv
import info.nightscout.androidaps.utils.JsonHelper.safeGetLong
import info.nightscout.androidaps.utils.JsonHelper.safeGetString
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.json.JSONArray
import org.json.JSONObject
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class NSClientSourcePlugin @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.nsclientbg)
.description(R.string.description_source_ns_client)
), BgSourceInterface {
private var lastBGTimeStamp: Long = 0
private var isAdvancedFilteringEnabled = false
override fun advancedFilteringSupported(): Boolean {
return isAdvancedFilteringEnabled
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE) && !sp.getBoolean(R.string.key_ns_autobackfill, true)) return
val bundles = intent.extras ?: return
try {
if (bundles.containsKey("sgv")) {
val sgvstring = bundles.getString("sgv")
aapsLogger.debug(LTag.BGSOURCE, "Received NS Data: $sgvstring")
val sgvJson = JSONObject(sgvstring)
storeSgv(sgvJson)
}
if (bundles.containsKey("sgvs")) {
val sgvstring = bundles.getString("sgvs")
aapsLogger.debug(LTag.BGSOURCE, "Received NS Data: $sgvstring")
val jsonArray = JSONArray(sgvstring)
for (i in 0 until jsonArray.length()) {
val sgvJson = jsonArray.getJSONObject(i)
storeSgv(sgvJson)
}
}
} catch (e: Exception) {
aapsLogger.error("Unhandled exception", e)
}
// Objectives 0
sp.putBoolean(R.string.key_ObjectivesbgIsAvailableInNS, true)
}
private fun storeSgv(sgvJson: JSONObject) {
val nsSgv = NSSgv(sgvJson)
val bgReading = BgReading(nsSgv)
MainApp.getDbHelper().createIfNotExists(bgReading, "NS")
detectSource(safeGetString(sgvJson, "device", "none"), safeGetLong(sgvJson, "mills"))
}
fun detectSource(source: String, timeStamp: Long) {
if (timeStamp > lastBGTimeStamp) {
isAdvancedFilteringEnabled = source.contains("G5 Native") || source.contains("G6 Native") || source.contains("AndroidAPS-DexcomG5") || source.contains("AndroidAPS-DexcomG6")
lastBGTimeStamp = timeStamp
}
}
}

View file

@ -0,0 +1,66 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.utils.JsonHelper.safeGetString
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.json.JSONArray
import org.json.JSONException
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class PoctechPlugin @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.poctech)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_poctech)
), BgSourceInterface {
override fun advancedFilteringSupported(): Boolean {
return false
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
val bgReading = BgReading()
val data = bundle.getString("data")
aapsLogger.debug(LTag.BGSOURCE, "Received Poctech Data $data")
try {
val jsonArray = JSONArray(data)
aapsLogger.debug(LTag.BGSOURCE, "Received Poctech Data size:" + jsonArray.length())
for (i in 0 until jsonArray.length()) {
val json = jsonArray.getJSONObject(i)
bgReading.value = json.getDouble("current")
bgReading.direction = json.getString("direction")
bgReading.date = json.getLong("date")
bgReading.raw = json.getDouble("raw")
if (safeGetString(json, "units", Constants.MGDL) == "mmol/L") bgReading.value = bgReading.value * Constants.MMOLL_TO_MGDL
val isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Poctech")
if (isNew && sp.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Poctech")
}
if (isNew && sp.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading)
}
}
} catch (e: JSONException) {
aapsLogger.error("Exception: ", e)
}
}
}

View file

@ -1,155 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.SP;
/**
* Created by mike on 28.11.2017.
*/
public class SourceEversensePlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceEversensePlugin plugin = null;
@Deprecated
public static SourceEversensePlugin getPlugin() {
if (plugin == null)
plugin = new SourceEversensePlugin();
return plugin;
}
private SourceEversensePlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.eversense)
.shortName(R.string.eversense_shortname)
.preferencesId(R.xml.pref_poctech)
.description(R.string.description_source_eversense)
);
}
@Override
public boolean advancedFilteringSupported() {
return false;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
if (L.isEnabled(L.BGSOURCE)) {
if (bundle.containsKey("currentCalibrationPhase"))
log.debug("currentCalibrationPhase: " + bundle.getString("currentCalibrationPhase"));
if (bundle.containsKey("placementModeInProgress"))
log.debug("placementModeInProgress: " + bundle.getBoolean("placementModeInProgress"));
if (bundle.containsKey("glucoseLevel"))
log.debug("glucoseLevel: " + bundle.getInt("glucoseLevel"));
if (bundle.containsKey("glucoseTrendDirection"))
log.debug("glucoseTrendDirection: " + bundle.getString("glucoseTrendDirection"));
if (bundle.containsKey("glucoseTimestamp"))
log.debug("glucoseTimestamp: " + DateUtil.dateAndTimeFullString(bundle.getLong("glucoseTimestamp")));
if (bundle.containsKey("batteryLevel"))
log.debug("batteryLevel: " + bundle.getString("batteryLevel"));
if (bundle.containsKey("signalStrength"))
log.debug("signalStrength: " + bundle.getString("signalStrength"));
if (bundle.containsKey("transmitterVersionNumber"))
log.debug("transmitterVersionNumber: " + bundle.getString("transmitterVersionNumber"));
if (bundle.containsKey("isXLVersion"))
log.debug("isXLVersion: " + bundle.getBoolean("isXLVersion"));
if (bundle.containsKey("transmitterModelNumber"))
log.debug("transmitterModelNumber: " + bundle.getString("transmitterModelNumber"));
if (bundle.containsKey("transmitterSerialNumber"))
log.debug("transmitterSerialNumber: " + bundle.getString("transmitterSerialNumber"));
if (bundle.containsKey("transmitterAddress"))
log.debug("transmitterAddress: " + bundle.getString("transmitterAddress"));
if (bundle.containsKey("sensorInsertionTimestamp"))
log.debug("sensorInsertionTimestamp: " + DateUtil.dateAndTimeFullString(bundle.getLong("sensorInsertionTimestamp")));
if (bundle.containsKey("transmitterVersionNumber"))
log.debug("transmitterVersionNumber: " + bundle.getString("transmitterVersionNumber"));
if (bundle.containsKey("transmitterConnectionState"))
log.debug("transmitterConnectionState: " + bundle.getString("transmitterConnectionState"));
}
if (bundle.containsKey("glucoseLevels")) {
int[] glucoseLevels = bundle.getIntArray("glucoseLevels");
int[] glucoseRecordNumbers = bundle.getIntArray("glucoseRecordNumbers");
long[] glucoseTimestamps = bundle.getLongArray("glucoseTimestamps");
if (L.isEnabled(L.BGSOURCE)) {
log.debug("glucoseLevels", Arrays.toString(glucoseLevels));
log.debug("glucoseRecordNumbers", Arrays.toString(glucoseRecordNumbers));
log.debug("glucoseTimestamps", Arrays.toString(glucoseTimestamps));
}
for (int i = 0; i < glucoseLevels.length; i++) {
BgReading bgReading = new BgReading();
bgReading.value = glucoseLevels[i];
bgReading.date = glucoseTimestamps[i];
bgReading.raw = 0;
boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Eversense");
if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Eversense");
}
if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading);
}
}
}
if (bundle.containsKey("calibrationGlucoseLevels")) {
int[] calibrationGlucoseLevels = bundle.getIntArray("calibrationGlucoseLevels");
long[] calibrationTimestamps = bundle.getLongArray("calibrationTimestamps");
long[] calibrationRecordNumbers = bundle.getLongArray("calibrationRecordNumbers");
if (L.isEnabled(L.BGSOURCE)) {
log.debug("calibrationGlucoseLevels", Arrays.toString(calibrationGlucoseLevels));
log.debug("calibrationTimestamps", Arrays.toString(calibrationTimestamps));
log.debug("calibrationRecordNumbers", Arrays.toString(calibrationRecordNumbers));
}
for (int i = 0; i < calibrationGlucoseLevels.length; i++) {
try {
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(calibrationTimestamps[i]) == null) {
JSONObject data = new JSONObject();
data.put("enteredBy", "AndroidAPS-Eversense");
data.put("created_at", DateUtil.toISOString(calibrationTimestamps[i]));
data.put("eventType", CareportalEvent.BGCHECK);
data.put("glucoseType", "Finger");
data.put("glucose", calibrationGlucoseLevels[i]);
data.put("units", Constants.MGDL);
NSUpload.uploadCareportalEntryToNS(data);
}
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
}
}
}
}

View file

@ -1,68 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.BundleLogger;
import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 05.08.2016.
*/
public class SourceGlimpPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceGlimpPlugin plugin = null;
@Deprecated
public static SourceGlimpPlugin getPlugin() {
if (plugin == null)
plugin = new SourceGlimpPlugin();
return plugin;
}
private SourceGlimpPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.Glimp)
.description(R.string.description_source_glimp)
);
}
@Override
public boolean advancedFilteringSupported() {
return false;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
if (L.isEnabled(L.BGSOURCE))
log.debug("Received Glimp Data: " + BundleLogger.log(bundle));
BgReading bgReading = new BgReading();
bgReading.value = bundle.getDouble("mySGV");
bgReading.direction = bundle.getString("myTrend");
bgReading.date = bundle.getLong("myTimestamp");
bgReading.raw = 0;
MainApp.getDbHelper().createIfNotExists(bgReading, "GLIMP");
}
}

View file

@ -1,94 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 05.08.2016.
*/
public class SourceMM640gPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceMM640gPlugin plugin = null;
@Deprecated
public static SourceMM640gPlugin getPlugin() {
if (plugin == null)
plugin = new SourceMM640gPlugin();
return plugin;
}
private SourceMM640gPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.MM640g)
.description(R.string.description_source_mm640g)
);
}
@Override
public boolean advancedFilteringSupported() {
return false;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
final String collection = bundle.getString("collection");
if (collection == null) return;
if (collection.equals("entries")) {
final String data = bundle.getString("data");
if (L.isEnabled(L.BGSOURCE))
log.debug("Received MM640g Data: ", data);
if ((data != null) && (data.length() > 0)) {
try {
final JSONArray json_array = new JSONArray(data);
for (int i = 0; i < json_array.length(); i++) {
final JSONObject json_object = json_array.getJSONObject(i);
final String type = json_object.getString("type");
switch (type) {
case "sgv":
BgReading bgReading = new BgReading();
bgReading.value = json_object.getDouble("sgv");
bgReading.direction = json_object.getString("direction");
bgReading.date = json_object.getLong("date");
bgReading.raw = json_object.getDouble("sgv");
MainApp.getDbHelper().createIfNotExists(bgReading, "MM640g");
break;
default:
if (L.isEnabled(L.BGSOURCE))
log.debug("Unknown entries type: " + type);
}
}
} catch (JSONException e) {
log.error("Exception: ", e);
}
}
}
}
}

View file

@ -1,107 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSgv;
import info.nightscout.androidaps.utils.JsonHelper;
import info.nightscout.androidaps.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SourceNSClientPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceNSClientPlugin plugin = null;
@Deprecated
public static SourceNSClientPlugin getPlugin() {
if (plugin == null)
plugin = new SourceNSClientPlugin();
return plugin;
}
private long lastBGTimeStamp = 0;
private boolean isAdvancedFilteringEnabled = false;
private SourceNSClientPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.nsclientbg)
.description(R.string.description_source_ns_client)
);
}
@Override
public boolean advancedFilteringSupported() {
return isAdvancedFilteringEnabled;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE) && !SP.getBoolean(R.string.key_ns_autobackfill, true))
return;
Bundle bundles = intent.getExtras();
try {
if (bundles.containsKey("sgv")) {
String sgvstring = bundles.getString("sgv");
if (L.isEnabled(L.BGSOURCE))
log.debug("Received NS Data: " + sgvstring);
JSONObject sgvJson = new JSONObject(sgvstring);
storeSgv(sgvJson);
}
if (bundles.containsKey("sgvs")) {
String sgvstring = bundles.getString("sgvs");
if (L.isEnabled(L.BGSOURCE))
log.debug("Received NS Data: " + sgvstring);
JSONArray jsonArray = new JSONArray(sgvstring);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject sgvJson = jsonArray.getJSONObject(i);
storeSgv(sgvJson);
}
}
} catch (Exception e) {
log.error("Unhandled exception", e);
}
// Objectives 0
SP.putBoolean(R.string.key_ObjectivesbgIsAvailableInNS, true);
}
private void storeSgv(JSONObject sgvJson) {
NSSgv nsSgv = new NSSgv(sgvJson);
BgReading bgReading = new BgReading(nsSgv);
MainApp.getDbHelper().createIfNotExists(bgReading, "NS");
SourceNSClientPlugin.getPlugin().detectSource(JsonHelper.safeGetString(sgvJson, "device", "none"), JsonHelper.safeGetLong(sgvJson, "mills"));
}
public void detectSource(String source, long timeStamp) {
if (timeStamp > lastBGTimeStamp) {
if (source.contains("G5 Native") || source.contains("G6 Native") || source.contains("AndroidAPS-DexcomG5") || source.contains("AndroidAPS-DexcomG6"))
isAdvancedFilteringEnabled = true;
else
isAdvancedFilteringEnabled = false;
lastBGTimeStamp = timeStamp;
}
}
}

View file

@ -1,95 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.utils.JsonHelper;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SourcePoctechPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourcePoctechPlugin plugin = null;
@Deprecated
public static SourcePoctechPlugin getPlugin() {
if (plugin == null)
plugin = new SourcePoctechPlugin();
return plugin;
}
private SourcePoctechPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.poctech)
.preferencesId(R.xml.pref_poctech)
.description(R.string.description_source_poctech)
);
}
@Override
public boolean advancedFilteringSupported() {
return false;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
BgReading bgReading = new BgReading();
String data = bundle.getString("data");
if (L.isEnabled(L.BGSOURCE))
log.debug("Received Poctech Data", data);
try {
JSONArray jsonArray = new JSONArray(data);
if (L.isEnabled(L.BGSOURCE))
log.debug("Received Poctech Data size:" + jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
bgReading.value = json.getDouble("current");
bgReading.direction = json.getString("direction");
bgReading.date = json.getLong("date");
bgReading.raw = json.getDouble("raw");
if (JsonHelper.safeGetString(json, "units", Constants.MGDL).equals("mmol/L"))
bgReading.value = bgReading.value * Constants.MMOLL_TO_MGDL;
boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Poctech");
if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Poctech");
}
if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading);
}
}
} catch (JSONException e) {
log.error("Exception: ", e);
}
}
}

View file

@ -1,75 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SourceTomatoPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceTomatoPlugin plugin = null;
@Deprecated
public static SourceTomatoPlugin getPlugin() {
if (plugin == null)
plugin = new SourceTomatoPlugin();
return plugin;
}
private SourceTomatoPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.tomato)
.preferencesId(R.xml.pref_poctech)
.shortName(R.string.tomato_short)
.description(R.string.description_source_tomato)
);
}
@Override
public boolean advancedFilteringSupported() {
return false;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
BgReading bgReading = new BgReading();
if (L.isEnabled(L.BGSOURCE))
log.debug("Received Tomato Data");
bgReading.value = bundle.getDouble("com.fanqies.tomatofn.Extras.BgEstimate");
bgReading.date = bundle.getLong("com.fanqies.tomatofn.Extras.Time");
boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Tomato");
if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Tomato");
}
if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading);
}
}
}

View file

@ -1,76 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import android.content.Intent;
import android.os.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.BundleLogger;
/**
* Created by mike on 05.08.2016.
*/
public class SourceXdripPlugin extends PluginBase implements BgSourceInterface {
private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceXdripPlugin plugin = null;
boolean advancedFiltering;
@Deprecated
public static SourceXdripPlugin getPlugin() {
if (plugin == null)
plugin = new SourceXdripPlugin();
return plugin;
}
private SourceXdripPlugin() {
super(new PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.xdrip)
.description(R.string.description_source_xdrip)
);
}
@Override
public boolean advancedFilteringSupported() {
return advancedFiltering;
}
@Override
public void handleNewData(Intent intent) {
if (!isEnabled(PluginType.BGSOURCE)) return;
Bundle bundle = intent.getExtras();
if (bundle == null) return;
if (L.isEnabled(L.BGSOURCE))
log.debug("Received xDrip data: " + BundleLogger.log(intent.getExtras()));
BgReading bgReading = new BgReading();
bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE);
bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME);
bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP);
bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW);
String source = bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION, "no Source specified");
SourceXdripPlugin.getPlugin().setSource(source);
MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP");
}
public void setSource(String source) {
this.advancedFiltering = source.contains("G5 Native")||source.contains("G6 Native");
}
}

View file

@ -0,0 +1,50 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class TomatoPlugin @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.tomato)
.preferencesId(R.xml.pref_bgsource)
.shortName(R.string.tomato_short)
.description(R.string.description_source_tomato)
), BgSourceInterface {
override fun advancedFilteringSupported(): Boolean {
return false
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
val bgReading = BgReading()
aapsLogger.debug(LTag.BGSOURCE, "Received Tomato Data")
bgReading.value = bundle.getDouble("com.fanqies.tomatofn.Extras.BgEstimate")
bgReading.date = bundle.getLong("com.fanqies.tomatofn.Extras.Time")
val isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Tomato")
if (isNew && sp.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
NSUpload.uploadBg(bgReading, "AndroidAPS-Tomato")
}
if (isNew && sp.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
NSUpload.sendToXdrip(bgReading)
}
}
}

View file

@ -0,0 +1,51 @@
package info.nightscout.androidaps.plugins.source
import android.content.Intent
import info.nightscout.androidaps.MainApp
import info.nightscout.androidaps.R
import info.nightscout.androidaps.db.BgReading
import info.nightscout.androidaps.interfaces.BgSourceInterface
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.BundleLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.services.Intents
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class XdripPlugin @Inject constructor(
private val aapsLogger: AAPSLogger
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.xdrip)
.description(R.string.description_source_xdrip)
), BgSourceInterface {
var advancedFiltering = false
override fun advancedFilteringSupported(): Boolean {
return advancedFiltering
}
override fun handleNewData(intent: Intent) {
if (!isEnabled(PluginType.BGSOURCE)) return
val bundle = intent.extras ?: return
aapsLogger.debug(LTag.BGSOURCE, "Received xDrip data: " + BundleLogger.log(intent.extras))
val bgReading = BgReading()
bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE)
bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME)
bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP)
bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW)
val source = bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION, "no Source specified")
setSource(source)
MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP")
}
fun setSource(source: String) {
advancedFiltering = source.contains("G5 Native") || source.contains("G6 Native")
}
}

View file

@ -28,14 +28,14 @@ import info.nightscout.androidaps.plugins.general.overview.notifications.Notific
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin; import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin;
import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin; import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin;
import info.nightscout.androidaps.plugins.pump.danaR.activities.DanaRNSHistorySync; import info.nightscout.androidaps.plugins.pump.danaR.activities.DanaRNSHistorySync;
import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin; import info.nightscout.androidaps.plugins.source.DexcomPlugin;
import info.nightscout.androidaps.plugins.source.SourceEversensePlugin; import info.nightscout.androidaps.plugins.source.EversensePlugin;
import info.nightscout.androidaps.plugins.source.SourceGlimpPlugin; import info.nightscout.androidaps.plugins.source.GlimpPlugin;
import info.nightscout.androidaps.plugins.source.SourceMM640gPlugin; import info.nightscout.androidaps.plugins.source.MM640gPlugin;
import info.nightscout.androidaps.plugins.source.SourceNSClientPlugin; import info.nightscout.androidaps.plugins.source.NSClientSourcePlugin;
import info.nightscout.androidaps.plugins.source.SourcePoctechPlugin; import info.nightscout.androidaps.plugins.source.PoctechPlugin;
import info.nightscout.androidaps.plugins.source.SourceTomatoPlugin; import info.nightscout.androidaps.plugins.source.TomatoPlugin;
import info.nightscout.androidaps.plugins.source.SourceXdripPlugin; import info.nightscout.androidaps.plugins.source.XdripPlugin;
import info.nightscout.androidaps.receivers.DataReceiver; import info.nightscout.androidaps.receivers.DataReceiver;
import info.nightscout.androidaps.utils.JsonHelper; import info.nightscout.androidaps.utils.JsonHelper;
import info.nightscout.androidaps.utils.sharedPreferences.SP; import info.nightscout.androidaps.utils.sharedPreferences.SP;
@ -46,6 +46,14 @@ public class DataService extends DaggerIntentService {
@Inject SP sp; @Inject SP sp;
@Inject RxBusWrapper rxBus; @Inject RxBusWrapper rxBus;
@Inject SmsCommunicatorPlugin smsCommunicatorPlugin; @Inject SmsCommunicatorPlugin smsCommunicatorPlugin;
@Inject DexcomPlugin dexcomPlugin;
@Inject EversensePlugin eversensePlugin;
@Inject GlimpPlugin glimpPlugin;
@Inject MM640gPlugin mm640GPlugin;
@Inject NSClientSourcePlugin nsClientSourcePlugin;
@Inject PoctechPlugin poctechPlugin;
@Inject TomatoPlugin tomatoPlugin;
@Inject XdripPlugin xdripPlugin;
public DataService() { public DataService() {
super("DataService"); super("DataService");
@ -63,21 +71,21 @@ public class DataService extends DaggerIntentService {
final String action = intent.getAction(); final String action = intent.getAction();
if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) { if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) {
SourceXdripPlugin.getPlugin().handleNewData(intent); xdripPlugin.handleNewData(intent);
} else if (Intents.NS_EMULATOR.equals(action)) { } else if (Intents.NS_EMULATOR.equals(action)) {
SourceMM640gPlugin.getPlugin().handleNewData(intent); mm640GPlugin.handleNewData(intent);
} else if (Intents.GLIMP_BG.equals(action)) { } else if (Intents.GLIMP_BG.equals(action)) {
SourceGlimpPlugin.getPlugin().handleNewData(intent); glimpPlugin.handleNewData(intent);
} else if (Intents.DEXCOM_BG.equals(action)) { } else if (Intents.DEXCOM_BG.equals(action)) {
SourceDexcomPlugin.INSTANCE.handleNewData(intent); dexcomPlugin.handleNewData(intent);
} else if (Intents.POCTECH_BG.equals(action)) { } else if (Intents.POCTECH_BG.equals(action)) {
SourcePoctechPlugin.getPlugin().handleNewData(intent); poctechPlugin.handleNewData(intent);
} else if (Intents.TOMATO_BG.equals(action)) { } else if (Intents.TOMATO_BG.equals(action)) {
SourceTomatoPlugin.getPlugin().handleNewData(intent); tomatoPlugin.handleNewData(intent);
} else if (Intents.EVERSENSE_BG.equals(action)) { } else if (Intents.EVERSENSE_BG.equals(action)) {
SourceEversensePlugin.getPlugin().handleNewData(intent); eversensePlugin.handleNewData(intent);
} else if (Intents.ACTION_NEW_SGV.equals(action)) { } else if (Intents.ACTION_NEW_SGV.equals(action)) {
SourceNSClientPlugin.getPlugin().handleNewData(intent); nsClientSourcePlugin.handleNewData(intent);
} else if (Intents.ACTION_NEW_PROFILE.equals(action)) { } else if (Intents.ACTION_NEW_PROFILE.equals(action)) {
// always handle Profile if NSProfile is enabled without looking at nsUploadOnly // always handle Profile if NSProfile is enabled without looking at nsUploadOnly
NSProfilePlugin.getPlugin().handleNewData(intent); NSProfilePlugin.getPlugin().handleNewData(intent);

View file

@ -14,12 +14,6 @@
android:summary="@string/dexcomg5_xdripupload_summary" android:summary="@string/dexcomg5_xdripupload_summary"
android:title="@string/dexcomg5_xdripupload_title" /> android:title="@string/dexcomg5_xdripupload_title" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_dexcom_lognssensorchange"
android:summary="@string/dexcom_lognssensorchange_summary"
android:title="@string/dexcom_lognssensorchange_title" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View file

@ -14,6 +14,12 @@
android:summary="@string/dexcomg5_xdripupload_summary" android:summary="@string/dexcomg5_xdripupload_summary"
android:title="@string/dexcomg5_xdripupload_title" /> android:title="@string/dexcomg5_xdripupload_title" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_dexcom_lognssensorchange"
android:summary="@string/dexcom_lognssensorchange_summary"
android:title="@string/dexcom_lognssensorchange_title" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View file

@ -29,7 +29,7 @@ import info.nightscout.androidaps.plugins.pump.danaR.DanaRPump;
import info.nightscout.androidaps.plugins.pump.danaRS.DanaRSPlugin; import info.nightscout.androidaps.plugins.pump.danaRS.DanaRSPlugin;
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin; import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin;
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin; import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.source.SourceGlimpPlugin; import info.nightscout.androidaps.plugins.source.GlimpPlugin;
import info.nightscout.androidaps.utils.FabricPrivacy; import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SP;
@ -109,7 +109,7 @@ public class ConstraintsCheckerTest {
@Test @Test
public void isAdvancedFilteringEnabledTest() { public void isAdvancedFilteringEnabledTest() {
when(ConfigBuilderPlugin.getPlugin().getActiveBgSource()).thenReturn(SourceGlimpPlugin.getPlugin()); when(ConfigBuilderPlugin.getPlugin().getActiveBgSource()).thenReturn(GlimpPlugin.getPlugin());
Constraint<Boolean> c = constraintChecker.isAdvancedFilteringEnabled(); Constraint<Boolean> c = constraintChecker.isAdvancedFilteringEnabled();
Assert.assertEquals(true, c.getReasonList().size() == 1); // Safety Assert.assertEquals(true, c.getReasonList().size() == 1); // Safety

View file

@ -20,7 +20,7 @@ import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin;
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin; import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin; import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.source.SourceGlimpPlugin; import info.nightscout.androidaps.plugins.source.GlimpPlugin;
import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SP;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -91,7 +91,7 @@ public class SafetyPluginTest {
@Test @Test
public void bgSourceShouldPreventSMBAlways() { public void bgSourceShouldPreventSMBAlways() {
when(ConfigBuilderPlugin.getPlugin().getActiveBgSource()).thenReturn(SourceGlimpPlugin.getPlugin()); when(ConfigBuilderPlugin.getPlugin().getActiveBgSource()).thenReturn(GlimpPlugin.getPlugin());
Constraint<Boolean> c = new Constraint<>(true); Constraint<Boolean> c = new Constraint<>(true);
c = safetyPlugin.isAdvancedFilteringEnabled(c); c = safetyPlugin.isAdvancedFilteringEnabled(c);

View file

@ -1,8 +1,8 @@
package info.nightscout.androidaps.plugins.insulin package info.nightscout.androidaps.plugins.insulin
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.resources.ResourceHelperImplementation
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import junit.framework.Assert.assertEquals import junit.framework.Assert.assertEquals
import org.junit.Before import org.junit.Before
@ -31,15 +31,13 @@ class InsulinOrefFreePeakPluginTest {
lateinit var sut: InsulinOrefFreePeakPlugin lateinit var sut: InsulinOrefFreePeakPlugin
@Mock @Mock lateinit var sp: SP
lateinit var sp: SP @Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var rxBus: RxBusWrapper
@Mock
lateinit var resourceHelper: ResourceHelper
@Before @Before
fun setup() { fun setup() {
sut = InsulinOrefFreePeakPlugin(sp, resourceHelper) sut = InsulinOrefFreePeakPlugin(sp, resourceHelper, rxBus)
} }
@Test @Test

View file

@ -0,0 +1,28 @@
package info.nightscout.androidaps.plugins.source
import info.nightscout.androidaps.logging.AAPSLogger
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
class GlimpPluginTest {
@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()
private lateinit var glimpPlugin: GlimpPlugin;
@Mock lateinit var aapsLogger: AAPSLogger
@Before
fun setup() {
glimpPlugin = GlimpPlugin(aapsLogger)
}
@Test fun advancedFilteringSupported() {
Assert.assertEquals(false, glimpPlugin.advancedFilteringSupported())
}
}

View file

@ -6,15 +6,15 @@ import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
public class SourceXdripPluginTest { public class MM640GPluginTest {
@Test @Test
public void getPlugin() { public void getPlugin() {
Assert.assertNotEquals(null, SourceXdripPlugin.getPlugin()); Assert.assertNotEquals(null, MM640gPlugin.getPlugin());
} }
@Test @Test
public void advancedFilteringSupported() { public void advancedFilteringSupported() {
Assert.assertEquals(false, SourceXdripPlugin.getPlugin().advancedFilteringSupported()); Assert.assertEquals(false, MM640gPlugin.getPlugin().advancedFilteringSupported());
} }
} }

View file

@ -6,15 +6,15 @@ import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
public class SourceGlimpPluginTest { public class NSClientPluginTest {
@Test @Test
public void getPlugin() { public void getPlugin() {
Assert.assertNotEquals(null, SourceGlimpPlugin.getPlugin()); Assert.assertNotEquals(null, NSClientPlugin.getPlugin());
} }
@Test @Test
public void advancedFilteringSupported() { public void advancedFilteringSupported() {
Assert.assertEquals(false, SourceGlimpPlugin.getPlugin().advancedFilteringSupported()); Assert.assertEquals(false, NSClientPlugin.getPlugin().advancedFilteringSupported());
} }
} }

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.source;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
public class SourceNSClientPluginTest {
@Test
public void getPlugin() {
Assert.assertNotEquals(null, SourceNSClientPlugin.getPlugin());
}
@Test
public void advancedFilteringSupported() {
Assert.assertEquals(false, SourceNSClientPlugin.getPlugin().advancedFilteringSupported());
}
}

View file

@ -6,15 +6,15 @@ import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
public class SourceMM640gPluginTest { public class XdripPluginTest {
@Test @Test
public void getPlugin() { public void getPlugin() {
Assert.assertNotEquals(null, SourceMM640gPlugin.getPlugin()); Assert.assertNotEquals(null, XdripPlugin.getPlugin());
} }
@Test @Test
public void advancedFilteringSupported() { public void advancedFilteringSupported() {
Assert.assertEquals(false, SourceMM640gPlugin.getPlugin().advancedFilteringSupported()); Assert.assertEquals(false, XdripPlugin.getPlugin().advancedFilteringSupported());
} }
} }