ui, implementation module

This commit is contained in:
Milos Kozak 2022-10-31 20:20:41 +01:00
parent ef4a15a4c5
commit c955ca5b57
80 changed files with 396 additions and 206 deletions

View file

@ -176,6 +176,8 @@ dependencies {
implementation project(':libraries')
implementation project(':shared')
implementation project(':core')
implementation project(':ui')
implementation project(':implementation')
implementation project(':automation')
implementation project(':combo')
implementation project(':database')

View file

@ -23,6 +23,7 @@ import info.nightscout.androidaps.plugins.pump.medtronic.di.MedtronicModule
import info.nightscout.androidaps.plugins.pump.omnipod.dash.di.OmnipodDashModule
import info.nightscout.androidaps.plugins.pump.omnipod.eros.di.OmnipodErosModule
import info.nightscout.shared.di.SharedModule
import info.nightscout.ui.di.UiModule
import javax.inject.Singleton
@Singleton
@ -65,7 +66,8 @@ import javax.inject.Singleton
WorkersModule::class,
DiaconnG8Module::class,
OpenHumansModule::class,
SharedModule::class
SharedModule::class,
UiModule::class
]
)
interface AppComponent : AndroidInjector<MainApp> {

View file

@ -33,10 +33,13 @@ import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl
import info.nightscout.androidaps.utils.buildHelper.ConfigImpl
import info.nightscout.androidaps.utils.resources.IconsProviderImplementation
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.implementation.XDripBroadcastImpl
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.rx.DefaultAapsSchedulers
import info.nightscout.androidaps.utils.storage.FileStorage
import info.nightscout.androidaps.utils.storage.Storage
import info.nightscout.implementation.BolusTimerImpl
import info.nightscout.implementation.CarbTimerImpl
import info.nightscout.shared.sharedPreferences.SP
import javax.inject.Singleton
@ -107,6 +110,9 @@ open class AppModule {
@Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector
@Binds fun bindPumpSync(pumpSyncImplementation: PumpSyncImplementation): PumpSync
@Binds fun bindXDripBroadcast(xDripBroadcastImpl: XDripBroadcastImpl): XDripBroadcast
@Binds fun bindCarbTimer(carbTimer: CarbTimerImpl): CarbTimer
@Binds fun bindBolusTimer(bolusTimer: BolusTimerImpl): BolusTimer
}
}

View file

