diff --git a/README.md b/README.md
index b76376b3d2..f762852a96 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# AndroidAPS
-* Check the wiki: http://wiki.androidaps.org
+* Check the wiki: https://androidaps.readthedocs.io
* Everyone who’s been looping with AndroidAPS needs to fill out the form after 3 days of looping https://docs.google.com/forms/d/14KcMjlINPMJHVt28MDRupa4sz4DDIooI4SrW0P3HSN8/viewform?c=0&w=1
[![Gitter](https://badges.gitter.im/MilosKozak/AndroidAPS.svg)](https://gitter.im/MilosKozak/AndroidAPS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
@@ -11,6 +11,4 @@
dev: [![codecov](https://codecov.io/gh/MilosKozak/AndroidAPS/branch/dev/graph/badge.svg)](https://codecov.io/gh/MilosKozak/AndroidAPS)
-[![Donate via PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y4LHGJJESAVB8)
-
![BTC](https://bitit.io/assets/coins/icon-btc-1e5a37bc0eb730ac83130d7aa859052bd4b53ac3f86f99966627801f7b0410be.svg) 3KawK8aQe48478s6fxJ8Ms6VTWkwjgr9f2
diff --git a/app/build.gradle b/app/build.gradle
index 7a4b63ecff..fcb0b3b6c7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -259,6 +259,7 @@ dependencies {
implementation 'androidx.percentlayout:percentlayout:1.0.0'
implementation "androidx.preference:preference-ktx:1.1.1"
implementation "androidx.activity:activity-ktx:${activityVersion}"
+ implementation "androidx.fragment:fragment:${fragmentVersion}"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.1.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ea16c395da..8f3db8e179 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -68,7 +68,8 @@
-
+
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/ProfileHelperActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/ProfileHelperActivity.kt
index 786b30f959..749913c9a1 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/ProfileHelperActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/ProfileHelperActivity.kt
@@ -1,13 +1,29 @@
package info.nightscout.androidaps.activities
+import android.content.res.ColorStateList
import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.Menu
+import android.widget.PopupMenu
import info.nightscout.androidaps.R
+import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.data.defaultProfile.DefaultProfile
+import info.nightscout.androidaps.data.defaultProfile.DefaultProfileDPV
+import info.nightscout.androidaps.db.ProfileSwitch
import info.nightscout.androidaps.dialogs.ProfileViewerDialog
+import info.nightscout.androidaps.interfaces.ActivePluginProvider
+import info.nightscout.androidaps.interfaces.DatabaseHelperInterface
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.AAPSLogger
+import info.nightscout.androidaps.plugins.bus.RxBusWrapper
+import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
+import info.nightscout.androidaps.plugins.profile.local.events.EventLocalProfileChanged
import info.nightscout.androidaps.utils.DateUtil
+import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.ToastUtils
+import info.nightscout.androidaps.utils.alertDialogs.OKDialog
+import info.nightscout.androidaps.utils.extensions.toVisibility
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.stats.TddCalculator
import kotlinx.android.synthetic.main.activity_profilehelper.*
@@ -20,47 +36,253 @@ class ProfileHelperActivity : NoSplashAppCompatActivity() {
@Inject lateinit var tddCalculator: TddCalculator
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var defaultProfile: DefaultProfile
+ @Inject lateinit var defaultProfileDPV: DefaultProfileDPV
+ @Inject lateinit var localProfilePlugin: LocalProfilePlugin
+ @Inject lateinit var rxBus: RxBusWrapper
+ @Inject lateinit var dateUtil: DateUtil
+ @Inject lateinit var activePlugin: ActivePluginProvider
+ @Inject lateinit var databaseHelper: DatabaseHelperInterface
+
+ enum class ProfileType {
+ MOTOL_DEFAULT,
+ DPV_DEFAULT,
+ CURRENT,
+ AVAILABLE_PROFILE,
+ PROFILE_SWITCH
+ }
+
+ private var tabSelected = 0
+ private val typeSelected = arrayOf(ProfileType.MOTOL_DEFAULT, ProfileType.CURRENT)
+
+ private val ageUsed = arrayOf(15.0, 15.0)
+ private val weightUsed = arrayOf(0.0, 0.0)
+ private val tddUsed = arrayOf(0.0, 0.0)
+ private val pctUsed = arrayOf(32.0, 32.0)
+
+ private lateinit var profileList: ArrayList
+ private val profileUsed = arrayOf(0, 0)
+
+ private lateinit var profileSwitch: List
+ private val profileSwitchUsed = arrayOf(0, 0)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profilehelper)
- profilehelper_age.setParams(15.0, 1.0, 80.0, 1.0, DecimalFormat("0"), false, null)
- profilehelper_weight.setParams(50.0, 5.0, 150.0, 1.0, DecimalFormat("0"), false, null)
- profilehelper_tdd.setParams(50.0, 3.0, 200.0, 1.0, DecimalFormat("0"), false, null)
+ profilehelper_menu1.setOnClickListener {
+ switchTab(0, typeSelected[0])
+ }
+ profilehelper_menu2.setOnClickListener {
+ switchTab(1, typeSelected[1])
+ }
- profilehelper_tdds.text = tddCalculator.stats()
-
- profilehelper_profile.setOnClickListener {
- val age = profilehelper_age.value
- val weight = profilehelper_weight.value
- val tdd = profilehelper_tdd.value
- if (age < 1 || age > 120) {
- ToastUtils.showToastInUiThread(this, R.string.invalidage)
- return@setOnClickListener
- }
- if ((weight < 5 || weight > 150) && tdd == 0.0) {
- ToastUtils.showToastInUiThread(this, R.string.invalidweight)
- return@setOnClickListener
- }
- if ((tdd < 5 || tdd > 150) && weight == 0.0) {
- ToastUtils.showToastInUiThread(this, R.string.invalidweight)
- return@setOnClickListener
- }
- profileFunction.getProfile()?.let { runningProfile ->
- val profile = defaultProfile.profile(age, tdd, weight, profileFunction.getUnits())
- ProfileViewerDialog().also { pvd ->
- pvd.arguments = Bundle().also {
- it.putLong("time", DateUtil.now())
- it.putInt("mode", ProfileViewerDialog.Mode.PROFILE_COMPARE.ordinal)
- it.putString("customProfile", runningProfile.data.toString())
- it.putString("customProfile2", profile.data.toString())
- it.putString("customProfileUnits", profile.units)
- it.putString("customProfileName", "Age: $age TDD: $tdd Weight: $weight")
+ profilehelper_profiletype.setOnClickListener {
+ PopupMenu(this, profilehelper_profiletype).apply {
+ menuInflater.inflate(R.menu.menu_profilehelper, menu)
+ setOnMenuItemClickListener { item ->
+ profilehelper_profiletype.setText(item.title)
+ when (item.itemId) {
+ R.id.menu_default -> switchTab(tabSelected, ProfileType.MOTOL_DEFAULT)
+ R.id.menu_default_dpv -> switchTab(tabSelected, ProfileType.DPV_DEFAULT)
+ R.id.menu_current -> switchTab(tabSelected, ProfileType.CURRENT)
+ R.id.menu_available -> switchTab(tabSelected, ProfileType.AVAILABLE_PROFILE)
+ R.id.menu_profileswitch -> switchTab(tabSelected, ProfileType.PROFILE_SWITCH)
}
- }.show(supportFragmentManager, "ProfileViewDialog")
+ true
+ }
+ show()
}
}
+ // Active profile
+ profileList = activePlugin.activeProfileInterface.profile?.getProfileList() ?: ArrayList()
+
+ profilehelper_available_profile_list.setOnClickListener {
+ PopupMenu(this, profilehelper_available_profile_list).apply {
+ var order = 0
+ for (name in profileList) menu.add(Menu.NONE, order, order++, name)
+ setOnMenuItemClickListener { item ->
+ profilehelper_available_profile_list.setText(item.title)
+ profileUsed[tabSelected] = item.itemId
+ true
+ }
+ show()
+ }
+ }
+
+ // Profile switch
+ profileSwitch = databaseHelper.getProfileSwitchData(dateUtil._now() - T.months(2).msecs(), true)
+
+ profilehelper_profileswitch_list.setOnClickListener {
+ PopupMenu(this, profilehelper_profileswitch_list).apply {
+ var order = 0
+ for (name in profileSwitch) menu.add(Menu.NONE, order, order++, name.customizedName)
+ setOnMenuItemClickListener { item ->
+ profilehelper_profileswitch_list.setText(item.title)
+ profileSwitchUsed[tabSelected] = item.itemId
+ true
+ }
+ show()
+ }
+ }
+
+ // Default profile
+ profilehelper_copytolocalprofile.setOnClickListener {
+ val age = ageUsed[tabSelected]
+ val weight = weightUsed[tabSelected]
+ val tdd = tddUsed[tabSelected]
+ val pct = pctUsed[tabSelected]
+ val profile = if (typeSelected[tabSelected] == ProfileType.MOTOL_DEFAULT) defaultProfile.profile(age, tdd, weight, profileFunction.getUnits())
+ else defaultProfileDPV.profile(age, tdd, pct / 100.0, profileFunction.getUnits())
+ profile?.let {
+ OKDialog.showConfirmation(this, resourceHelper.gs(R.string.careportal_profileswitch), resourceHelper.gs(R.string.copytolocalprofile), Runnable {
+ localProfilePlugin.addProfile(LocalProfilePlugin.SingleProfile().copyFrom(localProfilePlugin.rawProfile, it, "DefaultProfile" + dateUtil.dateAndTimeAndSecondsString(dateUtil._now())))
+ rxBus.send(EventLocalProfileChanged())
+ })
+ }
+ }
+
+ profilehelper_age.setParams(0.0, 1.0, 18.0, 1.0, DecimalFormat("0"), false, null)
+ profilehelper_weight.setParams(0.0, 0.0, 150.0, 1.0, DecimalFormat("0"), false, null, object : TextWatcher {
+ override fun afterTextChanged(s: Editable) {}
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
+ profilehelper_tdd_row.visibility = (profilehelper_weight.value == 0.0).toVisibility()
+ }
+ })
+ profilehelper_tdd.setParams(0.0, 0.0, 200.0, 1.0, DecimalFormat("0"), false, null, object : TextWatcher {
+ override fun afterTextChanged(s: Editable) {}
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
+ profilehelper_weight_row.visibility = (profilehelper_tdd.value == 0.0).toVisibility()
+ }
+ })
+
+ profilehelper_basalpctfromtdd.setParams(32.0, 32.0, 37.0, 1.0, DecimalFormat("0"), false, null)
+
+ profilehelper_tdds.text = tddCalculator.stats()
+
+ // Current profile
+ profilehelper_current_profile_text.text = profileFunction.getProfileName()
+
+ // General
+ profilehelper_compareprofile.setOnClickListener {
+ storeValues()
+ for (i in 0..1) {
+ if (typeSelected[i] == ProfileType.MOTOL_DEFAULT) {
+ if (ageUsed[i] < 1 || ageUsed[i] > 18) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidage)
+ return@setOnClickListener
+ }
+ if ((weightUsed[i] < 5 || weightUsed[i] > 150) && tddUsed[i] == 0.0) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidweight)
+ return@setOnClickListener
+ }
+ if ((tddUsed[i] < 5 || tddUsed[i] > 150) && weightUsed[i] == 0.0) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidweight)
+ return@setOnClickListener
+ }
+ }
+ if (typeSelected[i] == ProfileType.DPV_DEFAULT) {
+ if (ageUsed[i] < 1 || ageUsed[i] > 18) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidage)
+ return@setOnClickListener
+ }
+ if (tddUsed[i] < 5 || tddUsed[i] > 150) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidweight)
+ return@setOnClickListener
+ }
+ if ((pctUsed[i] < 32 || pctUsed[i] > 37)) {
+ ToastUtils.showToastInUiThread(this, R.string.invalidpct)
+ return@setOnClickListener
+ }
+ }
+ }
+
+ getProfile(ageUsed[0], tddUsed[0], weightUsed[0], pctUsed[0] / 100.0, 0)?.let { profile0 ->
+ getProfile(ageUsed[1], tddUsed[1], weightUsed[1], pctUsed[1] / 100.0, 1)?.let { profile1 ->
+ ProfileViewerDialog().also { pvd ->
+ pvd.arguments = Bundle().also {
+ it.putLong("time", DateUtil.now())
+ it.putInt("mode", ProfileViewerDialog.Mode.PROFILE_COMPARE.ordinal)
+ it.putString("customProfile", profile0.data.toString())
+ it.putString("customProfile2", profile1.data.toString())
+ it.putString("customProfileUnits", profileFunction.getUnits())
+ it.putString("customProfileName", getProfileName(ageUsed[0], tddUsed[0], weightUsed[0], pctUsed[0] / 100.0, 0) + "\n" + getProfileName(ageUsed[1], tddUsed[1], weightUsed[1], pctUsed[1] / 100.0, 1))
+ }
+ }.show(supportFragmentManager, "ProfileViewDialog")
+ return@setOnClickListener
+ }
+ }
+ ToastUtils.showToastInUiThread(this, R.string.invalidinput)
+ }
+
+ switchTab(0, typeSelected[0], false)
+ }
+
+ private fun getProfile(age: Double, tdd: Double, weight: Double, basalPct: Double, tab: Int): Profile? =
+ when (typeSelected[tab]) {
+ ProfileType.MOTOL_DEFAULT -> defaultProfile.profile(age, tdd, weight, profileFunction.getUnits())
+ ProfileType.DPV_DEFAULT -> defaultProfileDPV.profile(age, tdd, basalPct, profileFunction.getUnits())
+ ProfileType.CURRENT -> profileFunction.getProfile()?.convertToNonCustomizedProfile()
+ ProfileType.AVAILABLE_PROFILE -> activePlugin.activeProfileInterface.profile?.getSpecificProfile(profileList[profileUsed[tab]].toString())
+ ProfileType.PROFILE_SWITCH -> profileSwitch[profileSwitchUsed[tab]].profileObject?.convertToNonCustomizedProfile()
+ }
+
+ private fun getProfileName(age: Double, tdd: Double, weight: Double, basalSumPct: Double, tab: Int): String =
+ when (typeSelected[tab]) {
+ ProfileType.MOTOL_DEFAULT -> if (tdd > 0) resourceHelper.gs(R.string.formatwithtdd, age, tdd) else resourceHelper.gs(R.string.formatwithweight, age, weight)
+ ProfileType.DPV_DEFAULT -> resourceHelper.gs(R.string.formatwittddandpct, age, tdd, (basalSumPct * 100).toInt())
+ ProfileType.CURRENT -> profileFunction.getProfileName()
+ ProfileType.AVAILABLE_PROFILE -> profileList[profileUsed[tab]].toString()
+ ProfileType.PROFILE_SWITCH -> profileSwitch[profileSwitchUsed[tab]].customizedName
+ }
+
+ private fun storeValues() {
+ ageUsed[tabSelected] = profilehelper_age.value
+ weightUsed[tabSelected] = profilehelper_weight.value
+ tddUsed[tabSelected] = profilehelper_tdd.value
+ pctUsed[tabSelected] = profilehelper_basalpctfromtdd.value
+ }
+
+ private fun switchTab(tab: Int, newContent: ProfileType, storeOld: Boolean = true) {
+ setBackgroundColorOnSelected(tab)
+ // Store values for selected tab. listBox values are stored on selection change
+ if (storeOld) storeValues()
+
+ tabSelected = tab
+ typeSelected[tabSelected] = newContent
+ profilehelper_profiletype_title.setDefaultHintTextColor(ColorStateList.valueOf(resourceHelper.gc(if (tab == 0) R.color.tabBgColorSelected else R.color.examinedProfile)))
+
+ // show new content
+ profilehelper_profiletype.setText(
+ when (typeSelected[tabSelected]) {
+ ProfileType.MOTOL_DEFAULT -> resourceHelper.gs(R.string.motoldefaultprofile)
+ ProfileType.DPV_DEFAULT -> resourceHelper.gs(R.string.dpvdefaultprofile)
+ ProfileType.CURRENT -> resourceHelper.gs(R.string.currentprofile)
+ ProfileType.AVAILABLE_PROFILE -> resourceHelper.gs(R.string.availableprofile)
+ ProfileType.PROFILE_SWITCH -> resourceHelper.gs(R.string.careportal_profileswitch)
+ })
+ profilehelper_default_profile.visibility = (newContent == ProfileType.MOTOL_DEFAULT || newContent == ProfileType.DPV_DEFAULT).toVisibility()
+ profilehelper_current_profile.visibility = (newContent == ProfileType.CURRENT).toVisibility()
+ profilehelper_available_profile.visibility = (newContent == ProfileType.AVAILABLE_PROFILE).toVisibility()
+ profilehelper_profile_switch.visibility = (newContent == ProfileType.PROFILE_SWITCH).toVisibility()
+
+ // restore selected values
+ profilehelper_age.value = ageUsed[tabSelected]
+ profilehelper_weight.value = weightUsed[tabSelected]
+ profilehelper_tdd.value = tddUsed[tabSelected]
+ profilehelper_basalpctfromtdd.value = pctUsed[tabSelected]
+
+ profilehelper_basalpctfromtdd_row.visibility = (newContent == ProfileType.DPV_DEFAULT).toVisibility()
+ if (profileList.isNotEmpty())
+ profilehelper_available_profile_list.setText(profileList[profileUsed[tabSelected]].toString())
+ if (profileSwitch.isNotEmpty())
+ profilehelper_profileswitch_list.setText(profileSwitch[profileSwitchUsed[tabSelected]].customizedName)
+ }
+
+ private fun setBackgroundColorOnSelected(tab: Int) {
+ profilehelper_menu1.setBackgroundColor(resourceHelper.gc(if (tab == 1) R.color.defaultbackground else R.color.tabBgColorSelected))
+ profilehelper_menu2.setBackgroundColor(resourceHelper.gc(if (tab == 0) R.color.defaultbackground else R.color.examinedProfile))
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/SurveyActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/SurveyActivity.kt
index 2ca326d4a3..1d03ddb344 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/SurveyActivity.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/SurveyActivity.kt
@@ -63,17 +63,18 @@ class SurveyActivity : NoSplashAppCompatActivity() {
return@setOnClickListener
}
profileFunction.getProfile()?.let { runningProfile ->
- val profile = defaultProfile.profile(age, tdd, weight, profileFunction.getUnits())
- ProfileViewerDialog().also { pvd ->
- pvd.arguments = Bundle().also {
- it.putLong("time", DateUtil.now())
- it.putInt("mode", ProfileViewerDialog.Mode.PROFILE_COMPARE.ordinal)
- it.putString("customProfile", runningProfile.data.toString())
- it.putString("customProfile2", profile.data.toString())
- it.putString("customProfileUnits", profile.units)
- it.putString("customProfileName", "Age: $age TDD: $tdd Weight: $weight")
- }
- }.show(supportFragmentManager, "ProfileViewDialog")
+ defaultProfile.profile(age, tdd, weight, profileFunction.getUnits())?.let { profile ->
+ ProfileViewerDialog().also { pvd ->
+ pvd.arguments = Bundle().also {
+ it.putLong("time", DateUtil.now())
+ it.putInt("mode", ProfileViewerDialog.Mode.PROFILE_COMPARE.ordinal)
+ it.putString("customProfile", runningProfile.data.toString())
+ it.putString("customProfile2", profile.data.toString())
+ it.putString("customProfileUnits", profile.units)
+ it.putString("customProfileName", "Age: $age TDD: $tdd Weight: $weight")
+ }
+ }.show(supportFragmentManager, "ProfileViewDialog")
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
index 4d4c52df43..7ba9957ed8 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
@@ -97,6 +97,10 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final ScheduledExecutorService bgWorker = Executors.newSingleThreadScheduledExecutor();
private static ScheduledFuture> scheduledBgPost = null;
+ private static final ScheduledExecutorService bgHistoryWorker = Executors.newSingleThreadScheduledExecutor();
+ private static ScheduledFuture> scheduledBgHistoryPost = null;
+ private static long oldestBgHistoryChange = 0;
+
private static final ScheduledExecutorService tempBasalsWorker = Executors.newSingleThreadScheduledExecutor();
private static ScheduledFuture> scheduledTemBasalsPost = null;
@@ -387,8 +391,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
old.copyFrom(bgReading);
getDaoBgReadings().update(old);
aapsLogger.debug(LTag.DATABASE, "BG: Updating record from: " + from + " New data: " + old.toString());
- rxBus.send(new EventNewHistoryBgData(old.date)); // trigger cache invalidation
- scheduleBgChange(bgReading); // trigger new calculation
+ scheduleBgHistoryChange(old.date); // trigger cache invalidation
return false;
}
} catch (SQLException e) {
@@ -424,6 +427,26 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
}
+ private void scheduleBgHistoryChange(@Nullable final long timestamp) {
+ class PostRunnable implements Runnable {
+ public void run() {
+ aapsLogger.debug(LTag.DATABASE, "Firing EventNewBg");
+ rxBus.send(new EventNewHistoryBgData(oldestBgHistoryChange));
+ scheduledBgHistoryPost = null;
+ oldestBgHistoryChange = 0;
+ }
+ }
+ // prepare task for execution in 1 sec
+ // cancel waiting task to prevent sending multiple posts
+ if (scheduledBgHistoryPost != null)
+ scheduledBgHistoryPost.cancel(false);
+ Runnable task = new PostRunnable();
+ final int sec = 3;
+ if (oldestBgHistoryChange == 0 || oldestBgHistoryChange > timestamp) oldestBgHistoryChange = timestamp;
+ scheduledBgHistoryPost = bgHistoryWorker.schedule(task, sec, TimeUnit.SECONDS);
+
+ }
+
public List getBgreadingsDataFromTime(long mills, boolean ascending) {
try {
Dao daoBgreadings = getDaoBgReadings();
diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
index f179580a55..c7033eec2d 100644
--- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt
@@ -190,7 +190,7 @@ abstract class PluginsModule {
abstract fun bindLocalProfilePlugin(plugin: LocalProfilePlugin): PluginBase
@Binds
- @AllConfigs
+ @APS
@IntoMap
@IntKey(250)
abstract fun bindAutomationPlugin(plugin: AutomationPlugin): PluginBase
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
index f06f563874..b5b3a8f252 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/InsulinDialog.kt
@@ -9,6 +9,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.common.base.Joiner
+import info.nightscout.androidaps.Config
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.ErrorHelperActivity
@@ -45,6 +46,7 @@ class InsulinDialog : DialogFragmentWithDate() {
@Inject lateinit var commandQueue: CommandQueueProvider
@Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var ctx: Context
+ @Inject lateinit var config: Config
companion object {
private const val PLUS1_DEFAULT = 0.5
@@ -88,6 +90,10 @@ class InsulinDialog : DialogFragmentWithDate() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ if (config.NSCLIENT) {
+ overview_insulin_record_only.isChecked = true
+ overview_insulin_record_only.isEnabled = false
+ }
val maxInsulin = constraintChecker.getMaxBolusAllowed().value()
overview_insulin_time.setParams(savedInstanceState?.getDouble("overview_insulin_time")
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
index c5f4d1ec53..84663a1cfe 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/TreatmentDialog.kt
@@ -9,6 +9,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.common.base.Joiner
+import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.data.DetailedBolusInfo
@@ -25,6 +26,7 @@ import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.SafeParse
import info.nightscout.androidaps.utils.ToastUtils
import info.nightscout.androidaps.utils.resources.ResourceHelper
+import kotlinx.android.synthetic.main.dialog_insulin.*
import kotlinx.android.synthetic.main.dialog_treatment.*
import kotlinx.android.synthetic.main.okcancel.*
import java.text.DecimalFormat
@@ -38,6 +40,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
@Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var commandQueue: CommandQueueProvider
@Inject lateinit var ctx: Context
+ @Inject lateinit var config: Config
private val textWatcher: TextWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable) {}
@@ -75,6 +78,10 @@ class TreatmentDialog : DialogFragmentWithDate() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ if (config.NSCLIENT) {
+ overview_treatment_record_only.isChecked = true
+ overview_treatment_record_only.isEnabled = false
+ }
val maxCarbs = constraintChecker.getMaxCarbsAllowed().value().toDouble()
val maxInsulin = constraintChecker.getMaxBolusAllowed().value()
val pumpDescription = activePlugin.activePump.pumpDescription
diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
index 23ddfcabd1..faf27af7b7 100644
--- a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
+++ b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt
@@ -261,7 +261,7 @@ class WizardDialog : DaggerDialogFragment() {
private fun calculateInsulin() {
val profileStore = activePlugin.activeProfileInterface.profile
- if (treatments_wizard_profile.selectedItem == null || profileStore == null)
+ if (treatments_wizard_profile?.selectedItem == null || profileStore == null)
return // not initialized yet
var profileName = treatments_wizard_profile.selectedItem.toString()
val specificProfile: Profile?
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt
index b67d270c8d..dff373058e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt
@@ -5,6 +5,7 @@ import android.content.Intent
import android.os.Build
import android.os.Handler
import android.os.HandlerThread
+import android.os.SystemClock
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.EventBTChange
@@ -211,6 +212,7 @@ class AutomationPlugin @Inject constructor(
}
})
}
+ SystemClock.sleep(1100)
event.lastRun = DateUtil.now()
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.kt
index a9f3c936d9..da1ebd4914 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.kt
@@ -21,8 +21,8 @@ class TriggerLocation(injector: HasAndroidInjector) : Trigger(injector) {
var lastMode = InputLocationMode.Mode.INSIDE
private val buttonAction = Runnable {
locationDataContainer.lastLocation?.let {
- latitude.value = it.latitude
- longitude.value = it.longitude
+ latitude.setValue(it.latitude)
+ longitude.setValue(it.longitude)
aapsLogger.debug(LTag.AUTOMATION, String.format("Grabbed location: %f %f", latitude.value, longitude.value))
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt
index 565b33b77b..d90de7a086 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt
@@ -209,18 +209,24 @@ class ImportExportPrefs @Inject constructor(
} catch (e: IOException) {
ToastUtils.errorToast(activity, e.message)
log.error(TAG, "Unhandled exception", e)
+ } catch (e: PrefFileNotFoundError) {
+ ToastUtils.Long.errorToast(activity, resourceHelper.gs(R.string.preferences_export_canceled)
+ + "\n\n" + resourceHelper.gs(R.string.filenotfound)
+ + ": " + e.message
+ + "\n\n" + resourceHelper.gs(R.string.needstoragepermission))
+ log.error(TAG, "File system exception", e)
+ } catch (e: PrefIOError) {
+ ToastUtils.Long.errorToast(activity, resourceHelper.gs(R.string.preferences_export_canceled)
+ + "\n\n" + resourceHelper.gs(R.string.needstoragepermission)
+ + ": " + e.message)
+ log.error(TAG, "File system exception", e)
}
}
}
fun importSharedPreferences(fragment: Fragment) {
fragment.activity?.let { fragmentAct ->
- val callForPrefFile = fragmentAct.registerForActivityResult(PrefsFileContract()) {
- it?.let {
- importSharedPreferences(fragmentAct, it)
- }
- }
- callForPrefFile.launch(null)
+ importSharedPreferences(fragmentAct)
}
}
@@ -230,7 +236,15 @@ class ImportExportPrefs @Inject constructor(
importSharedPreferences(activity, it)
}
}
- callForPrefFile.launch(null)
+
+ try {
+ callForPrefFile.launch(null)
+ } catch (e: IllegalArgumentException) {
+ // this exception happens on some early implementations of ActivityResult contracts
+ // when registered and called for the second time
+ ToastUtils.errorToast(activity, resourceHelper.gs(R.string.goto_main_try_again))
+ log.error(TAG, "Internal android framework exception", e)
+ }
}
private fun importSharedPreferences(activity: Activity, importFile: PrefsFile) {
@@ -267,7 +281,7 @@ class ImportExportPrefs @Inject constructor(
restartAppAfterImport(activity)
} else {
// for impossible imports it should not be called
- ToastUtils.errorToast(activity, "Cannot import preferences!")
+ ToastUtils.errorToast(activity, resourceHelper.gs(R.string.preferences_import_impossible))
}
})
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt
index 9377b58992..86b1e71db6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenancePlugin.kt
@@ -63,31 +63,31 @@ class MaintenancePlugin @Inject constructor(
}
//todo replace this with a call on startup of the application, specifically to remove
-// unnecessary garbage from the log exports
+ // unnecessary garbage from the log exports
fun deleteLogs() {
- val logDirectory = LoggerUtils.getLogDirectory()
- val logDir = File(logDirectory)
- val files = logDir.listFiles { _: File?, name: String ->
- (name.startsWith("AndroidAPS")
- && name.endsWith(".zip"))
- }
- Arrays.sort(files) { f1: File, f2: File -> f1.name.compareTo(f2.name) }
- var delFiles = listOf(*files)
- val amount = sp.getInt(R.string.key_logshipper_amount, 2)
- val keepIndex = amount - 1
- if (keepIndex < delFiles.size) {
- delFiles = delFiles.subList(keepIndex, delFiles.size)
- for (file in delFiles) {
- file.delete()
+ LoggerUtils.getLogDirectory()?.let { logDirectory ->
+ val logDir = File(logDirectory)
+ val files = logDir.listFiles { _: File?, name: String ->
+ (name.startsWith("AndroidAPS") && name.endsWith(".zip"))
}
- }
- val exportDir = File(logDirectory, "exports")
- if (exportDir.exists()) {
- val expFiles = exportDir.listFiles()
- for (file in expFiles) {
- file.delete()
+ Arrays.sort(files) { f1: File, f2: File -> f1.name.compareTo(f2.name) }
+ var delFiles = listOf(*files)
+ val amount = sp.getInt(R.string.key_logshipper_amount, 2)
+ val keepIndex = amount - 1
+ if (keepIndex < delFiles.size) {
+ delFiles = delFiles.subList(keepIndex, delFiles.size)
+ for (file in delFiles) {
+ file.delete()
+ }
+ }
+ val exportDir = File(logDirectory, "exports")
+ if (exportDir.exists()) {
+ val expFiles = exportDir.listFiles()
+ for (file in expFiles) {
+ file.delete()
+ }
+ exportDir.delete()
}
- exportDir.delete()
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt
index 40318d0ca0..240a396d92 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt
@@ -656,7 +656,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
// If the target is not the same as set in the profile then oref has overridden it
val targetUsed = lastRun?.constraintsProcessed?.targetBG ?: 0.0
- if (targetUsed != 0.0 && abs(profile.targetMgdl-targetUsed) > 0.01) {
+ if (targetUsed != 0.0 && abs(profile.targetMgdl - targetUsed) > 0.01) {
aapsLogger.debug("Adjusted target. Profile: ${profile.targetMgdl} APS: $targetUsed")
overview_temptarget?.text = Profile.toTargetRangeString(targetUsed, targetUsed, Constants.MGDL, units)
overview_temptarget?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
@@ -683,10 +683,10 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
overview_basebasal?.setTextColor(activeTemp?.let { resourceHelper.gc(R.color.basal) }
?: resourceHelper.gc(R.color.defaulttextcolor))
- if (activeTemp != null)
- overview_basebasal_icon?.setImageResource(if (activeTemp.tempBasalConvertedToPercent(System.currentTimeMillis(), profile) > 100) R.drawable.ic_cp_basal_tbr_high else R.drawable.ic_cp_basal_tbr_low)
- else
- overview_basebasal_icon?.setImageResource(R.drawable.ic_cp_basal_no_tbr)
+ overview_basebasal_icon?.setImageResource(R.drawable.ic_cp_basal_no_tbr)
+ val percentRate = activeTemp?.tempBasalConvertedToPercent(System.currentTimeMillis(), profile) ?:100
+ if (percentRate > 100) overview_basebasal_icon?.setImageResource(R.drawable.ic_cp_basal_tbr_high)
+ if (percentRate < 100) overview_basebasal_icon?.setImageResource(R.drawable.ic_cp_basal_tbr_low)
// Extended bolus
val extendedBolus = treatmentsPlugin.getExtendedBolusFromHistory(System.currentTimeMillis())
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt
index 219b56d025..668e7c7fc2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewPlugin.kt
@@ -1,6 +1,9 @@
package info.nightscout.androidaps.plugins.general.overview
+import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.SwitchPreference
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.EventRefreshOverview
import info.nightscout.androidaps.interfaces.PluginBase
@@ -26,7 +29,8 @@ class OverviewPlugin @Inject constructor(
private val fabricPrivacy: FabricPrivacy,
private val rxBus: RxBusWrapper,
aapsLogger: AAPSLogger,
- resourceHelper: ResourceHelper
+ resourceHelper: ResourceHelper,
+ private val config: Config
) : PluginBase(PluginDescription()
.mainType(PluginType.GENERAL)
.fragmentClass(OverviewFragment::class.qualifiedName)
@@ -64,4 +68,18 @@ class OverviewPlugin @Inject constructor(
disposable.clear()
super.onStop()
}
+
+ override fun preprocessPreferences(preferenceFragment: PreferenceFragmentCompat) {
+ super.preprocessPreferences(preferenceFragment)
+ if (config.NSCLIENT) {
+ (preferenceFragment.findPreference(resourceHelper.gs(R.string.key_show_cgm_button)) as SwitchPreference?)?.let {
+ it.isVisible = false
+ it.isEnabled = false
+ }
+ (preferenceFragment.findPreference(resourceHelper.gs(R.string.key_show_calibration_button)) as SwitchPreference?)?.let {
+ it.isVisible = false
+ it.isEnabled = false
+ }
+ }
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationUserMessage.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationUserMessage.kt
index 3d198dfc0b..43a2094ef0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationUserMessage.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationUserMessage.kt
@@ -6,6 +6,7 @@ class NotificationUserMessage (text :String): Notification() {
var hash = text.hashCode()
if (hash < USERMESSAGE) hash += USERMESSAGE
id = hash
+ date = System.currentTimeMillis()
this.text = text
level = URGENT
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPlugin.kt
index 50a2db2f66..9e826156ee 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/AbstractSensitivityPlugin.kt
@@ -20,13 +20,10 @@ abstract class AbstractSensitivityPlugin(
pluginDescription: PluginDescription,
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
- resourceHelper:
- ResourceHelper //,
- //var sp: SP
+ resourceHelper: ResourceHelper,
+ val sp: SP
) : PluginBase(pluginDescription, aapsLogger, resourceHelper, injector), SensitivityInterface {
- lateinit var sp: SP
-
abstract override fun detectSensitivity(plugin: IobCobCalculatorInterface, fromTime: Long, toTime: Long): AutosensResult
fun fillResult(ratio: Double, carbsAbsorbed: Double, pastSensitivity: String,
@@ -67,4 +64,4 @@ abstract class AbstractSensitivityPlugin(
output.sensResult = sensResult
return output
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java
index fc527bab94..9f81d9306e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java
@@ -36,7 +36,6 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP;
@Singleton
public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
- private SP sp;
private ProfileFunction profileFunction;
private DateUtil dateUtil;
@@ -57,7 +56,6 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
.description(R.string.description_sensitivity_aaps),
injector, aapsLogger, resourceHelper, sp
);
- this.sp = sp;
this.profileFunction = profileFunction;
this.dateUtil = dateUtil;
}
@@ -66,12 +64,12 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
public AutosensResult detectSensitivity(IobCobCalculatorInterface iobCobCalculatorPlugin, long fromTime, long toTime) {
LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
- String age = sp.getString(R.string.key_age, "");
+ String age = getSp().getString(R.string.key_age, "");
int defaultHours = 24;
if (age.equals(getResourceHelper().gs(R.string.key_adult))) defaultHours = 24;
if (age.equals(getResourceHelper().gs(R.string.key_teenage))) defaultHours = 4;
if (age.equals(getResourceHelper().gs(R.string.key_child))) defaultHours = 4;
- int hoursForDetection = sp.getInt(R.string.key_openapsama_autosens_period, defaultHours);
+ int hoursForDetection = getSp().getInt(R.string.key_openapsama_autosens_period, defaultHours);
Profile profile = profileFunction.getProfile();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java
index fec1b6d960..1283ef268a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java
@@ -208,10 +208,10 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
double basalOff = 0;
if (pSensitive < 0) { // sensitive
- basalOff = pSensitive * (60.0 / 5) / Profile.toMgdl(sens, profile.getUnits());
+ basalOff = pSensitive * (60.0 / 5) / sens;
sensResult += "Excess insulin sensitivity detected";
} else if (pResistant > 0) { // resistant
- basalOff = pResistant * (60.0 / 5) / Profile.toMgdl(sens, profile.getUnits());
+ basalOff = pResistant * (60.0 / 5) / sens;
sensResult += "Excess insulin resistance detected";
} else {
sensResult += "Sensitivity normal";
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt
index b6705ac733..bd532dc462 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt
@@ -46,7 +46,7 @@ class KeepAliveReceiver : DaggerBroadcastReceiver() {
companion object {
private val KEEP_ALIVE_MILLISECONDS = T.mins(5).msecs()
private val STATUS_UPDATE_FREQUENCY = T.mins(15).msecs()
- private val IOB_UPDATE_FREQUENCY = T.mins(5).msecs()
+ private val IOB_UPDATE_FREQUENCY_IN_MINS = 5L
private var lastReadStatus: Long = 0
private var lastRun: Long = 0
@@ -108,7 +108,7 @@ class KeepAliveReceiver : DaggerBroadcastReceiver() {
else if (!loopPlugin.isEnabled() || iobCobCalculatorPlugin.actualBg() == null)
shouldUploadStatus = true
else if (DateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true
- if (DateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY) && shouldUploadStatus) {
+ if (DateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINS) && shouldUploadStatus) {
lastIobUpload = DateUtil.now()
nsUpload.uploadDeviceStatus(loopPlugin, iobCobCalculatorPlugin, profileFunction, activePlugin.activePump, receiverStatusStore, BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION)
}
diff --git a/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt b/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt
index fffa175e07..2b0fb46022 100644
--- a/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt
+++ b/app/src/main/java/info/nightscout/androidaps/utils/wizard/BolusWizard.kt
@@ -5,6 +5,7 @@ import android.content.Intent
import android.text.Spanned
import com.google.common.base.Joiner
import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.data.DetailedBolusInfo
@@ -49,6 +50,7 @@ class BolusWizard @Inject constructor(
@Inject lateinit var commandQueue: CommandQueueProvider
@Inject lateinit var loopPlugin: LoopPlugin
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
+ @Inject lateinit var config: Config
init {
injector.androidInjector().inject(this)
@@ -293,6 +295,8 @@ class BolusWizard @Inject constructor(
if (abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.pumpDescription.pumpType.determineCorrectBolusStepSize(insulinAfterConstraints)) {
actions.add(resourceHelper.gs(R.string.bolusconstraintappliedwarning, resourceHelper.gc(R.color.warning), calculatedTotalInsulin, insulinAfterConstraints))
}
+ if (config.NSCLIENT)
+ actions.add("" + resourceHelper.gs(R.string.bolusrecordedonly) + "")
return HtmlHelper.fromHtml(Joiner.on(" ").join(actions))
}
diff --git a/app/src/main/res/drawable/ic_clone_48.xml b/app/src/main/res/drawable/ic_clone_48.xml
new file mode 100644
index 0000000000..5156d7525e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_clone_48.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_profilehelper.xml b/app/src/main/res/layout/activity_profilehelper.xml
index 68d97b98a8..effa56b112 100644
--- a/app/src/main/res/layout/activity_profilehelper.xml
+++ b/app/src/main/res/layout/activity_profilehelper.xml
@@ -1,95 +1,261 @@
+ tools:context=".activities.ProfileHelperActivity">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_profilehelper.xml b/app/src/main/res/menu/menu_profilehelper.xml
new file mode 100644
index 0000000000..ca6e6cb9fc
--- /dev/null
+++ b/app/src/main/res/menu/menu_profilehelper.xml
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml
index 8293bacc5d..622ec2460d 100644
--- a/app/src/main/res/values-bg-rBG/strings.xml
+++ b/app/src/main/res/values-bg-rBG/strings.xml
@@ -1223,7 +1223,7 @@
КлонирайПърво запазете или се откажете от променитеИзтриване на текущия профил?
- Създаване на нов локален профил от това превключване?
+ Желаете ли да създадете нов локален профил от този профил?Името на профила съдържа точка.\nТова не се поддържа от НС.\nПрофилът не е качен в НС.Ниската граница на диапазона (графика)Високата граница на диапазона (графика)
@@ -1405,6 +1405,12 @@
Не може да се провери статус на болус. Моля, уверете се, че вашият под е стартирал болус или го отменете.Статистика на RLPulse лог
- Сравни с текущия профил
+ Сравняване на профилиПрофил съветник
+ Профил по подразбиране
+ Текущ профил
+ Наличен профил
+ Профил тип
+ Възраст: %1$.0f TDD: %2$.0f Е
+ Възраст: %1$.0f Тегло: %2$.0f кг
diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml
index b760ef7044..4c6bb272a8 100644
--- a/app/src/main/res/values-cs-rCZ/strings.xml
+++ b/app/src/main/res/values-cs-rCZ/strings.xml
@@ -1223,7 +1223,7 @@
KlonovatNejprve uložte nebo resetujte aktuální změnyOdstranit aktuální profil?
- Chcete vytvořit nový lokální profil z tohoto přepnutí profilu?
+ Vytvořit z tohoto profilu nový místní profil?Název profilu obsahuje tečky.\nToto není v NS podporováno.\nProfil není přenesen do NS.Spodní hodnota oblasti v rozsahu (pouze zobrazování)Horní hodnota oblasti v rozsahu (pouze zobrazování)
@@ -1237,6 +1237,7 @@
PrůzkumNeplatná položka věkuNeplatná položka váhy
+ Neplatný vstup %%1$s: Pod: %2$02d%% V: %3$02d%% Nad: %4$02d%%]]>PrůměrČas v rozsahu
@@ -1405,4 +1406,15 @@
Nelze ověřit, zda byl bolus úspěšný. Ověřte prosím, zda Váš Pod dodává bolus nebo ho zrušte.Statistika RLPulse Log
+ Porovnat profily
+ Pomocník s profilem
+ Výchozí profil
+ Aktuální profil
+ Dostupný profil
+ Typ profilu
+ Věk: %1$.0f CDD: %2$.0f U
+ Věk: %1$.0f CDD: %2$.0f U %3$d%%
+ Věk: %1$.0f Hmotnost: %2$.0f kg
+ % bazálu
+ Výchozí profil DPV
diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml
index 32e3a40d82..5e18740785 100644
--- a/app/src/main/res/values-de-rDE/strings.xml
+++ b/app/src/main/res/values-de-rDE/strings.xml
@@ -1224,7 +1224,7 @@ Unerwartetes Verhalten.
KlonenSpeichere oder verwerfe die aktuellen Änderungen zuerstAktuelles Profil löschen?
- Neues lokales Profil auf Basis dieses Profilwechsels erstellen?
+ Neues lokales Profil auf Basis dieses Profils erstellen?Profilname enthält Punkte.\nDies wird von NS nicht unterstützt.\nProfil wird nicht zu NS hochgeladen.Unterer Wert des Zielbereichs (nur Anzeige)Oberer Wert des Zielbereichs (nur Anzeige)
@@ -1238,6 +1238,7 @@ Unerwartetes Verhalten.
UmfrageUngültige AltersangabeUngültige Gewichtsangabe
+ Ungültige % Eingabe%1$s: Low: %2$02d%% In: %3$02d%% High: %4$02d%%]]>DurchschnittTIR
@@ -1407,5 +1408,15 @@ Mache das nur, wenn AAPS nicht mehr mit dem Pod kommunizieren kann. Wenn dies no
Erfolgreiche Bolusabgabe konnte nicht sicher ermittelt werden. Stelle sicher, dass der Pod Insulin abgibt oder brich den Bolus ab.RL StatsPulse Log
+ Profile vergleichenProfil-Helfer
+ Standard-Profil
+ Aktuelles Profil
+ Verfügbares Profil
+ Profil-Typ
+ Alter: %1$.0f TDD: %2$.0f U
+ Alter: %1$.0f TDD: %2$.0f IE %3$d%%
+ Alter: %1$.0f Gewicht: %2$.0f kg
+ % der Basalrate
+ DPV-Standard-Profil
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 4dc505384e..60e9782a4c 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -1223,7 +1223,7 @@
ClonarGuardar o restablecer los cambios actuales primero¿Eliminar el perfil actual?
- ¿Crear un nuevo perfil local a partir de este conmutador de perfil?
+ ¿Crear un perfil local nuevo a partir de este perfil?El nombre de perfil contiene puntos.\nEsto no está soportado por NS.\nEl perfil no se carga en NS.Valor inferior del área de rango (sólo visualización)Valor superior al área de rango (sólo visualización)
@@ -1405,4 +1405,11 @@
No se puede verificar si el bolo ha sido exitoso. Por favor verifique que su Pod está poniendo bolo o cancele el bolo.Estadísticas del RLRegistro de pulso
+ Comparar perfiles
+ Asistente de perfil
+ Perfil actual
+ Perfil disponible
+ Tipo de perfil
+ Edad: %1$.0f TDD: %2$.0f U
+ Edad: %1$.0f Peso: %2$.0f kg
diff --git a/app/src/main/res/values-fr-rFR/protection.xml b/app/src/main/res/values-fr-rFR/protection.xml
index 4b38aa53da..7d47f26e8a 100644
--- a/app/src/main/res/values-fr-rFR/protection.xml
+++ b/app/src/main/res/values-fr-rFR/protection.xml
@@ -15,6 +15,8 @@
Pas de ProtectionProtectionLe mot de passe principal n\'est pas défini !\n\nVeuillez définir votre mot de passe principal dans les préférences (%1$s → %2$s)
+ Retour arrière non sécurisé
+ Pour être effective, la protection biométrique nécessite un mot de passe principal pour revenir en arrière.\n\nMerci de définir un mot de passe principal !Mot de passe défini !Mot de passe non définiMot de passe non modifié
diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml
index 5da915b220..bf36876d6b 100644
--- a/app/src/main/res/values-fr-rFR/strings.xml
+++ b/app/src/main/res/values-fr-rFR/strings.xml
@@ -1224,7 +1224,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
DupliquerSauver ou réinitialiser les modifications actuelles en premierSupprimer le profil actuel ?
- Créer un nouveau profil local à partir de ce changement de profil ?
+ Créer un nouveau profil local à partir de ce profil ?Le nom du profil contient des points.\nCe n\'est pas pris en charge par NS.\nLe profil n\'est pas remonté dans NS.Valeur inférieure dans la plage (affichage uniquement)Valeur supérieure dans la plage (affichage uniquement)
@@ -1238,6 +1238,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
SondageÂge invalidePoids invalide
+ % saisi invalide%1$s: Bas: %2$02d%% Cible: %3$02d%% Haut: %4$02d%%]]>MoyenneCible Gly
@@ -1406,4 +1407,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
Impossible de vérifier si le bolus a réussi. Vérifiez que votre Pod délivre le bolus ou annulez le bolus.État RLEnreg. Pulse
+ Comparer les profils
+ Assistant Profil
+ Profil par défaut
+ Profil actuel
+ Profil disponible
+ Type de profil
+ Âge: %1$.0f DTI: %2$.0f U
+ Âge: %1$.0f DTI: %2$.0f U %3$d%%
+ Âge: %1$.0f Poids: %2$.0f kg
+ % de basal
+ Profil par défaut DPV
diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml
index c07b82596b..fcc302b530 100644
--- a/app/src/main/res/values-it-rIT/strings.xml
+++ b/app/src/main/res/values-it-rIT/strings.xml
@@ -1223,7 +1223,7 @@
ClonaSalva o reimposta prima le modifiche correntiRimuovere il profilo corrente?
- Creare nuovo profilo locale da questo cambio profilo?
+ Creare un nuovo profilo locale da questo profilo?Il nome profilo contiene dei punti.\nQuesto non è supportato da NS.\nIl profilo non viene caricato in NS.Valore più basso per l\'intervallo di visualizzazione dell\'area \"in range\"Valore più alto per l\'intervallo di visualizzazione dell\'area \"in range\"
@@ -1237,6 +1237,7 @@
SondaggioInserimento età non validoInserimento peso non valido
+ Inserimento % non valido%1$s: Basso: %2$02d%% In: %3$02d%% Alto: %4$02d%%]]>MediaTIR
@@ -1405,4 +1406,15 @@
Impossibile verificare che il bolo sia riuscito. Verifica che il tuo pod stia erogando il bolo oppure cancellalo.Statistiche RLLog impulsi
+ Compara profili
+ Assistente profilo
+ Profilo predefinito
+ Profilo corrente
+ Profilo disponibile
+ Tipo profilo
+ Età: %1$.0f TDD: %2$.0f U
+ Età: %1$.0f TDD: %2$.0f U %3$d%%
+ Età: %1$.0f Peso: %2$.0f kg
+ % di basale
+ Profilo DPV predefinito
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 64d2780b01..b2b0e5affa 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -1113,7 +1113,6 @@
복사우선 현재 변경사항을을 저장하거나 재설정하세요현재 프로파일을 삭제 하시겠습니까?
- 이 프로파일 변경을 기반으로 새 로컬 프로파일을 만드시겠습니까?프로파일명에 점을 포함하고 있습니다.\n이는 NS에서 지원하지 않습니다.\n프로파일이 NS에 업로드되지 않습니다.혈당 정상범위의 하한값(표시 전용)혈당 정상범위의 상한값(표시 전용)
diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml
index e117fd3736..3a4999bb69 100644
--- a/app/src/main/res/values-lt-rLT/strings.xml
+++ b/app/src/main/res/values-lt-rLT/strings.xml
@@ -1237,6 +1237,7 @@
ApklausaNeteisingas amžiaus įrašasNeteisingas svorio įrašas
+ Netinkamas % įrašas%1$s: Žemas: %2$02d%% Norma: %3$02d%% Aukštas: %4$02d%%]]>VidutinisTIR (Laikas normos ribose)
@@ -1405,4 +1406,15 @@
Neįmanoma patikrinti, ar bolusas suleistas sėkmingai. Patikrinkite, ar jūsų POD leidžia bolusą, arba bolusą atšaukite.RL statistikaPulse žurnalas
+ Palyginti profilius
+ Profilio pagalbininkas
+ Numatytasis profilis
+ Dabartinis profilis
+ Galimas profilis
+ Profilio tipas
+ Amžius: %1$.0f BPD: %2$.0f U
+ Amžius: %1$.0f BPD: %2$.0f U %3$d%%
+ Amžius: %1$.0f Svoris: %2$.0f kg
+ % bazės
+ Numatytasis profilis
diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml
index 0c700b271d..6257a7d4ee 100644
--- a/app/src/main/res/values-nl-rNL/strings.xml
+++ b/app/src/main/res/values-nl-rNL/strings.xml
@@ -1223,7 +1223,6 @@
DuplicerenHuidige wijzigingen eerst opslaan of ongedaan makenHuidige profiel verwijderen?
- Nieuw lokaal profiel maken op basis van deze profiel wissel?Profielnaam bevat punten.\nDit wordt niet ondersteund door NS.\nProfiel is niet geüpload naar NS.Laagste waarde in bereik (alleen weergave)Hoogste waarde in bereik (alleen weergave)
@@ -1405,4 +1404,5 @@
Kan niet controleren of de bolus is geslaagd. Controleer of de Pod de bolus aan het toedienen is of annuleer de bolus.RL StatistiekenPulsen Log
+ Profiel hulp
diff --git a/app/src/main/res/values-pl-rPL/exam.xml b/app/src/main/res/values-pl-rPL/exam.xml
index fd3f73b858..b346bd076c 100644
--- a/app/src/main/res/values-pl-rPL/exam.xml
+++ b/app/src/main/res/values-pl-rPL/exam.xml
@@ -1,6 +1,7 @@
Co jest prawdą w przypadku DIA?
+ Temat: Czas działania insuliny (DIA)Wartość minimalna to 3 godziny.Wartość minimalna to 5 godzin.https://androidaps.readthedocs.io/en/latest/EN/Configuration/Config-Builder.html?#insulin
@@ -121,6 +122,7 @@
Aplikacja Loop na iPhone\'a.Aplikacja Spike na iPhone\'a.https://androidaps.readthedocs.io/en/latest/EN/Children/Children.html
+ Temat: Współczynnik wrażliwości na insulinę (ISF)Wyższe wartości ISF prowadzą do mniejszej ilości podanej insuliny gdy AAPS koryguje wysoki poziom cukru.Niższe wartości ISF prowadzą do mniejszej dawki insuliny gdy AAPS koryguje wysoki poziom cukru.Zmiana wartości ISF nie ma wpływu na ilość insuliny dostarczanej, gdy AAPS koryguje wysoki poziom cukru.
@@ -128,6 +130,7 @@
Zmiana wartości ISF w profilu wystarczy, aby zastosować zmianę.https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-uhttps://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html
+ Temat: Węglowodany na jednostkę Insuliny (IC)Wyższe wartości ICprowadzą do mniejszej ilości insuliny dostarczonej do podanej ilości węglowodanów.Niższe wartości IC prowadzą do mniejszej ilości insuliny podanej do wprowadzonej ilości węglowodanów.Załóżmy, że masz 0 COB. Zmiana IC doprowadzi do podania innej ilości insuliny w celu skorygowania twojej wartości BG.
diff --git a/app/src/main/res/values-pl-rPL/protection.xml b/app/src/main/res/values-pl-rPL/protection.xml
index d2b1b43d2a..48652935ae 100644
--- a/app/src/main/res/values-pl-rPL/protection.xml
+++ b/app/src/main/res/values-pl-rPL/protection.xml
@@ -15,6 +15,8 @@
Bez ochronyZ ochronąHasło główne nie jest ustawione!\n\nProszę ustawić swoje hasło główne w preferencjach (%1$s → %2$s)
+ Niezabezpieczona funkcja fallback
+ Aby być skuteczna, biometryczna ochrona musi posiadać hasło typu master. \n\n Ustaw hasło typu master!Hasło ustawione!Hasło nie ustawioneHasło nie zostało zmienione
diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml
index 2242a82842..fbdaaf5521 100644
--- a/app/src/main/res/values-pl-rPL/strings.xml
+++ b/app/src/main/res/values-pl-rPL/strings.xml
@@ -126,10 +126,12 @@
Tryb APSZamknięta pętlaOtwarta pętla
+ Zawieszenie przy niskiej glikemiiPętla wyłączonaWyłącz pętleWłącz pętleDostępna nowa sugestia
+ Sugestia węglowodanówNiewspierana wersja NightscoutPĘTLA WYLĄCZONA Z UWAGI NA OGRANICZENIABazowa IOB
@@ -162,6 +164,7 @@
Nie znaleziono plikuEksportuj ustawieniaImportuj ustawienia
+ Maksymalna wartość U/h tymczasowej bazy może być ustawiona naWartość określona jako Maksymalna Baza (max basal) w OpenAPSMaksymalna bazowa IOB, którą OpenAPS może dostarczyć [U]Ta wartość jest nazywana Max IOB w OpenAPS\nTo jest maksymalna wartość insuliny w [U], którą APS może dostarczyć w danej chwili.
@@ -250,6 +253,11 @@
Pętla (Loop) jest włączona%1$.2f ograniczone do %2$.2fWartość %1$s jest poza dopuszczalną granicą
+ Aby podłączyć pompę odpowiedz kodem %1$s
+ Połączenie z pompą nie powiodło się
+ Aby odłączyć pompę na %1d minut odpowiedz kodem %2$s
+ Pompa odłączona
+ Pompa ponownie podłączonaZdalne komendy nie są dozwoloneBolus zdalny niedostępny. Spróbuj ponownie później.Aby rozpocząć bazę %1$.2fU/h przez %2$d min. odpowiedz kodem %3$s
@@ -258,6 +266,9 @@
Aby wprowadzić %1$dg o %2$s odeślij w SMS kod %3$sAby rozpocząć bolus przedłużony %1$d%% przez %2$d min. odpowiedz kodem %3$sAby wstrzymać pętle na %1$d minut odpowiedz kodem %2$s
+ Aby wznowić pętlę odpowiedz kodem %1$s
+ Aby włączyć pętlę odpowiedz kodem %1$s
+ Aby wyłączyć pętlę odpowiedz kodem %1$sTymczasowa baza %1$.2fU/h przez %2$d min rozpoczętaBolus przedłużony %1$.2fU na %2$d min. rozpoczęty pomyślniePomyślnie wprowadzono %1$dg węglowodanów
@@ -289,6 +300,7 @@
Rozpocznij/WypełnijProszę upewnij się, że ilość wypełnienia odpowiada ilości właściwej dla twojego wkłucia!Inne
+ Rozpocznij/Wypełnij standardowe ilości insulinyPrzycisk 1Przycisk 2Przycisk 3
@@ -347,6 +359,7 @@
Wartość domyślna: 4 To jest drugi kluczowy współczynnik bezpieczeństwa OpenAPS, i druga wartość z “3x max dzienna; 4x aktualna”. To oznacza, że Twoja dawka bazowa niezależnie od maksymalnej bazy ustawionej na pompie nie może być większa niż ta ustawiona wartość razy twoja aktualna dawka bazowa. To ma na celu przestrzec ludzi przed ustawieniem zbyt wysokiej dawki maksymalnej przed zrozumieniem jak działa algorytm. Ponownie, wartość domyślna to 4x; większość ludzi nie będzie potrzebowała tego zmienić i raczej będą potrzebować dostosować inne ustawienia, jeśli czują, że zbliżają się do współczynnika bezpieczeństwa.Wartość domyślna: 1.2\nTo jest mnożnik dla autosens (wkrótce autotune), ustawia 20%% maks. limit dla najwyższej wartości jaką autosens może przyjąć, co z kolei określa jak wysoko autosens może zwiększyć bazę, jak nisko może ustawić współczynnik wrażliwości insuliny ISF, i jak nisko może ustawić docelową wartość glikemii.Wartość domyślna: 0.7\nDruga strona limitu bezpieczeństwa dla autosens, ustawia mnożnik minimalny dla wartości, do jakiej autosens może obniżyć bazę, i jak wysoko może ustawić ISF i wartość docelową BG.
+ Autosens dostosowuje również wartości doceloweDomyślnie włączone\nTa funkcja pozwala wpływać na zmianę wartości docelowe BG, wartości bazy i oraz współczynnika wrażliwości na insulinę ISF.Wartość domyślna: 2\nBolus snooze jest uruchamiany po wykonaniu bolusa posiłkowego, tak by pętla nie przeciwdziałała niskim wartościom tymczasowym zaraz po posiłku. Jako przykład: wartość domyślna ustawiona jest 2; więc 3 godzinne DIA oznacza, że bolus snooze będzie stopniowo wycofany po 1.5 godziny (3DIA/2).Wartość domyślna: 3.0 (AMA) lub 8.0 (SMB). To jest ustawienie domyślnego wpływu wchłaniania węglowodanów w czasie 5 min. Wartością domyślną jest spodziewane 3mg/dl/5min. Ma to wpływ na szybkość zaniku COB, oraz jak duże wchłanianie węglowodanów będzie przyjęte do obliczeń przyszłych przewidywanych wartości BG, jeżeli BG obniża się bardziej niż w założono, lub nie wzrasta tak szybko jak się spodziewano.
@@ -441,8 +454,14 @@
Próg ostrzeżenia o krytycznym poziomie zbiornika [U]Próg ostrzeżenia o poziomie baterii [%]Próg ostrzeżenia o krytycznym poziomie baterii [%]
+ PREDIOBCOB
+ BAZ
+ ODCH
+ AKT
+ ABS
+ KRZODO programieBrak uprawnień SMSBrak uprawnień do wykrywania stanu telefonu
@@ -461,6 +480,8 @@
Zmień profilCzas baterii pompyOpcje alarmu
+ Utwórz powiadomienia z alarmów NS
+ Utwórz powiadomienia z komunikatów NSPróg nieaktualne dane [min]Próg uwaga nieaktualne dane [min]Przedział czasowy dla autosens [h]
@@ -541,6 +562,7 @@
Alarm, jeśli nie są odbierane odczyty BGAlarm, gdy pompa jest nieosiągalnaPompa nieosiągalna próg [min]
+ Alarm gdy wymagane jest podanie węglowodanówPilny alarmINFOApka Eversense (spatchowana)
@@ -553,6 +575,8 @@
Maks. ilość minut dawki bazowej do ograniczenia SMBMaksymalna liczba minut UAM SMBMaks. ilość minut dawki bazowej do ograniczenia SMB dla UAM
+ Minimalna sugestia węglowodanów (dosłodzenia)
+ Minimalna ilość węglowodanów, w gramach, niezbędna dla pokazania sugestii dosłodzenia. Sugestie dosłodzenia poniżej tej wartości będą ignorowane - powiadomienie nie będzie pokazywane.Prześlij dane BG do xDrip+W xDrip+ wybierz źródło danych 640g/EversenseNSClient BG
@@ -611,6 +635,8 @@
Błąd dostarczania bolusa przedłużonegoSighttemu
+ Ustawiaj neutralne bazy tymczasowe
+ Jeśli ta opcja jest włączona, anuluje tymczasową wartość bazową przed końcem każdej godziny. Może to pomóc wyciszyć alarmy/wibracje związane z TBR występujące co godzinę w niektórych pompach.Włącz SMB (Super Mikro Bolusy) zawszeWłącz SMB (Super Mikro Bolusy) zawsze, niezależnie od bolusów. Możliwe jedynie ze źródłem BG (poziomu cukru) z dobrym filtrowaniem, jak aplikacja G5Włącz SMB po węglowodanach
@@ -630,11 +656,17 @@
Ilość insuliny do dodania po wciśnięciu przyciskuNie można uruchomić aplikacji CGM. Upewnij się, że została zainstalowana.CGM
+ Ignoruj 5 min
+ Ignoruj 15 min
+ Ignoruj 30 min
+ wymPrzegląd historiiPowiadom na SMBPokaż SMB na zegarku jak bolus standardowy.Twórz powiadomienia o błędach
+ Twórz powiadomienia z wymaganych dodatkowych węglowodanów (sugestii dosłodzenia)Twórz powiadomienia Nightscout o błędach i lokalnych alarmach (również widoczne w PortaluOpieki w ramach Leczenia)
+ Twórz powiadomienia w Nighstcout na podstawie sugestii dosłodzeniaPokaż prognozę poziomu na zegarku.PrognozyWybór Danych
@@ -764,6 +796,7 @@
UprawnieniaZapytaj o uprawnieniaAplikacja wymaga uprawnienia systemowego okna dla powiadomień
+ Aplikacja wymaga dostępu do lokalizacji dla zarządzania bluetoothem i identyfikacją Wi-FiAplikacja wymaga dostępu do magazynu plików, aby móc przechować pliki logówŻądanieSkonfiguruj wtyczkę insuliny
@@ -835,6 +868,10 @@
Melduj ostrzeżeniaWłącz emulację TBRUżyj rozszerzonych bolusów zamiast TBR by ominąć limit 250%% bazy
+ Wyłącz wibracje przy ręcznym podawaniu bolusa
+ Dotyczy bolusa i rozszerzonego bolusa (dostępne tylko z pompami Insight z firmware 3.x)
+ Wyłącz wibracje przy automatycznym podawaniu bolusa
+ Dla SMB i Bazy Tymczasowej z emulacją TBR (tylko z firmware w wersji 3.x pompy Insight)Opóźnienie rozłączenie [s]Numer seryjnyWersja oprogramowania
@@ -1187,12 +1224,13 @@
SklonujNajpierw zapisz lub wycofaj bieżące zmianySkasować bieżący profil?
- Utworzyć nowy profil lokalny na bazie wybranego profilu?
+ Utworzyć nowy profil lokalny z wybranego profilu?Nazwa profilu zawiera kropki.\nTo nie jest obsługiwane przez NS.\nProfil nie zostanie przesyłany do NS.Dolna wartość zakresu docelowego (tylko do wyświetlania)Górna wartość zakresu docelowego (tylko do wyświetlania)Zmień kolejnośćWiek:
+ Waga:ID:WyślijNajczęściej używany profil:
@@ -1256,17 +1294,124 @@
Wskaźniki stanuKopiowanie ustawień z NSCzy skopiować ustawienia NS (jeśli istnieją)?
+ Motyw oryginalny
+ Przyciski są zawsze wyświetlane na dole ekranu
+ Duży ekran
+ Motyw
+ Integracja pompy Omnipod, wymaga RileyLink (z firmwarem 2.0 lub wyższym).
+ Sygnał dźwiękowy bolusa włączony
+ Sygnał dźwiękowy bazy włączony
+ Sygnał dźwiękowy SMB włączony
+ Sygnał dźwiękowy TBR (tymczasowej dawk bazowej) włączony
+ Włączone opcje debugowania PODów
+ Włączone wykrywanie stref czasowych
+ Pod Mgmt
+ Status Pod
+ %1$.2f U zostało
+ Ponad 50 U
+ Adres Pod
+ Pod traci ważność
+ Brak informacji
+ Pod nie podłączony
+ Nie zainicjowany
+ Aktywne alarmy Pod
+ Alerty ack
+ Omnipod (433,91 MHz)
+ To działanie nie jest możliwe.\n\n Musisz skonfigurować Omnipod przed uruchomieniem tego działania.
+ Operacja nie jest możliwa.\n\n Trzeba poczekać kilka minut, aż AAPS spróbuje ustawić profil pierwszy raz.
+ Niedozwolone działanie PodInitActionType: %1$s
+ Brak aktywnego Pod.
+ Nieudana weryfikacja polecenia.
+ Wystąpił nieoczekiwany błąd. Proszę zgłosić! (typ: %1$s).
+ Komunikacja nie powiodła się: odebrano niepoprawne parametry wejściowe.
+ Komunikacja nie powiodła się: przekroczono limit czasu.
+ Komunikacja nie powiodła się: wystąpił nieoczekiwany błąd. Proszę zgłosić!
+ Komunikacja nie powiodła się: weryfikacja integralności komunikatu nie powiodła się.
+ Komunikacja nie powiodła się: odebrano niepoprawny pakiet (komunikat) z Poda.
+ Komunikacja nie powiodła się: Pod jest w niewłaściwym stanie.
+ Komunikacja nie powiodła się: odebrano niepoprawną odpowiedź (pakiet) z Poda.
+ Komunikacja nie powiodła się: odebrano komunikat z niepoprawną sekwencją liczb z Poda.
+ Komunikacja nie powiodła się: odebrano komunikat z niepoprawną adresacją z Poda.
+ Komunikacja nie powiodła się: nie powiodło się dekodowanie komunikatu z Poda.
+ Komunikacja nie powiodła się: nonce resync nie powiodło się.
+ Komunikacja nie powiodła się: nonce nie jest zsynchronizowane.
+ Komunikacja nie powiodła się: brak wystarczającej ilości danych odebranych z Poda.
+ Błąd Pod. (%1$03d %2$s) został wykryty. Zdezaktywuj swój Pod i uruchom nowy.
+ Komunikacja nie powiodła się: Pod zwrócił odpowiedź o błędzie.
+ Zarządzanie Pod
+ Uruchom Pod
+ Odłącz Pod
+ Resetuj Pod
+ Historia PodPodanie bolusaAnulowanie bolusaUstaw tymczasową dawkę bazową
+ Anuluj tymczasową bazę (wewnętrznie przez sterownik)
+ Anuluj tymczasową bazę (wymuszone przez użytkownika)
+ Ustaw harmonogram Dawki bazowej
+ Pobierz status Pod
+ Pobierz informacje o Pod
+ Ustaw czas
+ Konfigurowanie alertów
+ Potwierdź alerty
+ Wstrzymaj podawanie
+ Wznów podawanie
+ Nieznany Wpis
+ %1$.1f U
+ %1$.1f U, CH=%2$.1f g
+ Dawka: %1$.1f U, Czas: %2$d min
+ Jeśli naciśniesz OK, stan Pod zostanie wyzerowany i nie będziesz mógł więcej komunikować się z tym Podem. Zrób to tylko wtedy, gdy nie możesz się z nim skmunikować. Jeśli nadal można komunikować się z Podem, skorzystaj z opcji Odłącz Pod.
+ Historia Pod nie jest dostępna w tej chwili.
+ Napełnij Pod
+ \nNapełnij nowego Poda z wystarczającą ilością insuliny przez 3 dni.\n\nNasłuchuj dwóch sygnałów dźwiękowych z Poda podczas procesu napełniania. Wskazują one, że minimalna ilość 85U została wypełniona. Należy upewnić się, że ampułkostrzykawka jest całkowicie pusta, nawet po odsłuchaniu dwóch sygnałów dźwiękowych.\n\nPo napełnieniu Poda, należy nacisnąć Dalej.\n\nUwaga: nie usuwaj w tym czasie osłonki igłowej Poda.
+ Wypełnianie
+ Próba sparowania z nowym Podem i wypełnienia go.\n\nKiedy wszystkie elementy są sprawdzone, można nacisnąć Następny.\n\nUwaga: prosimy o trzymanie w tym czasie Poda bardzo blisko RileyLink.
+ Przymocuj Poda
+ \nPrzygotowanie miejsca do infuzji. Zdjąć osłonkę igły i zabezpieczenie plastra i przykleić Pod do skóry w miejscu wkłucia.\n\nJeśli kaniula odkleja się, proszę wcisnąć Anuluj i odczepić Pod.\n\nNaciśnij Następny w celu wprowadzenia kaniuli i rozpoczęcia podawania bazy.
+ Wprowadzanie kaniuli
+ Próba ustawienia początkowego planu bazowego i wprowadzeia kaniuli.\n\nKiedy wszystkie elementy są sprawdzane, można nacisnąć Następny.
+ Informacje o Podzie
+ \nPod jest teraz aktywny.\n\nTwój plan dawki bazowej został zaprogramowany i wprowadzono kaniulę w miejsce wkłucia.\n\nSprawdź, czy kaniula została prawidłowo włożona i wymień swój Pod, jeśli czujesz, że nie.
+ Odłącz Pod
+ \nNaciśnij Następny w celu odłączenia Poda.\n\nUwaga: To spowoduje zawieszenie wszystkich dostaw insuliny i dezaktywację Poda.
+ Odłączanie Poda
+ Deaktywacja Pod.\n\nKiedy wszystkie elementy są zaznaczone, możesz nacisnąć Następna.\n\nUwaga: Jeśli deaktywacja w sposób ciągły nie powodzi się, należy nacisnąć Anuluj i użyć opcji Reset Pod, aby wymusić zresetowanie stanu Pod.
+ Pod odłączony.\n\nProszę odkleić Pod od ciała i wyrzucić go.
+ Sparuj Pod
+ Wypełnij Pod
+ Wypełnij kaniulęUstaw profil dawki bazowej
+ Anulowanie podawania
+ Odłącz Pod
+ Integracja pompy dla Omnipod Dash.
+ Zakończ przypomnienie parowania
+ Zakończ przypomnienie o konfiguracji
+ Pod wkrótce straci ważność
+ Pod wkrótce straci ważność
+ Wyłączenie jest nieuchronne
+ Niski poziom w zbiorniku
+ Nieznany alarm
+ Ustawienie profilu podstawowego mogło się nie powieść. Podawanie mogło zostać zawieszone! Odśwież status Pod.
+ Ustawienie bazy tymczasowej mogło się nie powieść. Jeśli była już uruchomiona baza tymczasowa, to mogła zostać odwołana! Odśwież status Pod.
+ Ustawienie czasu mogło się nie powieść. Podawanie mogło zostać zawieszone! Odśwież status Pod.
+ Nie można sprawdzić, czy podano bolus. Upewnij się, że Twój Pod podaje bolus lub odwołaj go.
+ Statystyki RL
+ Logi pulsów omnipod
+ Porównaj profile
+ Pomocnik profilu
+ Profil domyślny
+ Bieżący profil
+ Dostępny profil
+ Typ profilu
+ Wiek: %1$.0f TDD: %2$.0f U
+ Wiek: %1$.0f Waga: %2$.0f kg
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 0069fdc11a..b7cbff5ccf 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -1178,7 +1178,6 @@
ALVGuardar ou repor as alterações atuais primeiroEliminar perfil atual?
- Criar novo perfil local a partir desta troca de perfil?Nome do perfil contém pontos.\nIsso não é suportado pelo NS.\nPerfil não foi enviado para o NS.Valor mais baixo da área de intervalo (apenas exibição)Valor mais alto da área de intervalo (apenas exibição)
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 211f12e032..fe8fa28420 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -1223,7 +1223,7 @@
CloneGuardar ou repor as alterações actuais primeiroEliminar perfil actual?
- Criar novo perfil local a partir desta troca de perfil?
+ Criar novo perfil local a partir deste perfil?Nome do perfil contém pontos.\nIsso não é suportado pelo NS.\nPerfil não é enviado para o NS.Valor mais baixo da área de intervalo (apenas exibição)Valor mais alto da área de intervalo (apenas exibição)
@@ -1237,6 +1237,7 @@
QuestionárioEntrada de idade inválidaEntrada de peso inválida
+ Entrada % inválida%1$s: Hipo: %2$02d%% Dentro: %3$02d%% Hiper: %4$02d%%]]>MédiaTIR
@@ -1405,6 +1406,15 @@
Não é possível verificar se o bólus foi bem-sucedido. Por favor, verifique se o Pod está administrar ou cancelar o bólus.Estatísticas RLRegisto de Pulse
- Comparar com o perfil atual
+ Comparar PerfisAssistente de Perfil
+ Perfil Padrão
+ Perfil Actual
+ Perfil Disponível
+ Tipo de Perfil
+ Idade: %1$.0f TDD: %2$.0f U
+ Idade: %1$.0f TDD: %2$.0f U %3$d%%
+ Idade: %1$.0f Peso: %2$.0f kg
+ % de basal
+ Perfil Padrão DPV
diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml
index 268988058d..d3db306fff 100644
--- a/app/src/main/res/values-ro-rRO/strings.xml
+++ b/app/src/main/res/values-ro-rRO/strings.xml
@@ -186,6 +186,7 @@
Preferințele importate sunt vechi de %1$s zile deja! Poate aveți preferințe mai recente sau ați ales un fișier greșit? Amintiți-vă să exportați preferințele în mod regulat!Format dată invalid!Preferințe dintr-o versiune minoră diferită a aplicației. Este OK dacă importați după upgrade, dar verificați după import că preferințele sunt corecte!
+ Preferințe dintr-o versiune majoră a aplicației. Versiunile majore au diferențe semnificative și pot avea preferințe incompatibile! Asigurați-vă după import ca preferințele sunt corecte!Formatul fișieruluiCreat laVersiune AAPS
@@ -206,6 +207,13 @@
Fişierul a fost modificat după export!Eroare la decriptare, parsarea preferinţelor a eşuat!Eroare la decriptare, parola furnizată este invalidă sau fişierul de setări a fost modificat! Se poate întâmpla ca fişierul importat să fi fost exportat cu o parolă master diferită.
+ Lipseşte configuraţia de criptare, formatul setărilor este invalid!
+ Algoritm de criptare nesuportat sau nespecificat!
+ exportat azi
+ exportat cu %1$s în urmă
+ exportat în data de %1$s
+ exportat acum mai puțin de o ora
+ în folderul: %1$sLicență utilizator finalNU FOLOSIȚI PENTRU LUAREA DE DECIZII MEDICALE. NU EXISTĂ RĂSPUNDERE LEGALĂ SAU GARANȚIE PENTRU ACEST PROGRAM, ÎN LIMITA APLICABILĂ A LEGII. CU EXCEPTIA CAZURILOR SPECIAL MENȚIONATE, AUTORUL ȘI/SAU ALTE PERSOANE IMPLICATE PUN LA DISPOZIȚIE ACEST PROGRAM FĂRĂ NICIO GARANȚIE, IMPLICITĂ SAU EXPLICITĂ, INCLUZÂND, DAR FĂRĂ A SE LIMITA LA, GARANȚIILE LEGATE DE VĂNZAREA SAU POTRIVIREA PENTRU UN ANUME SCOP. ÎNTREGUL RISC LEGAT DE CALITATEA ȘI PERFORMANȚA ACESTUI PROGRAM CAD ÎN RESPONSABILITATEA DUMNEAVOASTRĂ. DACĂ PROGRAMUL SE DOVEDEȘTE A FI DEFECT, DUMNEAVOASTRĂ VĂ ASUMAȚI ÎNTREAGA RĂSPUNDERE, PRECUM ȘI TOATE COSTURILE LEGATE DE SERVICE, REPARAȚII SAU CORECȚII.ÎNȚELEG ȘI SUNT DE ACORD
@@ -215,14 +223,26 @@
Numere de telefon permise+ XXXXXXXXXX; + YYYYYYYYYYPentru a livra un bolus de %1$.2fU răspundeți cu codul %2$s
+ Pentru a livra un bolus de %1$.2fU raspundeți cu: %2$s
+ Pentru a seta tinta temporara %1$s raspundeti cu: %2$s
+ Pentru a anula tinta temporara raspundeți cu: %1$s
+ Pentru a dezactiva serviciul SMS la distanta raspundeti cu: %1$s.\n\nRetineti ca o sa il puteti reactiva doar direct de pe smartphone-ul master AAPS.
+ Serviciul SMS la distanta s-a oprit. Pentru a il reactiva, utilizati AAPS de pe smartphone-ul master.Pentru a trimite calibrarea cu %1$.2f răspundeți cu codul %2$sBolusare eșuată
+ Numarul minim de minute care trebuie sa treaca intre un bolus la distanta si urmatorul
+ Cate minute trebuie sa treaca, cel puţin, intre un bolus si următorul
+ Pentru siguranta dumneavoastra, pentru a edita aceasta preferinta trebuie sa adaugati cel putin 2 numere de telefon.Bolusul de %1$.2fU a fost livrat cu succesSe va livra un bolus de %1$.2fUBolusul de %1$.2fU a fost livrat cu succes
+ Bolusul de %1$.2fU a fost livrat cu succes
+ Țintă %1$s pentru %2$d minute
+ Tinta %1$s pentru %2$d minute este setata cu succes
+ Tinta temporara anulata cu succesPermite comenzi de la distanță, prin SMSSetări de profil DanaR
- DIA [o]
+ DIA [h]Durata de Acțiune a Insulinei (DIA)Se trimiteBolus oprit
@@ -233,6 +253,9 @@
Bucla este activată%1$.2f este limitată la %2$.2fValoarea %1$s este mai mare decât limita stabilită
+ Pentru a conecta pompa raspundeti cu codul %1$s
+ Conectarea cu pompa a esuat
+ Pentru a deconecta pompa timp de %1d minute, raspundeti cu: %2$sPompă deconectatăPompă reconectatăComanda de la distanță nu este permisă
@@ -240,10 +263,16 @@
Pentru a iniția bazala de %1$.2fU/h pentru %2$d min trimiteți codul %3$sPentru a schimba profilul în %1$s %2$d%% trimiteți codul %3$sPentru a stabili bazala de %1$.2fU/h pentru %2$d min trimiteți codul %3$s
+ Pentru a introduce %1$dg la %2$s, raspundeti cu: %3$sPentru a iniția bazala de %1$d%% pentru %2$d min trimiteți codul %3$sPentru suspendarea buclei pentru %1$d minute trimiteți codul %2$s
+ Pentru a reactiva bucla inchisa, raspundeti cu %1$s
+ Pentru a activa bucla inchisa, raspundeti cu %1$s
+ Pentru a dezactiva bucla inchisa, raspundeti cu %1$sBazala temporară %1$.2fU/h pentru %2$d minute a fost trimisă cu succesBolusul extins de %1$.2fU pentru %2$d min a fost inițiat
+ %1$dg carbohidrati introdusi cu succes
+ Introducerea a %1$dg de carbohidrati a esuatBazala temporară %1$d%% pentru %2$d minute a fost stabilită cu succesTrimiterea bazalei temporare a eșuatPornirea bolusului extins a eșuat
@@ -274,6 +303,9 @@
Buton 1Buton 2Buton 3
+ Unități:
+ Unități
+ DIAIntervalul țintă:Intervalul pentru vizualizareValoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch
@@ -304,6 +336,7 @@
Masă în curândHipoActivitate
+ Șterge înregistrareaACTCONFBUCL
@@ -325,6 +358,7 @@
Valoare implicită: 4\nAceasta este cealaltă jumătate a cheii de siguranță a OpenAPS și cealaltă jumătate a \"3x max zilnic; 4x curent\" al setărilor de siguranță.Aceasta înseamnă că bazala dumneavoastră, indiferent de bazala maximă configurată în pompă, nu poate fi mai mare de acest număr înmulțit cu nivelul curent al bazalei active. Această limitare este impusă pentru a evita posibilitatea de a intra pe un teritoriu periculos prin setarea unei bazale maxime excesiv de mari înainte de a înțelege funcționarea algoritmului. Din nou, valoarea implictă este 4x; majoritatea oamenilor nu vor trebui să ajusteze această valoare și vor modifica, mai degrabă, alte valori dacă vor simți că această valoare le stă în cale.Valoare implicită: 1.2\nAceasta este valoarea limită de multiplicare pentru autosens (și pentru autotune, în curând) pentru a seta o limită maximă de 20%% din cât de mare poate fi raportul autosens, care, la rândul ei, determină cât de mult poate autosens să modifice bazalele, cât de jos poate modifica ISF și cât de jos poate pune ținta glicemiei.Valoare implicită: 0.7\nCealaltă parte a limitelor autosens, care limitează cât de jos poate ajusta bazalele și cât de mult poate mări ISF și țintele de glicemie.
+ Autosens ajustează si target-urileValoare implicită: adevărat\nAceasta se folosește pentru a permite autosens să ajusteze țintele de glicemie, pe lângă modificările asupra ISF și bazalelor.Valoare implicită: 2\nAmânarea bolusului este aplicată după ce ați făcut un bolus de masă, astfel încât bucla să nu reacționeze cu ținte bazale temporare scăzute atunci când tocmai ați mâncat. Exemplul de față și valoarea implicită sunt 2; astfel o durată de acțiune a insulinei (DIA) de 3 ore duce la o eliminare treptată a întârzierii setării bazalelor temporare după 1.5 ore (3DIA/2).Valoarea implicită: 3.0 (AMA) sau 8.0 (SMB). Aceasta este o setare pentru impactul implicit al carbohidraţilor pe 5 minute. Valoarea implicită este 3mg/dl la 5min. Aceasta influenţează rapiditatea cu care se scade COB şi modul în care se ia în calcul absorbţia carbohidraţilor în calcularea valorilor estimate ale glicemiei, atunci când glicemia este în scădere mai mare decât se aştepta sau nu creşte atât de repede pe cât se aştepta.
@@ -363,6 +397,7 @@
Arată IOB detaliatSepară IOB în bolus și IOB bazal pe ceasfără succes - verificați telefonul
+ indisponibilVârsta pacientuluiCopilAdolescent
@@ -370,6 +405,8 @@
Adult rezistent la insulinăVă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranțăNumele pacientului
+ Vă rugăm să furnizați numele sau porecla pacientului pentru a diferenția între configurări
+ UtilizatorGlimp%1$s necesită excluderea din lista de optimizare a bateriei pentru o funcționare corespunzătoareBuclă suspendată
@@ -404,10 +441,26 @@
Activează superbolus în asistentActivează funcționalitatea de superbolus în asistentul de buclă. Nu activați până nu înțelegeți ce face cu adevărat. DACĂ ESTE FOLOSIT ÎN NECUNOȘTINȚĂ DE CAUZĂ POATE DUCE LA SUPRADOZĂ DE INSULINĂ!Afișați indicatorii luminoși ai pompei pe ecranul de start
+ Prag de avertizare timp de utilizare canulă [h]
+ Prag critic timp de utilizare canulă [h]
+ Prag de avertizare vechime insulină [h]
+ Prag critic vechime insulină [h]
+ Prag de avertizare vechime senzor [h]
+ Prag critic vechime senzor [h]
+ Prag de avertizare nivel baterie [h]
+ Prag critic nivel baterie [h]Pragul de avertisment pentru insulina din rezervor [U]Pragul critic al nivelului insulinei în rezervor [U]
+ Pragul de avertizare nivel baterie [%]
+ Pragul critic al nivelului baterie [%]
+ PREDIOBCOB
+ R_BAZ
+ DEV
+ ACT
+ ABS
+ DEVSLOPEDespreLipsesc permisiunile de SMSNu este acordată permisiunea de citire a stării telefonului
@@ -422,8 +475,11 @@
Vechime senzorVechime canulăVechime insulină
+ Schimbă profilulVechime baterie pompăOpțiuni alarmare
+ Creare notificări din alarmele NS
+ Creare notificări din anunţurile NSPrag vechime date [min]Prag date mult prea vechi [min]Interval pentru autosens [o]
@@ -504,6 +560,7 @@
Alarmează dacă nu se primesc glicemiiSe alertează dacă pompa este indisponibilăPrag pompă indisponibilă [min]
+ Alertează dacă sunt necesari carbohidrațiAlarmă urgentăINFOAplicația Eversense (modificată)
@@ -511,7 +568,13 @@
Setări înregistrare glicemieArată variație detaliatăArată variație cu încă o zecimală
+ Cât de des se vor administra SMB în min
+ SMB maxim minuteMax minute de bazală la care să se limiteze SMB
+ UAM SMB maxim minute
+ Durata maxima (în minute) a bazalei pentru a limita SMB în cazul UAM
+ Numărul minim de carbohidrați solicitați în Sugestii
+ Numărul minim de carbohidrați pentru a afișa o alertă-sugestie. Sugestiile de carbohidrați mai jos acest număr nu vor declanșa o notificare.Trimite date glicemie la xDrip+Selectați 640g/Eversense ca sursă de date în xDrip+Glicemie NSClient
@@ -570,6 +633,8 @@
Eroare de livrare a bolusului extinsObiectivîn trecut
+ Setați bazale temporare neutre
+ Dacă este activată, va anula o bazală temporară înainte de sfârșitul fiecărei ore. Aceasta metoda poate ajuta la oprirea vibrațiilor/bipurilor orare pe anumite pompe.Activează SMB întotdeaunaActivează SMB întotdeauna independent de bolusuri. Este posibil doar în cazul unei surse de glicemii filtrate, cum ar fi G5Activează SMB după carbohidrați
@@ -589,11 +654,17 @@
Cantitatea de insulină de adăugat când se apasă butonulNu s-a putut deschide aplicația CGM. Asigurați-vă că este instalată.CGM
+ Ignorați 5min
+ Ignorați 15min
+ Ignorați 30min
+ reqVizualizare istoricNotifică despre SMBArată SMB pe ceas ca și un bolus standard.Crează anunțuri pentru erori
+ Crează anunțuri din alertele de cerere carbohidrațiCrează anunțuri în Nightscout pentru dialoguri de erori și alerte locale (vizibile și în Careportal - Tratamente)
+ Creează anunțuri Nightscout din alertele de cerere carbohidrațiArată previziunile pe ceas.PredicțiiAlegeri date
@@ -667,7 +738,7 @@
Pompă oprităPompă pornităPompă în pauză
- Timpul maxim de absorbție a mesei [o]
+ Timpul maxim de absorbție a mesei [h]Timpul în care orice mâncare se consideră absorbită. Carbohidrații rămași vor fi ignorați.TimpAfișează câmp pentru note în dialogurile de tratamente
@@ -722,6 +793,8 @@
Începeți primul obiectivPermisiuneSolicitați permisiunea
+ Aplicația are nevoie de permisiune la fereastra sistemului pentru a afișa notificări
+ Aplicația are nevoie sa acceseze locația pentru scanare Bluetooth și identificare WiFiAplicația necesită permisiune de acces la mediul de stocare pentru a putea înregistra jurnaleleCerințăConfigurați plugin insulină
@@ -739,6 +812,10 @@
= 100]]>Țintele temporare joase scad sensibilitatea
+ Rezistența la insulină poate coborî targetul
+ Când e detectata rezistență la insulină, coboară targetul
+ Sensibilitatea la insulină crește targetul
+ Când este detectată sensibilitate la insulină, crește targetulSetare pompă invalidă, verificați documentația și asigurați-vă că meniul Quick Info este denumit QUICK INFO, folosind aplicația 360 Configuration Software.PersonalizatAndroidAPS pornit curat
@@ -746,6 +823,7 @@
Atenție: Dacă activați și conectați o pompă fizică, AndroidAPS va copia setările bazalelor din profilurile din aplicație în pompă, suprascriindu-le pe cele existente deja în pompă. Asigurați-vă că aveți setările corecte ale bazalelor în AndroidAPS. Dacă aveți dubii sau nu doriți suprascrierea setărilor bazalelor existente în pompă, apăsați butonul de anulare și repetați acțiunea mai târziu.Date incomplete despre tratamentSetări de întreținere
+ Criptează setările exportateNr de loguri de trimisMentenanțăMENTN
@@ -787,6 +865,9 @@
Înregistrează alerteleActivează emularea RBTFolosește bolus extins în locul RBT pentru a trece de limita de 250%%
+ Dezactivează vibrațiile la livrarea manuală de bolus
+ Pentru bolus și bolus extins (valabil doar cu modelul Insight firmware 3.x)
+ Dezactivați vibrațiile la livrarea automată de bolusÎntârziere a deconectării [s]Număr de serieVersiunea de software
@@ -913,7 +994,7 @@
S-a detectat rularea unei versiuni invalide. Buclă dezactivată!versiune vecheversiune foarte veche
- 2o
+ 2hAplicația Dexcom (modificată)DXCMPrimește valori glicemie de la aplicația Dexcom modificată.
@@ -961,7 +1042,7 @@
Frecvență pompăÎntârziere până la pornirea bolusului (s)Bolusul maxim în pompă (U)
- Bazală maximă în pompă (U/o)
+ Bazală maximă în pompă (U/h)Criptare MedtronicUS & Canada (916 MHz)Globală (868 Mhz)
@@ -974,6 +1055,8 @@
Fără selecție (Afișare simplificată)Alcalină (Afișare extinsă)Litiu (Afișare extinsă)
+ NiZn (Afișare extinsă)
+ NiMH (Afișare extinsă)SCANSTOP
@@ -984,6 +1067,7 @@
ScaneazăScanare terminatăEroare la scanare: %1$d
+ NiciodatăSetăriIstoric
@@ -1101,33 +1185,149 @@
%1$d%%Asistent bolusaremin
+ Nume profil:
+ Selectat:Unități%1$dgPornitOprit
+ Nicio pompă selectată
+ DIA
+ IC
+ ISF
+ TARG
+ CloneazăŞtergeţi profilul curent?
+ ReordoneazăVârstă:Greutate:
+ ID:
+ Trimiteți
+ Valoare vârstă invalidă
+ Valoare greutate invalidă
+ %1$s: Hipo: %2$02d%% Normal: %3$02d%% Hiper: %4$02d%%]]>
+ Medie
+ Timp în țintă
+ StatisticiGlicemieInstrumente
+ Eveniment automatizare
+ Deja setat
+ Ștergeți coada? Toate datele din coadă vor fi pierdute!
+ Utilizarea unui bolus extins va opri modul buclă închisă pe timpul livrării bolusului extins. Sigur doriți acest lucru?
+ Bucla închisă dezactivată din cauza livrării bolusului extins
+ BE
+ \"Verificator de telefon\"
+ Meniu diagramă
+ AS
+ Timp solicitare SMB
+ Timp de execuţie SMB
+ Timp solicitare bazală temporară
+ Timpul de execuție al bazalei temporare
+ Alerte pompă Insight
+ de la aplicația Authenticator pentru: %1$s
+ Activare Authenticator
+ Autentificați comenzile folosind o parolă unica generată de Google Authenticator sau alte aplicații 2FA similare.
+ PIN adițional la sfârșitul token-ului
+ Cifre suplimentare care ar trebui să fie memorate și adăugate la sfârșitul fiecărei parole unice generate
+ Setare Authenticator
+ Parola unică pentru verificare:
+ Resetați Authenticatori
+ Resetați cheia pentru Authenticator
+ Sunteți sigur că vreți sa resetați cheia pentru Authenticator? Acest lucru va invalida toți Authenticatorii configurați și va trebui să ii setați din nou.
+ S-a generat o nouă cheie pentru Authenticator! Vă rugăm să utilizați QRCode actualizat pentru a configura autentificatori.
+ 1. Instalați Authenticator
+ 2. Scanați codul pentru a seta codurile unice pentru AndroidAPS
+ 3. Testați o parolă unică
+ Resetați Authenticatori
+ Pe fiecare telefon urmăritor instalați o aplicație de tip Authenticator care suporta tokens RFC 6238 TOTP. Asemenea aplicații gratuite populare sunt:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator
+ NU DISTRIBUIȚI acest cod online!\nUtilizaţi-l doar pentru a seta aplicația Authenticator pe telefoanele urmăritoare.
+ Prin resetarea autentificatorului invalidați toți autentificatorii existenți. Va trebui să îi configurați din nou!
+ La conectare
+ La deconectare
+ Predicții
+ Panta deviaţiei
+ Autorizarea a eșuat
+ Insulină totală
+ Parola master (principală) este folosită pentru criptarea copiilor de rezervă și pentru a suprascrie securitatea în aplicație. Rețineți-o sau păstrați-o într-un loc sigur.
+ Parolele nu coincid
+ Parola principală curentă
+ Lumini de stare
+ Copiați setările din NS
+ Copiaţi setările NS (dacă există)?
+ Tema originală
+ Butoanele sunt afișate întotdeauna în partea de jos a ecranului
+ Display mare
+ Tema
+ Integrare pompa pentru Omnipod, necesită dispozitivul RileyLink (cu versiune firmware de cel puțin 2.0).
+ Bip pentru Bolus Activat
+ Bip pentru Bazală Activat
+ Bip pentru SMB ActivatPod Mgmt
+ Status Pod%1$.2f U rămasePeste 50 U
+ Adresă Pod
+ Pod-ul expiră
+ Nu există informații
+ Niciun Pod conectat
+ Neiniţializat
+ Alerte de confirmare
+ Omnipod (433.91 MHz)
+ Niciun Pod activ.
+ Verificarea comenzii a eşuat.
+ Gestionare PodInițializare PodDezactivare PodResetare PodIstoric Pod
+ Setează bolusul
+ Anulați Bolus
+ Setează bazala temporară
+ Obțineți Status Pod
+ Obțineți Informații Pod
+ Setare timpConfigurare alerteConfirmare alerte
+ Suspendați Livrarea
+ Reluați livrarea
+ Intrare necunoscută
+ %1$.1f U
+ %1$.1f U, CH=%2$.1f g
+ Rata: %1$.1f U, Durata: %2$d min
+ Dacă apăsați OK, statusul Pod-ului va fi resetat forțat şi nu veți mai putea comunica cu Pod-ul. Faceți acest lucru numai dacă nu mai puteți comunica deloc cu Pod-ul. Daca mai puteți comunica cu Pod-ul, va rugam sa folosiți opțiunea Dezactivare Pod.
+ Istoricul Pod-ului nu este disponibil momentan.
+ Umpleţi Pod-ul
+ \nUmpleți noul Pod cu suficientă insulină pentru 3 zile.\n\nAr trebui sa auziți două bipuri de la Pod în timpul procesului de umplere. Acestea indică faptul că, cantitatea minimă de 85U a fost introdusă. Asigurați-vă ca ați golit complet seringa de umplere, chiar și după ce ați auzit două bipuri.\n\nDupă umplerea Pod-ului, vă rugăm să apăsați Următorul.\n\nNotă: Nu scoateți capacul transparent al acului in acest moment.Amorsare
+ Încercare de împerechere cu noul Pod și amorsare.\n\nAtunci când toate etapele sunt gata, puteți apăsa Următorul.\n\nNotă: vă rugăm să țineți Pod-ul foarte aproape de RileyLink în timpul procesului.
+ Atașați Pod-ul
+ \nPregătiți setul de infuzie. Scoateți capacul acului și suport adeziv și atașați Pod-ul la locul de infuzie.\n\nDacă, canula pare in neregulă, apăsați Anulare și aruncați Pod-ul.\n\nApăsați Următorul pentru a introduce canula și a începe livrarea bazalei.
+ Inserare canulă
+ Încercare de programare inițială a ratelor bazale si de insertie a canulei.\n\nCând toate elementele sunt gata, puteți apăsa Următorul.
+ Informații Pod
+ \nPod-ul este acum activ.\n\nRatele bazale au fost programate și canula a fost introdusă.\n\nVă rugăm să verificați că acul a fost introdus corect. Dacă considerați ca nu, înlocuiți Pod-ul.
+ Dezactivare Pod
+ Dezactivare Pod
+ Împerechere Pod
+ Amorsare Pod
+ Umplere Canulă
+ Setează profilul bazalelor
+ Anulare livrare
+ Dezactivare Pod
+ Integrare cu pompa pentru Omnipod Dash.
+ Pod-ul va expira în curând
+ Pod-ul va expira în curând
+ Oprirea este iminentă
+ Alertă necunoscută
diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml
index 1a5f1a6a56..5e2010173c 100644
--- a/app/src/main/res/values-ru-rRU/strings.xml
+++ b/app/src/main/res/values-ru-rRU/strings.xml
@@ -6,8 +6,8 @@
Безопасность терапииМакс разрешенный болюс [U] ед.
- макс разрешенные углеводы (г)
- опции
+ Макс разрешенные углеводы (г)
+ НастройкиСинхронизировать назначения с NSобнулить базыВы действительно хотите обнулить базы данных?
@@ -1239,6 +1239,7 @@ Context | Edit Context
ОпросНекорректное значение возрастНекорректное значение вес
+ Некорректный ввод %%1$s: Низкий: %2$02d%% В целевом диапазоне: %3$02d%% Высокий: %4$02d%%]]>СреднийВремя в целевом диапазоне TIR
@@ -1407,4 +1408,15 @@ Context | Edit Context
Не удалось проверить правильность подачи болюса. Убедитесь, что Pod подает болюс или отмените его.Статистика RLЖурнал Pulse
+ Сравнить профили
+ Помощник профиля
+ Профиль по умолчанию
+ Текущий профиль
+ Доступные профили
+ Тип профиля
+ Возраст: %1$.0f Суточная Потребность: %2$.0f ед
+ Возраст: %1$.0f Суточная Потребность: %2$.0f ед %3$d%%
+ Возраст: %1$.0f Вес: %2$.0f кг
+ % базального
+ Значение для профиля по умолчанию
diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml
index f9ca56d06f..cc194deba5 100644
--- a/app/src/main/res/values-sk-rSK/strings.xml
+++ b/app/src/main/res/values-sk-rSK/strings.xml
@@ -1223,7 +1223,7 @@
KlonovaťNajskôr uložte, alebo resetujte aktuálne zmenyZmazať aktuálny profil?
- Chcete vytvoriť nový lokálny profil z tohto prepnutia profilu?
+ Vytvoriť z tohoto profilu nový lokálny profil?Názov profilu obsahuje bodky.\nToto nie je podporované v NS.\nProfil nebude prenesený do NS.Spodná hodnota v oblasti cieľového rozsahu (iba zobrazovanie)Horná hodnota v oblasti cieľového rozsahu (iba zobrazovanie)
@@ -1405,4 +1405,12 @@
Nie je možné overiť, či bolo podávanie bolusu úspešné. Prosím overte, že váš Pod podáva bolus, alebo zrušte bolus.Štatistiky RLPulse Log
+ Porovnať profily
+ Pomocník s profilom
+ Predvolený profil
+ Aktuálny profil
+ Dostupný profil
+ Typ profilu
+ Vek: %1$.0f CDD: %2$.0f U
+ Vek: %1$.0f Hmotnosť: %2$.0f kg
diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml
index b039d62802..9865cdb1e5 100644
--- a/app/src/main/res/values-sv-rSE/strings.xml
+++ b/app/src/main/res/values-sv-rSE/strings.xml
@@ -1224,7 +1224,6 @@ Eversense-appen.
KopieraSpara eller återställa aktuella ändringar förstTa bort aktuell profil?
- Vill du skapa en ny lokal profil från detta profilbyte?Profilnamnet innehåller punkter.\nDetta stöds inte av NS.\nProfil överförs inte till NS.Nedre värdet för målområde (endast visning)Övre värdet för målområde (endast visning)
@@ -1406,6 +1405,5 @@ Eversense-appen.
Det går inte att verifiera om bolusen är slutförd. Verifiera att din pod leverarar bolus eller avsluta bolus.RL-statistikPulslogg
- Jämför med aktuell profilProfilguide
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 79231b59fc..acfb3d2760 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -206,6 +206,8 @@
You will be asked for master password, which is needed to decrypt imported preferences.Export canceled! Preferences were NOT exported!Import canceled! Preferences were NOT imported!
+ Cannot import preferences!
+ Please go back to main screen and try again.Select file to import
@@ -807,7 +809,7 @@
Do not bolus, record onlyCategorySubcategory
- Bolus will be recorded only
+ Bolus will be recorded only (not delivered by pump)Autobackfill missig BGs from NSns_autobackfillSMB set by pump
@@ -950,7 +952,7 @@
Ask for permissionApplication needs system window permission for notificationsApplication needs location permission for BT scan and WiFi identification
- Application needs storage permission to be able store log files
+ Application needs storage permission to be able store log files and export settingsRequestConfigure Insulin pluginExit
@@ -1298,7 +1300,7 @@
CloneSave or reset current changes firstDelete current profile?
- Create new local profile from this profile switch?
+ Create new local profile from this profile?Profile name contains dots.\nThis is not supported by NS.\nProfile is not uploaded to NS.Lower value of in range area (display only)Higher value of in range area (display only)
@@ -1313,6 +1315,7 @@
SurveyInvalid age entryInvalid weight entry
+ Invalid % entry%1$s: Low: %2$02d%% In: %3$02d%% High: %4$02d%%]]>AverageTIR
@@ -1552,7 +1555,16 @@
Unable to verify whether the bolus succeeded. Please verify that your Pod is bolusing or cancel the bolus.RL StatsPulse Log
- Compare with current profile
+ Compare profilesProfile helper
+ Default profile
+ Current profile
+ Available profile
+ Profile type
+ Age: %1$.0f TDD: %2$.0f U
+ Age: %1$.0f TDD: %2$.0f U %3$d%%
+ Age: %1$.0f Weight: %2$.0f kg
+ % of basal
+ DPV Default profile
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index cd9e3d509c..29f4ef5bc7 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -83,5 +83,5 @@
1dp
-
+
diff --git a/app/src/test/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileTest.kt b/app/src/test/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileTest.kt
index d2afc0d5f3..e97e63bafa 100644
--- a/app/src/test/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileTest.kt
+++ b/app/src/test/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileTest.kt
@@ -13,18 +13,18 @@ class DefaultProfileTest : TestBase() {
@Test
fun profile() {
- var p = DefaultProfile(injector).profile(5.0, 5.1 / 0.3, 0.0, Constants.MGDL)
- assertEquals(0.150, p.getBasalTimeFromMidnight(0), 0.001)
+ var p = DefaultProfile(injector).profile(5.0, 5.1 / 0.3, 0.0, Constants.MMOL)
+ assertEquals(0.150, p!!.getBasalTimeFromMidnight(0), 0.001)
assertEquals(15.0, p.getIcTimeFromMidnight(0), 0.001)
assertEquals(11.8, p.getIsfTimeFromMidnight(0), 0.001)
- p = DefaultProfile(injector).profile(7.0, 10.0 / 0.4, 0.0, Constants.MGDL)
- assertEquals(0.350, p.getBasalTimeFromMidnight(0), 0.001)
+ p = DefaultProfile(injector).profile(7.0, 10.0 / 0.4, 0.0, Constants.MMOL)
+ assertEquals(0.350, p!!.getBasalTimeFromMidnight(0), 0.001)
assertEquals(15.0, p.getIcTimeFromMidnight(0), 0.001)
assertEquals(6.8, p.getIsfTimeFromMidnight(0), 0.001)
- p = DefaultProfile(injector).profile(12.0, 25.0 / 0.5, 0.0, Constants.MGDL)
- assertEquals(0.80, p.getBasalTimeFromMidnight(0), 0.001)
+ p = DefaultProfile(injector).profile(12.0, 25.0 / 0.5, 0.0, Constants.MMOL)
+ assertEquals(0.80, p!!.getBasalTimeFromMidnight(0), 0.001)
assertEquals(10.0, p.getIcTimeFromMidnight(0), 0.001)
assertEquals(2.2, p.getIsfTimeFromMidnight(0), 0.001)
}
diff --git a/build.gradle b/build.gradle
index acf667df6d..89449cca58 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,6 +12,7 @@ buildscript {
dagger_version = '2.28.1'
coroutinesVersion = '1.3.7'
activityVersion = '1.2.0-alpha06'
+ fragmentVersion = '1.3.0-alpha07'
ormLiteVersion = "4.46"
}
repositories {
diff --git a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
index ecab21784c..f1a0375d2a 100644
--- a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
+++ b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfile.kt
@@ -17,7 +17,7 @@ class DefaultProfile @Inject constructor(val injector: HasAndroidInjector) {
var twelveToSeventeen: TreeMap> = TreeMap()
var eighteenToTwentyfor: TreeMap> = TreeMap()
- fun profile(age: Double, tdd: Double, weight: Double, units: String): Profile {
+ fun profile(age: Double, tdd: Double, weight: Double, units: String): Profile? {
val profile = JSONObject()
if (age >= 1 && age < 6) {
val _tdd = if (tdd == 0.0) 0.6 * weight else tdd
@@ -25,23 +25,23 @@ class DefaultProfile @Inject constructor(val injector: HasAndroidInjector) {
val ic = Round.roundTo(250.0 / _tdd, 1.0)
profile.put("carbratio", singleValueArray(ic, arrayOf(0.0, -4.0, -1.0, -2.0, -4.0, 0.0, -4.0)))
val isf = Round.roundTo(200.0 / _tdd, 0.1)
- profile.put("sens", singleValueArray(isf, arrayOf(0.0, -2.0, -0.0, -0.0, -2.0, 0.0, -2.0)))
+ profile.put("sens", singleValueArrayFromMmolToUnits(isf, arrayOf(0.0, -2.0, -0.0, -0.0, -2.0, 0.0, -2.0),units))
} else if (age >= 6 && age < 12) {
val _tdd = if (tdd == 0.0) 0.8 * weight else tdd
closest(sixToEleven, _tdd * 0.4)?.let { array -> profile.put("basal", arrayToJson(array)) }
val ic = Round.roundTo(375.0 / _tdd, 1.0)
profile.put("carbratio", singleValueArray(ic, arrayOf(0.0, -3.0, 0.0, -1.0, -3.0, 0.0, -2.0)))
val isf = Round.roundTo(170.0 / _tdd, 0.1)
- profile.put("sens", singleValueArray(isf, arrayOf(0.0, -1.0, -0.0, -0.0, -1.0, 0.0, -1.0)))
- } else if (age >= 12 && age < 17) {
+ profile.put("sens", singleValueArrayFromMmolToUnits(isf, arrayOf(0.0, -1.0, -0.0, -0.0, -1.0, 0.0, -1.0),units))
+ } else if (age >= 12 && age <= 18) {
val _tdd = if (tdd == 0.0) 1.0 * weight else tdd
closest(twelveToSeventeen, _tdd * 0.5)?.let { array -> profile.put("basal", arrayToJson(array)) }
val ic = Round.roundTo(500.0 / _tdd, 1.0)
profile.put("carbratio", singleValueArray(ic, arrayOf(0.0, -1.0, 0.0, 0.0, -1.0, 0.0, -1.0)))
val isf = Round.roundTo(100.0 / _tdd, 0.1)
- profile.put("sens", singleValueArray(isf, arrayOf(0.2, 0.0, 0.2, 0.2, 0.0, 0.2, 0.2)))
- } else if (age >= 18) {
-
+ profile.put("sens", singleValueArrayFromMmolToUnits(isf, arrayOf(0.2, 0.0, 0.2, 0.2, 0.0, 0.2, 0.2),units))
+ } else if (age > 18) {
+ return null
}
profile.put("dia", 5.0)
profile.put("carbs_hr", 20) // not used
@@ -49,6 +49,7 @@ class DefaultProfile @Inject constructor(val injector: HasAndroidInjector) {
profile.put("timezone", TimeZone.getDefault().getID())
profile.put("target_high", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
profile.put("target_low", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
+ profile.put("units", units)
return Profile(injector, profile, units)
}
@@ -130,20 +131,32 @@ class DefaultProfile @Inject constructor(val injector: HasAndroidInjector) {
val basals = JSONArray()
for (i in 0..23) {
val time = String.format(Locale.ENGLISH, "%02d:00", i)
- basals.put(JSONObject().put("time", time).put("value", b[i].toString()))
+ basals.put(JSONObject().put("time", time).put("value", b[i].toString()).put("timeAsSeconds", i * 3600))
}
return basals
}
private fun singleValueArray(value: Double, sample: Array): JSONArray {
val array = JSONArray()
- array.put(JSONObject().put("time", "00:00").put("value", value + sample[0]))
- array.put(JSONObject().put("time", "06:00").put("value", value + sample[1]))
- array.put(JSONObject().put("time", "09:00").put("value", value + sample[2]))
- array.put(JSONObject().put("time", "11:00").put("value", value + sample[3]))
- array.put(JSONObject().put("time", "14:00").put("value", value + sample[4]))
- array.put(JSONObject().put("time", "16:00").put("value", value + sample[5]))
- array.put(JSONObject().put("time", "19:00").put("value", value + sample[6]))
+ array.put(JSONObject().put("time", "00:00").put("value", value + sample[0]).put("timeAsSeconds", 0 * 3600))
+ array.put(JSONObject().put("time", "06:00").put("value", value + sample[1]).put("timeAsSeconds", 6 * 3600))
+ array.put(JSONObject().put("time", "09:00").put("value", value + sample[2]).put("timeAsSeconds", 9 * 3600))
+ array.put(JSONObject().put("time", "11:00").put("value", value + sample[3]).put("timeAsSeconds", 11 * 3600))
+ array.put(JSONObject().put("time", "14:00").put("value", value + sample[4]).put("timeAsSeconds", 14 * 3600))
+ array.put(JSONObject().put("time", "16:00").put("value", value + sample[5]).put("timeAsSeconds", 16 * 3600))
+ array.put(JSONObject().put("time", "19:00").put("value", value + sample[6]).put("timeAsSeconds", 19 * 3600))
+ return array
+ }
+
+ private fun singleValueArrayFromMmolToUnits(value: Double, sample: Array, units: String): JSONArray {
+ val array = JSONArray()
+ array.put(JSONObject().put("time", "00:00").put("value", Profile.fromMmolToUnits(value + sample[0],units)).put("timeAsSeconds", 0 * 3600))
+ array.put(JSONObject().put("time", "06:00").put("value", Profile.fromMmolToUnits(value + sample[1],units)).put("timeAsSeconds", 6 * 3600))
+ array.put(JSONObject().put("time", "09:00").put("value", Profile.fromMmolToUnits(value + sample[2],units)).put("timeAsSeconds", 9 * 3600))
+ array.put(JSONObject().put("time", "11:00").put("value", Profile.fromMmolToUnits(value + sample[3],units)).put("timeAsSeconds", 11 * 3600))
+ array.put(JSONObject().put("time", "14:00").put("value", Profile.fromMmolToUnits(value + sample[4],units)).put("timeAsSeconds", 14 * 3600))
+ array.put(JSONObject().put("time", "16:00").put("value", Profile.fromMmolToUnits(value + sample[5],units)).put("timeAsSeconds", 16 * 3600))
+ array.put(JSONObject().put("time", "19:00").put("value", Profile.fromMmolToUnits(value + sample[6],units)).put("timeAsSeconds", 19 * 3600))
return array
}
}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt
new file mode 100644
index 0000000000..18195f9f8a
--- /dev/null
+++ b/core/src/main/java/info/nightscout/androidaps/data/defaultProfile/DefaultProfileDPV.kt
@@ -0,0 +1,67 @@
+package info.nightscout.androidaps.data.defaultProfile
+
+import dagger.android.HasAndroidInjector
+import info.nightscout.androidaps.data.Profile
+import info.nightscout.androidaps.utils.Round
+import org.json.JSONArray
+import org.json.JSONObject
+import java.util.*
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class DefaultProfileDPV @Inject constructor(val injector: HasAndroidInjector) {
+
+ var oneToFive = arrayOf(3.97, 3.61, 3.46, 3.70, 3.76, 3.87, 4.18, 4.01, 3.76, 3.54, 3.15, 2.80, 2.86, 3.21, 3.61, 3.97, 4.43, 4.96, 5.10, 5.50, 5.81, 6.14, 5.52, 5.10)
+ var sixToEleven = arrayOf(4.20, 4.27, 4.41, 4.62, 4.92, 5.09, 5.01, 4.47, 3.89, 3.33, 3.10, 2.91, 2.97, 3.08, 3.36, 3.93, 4.52, 4.76, 4.69, 4.63, 4.63, 4.47, 4.47, 4.31)
+ var twelveToEighteen = arrayOf(3.47, 3.80, 4.31, 4.95, 5.59, 6.11, 5.89, 5.11, 4.31, 3.78, 3.55, 3.39, 3.35, 3.39, 3.64, 3.97, 4.53, 4.59, 4.50, 4.00, 3.69, 3.39, 3.35, 3.35)
+
+ fun profile(age: Double, tdd: Double, basalSumPct: Double, units: String): Profile? {
+ val basalSum = tdd * basalSumPct
+ val profile = JSONObject()
+ if (age >= 1 && age < 6) {
+ profile.put("basal", arrayToJson(oneToFive, basalSum))
+ profile.put("carbratio", singleValueArray(0.0))
+ profile.put("sens", singleValueArrayFromMmolToUnits(0.0, units))
+ } else if (age >= 6 && age < 12) {
+ profile.put("basal", arrayToJson(sixToEleven, basalSum))
+ profile.put("carbratio", singleValueArray(0.0))
+ profile.put("sens", singleValueArrayFromMmolToUnits(0.0, units))
+ } else if (age >= 12 && age <= 18) {
+ profile.put("basal", arrayToJson(twelveToEighteen, basalSum))
+ profile.put("carbratio", singleValueArray(0.0))
+ profile.put("sens", singleValueArrayFromMmolToUnits(0.0, units))
+ } else if (age > 18) {
+ return null
+ }
+ profile.put("dia", 5.0)
+ profile.put("carbs_hr", 20) // not used
+ profile.put("delay", 5.0) // not used
+ profile.put("timezone", TimeZone.getDefault().getID())
+ profile.put("target_high", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
+ profile.put("target_low", JSONArray().put(JSONObject().put("time", "00:00").put("value", Profile.fromMgdlToUnits(108.0, units))))
+ profile.put("units", units)
+ return Profile(injector, profile, units)
+ }
+
+ private fun arrayToJson(b: Array, basalSum: Double): JSONArray {
+ val basals = JSONArray()
+ for (i in 0..23) {
+ val time = String.format(Locale.ENGLISH, "%02d:00", i)
+ basals.put(JSONObject().put("time", time).put("value", (b[i] * basalSum / 100.0).toString()).put("timeAsSeconds", i * 3600))
+ }
+ return basals
+ }
+
+ private fun singleValueArray(value: Double): JSONArray {
+ val array = JSONArray()
+ array.put(JSONObject().put("time", "00:00").put("value", value).put("timeAsSeconds", 0 * 3600))
+ return array
+ }
+
+ private fun singleValueArrayFromMmolToUnits(value: Double, units: String): JSONArray {
+ val array = JSONArray()
+ array.put(JSONObject().put("time", "00:00").put("value", Profile.fromMmolToUnits(value, units)).put("timeAsSeconds", 0 * 3600))
+ return array
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/core/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java
index 1300d0bbf9..80a72ada37 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java
@@ -88,6 +88,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
}
public CareportalEvent(NSMbg mbg) {
+ this();
date = mbg.date;
eventType = MBG;
json = mbg.json;
diff --git a/core/src/main/java/info/nightscout/androidaps/db/TDD.java b/core/src/main/java/info/nightscout/androidaps/db/TDD.java
index 5717abec74..f023c06f7f 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/TDD.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/TDD.java
@@ -59,15 +59,15 @@ public class TDD {
public String toText(ResourceHelper resourceHelper, DateUtil dateUtil, boolean includeCarbs) {
if (includeCarbs)
- return resourceHelper.gs(R.string.tddwithcarbsformat, dateUtil.dateStringShort(date), total, bolus, basal, carbs);
+ return resourceHelper.gs(R.string.tddwithcarbsformat, dateUtil.dateStringShort(date), total, bolus, basal, basal / total * 100, carbs);
else
- return resourceHelper.gs(R.string.tddformat, dateUtil.dateStringShort(date), total, bolus, basal);
+ return resourceHelper.gs(R.string.tddformat, dateUtil.dateStringShort(date), total, bolus, basal, basal / total * 100);
}
public String toText(ResourceHelper resourceHelper, int days, boolean includeCarbs) {
if (includeCarbs)
- return resourceHelper.gs(R.string.tddwithcarbsformat, String.format(Locale.getDefault(), "%d ", days) + resourceHelper.gs(R.string.days), total, bolus, basal, carbs);
+ return resourceHelper.gs(R.string.tddwithcarbsformat, String.format(Locale.getDefault(), "%d ", days) + resourceHelper.gs(R.string.days), total, bolus, basal, basal / total * 100, carbs);
else
- return resourceHelper.gs(R.string.tddformat, String.format(Locale.getDefault(), "%d ", days) + resourceHelper.gs(R.string.days), total, bolus, basal);
+ return resourceHelper.gs(R.string.tddformat, String.format(Locale.getDefault(), "%d ", days) + resourceHelper.gs(R.string.days), total, bolus, basal, basal / total * 100);
}
}
diff --git a/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
index d4f89fdd7e..660ec0ad0a 100644
--- a/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
+++ b/core/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
@@ -395,7 +395,7 @@ public class TemporaryBasal implements Interval, DbObjectBase {
if (isFakeExtended) {
return (int) ((profile.getBasal(time) + netExtendedRate) / profile.getBasal(time)) * 100;
} else if (isAbsolute) {
- return (int) (absoluteRate / profile.getBasal(time)) * 100;
+ return (int) (absoluteRate / profile.getBasal(time) * 100);
} else {
return percentRate;
}
diff --git a/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt b/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
index 75708b76ae..45feff463c 100644
--- a/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
+++ b/core/src/main/java/info/nightscout/androidaps/dialogs/ProfileViewerDialog.kt
@@ -97,6 +97,7 @@ class ProfileViewerDialog : DaggerDialogFragment() {
profile = Profile(injector, JSONObject(customProfileJson), customProfileUnits)
profile2 = Profile(injector, JSONObject(customProfileJson2), customProfileUnits)
profileName = customProfileName
+ header_icon.setImageResource(R.drawable.ic_compare_profiles)
date = ""
profileview_datelayout.visibility = View.GONE
}
@@ -117,12 +118,13 @@ class ProfileViewerDialog : DaggerDialogFragment() {
profile2?.let { profile2 ->
profileview_units.text = profile1.units
profileview_dia.text = HtmlHelper.fromHtml(formatColors("", profile1.dia, profile1.dia, DecimalFormat("0.00"), resourceHelper.gs(R.string.shorthour)))
- profileview_activeprofile.text = profileName
+ val profileNames =profileName!!.split("\n").toTypedArray()
+ profileview_activeprofile.text = HtmlHelper.fromHtml(formatColors(profileNames[0], profileNames[1]))
profileview_date.text = date
profileview_ic.text = ics(profile1, profile2)
profileview_isf.text = isfs(profile1, profile2)
profileview_basal.text = basals(profile1, profile2)
- profileview_target.text = HtmlHelper.fromHtml(formatColors("", profile1.targetList + " ", profile2.targetList, ""))
+ profileview_target.text = HtmlHelper.fromHtml(formatColors("", profile1.targetList.replace("\n"," ") + " ", profile2.targetList.replace("\n"," "), ""))
basal_graph.show(profile1, profile2)
}
@@ -177,6 +179,13 @@ class ProfileViewerDialog : DaggerDialogFragment() {
return s
}
+ private fun formatColors(text1: String, text2: String): String {
+ var s = "$text1"
+ s += " "
+ s += "$text2"
+ return s
+ }
+
private fun basals(profile1: Profile, profile2: Profile): Spanned {
var prev1 = 0.0
var prev2 = 0.0
@@ -225,7 +234,7 @@ class ProfileViewerDialog : DaggerDialogFragment() {
val val1 = Profile.fromMgdlToUnits(profile1.getIsfMgdlTimeFromMidnight(hour * 60 * 60), profile1.units)
val val2 = Profile.fromMgdlToUnits(profile2.getIsfMgdlTimeFromMidnight(hour * 60 * 60), profile1.units)
if (val1 != prev1 || val2 != prev2) {
- s.append(formatColors(Profile.format_HH_MM(hour * 60 * 60), val1, val2, DecimalFormat("0.0"), resourceHelper.gs(R.string.profile_carbs_per_unit)))
+ s.append(formatColors(Profile.format_HH_MM(hour * 60 * 60), val1, val2, DecimalFormat("0.0"), profile1.units + resourceHelper.gs(R.string.profile_per_unit)))
s.append(" ")
}
prev1 = val1
diff --git a/core/src/main/res/drawable/ic_compare_profiles.xml b/core/src/main/res/drawable/ic_compare_profiles.xml
new file mode 100644
index 0000000000..d63aae66b2
--- /dev/null
+++ b/core/src/main/res/drawable/ic_compare_profiles.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/core/src/main/res/layout/dialog_profileviewer.xml b/core/src/main/res/layout/dialog_profileviewer.xml
index feec6a1163..914cc8e71b 100644
--- a/core/src/main/res/layout/dialog_profileviewer.xml
+++ b/core/src/main/res/layout/dialog_profileviewer.xml
@@ -21,9 +21,10 @@
android:padding="5dp">
diff --git a/core/src/main/res/values-bg-rBG/strings.xml b/core/src/main/res/values-bg-rBG/strings.xml
index 1dc39354e4..c5dd9b89d9 100644
--- a/core/src/main/res/values-bg-rBG/strings.xml
+++ b/core/src/main/res/values-bg-rBG/strings.xml
@@ -122,8 +122,6 @@
%1$dмин
- %1$s: ∑: %2$.2fЕ Бол: %3$.2fЕ Баз: %4$.2fЕ]]>
- %1$s: ∑: %2$.2fЕ Бол: %3$.2fЕ Баз: %4$.2fЕ Въгл: %5$.0fгр]]>Проверка на КЗИзвестие
diff --git a/core/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml
index df2937d30b..b43fd3aa13 100644
--- a/core/src/main/res/values-cs-rCZ/strings.xml
+++ b/core/src/main/res/values-cs-rCZ/strings.xml
@@ -122,6 +122,8 @@
%1$d minut
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Baz: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Baz: %4$.2fU(%5$.0f%%) Sach.: %6$.0fg]]>Kontrola glykémieOznámení
@@ -161,7 +163,7 @@
Čekání na výsledekSMB
- Požadováno %d g dodatečných sacharidů během %d minut
+ Požadováno dalších %d g sacharidů během %d minutStatistikyKumulativní CDD
diff --git a/core/src/main/res/values-de-rDE/strings.xml b/core/src/main/res/values-de-rDE/strings.xml
index 98874eda3d..36897e9551 100644
--- a/core/src/main/res/values-de-rDE/strings.xml
+++ b/core/src/main/res/values-de-rDE/strings.xml
@@ -122,8 +122,8 @@
%1$d Min.
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU]]>
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU KH: %5$.0fg]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fIE(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fIE(%5$.0f%%) KH: %6$.0fg]]>BZ-TestAnkündigung
diff --git a/core/src/main/res/values-fr-rFR/strings.xml b/core/src/main/res/values-fr-rFR/strings.xml
index 3f526625f6..969fa4cf78 100644
--- a/core/src/main/res/values-fr-rFR/strings.xml
+++ b/core/src/main/res/values-fr-rFR/strings.xml
@@ -122,6 +122,8 @@
%1$dmin
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%) Gluc.: %6$.0fg]]>Contrôle GlycémieNotification
diff --git a/core/src/main/res/values-it-rIT/strings.xml b/core/src/main/res/values-it-rIT/strings.xml
index 6c6a2fa917..2f1699b202 100644
--- a/core/src/main/res/values-it-rIT/strings.xml
+++ b/core/src/main/res/values-it-rIT/strings.xml
@@ -122,6 +122,8 @@
%1$dmin
+ %1$s: ∑: %2$.2fU Boli: %3$.2fU Bas: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Boli: %3$.2fU Bas: %4$.2fU(%5$.0f%%) CHO: %6$.0fg]]>Controllo BGAvviso
diff --git a/core/src/main/res/values-lt-rLT/strings.xml b/core/src/main/res/values-lt-rLT/strings.xml
index 543eb2f728..8ea2f2ec90 100644
--- a/core/src/main/res/values-lt-rLT/strings.xml
+++ b/core/src/main/res/values-lt-rLT/strings.xml
@@ -122,8 +122,8 @@
%1$dmin
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Baz: %4$.2fU]]>
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Baz: %4$.2fU AV: %5$.0fg]]>
+ %1$s: ∑: %2$.2fU Boluso: %3$.2fU Bazės: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Boluso: %3$.2fU Bazės: %4$.2fU(%5$.0f%%) AV: %6$.0fg]]>KG testasPranešimas
diff --git a/core/src/main/res/values-pl-rPL/strings.xml b/core/src/main/res/values-pl-rPL/strings.xml
index 7693dc81f4..1973c05caa 100644
--- a/core/src/main/res/values-pl-rPL/strings.xml
+++ b/core/src/main/res/values-pl-rPL/strings.xml
@@ -20,6 +20,7 @@
AndroidAPS uruchomiony%1$.2fU%1$.0f / %2$d U
+ %1$.2fJ/g%1$.2f h%1$d min.%1$dm
@@ -38,10 +39,61 @@
NIE USTAWIONO PROFILUDataJednostki
+ DIA
+ IC
+ ISF
+ Baza
+ Cel
+ Inicjuje ...
+ Numer seryjny
+ Bateria
+ Ostatnie połączenie
+ Ostatni bolus
+ Jednostki dzienne
+ Podstawowa dawka bazowa
+ Baza tymczasowa
+ Bolus Przedłużony
+ Zbiornik
+ Historia pompy
+ Zobacz profil
+ Typ zdarzenia
+ mg/dl
+ mmol/l
+ Ustawienia zaawansowane
+ Bluetooth
+ BT Watchdog
+ Wyłącza bluetooth telefonu na jedną sekundę, jeśli nie jest możliwe połączenie z pompą. Może to pomóc w niektórych telefonach, w których blokuje się bluetooth.
+ Ograniczam maks. dawkę bazową do %1$.2f U/h z uwagi na %2$s
+ ograniczenie pompy
+ Ograniczam maksymalną wartość w procentach do %1$d%% z uwagi na %2$s
+ wartość musi być dodatnia
+ Ograniczam bolus do %1$.1f U z uwagi na %2$s
+ Pompa nie zainicjowana, profil nie ustawiony!
+ Potwierdzenie
+ Wiadomość
+ OK
+ Anuluj
+ ODRZUĆ
+ Bluetooth Low Energy nie jest obsługiwany.
+ Bluetooth nie jest włączony.
+ Lokalizacja nie jest włączona
+ Aby uruchomić odnajdywanie Bluetooth na nowszych urządzeniach, lokalizacja musi być uruchomiona. AAPS nie śledzi twojej lokalizacji więc po udanym parowaniu urządzenia Bluetooth można wyłączyć lokalizację.
+ %1$dmin temu
+ %1$.1fh temu
+ h
+ dni
+ godzin
+ sekunda
+ minuta
+ godzina
+ dzień
+ tydzień
+ sekund
+ minutgodzindnitygodni
@@ -68,6 +120,7 @@
Nieprawidłowy profil: %1$s
+ %1$dminSprawdź BG
@@ -101,7 +154,28 @@
WykonaneKomentarzSukces
+ Procent
+ Całkowity
+ Insulina
+ U
+ Oczekiwanie na wynik
+ SMB
+ Zalecane podanie %dg węglowodanów w przeciągu %d minut
+ Statystyki
+ Kumulatywna TDD (dawka dzienna)
+ Ważona wykładniczo TDD
+ Baza
+ Bolus
+ TDD
+ Stosunek
+ # Dni
+ Waga
+ Możliwa niedokładność jeśli używasz bolusów do wypełnień!
+ Stare dane, naciśnij \"RELOAD\"
+ Suma dzienna bazy (TBB)
+ TBB * 2
+ Wykrywanie czasu
diff --git a/core/src/main/res/values-pt-rPT/strings.xml b/core/src/main/res/values-pt-rPT/strings.xml
index 6695a167f1..6f9016efbb 100644
--- a/core/src/main/res/values-pt-rPT/strings.xml
+++ b/core/src/main/res/values-pt-rPT/strings.xml
@@ -122,8 +122,8 @@
%1$dmin
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU]]>
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU Hidratos: %5$.0fg]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%) Hidratos: %6$.0fg]]>Verificar GlicAnúncio
diff --git a/core/src/main/res/values-ro-rRO/strings.xml b/core/src/main/res/values-ro-rRO/strings.xml
index aa06e80fd8..dd088ac088 100644
--- a/core/src/main/res/values-ro-rRO/strings.xml
+++ b/core/src/main/res/values-ro-rRO/strings.xml
@@ -2,16 +2,40 @@
Eroare
+ Nesetată
+ Profilul bazalei a fost modificat în pompă
+ Date de intrare incorecte
+ Eroare la livrare bazală temporară
+ Se așteaptă pompa
+ Conectat de %1$d s
+ Se livrează %1$.2fUSe conecteazăConectatDeconectatSe deconectează
+ AndroidAPS a pornit%1$.2fU%1$.0f / %2$d U
+ %1$.2fU/h
+ %1$.2f h
+ %1$d min
+ %1$dm
+ Pompa face altă acțiune
+ Eroare de conexiune cu pompa
+ Ați atins limita permisă
+ ObiectiveÎnchideAșteptați…Reîncărcare
+ STOP APĂSATStop
+ Profil invalid!!!
+ NICIUN PROFIL SETAT
+ Data
+ Unități
+ DIA
+ IC
+ ISFBazalăȚintăInițializare...
@@ -19,14 +43,34 @@
BaterieUltima conexiuneUltimul bolus
+ Bazală temporară
+ Bolus extins
+ Rezervor
+ Istoric pompă
+ Afișează profilul
+ Tip eveniment
+ mg/dl
+ mmol/l
+ Setări avansate
+ Bluetooth
+ limită pompă
+ trebuie să fie o valoare pozitivă
+ Se limitează bolusul la %1$.1f U datorită %2$s
+ Pompa nu este inițializată, profilul nu este setat!ConfirmareMesajOKRenunță
+ RENUNȚĂ
+ Bluetooth-ul este dezactivat.
+ Localizarea este dezactivată
+ acum %1$dmin
+ %1$.1f h în urmă
+ hzileoresecundă
@@ -43,29 +87,61 @@
z/U
+ U/hg/U
+ Niciun profil selectat
+ Lasă să funcționeze bazala temporarăDuratăMotiv
+ Profil invalid: %1$s
+ %1$dmin
+ Verificare glicemieAnunțNotăÎntrebareActivitate fizicăSchimbare loc pompă
+ Inserare senzor
+ Start senzor
+ Schimbare cartuș insulină
+ Bolus de corecție
+ Start bazală temporară
+ Sfârșit bazală temporară
+ Corecție de carbohidrați
+ Schimbare baterie pompă
+ Ţintă temporară
+ Deget
+ Senzor
+ Manual
+ necunoscută
+ Comentariu
+ Succes
+ Procent
+ Absolut
+ Insulină
+ U
+ Se așteaptă rezultatulSMB
+ TDD cumulat
+ TDD estimat exponențialBazalăBolusTDD
+ Rata
+ # ZileGreutate
+ Date vechi, apăsați \"REÎNCĂRCARE\"
+ TBB * 2
diff --git a/core/src/main/res/values-ru-rRU/strings.xml b/core/src/main/res/values-ru-rRU/strings.xml
index 6e3bcb1b92..8f23ae951f 100644
--- a/core/src/main/res/values-ru-rRU/strings.xml
+++ b/core/src/main/res/values-ru-rRU/strings.xml
@@ -122,6 +122,8 @@
%1$d мин
+ %1$s: ∑: %2$.2fедБол:%3$.2fед Баз: %4$.2fед(%5$.0f%%)]]>
+ %1$s∑: %2$.2fU Бол: %3$.2fед Баз: %4$.2fед(%5$.0f%%) ГУ: %6$.0fг]]>Проверка ГКОовещение
diff --git a/core/src/main/res/values-sv-rSE/strings.xml b/core/src/main/res/values-sv-rSE/strings.xml
index 28f5c83b0a..f3e17082d4 100644
--- a/core/src/main/res/values-sv-rSE/strings.xml
+++ b/core/src/main/res/values-sv-rSE/strings.xml
@@ -122,8 +122,6 @@
%1$d min
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU]]>
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU KH: %5$.0fg]]>BG-kontrollMeddelande
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 98001a1c4e..293ed0d2d9 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -156,8 +156,8 @@
%1$dmin
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU]]>
- %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU Carbs: %5$.0fg]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%)]]>
+ %1$s: ∑: %2$.2fU Bol: %3$.2fU Bas: %4$.2fU(%5$.0f%%) Carbs: %6$.0fg]]>BG Check
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index bcfae4473e..7e8020884a 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -46,6 +46,10 @@
10sp
+
+
48dp14sp
diff --git a/dana/src/main/res/values-pl-rPL/strings.xml b/dana/src/main/res/values-pl-rPL/strings.xml
index 3ea04e700d..9f84c6cd35 100644
--- a/dana/src/main/res/values-pl-rPL/strings.xml
+++ b/dana/src/main/res/values-pl-rPL/strings.xml
@@ -1,2 +1,122 @@
-
+
+ Parowanie
+ Urządzenie nie zostało znalezione do tej pory
+ Parowanie OK
+ Przekroczono limit czasu parowania
+ Oczekiwanie na pompę na sparowanie
+ DanaRS
+ Dana
+ Integracja z pompą DANA RS Diabecare
+ Przekroczenie ograniczenia maks. bolusa
+ Błąd polecenia
+ Błąd prędkości
+ Przekroczono limit insuliny
+ Zadano: %1$.2fU Dostarczono: %2$.2fU Kod błędu: %3$s
+ Wartość ustawiona nieprawidłowo
+ Ustaw krok bazy na 0.01 U/h
+ Zresetować sparowanie?
+ %1$s\nModel: %2$02X\nProtokół: %3$02X\nKod: %4$02X
+ Przetwarzanie zdarzenia
+ Uaktywnij bolusy przedłużone w pompie
+ Dostarczone
+ Zatrzymane
+ Nieobsługiwane oprogramowanie pompy
+ Błąd pompy
+ Niski stan baterii
+ Dostarczanie mniej niż wstępnie ustawiona baza
+ Wyłączenie pompy
+ Bateria pompy rozładowana
+ Zatkanie
+ Pusty zasobnik
+ Sprawdź śrubę tłoka
+ Max dawka bazowa
+ Limit dzienny
+ Alarm pomiaru poziomu cukru
+ Pozostała ilość insuliny
+ Pominięty bolus
+ Niepoprawne informacje o parowaniu. Żądanie nowego parowania
+ Uzyskiwanie statusu pompy
+ Status otrzymywania bolusa przedłużonego
+ Status otrzymywania bolusa
+ Status otrzymywania tymczasowej bazy
+ Otrzymywanie ustawień pompy
+ Otrzymywanie czasu pompy
+ Duża Różnica Czasu
+ Duża różnica czasu:\nCzas w pompie jest wyłączony przez więcej niż 1,5 godziny.\n. Ustaw czas ręcznie na pompie i upewnij się, że odczyt historii pompy nie powoduje błędu.\nJeśli to możliwe, usuń historię z pompy przed zmianą czasu lub wyłącz pętlę zamkniętą do jednego DIA po ostatnim nieprawidłowym wpisie dziennika, ale co najmniej jeden DIA od teraz.
+ Proszę sparować swoją pompę z telefonem!
+ Zbliżam się do dziennego limitu insuliny
+ Rozpoczynam podawanie bolusa
+ Oczekuję na zakończenie bolusa. Pozostało %1$d sec.
+ Zatrzymywanie bazy tymczasowej
+ Ustawianie bolusa przedłużonego
+ Zatrzymywanie bolusa przedłużonego
+ Uaktualnianie dawek bazowych
+ Ustawianie bazy tymczasowej
+ Oczekiwanie na synchronizację czasu (%1$d sec)
+ Złe hasło
+ Błędne hasło pompy!
+ Alarmy
+ Godziny Bazy
+ Bolusy
+ Węglowodany
+ Insulina dzienna
+ Błędy
+ Glukoza
+ Napełnij
+ Wstrzymaj
+ Wypełnianie
+ Ustawienia użytkownika
+ Format wyświetlanego czasu
+ Przycisk przewijania
+ Dźwięk po przyciśnięciu przycisku
+ Alarm
+ Dźwięk
+ Wibracja
+ Obie opcje
+ LCD na czas [sekund]
+ Podświetlenie na czas [sekund]
+ Jednostki glukozy
+ Wyłączenie [godzin]
+ Niska zawartość zbiornika [Jednostki]
+ Zapisz ustawienia w pompie
+ Integracja z pompą DANA R Diabecare
+ Integracja z pompą DANA R Diabetes, wersja koreańska
+ Integracja z pompą DANA R Diabecare z oprogramowaniem v2
+ DANA
+ Nie odnaleziono urządzenia bluetooth
+ Nie odnaleziono wybranego urządzenia
+ Zmień tryb z U/d na U/h w pompie
+ DanaR wersja Koreańska
+ DanaR
+ Poprawiono sterownik pompy
+ DanaRv2
+ Wyłącz tryb EasyUI w pompie
+ Ustawienie profilu bazy nie powiodło się
+ Status Bluetooth
+ IOB w pompie
+ Krok bazy
+ Krok bolusa
+ Firmware
+ Ustawienia pompy Dana
+ 12h
+ 24h
+ Włącz
+ Wyłącz
+ Urządzenie Bluetooth DanaR
+ Hasło pompy (tylko v1)
+ Hasło pompy
+ Używaj przedłużonych bolusów dla >200%%
+ Wizualizacja bolusa przedłużonego jako %%
+ Szybkość podawania bolusa
+ Wybrana pompa
+ Zapisz zmianę zbiorniczka
+ Dodaj zdarzenie \"Zmiana zasobnika insuliny\" do portalu opieki Nightscout, gdy wykryto je w historii pompy
+ Zapisz zmianę wkłucia
+ Dodaj zdarzenie \"Zmiana miejsca wkłucia\" do portalu opieki Nightscout, gdy wykryto je w historii pompy
+ PIN1
+ PIN2
+ Naciśnij OK na pompie\ni wpisz 2 wyświetlone numery\nUtrzymuj wyświetlacz pompy włączony poprzez naciskanie przycisku minus, aż do momentu zakończenia przepisywania kodu.
+ 1: (12 cyfr)
+ 2: (8 cyfr)
+
diff --git a/dana/src/main/res/values-ro-rRO/strings.xml b/dana/src/main/res/values-ro-rRO/strings.xml
index 18b02bafb7..965fd0591b 100644
--- a/dana/src/main/res/values-ro-rRO/strings.xml
+++ b/dana/src/main/res/values-ro-rRO/strings.xml
@@ -1,33 +1,68 @@
+ Niciun dispozitiv găsit până acum
+ Conectare OK
+ Conectare nereușită
+ Se așteaptă conectarea la pompăDanaRSDana
+ Integrare cu pompele DANA Diabcare RS
+ Încălcare a valorii maxime a bolusului
+ Solicitat: %1$.2fU Livrat: %2$.2fU Cod eroare: %3$s
+ Valoare setată incorect
+ Resetați informațiile de împerechere?
+ %1$s\nModel: %2$02X\nProtocol: %3$02X\nCod: %4$02X
+ Activează bolusuri extinse în pompăLivratOprit
+ Soft pompă incompatibil
+ Eroare a pompei
+ Bateria pompei este descărcatăOcluzieRezervor gol
+ Maxim bazală
+ Maximum zilnic
+ Alertă măsurare glicemie
+ Se primește starea pompei
+ Se citește starea bolusului extins
+ Se citește starea bolusului
+ Se citește starea bazalei temporare
+ Se citesc setările pompei
+ Se citește ora pompei
+ Diferență majoră de timp
+ Pornire livrare bolusSe oprește bazala temporarăSe oprește bolusul extins
+ Se setează bazala temporarăParolă greșităParola pompei greșită!Alarme
+ Ore bazaleBolusuriCarbohidrați
+ Insulină zilnicăEroriGlicemieReumplereSuspendareAmorsare
+ Opțiunile utilizatorului
+ Buton derulare
+ Sunet la apăsarea butonuluiAlarmăSunetVibrațieAmbele
+ Oprire [hours]Salvați opțiunile în pompăIntegrare cu pompele DANA Diabcare RDANA
+ Nu s-a găsit niciun adaptor bluetooth
+ Dispozitivul selectat nu a fost găsitDanaR din CoreeaDanaRDanaRv2
+ Setarea profilului bazalei a eșuatStatus BluetoothIOB din pompăPas bazală
@@ -38,6 +73,11 @@
24hPornitOprit
+ Dispozitive bluetooth DanaR
+ Parola pompei
+ Viteză bolusare
+ Pompa selectată
+ Înregistrează schimbarea rezervoruluiPIN1PIN21: (12 cifre)
diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt b/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
index e3e0bc4db0..1e0e5f088b 100644
--- a/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
+++ b/danars/src/main/java/info/nightscout/androidaps/danars/services/BLEComm.kt
@@ -554,7 +554,7 @@ class BLEComm @Inject internal constructor(
val size = decryptedBuffer.size
var pass: Int = (decryptedBuffer[size - 1].toInt() and 0x000000FF shl 8) + (decryptedBuffer[size - 2].toInt() and 0x000000FF)
pass = pass xor 3463
- danaPump.rsPassword = Integer.toHexString(pass)
+ danaPump.rsPassword = String.format("%04X", pass)
aapsLogger.debug(LTag.PUMPBTCOMM, "Pump user password: " + danaPump.rsPassword)
if (!danaPump.isRSPasswordOK) {
aapsLogger.error(LTag.PUMPBTCOMM, "Wrong pump password")
diff --git a/icons/compare_profiles.svg b/icons/compare_profiles.svg
new file mode 100644
index 0000000000..123653d167
--- /dev/null
+++ b/icons/compare_profiles.svg
@@ -0,0 +1,26 @@
+
+
diff --git a/wear/src/main/res/values-ro-rRO/strings.xml b/wear/src/main/res/values-ro-rRO/strings.xml
index 75a59a0d4f..6a55603392 100644
--- a/wear/src/main/res/values-ro-rRO/strings.xml
+++ b/wear/src/main/res/values-ro-rRO/strings.xml
@@ -4,13 +4,51 @@
AAPSAAPSAAPSv2
+ Nu există date!
+ Date vechi!Sincronizare cu AAPS!PornitOprit
+ Arată data
+ Arată IOB
+ Arată COB
+ Arată Delta
+ Arată baterie telefon
+ Arată Baterie Rig
+ Arată rata bazală
+ Arată stare buclă închisă
+ Arată glicemia
+ Întunecat
+ Evidențiere rate bazale1 oră2 ore3 ore4 ore5 oreImplicit
+ Granularitate Delta (Steampunk)
+ Versiune:
+ ŢintăTemporară
+ Bolus
+ eCarb
+ Setări
+ Stare
+ Implicit
+ start [min]
+ CONFIRMARE
+ STARE POMPĂ
+ STARE BUCLĂ ÎNCHISĂ
+ bolus
+ Pompă
+ CPP
+ TDD
+ Carbohidrați
+ IOB
+ mg/dl
+ mmol/l
+ g
+ U
+ U/h
+ z
+ s