diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpFragment.kt
index ea85e983b5..d36c5225ea 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpFragment.kt
@@ -47,10 +47,8 @@ class VirtualPumpFragment : DaggerFragment() {
// onDestroyView.
private val binding get() = _binding!!
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
- _binding = VirtualpumpFragmentBinding.inflate(inflater, container, false)
- return binding.root
- }
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
+ VirtualpumpFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
@Synchronized
override fun onResume() {
diff --git a/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.java b/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.java
deleted file mode 100644
index 85407b6b07..0000000000
--- a/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.java
+++ /dev/null
@@ -1,302 +0,0 @@
-package info.nightscout.androidaps.plugins.pump.combo;
-
-
-import android.graphics.Color;
-import android.graphics.Typeface;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.FragmentActivity;
-
-import javax.inject.Inject;
-
-import dagger.android.support.DaggerFragment;
-import info.nightscout.androidaps.combo.R;
-import info.nightscout.androidaps.interfaces.CommandQueue;
-import info.nightscout.androidaps.plugins.bus.RxBus;
-import info.nightscout.androidaps.plugins.pump.combo.data.ComboErrorUtil;
-import info.nightscout.androidaps.plugins.pump.combo.events.EventComboPumpUpdateGUI;
-import info.nightscout.androidaps.plugins.pump.combo.ruffyscripter.PumpState;
-import info.nightscout.androidaps.plugins.pump.combo.ruffyscripter.history.Bolus;
-import info.nightscout.androidaps.queue.Callback;
-import info.nightscout.androidaps.queue.events.EventQueueChanged;
-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 io.reactivex.rxjava3.disposables.CompositeDisposable;
-
-public class ComboFragment extends DaggerFragment {
- @Inject ComboPlugin comboPlugin;
- @Inject CommandQueue commandQueue;
- @Inject ResourceHelper rh;
- @Inject RxBus rxBus;
- @Inject DateUtil dateUtil;
- @Inject FabricPrivacy fabricPrivacy;
- @Inject AapsSchedulers aapsSchedulers;
- @Inject ComboErrorUtil errorUtil;
-
- private final CompositeDisposable disposable = new CompositeDisposable();
-
- private TextView stateView;
- private TextView activityView;
- private TextView batteryView;
- private TextView reservoirView;
- private TextView lastConnectionView;
- private TextView lastBolusView;
- private TextView baseBasalRate;
- private TextView tempBasalText;
- private Button refreshButton;
- private TextView bolusCount;
- private TextView tbrCount;
-
- private View errorCountDelimiter;
- private LinearLayout errorCountLayout;
- private TextView errorCountLabel;
- private TextView errorCountDots;
- private TextView errorCountValue;
- private TextView serialNumber;
-
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.combopump_fragment, container, false);
-
- stateView = view.findViewById(R.id.combo_state);
- activityView = view.findViewById(R.id.combo_activity);
- batteryView = view.findViewById(R.id.combo_pumpstate_battery);
- reservoirView = view.findViewById(R.id.combo_insulinstate);
- lastBolusView = view.findViewById(R.id.combo_last_bolus);
- lastConnectionView = view.findViewById(R.id.combo_lastconnection);
- baseBasalRate = view.findViewById(R.id.combo_base_basal_rate);
- tempBasalText = view.findViewById(R.id.combo_temp_basal);
- bolusCount = view.findViewById(R.id.combo_bolus_count);
- tbrCount = view.findViewById(R.id.combo_tbr_count);
- serialNumber = view.findViewById(R.id.serial_number);
-
- errorCountDelimiter = view.findViewById(R.id.combo_connection_error_delimiter);
- errorCountLayout = view.findViewById(R.id.combo_connection_error_layout);
- errorCountLabel = view.findViewById(R.id.combo_connection_error_label);
- errorCountDots = view.findViewById(R.id.combo_connection_error_dots);
- errorCountValue = view.findViewById(R.id.combo_connection_error_value);
-
- refreshButton = view.findViewById(R.id.combo_refresh_button);
- refreshButton.setOnClickListener(v -> {
- refreshButton.setEnabled(false);
- commandQueue.readStatus(rh.gs(R.string.user_request), new Callback() {
- @Override
- public void run() {
- runOnUiThread(() -> refreshButton.setEnabled(true));
- }
- });
- });
-
- return view;
- }
-
- @Override
- public synchronized void onResume() {
- super.onResume();
- disposable.add(rxBus
- .toObservable(EventComboPumpUpdateGUI.class)
- .observeOn(aapsSchedulers.getMain())
- .subscribe(event -> updateGui(), fabricPrivacy::logException)
- );
- disposable.add(rxBus
- .toObservable(EventQueueChanged.class)
- .observeOn(aapsSchedulers.getMain())
- .subscribe(event -> updateGui(), fabricPrivacy::logException)
- );
- updateGui();
- }
-
- @Override
- public synchronized void onPause() {
- super.onPause();
- disposable.clear();
- }
-
- private void runOnUiThread(Runnable action) {
- FragmentActivity activity = getActivity();
- if (activity != null) {
- activity.runOnUiThread(action);
- }
- }
-
- public void updateGui() {
-
- // state
- stateView.setText(comboPlugin.getStateSummary());
- PumpState ps = comboPlugin.getPump().state;
- if (ps.insulinState == PumpState.EMPTY || ps.batteryState == PumpState.EMPTY
- || ps.activeAlert != null && ps.activeAlert.errorCode != null) {
- stateView.setTextColor(rh.gac(getContext(), R.attr.warningColor));
- stateView.setTypeface(null, Typeface.BOLD);
- } else if (comboPlugin.getPump().state.suspended
- || ps.activeAlert != null && ps.activeAlert.warningCode != null) {
- stateView.setTextColor(rh.gac(getContext(), R.attr.omniYellowColor));
- stateView.setTypeface(null, Typeface.BOLD);
- } else {
- stateView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- stateView.setTypeface(null, Typeface.NORMAL);
- }
-
- // activity
- String activity = comboPlugin.getPump().activity;
- if (activity != null) {
- activityView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- activityView.setTextSize(14);
- activityView.setText(activity);
- } else if (commandQueue.size() > 0) {
- activityView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- activityView.setTextSize(14);
- activityView.setText("");
- } else if (comboPlugin.isInitialized()) {
- activityView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- activityView.setTextSize(20);
- activityView.setText("{fa-bed}");
- } else {
- activityView.setTextColor(rh.gac(getContext(), R.attr.warningColor));
- activityView.setTextSize(14);
- activityView.setText(rh.gs(R.string.pump_unreachable));
- }
-
- if (comboPlugin.isInitialized()) {
- // battery
- batteryView.setTextSize(20);
- if (ps.batteryState == PumpState.EMPTY) {
- batteryView.setText("{fa-battery-empty}");
- batteryView.setTextColor(rh.gac(getContext(), R.attr.warningColor));
- } else if (ps.batteryState == PumpState.LOW) {
- batteryView.setText("{fa-battery-quarter}");
- batteryView.setTextColor(rh.gac(getContext(), R.attr.omniYellowColor));
- } else {
- batteryView.setText("{fa-battery-full}");
- batteryView.setTextColor(Color.WHITE);
- }
-
- // reservoir
- int reservoirLevel = comboPlugin.getPump().reservoirLevel;
- if (reservoirLevel != -1) {
- reservoirView.setText(reservoirLevel + " " + rh.gs(R.string.insulin_unit_shortname));
- } else if (ps.insulinState == PumpState.LOW) {
- reservoirView.setText(rh.gs(R.string.combo_reservoir_low));
- } else if (ps.insulinState == PumpState.EMPTY) {
- reservoirView.setText(rh.gs(R.string.combo_reservoir_empty));
- } else {
- reservoirView.setText(rh.gs(R.string.combo_reservoir_normal));
- }
-
- if (ps.insulinState == PumpState.UNKNOWN) {
- reservoirView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- reservoirView.setTypeface(null, Typeface.NORMAL);
- } else if (ps.insulinState == PumpState.LOW) {
- reservoirView.setTextColor(rh.gac(getContext(), R.attr.omniYellowColor));
- reservoirView.setTypeface(null, Typeface.BOLD);
- } else if (ps.insulinState == PumpState.EMPTY) {
- reservoirView.setTextColor(rh.gac(getContext(), R.attr.warningColor));
- reservoirView.setTypeface(null, Typeface.BOLD);
- } else {
- reservoirView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- reservoirView.setTypeface(null, Typeface.NORMAL);
- }
-
- // last connection
- String minAgo = dateUtil.minAgo(rh, comboPlugin.getPump().lastSuccessfulCmdTime);
- long min = (System.currentTimeMillis() - comboPlugin.getPump().lastSuccessfulCmdTime) / 1000 / 60;
- if (comboPlugin.getPump().lastSuccessfulCmdTime + 60 * 1000 > System.currentTimeMillis()) {
- lastConnectionView.setText(R.string.combo_pump_connected_now);
- lastConnectionView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- } else if (comboPlugin.getPump().lastSuccessfulCmdTime + 30 * 60 * 1000 < System.currentTimeMillis()) {
- lastConnectionView.setText(rh.gs(R.string.combo_no_pump_connection, min));
- lastConnectionView.setTextColor(rh.gac(getContext(), R.attr.warningColor));
- } else {
- lastConnectionView.setText(minAgo);
- lastConnectionView.setTextColor(rh.gac(getContext(), R.attr.defaultTextColor));
- }
-
- // last bolus
- Bolus bolus = comboPlugin.getPump().lastBolus;
- if (bolus != null) {
- long agoMsc = System.currentTimeMillis() - bolus.timestamp;
- double bolusMinAgo = agoMsc / 60d / 1000d;
- String unit = rh.gs(R.string.insulin_unit_shortname);
- String ago;
- if ((agoMsc < 60 * 1000)) {
- ago = rh.gs(R.string.combo_pump_connected_now);
- } else if (bolusMinAgo < 60) {
- ago = dateUtil.minAgo(rh, bolus.timestamp);
- } else {
- ago = dateUtil.hourAgo(bolus.timestamp, rh);
- }
- lastBolusView.setText(rh.gs(R.string.combo_last_bolus, bolus.amount, unit, ago));
- } else {
- lastBolusView.setText("");
- }
-
- // base basal rate
- baseBasalRate.setText(rh.gs(R.string.pump_basebasalrate, comboPlugin.getBaseBasalRate()));
-
- // TBR
- String tbrStr = "";
- if (ps.tbrPercent != -1 && ps.tbrPercent != 100) {
- long minSinceRead = (System.currentTimeMillis() - comboPlugin.getPump().state.timestamp) / 1000 / 60;
- long remaining = ps.tbrRemainingDuration - minSinceRead;
- if (remaining >= 0) {
- tbrStr = rh.gs(R.string.combo_tbr_remaining, ps.tbrPercent, remaining);
- }
- }
- tempBasalText.setText(tbrStr);
-
- // stats
- bolusCount.setText(String.valueOf(comboPlugin.getBolusesDelivered()));
- tbrCount.setText(String.valueOf(comboPlugin.getTbrsSet()));
- serialNumber.setText(comboPlugin.serialNumber());
-
- updateErrorDisplay(false);
- } else {
- updateErrorDisplay(true);
- }
- }
-
- private void updateErrorDisplay(boolean forceHide) {
- int errorCount = -1;
-
- if (!forceHide) {
- ComboErrorUtil.DisplayType displayType = errorUtil.getDisplayType();
-
- if (displayType== ComboErrorUtil.DisplayType.ON_ERROR || displayType== ComboErrorUtil.DisplayType.ALWAYS) {
- int errorCountInternal = errorUtil.getErrorCount();
-
- if (errorCountInternal>0) {
- errorCount = errorCountInternal;
- } else if (displayType== ComboErrorUtil.DisplayType.ALWAYS) {
- errorCount = 0;
- }
- }
- }
-
- if (errorCount >=0) {
- errorCountDelimiter.setVisibility(View.VISIBLE);
- errorCountLayout.setVisibility(View.VISIBLE);
- errorCountLabel.setVisibility(View.VISIBLE);
- errorCountDots.setVisibility(View.VISIBLE);
- errorCountValue.setVisibility(View.VISIBLE);
- errorCountValue.setText(errorCount==0 ?
- "-" :
- ""+errorCount);
- } else {
- errorCountDelimiter.setVisibility(View.GONE);
- errorCountLayout.setVisibility(View.GONE);
- errorCountLabel.setVisibility(View.GONE);
- errorCountDots.setVisibility(View.GONE);
- errorCountValue.setVisibility(View.GONE);
- }
- }
-}
diff --git a/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.kt b/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.kt
new file mode 100644
index 0000000000..91b6a34aa0
--- /dev/null
+++ b/combo/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboFragment.kt
@@ -0,0 +1,254 @@
+package info.nightscout.androidaps.plugins.pump.combo
+
+import android.annotation.SuppressLint
+import android.graphics.Color
+import android.graphics.Typeface
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import dagger.android.support.DaggerFragment
+import info.nightscout.androidaps.combo.R
+import info.nightscout.androidaps.combo.databinding.CombopumpFragmentBinding
+import info.nightscout.androidaps.extensions.runOnUiThread
+import info.nightscout.androidaps.interfaces.CommandQueue
+import info.nightscout.androidaps.plugins.bus.RxBus
+import info.nightscout.androidaps.plugins.pump.combo.data.ComboErrorUtil
+import info.nightscout.androidaps.plugins.pump.combo.data.ComboErrorUtil.DisplayType
+import info.nightscout.androidaps.plugins.pump.combo.events.EventComboPumpUpdateGUI
+import info.nightscout.androidaps.plugins.pump.combo.ruffyscripter.PumpState
+import info.nightscout.androidaps.queue.Callback
+import info.nightscout.androidaps.queue.events.EventQueueChanged
+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 io.reactivex.rxjava3.disposables.CompositeDisposable
+import io.reactivex.rxjava3.kotlin.plusAssign
+import javax.inject.Inject
+
+class ComboFragment : DaggerFragment() {
+
+ @Inject lateinit var comboPlugin: ComboPlugin
+ @Inject lateinit var commandQueue: CommandQueue
+ @Inject lateinit var rh: ResourceHelper
+ @Inject lateinit var rxBus: RxBus
+ @Inject lateinit var dateUtil: DateUtil
+ @Inject lateinit var fabricPrivacy: FabricPrivacy
+ @Inject lateinit var aapsSchedulers: AapsSchedulers
+ @Inject lateinit var errorUtil: ComboErrorUtil
+
+ private val disposable = CompositeDisposable()
+
+ private var _binding: CombopumpFragmentBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
+ CombopumpFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
+
+ @Synchronized override fun onResume() {
+ super.onResume()
+ disposable += rxBus
+ .toObservable(EventComboPumpUpdateGUI::class.java)
+ .observeOn(aapsSchedulers.main)
+ .subscribe({ updateGui() }, fabricPrivacy::logException)
+ disposable += rxBus
+ .toObservable(EventQueueChanged::class.java)
+ .observeOn(aapsSchedulers.main)
+ .subscribe({ updateGui() }, fabricPrivacy::logException)
+ binding.comboRefreshButton.setOnClickListener {
+ binding.comboRefreshButton.isEnabled = false
+ commandQueue.readStatus(rh.gs(R.string.user_request), object : Callback() {
+ override fun run() {
+ runOnUiThread { binding.comboRefreshButton.isEnabled = true }
+ }
+ })
+ }
+ updateGui()
+ }
+
+ @Synchronized override fun onPause() {
+ super.onPause()
+ disposable.clear()
+ }
+
+ @SuppressLint("SetTextI18n")
+ fun updateGui() {
+ _binding ?: return
+ // state
+ binding.comboState.text = comboPlugin.stateSummary
+ val ps = comboPlugin.pump.state
+ if (ps.insulinState == PumpState.EMPTY || ps.batteryState == PumpState.EMPTY || ps.activeAlert != null && ps.activeAlert.errorCode != null) {
+ binding.comboState.setTextColor(rh.gac(context, R.attr.warningColor))
+ binding.comboState.setTypeface(null, Typeface.BOLD)
+ } else if (comboPlugin.pump.state.suspended
+ || ps.activeAlert != null && ps.activeAlert.warningCode != null
+ ) {
+ binding.comboState.setTextColor(rh.gac(context, R.attr.omniYellowColor))
+ binding.comboState.setTypeface(null, Typeface.BOLD)
+ } else {
+ binding.comboState.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboState.setTypeface(null, Typeface.NORMAL)
+ }
+
+ // activity
+ val activity = comboPlugin.pump.activity
+ when {
+ activity != null -> {
+ binding.comboActivity.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboActivity.textSize = 14f
+ binding.comboActivity.text = activity
+ }
+
+ commandQueue.size() > 0 -> {
+ binding.comboActivity.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboActivity.textSize = 14f
+ binding.comboActivity.text = ""
+ }
+
+ comboPlugin.isInitialized() -> {
+ binding.comboActivity.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboActivity.textSize = 20f
+ binding.comboActivity.text = "{fa-bed}"
+ }
+
+ else -> {
+ binding.comboActivity.setTextColor(rh.gac(context, R.attr.warningColor))
+ binding.comboActivity.textSize = 14f
+ binding.comboActivity.text = rh.gs(R.string.pump_unreachable)
+ }
+ }
+ if (comboPlugin.isInitialized()) {
+ // battery
+ binding.comboPumpstateBattery.textSize = 20f
+ when (ps.batteryState) {
+ PumpState.EMPTY -> {
+ binding.comboPumpstateBattery.text = "{fa-battery-empty}"
+ binding.comboPumpstateBattery.setTextColor(rh.gac(context, R.attr.warningColor))
+ }
+
+ PumpState.LOW -> {
+ binding.comboPumpstateBattery.text = "{fa-battery-quarter}"
+ binding.comboPumpstateBattery.setTextColor(rh.gac(context, R.attr.omniYellowColor))
+ }
+
+ else -> {
+ binding.comboPumpstateBattery.text = "{fa-battery-full}"
+ binding.comboPumpstateBattery.setTextColor(Color.WHITE)
+ }
+ }
+
+ // reservoir
+ val reservoirLevel = comboPlugin.pump.reservoirLevel
+ when {
+ reservoirLevel != -1 -> binding.comboInsulinstate.text = reservoirLevel.toString() + " " + rh.gs(R.string.insulin_unit_shortname)
+ ps.insulinState == PumpState.LOW -> binding.comboInsulinstate.text = rh.gs(R.string.combo_reservoir_low)
+ ps.insulinState == PumpState.EMPTY -> binding.comboInsulinstate.text = rh.gs(R.string.combo_reservoir_empty)
+ else -> binding.comboInsulinstate.text = rh.gs(R.string.combo_reservoir_normal)
+ }
+ when (ps.insulinState) {
+ PumpState.UNKNOWN -> {
+ binding.comboInsulinstate.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboInsulinstate.setTypeface(null, Typeface.NORMAL)
+ }
+ PumpState.LOW -> {
+ binding.comboInsulinstate.setTextColor(rh.gac(context, R.attr.omniYellowColor))
+ binding.comboInsulinstate.setTypeface(null, Typeface.BOLD)
+ }
+ PumpState.EMPTY -> {
+ binding.comboInsulinstate.setTextColor(rh.gac(context, R.attr.warningColor))
+ binding.comboInsulinstate.setTypeface(null, Typeface.BOLD)
+ }
+ else -> {
+ binding.comboInsulinstate.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ binding.comboInsulinstate.setTypeface(null, Typeface.NORMAL)
+ }
+ }
+
+ // last connection
+ val minAgo = dateUtil.minAgo(rh, comboPlugin.pump.lastSuccessfulCmdTime)
+ val min = (System.currentTimeMillis() - comboPlugin.pump.lastSuccessfulCmdTime) / 1000 / 60
+ when {
+ comboPlugin.pump.lastSuccessfulCmdTime + 60 * 1000 > System.currentTimeMillis() -> {
+ binding.comboLastconnection.setText(R.string.combo_pump_connected_now)
+ binding.comboLastconnection.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ }
+ comboPlugin.pump.lastSuccessfulCmdTime + 30 * 60 * 1000 < System.currentTimeMillis() -> {
+ binding.comboLastconnection.text = rh.gs(R.string.combo_no_pump_connection, min)
+ binding.comboLastconnection.setTextColor(rh.gac(context, R.attr.warningColor))
+ }
+ else -> {
+ binding.comboLastconnection.text = minAgo
+ binding.comboLastconnection.setTextColor(rh.gac(context, R.attr.defaultTextColor))
+ }
+ }
+
+ // last bolus
+ val bolus = comboPlugin.pump.lastBolus
+ if (bolus != null) {
+ val agoMsc = System.currentTimeMillis() - bolus.timestamp
+ val bolusMinAgo = agoMsc / 60.0 / 1000.0
+ val unit = rh.gs(R.string.insulin_unit_shortname)
+ val ago: String = when {
+ agoMsc < 60 * 1000 -> rh.gs(R.string.combo_pump_connected_now)
+ bolusMinAgo < 60 -> dateUtil.minAgo(rh, bolus.timestamp)
+
+ else -> dateUtil.hourAgo(bolus.timestamp, rh)
+ }
+ binding.comboLastBolus.text = rh.gs(R.string.combo_last_bolus, bolus.amount, unit, ago)
+ } else {
+ binding.comboLastBolus.text = ""
+ }
+
+ // base basal rate
+ binding.comboBaseBasalRate.text = rh.gs(R.string.pump_basebasalrate, comboPlugin.baseBasalRate)
+
+ // TBR
+ var tbrStr = ""
+ if (ps.tbrPercent != -1 && ps.tbrPercent != 100) {
+ val minSinceRead = (System.currentTimeMillis() - comboPlugin.pump.state.timestamp) / 1000 / 60
+ val remaining = ps.tbrRemainingDuration - minSinceRead
+ if (remaining >= 0) {
+ tbrStr = rh.gs(R.string.combo_tbr_remaining, ps.tbrPercent, remaining)
+ }
+ }
+ binding.comboTempBasal.text = tbrStr
+
+ // stats
+ binding.comboBolusCount.text = comboPlugin.bolusesDelivered.toString()
+ binding.comboTbrCount.text = comboPlugin.tbrsSet.toString()
+ binding.serialNumber.text = comboPlugin.serialNumber()
+ updateErrorDisplay(false)
+ } else {
+ updateErrorDisplay(true)
+ }
+ }
+
+ private fun updateErrorDisplay(forceHide: Boolean) {
+ var errorCount = -1
+ if (!forceHide) {
+ val displayType = errorUtil.displayType
+ if (displayType === DisplayType.ON_ERROR || displayType === DisplayType.ALWAYS) {
+ val errorCountInternal = errorUtil.errorCount
+ if (errorCountInternal > 0) {
+ errorCount = errorCountInternal
+ } else if (displayType === DisplayType.ALWAYS) {
+ errorCount = 0
+ }
+ }
+ }
+ if (errorCount >= 0) {
+ binding.comboConnectionErrorValue.visibility = View.VISIBLE
+ binding.comboConnectionErrorLayout.visibility = View.VISIBLE
+ binding.comboConnectionErrorValue.visibility = View.VISIBLE
+ binding.comboConnectionErrorValue.text = if (errorCount == 0) "-" else "" + errorCount
+ } else {
+ binding.comboConnectionErrorValue.visibility = View.GONE
+ binding.comboConnectionErrorLayout.visibility = View.GONE
+ binding.comboConnectionErrorValue.visibility = View.GONE
+ }
+ }
+}
\ No newline at end of file
diff --git a/combo/src/main/res/layout/combopump_fragment.xml b/combo/src/main/res/layout/combopump_fragment.xml
index e5395759d8..616d7e0654 100644
--- a/combo/src/main/res/layout/combopump_fragment.xml
+++ b/combo/src/main/res/layout/combopump_fragment.xml
@@ -479,7 +479,6 @@
android:orientation="horizontal">