Merge pull request #1990 from nightscout/3.1.0.3

3.1.0.3
This commit is contained in:
Milos Kozak 2022-08-05 21:08:14 +02:00 committed by GitHub
commit 1de236a602
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
118 changed files with 1133 additions and 332 deletions

View file

@ -105,7 +105,7 @@ android {
defaultConfig {
multiDexEnabled true
versionCode 1500
version "3.1.0.2"
version "3.1.0.3"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'

View file

@ -80,7 +80,7 @@ class MainApp : DaggerApplication() {
@Inject lateinit var uel: UserEntryLogger
@Inject lateinit var alarmSoundServiceHelper: AlarmSoundServiceHelper
@Inject lateinit var notificationStore: NotificationStore
@Inject lateinit var processLifecycleListener: ProcessLifecycleListener
@Inject lateinit var processLifecycleListener: Provider<ProcessLifecycleListener>
@Inject lateinit var profileSwitchPlugin: ThemeSwitcherPlugin
@Inject lateinit var localAlertUtils: LocalAlertUtils
@Inject lateinit var rh: Provider<ResourceHelper>
@ -94,7 +94,6 @@ class MainApp : DaggerApplication() {
RxDogTag.install()
setRxErrorHandler()
LocaleHelper.update(this)
ProcessLifecycleOwner.get().lifecycle.addObserver(processLifecycleListener)
var gitRemote: String? = BuildConfig.REMOTE
var commitHash: String? = BuildConfig.HEAD
@ -151,6 +150,7 @@ class MainApp : DaggerApplication() {
localAlertUtils.preSnoozeAlarms()
doMigrations()
uel.log(UserEntry.Action.START_AAPS, UserEntry.Sources.Aaps)
ProcessLifecycleOwner.get().lifecycle.addObserver(processLifecycleListener.get())
// schedule widget update
refreshWidget = Runnable {

View file

@ -12,7 +12,7 @@ import com.google.android.material.datepicker.MaterialDatePicker
import com.jjoe64.graphview.GraphView
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.activities.fragments.HistoryBrowserData
import info.nightscout.androidaps.databinding.ActivityHistorybrowseBinding
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
import info.nightscout.androidaps.events.EventCustomCalculationFinished
@ -21,27 +21,18 @@ import info.nightscout.androidaps.events.EventScale
import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.androidaps.extensions.toVisibilityKeepSpace
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.interfaces.Loop
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.interfaces.BuildHelper
import info.nightscout.androidaps.plugins.general.overview.OverviewMenus
import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewGraph
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.receivers.DataWorker
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.Translator
import info.nightscout.androidaps.interfaces.BuildHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import java.util.*
@ -50,23 +41,16 @@ import kotlin.math.min
class HistoryBrowseActivity : NoSplashAppCompatActivity() {
@Inject lateinit var historyBrowserData: HistoryBrowserData
@Inject lateinit var injector: HasAndroidInjector
@Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var sp: SP
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var defaultValueHelper: DefaultValueHelper
@Inject lateinit var activePlugin: ActivePlugin
@Inject lateinit var buildHelper: BuildHelper
@Inject lateinit var repository: AppRepository
@Inject lateinit var fabricPrivacy: FabricPrivacy
@Inject lateinit var overviewMenus: OverviewMenus
@Inject lateinit var dateUtil: DateUtil
@Inject lateinit var config: Config
@Inject lateinit var loop: Loop
@Inject lateinit var nsDeviceStatus: NSDeviceStatus
@Inject lateinit var translator: Translator
@Inject lateinit var context: Context
@Inject lateinit var dataWorker: DataWorker
@Inject lateinit var calculationWorkflow: CalculationWorkflow
private val disposable = CompositeDisposable()
@ -78,9 +62,6 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
private var rangeToDisplay = 24 // for graph
// private var start: Long = 0
private lateinit var iobCobCalculator: IobCobCalculatorPlugin
private lateinit var overviewData: OverviewData
private lateinit var binding: ActivityHistorybrowseBinding
private var destroyed = false
@ -89,42 +70,12 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
binding = ActivityHistorybrowseBinding.inflate(layoutInflater)
setContentView(binding.root)
// We don't want to use injected singletons but own instance working on top of different data
overviewData =
OverviewData(
aapsLogger,
rh,
dateUtil,
sp,
activePlugin,
defaultValueHelper,
profileFunction,
repository,
fabricPrivacy
)
iobCobCalculator =
IobCobCalculatorPlugin(
injector,
aapsLogger,
aapsSchedulers,
rxBus,
sp,
rh,
profileFunction,
activePlugin,
fabricPrivacy,
dateUtil,
repository,
overviewData,
calculationWorkflow
)
binding.left.setOnClickListener {
adjustTimeRange(overviewData.fromTime - T.hours(rangeToDisplay.toLong()).msecs())
adjustTimeRange(historyBrowserData.overviewData.fromTime - T.hours(rangeToDisplay.toLong()).msecs())
loadAll("onClickLeft")
}
binding.right.setOnClickListener {
adjustTimeRange(overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs())
adjustTimeRange(historyBrowserData.overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs())
loadAll("onClickRight")
}
binding.end.setOnClickListener {
@ -138,7 +89,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
binding.zoom.setOnLongClickListener {
Calendar.getInstance().also { calendar ->
calendar.timeInMillis = overviewData.fromTime
calendar.timeInMillis = historyBrowserData.overviewData.fromTime
calendar[Calendar.MILLISECOND] = 0
calendar[Calendar.SECOND] = 0
calendar[Calendar.MINUTE] = 0
@ -151,13 +102,13 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
binding.date.setOnClickListener {
MaterialDatePicker.Builder.datePicker()
.setSelection(dateUtil.timeStampToUtcDateMillis(overviewData.fromTime))
.setSelection(dateUtil.timeStampToUtcDateMillis(historyBrowserData.overviewData.fromTime))
.setTheme(R.style.DatePicker)
.build()
.apply {
addOnPositiveButtonClickListener { selection ->
setTime(dateUtil.mergeUtcDateToTimestamp(overviewData.fromTime, selection))
binding.date.text = dateUtil.dateAndTimeString(overviewData.fromTime)
setTime(dateUtil.mergeUtcDateToTimestamp(historyBrowserData.overviewData.fromTime, selection))
binding.date.text = dateUtil.dateAndTimeString(historyBrowserData.overviewData.fromTime)
loadAll("onClickDate")
}
}
@ -180,8 +131,8 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
prepareGraphsIfNeeded(overviewMenus.setting.size)
savedInstanceState?.let { bundle ->
rangeToDisplay = bundle.getInt("rangeToDisplay", 0)
overviewData.fromTime = bundle.getLong("start", 0)
overviewData.toTime = bundle.getLong("end", 0)
historyBrowserData.overviewData.fromTime = bundle.getLong("start", 0)
historyBrowserData.overviewData.toTime = bundle.getLong("end", 0)
}
}
@ -220,11 +171,11 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
.observeOn(aapsSchedulers.main)
.subscribe({
rangeToDisplay = it.hours
setTime(overviewData.fromTime)
setTime(historyBrowserData.overviewData.fromTime)
loadAll("rangeChange")
}, fabricPrivacy::logException)
if (overviewData.fromTime == 0L) {
updateCalcProgress(100)
if (historyBrowserData.overviewData.fromTime == 0L) {
// set start of current day
setTime(dateUtil.now())
loadAll("onResume")
@ -236,8 +187,8 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("rangeToDisplay", rangeToDisplay)
outState.putLong("start", overviewData.fromTime)
outState.putLong("end", overviewData.toTime)
outState.putLong("start", historyBrowserData.overviewData.fromTime)
outState.putLong("end", historyBrowserData.overviewData.toTime)
}
private fun prepareGraphsIfNeeded(numOfGraphs: Int) {
@ -293,18 +244,18 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
private fun adjustTimeRange(start: Long) {
overviewData.fromTime = start
overviewData.toTime = overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs()
overviewData.endTime = overviewData.toTime
historyBrowserData.overviewData.fromTime = start
historyBrowserData.overviewData.toTime = historyBrowserData.overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs()
historyBrowserData.overviewData.endTime = historyBrowserData.overviewData.toTime
}
private fun runCalculation(from: String) {
calculationWorkflow.runCalculation(
CalculationWorkflow.HISTORY_CALCULATION,
iobCobCalculator,
overviewData,
historyBrowserData.iobCobCalculator,
historyBrowserData.overviewData,
from,
overviewData.toTime,
historyBrowserData.overviewData.toTime,
bgDataReload = true,
limitDataToOldestAvailable = false,
cause = EventCustomCalculationFinished(),
@ -325,7 +276,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
private fun updateDate() {
binding.date.text = dateUtil.dateAndTimeString(overviewData.fromTime)
binding.date.text = dateUtil.dateAndTimeString(historyBrowserData.overviewData.fromTime)
binding.zoom.text = rangeToDisplay.toString()
}
@ -337,9 +288,9 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
updateDate()
val pump = activePlugin.activePump
val graphData = GraphData(injector, binding.bgGraph, overviewData)
val graphData = GraphData(injector, binding.bgGraph, historyBrowserData.overviewData)
val menuChartSettings = overviewMenus.setting
graphData.addInRangeArea(overviewData.fromTime, overviewData.endTime, defaultValueHelper.determineLowLine(), defaultValueHelper.determineHighLine())
graphData.addInRangeArea(historyBrowserData.overviewData.fromTime, historyBrowserData.overviewData.endTime, defaultValueHelper.determineLowLine(), defaultValueHelper.determineHighLine())
graphData.addBgReadings(menuChartSettings[0][OverviewMenus.CharType.PRE.ordinal], context)
if (buildHelper.isDev()) graphData.addBucketedData()
graphData.addTreatments(context)
@ -355,7 +306,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
// set manual x bounds to have nice steps
graphData.setNumVerticalLabels()
graphData.formatAxis(overviewData.fromTime, overviewData.endTime)
graphData.formatAxis(historyBrowserData.overviewData.fromTime, historyBrowserData.overviewData.endTime)
graphData.performUpdate()
@ -365,7 +316,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
val now = System.currentTimeMillis()
for (g in 0 until min(secondaryGraphs.size, menuChartSettings.size + 1)) {
val secondGraphData = GraphData(injector, secondaryGraphs[g], overviewData)
val secondGraphData = GraphData(injector, secondaryGraphs[g], historyBrowserData.overviewData)
var useABSForScale = false
var useIobForScale = false
var useCobForScale = false
@ -393,7 +344,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
if (menuChartSettings[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] && buildHelper.isDev()) secondGraphData.addDeviationSlope(useDSForScale, 1.0)
// set manual x bounds to have nice steps
secondGraphData.formatAxis(overviewData.fromTime, overviewData.endTime)
secondGraphData.formatAxis(historyBrowserData.overviewData.fromTime, historyBrowserData.overviewData.endTime)
secondGraphData.addNowLine(now)
secondaryGraphsData.add(secondGraphData)
}

View file

@ -0,0 +1,72 @@
package info.nightscout.androidaps.activities.fragments
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.sharedPreferences.SP
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class HistoryBrowserData @Inject constructor(
injector: HasAndroidInjector,
aapsSchedulers: AapsSchedulers,
rxBus: RxBus,
aapsLogger: AAPSLogger,
rh: ResourceHelper,
dateUtil: DateUtil,
sp: SP,
activePlugin: ActivePlugin,
defaultValueHelper: DefaultValueHelper,
profileFunction: ProfileFunction,
repository: AppRepository,
fabricPrivacy: FabricPrivacy,
calculationWorkflow: CalculationWorkflow
) {
var iobCobCalculator: IobCobCalculatorPlugin
var overviewData: OverviewData
init {
// We don't want to use injected singletons but own instance working on top of different data
overviewData =
OverviewData(
aapsLogger,
rh,
dateUtil,
sp,
activePlugin,
defaultValueHelper,
profileFunction,
repository,
fabricPrivacy
)
iobCobCalculator =
IobCobCalculatorPlugin(
injector,
aapsLogger,
aapsSchedulers,
rxBus,
sp,
rh,
profileFunction,
activePlugin,
fabricPrivacy,
dateUtil,
repository,
overviewData,
calculationWorkflow
)
}
}

View file

@ -312,7 +312,7 @@ class ActionsFragment : DaggerFragment() {
for (customAction in customActions) {
if (!customAction.isEnabled) continue
val btn = SingleClickButton(currentContext, null, android.R.attr.buttonStyle)
val btn = SingleClickButton(currentContext, null, R.attr.customBtnStyle)
btn.text = rh.gs(customAction.name)
val layoutParams = LinearLayout.LayoutParams(

View file

@ -115,6 +115,7 @@ class AutotuneFragment : DaggerFragment() {
}
autotunePlugin.selectedProfile = profileName
resetParam()
binding.tuneDays.value = autotunePlugin.lastNbDays.toDouble()
}
updateGui()
}
@ -275,6 +276,7 @@ class AutotuneFragment : DaggerFragment() {
.observeOn(aapsSchedulers.main)
.subscribe({ updateGui() }, fabricPrivacy::logException)
checkNewDay()
binding.tuneDays.value = autotunePlugin.lastNbDays.toDouble()
updateGui()
}
@ -287,7 +289,6 @@ class AutotuneFragment : DaggerFragment() {
@Synchronized
private fun updateGui() {
_binding ?: return
binding.tuneDays.value = autotunePlugin.lastNbDays.toDouble()
profileStore = activePlugin.activeProfileSource.profile ?: ProfileStore(injector, JSONObject(), dateUtil)
profileName = if (binding.profileList.text.toString() == rh.gs(R.string.active)) "" else binding.profileList.text.toString()
profileFunction.getProfile()?.let { currentProfile ->
@ -387,7 +388,7 @@ class AutotuneFragment : DaggerFragment() {
try {
if (autotunePlugin.calculationRunning)
binding.tuneDays.value = autotunePlugin.lastNbDays.toDouble()
if (binding.tuneDays.value != autotunePlugin.lastNbDays.toDouble()) {
if (binding.tuneDays.text != autotunePlugin.lastNbDays) {
autotunePlugin.lastNbDays = binding.tuneDays.text
resetParam(false)
}

View file

@ -120,7 +120,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
@Inject lateinit var repository: AppRepository
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
@Inject lateinit var overviewData: OverviewData
@Inject lateinit var overviewPlugin: OverviewPlugin
@Inject lateinit var automationPlugin: AutomationPlugin
@Inject lateinit var bgQualityCheckPlugin: BgQualityCheckPlugin
@ -417,7 +416,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
uel.log(Action.ACCEPTS_TEMP_BASAL, Sources.Overview)
(context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?)?.cancel(Constants.notificationID)
rxBus.send(EventMobileToWear(EventData.CancelNotification(dateUtil.now())))
Thread { loop.acceptChangeRequest() }.run()
Thread { loop.acceptChangeRequest() }.start()
binding.buttonsLayout.acceptTempButton.visibility = View.GONE
})
})
@ -582,7 +581,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
for (event in events)
if (event.isEnabled && event.trigger.shouldRun())
context?.let { context ->
SingleClickButton(context).also {
SingleClickButton(context, null, R.attr.customBtnStyle).also {
it.setTextColor(rh.gac(context, R.attr.treatmentButton))
it.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
it.layoutParams = LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 0.5f).also { l ->
@ -827,7 +826,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
}
}
fun updateProfile() {
private fun updateProfile() {
val profile = profileFunction.getProfile()
runOnUiThread {
_binding ?: return@runOnUiThread
@ -885,7 +884,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
}
}
fun updateTime() {
private fun updateTime() {
_binding ?: return
binding.infoLayout.time.text = dateUtil.timeString(dateUtil.now())
// Status lights
@ -915,7 +914,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
)
}
fun updateIobCob() {
private fun updateIobCob() {
val iobText = overviewData.iobText(iobCobCalculator)
val iobDialogText = overviewData.iobDialogText(iobCobCalculator)
val displayText = overviewData.cobInfo(iobCobCalculator).displayText(rh, dateUtil, buildHelper.isEngineeringMode())
@ -999,6 +998,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
val pump = activePlugin.activePump
val graphData = GraphData(injector, binding.graphsLayout.bgGraph, overviewData)
val menuChartSettings = overviewMenus.setting
if (menuChartSettings.isEmpty()) return
graphData.addInRangeArea(overviewData.fromTime, overviewData.endTime, defaultValueHelper.determineLowLine(), defaultValueHelper.determineHighLine())
graphData.addBgReadings(menuChartSettings[0][OverviewMenus.CharType.PRE.ordinal], context)
if (buildHelper.isDev()) graphData.addBucketedData()

View file

@ -69,14 +69,16 @@ class OverviewMenus @Inject constructor(
private var _setting: MutableList<Array<Boolean>> = ArrayList()
val setting: List<Array<Boolean>>
get() = _setting.toMutableList() // implicitly does a list copy
@Synchronized get() = _setting.toMutableList() // implicitly does a list copy
@Synchronized
private fun storeGraphConfig() {
val sts = Gson().toJson(_setting)
sp.putString(R.string.key_graphconfig, sts)
aapsLogger.debug(sts)
}
@Synchronized
fun loadGraphConfig() {
val sts = sp.getString(R.string.key_graphconfig, "")
if (sts.isNotEmpty()) {
@ -115,7 +117,7 @@ class OverviewMenus @Inject constructor(
val used = arrayListOf<Int>()
for (g in 0 until numOfGraphs) {
if (g != 0 && g < numOfGraphs) {
if (g != 0) {
val dividerItem = popup.menu.add(Menu.NONE, g, Menu.NONE, "------- ${rh.gs(R.string.graph_menu_divider_header)} $g -------")
dividerItem.isCheckable = true
dividerItem.isChecked = true
@ -150,36 +152,38 @@ class OverviewMenus @Inject constructor(
}
popup.setOnMenuItemClickListener {
try {
// id < 100 graph header - divider 1, 2, 3 .....
when {
it.itemId == SCALE_ID -> {
// do nothing, submenu
}
synchronized(this) {
try {
// id < 100 graph header - divider 1, 2, 3 .....
when {
it.itemId == SCALE_ID -> {
// do nothing, submenu
}
it.itemId > SCALE_ID && it.itemId < SCALE_ID + 100 -> {
val hours = it.itemId - SCALE_ID // 6,12,....
rxBus.send(EventScale(hours))
}
it.itemId > SCALE_ID && it.itemId < SCALE_ID + 100 -> {
val hours = it.itemId - SCALE_ID // 6,12,....
rxBus.send(EventScale(hours))
}
it.itemId == numOfGraphs -> {
// add new empty
_setting.add(Array(CharType.values().size) { false })
}
it.itemId == numOfGraphs -> {
// add new empty
_setting.add(Array(CharType.values().size) { false })
}
it.itemId < 100 -> {
// remove graph
_setting.removeAt(it.itemId)
}
it.itemId < 100 -> {
// remove graph
_setting.removeAt(it.itemId)
}
else -> {
val graphNumber = it.itemId / 100 - 1
val item = it.itemId % 100
_setting[graphNumber][item] = !it.isChecked
else -> {
val graphNumber = it.itemId / 100 - 1
val item = it.itemId % 100
_setting[graphNumber][item] = !it.isChecked
}
}
} catch (exception: Exception) {
fabricPrivacy.logException(exception)
}
} catch (exception: Exception) {
fabricPrivacy.logException(exception)
}
storeGraphConfig()
setupChartMenu(context, chartButton)

View file

@ -1,7 +1,6 @@
package info.nightscout.androidaps.plugins.general.wear
import android.content.Context
import android.content.Intent
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.EventAutosensCalculationFinished
@ -10,14 +9,14 @@ import info.nightscout.androidaps.events.EventPreferenceChange
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.plugins.aps.loop.events.EventLoopUpdateGui
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress
import info.nightscout.androidaps.plugins.general.wear.wearintegration.DataHandlerMobile
import info.nightscout.androidaps.plugins.general.wear.wearintegration.DataLayerListenerServiceMobile
import info.nightscout.androidaps.plugins.general.wear.wearintegration.DataLayerListenerServiceMobileHelper
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.interfaces.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.sharedPreferences.SP
@ -37,7 +36,8 @@ class WearPlugin @Inject constructor(
private val fabricPrivacy: FabricPrivacy,
private val rxBus: RxBus,
private val context: Context,
private val dataHandlerMobile: DataHandlerMobile
private val dataHandlerMobile: DataHandlerMobile,
val dataLayerListenerServiceMobileHelper: DataLayerListenerServiceMobileHelper
) : PluginBase(
PluginDescription()
@ -57,7 +57,7 @@ class WearPlugin @Inject constructor(
override fun onStart() {
super.onStart()
context.startService(Intent(context, DataLayerListenerServiceMobile::class.java))
dataLayerListenerServiceMobileHelper.startService(context)
disposable += rxBus
.toObservable(EventDismissBolusProgressIfRunning::class.java)
.observeOn(aapsSchedulers.io)
@ -94,6 +94,6 @@ class WearPlugin @Inject constructor(
override fun onStop() {
disposable.clear()
super.onStop()
context.stopService(Intent(context, DataLayerListenerServiceMobile::class.java))
dataLayerListenerServiceMobileHelper.stopService(context)
}
}

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.general.wear.wearintegration
import android.os.Binder
import android.os.Handler
import android.os.HandlerThread
import com.google.android.gms.tasks.Tasks
@ -10,14 +11,12 @@ import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.events.EventMobileToWear
import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
import info.nightscout.androidaps.plugins.general.wear.WearPlugin
import info.nightscout.androidaps.plugins.general.wear.events.EventWearUpdateGui
import info.nightscout.androidaps.receivers.ReceiverStatusStore
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.wizard.QuickWizard
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
@ -38,9 +37,7 @@ class DataLayerListenerServiceMobile : WearableListenerService() {
@Inject lateinit var loop: Loop
@Inject lateinit var wearPlugin: WearPlugin
@Inject lateinit var sp: SP
@Inject lateinit var quickWizard: QuickWizard
@Inject lateinit var config: Config
@Inject lateinit var nsDeviceStatus: NSDeviceStatus
@Inject lateinit var receiverStatusStore: ReceiverStatusStore
@Inject lateinit var repository: AppRepository
@Inject lateinit var defaultValueHelper: DefaultValueHelper
@ -48,6 +45,11 @@ class DataLayerListenerServiceMobile : WearableListenerService() {
@Inject lateinit var rxBus: RxBus
@Inject lateinit var aapsSchedulers: AapsSchedulers
inner class LocalBinder : Binder() {
fun getService(): DataLayerListenerServiceMobile = this@DataLayerListenerServiceMobile
}
private val dataClient by lazy { Wearable.getDataClient(this) }
private val messageClient by lazy { Wearable.getMessageClient(this) }
private val capabilityClient by lazy { Wearable.getCapabilityClient(this) }

View file

@ -0,0 +1,62 @@
package info.nightscout.androidaps.plugins.general.wear.wearintegration
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.IBinder
import info.nightscout.androidaps.interfaces.NotificationHolder
import javax.inject.Inject
import javax.inject.Singleton
/*
This code replaces following
val alarm = Intent(context, DataLayerListenerServiceMobile::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) context.startForegroundService(alarm) else context.startService(alarm)
it fails randomly with error
Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{e317f7e u0 info.nightscout.nsclient/info.nightscout.androidaps.services.DataLayerListenerServiceMobile}
*/
@Singleton
class DataLayerListenerServiceMobileHelper @Inject constructor(
private val notificationHolder: NotificationHolder
) {
fun startService(context: Context) {
val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
// The binder of the service that returns the instance that is created.
val binder: DataLayerListenerServiceMobile.LocalBinder = service as DataLayerListenerServiceMobile.LocalBinder
val dataLayerListenerServiceMobile: DataLayerListenerServiceMobile = binder.getService()
context.startForegroundService(Intent(context, DataLayerListenerServiceMobile::class.java))
// This is the key: Without waiting Android Framework to call this method
// inside Service.onCreate(), immediately call here to post the notification.
dataLayerListenerServiceMobile.startForeground(notificationHolder.notificationID, notificationHolder.notification)
// Release the connection to prevent leaks.
context.unbindService(this)
}
override fun onServiceDisconnected(name: ComponentName?) {
}
}
try {
context.bindService(Intent(context, DataLayerListenerServiceMobile::class.java), connection, Context.BIND_AUTO_CREATE)
} catch (ignored: RuntimeException) {
// This is probably a broadcast receiver context even though we are calling getApplicationContext().
// Just call startForegroundService instead since we cannot bind a service to a
// broadcast receiver context. The service also have to call startForeground in
// this case.
context.startForegroundService(Intent(context, DataLayerListenerServiceMobile::class.java))
}
}
fun stopService(context: Context) {
context.stopService(Intent(context, DataLayerListenerServiceMobile::class.java))
}
}

View file

@ -97,11 +97,11 @@ class IobCobOref1Worker(
val bucketedData = ads.bucketedData
val autosensDataTable = ads.autosensDataTable
if (bucketedData == null || bucketedData.size < 3) {
aapsLogger.debug(LTag.AUTOSENS, "Aborting calculation thread (No bucketed data available): ${data.from}")
aapsLogger.debug(LTag.AUTOSENS, {"Aborting calculation thread (No bucketed data available): ${data.from}"})
return Result.success(workDataOf("Error" to "Aborting calculation thread (No bucketed data available): ${data.from}"))
}
val prevDataTime = ads.roundUpTime(bucketedData[bucketedData.size - 3].timestamp)
aapsLogger.debug(LTag.AUTOSENS, "Prev data time: " + dateUtil.dateAndTimeString(prevDataTime))
aapsLogger.debug(LTag.AUTOSENS, {"Prev data time: " + dateUtil.dateAndTimeString(prevDataTime)})
var previous = autosensDataTable[prevDataTime]
// start from oldest to be able sub cob
for (i in bucketedData.size - 4 downTo 0) {
@ -156,15 +156,15 @@ class IobCobOref1Worker(
val hourAgoData = ads.getAutosensDataAtTime(hourAgo)
if (hourAgoData != null) {
val initialIndex = autosensDataTable.indexOfKey(hourAgoData.time)
aapsLogger.debug(LTag.AUTOSENS, ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + hourAgoData.toString())
aapsLogger.debug(LTag.AUTOSENS, { ">>>>> bucketed_data.size()=" + bucketedData.size + " i=" + i + " hourAgoData=" + hourAgoData.toString()})
var past = 1
try {
while (past < 12) {
val ad = autosensDataTable.valueAt(initialIndex + past)
aapsLogger.debug(LTag.AUTOSENS, ">>>>> past=" + past + " ad=" + ad?.toString())
aapsLogger.debug(LTag.AUTOSENS, {">>>>> past=" + past + " ad=" + ad?.toString()})
if (ad == null) {
aapsLogger.debug(LTag.AUTOSENS, autosensDataTable.toString())
aapsLogger.debug(LTag.AUTOSENS, bucketedData.toString())
aapsLogger.debug(LTag.AUTOSENS, {autosensDataTable.toString()})
aapsLogger.debug(LTag.AUTOSENS, {bucketedData.toString()})
//aapsLogger.debug(LTag.AUTOSENS, iobCobCalculatorPlugin.getBgReadingsDataTable().toString())
val notification = Notification(Notification.SEND_LOGFILES, rh.gs(R.string.sendlogfiles), Notification.LOW)
rxBus.send(EventNewNotification(notification))
@ -319,14 +319,12 @@ class IobCobOref1Worker(
if (bgTime < dateUtil.now()) autosensDataTable.put(bgTime, autosensData)
aapsLogger.debug(
LTag.AUTOSENS,
"Running detectSensitivity from: " + dateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + dateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + ads.lastDataTime(
dateUtil
)
{"Running detectSensitivity from: " + dateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + dateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + ads.lastDataTime(dateUtil)}
)
val sensitivity = activePlugin.activeSensitivity.detectSensitivity(ads, oldestTimeWithData, bgTime)
aapsLogger.debug(LTag.AUTOSENS, "Sensitivity result: $sensitivity")
autosensData.autosensResult = sensitivity
aapsLogger.debug(LTag.AUTOSENS, autosensData.toString())
aapsLogger.debug(LTag.AUTOSENS, {autosensData.toString()})
}
data.iobCobCalculator.ads = ads
Thread {
@ -335,7 +333,7 @@ class IobCobOref1Worker(
}.start()
} finally {
rxBus.send(EventIobCalculationProgress(CalculationWorkflow.ProgressData.IOB_COB_OREF, 100, data.cause))
aapsLogger.debug(LTag.AUTOSENS, "AUTOSENSDATA thread ended: ${data.from}")
aapsLogger.debug(LTag.AUTOSENS, {"AUTOSENSDATA thread ended: ${data.from}"})
profiler.log(LTag.AUTOSENS, "IobCobOref1Thread", start)
}
return Result.success()

View file

@ -89,80 +89,84 @@ class GlunovoPlugin @Inject constructor(
private fun handleNewData() {
if (!isEnabled()) return
context.contentResolver.query(contentUri, null, null, null, null)?.let { cr ->
val glucoseValues = mutableListOf<CgmSourceTransaction.TransactionGlucoseValue>()
val calibrations = mutableListOf<CgmSourceTransaction.Calibration>()
cr.moveToFirst()
try {
context.contentResolver.query(contentUri, null, null, null, null)?.let { cr ->
val glucoseValues = mutableListOf<CgmSourceTransaction.TransactionGlucoseValue>()
val calibrations = mutableListOf<CgmSourceTransaction.Calibration>()
cr.moveToFirst()
while (!cr.isAfterLast) {
val timestamp = cr.getLong(0)
val value = cr.getDouble(1) //value in mmol/l...
val curr = cr.getDouble(2)
while (!cr.isAfterLast) {
val timestamp = cr.getLong(0)
val value = cr.getDouble(1) //value in mmol/l...
val curr = cr.getDouble(2)
// bypass already processed
if (timestamp < sp.getLong(R.string.key_last_processed_glunovo_timestamp, 0L)) {
cr.moveToNext()
continue
}
// bypass already processed
if (timestamp < sp.getLong(R.string.key_last_processed_glunovo_timestamp, 0L)) {
cr.moveToNext()
continue
}
if (timestamp > dateUtil.now() || timestamp == 0L) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data date/time $timestamp")
cr.moveToNext()
continue
}
if (timestamp > dateUtil.now() || timestamp == 0L) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data date/time $timestamp")
cr.moveToNext()
continue
}
if (value < 2 || value > 25) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data value (value out of bounds) $value")
cr.moveToNext()
continue
}
if (value < 2 || value > 25) {
aapsLogger.error(LTag.BGSOURCE, "Error in received data value (value out of bounds) $value")
cr.moveToNext()
continue
}
if (curr != 0.0)
glucoseValues += CgmSourceTransaction.TransactionGlucoseValue(
timestamp = timestamp,
value = value * Constants.MMOLL_TO_MGDL,
raw = 0.0,
noise = null,
trendArrow = GlucoseValue.TrendArrow.NONE,
sourceSensor = GlucoseValue.SourceSensor.GLUNOVO_NATIVE
)
else
calibrations.add(
CgmSourceTransaction.Calibration(
if (curr != 0.0)
glucoseValues += CgmSourceTransaction.TransactionGlucoseValue(
timestamp = timestamp,
value = value,
glucoseUnit = TherapyEvent.GlucoseUnit.MMOL
value = value * Constants.MMOLL_TO_MGDL,
raw = 0.0,
noise = null,
trendArrow = GlucoseValue.TrendArrow.NONE,
sourceSensor = GlucoseValue.SourceSensor.GLUNOVO_NATIVE
)
)
sp.putLong(R.string.key_last_processed_glunovo_timestamp, timestamp)
cr.moveToNext()
}
cr.close()
else
calibrations.add(
CgmSourceTransaction.Calibration(
timestamp = timestamp,
value = value,
glucoseUnit = TherapyEvent.GlucoseUnit.MMOL
)
)
sp.putLong(R.string.key_last_processed_glunovo_timestamp, timestamp)
cr.moveToNext()
}
cr.close()
if (glucoseValues.isNotEmpty() || calibrations.isNotEmpty())
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, calibrations, null))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving values from Glunovo App", it)
}
.blockingGet()
.also { savedValues ->
savedValues.inserted.forEach {
xDripBroadcast.send(it)
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
if (glucoseValues.isNotEmpty() || calibrations.isNotEmpty())
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, calibrations, null))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving values from Glunovo App", it)
}
savedValues.calibrationsInserted.forEach { calibration ->
calibration.glucose?.let { glucosevalue ->
uel.log(
UserEntry.Action.CALIBRATION,
UserEntry.Sources.Dexcom,
ValueWithUnit.Timestamp(calibration.timestamp),
ValueWithUnit.TherapyEventType(calibration.type),
ValueWithUnit.fromGlucoseUnit(glucosevalue, calibration.glucoseUnit.toString)
)
.blockingGet()
.also { savedValues ->
savedValues.inserted.forEach {
xDripBroadcast.send(it)
aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
}
savedValues.calibrationsInserted.forEach { calibration ->
calibration.glucose?.let { glucosevalue ->
uel.log(
UserEntry.Action.CALIBRATION,
UserEntry.Sources.Dexcom,
ValueWithUnit.Timestamp(calibration.timestamp),
ValueWithUnit.TherapyEventType(calibration.type),
ValueWithUnit.fromGlucoseUnit(glucosevalue, calibration.glucoseUnit.toString)
)
}
aapsLogger.debug(LTag.DATABASE, "Inserted calibration $calibration")
}
aapsLogger.debug(LTag.DATABASE, "Inserted calibration $calibration")
}
}
}
} catch (e: SecurityException) {
aapsLogger.error(LTag.CORE, "Exception", e)
}
}

View file

@ -50,12 +50,20 @@ class AndroidPermission @Inject constructor(
}
if (test) {
if (activity is DaggerAppCompatActivityWithResult)
activity.requestMultiplePermissions.launch(permissions)
try {
activity.requestMultiplePermissions.launch(permissions)
} catch (ignored: IllegalStateException) {
ToastUtils.errorToast(activity, rh.gs(R.string.error_asking_for_permissions))
}
}
if (testBattery) {
try {
if (activity is DaggerAppCompatActivityWithResult)
activity.callForBatteryOptimization.launch(null)
try {
activity.callForBatteryOptimization.launch(null)
} catch (ignored: IllegalStateException) {
ToastUtils.errorToast(activity, rh.gs(R.string.error_asking_for_permissions))
}
} catch (e: ActivityNotFoundException) {
permissionBatteryOptimizationFailed = true
OKDialog.show(activity, rh.gs(R.string.permission), rh.gs(R.string.alert_dialog_permission_battery_optimization_failed)) { activity.recreate() }
@ -145,8 +153,10 @@ class AndroidPermission @Inject constructor(
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.packageName))
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.packageName)
)
activity.startActivity(intent)
}
}

View file

@ -256,7 +256,7 @@ class Widget : AppWidgetProvider() {
internal fun updateWidget(context: Context) {
context.sendBroadcast(Intent().also {
it.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, AppWidgetManager.getInstance(context).getAppWidgetIds(ComponentName(context, Widget::class.java)))
it.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, AppWidgetManager.getInstance(context)?.getAppWidgetIds(ComponentName(context, Widget::class.java)))
it.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
})
}

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@ -11,17 +11,6 @@
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/noprofile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/noprofileset"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?attr/alarmColor"
android:textStyle="bold"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -82,8 +71,7 @@
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_height="300dp">
<com.jjoe64.graphview.GraphView
android:id="@+id/bg_graph"
@ -112,4 +100,4 @@
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -1044,4 +1044,5 @@
<string name="blocked_by_charging">Zablokováno možností nabíjení</string>
<string name="blocked_by_connectivity">Zablokováno možností připojení</string>
<string name="no_watch_connected">(Žádné hodinky nejsou připojeny)</string>
<string name="error_asking_for_permissions">Chyba žádosti o oprávnění</string>
</resources>

View file

@ -123,6 +123,7 @@
<string name="sensitivity_cannula">Notering af kanyleskift vil nulstille Autosens ratio tilbage til 100%.</string>
<string name="sensitivity_time">Nogle af plugin mulighederne har konfigurerbare tidsintervaller, der kan indstilles af brugeren.</string>
<string name="sensitivity_hint1">https://androidaps.readthedocs.io/en/latest/EN/Configuration/Sensitivity-detection-and-COB.html</string>
<string name="sensitivity_hint2">https://androidaps.readthedocs.io/en/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens</string>
<string name="wrongcarbs_label">Kulhydrat indtastningsfejl</string>
<string name="wrongcarbs_whattodo">Hvad gør du, hvis du har lavet en forkert kulhydrat indtastning?</string>
<string name="wrongcarbs_treatmentstab">Slet den forkerte indtastning i Behandlinger og indtast korrekte nye kulhydrat værdier.</string>
@ -135,6 +136,19 @@
<string name="wronginsulin_compare">Sammenlign værdier i AndroidAPS og pumpehistorik (hvis pumpen understøtter dette).</string>
<string name="wronginsulin_prime">Bolus en del af din beregnede \"glemte\" insulin med enten sprøjter / pen eller brug af en kanylefyldning.</string>
<string name="wronginsulin_donothing">Gør ingenting og tillad AndroidAPS at rette op på højt blodsukker.</string>
<string name="cob_label">Kulhydrater om bord (COB)</string>
<string name="cob_question">Hvordan ændring af ISF værdi påvirker COB beregning?</string>
<string name="cob_longer">Ved øget ISF, vil kulhydrater være længere tid om at absorberes</string>
<string name="cob_shorter">Ved øget ISF, vil kulhydrater være kortere tid om at absorberes</string>
<string name="cob_no_effect">Øget ISF vil ikke påvirke absorbering af beregnet kulhydrat</string>
<string name="cob2_question">Hvordan ændring af IC værdi påvirker COB beregning?</string>
<string name="cob2_longer">Ved øget IC, vil kulhydrater være længere tid om at absorberes</string>
<string name="cob2_shorter">Ved øget IC, vil kulhydrater være kortere tid om at absorberes</string>
<string name="cob2_no_effect">Øget IC vil ikke påvirke absorbering af beregnet kulhydrat</string>
<string name="cob3_question">Hvordan skift af profil procent påvirker COB beregning?</string>
<string name="cob3_longer">Ved indstilling af profil til 150%, vil kulhydrater være længere tid om at absorberes</string>
<string name="cob3_shorter">Ved indstilling af profil til 150%, vil kulhydrater være kortere tid om at absorberes</string>
<string name="cob3_no_effect">Ved indstilling af profil til 150%, påvirkes absorbering af beregnet kulhydrat ikke</string>
<string name="iob_label">Insulin om bord (IOB)</string>
<string name="iob_value">IOB-værdi påvirkes af midlertidige basaler.</string>
<string name="iob_hightemp">Høj midlertidlig basal vil ikke blive givet, når dit blodsukker er under målet.</string>

View file

@ -6,6 +6,7 @@
<string name="treatmentssafety_title">Behandlings sikkerhed</string>
<string name="treatmentssafety_maxbolus_title">Maks tilladt bolus [IE]</string>
<string name="treatmentssafety_maxcarbs_title">Maks tilladte kulhydrater [g]</string>
<string name="treatmentssafety_lgsThreshold_title">BS under værdi for LGS grænse</string>
<string name="nav_preferences_plugin">%1$s indstillinger</string>
<string name="nav_preferences">Indstillinger</string>
<string name="nav_refreshtreatments">Opdater behandlinger fra NS</string>
@ -432,12 +433,15 @@
<string name="ns_localbroadcasts_title">Aktiver lokale udsendelser.</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="openaps_smb_dynamic_isf">Dynamisk ISF</string>
<string name="DynISFAdjust_title" formatted="false">DynamiskISF-justeringsfaktor %</string>
<string name="DynISFAdjust_summary" formatted="false">Justeringsfaktor for DynamiskISF. Indstil mere end 100% for mere aggressive korrektionsdoser og mindre end 100% for mindre aggressive korrektioner.</string>
<string name="enableuam">Aktiver UAM</string>
<string name="enablesmb">Aktiver SMB</string>
<string name="enablesmb_summary">Brug Super Mikro Boluser i stedet for midlertidig basal for hurtigere handling</string>
<string name="enableuam_summary">Detektering af uanmeldte måltider</string>
<string name="insulin_oref_peak">IOB Kurve Peak-Tid</string>
<string name="insulin_peak_time">Spidstidspunkt [min]</string>
<string name="insulin_peak">Top</string>
<string name="free_peak_oref">Free-Peak Oref</string>
<string name="rapid_acting_oref">Rapid-Acting Oref</string>
<string name="ultrarapid_oref">Ultra-Rapid Oref</string>
@ -589,6 +593,7 @@
<string name="openapssmb_maxiob_summary">Denne værdi kaldes Max IOB i OpenAPS kontekst\nOpenAPS vil ikke tilføje mere insulin, hvis den aktuelle IOB er større end denne værdi</string>
<string name="absorption_cutoff_title">Måltid max absorptionstid [h]</string>
<string name="absorption_cutoff_summary">Tid hvor ethvert måltid betragtes som absorberet. Resterende kulhydrater vil blive afskåret.</string>
<string name="treatmentssafety_lgsThreshold_summary">BS værdi under hvilken insulin er suspenderet. Standard værdi bruger standard målmodel. Bruger kan indstille værdi mellem 60 mg/dl (3,3 mmol/l) og 100 mg/dl (5,5 mmol/l). Værdier under 65/3,6 resulterer i brug af standardmodel</string>
<string name="overview_show_notes_field_in_dialogs_title">Vis notefelt i behandlingsdialoger</string>
<string name="next_button">Næste</string>
<string name="previous_button">Forrige</string>
@ -601,7 +606,11 @@
<string name="secondcarbsincrement">Anden kulhydratstigning</string>
<string name="thirdcarbsincrement">Tredje kulhydratstigning</string>
<string name="cgm">CGM</string>
<string name="ns_cellular">Brug mobilforbindelse</string>
<string name="ns_wifi">Brug Wi-Fi-forbindelse</string>
<string name="ns_wifi_ssids">WiFi SSID</string>
<string name="ns_charging">Under opladning</string>
<string name="ns_battery">På batteri</string>
<string name="connectionsettings_title">Indstillinger for forbindelse</string>
<string name="ns_wifi_allowedssids">Tilladte SSID\'er (semikolon separeret)</string>
<string name="ns_allowroaming">Tillad forbindelse i roaming</string>
@ -675,6 +684,8 @@
<string name="error_adding_treatment_message">En behandling (insulin: %1$.2f, kulhydrater: %2$d, kl: %3$s) kunne ikke tilføjes til behandlinger. Tjek og tilføj venligst en note manuelt efter behov.</string>
<string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), forsinkelse: %3$d m</string>
<string name="openaps_noasdata">Ingen tilgængelige autosens data</string>
<string name="log_files">Logfiler</string>
<string name="miscellaneous">Diverse</string>
<string name="nav_logsettings">Log indstillinger</string>
<string name="resettodefaults">Nulstil til standardindstillinger</string>
<string name="nsmalfunction">NSClient funktionsfejl. Overvej NS og NSClient genstart.</string>
@ -767,6 +778,11 @@
<string name="invalidpct">Ugyldig angivelse af %</string>
<string name="average">Gennemsnit</string>
<string name="tir">Tid i målområde</string>
<string name="day_tir">Dags TIR</string>
<string name="night_tir">Nat TIR</string>
<string name="detailed_14_days">Detaljerede 14 dage</string>
<string name="std_deviation">SD: %1$s</string>
<string name="hba1c">HbA1c: </string>
<string name="activitymonitor">Aktivitetsovervågning</string>
<string name="doyouwantresetstats">Ønsker du at nulstille aktivitetsstatistik?</string>
<string name="statistics">Statistikker</string>
@ -953,6 +969,7 @@
<string name="wear_action_tempt_max_bg_error">Max-BS udenfor området!</string>
<string name="wear_action_tempt_manual_range_message">Midlertidigt mål:\nMin: %1$s\nMax: %2$s\nVarighed: %3$s</string>
<string name="wear_action_tempt_manual_message">Midlertigt mål:\nMål: %1$s\nVarighed: %2$s</string>
<string name="wear_action_tempt_preset_message">Midlertigt mål:\nGrund: %1$s\nMål: %2$s\nVarighed: %3$s</string>
<string name="quick_wizard_message">Hurtigguide: %1$s\nInsulin: %2$.2fE\nKH: %3$dg</string>
<string name="wizard_result">Guide:\nInsulin: %1$.2fE\nKH: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Vis post på enhed:</string>
@ -961,9 +978,11 @@
<string name="wizard_no_active_profile">Ingen aktiv profil angivet!</string>
<string name="wizard_no_cob">Ukendt COB! BG læsning mangler eller nylig app genstart?</string>
<string name="wizard_carbs_constraint">KH begrænsninger overtrådt!</string>
<string name="wizard_explain_calc">Beregner (IC: %1$.1f, ISF: %2$.1f)</string>
<string name="wizard_explain_carbs">Kulhydrater: %1$.2fE</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fE</string>
<string name="wizard_explain_bg">BS: %1$.2fE</string>
<string name="wizard_explain_iob">IOB: %1$.2fE</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fE</string>
<string name="wizard_explain_trend">15\' trend: %1$.2fE</string>
<string name="wizard_explain_percent">Procent: %1$.2fE x %2$d%% ≈ %3$.2fE</string>
@ -990,6 +1009,10 @@
<string name="count_selected">%1$d valgt</string>
<string name="sort_label">Sortér</string>
<string name="dialog_canceled">Dialog annulleret</string>
<string name="veryLow" comment="below 3.1">Meget lav</string>
<string name="low" comment="3.1-3.9">Lav</string>
<string name="high" comment="10.0-13.9">Høj</string>
<string name="veryHigh" comment="above 13.9">Meget høj</string>
<string name="below" comment="below &quot;in range&quot;">Under</string>
<string name="in_range">Inden for området</string>
<string name="above" comment="above &quot;in range&quot;">Over</string>
@ -998,6 +1021,12 @@
<string name="widget_description">AndroidAPS widget</string>
<string name="configure">Indstil gennemsigtighed</string>
<string name="loop_status">Loop status</string>
<string name="graph_scale">Graf skala</string>
<string name="profile1">Profil 1</string>
<string name="profile2">Profil 2</string>
<string name="login">Log ind</string>
<string name="remove_all">Fjern alle</string>
<string name="reset_start">Nulstil start</string>
<string name="a11y_otp_qr_code">QR-kode til opsætning af engangs kodeord</string>
<string name="a11y_open_settings">Åbn indstillinger</string>
<string name="a11y_set_carb_timer">indstil KH alarm</string>
@ -1007,8 +1036,12 @@
<string name="a11y_only_on_watch">kun på ur</string>
<string name="a11y_only_on_phone">kun på telefon</string>
<string name="a11y_drag_and_drop_handle">træk og slip håndtering</string>
<string name="search">Søg</string>
<!-- Aidex Cgms -->
<string name="aidex">GlucoRx Aidex</string>
<string name="aidex_short">Aidex</string>
<string name="description_source_aidex">Modtag BG-værdier fra GlucoRx Aidex CGMS.</string>
<string name="blocked_by_charging">Blokeret af opladningsmuligheder</string>
<string name="blocked_by_connectivity">Blokeret af forbindelsesmuligheder</string>
<string name="no_watch_connected">(Intet ur forbundet)</string>
</resources>

View file

@ -104,9 +104,11 @@
<string name="troubleshooting_wheretoask">Wo kannst Du nach Hilfe für AndroidAPS suchen?</string>
<string name="troubleshooting_fb">Du kannst in der AndroidAPS-Facebook-Gruppe um Rat bitten.</string>
<string name="troubleshooting_wiki">Du solltest die AndroidAPS-Dokumentation lesen (und wiederholt lesen).</string>
<string name="troubleshooting_gitter">Im Discord Channel AndroidAPS kannst Du bei technischen Problemen oder Fragestellungen um Hilfe bitten.</string>
<string name="troubleshooting_yourendo">Du solltest Deine Diabetesklinik / Deinen Diabetologen fragen.</string>
<string name="troubleshooting_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/de/Installing-AndroidAPS/Update-to-new-version.html#problembehandlung</string>
<string name="troubleshooting_hint2">https://www.facebook.com/groups/loopedDE/</string>
<string name="troubleshooting_hint3">https://discord.gg/4fQUWHZ4Mw</string>
<string name="insulin_label">Insulin-Plugins</string>
<string name="insulin_ultrarapid">Welches Insulin kann mit dem Ultra-Rapid-Oref-Plugin verwendet werden?</string>
<string name="insulin_fiasp">Fiasp®</string>
@ -121,6 +123,7 @@
<string name="sensitivity_cannula">Das Protokollieren eines Kanülenwechsels setzt das Autosens Verhältnis wieder auf 100% zurück.</string>
<string name="sensitivity_time">Einige der Plugin-Optionen haben konfigurierbare Zeiträume, die vom Benutzer eingestellt werden können.</string>
<string name="sensitivity_hint1">https://androidaps.readthedocs.io/en/latest/CROWDIN/de/Configuration/Sensitivity-detection-and-COB.html</string>
<string name="sensitivity_hint2">https://androidaps.readthedocs.io/de/latest/Usage/Open-APS-features.html?highlight=Autosens#autosens</string>
<string name="wrongcarbs_label">Fehler bei der KH-Eingabe</string>
<string name="wrongcarbs_whattodo">Was sollst Du tun, wenn Du einen falschen KH-Eintrag gemacht hast?</string>
<string name="wrongcarbs_treatmentstab">Lösche die falsche Eingabe in der Behandlung und gib den richtigen neuen Kohlehydratwert ein.</string>
@ -133,6 +136,19 @@
<string name="wronginsulin_compare">Vergleiche die Werte der Historie in AAPS und Deiner Pumpe (wenn die Pumpe diese Funktion bietet).</string>
<string name="wronginsulin_prime">Gib einen Teil-Bolus des \'nicht erhaltenen\' Insulins mit Spritze / Pen oder durch Befüllen der Kanüle.</string>
<string name="wronginsulin_donothing">Unternimm nichts und lass AndroidAPS die entstehenden hohen Glukosewerte korrigieren.</string>
<string name="cob_label">KH an Board (COB)</string>
<string name="cob_question">Wie beeinflusst das Ändern des ISF-Wertes die COB-Berechnung?</string>
<string name="cob_longer">Steigende ISF absorbiert Kohlenhydrate länger</string>
<string name="cob_shorter">Steigende ISF absorbiert Kohlenhydrate kürzer</string>
<string name="cob_no_effect">Steigende ISF verändert die Dauer für die Kohlenhydrataufnahme nicht</string>
<string name="cob2_question">Wie beeinflusst das Ändern des ISF-Wertes die COB-Berechnung?</string>
<string name="cob2_longer">Steigende IC absorbiert Kohlenhydrate länger</string>
<string name="cob2_shorter">Steigende IC absorbiert Kohlenhydrate kürzer</string>
<string name="cob2_no_effect">Steigende IC verändert die Zeit für die Kohlenhydrataufnahme nicht</string>
<string name="cob3_question">Wie beeinflusst die Änderung des Profil-Prozentsatzes die COB-Berechnung?</string>
<string name="cob3_longer">Die Einstellung des Profils auf 150% verlängert die Zeit für Kohlenhydrataufnahme</string>
<string name="cob3_shorter">Die Einstellung des Profils auf 150% verkürzt die Zeit für Kohlenhydrataufnahme</string>
<string name="cob3_no_effect">Die Einstellung des Profils auf 150% verändert die Zeit für die Kohlenhydrataufnahme nicht</string>
<string name="iob_label">Aktives Insulin (IOB)</string>
<string name="iob_value">IOB wird von den abgegebenen temporären Basalraten beeinflusst.</string>
<string name="iob_hightemp">Eine hohe temporäre Basalrate wird nicht abgegeben, wenn der BZ unterhalb des Zielwerts liegt.</string>

View file

@ -6,6 +6,7 @@
<string name="treatmentssafety_title">Sicherheitseinstellungen der Behandlungen</string>
<string name="treatmentssafety_maxbolus_title">Max. erlaubter Bolus [IE]</string>
<string name="treatmentssafety_maxcarbs_title">Max. erlaubte Kohlenhydrate [g]</string>
<string name="treatmentssafety_lgsThreshold_title">BG-Pegel, unterhalb dessen die Aussetzung wegen niedriger Glukoseaussetzung eintritt</string>
<string name="nav_preferences_plugin">%1$s-Einstellungen</string>
<string name="nav_preferences">Einstellungen</string>
<string name="nav_refreshtreatments">Behandlungen von NS aktualisieren</string>
@ -25,6 +26,7 @@
<string name="description_ns_client">Synchronisiert deine Daten mit Nightscout</string>
<string name="description_ama">Stand des Algorithmus in 2017</string>
<string name="description_smb">Der aktuellste Algorithmus für erfahrene Nutzer</string>
<string name="description_smb_dynamic_isf">Neuester Algorithmus für fortgeschrittene Benutzer mit dynamischer/automatischer ISF</string>
<string name="description_overview">Zeigt den aktuellen Status deines Loops und Schaltflächen für die geläufigsten Aktionen an</string>
<string name="description_persistent_notification">Zeigt eine fortlaufende Benachrichtigung mit einer kurzen Übersicht darüber, was dein Loop derzeit tut</string>
<string name="description_profile_local">Definiere ein Profil, was auch offline verfügbar ist.</string>
@ -264,6 +266,7 @@
<string name="configbuilder_shortname">KONF</string>
<string name="loop_shortname">LOOP</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DYNISF</string>
<string name="localprofile_shortname">LP</string>
<string name="overview_shortname">HOME</string>
<string name="virtualpump_shortname">VP</string>
@ -430,12 +433,15 @@
<string name="ns_localbroadcasts_title">Aktiviere lokale Broadcasts</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="openaps_smb_dynamic_isf">Dynamischer ISF</string>
<string name="DynISFAdjust_title" formatted="false">DynamicISF Anpassungsfaktor %</string>
<string name="DynISFAdjust_summary" formatted="false">Anpassungsfaktor für DynamicISF. Stelle mehr als 100 % für aggressivere Korrekturdosen ein, und weniger als 100 % für weniger aggressive Korrekturen.</string>
<string name="enableuam">Aktiviere UAM</string>
<string name="enablesmb">Aktiviere SMB</string>
<string name="enablesmb_summary">Benutze Super-Mikro-Boli anstelle von temporären Basalraten, um eine schnellere Wirkung zu erreichen.</string>
<string name="enableuam_summary">Erkennung von unangekündigten Mahlzeiten</string>
<string name="insulin_oref_peak">Wirkungshoch der IOB-Kurve</string>
<string name="insulin_peak_time">Wirkungshoch [min]</string>
<string name="insulin_peak">Gipfel</string>
<string name="free_peak_oref">Free-Peak Oref</string>
<string name="rapid_acting_oref">Rapid-Acting Oref</string>
<string name="ultrarapid_oref">Ultra-Rapid Oref</string>
@ -497,6 +503,7 @@
<string name="negativeonly">Nur negative</string>
<string name="overview_editquickwizard_usecob">COB Berechnung</string>
<string name="overview_editquickwizard_usetemptarget">Temporäres Ziel Berechnung</string>
<string name="overview_editquickwizard_usepercentage">Prozentuale Berechnung</string>
<string name="loopenabled">Loop aktiviert</string>
<string name="apsselected">APS ausgewählt</string>
<string name="nsclienthaswritepermission">Nightscout-Client hat Schreibrechte</string>
@ -586,6 +593,7 @@
<string name="openapssmb_maxiob_summary">Diesen Wert nennt OpenAPS MaxIOB.\nSolange dieser Wert überschritten wird, wird AndroidAPS kein Insulin abgeben.</string>
<string name="absorption_cutoff_title">Maximale Dauer der Essens-Resorption [h]</string>
<string name="absorption_cutoff_summary">Zeit, nach der jede Mahlzeit mit Sicherheit absorbiert ist. Verbleibende Kohlenhydrate werden danach nicht mehr berücksichtigt.</string>
<string name="treatmentssafety_lgsThreshold_summary">Der BG-Wert, unter dem die Insulinzuführung ausgesetzt wird. Der Standardwert verwendet das Standard-Zielmodell. Der Benutzer kann einen Wert zwischen 60mg/dl (3.3 mmol/l) und 100mg/dl (5.5mmol/l) setzen. Werte unterhalb 65/3.6 führen zur Verwendung des Standardmodells</string>
<string name="overview_show_notes_field_in_dialogs_title">Zeige Feld für Notizen in den Behandlungsdialogen</string>
<string name="next_button">Weiter</string>
<string name="previous_button">Zurück</string>
@ -598,7 +606,11 @@
<string name="secondcarbsincrement">Zweite KH-Erhöhung</string>
<string name="thirdcarbsincrement">Dritte KH-Erhöhung</string>
<string name="cgm">CGM</string>
<string name="ns_cellular">Mobilfunkverbindung verwenden</string>
<string name="ns_wifi">WLAN Verbindung verwenden</string>
<string name="ns_wifi_ssids">WLAN SSID</string>
<string name="ns_charging">Während des Ladevorgangs</string>
<string name="ns_battery">Bei Batteriebetrieb</string>
<string name="connectionsettings_title">Verbindungs-Einstellungen</string>
<string name="ns_wifi_allowedssids">Erlaubte SSIDs (durch Semikolon getrennt)</string>
<string name="ns_allowroaming">Erlaube Verbindung bei Roaming</string>
@ -654,7 +666,10 @@
<string name="sensitivity_raises_target_title">Empfindlichkeit erhöht den Zielwert</string>
<string name="sensitivity_raises_target_summary">Wenn eine höhere Empfindlichkeit festgestellt wird, wird der Glukose-Zielwert erhöht.</string>
<string name="careportal_removestartedevents">\"AndroidAPS gestartet\" Ereignisse löschen</string>
<string name="show_invalidated">Zeige Ungültige</string>
<string name="hide_invalidated">Verstecke Ungültige</string>
<string name="remove_items">Objekte entfernen</string>
<string name="sort_items">Einträge sortieren</string>
<string name="storedsettingsfound">Gespeicherte Einstellungen gefunden</string>
<string name="allow_hardware_pump_text">WARNUNG: Wenn Du eine echte Pumpe aktivierst und anschließt, kopiert AndroidAPS die Basaleinstellungen vom aktiven Profil zur Pumpe (und behält sie bei). Die Einstellungen in der Pumpe werden hierbei überschrieben. Wenn Du Dir nicht sicher bist oder die Basaleinstellungen in der Pumpe nicht überschreiben möchten, drücke \"Abbrechen\" und vollziehe den Wechsel zur Pumpe später.</string>
<string name="error_adding_treatment_title">Behandlungsdaten unvollständig</string>
@ -669,6 +684,8 @@
<string name="error_adding_treatment_message">Der Eintrag (Insulin: %1$.2f, Kohlenhydrate: %2$d, um: %3$s) konnte nicht als Behandlung gespeichert werden. Bitte überprüfe die aktuelle Liste und füge, falls notwendig, den Datensatz manuell hinzu.</string>
<string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), Verzögerung: %3$d m</string>
<string name="openaps_noasdata">Keine Autosens-Daten verfügbar</string>
<string name="log_files">Log Dateien</string>
<string name="miscellaneous">Verschiedenes</string>
<string name="nav_logsettings">Log-Einstellungen</string>
<string name="resettodefaults">Auf Standardwerte zurücksetzen</string>
<string name="nsmalfunction">NSClient Störung. Ziehe einen Neustart von NS und NSClient in Betracht.</string>
@ -762,6 +779,11 @@ Unerwartetes Verhalten.</string>
<string name="invalidpct">Ungültige % Eingabe</string>
<string name="average">Durchschnitt</string>
<string name="tir">TIR</string>
<string name="day_tir">Tages TIR</string>
<string name="night_tir">Nacht TIR</string>
<string name="detailed_14_days">Detaillierte 14 Tage</string>
<string name="std_deviation">SD: %1$s</string>
<string name="hba1c">HbA1c: </string>
<string name="activitymonitor">Aktivitätsmonitor</string>
<string name="doyouwantresetstats">Willst Du die Aktivitätsstatistik zurücksetzen?</string>
<string name="statistics">Statistiken</string>
@ -802,6 +824,7 @@ Unerwartetes Verhalten.</string>
<string name="smscommunicator_otp_install_info">Installiere auf jedem Follower-Phone eine Authenticator-App, die RFC 6238 TOTP-Token unterstützt. Beliebte kostenlose Apps sind:\n Authy\n Google Authenticator\n LastPass Authenticator\n FreeOTP Authenticator</string>
<string name="smscommunicator_otp_reset_warning">Wenn Du den Authentifikator zurücksetzt werden alle bestehenden Authentifikatoren ungültig. Du musst sie dann neu einrichten!</string>
<string name="overview_show_predictions">Predictions (Vorhersagen)</string>
<string name="overview_show_treatments">Behandlungen</string>
<string name="overview_show_deviationslope">Steigung der Abweichung</string>
<string name="authorizationfailed">Autorisierung fehlgeschlagen</string>
<string name="overview_show_absinsulin">Gesamtinsulin</string>
@ -871,6 +894,8 @@ Unerwartetes Verhalten.</string>
<string name="ns_receive_profile_switch_summary">Profilwechsel akzeptieren, die in NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_offline_event">APS Offline-Ereignisse empfangen</string>
<string name="ns_receive_offline_event_summary">APS Offline-Ereignisse akzeptieren, die über NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_tbr_eb">TBR und EB empfangen</string>
<string name="ns_receive_tbr_eb_summary">Akzeptiere TBR und EB, die von einer anderen Instanz eingegeben wurden</string>
<string name="ns_receive_insulin">Insulin abrufen</string>
<string name="ns_receive_insulin_summary">Insulin akzeptieren, das in NS oder NSClient eingegeben wurden</string>
<string name="ns_receive_carbs">Kohlenhydrate abrufen</string>
@ -889,9 +914,11 @@ Unerwartetes Verhalten.</string>
<string name="error_in_isf_values">Fehler in ISF-Werten</string>
<string name="run_question">%s ausführen?</string>
<string name="invalid_profile_not_accepted">Ungültiges Profil %1$s wurde von NS nicht akzeptiert</string>
<string name="view">Ansicht</string>
<string name="errors">Fehler</string>
<string name="ns_sync_slow">Hochladen verlangsamen</string>
<string name="data_status">Status BZ-Daten</string>
<string name="remove_bg_readings">BG-Werte entfernen</string>
<string name="statuslights_cannula_age">Kanülenalter</string>
<string name="statuslights_patch_pump_age">Alter Patchpumpe</string>
<string name="patch_pump">Patch-Pumpe</string>
@ -929,7 +956,46 @@ Unerwartetes Verhalten.</string>
<string name="a11y_delete_current_profile">aktuelles Profil löschen</string>
<string name="a11y_add_new_to_list">neu zur Liste hinzufügen</string>
<!-- Theme switcher dark and light mode-->
<string name="theme_switcher_summary">Wähle das dunkle, helle oder das Systemdesign</string>
<string name="app_color_scheme">App Farbschema</string>
<string name="dark_theme">Dunkles Design</string>
<string name="light_theme">Helles Design</string>
<string name="follow_system_theme">Systemdesign verwenden</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Temp-Target unbekannte Voreinstellung: %1$s</string>
<string name="wear_action_tempt_cancel_message">Ausführung des Temp-Targets abbrechen?</string>
<string name="wear_action_tempt_unit_error">Verschiedene Einheiten werden auf Uhr und Telefon verwendet!</string>
<string name="wear_action_tempt_zero_message">Zero-Temp-Target - abbrechen des laufenden Temp-Targets?</string>
<string name="wear_action_tempt_min_bg_error">Min-BG ist außerhalb des Bereichs!</string>
<string name="wear_action_tempt_max_bg_error">Max-BG ist außerhalb des Bereichs!</string>
<string name="wear_action_tempt_manual_range_message">Temptarget:\nMin: %1$s\nMax: %2$s\nDauer: %3$s</string>
<string name="wear_action_tempt_manual_message">Temptarget:\nTarget: %1$s\nDauer: %2$s</string>
<string name="wear_action_tempt_preset_message">Temp-Target:\nGrund: %1$s\nTarget: %2$s\nDauer: %3$s</string>
<string name="quick_wizard_message">QuickWizard: %1$s\nInsulin: %2$.2fU\nCarbs: %3$dg</string>
<string name="wizard_result">Calc. Wizard:\nInsulin: %1$.2fU\nCarbs: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Zeige Eintrag auf dem Gerät:</string>
<string name="quick_wizard_not_available">Ausgewählter Quickwizard nicht mehr verfügbar, bitte aktualisiere die Kachel</string>
<string name="wizard_no_actual_bg">Kein aktueller BG liegt als Basis zur Berechnung vor!</string>
<string name="wizard_no_active_profile">Kein aktives Profil gesetzt!</string>
<string name="wizard_no_cob">Unbekannter COB! BG-Wert fehlt oder wurde App vor kurzem neu gestartet?</string>
<string name="wizard_carbs_constraint">Die Kohlenhydrateinschränkung wurde überschritten!</string>
<string name="wizard_explain_calc">Calc (IC: %1$.1f, ISF: %2$.1f)</string>
<string name="wizard_explain_carbs">Kohlenhydrate: %1$.2fU</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">BZ: %1$.2fU</string>
<string name="wizard_explain_iob">IOB: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fU</string>
<string name="wizard_explain_trend">15\' Trend: %1$.2fU</string>
<string name="wizard_explain_percent">Prozent: %1$.2fU x %2$d%% ≈ %3$.2fU</string>
<string name="wizard_constraint_bolus_size">Verletzung der Bolusbeschränkung!\nKann %1$.2fU nicht abgeben</string>
<string name="wizard_explain_tt">TempT: %1$s</string>
<string name="wizard_explain_tt_to">%1$s zu %2$s</string>
<string name="wizard_pump_not_available">Keine Pumpe verfügbar!</string>
<string name="wear_unknown_action_string">Unbekannter Actionbefehl:</string>
<string name="overview_editquickwizard_percentage">Prozentsatz</string>
<string name="app_default">Standardwert der Anwendung</string>
<string name="show_invalidated_records">Zeige ungültige / gelöschte Einträge</string>
<string name="hide_invalidated_records">Verberge ungültige / gelöschte Einträge</string>
<string name="select_profile">Profil zum Bearbeiten auswählen</string>
<string name="refresh_from_nightscout">Aktualisiere von Nightscout</string>
<string name="remove_selected_items">Ausgewähltes Objekt löschen</string>
@ -938,8 +1004,46 @@ Unerwartetes Verhalten.</string>
<string name="tempt_targets">Temporäre Ziele</string>
<string name="carbs_and_bolus">Kohlenhydrate &amp; Bolus</string>
<string name="confirm_remove_multiple_items">Sind Sie sicher, dass Sie diese(s) %1$d Element(e) löschen möchten?</string>
<string name="no_records_available">Keine Datensätze verfügbar</string>
<string name="hide_loop">Verberge Loop</string>
<string name="show_loop">Zeige Loop an</string>
<string name="count_selected">%1$d ausgewählt</string>
<string name="sort_label">Sortieren</string>
<string name="dialog_canceled">Dialog abgebrochen</string>
<string name="veryLow" comment="below 3.1">Sehr niedrig</string>
<string name="low" comment="3.1-3.9">Niedrig</string>
<string name="high" comment="10.0-13.9">Hoch</string>
<string name="veryHigh" comment="above 13.9">Sehr hoch</string>
<string name="below" comment="below &quot;in range&quot;">Unter</string>
<string name="in_range">Im Zielbereich</string>
<string name="above" comment="above &quot;in range&quot;">Über</string>
<string name="show_loop_records">Zeige Loop Datensätze</string>
<string name="show_hide_records">Verberge Loop Datensätze</string>
<string name="widget_description">AndroidAPS Widget</string>
<string name="configure">Deckkraft konfigurieren</string>
<string name="loop_status">Loop Status</string>
<string name="graph_scale">Diagrammskala</string>
<string name="profile1">Profil 1</string>
<string name="profile2">Profil 2</string>
<string name="login">Login</string>
<string name="remove_all">Alle entfernen</string>
<string name="reset_start">Start zurücksetzen</string>
<string name="a11y_otp_qr_code">QR Code für einmaliges Passwort einrichten</string>
<string name="a11y_open_settings">Einstellungen öffnen</string>
<string name="a11y_set_carb_timer">setze Alarm für KH Timer</string>
<string name="device_all">Alle</string>
<string name="device_phone">Smartphone</string>
<string name="device_watch">Smartwatch</string>
<string name="a11y_only_on_watch">nur auf Uhr</string>
<string name="a11y_only_on_phone">nur auf Telefon</string>
<string name="a11y_drag_and_drop_handle">Drag and Drop Handle</string>
<string name="search">Suche</string>
<!-- Aidex Cgms -->
<string name="aidex">GlucoRx Aidex</string>
<string name="aidex_short">Aidex</string>
<string name="description_source_aidex">Erhalte BG-Werte von GlucoRx Aidex CGMS.</string>
<string name="blocked_by_charging">Blockiert durch Ladeoptionen</string>
<string name="blocked_by_connectivity">Blockiert durch Verbindungsoptionen</string>
<string name="no_watch_connected">(keine Uhr verbunden)</string>
<string name="error_asking_for_permissions">Fehler beim Anfordern der Erlaubnis</string>
</resources>

View file

@ -1044,4 +1044,5 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="blocked_by_charging">Bloqué par les options de recharge</string>
<string name="blocked_by_connectivity">Bloqué par les options de connectivité</string>
<string name="no_watch_connected">(Pas de montre connectée)</string>
<string name="error_asking_for_permissions">Erreur lors de la demande des autorisations</string>
</resources>

View file

@ -1044,4 +1044,5 @@
<string name="blocked_by_charging">Blokkert på grunn av ladealternativer</string>
<string name="blocked_by_connectivity">Blokkert på grunn av tilkoblingsalternativer</string>
<string name="no_watch_connected">(Ingen klokke tilkoblet)</string>
<string name="error_asking_for_permissions">Feil under spørring etter tillatelser</string>
</resources>

View file

@ -552,7 +552,7 @@
<string name="smbnotallowedinopenloopmode">SMB não permitido no modo open loop</string>
<string name="food_short">Alimentos</string>
<string name="reset">repor</string>
<string name="openapssmb_maxiob_title">Máximo total IOS OpenAPS não pode superar [U]</string>
<string name="openapssmb_maxiob_title">Máximo total de IOB OpenAPS não pode superar [U]</string>
<string name="openapssmb_maxiob_summary">Este valor é chamado de Max IOB em contexto de OpenAPS\nOpenAPS não adicionará mais insulina se o IOB atual for maior que este valor</string>
<string name="absorption_cutoff_title">Tempo máx. absorção refeição [h]</string>
<string name="absorption_cutoff_summary">Hora em que qualquer refeição é considerada absorvida. Restantes hidratos de carbono serão cortados.</string>

View file

@ -1043,4 +1043,5 @@
<string name="blocked_by_charging">Заблокировано опциями зарядки</string>
<string name="blocked_by_connectivity">Заблокировано настройками подключения</string>
<string name="no_watch_connected">(Часы не подключены)</string>
<string name="error_asking_for_permissions">Ошибка при запросе разрешения</string>
</resources>

View file

@ -1045,4 +1045,5 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
<string name="blocked_by_charging">Şarj seçenekleri tarafından engellendi</string>
<string name="blocked_by_connectivity">Bağlantı seçenekleri tarafından engellendi</string>
<string name="no_watch_connected">(Saat Bağlı Değil)</string>
<string name="error_asking_for_permissions">İzin istenirken hata</string>
</resources>

View file

@ -1250,6 +1250,7 @@
<string name="blocked_by_charging">Blocked by charging options</string>
<string name="blocked_by_connectivity">Blocked by connectivity options</string>
<string name="no_watch_connected">(No Watch Connected)</string>
<string name="error_asking_for_permissions">Error asking for permissions</string>
</resources>

View file

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:validate="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:key="@string/key_autotune_plugin"
android:title="@string/autotune_settings"
@ -24,12 +26,19 @@
android:summary="@string/autotune_tune_insulin_curve_summary"
android:title="@string/autotune_tune_insulin_curve_title" />
-->
<EditTextPreference
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
android:defaultValue="5"
android:inputType="number"
android:key="@string/key_autotune_default_tune_days"
android:summary="@string/autotune_default_tune_days_summary"
android:title="@string/autotune_default_tune_days_title" />
android:title="@string/autotune_default_tune_days_title"
android:dialogMessage="@string/autotune_default_tune_days_summary"
android:digits="0123456789"
android:inputType="number"
android:selectAllOnFocus="true"
android:singleLine="true"
validate:maxNumber="30"
validate:minNumber="1"
validate:testType="numericRange" />
<SwitchPreference
android:defaultValue="false"

View file

@ -123,4 +123,5 @@
<string name="run_automations">Kør automatisering</string>
<string name="add_automation">Tilføj regel</string>
<string name="remove_sort">Fjern/sorter</string>
<string name="stop_processing">Stop afvikling</string>
</resources>

View file

@ -113,5 +113,15 @@
<string name="automation_event">Automatisierungs-Ereignis</string>
<string name="reorder_label">Umsortieren</string>
<string name="user_action">Benutzeraktion</string>
<string name="remove_automation">Automatisierung entfernen</string>
<string name="sort_automation">Automation-Regeln sortieren</string>
<string name="remove_selected_items">Ausgewähltes Objekt löschen</string>
<string name="count_selected">%1$d ausgewählt</string>
<string name="confirm_remove_multiple_items">Sind Sie sicher, dass Sie diese(s) %1$d Element(e) löschen möchten?</string>
<string name="sort_label">Sortieren</string>
<string name="system_automation">System-Automatisierung</string>
<string name="run_automations">Automatisierungen ausführen</string>
<string name="add_automation">Regel hinzufügen</string>
<string name="remove_sort">Entfernen/sortieren</string>
<string name="stop_processing">Verarbeitung beenden</string>
</resources>

View file

@ -90,7 +90,7 @@
<string name="latitude_short">Широта:</string>
<string name="longitude_short">Долгота:</string>
<string name="glucose_u">Гк %1$s]:</string>
<string name="target_u">Цель %1$d м</string>
<string name="target_u">Цель [%1$s]:</string>
<string name="lastboluslabel">Предыдущий болюс</string>
<string name="lastboluscompared">Время болюса %1$s %2$s мин назад</string>
<string name="triggercoblabel">Активн углеводы</string>

View file

@ -123,4 +123,5 @@
<string name="run_automations">Spustiť automatizácie</string>
<string name="add_automation">Pridať pravidlo</string>
<string name="remove_sort">Odstrániť/zoradiť</string>
<string name="stop_processing">Zastaviť spracovanie</string>
</resources>

View file

@ -7,14 +7,14 @@ buildscript {
rxjava_version = '3.1.5'
rxandroid_version = '3.0.0'
rxkotlin_version = '3.0.1'
room_version = '2.4.2'
room_version = '2.4.3'
lifecycle_version = '2.5.0'
dagger_version = '2.42'
coroutines_version = '1.6.4'
activity_version = '1.4.0'
fragmentktx_version = '1.4.1'
ormLite_version = '4.46'
gson_version = '2.9.0'
gson_version = '2.9.1'
nav_version = '2.4.2'
appcompat_version = '1.4.2'
material_version = '1.6.1'
@ -48,7 +48,7 @@ buildscript {
maven { url "https://plugins.gradle.org/m2/" } // jacoco 0.2
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.1'
classpath 'com.android.tools.build:gradle:7.2.2'
classpath 'com.google.gms:google-services:4.3.13'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.1'

View file

@ -51,4 +51,10 @@
<string name="combo_tbr_count">Anzahl TBR</string>
<string name="bolusstopped">Bolus gestoppt</string>
<string name="bolusstopping">Bolus wird gestoppt</string>
<string name="pump_commerror_label">Komm. Fehleranzahl</string>
<string name="show_comm_error_count_title">Zeige Komm.-Fehleranzahl</string>
<string name="show_comm_error_count_summary">Zeigt die Fehleranzahl bei der Kommunikation mit Ruffy an. In den meisten Fällen zeigt eine Zahl höher als 0 an, dass Ruffy Kommunikationsprobleme vorliegen (ein Neustart kann erforderlich sein).</string>
<string name="combo_error_display_never">Nie</string>
<string name="combo_error_display_error">Bei Fehler</string>
<string name="combo_error_display_always">Immer</string>
</resources>

View file

@ -1,6 +1,7 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator
import androidx.collection.LongSparseArray
import androidx.collection.size
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.data.InMemoryGlucoseValue
import info.nightscout.androidaps.database.AppRepository
@ -41,7 +42,7 @@ class AutosensDataStore {
AutosensDataStore().also {
synchronized(dataLock) {
it.bgReadings = this.bgReadings.toMutableList()
it.autosensDataTable = this.autosensDataTable.clone()
it.autosensDataTable = LongSparseArray<AutosensData>(this.autosensDataTable.size).apply { putAll(this@AutosensDataStore.autosensDataTable) }
it.bucketedData = this.bucketedData?.toMutableList()
}
}
@ -57,7 +58,7 @@ class AutosensDataStore {
synchronized(autosensDataTable) {
for (index in autosensDataTable.size() - 1 downTo 0) {
if (autosensDataTable.keyAt(index) > time) {
aapsLogger.debug(LTag.AUTOSENS, "Removing from autosensDataTable: " + dateUtil.dateAndTimeAndSecondsString(autosensDataTable.keyAt(index)))
aapsLogger.debug(LTag.AUTOSENS) { "Removing from autosensDataTable: ${dateUtil.dateAndTimeAndSecondsString(autosensDataTable.keyAt(index))}" }
autosensDataTable.removeAt(index)
} else {
break
@ -135,10 +136,10 @@ class AutosensDataStore {
return null
}
return if (data.time < System.currentTimeMillis() - 11 * 60 * 1000) {
aapsLogger.debug(LTag.AUTOSENS, "AUTOSENSDATA null: data is old (" + reason + ") size()=" + autosensDataTable.size() + " lastData=" + dateUtil.dateAndTimeAndSecondsString(data.time))
aapsLogger.debug(LTag.AUTOSENS) { "AUTOSENSDATA null: data is old ($reason) size()=${autosensDataTable.size()} lastData=${dateUtil.dateAndTimeAndSecondsString(data.time)}" }
null
} else {
aapsLogger.debug(LTag.AUTOSENS, "AUTOSENSDATA ($reason) $data")
aapsLogger.debug(LTag.AUTOSENS) { "AUTOSENSDATA ($reason) $data" }
data
}
}
@ -164,7 +165,7 @@ class AutosensDataStore {
.compatGetBgReadingsDataFromTime(start, to + T.mins(2).msecs(), false)
.blockingGet()
.filter { it.value >= 39 }
aapsLogger.debug(LTag.AUTOSENS, "BG data loaded. Size: " + bgReadings.size + " Start date: " + dateUtil.dateAndTimeString(start) + " End date: " + dateUtil.dateAndTimeString(to))
aapsLogger.debug(LTag.AUTOSENS) { "BG data loaded. Size: ${bgReadings.size} Start date: ${dateUtil.dateAndTimeString(start)} End date: ${dateUtil.dateAndTimeString(to)}" }
createBucketedData(aapsLogger, dateUtil)
rxBus.send(EventBucketedDataCreated())
}
@ -184,13 +185,13 @@ class AutosensDataStore {
totalDiff += diff
diff = abs(diff)
if (diff > T.secs(30).msecs()) {
aapsLogger.debug(LTag.AUTOSENS, "Interval detection: values: " + bgReadings.size + " diff: " + diff / 1000 + "[s] is5minData: " + false)
aapsLogger.debug(LTag.AUTOSENS, "Interval detection: values: ${bgReadings.size} diff: ${diff / 1000}[s] is5minData: false")
return false
}
}
val averageDiff = totalDiff / bgReadings.size / 1000
val is5minData = averageDiff < 1
aapsLogger.debug(LTag.AUTOSENS, "Interval detection: values: " + bgReadings.size + " averageDiff: " + averageDiff + "[s] is5minData: " + is5minData)
aapsLogger.debug(LTag.AUTOSENS, "Interval detection: values: ${bgReadings.size} averageDiff: $averageDiff[s] is5minData: $is5minData")
return is5minData
}
}
@ -239,8 +240,7 @@ class AutosensDataStore {
var currentTime = bgReadings[0].timestamp - bgReadings[0].timestamp % T.mins(5).msecs()
val adjustedTime = adjustToReferenceTime(currentTime)
// after adjusting time may be newer. In this case use T-5min
if (adjustedTime > currentTime) currentTime = adjustedTime - T.mins(5).msecs()
else currentTime = adjustedTime
currentTime = if (adjustedTime > currentTime) adjustedTime - T.mins(5).msecs() else adjustedTime
aapsLogger.debug("Adjusted time " + dateUtil.dateAndTimeAndSecondsString(currentTime))
//log.debug("First reading: " + new Date(currentTime).toLocaleString());
while (true) {
@ -270,7 +270,7 @@ class AutosensDataStore {
}
val bData: MutableList<InMemoryGlucoseValue> = ArrayList()
bData.add(InMemoryGlucoseValue(bgReadings[0]))
aapsLogger.debug(LTag.AUTOSENS, "Adding. bgTime: " + dateUtil.toISOString(bgReadings[0].timestamp) + " lastBgTime: " + "none-first-value" + " " + bgReadings[0].toString())
aapsLogger.debug(LTag.AUTOSENS) { "Adding. bgTime: ${dateUtil.toISOString(bgReadings[0].timestamp)} lastBgTime: none-first-value ${bgReadings[0]}" }
var j = 0
for (i in 1 until bgReadings.size) {
val bgTime = bgReadings[i].timestamp
@ -293,7 +293,7 @@ class AutosensDataStore {
val newBgReading = InMemoryGlucoseValue(nextBgTime, nextBg.roundToLong().toDouble(), true)
//console.error("Interpolated", bData[j]);
bData.add(newBgReading)
aapsLogger.debug(LTag.AUTOSENS, "Adding. bgTime: " + dateUtil.toISOString(bgTime) + " lastBgTime: " + dateUtil.toISOString(lastBgTime) + " " + newBgReading.toString())
aapsLogger.debug(LTag.AUTOSENS) { "Adding. bgTime: ${dateUtil.toISOString(bgTime)} lastBgTime: ${dateUtil.toISOString(lastBgTime)} $newBgReading" }
elapsedMinutes -= 5
lastBg = nextBg
lastBgTime = nextBgTime
@ -301,14 +301,14 @@ class AutosensDataStore {
j++
val newBgReading = InMemoryGlucoseValue(bgTime, bgReadings[i].value)
bData.add(newBgReading)
aapsLogger.debug(LTag.AUTOSENS, "Adding. bgTime: " + dateUtil.toISOString(bgTime) + " lastBgTime: " + dateUtil.toISOString(lastBgTime) + " " + newBgReading.toString())
aapsLogger.debug(LTag.AUTOSENS) { "Adding. bgTime: ${dateUtil.toISOString(bgTime)} lastBgTime: ${dateUtil.toISOString(lastBgTime)} $newBgReading" }
}
abs(elapsedMinutes) > 2 -> {
j++
val newBgReading = InMemoryGlucoseValue(bgTime, bgReadings[i].value)
bData.add(newBgReading)
aapsLogger.debug(LTag.AUTOSENS, "Adding. bgTime: " + dateUtil.toISOString(bgTime) + " lastBgTime: " + dateUtil.toISOString(lastBgTime) + " " + newBgReading.toString())
aapsLogger.debug(LTag.AUTOSENS) { "Adding. bgTime: ${dateUtil.toISOString(bgTime)} lastBgTime: ${dateUtil.toISOString(lastBgTime)} $newBgReading" }
}
else -> {
@ -327,7 +327,7 @@ class AutosensDataStore {
val previous = bData[i + 1]
val mSecDiff = current.timestamp - previous.timestamp
val adjusted = (mSecDiff - T.mins(5).msecs()) / 1000
aapsLogger.debug(LTag.AUTOSENS, "Adjusting bucketed data time. Current: " + dateUtil.dateAndTimeAndSecondsString(current.timestamp) + " to: " + dateUtil.dateAndTimeAndSecondsString(previous.timestamp + T.mins(5).msecs()) + " by " + adjusted + " sec")
aapsLogger.debug(LTag.AUTOSENS) { "Adjusting bucketed data time. Current: ${dateUtil.dateAndTimeAndSecondsString(current.timestamp)} to: ${dateUtil.dateAndTimeAndSecondsString(previous.timestamp + T.mins(5).msecs())} by $adjusted sec" }
if (abs(adjusted) > 90) {
// too big adjustment, fallback to non 5 min data
aapsLogger.debug(LTag.AUTOSENS, "Fallback to non 5 min data")
@ -354,5 +354,4 @@ class AutosensDataStore {
}
return if (count != 0) sum / count else 0.0
}
}

View file

@ -74,7 +74,7 @@ class AlarmSoundService : DaggerService() {
if (intent?.hasExtra(ErrorHelperActivity.SOUND_ID) == true) resourceId = intent.getIntExtra(ErrorHelperActivity.SOUND_ID, R.raw.error)
player = MediaPlayer()
try {
val afd = rh.openRawResourceFd(resourceId) ?: return START_STICKY
val afd = rh.openRawResourceFd(resourceId) ?: return START_NOT_STICKY
player?.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
afd.close()
player?.isLooping = true
@ -94,7 +94,7 @@ class AlarmSoundService : DaggerService() {
aapsLogger.error("Unhandled exception", e)
}
aapsLogger.debug(LTag.CORE, "onStartCommand End")
return START_STICKY
return START_NOT_STICKY
}
override fun onDestroy() {

View file

@ -450,17 +450,23 @@
<string name="autotune_auto_summary">Hvis aktiveret, vil Autotune automatisk opdatere og skifte til input-profil efter beregning ud fra en automatiseringsregel.</string>
<string name="autotune_categorize_uam_as_basal_title">Kategoriser UAM som basal</string>
<string name="autotune_categorize_uam_as_basal_summary">Aktiver kun hvis du har indtastet alle kulhydrater på pålidelig vis. Med denne indstilling vil pludselige stigninger set af Autotune, blive brugt til at anbefale ændringer af basal rate.</string>
<string name="autotune_tune_insulin_curve_title">Tilpas insulinkurven</string>
<string name="autotune_tune_insulin_curve_summary">Aktiver kun hvis du bruger egen peak værdi. Dette alternativ vil justere peak og DIA-varigheden</string>
<string name="autotune_default_tune_days_title">Antal dage med data</string>
<string name="autotune_circadian_ic_isf_title">Anvend gennemsnitligt resultat i døgnbaseret IC/ISF</string>
<string name="autotune_circadian_ic_isf_summary">Autotune vil ikke justere døgnrytme variationer, denne indstilling benytter gennemsnitlige værdier til justering af IC og ISF til din døgnrytme input profil</string>
<string name="autotune_additional_log_title">Inkludér flere logoplysninger for fejlfinding</string>
<string name="autotune_additional_log_summary">Aktivér kun hvis udviklerne beder dig om det, for at sende flere logoplysninger til at hjælpe med at fejlfinde Autotune plugin</string>
<string name="autotune_default_tune_days_summary">Standard antal dage data der skal behandles af Autotune (op til 30)</string>
<string name="autotune_tunedprofile_name">Justeret</string>
<string name="autotune_profile">Profil :</string>
<string name="autotune_tune_days">Justerings dage :</string>
<string name="autotune_last_run">Sidst kørt :</string>
<string name="autotune_warning">Advarsel :</string>
<string name="autotune_select_profile">Vælg profil, der skal justeres</string>
<string name="autotune_ic_warning">Autotune fungerer med kun én IC-værdi, din profil har %1$d værdier. Gennemsnitsværdi er %2$.2fg/E</string>
<string name="autotune_isf_warning">Autotune virker med kun én ISF-værdi, din profil har %1$d værdier. Gennemsnitlig værdi er %2$.1f%3$s/E</string>
<string name="autotune_error">Fejl i inputdata, prøv at køre autotune igen eller reducer antallet af dage</string>
<string name="autotune_warning_during_run">Automatisk beregning startet, vær venligst tålmodig</string>
<string name="autotune_warning_after_run">Kontrollér resultaterne omhyggeligt, før du bruger dem!</string>
<string name="autotune_partial_result">Delvis resultat dag %1$d / %2$d justeret</string>
@ -482,6 +488,7 @@
<string name="autotune_run_without_autoswitch">Autotune kørt uden profilskift</string>
<string name="autotune_run_with_autoswitch">Autotune kørt, profilen er automatisk skiftet</string>
<string name="autotune_run_with_error">Fejl under sidste Autotune kørsel</string>
<string name="autotune_run_cancelled">Autotune kører allerede, annulleret</string>
<string name="needconnectpermission">Applikationen kræver tilladelse til bluetooth</string>
<plurals name="days">
<item quantity="one">%1$d dag</item>

View file

@ -135,7 +135,9 @@
<string name="location_not_found_message">Auf neueren Geräten muss für die Bluetooth-Erkennung der Standortdienst aktiviert sein. AAPS speichert keine Standortdaten und der Dienst kann nach erfolgreichem Pairing wieder deaktiviert werden.</string>
<!-- Protection-->
<string name="wrongpassword">Falsches Passwort</string>
<string name="wrongpin">Falsche PIN</string>
<string name="passwords_dont_match">Die Passwörter stimmen nicht überein.</string>
<string name="pin_dont_match">PINs stimmen nicht überein</string>
<!-- Profile-->
<string name="basalprofilenotaligned">Basalraten beginnen nicht zur vollen Stunde: %1$s</string>
<string name="minimalbasalvaluereplaced">Basal-Wert wurde durch den kleinst möglichen Wert ersetzt: %1$s</string>
@ -429,10 +431,64 @@
<string name="insight_refresh_button" comment="26 characters max for translation">Insight Refresh Button</string>
<string name="a11y_min_button_description">abnehmend %1$s mit %2$s</string>
<string name="a11y_plus_button_description">zunehmend %1$s mit %2$s</string>
<string name="formatPercent">%1$.0f%%</string>
<string name="basal">Basal</string>
<string name="basalpct">Basal %</string>
<string name="count_selected">%1$d ausgewählt</string>
<string name="sort_label">Sortieren</string>
<string name="remove_items">Entferne Elemente</string>
<string name="sort_items">Sortiere Elemente</string>
<string name="remove_selected_items">lösche ausgewählte Elemente</string>
<string name="a11y_file">Datei</string>
<string name="a11y_user">Nutzer</string>
<!-- Autotune -->
<string name="autotune">Autotune</string>
<string name="autotune_description">Hilfe bei möglichen Anpassungen des Profils (ISF, IC und Basalraten)</string>
<string name="autotune_shortname">AT</string>
<string name="autotune_settings">Autotune Einstellungen</string>
<string name="autotune_auto_title">Automation Profilwechsel</string>
<string name="autotune_auto_summary">Falls aktiviert, wird Autotune nach der Berechnung in einer Automatisierungsregel automatisch das Eingangsprofil anpassen und darauf wechseln.</string>
<string name="autotune_categorize_uam_as_basal_title">UAM als Basal kategorisieren</string>
<string name="autotune_categorize_uam_as_basal_summary">Nur aktivieren, wenn Sie alle gegessen Kohlenhydrate zuverlässig eingegeben haben. Mit dieser Option werden plötzliche Steigerungen, die durch Autotune entdeckt werden, verwendet, um Änderungen an der Basalrate zu empfehlen.</string>
<string name="autotune_tune_insulin_curve_title">Insulinkurve anpassen</string>
<string name="autotune_tune_insulin_curve_summary">Nur einschalten, falls Du Free Peak verwendest. Diese Option passt sowohl den Gipfel der Wirkkurve an als auch die DIA Laufzeit</string>
<string name="autotune_default_tune_days_title">Anzahl der Tage an Daten</string>
<string name="autotune_circadian_ic_isf_title">Durchschnittsresultat im zirkadianen IC/ISF anwenden</string>
<string name="autotune_circadian_ic_isf_summary">Autotune wird keine zirkadianen Variationen einstellen. Diese Option wendet nur die durchschnittliche Änderung von IC und ISF auf Dein zirkadianes Eingangsprofil an</string>
<string name="autotune_additional_log_title">Fügen Sie weitere Log-Informationen zum Debuggen ein</string>
<string name="autotune_additional_log_summary">Nur einschalten, wenn von Du von den Entwicklern aufgefordert wirst, um ausführlichere Protokollinformationen zu senden, die beim Debuggen des Autotune Plugins hilfreich sind</string>
<string name="autotune_default_tune_days_summary">Standardanzahl der von Autotune zu verarbeitenden Daten (bis zu 30)</string>
<string name="autotune_tunedprofile_name">Angepasst</string>
<string name="autotune_profile">Profil :</string>
<string name="autotune_tune_days">Anpassungstage :</string>
<string name="autotune_last_run">Letzte Ausführung :</string>
<string name="autotune_warning">Warnung :</string>
<string name="autotune_select_profile">Wähle das Profil zum Anpassen aus</string>
<string name="autotune_ic_warning">Ausgewähltes Profil hat %1$d IC-Werte. Autotune wird %2$.2f g/U verwenden</string>
<string name="autotune_isf_warning">Ausgewähltes Profil hat %1$d ISF-Werte. Autotune wird %2$.1f %3$s/U verwenden</string>
<string name="autotune_error">Fehler in den Eingabedaten, versuche erneut Autotune auszuführen oder reduziere die Anzahl der Tage</string>
<string name="autotune_warning_during_run">Autotune Berechnung gestartet, bitte gedulde Dich einen Moment</string>
<string name="autotune_warning_after_run">Überprüfe die Ergebnisse sorgfältig, bevor Du sie verwendest!</string>
<string name="autotune_partial_result">Teilergebnistag %1$d / %2$d angepasst</string>
<string name="autotune_result">Ergebnis: %1$s</string>
<string name="autotune_param">Parameter</string>
<string name="autotune_percent">%</string>
<string name="autotune_missing">Fehlend</string>
<string name="autotune_profile_name">Autotune Profil %1$s</string>
<string name="autotune_run">Autotune ausführen</string>
<string name="autotune_check_input_profile_button">Eingabeprofil überprüfen</string>
<string name="autotune_compare_profile">Profile vergleichen</string>
<string name="autotune_copy_localprofile_button">In lokales Profil kopieren</string>
<string name="autotune_update_input_profile_button">Eingabeprofil anpassen</string>
<string name="autotune_revert_input_profile_button">Eingabeprofil zurücksetzen</string>
<string name="autotune_copy_local_profile_message">Neues lokales Profil aus diesem Autotune Profil erstellen?</string>
<string name="autotune_update_local_profile_message">Anpassen %1$s Profile mit dem Autotune Profile?</string>
<string name="autotune_revert_local_profile_message">%1$s Profil mit Eingabeprofil zurücksetzen?</string>
<string name="autotune_profile_invalid">Profil ungültig</string>
<string name="autotune_run_without_autoswitch">Autotune ohne Profilwechsel ausgeführt</string>
<string name="autotune_run_with_autoswitch">Autotune ausgeführt und Profil automatisch gewechselt</string>
<string name="autotune_run_with_error">Fehler beim letzten Autotune Lauf</string>
<string name="autotune_run_cancelled">Ein weiterer Lauf von Autotune wurde erkannt, Lauf abgebrochen</string>
<string name="needconnectpermission">App benötigt Bluetooth-Berechtigung</string>
<plurals name="days">
<item quantity="one">%1$d Tag</item>

View file

@ -489,6 +489,7 @@
<string name="autotune_run_with_autoswitch">Autotune exécuté et le profil automatiquement activé</string>
<string name="autotune_run_with_error">Erreur lors de la dernière exécution d\'Autotune</string>
<string name="autotune_run_cancelled">Une autre exécution d\'Autotune est détectée, l\'exécution est annulée</string>
<string name="needconnectpermission">L\'application a besoin de l\'autorisation Bluetooth</string>
<plurals name="days">
<item quantity="one">%1$d jour</item>
<item quantity="other">%1$d jours</item>

View file

@ -248,6 +248,8 @@
<item name="crossTargetColor">@color/white</item>
<!---Spinner style from pump common-->
<item name="android:spinnerItemStyle">@style/CommonSpinnerItemStyle</item>
<!---Custom button -->
<item name="customBtnStyle">@style/GrayButton</item>
</style>

View file

@ -218,4 +218,6 @@
<!---Icons in Loop area -->
<attr name="profileColor" format="reference|color" />
<attr name="crossTargetColor" format="reference|color" />
<!---Custom button -->
<attr name="customBtnStyle" format="reference"/>
</resources>

View file

@ -249,6 +249,8 @@
<item name="crossTargetColor">@color/white</item>
<!---Spinner style from pump common-->
<item name="android:spinnerItemStyle">@style/CommonSpinnerItemStyle</item>
<!---Custom button -->
<item name="customBtnStyle">@style/GrayButton</item>
</style>
<style name="CommonSpinnerItemStyle" parent="Widget.AppCompat.TextView.SpinnerItem">

View file

@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="unsupported_action_in_pump">Handling understøttes ikke i pumpe. Brug kun AndroidAPS-brugerflade!</string>
</resources>

View file

@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="unsupported_action_in_pump">Nicht unterstützte Aktion in Insulinpumpe. Bitte nur AndroidAPS-UI benutzen!</string>
</resources>

View file

@ -152,4 +152,6 @@
<string name="diaconn_g8_errorcode_34">LGS inaktiv, Befehl zum Ausschalten zurückgewiesen.</string>
<string name="diaconn_g8_errorcode_35">TBR Start ist während einer laufenden TBR nicht möglich.</string>
<string name="diaconn_g8_errorcode_36">TBR kann nicht gestoppt werden, da keine TBR läuft.</string>
<string name="diaconn_g8_cloudsend_summary">Sende Pumpenprotokolle zur Diaconn Cloud.</string>
<string name="diaconn_g8_cloudsend_title">Diaconn Cloud-Sync</string>
</resources>

View file

@ -25,6 +25,7 @@ android {
dependencies {
implementation project(':core')
implementation project(':shared')
implementation project(':pump-common')
api "androidx.room:room-ktx:$room_version"
api "androidx.room:room-runtime:$room_version"

View file

@ -590,7 +590,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
EventOverviewBolusProgress.Treatment t = new EventOverviewBolusProgress.Treatment(0, 0, detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB, detailedBolusInfo.getId());
final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.INSTANCE;
bolusingEvent.setT(t);
bolusingEvent.setStatus(rh.gs(R.string.insight_delivered, 0d, insulin));
bolusingEvent.setStatus(rh.gs(R.string.bolus_delivered, 0d, insulin));
bolusingEvent.setPercent(0);
rxBus.send(bolusingEvent);
int trials = 0;
@ -629,14 +629,14 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
trials = -1;
int percentBefore = bolusingEvent.getPercent();
bolusingEvent.setPercent((int) (100D / activeBolus.getInitialAmount() * (activeBolus.getInitialAmount() - activeBolus.getRemainingAmount())));
bolusingEvent.setStatus(rh.gs(R.string.insight_delivered, activeBolus.getInitialAmount() - activeBolus.getRemainingAmount(), activeBolus.getInitialAmount()));
bolusingEvent.setStatus(rh.gs(R.string.bolus_delivered, activeBolus.getInitialAmount() - activeBolus.getRemainingAmount(), activeBolus.getInitialAmount()));
if (percentBefore != bolusingEvent.getPercent())
rxBus.send(bolusingEvent);
} else {
synchronized ($bolusLock) {
if (bolusCancelled || trials == -1 || trials++ >= 5) {
if (!bolusCancelled) {
bolusingEvent.setStatus(rh.gs(R.string.insight_delivered, insulin, insulin));
bolusingEvent.setStatus(rh.gs(R.string.bolus_delivered, insulin, insulin));
bolusingEvent.setPercent(100);
rxBus.send(bolusingEvent);
}

View file

@ -209,7 +209,7 @@ public class InsightConnectionService extends DaggerService implements Connectio
}
public synchronized boolean isPaired() {
return pairingDataStorage.isPaired();
return pairingDataStorage != null && pairingDataStorage.isPaired();
}
public synchronized <T extends AppLayerMessage> MessageRequest<T> requestMessage(T message) {
@ -264,10 +264,10 @@ public class InsightConnectionService extends DaggerService implements Connectio
super.onCreate();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
bluetoothAdapter = ((BluetoothManager) getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();
pairingDataStorage = new PairingDataStorage(this);
state = pairingDataStorage.isPaired() ? InsightState.DISCONNECTED : InsightState.NOT_PAIRED;
wakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:InsightConnectionService");
}
pairingDataStorage = new PairingDataStorage(this);
state = pairingDataStorage.isPaired() ? InsightState.DISCONNECTED : InsightState.NOT_PAIRED;
wakeLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:InsightConnectionService");
}
private void setState(InsightState state) {

View file

@ -7,6 +7,5 @@
android:gravity="center_vertical"
android:paddingStart="16dp"
android:paddingEnd="0dp"
android:textColor="#FFFFFF"
android:textSize="20sp"
tools:text="Test" />

View file

@ -34,7 +34,6 @@
android:gravity="start"
android:paddingStart="5dp"
android:paddingEnd="0dp"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Съвпадат ли кодовете, показани на това устройство и на Вашата помпа?</string>
<string name="insight_pairing">Insight свързване</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2fЕ / %2$.2fЕ доставени</string>
<string name="insight_alert_formatter">%1$s:%2$s</string>
<string name="tube_changed">Тръба сменена</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Souhlasí kódy zobrazené na tomto zařízení a na pumpě?</string>
<string name="insight_pairing">Insight párování</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">Podáno %1$.2f U / %2$.2f U</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Vyměněna hadičky</string>
<string name="insightpump_shortname">Insight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Stemmer de viste koder overens mellem dette apparat og din pumpe?</string>
<string name="insight_pairing">Insight parring</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f IE / %2$.2f IE leveret</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Slange skiftet</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Stimmen die Codes auf diesem Gerät und auf deiner Pumpe überein?</string>
<string name="insight_pairing">Insight Kopplung</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f IE / %2$.2f IE abgegeben</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Schlauch gewechselt</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">¿Coinciden los códigos mostrados en este dispositivo con los de la bomba?</string>
<string name="insight_pairing">Insight emparejada</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U entregado</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Tubo cambiado</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Les codes affichés sur cet appareil et sur la pompe sont-ils identiques ?</string>
<string name="insight_pairing">Appairage de Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U délivrés</string>
<string name="insight_alert_formatter">%1$s : %2$s</string>
<string name="tube_changed">Tubulure changée</string>
<string name="insightpump_shortname">AC-I</string>

View file

@ -7,7 +7,6 @@
<string name="tdd_total">TDD Lomlán</string>
<string name="eb_formatter">%1$.2f / %2$.2f A do %3$d nom</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f A / %2$.2f A seachadta</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="pump_stopped">Caidéil stopadh</string>
<string name="pump_started">Caidéil tosú</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">I codici mostrati su questo dispositivo e sul micro combaciano?</string>
<string name="insight_pairing">Associazione Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U erogato</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Catetere sostituito</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">האם הקודים המוצגים בהתקן זה ובמשאבה זהים?</string>
<string name="insight_pairing">צימוד Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f יח\' מתוך %2$.2f יח\' הוזרקו</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">הצינורית הוחלפה</string>
<string name="insightpump_shortname">Insight</string>

View file

@ -26,7 +26,6 @@
<string name="code_compare">이 장치에서 보여지는 코드와 펌프에서 보여지는 코드가 동일한가요?</string>
<string name="insight_pairing">Insight와 동기화</string>
<string name="insight_local">아큐-첵 Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U 주입됨</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">튜브 변경</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Ar kodas, kurį matote įrenginyje, sutampa su pompos kodu?</string>
<string name="insight_pairing">Insight sujungimas</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f vv iš %2$.2f vv suleista</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Kateteris pakeistas</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Worden dezelfde codes weergegeven op dit apparaat als op je pomp?</string>
<string name="insight_pairing">Insight koppelen</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f E / %2$.2f E toegediend</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Slang vervangen</string>
<string name="insightpump_shortname">Insight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Stemmer de viste kodene overens mellom denne enheten og din pumpe?</string>
<string name="insight_pairing">Sammenkobling av Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f E / %2$.2f E levert</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Slange byttet</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Czy kody wyświetlone na tym urządzeniu i na twojej pompie pasują?</string>
<string name="insight_pairing">Parowanie Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">podano %1$.2f U / %2$.2f U</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Dren zmieniony</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Os códigos exibidos neste dispositivo e na sua bomba correspondem?</string>
<string name="insight_pairing">Emparelhamento Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U administrado</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Tubo mudado</string>
<string name="insightpump_shortname">Visão</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Sunt identice codurile afișate aici și cele de pe pompă?</string>
<string name="insight_pairing">Asociere Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U din %2$.2f U livrate</string>
<string name="insight_alert_formatter">%1$s:%2$s</string>
<string name="tube_changed">Canulă schimbată</string>
<string name="insightpump_shortname">Obiectiv</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Коды на этом устройстве и на вашей помпе совпадают?</string>
<string name="insight_pairing">Сопряжение с Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">Подано %1$.2fед / %2$.2fед</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Трубка заменена</string>
<string name="insightpump_shortname">Поле обзора</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Zhodujú sa kódy zobrazené na tomto zariadení a na pumpe?</string>
<string name="insight_pairing">Párovanie Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f JI / %2$.2f JI podaných</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Hadička vymenená</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Stämmer koderna överens mellan denna enhet och din pump?</string>
<string name="insight_pairing">Parkoppling av Insight</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2fU / %2$.2fU levererat</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Slang bytt</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">Bu cihazda ve pompanızda görüntülenen kodlar uyuşuyor mu?</string>
<string name="insight_pairing">Insight eşleştirme</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f Ü / %2$.2f Ü gönderildi</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Hortum değişti</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -27,7 +27,6 @@
<string name="code_compare">此设备和您的泵上显示的代码是否匹配?</string>
<string name="insight_pairing">Insight 正在配对</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U 已输注</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">管路已经更换</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -28,7 +28,6 @@
<string name="code_compare">Do the codes displayed on this device and on your pump match?</string>
<string name="insight_pairing">Insight pairing</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U delivered</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
<string name="tube_changed">Tube changed</string>
<string name="insightpump_shortname">Sight</string>

View file

@ -358,7 +358,7 @@ class MedtronicHistoryData @Inject constructor(
aapsLogger.debug(LTag.PUMP, String.format(Locale.ENGLISH, "ProcessHistoryData: TBRs Processed [count=%d, items=%s]", tbrs.size, gson.toJson(tbrs)))
if (tbrs.isNotEmpty()) {
try {
processTBREntries(tbrs, rewindRecords)
processTBREntries(tbrs)
} catch (ex: Exception) {
aapsLogger.error(LTag.PUMP, "ProcessHistoryData: Error processing TBR entries: " + ex.message, ex)
throw ex
@ -583,7 +583,7 @@ class MedtronicHistoryData @Inject constructor(
}
}
private fun processTBREntries(entryList: MutableList<PumpHistoryEntry>, rewindList: MutableList<PumpHistoryEntry>) {
private fun processTBREntries(entryList: MutableList<PumpHistoryEntry>) {
entryList.reverse()
val tbr = entryList[0].getDecodedDataEntry("Object") as TempBasalPair
// var readOldItem = false
@ -607,7 +607,7 @@ class MedtronicHistoryData @Inject constructor(
val tbrRecords = pumpSyncStorage.getTBRs()
val processList: MutableList<TempBasalProcessDTO> = createTBRProcessList(entryList, rewindList)
val processList: MutableList<TempBasalProcessDTO> = createTBRProcessList(entryList)
if (processList.isNotEmpty()) {
for (tempBasalProcessDTO in processList) {
@ -731,7 +731,7 @@ class MedtronicHistoryData @Inject constructor(
}
fun createTBRProcessList(entryList: MutableList<PumpHistoryEntry>, rewindList: MutableList<PumpHistoryEntry>) : MutableList<TempBasalProcessDTO> {
fun createTBRProcessList(entryList: MutableList<PumpHistoryEntry>) : MutableList<TempBasalProcessDTO> {
aapsLogger.debug(LTag.PUMP, "${ProcessHistoryRecord.TBR.description} List (before filter): ${gson.toJson(entryList)}")
@ -797,24 +797,68 @@ class MedtronicHistoryData @Inject constructor(
}
}
// see if rewind items, need to fix any of current tempBasalProcessDTO items (bug 1724)
if (rewindList.isNotEmpty()) {
for (rewindEntry in rewindList) {
for (tempBasalProcessDTO in processList) {
if (tempBasalProcessDTO.itemTwo==null) {
val endTime: Long = DateTimeUtil.getATDWithAddedMinutes(tempBasalProcessDTO.itemOne.atechDateTime, tempBasalProcessDTO.itemOneTbr!!.durationMinutes)
// TODO this solution needs to be overworked, commenting out for now
// val suspendList = getFilteredItems(newHistory, //
// setOf(PumpHistoryEntryType.SuspendPump))
//
// val stopList : MutableList<PumpHistoryEntry> = mutableListOf()
// stopList.addAll(suspendList);
// stopList.addAll(rewindList);
//
// // TODO remove see if rewind items, need to fix any of current tempBasalProcessDTO items (bug 1724)
// if (rewindList.isNotEmpty()) {
// for (rewindEntry in rewindList) {
// for (tempBasalProcessDTO in processList) {
// if (tempBasalProcessDTO.itemTwo==null) {
// val endTime: Long = DateTimeUtil.getATDWithAddedMinutes(tempBasalProcessDTO.itemOne.atechDateTime, tempBasalProcessDTO.itemOneTbr!!.durationMinutes)
//
// if ((rewindEntry.atechDateTime > tempBasalProcessDTO.itemOne.atechDateTime) &&
// (rewindEntry.atechDateTime < endTime)) {
// tempBasalProcessDTO.itemTwo = rewindEntry
// continue
// }
// }
// }
// }
// }
//
// // see if have rewind/stop items that need to fix any of current tempBasalProcessDTO items (bug 1724)
// if (stopList.isNotEmpty()) {
// for (tempBasalProcessDTO in processList) {
// if (tempBasalProcessDTO.itemTwo==null) {
// val endTime: Long = DateTimeUtil.getATDWithAddedMinutes(tempBasalProcessDTO.itemOne.atechDateTime, tempBasalProcessDTO.itemOneTbr!!.durationMinutes)
//
// val findNearestEntry = findNearestEntry(tempBasalProcessDTO.itemOne.atechDateTime, endTime, stopList);
//
// if (findNearestEntry!=null) {
// tempBasalProcessDTO.itemTwo = findNearestEntry
// stopList.remove(findNearestEntry)
// }
// }
// }
// }
if ((rewindEntry.atechDateTime > tempBasalProcessDTO.itemOne.atechDateTime) &&
(rewindEntry.atechDateTime < endTime)) {
tempBasalProcessDTO.itemTwo = rewindEntry
continue
}
}
}
return processList
}
fun findNearestEntry(startTime: Long, endTime: Long, list: MutableList<PumpHistoryEntry>) : PumpHistoryEntry? {
val outList: MutableList<PumpHistoryEntry> = mutableListOf()
for (pumpHistoryEntry in list) {
if ((pumpHistoryEntry.atechDateTime > startTime) &&
(pumpHistoryEntry.atechDateTime < endTime)) {
outList.add(pumpHistoryEntry)
}
}
return processList
if (outList.size == 0) {
return null
} else if (outList.size==1) {
return outList[0]
} else {
// TODO
return null
}
}
fun isTBRActive(dbEntry: PumpDbEntryTBR): Boolean {

View file

@ -91,4 +91,6 @@
<string name="set_neutral_temps_summary">Wenn diese Option aktiviert ist, wird die TBR vor Ende jeder Stunde abgebrochen. Dies kann dazu beitragen, einige Pumpen davon abzuhalten, zur vollen Stunde zu vibrieren / zu piepsen.</string>
<string name="mdt_tbr_remaining">%1$.1f U/h (%2$d Minuten verbleibend)</string>
<string name="invalid_history_data">Ungültige Pumpenhistorie erkannt. Eröffne ein neues Ticket (issue) und füge Logs bei.</string>
<string name="riley_statistics">RL Statistik</string>
<string name="medtronic_history_type">Typ:</string>
</resources>

View file

@ -141,7 +141,7 @@ class MedtronicHistoryDataUTest : TestBase() {
println("PumpHistoryEntries: getRewindItems: $rewindRecords.size : " + gson.toJson(rewindRecords))
val processList: MutableList<TempBasalProcessDTO> = medtronicHistoryData.createTBRProcessList(tbrs, rewindRecords)
val processList: MutableList<TempBasalProcessDTO> = medtronicHistoryData.createTBRProcessList(tbrs)
println("PumpHistoryEntries: processList: " + processList.size)

View file

@ -55,7 +55,7 @@ class MedtronicHistoryDataUTest : TestBase() {
println("TBR Pre-Process List: " + gson.toJson(yourClassList))
val createTBRProcessList = unitToTest.createTBRProcessList(yourClassList, mutableListOf())
val createTBRProcessList = unitToTest.createTBRProcessList(yourClassList)
println("TBR Process List: " + createTBRProcessList.size)
@ -98,7 +98,7 @@ class MedtronicHistoryDataUTest : TestBase() {
println("TBR Pre-Process List (Special): " + gson.toJson(yourClassList))
val createTBRProcessList = unitToTest.createTBRProcessList(yourClassList, mutableListOf())
val createTBRProcessList = unitToTest.createTBRProcessList(yourClassList)
println("TBR Process List (Special): " + createTBRProcessList.size)

View file

@ -46,6 +46,7 @@ import info.nightscout.androidaps.queue.commands.CustomCommand
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter.to2Decimal
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.Round
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.TimeChangeType
import info.nightscout.androidaps.utils.rx.AapsSchedulers
@ -698,7 +699,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
}
val percent = (waited.toFloat() / estimatedDeliveryTimeSeconds) * 100
updateBolusProgressDialog(
rh.gs(R.string.dash_bolusdelivering, requestedBolusAmount),
rh.gs(R.string.bolus_delivered, Round.roundTo(percent*requestedBolusAmount/100, PodConstants.POD_PULSE_BOLUS_UNITS), requestedBolusAmount),
percent.toInt()
)
}
@ -729,7 +730,7 @@ class OmnipodDashPumpPlugin @Inject constructor(
val remainingUnits = podStateManager.lastBolus!!.bolusUnitsRemaining
val percent = ((requestedBolusAmount - remainingUnits) / requestedBolusAmount) * 100
updateBolusProgressDialog(
rh.gs(R.string.bolusdelivering, requestedBolusAmount),
rh.gs(R.string.bolus_delivered, Round.roundTo(requestedBolusAmount - remainingUnits, PodConstants.POD_PULSE_BOLUS_UNITS), requestedBolusAmount),
percent.toInt()
)

View file

@ -16,5 +16,4 @@
<!-- Exceptions -->
<string name="omnipod_common_history_tbr_value">Количество: %1$.2f U, Продължителност: %2$d мин</string>
<string name="omnipod_common_history_bolus_value">%1$.2fЕ</string>
<string name="dash_bolusdelivering">Доставяне %1$.2f U</string>
</resources>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Neznámý stav příkazu</string>
<string name="omnipod_common_history_tbr_value">Rychlost: %1$.2f U, doba trvání: %2$d minut</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Podávání %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">Výdej inzulínu je pozastaven</string>
<string name="omnipod_dash_connection_lost">Ztraceno připojení k podu</string>
<string name="omnipod_dash_bolus_already_in_progress">Vydává se další bolus</string>

View file

@ -34,7 +34,6 @@
<string name="omnipod_dash_unknown">Ukendt tilstand for kommandoen</string>
<string name="omnipod_common_history_tbr_value">Rate: %1$.2f IE, varighed: %2$d minutter</string>
<string name="omnipod_common_history_bolus_value">%1$.2f IE</string>
<string name="dash_bolusdelivering">Afgiver %1$.2f IE</string>
<string name="omnipod_common_alert_delivery_suspended">Insulintilførslen suspenderet</string>
<string name="omnipod_dash_connection_lost">Mistede forbindelse til pod</string>
<string name="omnipod_dash_bolus_already_in_progress">En anden bolus er ved at blive afgivet</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Unbekannter Status für den Befehl</string>
<string name="omnipod_common_history_tbr_value">Rate: %1$.2f IE, Dauer: %2$d min.</string>
<string name="omnipod_common_history_bolus_value">%1$.2f IE</string>
<string name="dash_bolusdelivering">Gebe %1$.2f IE ab</string>
<string name="omnipod_common_alert_delivery_suspended">Insulinabgabe ist unterbrochen</string>
<string name="omnipod_dash_connection_lost">Verbindung zum Pod verloren</string>
<string name="omnipod_dash_bolus_already_in_progress">Ein weiterer Bolus wird abgegeben</string>

View file

@ -34,7 +34,6 @@
<string name="omnipod_dash_unknown">Estado desconocido para el comando</string>
<string name="omnipod_common_history_tbr_value">Tasa: %1$.2f U, duración: %2$d minutos</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Entregando %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">Suspendida la entrega de insulina</string>
<string name="omnipod_dash_connection_lost">Conexión perdida con el pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Otro bolo está siendo entregado</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">État inconnu pour la commande</string>
<string name="omnipod_common_history_tbr_value">Débit : %1$.2f U, durée : %2$d minutes</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Injection de %1$.2fU en cours</string>
<string name="omnipod_common_alert_delivery_suspended">Injection d\'insuline suspendue</string>
<string name="omnipod_dash_connection_lost">Connexion perdue avec le pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Un autre bolus est en cours d\'injection</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Stato sconosciuto per il comando</string>
<string name="omnipod_common_history_tbr_value">Tasso: %1$.2f U, durata: %2$d minuti</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Erogazione di %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">L\'erogazione di insulina è sospesa</string>
<string name="omnipod_dash_connection_lost">Persa connessione al pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Altro bolo in erogazione</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">מצב הפקודה לא ידוע</string>
<string name="omnipod_common_history_tbr_value">מינון: %1$.2f יח\', משך: %2$d דק\'</string>
<string name="omnipod_common_history_bolus_value">%1$.2f יח\'</string>
<string name="dash_bolusdelivering">מזריק %1$.2f יח\'</string>
<string name="omnipod_common_alert_delivery_suspended">הזרקת האינסולין מופסקת</string>
<string name="omnipod_dash_connection_lost">אבד החיבור לפוד</string>
<string name="omnipod_dash_bolus_already_in_progress">בולוס אחר מוזרק כרגע</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Nežinoma komandos būklė</string>
<string name="omnipod_common_history_tbr_value">Kiekis: %1$.2f vv, trukmė: %2$d min</string>
<string name="omnipod_common_history_bolus_value">%1$.2f vv</string>
<string name="dash_bolusdelivering">Leidžiama %1$.2f vv</string>
<string name="omnipod_common_alert_delivery_suspended">Insulino leidimas sustabdytas</string>
<string name="omnipod_dash_connection_lost">Ryšys su Pod prarastas</string>
<string name="omnipod_dash_bolus_already_in_progress">Kitas bolusas yra jau leidžiamas</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Onbekende status voor de opdracht</string>
<string name="omnipod_common_history_tbr_value">Basaal: %1$.2f E, Duur: %2$d min</string>
<string name="omnipod_common_history_bolus_value">%1$.2f E</string>
<string name="dash_bolusdelivering">%1$.2f eh worden toegediend</string>
<string name="omnipod_common_alert_delivery_suspended">Insuline levering is opgeschort</string>
<string name="omnipod_dash_connection_lost">Verbinding met pod verbroken</string>
<string name="omnipod_dash_bolus_already_in_progress">Een andere bolus wordt op dit moment toegediend</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Ukjent tilstand for kommandoen</string>
<string name="omnipod_common_history_tbr_value">Dosering: %1$.2f E, varighet: %2$d min</string>
<string name="omnipod_common_history_bolus_value">%1$.2f E</string>
<string name="dash_bolusdelivering">Leverer %1$.2f E</string>
<string name="omnipod_common_alert_delivery_suspended">Insulintilførsel er suspendert</string>
<string name="omnipod_dash_connection_lost">Mistet tilkoblingen til pod</string>
<string name="omnipod_dash_bolus_already_in_progress">En annen bolusdose blir levert</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Nieznany stan polecenia</string>
<string name="omnipod_common_history_tbr_value">Dawka: %1$.2f U, Czas trwania: %2$d min</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Dostarczanie %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">Podawanie insuliny zawieszone</string>
<string name="omnipod_dash_connection_lost">Utracono połączenie z Podem</string>
<string name="omnipod_dash_bolus_already_in_progress">Inny bolus jest dostarczany</string>

View file

@ -34,7 +34,6 @@
<string name="omnipod_dash_unknown">Estado desconhecido para o comando</string>
<string name="omnipod_common_history_tbr_value">Rácio: %1$.2f U, duração: %2$d minutes</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">A administrar %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">A entrega de insulina está suspensa</string>
<string name="omnipod_dash_connection_lost">Perda de ligação ao pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Outro bólus está a ser administrado</string>

View file

@ -34,7 +34,6 @@
<string name="omnipod_dash_unknown">Stare necunoscută pentru comandă</string>
<string name="omnipod_common_history_tbr_value">Rata: %1$.2f U, durata: %2$d minute</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Se livrează %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">Administrarea insulinei este suspendată</string>
<string name="omnipod_dash_connection_lost">S-a pierdut conexiunea la pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Un alt bolus este în curs de livrare</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Состояние команды неясно</string>
<string name="omnipod_common_history_tbr_value">Баз Скорость: %1$.2f ед, Продолжительность: %2$d мин</string>
<string name="omnipod_common_history_bolus_value">%1$.2f ед</string>
<string name="dash_bolusdelivering">Подается болюс %1$.2f ед</string>
<string name="omnipod_common_alert_delivery_suspended">Введение инсулина приостановлено</string>
<string name="omnipod_dash_connection_lost">Потеряно соединение с подом</string>
<string name="omnipod_dash_bolus_already_in_progress">Вводится еще один болюс</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Neznámy stav príkazu</string>
<string name="omnipod_common_history_tbr_value">Rýchlosť: %1$.2f JI, Doba trvania: %2$d minút</string>
<string name="omnipod_common_history_bolus_value">%1$.2f JI</string>
<string name="dash_bolusdelivering">Podávanie %1$.2f JI</string>
<string name="omnipod_common_alert_delivery_suspended">Podávanie inzulínu je pozastavené</string>
<string name="omnipod_dash_connection_lost">Stratilo sa spojenie s Podom</string>
<string name="omnipod_dash_bolus_already_in_progress">Už sa podáva iný bolus</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Okänt tillstånd för kommandot</string>
<string name="omnipod_common_history_tbr_value">Dos: %1$.2f U, Duration: %2$d min</string>
<string name="omnipod_common_history_bolus_value">%1$.2fU</string>
<string name="dash_bolusdelivering">Levererar %1$.2f enheter</string>
<string name="omnipod_common_alert_delivery_suspended">Insulinleverans är pausad</string>
<string name="omnipod_dash_connection_lost">Tappade anslutningen till pod</string>
<string name="omnipod_dash_bolus_already_in_progress">En annan bolus håller på att levereras</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">Bilinmeyen komut durumu</string>
<string name="omnipod_common_history_tbr_value">Oran: %1$.2f Ü, süre: %2$d dakika</string>
<string name="omnipod_common_history_bolus_value">%1$.2f Ü</string>
<string name="dash_bolusdelivering">%1$.2f Ü gönderiliyor</string>
<string name="omnipod_common_alert_delivery_suspended">İnsülin iletimi askıya alındı</string>
<string name="omnipod_dash_connection_lost">Pod ile bağlantı koptu</string>
<string name="omnipod_dash_bolus_already_in_progress">Diğer bolus iletiliyor</string>

View file

@ -33,7 +33,6 @@
<string name="omnipod_dash_unknown">命令的未知状态</string>
<string name="omnipod_common_history_tbr_value">速率: %1$.2f U持续时间 %2$d 分钟</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">正在输注 %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">胰岛素输注已暂停</string>
<string name="omnipod_dash_connection_lost">最后一次连接pod</string>
<string name="omnipod_dash_bolus_already_in_progress">另一个大剂量正在输注</string>

View file

@ -46,7 +46,6 @@
<string name="omnipod_dash_unknown">Unknown state for the command</string>
<string name="omnipod_common_history_tbr_value">Rate: %1$.2f U, duration: %2$d minutes</string>
<string name="omnipod_common_history_bolus_value">%1$.2f U</string>
<string name="dash_bolusdelivering">Delivering %1$.2f U</string>
<string name="omnipod_common_alert_delivery_suspended">Insulin delivery is suspended</string>
<string name="omnipod_dash_connection_lost">Lost connection to pod</string>
<string name="omnipod_dash_bolus_already_in_progress">Another bolus is being delivered</string>

View file

@ -291,6 +291,15 @@ public class AapsOmnipodErosManager {
return new PumpEnactResult(injector).success(false).enacted(false).comment(note);
}
// #1963 return synthetic success if pre-activation
// to allow profile switch prior to pod activation
// otherwise a catch-22
if (!podStateManager.getActivationProgress().isCompleted()) {
// TODO: i18n string
return new PumpEnactResult(injector).success(true).enacted(false).comment("pre" +
"-activation basal change moot");
}
PodHistoryEntryType historyEntryType = podStateManager.isSuspended() ? PodHistoryEntryType.RESUME_DELIVERY : PodHistoryEntryType.SET_BASAL_SCHEDULE;
try {
@ -370,7 +379,7 @@ public class AapsOmnipodErosManager {
bolusCommandResult = executeCommand(() -> delegate.bolus(PumpType.OMNIPOD_EROS.determineCorrectBolusSize(detailedBolusInfo.insulin), beepsEnabled, beepsEnabled, detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB ? null :
(estimatedUnitsDelivered, percentage) -> {
EventOverviewBolusProgress progressUpdateEvent = EventOverviewBolusProgress.INSTANCE;
progressUpdateEvent.setStatus(getStringResource(R.string.goingtodeliver, detailedBolusInfo.insulin));
progressUpdateEvent.setStatus(getStringResource(R.string.bolus_delivered, estimatedUnitsDelivered, detailedBolusInfo.insulin));
progressUpdateEvent.setPercent(percentage);
sendEvent(progressUpdateEvent);
}));

View file

@ -16,6 +16,42 @@
<string name="you_have_been_signed_out_of_open_humans">Du er blevet logget ud af Open Humans</string>
<string name="click_here_to_sign_in_again_if_this_wasnt_on_purpose">Klik her for at logge ind igen, hvis dette ikke var meningen.</string>
<string name="upload_now">Upload nu</string>
<string name="next">Næste</string>
<string name="welcome_to_open_humans">Velkommen til Open Humans</string>
<string name="setup_data_upload">Klik på \'Næste\' for at opsætte dataoverførsel.</string>
<string name="consent">Samtykke</string>
<string name="terms_of_use">Vilkår for anvendelse</string>
<string name="please_read__information">Læs venligst følgende oplysninger grundigt og accepter vilkårene for brug for at fortsætte.</string>
<string name="info_openhumans">Dette er et open source værktøj, der vil kopiere dine data til Open Humans. Vi har ingen rettigheder til at dele dine data med tredjeparter uden din udtrykkelige tilladelse. De data, som projektet og appen modtager, identificeres via et tilfældigt bruger-ID og vil kun blive overført sikkert til en Open Humans konto med din godkendelse af denne proces. Du kan til enhver tid stoppe med at uploade og slette dine uploaddata via www.openhumans.org.</string>
<string name="data_uploaded">Data Uploadet</string>
<string name="glucose_values">Glukose værdier</string>
<string name="boluses">Bolusser</string>
<string name="extended_boluses">Forlænget bolus</string>
<string name="carbohydrates">Kulhydrater</string>
<string name="careportal_events">Careportal Begivenheder (undtagen noter)</string>
<string name="profile_switches">Profilskift</string>
<string name="total_daily_doses">Samlede Daglige Doser</string>
<string name="temporary_basal_rates">Midlertidige basal rater</string>
<string name="temporary_targets">Midlertidige Mål</string>
<string name="settings">Indstillinger</string>
<string name="application_version">Programversion</string>
<string name="device_model">Enhedsmodel</string>
<string name="screen_dimensions">Skærm Dimensioner</string>
<string name="algorithm_debug_data">Algoritme Fejlretningsdata</string>
<string name="data_not_uploaded">Data IKKE uploadet</string>
<string name="passwords">Kodeord</string>
<string name="nightscout_url">Nightscout URL</string>
<string name="nightscout_api_secret">Nightscout API Secret</string>
<string name="free_text_fields">Fritekstfelt</string>
<string name="agree">Jeg forstår og er enig.</string>
<string name="login_open_humans">Login på Open Humans</string>
<string name="final_touches">Afsluttende detaljer</string>
<string name="uploading_proceed">Du er kun et skridt væk fra at uploade dine data til Open Humans. Vil du fortsætte?</string>
<string name="cancel">Annuller</string>
<string name="proceed">Fortsæt</string>
<string name="finishing">Afslutter...</string>
<string name="this_may_take_a_few_seconds">Dette kan tage nogle sekunder.</string>
<string name="we_re_done">Vi er færdige!</string>
<string name="silently_upload_date_note">Fra nu af vil telefonen lydløst uploade data i baggrunden fra tid til anden.</string>
<string name="close">Luk</string>
</resources>

View file

@ -16,7 +16,42 @@
<string name="you_have_been_signed_out_of_open_humans">Du wurdest von Open Humans abgemeldet.</string>
<string name="click_here_to_sign_in_again_if_this_wasnt_on_purpose">Klicke hier, um Dich erneut anzumelden, falls dies versehentlich passiert ist.</string>
<string name="upload_now">Jetzt hochladen</string>
<string name="next">Weiter</string>
<string name="welcome_to_open_humans">Willkommen bei Open Humans</string>
<string name="setup_data_upload">Klicken Sie auf \'Weiter\', um das Hochladen der Daten einzurichten.</string>
<string name="consent">Einwilligen</string>
<string name="terms_of_use">Nutzungsbedingungen</string>
<string name="please_read__information">Bitte lesen Sie die folgenden Informationen sorgfältig und akzeptieren Sie die Nutzungsbedingungen, um fortzufahren.</string>
<string name="info_openhumans">Dies ist ein Open-Source-Tool, das Deine Daten zu Open Humans hochlädt. Wir behalten uns keine Rechte vor, Deine Daten ohne Deine ausdrückliche Genehmigung an Dritte weiterzugeben. Die Daten, die das Projekt und die Anwendung erhalten, werden über eine zufällige Benutzer-ID identifiziert und nur nach Deiner Zustimmung sicher auf ein Open Humans-Konto übertragen. Du kannst jederzeit das Hochladen beenden und Deine hochgeladenen Daten über www.openhumans.org löschen.</string>
<string name="data_uploaded">Daten hochgeladen</string>
<string name="glucose_values">Glukosewerte</string>
<string name="boluses">Boli</string>
<string name="extended_boluses">Verzögerte Boli</string>
<string name="carbohydrates">Kohlenhydrate</string>
<string name="careportal_events">Careportal-Ereignisse (mit Ausnahme von Notizen)</string>
<string name="profile_switches">Profilwechsel</string>
<string name="total_daily_doses">Tägliche Gesamtdosis (TDD)</string>
<string name="temporary_basal_rates">Temporäre Basalraten</string>
<string name="temporary_targets">Temporäre Ziele</string>
<string name="settings">Einstellungen</string>
<string name="application_version">Programmversion</string>
<string name="device_model">Gerätemodell</string>
<string name="screen_dimensions">Bildschirmgröße</string>
<string name="algorithm_debug_data">Algorithmus-Debug-Daten</string>
<string name="data_not_uploaded">Daten NICHT hochgeladen</string>
<string name="passwords">Passwörter</string>
<string name="nightscout_url">Nightscout-URL</string>
<string name="nightscout_api_secret">Nightscout API Secret</string>
<string name="free_text_fields">Freitextfelder</string>
<string name="agree">Verstanden und akzeptiert. </string>
<string name="login_open_humans">Login Open Humans</string>
<string name="final_touches">letzter Schliff</string>
<string name="uploading_proceed">Sie sind nur einen Schritt vom Hochladen Ihrer Daten zu Open Humans entfernt. Möchten Sie fortfahren?</string>
<string name="cancel">Abbrechen</string>
<string name="proceed">Fortfahren</string>
<string name="finishing">Beende...</string>
<string name="this_may_take_a_few_seconds">Dies kann einige Sekunden dauern.</string>
<string name="we_re_done">Wir sind fertig!</string>
<string name="silently_upload_date_note">Von nun an wird Ihr Telefon von Zeit zu Zeit stillschweigend Daten im Hintergrund hochladen.</string>
<string name="close">Schließen</string>
</resources>

Some files were not shown because too many files have changed in this diff Show more