@ -10,8 +10,6 @@ import info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFr
import info.nightscout.androidaps.activities.fragments.TreatmentsTempTargetFragment
import info.nightscout.androidaps.activities.fragments.TreatmentsTemporaryBasalsFragment
import info.nightscout.androidaps.activities.fragments.TreatmentsUserEntryFragment
import info.nightscout.androidaps.dialogs.CalibrationDialog
import info.nightscout.androidaps.dialogs.CarbsDialog
import info.nightscout.androidaps.dialogs.CareDialog
import info.nightscout.androidaps.dialogs.ExtendedBolusDialog
import info.nightscout.androidaps.dialogs.FillDialog
@ -88,8 +86,6 @@ abstract class FragmentsModule {
@ContributesAndroidInjector abstract fun contributesVirtualPumpFragment(): VirtualPumpFragment
@ContributesAndroidInjector abstract fun contributesCalibrationDialog(): CalibrationDialog
@ContributesAndroidInjector abstract fun contributesCarbsDialog(): CarbsDialog
@ContributesAndroidInjector abstract fun contributesCareDialog(): CareDialog
@ContributesAndroidInjector abstract fun contributesEditActionDialog(): EditActionDialog
@ContributesAndroidInjector abstract fun contributesEditEventDialog(): EditEventDialog

View file

@ -203,7 +203,7 @@ class CareDialog : DialogFragmentWithDate() {
else -> TherapyEvent.MeterType.MANUAL
}
actions.add(rh.gs(R.string.careportal_newnstreatment_glucosetype) + ": " + translator.translate(meterType))
actions.add(rh.gs(R.string.treatments_wizard_bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, binding.bg.value) + " " + rh.gs(unitResId))
actions.add(rh.gs(R.string.bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, binding.bg.value) + " " + rh.gs(unitResId))
therapyEvent.glucoseType = meterType
therapyEvent.glucose = binding.bg.value
valuesWithUnit.add(ValueWithUnit.fromGlucoseUnit(binding.bg.value, profileFunction.getUnits().asText))

View file

@ -93,7 +93,7 @@ class ExtendedBolusDialog : DialogFragmentWithDate() {
actions.add(rh.gs(R.string.formatinsulinunits, insulinAfterConstraint))
actions.add(rh.gs(R.string.duration) + ": " + rh.gs(R.string.format_mins, durationInMinutes))
if (abs(insulinAfterConstraint - insulin) > 0.01)
actions.add(rh.gs(R.string.constraintapllied).formatColor(context, rh, R.attr.warningColor))
actions.add(rh.gs(R.string.constraint_applied).formatColor(context, rh, R.attr.warningColor))
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.extended_bolus), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {

View file

@ -31,6 +31,7 @@ import info.nightscout.androidaps.utils.extensions.toSignedString
import info.nightscout.androidaps.utils.protection.ProtectionCheck
import info.nightscout.androidaps.utils.protection.ProtectionCheck.Protection.BOLUS
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.interfaces.BolusTimer
import info.nightscout.shared.SafeParse
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
@ -83,11 +84,11 @@ class InsulinDialog : DialogFragmentWithDate() {
val maxInsulin = constraintChecker.getMaxBolusAllowed().value()
if (abs(binding.time.value.toInt()) > 12 * 60) {
binding.time.value = 0.0
ToastUtils.warnToast(context, R.string.constraintapllied)
ToastUtils.warnToast(context, R.string.constraint_applied)
}
if (binding.amount.value > maxInsulin) {
binding.amount.value = 0.0
ToastUtils.warnToast(context, R.string.bolusconstraintapplied)
ToastUtils.warnToast(context, R.string.bolus_constraint_applied)
}
}
@ -181,7 +182,7 @@ class InsulinDialog : DialogFragmentWithDate() {
val eatingSoonTTDuration = defaultValueHelper.determineEatingSoonTTDuration()
val eatingSoonTT = defaultValueHelper.determineEatingSoonTT()
if (eatingSoonChecked)
actions.add(rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(eatingSoonTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, eatingSoonTTDuration) + ")")
actions.add(rh.gs(R.string.temp_target_short) + ": " + (DecimalFormatter.to1Decimal(eatingSoonTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, eatingSoonTTDuration) + ")")
.formatColor(context, rh, R.attr.tempTargetConfirmation))
val timeOffset = binding.time.value.toInt()
@ -234,7 +235,7 @@ class InsulinDialog : DialogFragmentWithDate() {
{ aapsLogger.error(LTag.DATABASE, "Error while saving bolus", it) }
)
if (timeOffset == 0)
bolusTimer.removeBolusReminder()
bolusTimer.removeAutomationEventBolusReminder()
} else {
uel.log(Action.BOLUS, Sources.InsulinDialog,
notes,
@ -244,7 +245,7 @@ class InsulinDialog : DialogFragmentWithDate() {
if (!result.success) {
ErrorHelperActivity.runAlarm(ctx, result.comment, rh.gs(R.string.treatmentdeliveryerror), R.raw.boluserror)
} else {
bolusTimer.removeBolusReminder()
bolusTimer.removeAutomationEventBolusReminder()
}
}
})

View file

@ -111,14 +111,14 @@ class TempBasalDialog : DialogFragmentWithDate() {
percent = constraintChecker.applyBasalPercentConstraints(Constraint(basalPercentInput), profile).value()
actions.add(rh.gs(R.string.tempbasal_label) + ": $percent%")
actions.add(rh.gs(R.string.duration) + ": " + rh.gs(R.string.format_mins, durationInMinutes))
if (percent != basalPercentInput) actions.add(rh.gs(R.string.constraintapllied))
if (percent != basalPercentInput) actions.add(rh.gs(R.string.constraint_applied))
} else {
val basalAbsoluteInput = SafeParse.stringToDouble(binding.basalAbsoluteInput.text)
absolute = constraintChecker.applyBasalConstraints(Constraint(basalAbsoluteInput), profile).value()
actions.add(rh.gs(R.string.tempbasal_label) + ": " + rh.gs(R.string.pump_basebasalrate, absolute))
actions.add(rh.gs(R.string.duration) + ": " + rh.gs(R.string.format_mins, durationInMinutes))
if (abs(absolute - basalAbsoluteInput) > 0.01)
actions.add(rh.gs(R.string.constraintapllied).formatColor(context, rh, R.attr.warningColor))
actions.add(rh.gs(R.string.constraint_applied).formatColor(context, rh, R.attr.warningColor))
}
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.tempbasal_label), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {

View file

@ -72,11 +72,11 @@ class TreatmentDialog : DialogFragmentWithDate() {
val maxInsulin = constraintChecker.getMaxBolusAllowed().value()
if (SafeParse.stringToInt(binding.carbs.text) > maxCarbs) {
binding.carbs.value = 0.0
ToastUtils.warnToast(context, R.string.carbsconstraintapplied)
ToastUtils.warnToast(context, R.string.carbs_constraint_applied)
}
if (SafeParse.stringToDouble(binding.insulin.text) > maxInsulin) {
binding.insulin.value = 0.0
ToastUtils.warnToast(context, R.string.bolusconstraintapplied)
ToastUtils.warnToast(context, R.string.bolus_constraint_applied)
}
}
@ -137,7 +137,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
if (carbsAfterConstraints > 0) {
actions.add(rh.gs(R.string.carbs) + ": " + rh.gs(R.string.format_carbs, carbsAfterConstraints).formatColor(context, rh, R.attr.carbsColor))
if (carbsAfterConstraints != carbs)
actions.add(rh.gs(R.string.carbsconstraintapplied).formatColor(context, rh, R.attr.warningColor))
actions.add(rh.gs(R.string.carbs_constraint_applied).formatColor(context, rh, R.attr.warningColor))
}
if (insulinAfterConstraints > 0 || carbsAfterConstraints > 0) {
activity?.let { activity ->

View file

@ -411,7 +411,7 @@ class WizardDialog : DaggerDialogFragment() {
val carbsAfterConstraint = constraintChecker.applyCarbsConstraints(Constraint(carbs)).value()
if (abs(carbs - carbsAfterConstraint) > 0.01) {
binding.carbsInput.value = 0.0
ToastUtils.warnToast(ctx, R.string.carbsconstraintapplied)
ToastUtils.warnToast(ctx, R.string.carbs_constraint_applied)
return
}

View file

@ -28,7 +28,7 @@ import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.JsonHelper
import info.nightscout.androidaps.utils.JsonHelper.safeGetLong
import info.nightscout.androidaps.interfaces.BuildHelper
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.shared.sharedPreferences.SP
import java.util.concurrent.TimeUnit
import javax.inject.Inject

View file

@ -35,8 +35,8 @@ import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.database.interfaces.end
import info.nightscout.androidaps.databinding.OverviewFragmentBinding
import info.nightscout.androidaps.dialogs.CalibrationDialog
import info.nightscout.androidaps.dialogs.CarbsDialog
import info.nightscout.ui.dialogs.CalibrationDialog
import info.nightscout.ui.dialogs.CarbsDialog
import info.nightscout.androidaps.dialogs.InsulinDialog
import info.nightscout.androidaps.dialogs.LoopDialog
import info.nightscout.androidaps.dialogs.ProfileSwitchDialog

View file

@ -12,7 +12,7 @@ import info.nightscout.androidaps.database.entities.*
import info.nightscout.androidaps.database.interfaces.end
import info.nightscout.androidaps.database.transactions.CancelCurrentTemporaryTargetIfAnyTransaction
import info.nightscout.androidaps.database.transactions.InsertAndCancelCurrentTemporaryTargetTransaction
import info.nightscout.androidaps.dialogs.CarbsDialog
import info.nightscout.ui.dialogs.CarbsDialog
import info.nightscout.androidaps.dialogs.InsulinDialog
import info.nightscout.androidaps.events.EventMobileToWear
import info.nightscout.androidaps.extensions.convertedToAbsolute
@ -469,7 +469,7 @@ class DataHandlerMobile @Inject constructor(
message += rh.gs(R.string.bolus) + ": " + insulinAfterConstraints + "U\n"
message += rh.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"
if (insulinAfterConstraints - command.insulin != 0.0 || carbsAfterConstraints - command.carbs != 0)
message += "\n" + rh.gs(R.string.constraintapllied)
message += "\n" + rh.gs(R.string.constraint_applied)
rxBus.send(
EventMobileToWear(
EventData.ConfirmAction(
@ -487,7 +487,7 @@ class DataHandlerMobile @Inject constructor(
"\n" + rh.gs(R.string.time) + ": " + dateUtil.timeString(startTimeStamp) +
"\n" + rh.gs(R.string.duration) + ": " + command.duration + "h"
if (carbsAfterConstraints - command.carbs != 0) {
message += "\n" + rh.gs(R.string.constraintapllied)
message += "\n" + rh.gs(R.string.constraint_applied)
}
if (carbsAfterConstraints <= 0) {
sendError("Carbs = 0! No action taken!")
@ -512,7 +512,7 @@ class DataHandlerMobile @Inject constructor(
}
val insulinAfterConstraints = constraintChecker.applyBolusConstraints(Constraint(amount)).value()
var message = rh.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"
if (insulinAfterConstraints - amount != 0.0) message += "\n" + rh.gs(R.string.constraintapllied)
if (insulinAfterConstraints - amount != 0.0) message += "\n" + rh.gs(R.string.constraint_applied)
rxBus.send(
EventMobileToWear(
EventData.ConfirmAction(
@ -526,7 +526,7 @@ class DataHandlerMobile @Inject constructor(
private fun handleFillPreCheck(command: EventData.ActionFillPreCheck) {
val insulinAfterConstraints = constraintChecker.applyBolusConstraints(Constraint(command.insulin)).value()
var message = rh.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"
if (insulinAfterConstraints - command.insulin != 0.0) message += "\n" + rh.gs(R.string.constraintapllied)
if (insulinAfterConstraints - command.insulin != 0.0) message += "\n" + rh.gs(R.string.constraint_applied)
rxBus.send(
EventMobileToWear(
EventData.ConfirmAction(

View file

@ -31,7 +31,7 @@ import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP

View file

@ -19,7 +19,7 @@ import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import java.util.*

View file

@ -16,7 +16,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import javax.inject.Inject

View file

@ -23,8 +23,8 @@ import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.shared.sharedPreferences.SP
import io.reactivex.rxjava3.disposables.CompositeDisposable
import javax.inject.Inject

View file

@ -25,7 +25,7 @@ import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP

View file

@ -17,7 +17,7 @@ import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import org.json.JSONArray

View file

@ -24,7 +24,7 @@ import info.nightscout.androidaps.plugins.general.overview.notifications.Notific
import info.nightscout.androidaps.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import org.json.JSONObject

View file

@ -17,7 +17,7 @@ import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.utils.JsonHelper.safeGetString
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import org.json.JSONArray

View file

@ -12,7 +12,7 @@ import info.nightscout.androidaps.interfaces.*
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.utils.extensions.isRunningTest
import info.nightscout.shared.sharedPreferences.SP

View file

@ -15,7 +15,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.shared.sharedPreferences.SP
import javax.inject.Inject

View file

@ -1,7 +1,6 @@
package info.nightscout.androidaps.utils.wizard
import android.content.Context
import android.content.Intent
import android.text.Spanned
import com.google.common.base.Joiner
import dagger.android.HasAndroidInjector
@ -32,6 +31,7 @@ import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.*
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.interfaces.BolusTimer
import info.nightscout.shared.sharedPreferences.SP
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
@ -349,11 +349,11 @@ class BolusWizard @Inject constructor(
}
accepted = true
if (calculatedTotalInsulin > 0.0)
bolusTimer.removeBolusReminder()
bolusTimer.removeAutomationEventBolusReminder()
if (carbs > 0.0)
carbTimer.removeEatReminder()
carbTimer.removeAutomationEventEatReminder()
if (sp.getBoolean(R.string.key_usebolusadvisor, false) && Profile.toMgdl(bg, profile.units) > 180 && carbs > 0 && carbTime >= 0)
OKDialog.showYesNoCancel(ctx, rh.gs(R.string.bolusadvisor), rh.gs(R.string.bolusadvisormessage),
OKDialog.showYesNoCancel(ctx, rh.gs(R.string.bolus_advisor), rh.gs(R.string.bolus_advisor_message),
{ bolusAdvisorProcessing(ctx) },
{ commonProcessing(ctx) }
)
@ -390,7 +390,7 @@ class BolusWizard @Inject constructor(
if (!result.success) {
ErrorHelperActivity.runAlarm(ctx, result.comment, rh.gs(R.string.treatmentdeliveryerror), R.raw.boluserror)
} else
carbTimer.scheduleEatReminder()
carbTimer.scheduleAutomationEventEatReminder()
}
})
}
@ -487,7 +487,7 @@ class BolusWizard @Inject constructor(
}
if (useAlarm && carbs > 0 && carbTime > 0) {
carbTimer.scheduleReminder(T.mins(carbTime.toLong()).secs().toInt())
carbTimer.scheduleTimeToEatReminder(T.mins(carbTime.toLong()).secs().toInt())
}
}
})

View file

@ -90,7 +90,7 @@
android:layout_gravity="center_horizontal"
android:width="120dp"
android:padding="10dp"
android:text="@string/treatments_wizard_bg_label"
android:text="@string/bg_label"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -99,7 +99,7 @@
android:layout_width="130dp"
android:layout_height="40dp"
android:layout_marginBottom="2dp"
app:customContentDescription="@string/treatments_wizard_bg_label" />
app:customContentDescription="@string/bg_label" />
<TextView
android:id="@+id/bg_units"

View file

@ -104,7 +104,7 @@
android:layout_gravity="center_horizontal"
android:width="120dp"
android:padding="10dp"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -112,7 +112,7 @@
android:id="@+id/carbs"
android:layout_width="130dp"
android:layout_height="40dp"
app:customContentDescription="@string/treatments_wizard_carbs_label" />
app:customContentDescription="@string/carbs" />
<TextView
android:layout_width="wrap_content"

View file

@ -61,7 +61,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="10dp"
android:text="@string/treatments_wizard_bg_label"
android:text="@string/bg_label"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -95,7 +95,7 @@
android:layout_weight="1"
android:labelFor="@id/carbs_input"
android:padding="10dp"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -105,7 +105,7 @@
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="2dp"
app:customContentDescription="@string/treatments_wizard_carbs_label" />
app:customContentDescription="@string/carbs" />
<TextView
android:layout_width="wrap_content"
@ -229,7 +229,7 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:checked="true"
android:contentDescription="@string/treatments_wizard_bg_label"
android:contentDescription="@string/bg_label"
android:drawableTop="@drawable/checkbox_bg_icon"
android:scaleX="1.4"
android:scaleY="1.4" />
@ -436,7 +436,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/treatments_wizard_bg_label" />
android:text="@string/bg_label" />
<CheckBox
android:id="@+id/tt_checkbox"
@ -571,7 +571,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="86dp"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>

View file

@ -62,7 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="24dp"
android:text="@string/treatments_wizard_bg_label"
android:text="@string/bg_label"
android:textAppearance="?android:attr/textAppearanceSmall" />
<CheckBox
@ -288,7 +288,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="86dp"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView

View file

@ -74,7 +74,7 @@
android:drawableTop="@drawable/ic_cp_bolus_carbs"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textColor="?attr/icBolusCarbsColor"
app:iconPadding="-4dp" />
@ -102,7 +102,7 @@
android:drawableTop="@drawable/ic_calibration"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/overview_calibration"
android:text="@string/calibration"
android:textColor="?attr/icCalibrationColor"
android:visibility="gone"
app:iconPadding="-4dp" />

View file

@ -652,7 +652,7 @@
<string name="resettodefaults">Възстанови настройките по подразбиране</string>
<string name="nsmalfunction">Грешка в NSClient. Рестартирайте Nightscout и NSClient</string>
<string name="time_offset">времево отместване</string>
<string name="bolus_reminder">Напомни за болус по-късно</string>
<string name="remind_to_bolus_later">Напомни за болус по-късно</string>
<string name="setupwizard_preferred_aps_mode">Предпочитаният режим на APS</string>
<string name="treatments_wizard_total_label">Общо</string>
<string name="calculation_short">Калк</string>
@ -809,7 +809,7 @@
<string name="enablebolusadvisor_summary">Използвай напомняне за старт на хранене вместо съветника по време на висока гликемия (\"пре-болус\")</string>
<string name="time_to_eat">Време за ядене!\nИзпълнете болус съветника и направете изчисления отново.</string>
<string name="timetoeat">Време е за ядене</string>
<string name="bolusreminder">Болус подсещане</string>
<string name="bolus_reminder">Болус подсещане</string>
<string name="enablebolusreminder">Включи подсещането за болус</string>
<string name="enablebolusreminder_summary">Използвай подсещане за болус по-късно със съветник (\"след-болус\")</string>
<string name="time_to_bolus">Време е за болус!\nВключи болус съветника и направи изчисление отново.</string>

View file

@ -692,7 +692,7 @@
<string name="resettodefaults">Obnovit výchozí</string>
<string name="nsmalfunction">Chyba NSClienta. Zvažte restart NS a NSClienta.</string>
<string name="time_offset">Časový posun</string>
<string name="bolus_reminder">Upozornit později na bolus</string>
<string name="remind_to_bolus_later">Upozornit později na bolus</string>
<string name="setupwizard_preferred_aps_mode">Preferovaný režim APS</string>
<string name="treatments_wizard_total_label">Výsledek</string>
<string name="calculation_short">Kalk</string>
@ -864,7 +864,7 @@
<string name="enablebolusadvisor_summary">Při vysoké glykémii použijte připomenutí, abyste začali jíst později, namísto výsledku z kalkulátoru („prebolus“)</string>
<string name="time_to_eat">Čas k jídlu!\nSpusťte Bolusovou kalkulačku a proveďte výpočet znovu.</string>
<string name="timetoeat">Čas k jídlu</string>
<string name="bolusreminder">Připomenutí bolusu</string>
<string name="bolus_reminder">Připomenutí bolusu</string>
<string name="enablebolusreminder">Povolit připomínání bolusu</string>
<string name="enablebolusreminder_summary">Použijte připomenutí pro pozdější bolus s kalkulátorem
(\"zpožděný bolus\")</string>

View file

@ -679,7 +679,7 @@
<string name="resettodefaults">Nulstil til standardindstillinger</string>
<string name="nsmalfunction">NSClient funktionsfejl. Overvej NS og NSClient genstart.</string>
<string name="time_offset">Tidsforskydning</string>
<string name="bolus_reminder">Påmind om at bolus senere</string>
<string name="remind_to_bolus_later">Påmind om at bolus senere</string>
<string name="setupwizard_preferred_aps_mode">Foretrukket APS-tilstand</string>
<string name="treatments_wizard_total_label">I alt</string>
<string name="calculation_short">Beregn</string>
@ -847,7 +847,7 @@
<string name="enablebolusadvisor_summary">Brug påmindelse om at begynde at spise senere i stedet for guiden under høj glykæmi (\"pre-bolus\")</string>
<string name="time_to_eat">Tid til at spise!\nKør Bolus guiden og lav beregning igen.</string>
<string name="timetoeat">Tid til at spise</string>
<string name="bolusreminder">Boluspåminder</string>
<string name="bolus_reminder">Boluspåminder</string>
<string name="enablebolusreminder">Aktivér boluspåminder</string>
<string name="enablebolusreminder_summary">Brug påmindelse til bolus senere med guiden
(\"post-bolus\")</string>

View file

@ -679,7 +679,7 @@
<string name="resettodefaults">Auf Standardwerte zurücksetzen</string>
<string name="nsmalfunction">NSClient Störung. Ziehe einen Neustart von NS und NSClient in Betracht.</string>
<string name="time_offset">Zeitversatz</string>
<string name="bolus_reminder">Später an Bolus erinnern</string>
<string name="remind_to_bolus_later">Später an Bolus erinnern</string>
<string name="setupwizard_preferred_aps_mode">Bevorzugter APS-Modus</string>
<string name="treatments_wizard_total_label">Gesamt</string>
<string name="calculation_short">Berech.</string>
@ -848,7 +848,7 @@ Unerwartetes Verhalten.</string>
<string name="enablebolusadvisor_summary">Option zur Erinnerung an späteres Essen (z.B. bei hohen BZ-Werten) im Bolus-Rechner (\"Spritz-Ess-Abstand\")</string>
<string name="time_to_eat">Zeit zum Essen!\nStarte den Bolus-Rechner und gib die KH ein. </string>
<string name="timetoeat">Zeit zum Essen</string>
<string name="bolusreminder">Bolus-Erinnerung</string>
<string name="bolus_reminder">Bolus-Erinnerung</string>
<string name="enablebolusreminder">Bolus-Erinnerung aktivieren</string>
<string name="enablebolusreminder_summary">Erinnerung an späteren Bolus mit dem Assistenten verwenden
(\"Post-Bolus\")</string>

View file

@ -692,7 +692,7 @@
<string name="resettodefaults">Restablecer valores predeterminados</string>
<string name="nsmalfunction">NSClient fallando. Considera reiniciar NS y NSClient.</string>
<string name="time_offset">Retardo</string>
<string name="bolus_reminder">Recordar ejecutar el bolo más tarde</string>
<string name="remind_to_bolus_later">Recordar ejecutar el bolo más tarde</string>
<string name="setupwizard_preferred_aps_mode">Modo preferido de APS</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Cálculo</string>
@ -864,7 +864,7 @@
<string name="enablebolusadvisor_summary">Utiliza un recordatorio para empezar a comer más tarde, en lugar del resultado del asistente durante una glucemia alta (\"pre-bolo\")</string>
<string name="time_to_eat">¡Hora de comer!\nEjecutar el asistente de bolo y calcular de nuevo.</string>
<string name="timetoeat">Hora de comer</string>
<string name="bolusreminder">Recordatorio de bolo</string>
<string name="bolus_reminder">Recordatorio de bolo</string>
<string name="enablebolusreminder">Habilitar recordatorio de bolo</string>
<string name="enablebolusreminder_summary">Usa recordatorio de bolo más tarde con el asistente
(\"post-bolus\")</string>

View file

@ -693,7 +693,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="resettodefaults">Réinitialiser les valeurs par défaut</string>
<string name="nsmalfunction">Dysfonctionnement NSClient. Redémarrez NS et NSClient.</string>
<string name="time_offset">Décalage horaire</string>
<string name="bolus_reminder">Rappel du bolus plus tard</string>
<string name="remind_to_bolus_later">Rappel du bolus plus tard</string>
<string name="setupwizard_preferred_aps_mode">Mode APS préféré</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Calc</string>
@ -865,7 +865,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="enablebolusadvisor_summary">Utiliser un rappel pour commencer le repas à la place du résultat de l\'assistant quand la glycémie est élevée (\"pré-bolus\")</string>
<string name="time_to_eat">Il est temps de manger !\nExécutez l\'assistant Bolus et refaites le calcul.</string>
<string name="timetoeat">Il est temps de manger</string>
<string name="bolusreminder">Rappel bolus</string>
<string name="bolus_reminder">Rappel bolus</string>
<string name="enablebolusreminder">Activer le rappel bolus</string>
<string name="enablebolusreminder_summary">Utiliser un rappel pour faire le bolus plus tard avec l\'Assistant (\"post-bolus\")</string>
<string name="time_to_bolus">Il est temps de faire le bolus !\nExécutez l\'Assistant et faites de nouveau le calcul.</string>

View file

@ -682,7 +682,7 @@
<string name="resettodefaults">Ripristina valori predefiniti</string>
<string name="nsmalfunction">Malfunzionamento NSClient. Considera il riavvio di NS e NSClient.</string>
<string name="time_offset">Offset</string>
<string name="bolus_reminder">Ricorda di fare il bolo</string>
<string name="remind_to_bolus_later">Ricorda di fare il bolo</string>
<string name="setupwizard_preferred_aps_mode">Modalità APS preferita</string>
<string name="treatments_wizard_total_label">Totale</string>
<string name="calculation_short">Calc</string>
@ -850,7 +850,7 @@
<string name="enablebolusadvisor_summary">Usa un promemoria per iniziare a mangiare invece del risultato del calcolatore durante la glicemia alta (\"pre-bolo\")</string>
<string name="time_to_eat">Tempo di mangiare!\nEsegui il calcolatore e fai di nuovi i calcoli.</string>
<string name="timetoeat">Tempo di mangiare</string>
<string name="bolusreminder">Promemoria bolo</string>
<string name="bolus_reminder">Promemoria bolo</string>
<string name="enablebolusreminder">Abilita promemoria bolo</string>
<string name="enablebolusreminder_summary">Usa promemoria bolo con calcolatore
(\"post-bolo\")</string>

View file

@ -681,7 +681,7 @@
<string name="resettodefaults">אפס לברירת המחדל</string>
<string name="nsmalfunction">תקלה ב-NSClient. שקלו להפעיל את Nightscout ו-NSClient מחדש.</string>
<string name="time_offset">היסט זמן</string>
<string name="bolus_reminder">תזכורת להזרקת בולוס אח\"כ</string>
<string name="remind_to_bolus_later">תזכורת להזרקת בולוס אח\"כ</string>
<string name="setupwizard_preferred_aps_mode">מצב APS מועדף</string>
<string name="treatments_wizard_total_label">סה\"כ</string>
<string name="calculation_short">חישוב</string>
@ -849,7 +849,7 @@
<string name="enablebolusadvisor_summary">מציג תזכורת לאכול אחר כך במקום להזריק את המינון שהומלץ ע\"י האשף בעת היפרגליקמיה (\"בולוס מקדים\")</string>
<string name="time_to_eat">זמן לאכול!\nהפעילו את אשף הבולוסים וחשבו בולוס חדש.</string>
<string name="timetoeat">זמן לאכול</string>
<string name="bolusreminder">תזכורת בולוס</string>
<string name="bolus_reminder">תזכורת בולוס</string>
<string name="enablebolusreminder">אפשר את תזכורת בולוס</string>
<string name="enablebolusreminder_summary">השתמש בתזכורת כדי להזריק בולוס מאוחר יותר במחשבון
(\"פוסט-בולוס\")</string>

View file

@ -659,7 +659,7 @@
<string name="resettodefaults">Atkurti numatytuosius</string>
<string name="nsmalfunction">NSClient sutrikimas. Reikėtų paleisti iš naujo NS ir NSClient.</string>
<string name="time_offset">Laiko poslinkis</string>
<string name="bolus_reminder">Priminti apie bolusą vėliau</string>
<string name="remind_to_bolus_later">Priminti apie bolusą vėliau</string>
<string name="setupwizard_preferred_aps_mode">Pageidaujamas DKS režimas</string>
<string name="treatments_wizard_total_label">Viso</string>
<string name="calculation_short">Skaič.</string>
@ -819,7 +819,7 @@
<string name="enablebolusadvisor_summary">Galimybė priminti jums valgyti vėliau (pvz., esant aukštai glikemijai) boliuso vedlyje („po susileidimo palaukti ir valgyti vėliau“)</string>
<string name="time_to_eat">Laikas valgyti!\nĮjunkite Boluso patarėją ir atlikite skaičiavimą dar kartą.</string>
<string name="timetoeat">Laikas valgyti</string>
<string name="bolusreminder">Priminimas apie bolusą</string>
<string name="bolus_reminder">Priminimas apie bolusą</string>
<string name="enablebolusreminder">Įgalinti priminimą apie bolusą</string>
<string name="enablebolusreminder_summary">Naudoti priminimus apie bolusą su skaičiuotuvu („post-bolusas“)</string>
<string name="time_to_bolus">Laikas bolusui!\nĮjunkite Skaičiuotuvą ir pakartokite skaičiavimus.</string>

View file

@ -679,7 +679,7 @@
<string name="resettodefaults">Terug naar standaardinstellingen</string>
<string name="nsmalfunction">NSClient werkt niet goed. Overweg een herstart van NS en NSClient.</string>
<string name="time_offset">Tijdverschuiving</string>
<string name="bolus_reminder">Herinner later te bolussen</string>
<string name="remind_to_bolus_later">Herinner later te bolussen</string>
<string name="setupwizard_preferred_aps_mode">Voorkeur APS-modus</string>
<string name="treatments_wizard_total_label">Totaal</string>
<string name="calculation_short">Calc</string>
@ -847,7 +847,7 @@
<string name="enablebolusadvisor_summary">Gebruik bij een hoge bloedglucose niet het resultaat van de wizard, maar een herinnering om later met eten te beginnen (\"pre-bolus\")</string>
<string name="time_to_eat">Tijd om te eten!\nVoer de boluswizard opnieuw uit.</string>
<string name="timetoeat">Tijd om te eten</string>
<string name="bolusreminder">Bolus herinnering</string>
<string name="bolus_reminder">Bolus herinnering</string>
<string name="enablebolusreminder">Bolus herinnering inschakelen</string>
<string name="enablebolusreminder_summary">Gebruik herinnering om later te bolussen met de wizard
(\"post-bolus\")</string>

View file

@ -682,7 +682,7 @@
<string name="resettodefaults">Gjenopprett standardinnstillinger</string>
<string name="nsmalfunction">NSClient feil. Vurder omstart av NS og NSClient.</string>
<string name="time_offset">Tidsforskyvning</string>
<string name="bolus_reminder">Påminnelse til å gi bolus senere</string>
<string name="remind_to_bolus_later">Påminnelse til å gi bolus senere</string>
<string name="setupwizard_preferred_aps_mode">Foretrukket APS modus</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Kalkyle</string>
@ -850,7 +850,7 @@
<string name="enablebolusadvisor_summary">Bruk en påminnelse om å spise senere enn kalkulator resultatet fra wizard ved høyt blodsukker (\"pre-bolus\")</string>
<string name="time_to_eat">Nå må du spise!\Bruk bolus veiviseren og beregn på nytt.</string>
<string name="timetoeat">Nå må du spise</string>
<string name="bolusreminder">Bolus påminnelse</string>
<string name="bolus_reminder">Bolus påminnelse</string>
<string name="enablebolusreminder">Aktiver bolus påminnelse</string>
<string name="enablebolusreminder_summary">Bruk påminnelse for å sette bolus dosen senere med veiviseren
(«post bolus»)</string>

View file

@ -661,7 +661,7 @@
<string name="resettodefaults">Przywróć ustawienia domyślne</string>
<string name="nsmalfunction">Usterka NSClient. Spróbuj zrestartować NS i NSClient.</string>
<string name="time_offset">Przesunięcie czasu</string>
<string name="bolus_reminder">Przypomnij o bolusie</string>
<string name="remind_to_bolus_later">Przypomnij o bolusie</string>
<string name="setupwizard_preferred_aps_mode">Preferowany tryb APS</string>
<string name="treatments_wizard_total_label">Razem</string>
<string name="calculation_short">Kalk</string>
@ -824,7 +824,7 @@
<string name="enablebolusadvisor_summary">Użyj przypomnienia, aby rozpocząć jedzenie później podczas wysokiej glikemii (\"pre-bolus\")</string>
<string name="time_to_eat">Czas jeść!\nUruchom kreatora bolusa i zrób obliczenia ponownie.</string>
<string name="timetoeat">Czas na jedzenie</string>
<string name="bolusreminder">Przypomnienie bolusa</string>
<string name="bolus_reminder">Przypomnienie bolusa</string>
<string name="enablebolusreminder">Włącz przypomnienie bolusa</string>
<string name="enablebolusreminder_summary">Użyj przypomnienia o potrzebie obliczenia i podania bolusa kalkulatorem (\"opóźniony bolus\")</string>
<string name="time_to_bolus">Czas na bolus!\nUruchom Kalkulator bolusa aby ponownie wykonać obliczenia.</string>

View file

@ -785,7 +785,7 @@
<string name="enablebolusadvisor">Ativar o assistente de bolus</string>
<string name="time_to_eat">Hora de comer!\nAbra o assistente de bolus e faça o cálculo novamente.</string>
<string name="timetoeat">Hora de comer</string>
<string name="bolusreminder">Lembrete de bolus</string>
<string name="bolus_reminder">Lembrete de bolus</string>
<string name="enablebolusreminder">Ativar lembrete de bolus</string>
<string name="enablebolusreminder_summary">Usar lembrete para adiar o bolus com o assistente
(\"pós-bolus\")</string>

View file

@ -659,7 +659,7 @@
<string name="resettodefaults">Repor definições por defeito</string>
<string name="nsmalfunction">Erro de funcionamento do ClienteNS. Pondere reiniciar o NS e ClienteNS.</string>
<string name="time_offset">Fuso horário</string>
<string name="bolus_reminder">Lembrete para bólus mais tarde</string>
<string name="remind_to_bolus_later">Lembrete para bólus mais tarde</string>
<string name="setupwizard_preferred_aps_mode">Modo APS preferido</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Calc</string>
@ -819,7 +819,7 @@
<string name="enablebolusadvisor_summary">Use lembrete para começar a comer mais tarde em vez di resultado do assistente durante a glicemia alta (\"pré-bolus\")</string>
<string name="time_to_eat">Hora de comer!\nExecutar assistente de Bólus e fazer cálculo novamente.</string>
<string name="timetoeat">Hora de comer</string>
<string name="bolusreminder">Lembrete de bólus</string>
<string name="bolus_reminder">Lembrete de bólus</string>
<string name="enablebolusreminder">Ativar lembrete de bólus</string>
<string name="enablebolusreminder_summary">Usar lembrete para bólus mais tarde com o assistente
(\"pós-bólus\")</string>

View file

@ -659,7 +659,7 @@
<string name="resettodefaults">Resetare la setările implicite</string>
<string name="nsmalfunction">Funcționare incorectă a NSClient. Aveți în vedere un restart al NS și al NSClient.</string>
<string name="time_offset">Decalaj</string>
<string name="bolus_reminder">Amintește-mi sa fac bolus mai târziu</string>
<string name="remind_to_bolus_later">Amintește-mi sa fac bolus mai târziu</string>
<string name="setupwizard_preferred_aps_mode">Modul APS preferat</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Calc</string>
@ -819,7 +819,7 @@
<string name="enablebolusadvisor_summary">Folosește o alarma de reamintire pentru a începe sa mănânci mai târziu în loc de alerta de la calculatorul de bolus din timpul hiperglicemiei (\"pre-bolus\")</string>
<string name="time_to_eat">Timpul sa mănânci!\nRuleaza Calculatorul de Bolus pentru a face calculele din nou.</string>
<string name="timetoeat">Timpul sa mănânci</string>
<string name="bolusreminder">Memento bolus</string>
<string name="bolus_reminder">Memento bolus</string>
<string name="enablebolusreminder">Activează memento bolus</string>
<string name="enablebolusreminder_summary">Folosește memento pentru a bolusa mai târziu cu asistentul
(\"post-bolus\")</string>

View file

@ -682,7 +682,7 @@
<string name="resettodefaults">Восстановить значения по умолчанию</string>
<string name="nsmalfunction">Некорректная работа NSClient. Возможно следует перезапустить NS и NSClient.</string>
<string name="time_offset">Смещение по времени</string>
<string name="bolus_reminder">Напомнить о болюсе позже</string>
<string name="remind_to_bolus_later">Напомнить о болюсе позже</string>
<string name="setupwizard_preferred_aps_mode">Предпочитаемый режим APS</string>
<string name="treatments_wizard_total_label">Итого</string>
<string name="calculation_short">Кальк</string>
@ -850,7 +850,7 @@
<string name="enablebolusadvisor_summary">Используйте напоминание для того, чтобы начать есть позже, вместо того, чтобы воспользоваться помощником болюса на высоких значениях ГК (\"пре-болюс\")</string>
<string name="time_to_eat">Пора есть!\nЗапустите помощник болюса снова для подсчета.</string>
<string name="timetoeat">Пора есть</string>
<string name="bolusreminder">Напоминание о болюсе</string>
<string name="bolus_reminder">Напоминание о болюсе</string>
<string name="enablebolusreminder">Включить напоминание о болюсе</string>
<string name="enablebolusreminder_summary">Применить напоминание о болюсе с помощью мастера (постболюс)</string>
<string name="time_to_bolus">Пора дать болюс!\nЗапустите помощник болюса и повторите расчет.</string>

View file

@ -692,7 +692,7 @@
<string name="resettodefaults">Obnoviť predvolené</string>
<string name="nsmalfunction">Chyba NSClienta. Zvážte reštart NS a NSClienta.</string>
<string name="time_offset">Časový posun</string>
<string name="bolus_reminder">Upozorniť na bolus neskôr</string>
<string name="remind_to_bolus_later">Upozorniť na bolus neskôr</string>
<string name="setupwizard_preferred_aps_mode">Preferovaný režim APS</string>
<string name="treatments_wizard_total_label">Spolu</string>
<string name="calculation_short">Kalk</string>
@ -864,7 +864,7 @@
<string name="enablebolusadvisor_summary">Pri vysokej glykémii spustiť pripomienku namiesto výsledku z kalkulačky, aby ste začali jesť neskôr (tzv. \"prebolus\")</string>
<string name="time_to_eat">Čas na jedlo!\nSpustite Bolusovú kalkulačku a urobte výpočet znova.</string>
<string name="timetoeat">Čas na jedlo</string>
<string name="bolusreminder">Pripomenutie bolusu</string>
<string name="bolus_reminder">Pripomenutie bolusu</string>
<string name="enablebolusreminder">Zapnúť pripomínanie bolusu</string>
<string name="enablebolusreminder_summary">Použite pripomenutie pre neskorší bolus s kalkulačkou
(\"oneskorený bolus\")</string>

View file

@ -664,7 +664,7 @@ Eversense-appen.</string>
<string name="resettodefaults">Återställ standardinställningar</string>
<string name="nsmalfunction">Fel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen.</string>
<string name="time_offset">KH-tid</string>
<string name="bolus_reminder">Påminn om bolus senare</string>
<string name="remind_to_bolus_later">Påminn om bolus senare</string>
<string name="setupwizard_preferred_aps_mode">Föredraget APS-läge</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Kalkyl</string>
@ -826,7 +826,7 @@ Eversense-appen.</string>
<string name="enablebolusadvisor_summary">Få en påminnelse om att börja äta senare (istället för kalkylatorns resultat) om du ligger högt i BG</string>
<string name="time_to_eat">Dags att äta!\nKör bolusguiden igen för ny beräkning.</string>
<string name="timetoeat">Dags att äta</string>
<string name="bolusreminder">Boluspåminnelse</string>
<string name="bolus_reminder">Boluspåminnelse</string>
<string name="enablebolusreminder">Aktivera boluspåminnelse</string>
<string name="enablebolusreminder_summary">Använd påminnelse för att ge bolus senare
(\"post-bolus\")</string>

View file

@ -679,7 +679,7 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
<string name="resettodefaults">Varsayılanlara sıfırla</string>
<string name="nsmalfunction">NSClient arızası. NS ve NSClient yeniden başlatmayı düşünün.</string>
<string name="time_offset">Saat farkı</string>
<string name="bolus_reminder">Bolusu daha sonra hatırlat</string>
<string name="remind_to_bolus_later">Bolusu daha sonra hatırlat</string>
<string name="setupwizard_preferred_aps_mode">Tercih edilen APS modu</string>
<string name="treatments_wizard_total_label">Toplam</string>
<string name="calculation_short">Hesap</string>
@ -846,7 +846,7 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
<string name="enablebolusadvisor_summary">Yüksek glisemi sırasında sihirbaz sonucu yerine daha sonra yemeye başlamak için hatırlatıcı kullanın (\"pre-bolus\")</string>
<string name="time_to_eat">Yemek zamanı!\nBolus sihirbazını çalıştırın ve yeniden hesaplama yapın.</string>
<string name="timetoeat">Yemek zamanı</string>
<string name="bolusreminder">Bolus hatırlatıcısı</string>
<string name="bolus_reminder">Bolus hatırlatıcısı</string>
<string name="enablebolusreminder">Bolus hatırlatıcıyı etkinleştir</string>
<string name="enablebolusreminder_summary">Sihirbazla daha sonra bolus için hatırlatıcı kullanın
(\"bolus sonrası\")</string>

View file

@ -669,7 +669,7 @@
<string name="resettodefaults">重置为默认值</string>
<string name="nsmalfunction">NSClient故障。 考虑Nightscout和NSClient重启。</string>
<string name="time_offset">时区偏移</string>
<string name="bolus_reminder">稍后提醒输注大剂量</string>
<string name="remind_to_bolus_later">稍后提醒输注大剂量</string>
<string name="setupwizard_preferred_aps_mode">首选的APS模式</string>
<string name="treatments_wizard_total_label">总计</string>
<string name="calculation_short">计算</string>
@ -833,7 +833,7 @@
<string name="enablebolusadvisor_summary">在高血糖期间(\"预测大剂量\"),使用延迟吃饭的提醒功能,来替代大剂量向导结果</string>
<string name="time_to_eat">吃饭时间到了!\n请运行大剂量向导然后进行计算。</string>
<string name="timetoeat">吃饭时间</string>
<string name="bolusreminder">大剂量提醒</string>
<string name="bolus_reminder">大剂量提醒</string>
<string name="enablebolusreminder">启用大剂量提醒</string>
<string name="enablebolusreminder_summary">使用大剂量向导稍后推注的提醒功能
(“稍后注射大剂量”)</string>

View file

@ -108,9 +108,7 @@
<string name="tempbasals_netinsulin_label_string">Ins:</string>
<string name="tempbasals_iob_label_string">IOB:</string>
<string name="tempbasals_iobtotal_label_string">Total IOB:</string>
<string name="treatments_wizard_bg_label">BG</string>
<string name="treatments_wizard_tt_label">TT</string>
<string name="treatments_wizard_carbs_label">Carbs</string>
<string name="treatments_wizard_correction_label">Corr</string>
<string name="bolus_iob_label">Bolus IOB</string>
<string name="openapsma_run">Run now</string>
@ -151,11 +149,9 @@
<string name="safety">Safety</string>
<string name="openapsma_disabled">Plugin is disabled</string>
<string name="constraints_violation">Constraints violation</string>
<string name="treatmentdeliveryerror">Bolus reported an error. Manually check real delivered amount</string>
<string name="setbasalquestion">Accept new temp basal:</string>
<string name="overview_treatment_label">Treatment</string>
<string name="overview_calculator_label">Calculator</string>
<string name="constraintapllied">Constraint applied!</string>
<string name="sms_bolus">Bolus:</string>
<string name="sms_basal">Basal:</string>
<string name="changeyourinput">Change your input!</string>
@ -171,8 +167,6 @@
<string name="carbssuggestion">Carbs Suggestion</string>
<string name="unsupportednsversion">Unsupported version of Nightscout</string>
<string name="treatments_wizard_basaliob_label">Basal IOB</string>
<string name="bolusconstraintapplied">Bolus constraint applied</string>
<string name="carbsconstraintapplied">Carbs constraint applied</string>
<string name="careportal_newnstreatment_other">Other</string>
<string name="careportal_newnstreatment_meter">Meter</string>
<string name="careportal_newnstreatment_sensor">Sensor</string>
@ -345,9 +339,6 @@
<string name="openapsama_link_to_preferncejson_doc_txt">Attention!\nNormally you do not have to change these values below. Please CLICK HERE and READ the text and make sure you UNDERSTAND it before change any of these values.</string>
<string name="openapsama_link_to_preferncejson_doc" translatable="false">http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html</string>
<string name="smscommunicator_invalidphonennumber">Invalid SMS phone number</string>
<string name="overview_calibration">Calibration</string>
<string name="xdripnotinstalled">xDrip+ not installed</string>
<string name="calibrationsent">Calibration sent to xDrip+</string>
<string name="smscommunicator_calibrationsent">Calibration sent. Receiving must be enabled in xDrip+.</string>
<string name="smscommunicator_calibrationfailed">xDrip+ is not receiving calibrations</string>
<string name="pumpsuspended">Pump suspended</string>
@ -496,7 +487,6 @@
<string name="openapsama_autosens_period">Interval for autosens [h]</string>
<string name="openapsama_autosens_period_summary">Amount of hours in the past for sensitivity detection (carbs absorption time is excluded)</string>
<string name="key_openapsama_autosens_period" translatable="false">openapsama_autosens_period</string>
<string name="key_nsclient_localbroadcasts" translatable="false">nsclient_localbroadcasts</string>
<string name="openaps">OpenAPS</string>
<string name="uploader">Uploader</string>
<string name="configbuilder_sensitivity">Sensitivity detection</string>
@ -593,7 +583,6 @@
<string name="carbsReqThreshold">Minimum Carbs Required For Suggestion</string>
<string name="carbsReqThreshold_summary">Minimum grams of carbs to display a carbs suggestion alert. Carbs suggestions below this number will not trigger a notification.</string>
<string name="dexcomg5_xdripupload_title">Send BG data to xDrip+</string>
<string name="key_dexcomg5_xdripupload" translatable="false">dexcomg5_xdripupload</string>
<string name="dexcomg5_xdripupload_summary">In xDrip+ select 640g/Eversense data source</string>
<string name="nsclientbg">NSClient BG</string>
<string name="nsclientbgshort">NS BG</string>
@ -642,9 +631,6 @@
<string name="key_insulin_button_increment_1" translatable="false">insulin_button_increment_1</string>
<string name="key_insulin_button_increment_2" translatable="false">insulin_button_increment_2</string>
<string name="key_insulin_button_increment_3" translatable="false">insulin_button_increment_3</string>
<string name="key_carbs_button_increment_1" translatable="false">carbs_button_increment_1</string>
<string name="key_carbs_button_increment_2" translatable="false">carbs_button_increment_2</string>
<string name="key_carbs_button_increment_3" translatable="false">carbs_button_increment_3</string>
<string name="carb_increment_button_message">Number of carbs to add when button is pressed</string>
<string name="insulin_increment_button_message">Amount of insulin to add when button is pressed</string>
<string name="error_starting_cgm">Could not launch CGM application. Make sure it is installed.</string>
@ -671,7 +657,6 @@
<string name="dexcom_app_not_installed">Dexcom app is not installed.</string>
<string name="start_activity_tt">Start Activity TT</string>
<string name="start_eating_soon_tt">Start Eating soon TT</string>
<string name="temptargetshort">TT</string>
<string name="do_not_bolus_record_only">Do not bolus, record only</string>
<string name="category">Category</string>
<string name="subcategory">Subcategory</string>
@ -684,7 +669,6 @@
<string name="overview_show_cob">Carbs On Board</string>
<string name="overview_show_iob">Insulin On Board</string>
<string name="overview_show_basals">Basals</string>
<string name="no_action_selected">No action selected, nothing will happen</string>
<string name="start_hypo_tt">Start Hypo TT</string>
<string name="closed_loop_disabled_on_dev_branch">Running dev version. Closed loop is disabled.</string>
<string name="engineering_mode_enabled">Engineering mode enabled</string>
@ -846,7 +830,7 @@
<string name="resettodefaults">Reset to defaults</string>
<string name="nsmalfunction">NSClient malfunction. Consider NS and NSClient restart.</string>
<string name="time_offset">Time offset</string>
<string name="bolus_reminder">Remind to bolus later</string>
<string name="remind_to_bolus_later">Remind to bolus later</string>
<string name="key_aps_mode" translatable="false">aps_mode</string>
<string name="setupwizard_preferred_aps_mode">Preferred APS mode</string>
<string name="treatments_wizard_total_label">Total</string>
@ -1048,20 +1032,10 @@
<string name="smscommunicator_report_pump_ureachable_summary">Send SMS if unreachable pump event is triggered</string>
<string name="smscommunicator_pump_ureachable">Report pump unreachable</string>
<string name="advisoralarm">Run alarm when is time to eat</string>
<string name="alarminxmin">Run alarm in %1$d min</string>
<string name="bolusadvisor">Bolus advisor</string>
<string name="bolusadvisormessage">You have high glycemia. Instead of eating now it\'s recommended to wait for better glycemia. Do you want to do a correction bolus now and remind you when it\'s time to eat? In this case no carbs will be recorded and you must use wizard again when we remind you.</string>
<string name="key_usebolusadvisor" translatable="false">use_bolus_advisor</string>
<string name="enablebolusadvisor">Enable bolus advisor</string>
<string name="enablebolusadvisor_summary">Use reminder to start eating later instead of wizard result during high glycemia ("pre-bolus")</string>
<string name="time_to_eat">Time to eat!\nRun Bolus wizard and do calculation again.</string>
<string name="timetoeat">Time to eat</string>
<string name="bolusreminder">Bolus reminder</string>
<string name="key_usebolusreminder" translatable="false">use_bolus_reminder</string>
<string name="enablebolusreminder">Enable bolus reminder</string>
<string name="enablebolusreminder_summary">Use reminder to bolus later with wizard
("post-bolus")</string>
<string name="time_to_bolus">Time to bolus!\nRun Bolus wizard and do calculation again.</string>
<string name="enablebolusreminder_summary">Use reminder to bolus later with wizard ("post-bolus")</string>
<string name="fabric_upload_disabled">Crash logs upload disabled!</string>
<string name="graph_menu_divider_header">Graph</string>
<string name="chart_menu">Chart menu</string>
@ -1219,7 +1193,6 @@
<string name="show_loop">Show loop</string>
<string name="count_selected">%1$d selected</string>
<string name="sort_label">Sort</string>
<string name="dialog_canceled">Dialog canceled</string>
<string name="veryLow" comment="below 3.1">Very low</string>
<string name="low" comment="3.1-3.9">Low</string>
<string name="high" comment="10.0-13.9">High</string>

View file

@ -132,7 +132,7 @@
android:defaultValue="true"
android:key="@string/key_show_calibration_button"
android:summary="@string/show_calibration_button_summary"
android:title="@string/overview_calibration" />
android:title="@string/calibration" />
</androidx.preference.PreferenceScreen>
@ -489,8 +489,8 @@
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_usebolusadvisor"
android:summary="@string/enablebolusadvisor_summary"
android:title="@string/enablebolusadvisor" />
android:summary="@string/enable_bolus_advisor_summary"
android:title="@string/enable_bolus_advisor" />
<SwitchPreference
android:defaultValue="false"

View file

@ -22,7 +22,7 @@
android:defaultValue="true"
android:dependency="@string/key_wear_control"
android:key="@string/key_wearwizard_bg"
android:title="@string/treatments_wizard_bg_label" />
android:title="@string/bg_label" />
<CheckBoxPreference
android:defaultValue="false"

View file

@ -29,7 +29,7 @@ import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.shared.sharedPreferences.SP
import io.reactivex.rxjava3.core.Single
import org.junit.Assert

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.interfaces
interface BolusTimer {
/**
* Create new Automation event to alarm when is time to bolus
*/
fun scheduleAutomationEventBolusReminder()
/**
* Remove Automation event
*/
fun removeAutomationEventBolusReminder()
}

View file

@ -0,0 +1,21 @@
package info.nightscout.androidaps.interfaces
interface CarbTimer {
/**
* Generate reminder via [info.nightscout.androidaps.utils.TimerUtil]
*
* @param seconds seconds to the future
*/
fun scheduleTimeToEatReminder(seconds: Int)
/**
* Create new Automation event to alarm when is time to eat
*/
fun scheduleAutomationEventEatReminder()
/**
* Remove Automation event
*/
fun removeAutomationEventEatReminder()
}

View file

@ -0,0 +1,13 @@
package info.nightscout.androidaps.interfaces
import info.nightscout.androidaps.database.entities.GlucoseValue
import org.json.JSONArray
import org.json.JSONObject
interface XDripBroadcast {
fun sendCalibration(bg: Double): Boolean
fun send(glucoseValue: GlucoseValue)
fun sendProfile(profileStoreJson: JSONObject)
fun sendTreatments(addedOrUpdatedTreatments: JSONArray)
fun sendSgvs(sgvs: JSONArray)
}

View file

@ -3,16 +3,12 @@ package info.nightscout.androidaps.utils
import android.content.Context
import android.content.Intent
import android.provider.AlarmClock
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.ResourceHelper
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class TimerUtil @Inject constructor(
private val context: Context,
private val rh: ResourceHelper,
private val dateUtil: DateUtil
private val context: Context
) {
/**

View file

@ -74,6 +74,12 @@
<string name="key_autotune_additional_log" translatable="false">autotune_additional_log</string>
<string name="key_autotune_plugin" translatable="false">key_autotune_plugin</string>
<string name="key_autotune_last_run" translatable="false">key_autotune_last_run</string>
<string name="key_dexcomg5_xdripupload" translatable="false">dexcomg5_xdripupload</string>
<string name="key_nsclient_localbroadcasts" translatable="false">nsclient_localbroadcasts</string>
<string name="key_usebolusreminder" translatable="false">use_bolus_reminder</string>
<string name="key_carbs_button_increment_1" translatable="false">carbs_button_increment_1</string>
<string name="key_carbs_button_increment_2" translatable="false">carbs_button_increment_2</string>
<string name="key_carbs_button_increment_3" translatable="false">carbs_button_increment_3</string>
<!-- General-->
<string name="refresh">Refresh</string>
@ -188,6 +194,11 @@
<string name="addnew">Add new</string>
<string name="addnew_above">Add new above</string>
<string name="wrong_pump_data">Data is coming from different pump. Change pump driver to reset pump state.</string>
<string name="bg_label">BG</string>
<string name="calibration">Calibration</string>
<string name="alarminxmin">Run alarm in %1$d min</string>
<string name="treatmentdeliveryerror">Bolus reported an error. Manually check real delivered amount</string>
<string name="bolus_reminder">Bolus reminder</string>
<!-- Constraints-->
<string name="limitingbasalratio">Limiting max basal rate to %1$.2f U/h because of %2$s</string>

1
implementation/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,20 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-allopen'
apply plugin: 'com.hiya.jacoco-android'
apply from: "${project.rootDir}/core/android_dependencies.gradle"
apply from: "${project.rootDir}/core/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/test_dependencies.gradle"
apply from: "${project.rootDir}/core/jacoco_global.gradle"
android {
namespace 'info.nightscout.implementation'
}
dependencies {
implementation project(':core')
implementation project(':shared')
implementation project(':database')
implementation project(':automation')
}

View file

21
implementation/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View file

@ -1,7 +1,7 @@
package info.nightscout.androidaps.utils
package info.nightscout.implementation
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.interfaces.BolusTimer
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.plugins.general.automation.AutomationEvent
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
@ -17,15 +17,15 @@ import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class BolusTimer @Inject constructor(
class BolusTimerImpl @Inject constructor(
private val injector: HasAndroidInjector,
private val rh: ResourceHelper,
private val automationPlugin: AutomationPlugin,
) {
) : BolusTimer {
fun scheduleBolusReminder() {
override fun scheduleAutomationEventBolusReminder() {
val event = AutomationEvent(injector).apply {
title = rh.gs(R.string.bolusreminder)
title = rh.gs(R.string.bolus_reminder)
readOnly = true
systemAction = true
autoRemove = true
@ -46,9 +46,9 @@ class BolusTimer @Inject constructor(
automationPlugin.addIfNotExists(event)
}
fun removeBolusReminder() {
override fun removeAutomationEventBolusReminder() {
val event = AutomationEvent(injector).apply {
title = rh.gs(R.string.bolusreminder)
title = rh.gs(R.string.bolus_reminder)
}
automationPlugin.removeIfExists(event)
}

View file

@ -1,35 +1,44 @@
package info.nightscout.androidaps.utils
package info.nightscout.implementation
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.interfaces.CarbTimer
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.plugins.general.automation.AutomationEvent
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
import info.nightscout.androidaps.plugins.general.automation.actions.ActionAlarm
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
import info.nightscout.androidaps.plugins.general.automation.elements.InputDelta
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerBg
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerDelta
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.utils.TimerUtil
import java.text.DecimalFormat
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class CarbTimer @Inject constructor(
class CarbTimerImpl @Inject constructor(
private val injector: HasAndroidInjector,
private val rh: ResourceHelper,
private val automationPlugin: AutomationPlugin,
private val timerUtil: TimerUtil
) {
) : CarbTimer {
fun scheduleReminder(seconds: Int, text: String? = null) =
timerUtil.scheduleReminder(seconds, text ?: rh.gs(R.string.timetoeat))
/**
* Generate reminder via [info.nightscout.androidaps.utils.TimerUtil]
*
* @param seconds seconds to the future
*/
override fun scheduleTimeToEatReminder(seconds: Int) =
timerUtil.scheduleReminder(seconds, rh.gs(R.string.time_to_eat))
fun scheduleEatReminder() {
/**
* Create new Automation event to alarm when is time to eat
*/
override fun scheduleAutomationEventEatReminder() {
val event = AutomationEvent(injector).apply {
title = rh.gs(R.string.bolusadvisor)
title = rh.gs(R.string.bolus_advisor)
readOnly = true
systemAction = true
autoRemove = true
@ -60,9 +69,12 @@ class CarbTimer @Inject constructor(
automationPlugin.addIfNotExists(event)
}
fun removeEatReminder() {
/**
* Remove Automation event
*/
override fun removeAutomationEventEatReminder() {
val event = AutomationEvent(injector).apply {
title = rh.gs(R.string.bolusadvisor)
title = rh.gs(R.string.bolus_advisor)
}
automationPlugin.removeIfExists(event)
}

View file

@ -1,16 +1,17 @@
package info.nightscout.androidaps.utils
package info.nightscout.implementation
import android.content.Context
import android.content.Intent
import android.os.Bundle
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.database.entities.GlucoseValue
import info.nightscout.androidaps.extensions.safeQueryBroadcastReceivers
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.receivers.Intents
import info.nightscout.androidaps.utils.ToastUtils
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
@ -25,15 +26,15 @@ import javax.inject.Singleton
@Suppress("SpellCheckingInspection")
@OpenForTesting
@Singleton
class XDripBroadcast @Inject constructor(
class XDripBroadcastImpl @Inject constructor(
private val context: Context,
private val aapsLogger: AAPSLogger,
private val sp: SP,
private val rh: ResourceHelper,
private val profileFunction: ProfileFunction
) {
) : XDripBroadcast {
fun sendCalibration(bg: Double): Boolean {
override fun sendCalibration(bg: Double): Boolean {
val bundle = Bundle()
bundle.putDouble("glucose_number", bg)
bundle.putString("units", if (profileFunction.getUnits() == GlucoseUnit.MGDL) "mgdl" else "mmol")
@ -44,18 +45,18 @@ class XDripBroadcast @Inject constructor(
context.sendBroadcast(intent)
val q = context.packageManager.safeQueryBroadcastReceivers(intent, 0)
return if (q.isEmpty()) {
ToastUtils.errorToast(context, R.string.xdripnotinstalled)
aapsLogger.debug(rh.gs(R.string.xdripnotinstalled))
ToastUtils.errorToast(context, R.string.xdrip_not_installed)
aapsLogger.debug(rh.gs(R.string.xdrip_not_installed))
false
} else {
ToastUtils.errorToast(context, R.string.calibrationsent)
aapsLogger.debug(rh.gs(R.string.calibrationsent))
ToastUtils.errorToast(context, R.string.calibration_sent)
aapsLogger.debug(rh.gs(R.string.calibration_sent))
true
}
}
// sent in 640G mode
fun send(glucoseValue: GlucoseValue) {
override fun send(glucoseValue: GlucoseValue) {
if (sp.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US)
try {
@ -89,7 +90,7 @@ class XDripBroadcast @Inject constructor(
}
// sent in NSClient dbaccess mode
fun sendProfile(profileStoreJson: JSONObject) {
override fun sendProfile(profileStoreJson: JSONObject) {
if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false))
broadcast(
Intent(Intents.ACTION_NEW_PROFILE).apply {
@ -101,7 +102,7 @@ class XDripBroadcast @Inject constructor(
}
// sent in NSClient dbaccess mode
fun sendTreatments(addedOrUpdatedTreatments: JSONArray) {
override fun sendTreatments(addedOrUpdatedTreatments: JSONArray) {
if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false))
splitArray(addedOrUpdatedTreatments).forEach { part ->
broadcast(
@ -114,7 +115,7 @@ class XDripBroadcast @Inject constructor(
}
// sent in NSClient dbaccess mode
fun sendSgvs(sgvs: JSONArray) {
override fun sendSgvs(sgvs: JSONArray) {
if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false))
splitArray(sgvs).forEach { part ->
broadcast(

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="xdrip_not_installed">xDrip+ not installed</string>
<string name="calibration_sent">Calibration sent to xDrip+</string>
<string name="bg_label">BG</string>
<string name="time_to_eat">Time to eat</string>
<string name="enable_bolus_advisor">Enable bolus advisor</string>
<string name="enable_bolus_advisor_summary">Use reminder to start eating later instead of wizard result during high glycemia ("pre-bolus")</string>
<string name="bolus_advisor">Bolus advisor</string>
<string name="bolus_advisor_message">You have high glycemia. Instead of eating now it\'s recommended to wait for better glycemia. Do you want to do a correction bolus now and remind you when it\'s time to eat? In this case no carbs will be recorded and you must use wizard again when we remind you.</string>
<string name="time_to_bolus">Time to bolus!\nRun Bolus wizard and do calculation again.</string>
</resources>

View file

@ -18,4 +18,6 @@ include ':diaconn'
include ':openhumans'
include ':shared'
include ':graphview'
include ':libraries'
include ':libraries'
include ':ui'
include ':implementation'

1
ui/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

19
ui/build.gradle Normal file
View file

@ -0,0 +1,19 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-allopen'
apply plugin: 'com.hiya.jacoco-android'
apply from: "${project.rootDir}/core/android_dependencies.gradle"
apply from: "${project.rootDir}/core/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/test_dependencies.gradle"
apply from: "${project.rootDir}/core/jacoco_global.gradle"
android {
namespace 'info.nightscout.ui'
}
dependencies {
implementation project(':core')
implementation project(':shared')
implementation project(':database')
}

0
ui/consumer-rules.pro Normal file
View file

21
ui/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>

View file

@ -0,0 +1,14 @@
package info.nightscout.ui.di
import dagger.Module
import dagger.android.ContributesAndroidInjector
import info.nightscout.ui.dialogs.CalibrationDialog
import info.nightscout.ui.dialogs.CarbsDialog
@Module
@Suppress("unused")
abstract class UiModule {
@ContributesAndroidInjector abstract fun contributesCalibrationDialog(): CalibrationDialog
@ContributesAndroidInjector abstract fun contributesCarbsDialog(): CarbsDialog
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.dialogs
package info.nightscout.ui.dialogs
import android.os.Bundle
import android.view.LayoutInflater
@ -6,20 +6,21 @@ import android.view.View
import android.view.ViewGroup
import com.google.common.base.Joiner
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.ui.R
import info.nightscout.ui.databinding.DialogCalibrationBinding
import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.database.entities.ValueWithUnit
import info.nightscout.androidaps.databinding.DialogCalibrationBinding
import info.nightscout.androidaps.dialogs.DialogFragmentWithDate
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.interfaces.XDripBroadcast
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
import info.nightscout.androidaps.utils.HtmlHelper
import info.nightscout.androidaps.utils.XDripBroadcast
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.interfaces.ResourceHelper
import java.text.DecimalFormat
import java.util.*
import javax.inject.Inject
@ -44,8 +45,10 @@ class CalibrationDialog : DialogFragmentWithDate() {
savedInstanceState.putDouble("bg", binding.bg.value)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
onCreateViewGeneral()
_binding = DialogCalibrationBinding.inflate(inflater, container, false)
return binding.root
@ -55,14 +58,20 @@ class CalibrationDialog : DialogFragmentWithDate() {
super.onViewCreated(view, savedInstanceState)
val units = profileFunction.getUnits()
val bg = Profile.fromMgdlToUnits(glucoseStatusProvider.glucoseStatusData?.glucose
?: 0.0, units)
val bg = Profile.fromMgdlToUnits(
glucoseStatusProvider.glucoseStatusData?.glucose
?: 0.0, units
)
if (units == GlucoseUnit.MMOL)
binding.bg.setParams(savedInstanceState?.getDouble("bg")
?: bg, 2.0, 30.0, 0.1, DecimalFormat("0.0"), false, binding.okcancel.ok)
binding.bg.setParams(
savedInstanceState?.getDouble("bg")
?: bg, 2.0, 30.0, 0.1, DecimalFormat("0.0"), false, binding.okcancel.ok
)
else
binding.bg.setParams(savedInstanceState?.getDouble("bg")
?: bg, 36.0, 500.0, 1.0, DecimalFormat("0"), false, binding.okcancel.ok)
binding.bg.setParams(
savedInstanceState?.getDouble("bg")
?: bg, 36.0, 500.0, 1.0, DecimalFormat("0"), false, binding.okcancel.ok
)
binding.units.text = if (units == GlucoseUnit.MMOL) rh.gs(R.string.mmol) else rh.gs(R.string.mgdl)
binding.bgLabel.labelFor = binding.bg.editTextId
}
@ -78,17 +87,17 @@ class CalibrationDialog : DialogFragmentWithDate() {
val unitLabel = if (units == GlucoseUnit.MMOL) rh.gs(R.string.mmol) else rh.gs(R.string.mgdl)
val actions: LinkedList<String?> = LinkedList()
val bg = binding.bg.value
actions.add(rh.gs(R.string.treatments_wizard_bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, bg) + " " + unitLabel)
actions.add(rh.gs(R.string.bg_label) + ": " + Profile.toCurrentUnitsString(profileFunction, bg) + " " + unitLabel)
if (bg > 0) {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.overview_calibration), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {
OKDialog.showConfirmation(activity, rh.gs(R.string.calibration), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {
uel.log(Action.CALIBRATION, Sources.CalibrationDialog, ValueWithUnit.fromGlucoseUnit(bg, units.asText))
xDripBroadcast.sendCalibration(bg)
})
}
} else
activity?.let { activity ->
OKDialog.show(activity, rh.gs(R.string.overview_calibration), rh.gs(R.string.no_action_selected))
OKDialog.show(activity, rh.gs(R.string.calibration), rh.gs(R.string.no_action_selected))
}
return true
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.dialogs
package info.nightscout.ui.dialogs
import android.content.Context
import android.os.Bundle
@ -8,7 +8,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.common.base.Joiner
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.database.AppRepository
@ -17,7 +16,7 @@ import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Sources
import info.nightscout.androidaps.database.entities.ValueWithUnit
import info.nightscout.androidaps.database.transactions.InsertAndCancelCurrentTemporaryTargetTransaction
import info.nightscout.androidaps.databinding.DialogCarbsBinding
import info.nightscout.androidaps.dialogs.DialogFragmentWithDate
import info.nightscout.androidaps.extensions.formatColor
import info.nightscout.androidaps.interfaces.*
import info.nightscout.shared.logging.LTag
@ -30,6 +29,8 @@ import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.protection.ProtectionCheck
import info.nightscout.androidaps.utils.protection.ProtectionCheck.Protection.BOLUS
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.ui.R
import info.nightscout.ui.databinding.DialogCarbsBinding
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import java.text.DecimalFormat
@ -78,15 +79,15 @@ class CarbsDialog : DialogFragmentWithDate() {
val time = binding.time.value.toInt()
if (time > 12 * 60 || time < -7 * 24 * 60) {
binding.time.value = 0.0
ToastUtils.warnToast(ctx, R.string.constraintapllied)
ToastUtils.warnToast(ctx, R.string.constraint_applied)
}
if (binding.duration.value > 10) {
binding.duration.value = 0.0
ToastUtils.warnToast(ctx, R.string.constraintapllied)
ToastUtils.warnToast(ctx, R.string.constraint_applied)
}
if (binding.carbs.value.toInt() > maxCarbs) {
binding.carbs.value = 0.0
ToastUtils.warnToast(ctx, R.string.carbsconstraintapplied)
ToastUtils.warnToast(ctx, R.string.carbs_constraint_applied)
}
}
@ -143,7 +144,7 @@ class CarbsDialog : DialogFragmentWithDate() {
)
val plus1text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_1, FAV1_DEFAULT))
binding.plus1.text = plus1text
binding.plus1.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus1text
binding.plus1.contentDescription = rh.gs(R.string.carbs) + " " + plus1text
binding.plus1.setOnClickListener {
binding.carbs.value = max(
0.0, binding.carbs.value
@ -155,7 +156,7 @@ class CarbsDialog : DialogFragmentWithDate() {
val plus2text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_2, FAV2_DEFAULT))
binding.plus2.text = plus2text
binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus2text
binding.plus2.contentDescription = rh.gs(R.string.carbs) + " " + plus2text
binding.plus2.setOnClickListener {
binding.carbs.value = max(
0.0, binding.carbs.value
@ -166,7 +167,7 @@ class CarbsDialog : DialogFragmentWithDate() {
}
val plus3text = toSignedString(sp.getInt(R.string.key_carbs_button_increment_3, FAV3_DEFAULT))
binding.plus3.text = plus3text
binding.plus2.contentDescription = rh.gs(R.string.treatments_wizard_carbs_label) + " " + plus3text
binding.plus2.contentDescription = rh.gs(R.string.carbs) + " " + plus3text
binding.plus3.setOnClickListener {
binding.carbs.value = max(
0.0, binding.carbs.value
@ -233,7 +234,7 @@ class CarbsDialog : DialogFragmentWithDate() {
val activitySelected = binding.activityTt.isChecked
if (activitySelected)
actions.add(
rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(activityTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, activityTTDuration) + ")").formatColor(
rh.gs(R.string.temp_target_short) + ": " + (DecimalFormatter.to1Decimal(activityTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, activityTTDuration) + ")").formatColor(
context,
rh,
R.attr.tempTargetConfirmation
@ -242,7 +243,7 @@ class CarbsDialog : DialogFragmentWithDate() {
val eatingSoonSelected = binding.eatingSoonTt.isChecked
if (eatingSoonSelected)
actions.add(
rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(eatingSoonTT) + " " + unitLabel + " (" + rh.gs(
rh.gs(R.string.temp_target_short) + ": " + (DecimalFormatter.to1Decimal(eatingSoonTT) + " " + unitLabel + " (" + rh.gs(
R.string.format_mins,
eatingSoonTTDuration
) + ")").formatColor(context, rh, R.attr.tempTargetConfirmation)
@ -250,7 +251,7 @@ class CarbsDialog : DialogFragmentWithDate() {
val hypoSelected = binding.hypoTt.isChecked
if (hypoSelected)
actions.add(
rh.gs(R.string.temptargetshort) + ": " + (DecimalFormatter.to1Decimal(hypoTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, hypoTTDuration) + ")").formatColor(
rh.gs(R.string.temp_target_short) + ": " + (DecimalFormatter.to1Decimal(hypoTT) + " " + unitLabel + " (" + rh.gs(R.string.format_mins, hypoTTDuration) + ")").formatColor(
context,
rh,
R.attr.tempTargetConfirmation
@ -266,7 +267,7 @@ class CarbsDialog : DialogFragmentWithDate() {
if (carbsAfterConstraints > 0) {
actions.add(rh.gs(R.string.carbs) + ": " + "<font color='" + rh.gac(context, R.attr.carbsColor) + "'>" + rh.gs(R.string.format_carbs, carbsAfterConstraints) + "</font>")
if (carbsAfterConstraints != carbs)
actions.add("<font color='" + rh.gac(context, R.attr.warningColor) + "'>" + rh.gs(R.string.carbsconstraintapplied) + "</font>")
actions.add("<font color='" + rh.gac(context, R.attr.warningColor) + "'>" + rh.gs(R.string.carbs_constraint_applied) + "</font>")
}
val notes = binding.notesLayout.notes.text.toString()
if (notes.isNotEmpty())
@ -364,16 +365,16 @@ class CarbsDialog : DialogFragmentWithDate() {
ValueWithUnit.Hour(duration).takeIf { duration != 0 })
commandQueue.bolus(detailedBolusInfo, object : Callback() {
override fun run() {
carbTimer.removeEatReminder()
carbTimer.removeAutomationEventEatReminder()
if (!result.success) {
ErrorHelperActivity.runAlarm(ctx, result.comment, rh.gs(R.string.treatmentdeliveryerror), R.raw.boluserror)
} else if (sp.getBoolean(R.string.key_usebolusreminder, false) && remindBolus)
bolusTimer.scheduleBolusReminder()
bolusTimer.scheduleAutomationEventBolusReminder()
}
})
}
if (useAlarm && carbs > 0 && timeOffset > 0) {
carbTimer.scheduleReminder(T.mins(timeOffset.toLong()).secs().toInt())
carbTimer.scheduleTimeToEatReminder(T.mins(timeOffset.toLong()).secs().toInt())
}
}, null)
}

View file

@ -33,7 +33,7 @@
android:layout_gravity="center"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="@string/overview_calibration"
android:text="@string/calibration"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceLarge" />
@ -60,7 +60,7 @@
android:layout_gravity="center_horizontal"
android:width="120dp"
android:padding="10dp"
android:text="@string/treatments_wizard_bg_label"
android:text="@string/bg_label"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -68,7 +68,7 @@
android:id="@+id/bg"
android:layout_width="130dp"
android:layout_height="40dp"
app:customContentDescription="@string/treatments_wizard_bg_label" />
app:customContentDescription="@string/bg_label" />
<TextView
android:id="@+id/units"

View file

@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
tools:context=".dialogs.CarbsDialog">
tools:context="info.nightscout.ui.dialogs.CarbsDialog">
<LinearLayout
android:layout_width="match_parent"
@ -186,7 +186,7 @@
android:width="120dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:text="@string/treatments_wizard_carbs_label"
android:text="@string/carbs"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />
@ -194,7 +194,7 @@
android:id="@+id/carbs"
android:layout_width="130dp"
android:layout_height="40dp"
app:customContentDescription="@string/treatments_wizard_carbs_label" />
app:customContentDescription="@string/carbs" />
<TextView
android:layout_width="wrap_content"
@ -258,7 +258,7 @@
android:layout_gravity="center"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:text="@string/bolus_reminder"
android:text="@string/remind_to_bolus_later"
android:gravity="center_vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="bold" />

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="no_action_selected">No action selected, nothing will happen</string>
<string name="constraint_applied">Constraint applied!</string>
<string name="bolus_constraint_applied">Bolus constraint applied</string>
<string name="carbs_constraint_applied">Carbs constraint applied</string>
<string name="temp_target_short">TT</string>
<string name="dialog_canceled">Dialog canceled</string>
</resources>