Merge branch 'dev' into rxjava3

This commit is contained in:
Milos Kozak 2022-02-24 21:59:48 +01:00 committed by GitHub
commit dd83fbe9e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
249 changed files with 4533 additions and 2229 deletions

View file

@ -109,7 +109,7 @@ android {
defaultConfig {
multiDexEnabled true
versionCode 1500
version "3.0.0.1-dev"
version "3.0.0.1-dev-b"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'

View file

@ -64,6 +64,7 @@
</activity>
<activity android:name=".activities.PreferencesActivity" />
<activity android:name=".plugins.general.overview.activities.QuickWizardListActivity"
android:theme="@style/AppTheme"
android:exported="false">
<intent-filter>
<action android:name="info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity" />
@ -75,8 +76,7 @@
<activity android:name=".activities.HistoryBrowseActivity" />
<activity android:name=".activities.TreatmentsActivity" />
<activity android:name=".activities.SurveyActivity" />
<activity android:name=".activities.ProfileHelperActivity"
android:theme="@style/ProfileHelperAppTheme" />
<activity android:name=".activities.ProfileHelperActivity" />
<activity android:name=".activities.StatsActivity" />
<activity
android:name="com.google.firebase.auth.internal.FederatedSignInActivity"
@ -229,8 +229,7 @@
<activity
android:name=".setupwizard.SetupWizardActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/title_activity_setup_wizard"
android:theme="@style/AppTheme.NoActionBar" />
android:label="@string/title_activity_setup_wizard" />
<activity
android:name=".activities.SingleFragmentActivity"

View file

@ -284,18 +284,36 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
else {
console.error("Time now is "+now+"; ");
}
console.error(" ");
console.error("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
console.error("++ Dynamic ISF Beta 1.3 - Based on rolling 24 hours ++");
console.error("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
console.error(" ");
if (meal_data.TDDAIMI7){
var tdd7 = meal_data.TDDAIMI7;
}
else{
var tdd7 = ((basal * 12)*100)/21;
}
else{
var tdd7 = ((basal * 12)*100)/21;
}
var tdd_pump_now = meal_data.TDDPUMP;
var tdd_pump = ( tdd_pump_now / (now / 24));
var TDD = (tdd7 * 0.4) + (tdd_pump * 0.6);
console.error("Pump extrapolated TDD = "+tdd_pump+"; ");
console.error("7-day average TDD is: " +tdd7+ "; ");
console.error(" ");
if (meal_data.TDDLast24){
var tdd_24 = meal_data.TDDLast24;
}
else {
var tdd_24 = (( basal * 24 ) * 2.8);
}
var TDD = (tdd7 * 0.3) + (tdd_24 * 0.7);
console.error("Rolling 24 hour TDD = "+tdd_24+"; ");
console.error(" ");
console.error("Weighted Average TDD = "+TDD+"; ");
console.error(" ");
//if (tdd7 > 0){
if ( tdd_pump > tdd7 && now < 5 || now < 7 && TDD < ( 0.8 * tdd7 ) ){
/*if ( tdd_pump > tdd7 && now < 5 || now < 7 && TDD < ( 0.8 * tdd7 ) ){
TDD = ( 0.8 * tdd7 );
console.log("Excess or too low insulin from pump so TDD set to "+TDD+" based on 75% of TDD7; ");
rT.reason += "TDD: " +TDD+ " due to low or high tdd from pump; ";
@ -316,12 +334,13 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
else {
console.log("TDD 7 ="+tdd7+", TDD Pump ="+tdd_pump+" and TDD = "+TDD+";");
rT.reason += "TDD: " +TDD+ " based on standard pump 60/tdd7 40 split; ";
}
}*/
var variable_sens = (277700 / (TDD * bg));
variable_sens = round(variable_sens,1);
console.log("Current sensitivity for predictions is " +variable_sens+" based on current bg");
console.error(" ");
sens = variable_sens;
if ( high_temptarget_raises_sensitivity && profile.temptargetSet && target_bg > normalTarget || profile.low_temptarget_lowers_sensitivity && profile.temptargetSet && target_bg < normalTarget ) {
@ -389,7 +408,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
if (iob_data.iob > 0) {
var naive_eventualBG = round( bg - (iob_data.iob * sens) );
} else { // if IOB is negative, be more conservative and use the lower of sens, profile.sens
naive_eventualBG = round( bg - (iob_data.iob * Math.min(sens, profile.sens) ) );
naive_eventualBG = round( bg - (iob_data.iob * sens ) );
}
// and adjust it for the deviation above
var eventualBG = naive_eventualBG + deviation;

View file

@ -320,7 +320,7 @@ class MainActivity : NoSplashAppCompatActivity() {
message += rh.gs(R.string.about_link_urls)
val messageSpanned = SpannableString(message)
Linkify.addLinks(messageSpanned, Linkify.WEB_URLS)
AlertDialog.Builder(this)
AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(rh.gs(R.string.app_name) + " " + BuildConfig.VERSION)
.setIcon(iconsProvider.getIcon())
.setMessage(messageSpanned)

View file

@ -179,7 +179,8 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
val cal = Calendar.getInstance()
cal.timeInMillis = overviewData.fromTime
DatePickerDialog(
this, dateSetListener,
this, R.style.MaterialPickerTheme,
dateSetListener,
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH)

View file

@ -123,9 +123,11 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
override fun onDestroy() {
super.onDestroy()
PreferenceManager
.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this)
context?.let { context ->
PreferenceManager
.getDefaultSharedPreferences(context)
.unregisterOnSharedPreferenceChangeListener(this)
}
}
private fun addPreferencesFromResourceIfEnabled(p: PluginBase?, rootKey: String?, enabled: Boolean) {
@ -139,9 +141,11 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
PreferenceManager
.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this)
context?.let { context ->
PreferenceManager
.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this)
}
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@ -263,19 +267,19 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
@SuppressLint("RestrictedApi")
private fun addPreferencesFromResource(@XmlRes preferencesResId: Int, key: String?) {
val xmlRoot = preferenceManager.inflateFromResource(context,
preferencesResId, null)
val root: Preference?
if (key != null) {
root = xmlRoot.findPreference(key)
if (root == null) return
require(root is PreferenceScreen) {
("Preference object with key " + key
+ " is not a PreferenceScreen")
context?.let { context ->
val xmlRoot = preferenceManager.inflateFromResource(context, preferencesResId, null)
val root: Preference?
if (key != null) {
root = xmlRoot.findPreference(key)
if (root == null) return
require(root is PreferenceScreen) {
("Preference object with key $key is not a PreferenceScreen")
}
preferenceScreen = root
} else {
addPreferencesFromResource(preferencesResId)
}
preferenceScreen = root
} else {
addPreferencesFromResource(preferencesResId)
}
}
@ -305,15 +309,9 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
p.initialExpandedChildrenCount = Int.MAX_VALUE
}
} else {
if (p.key != null) {
visible = visible || p.key.contains(filter, true)
}
if (p.title != null) {
visible = visible || p.title.contains(filter, true)
}
if (p.summary != null) {
visible = visible || p.summary.contains(filter, true)
}
visible = visible || p.key?.contains(filter, true) == true
visible = visible || p.title?.contains(filter, true) == true
visible = visible || p.summary?.contains(filter, true) == true
}
p.isVisible = visible
@ -393,32 +391,30 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
// We use Preference and custom editor instead of EditTextPreference
// to hash password while it is saved and never have to show it, even hashed
override fun onPreferenceTreeClick(preference: Preference?): Boolean {
override fun onPreferenceTreeClick(preference: Preference): Boolean {
context?.let { context ->
if (preference != null) {
if (preference.key == rh.gs(R.string.key_master_password)) {
passwordCheck.queryPassword(context, R.string.current_master_password, R.string.key_master_password, {
passwordCheck.setPassword(context, R.string.master_password, R.string.key_master_password)
})
return true
}
if (preference.key == rh.gs(R.string.key_settings_password)) {
passwordCheck.setPassword(context, R.string.settings_password, R.string.key_settings_password)
return true
}
if (preference.key == rh.gs(R.string.key_bolus_password)) {
passwordCheck.setPassword(context, R.string.bolus_password, R.string.key_bolus_password)
return true
}
if (preference.key == rh.gs(R.string.key_application_password)) {
passwordCheck.setPassword(context, R.string.application_password, R.string.key_application_password)
return true
}
// NSClient copy settings
if (preference.key == rh.gs(R.string.key_statuslights_copy_ns)) {
nsSettingStatus.copyStatusLightsNsSettings(context)
return true
}
if (preference.key == rh.gs(R.string.key_master_password)) {
passwordCheck.queryPassword(context, R.string.current_master_password, R.string.key_master_password, {
passwordCheck.setPassword(context, R.string.master_password, R.string.key_master_password)
})
return true
}
if (preference.key == rh.gs(R.string.key_settings_password)) {
passwordCheck.setPassword(context, R.string.settings_password, R.string.key_settings_password)
return true
}
if (preference.key == rh.gs(R.string.key_bolus_password)) {
passwordCheck.setPassword(context, R.string.bolus_password, R.string.key_bolus_password)
return true
}
if (preference.key == rh.gs(R.string.key_application_password)) {
passwordCheck.setPassword(context, R.string.application_password, R.string.key_application_password)
return true
}
// NSClient copy settings
if (preference.key == rh.gs(R.string.key_statuslights_copy_ns)) {
nsSettingStatus.copyStatusLightsNsSettings(context)
return true
}
}
return super.onPreferenceTreeClick(preference)

View file

@ -283,7 +283,7 @@ class ProfileHelperActivity : NoSplashAppCompatActivity() {
tabSelected = tab
typeSelected[tabSelected] = newContent
binding.profiletypeTitle.defaultHintTextColor = ColorStateList.valueOf(rh.gc(if (tab == 0) R.color.tabBgColorSelected else R.color.examinedProfile))
binding.profiletypeTitle.defaultHintTextColor = ColorStateList.valueOf(rh.gc(if (tab == 0) R.color.helperProfile else R.color.examinedProfile))
// show new content
binding.profiletype.setText(
@ -314,7 +314,7 @@ class ProfileHelperActivity : NoSplashAppCompatActivity() {
}
private fun setBackgroundColorOnSelected(tab: Int) {
binding.menu1.setBackgroundColor(rh.gc(if (tab == 1) R.color.defaultbackground else R.color.tempbasal))
binding.menu1.setBackgroundColor(rh.gc(if (tab == 1) R.color.defaultbackground else R.color.helperProfile))
binding.menu2.setBackgroundColor(rh.gc(if (tab == 0) R.color.defaultbackground else R.color.examinedProfile))
}
}

View file

@ -1,13 +1,13 @@
package info.nightscout.androidaps.activities
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.fragments.*
import info.nightscout.androidaps.databinding.TreatmentsFragmentBinding
import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import javax.inject.Inject
@ -23,40 +23,60 @@ class TreatmentsActivity : NoSplashAppCompatActivity() {
super.onCreate(savedInstanceState)
binding = TreatmentsFragmentBinding.inflate(layoutInflater)
setContentView(binding.root)
//binding.tempBasals.visibility = buildHelper.isEngineeringMode().toVisibility()
//binding.extendedBoluses.visibility = (buildHelper.isEngineeringMode() && !activePlugin.activePump.isFakingTempsByExtendedBoluses).toVisibility()
binding.treatments.setOnClickListener {
setFragment(TreatmentsBolusCarbsFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.carbs_and_bolus)
}
binding.extendedBoluses.setOnClickListener {
setFragment(TreatmentsExtendedBolusesFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.extended_bolus)
}
binding.tempBasals.setOnClickListener {
setFragment(TreatmentsTemporaryBasalsFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.tempbasal_label)
}
binding.tempTargets.setOnClickListener {
setFragment(TreatmentsTempTargetFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.tempt_targets)
}
binding.profileSwitches.setOnClickListener {
setFragment(TreatmentsProfileSwitchFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.profile_changes)
}
binding.careportal.setOnClickListener {
setFragment(TreatmentsCareportalFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.careportal)
}
binding.userentry.setOnClickListener {
setFragment(TreatmentsUserEntryFragment())
setBackgroundColorOnSelected(it)
supportActionBar?.title = rh.gs(R.string.user_action)
}
setFragment(TreatmentsBolusCarbsFragment())
setBackgroundColorOnSelected(binding.treatments)
setSupportActionBar(binding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = rh.gs(R.string.carbs_and_bolus)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
finish()
true
}
else -> false
}
}
private fun setFragment(selectedFragment: Fragment) {

View file

@ -3,9 +3,13 @@ package info.nightscout.androidaps.activities.fragments
import android.annotation.SuppressLint
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.Log
import android.util.SparseArray
import android.view.*
import android.widget.CompoundButton
import android.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -67,6 +71,10 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
@Inject lateinit var repository: AppRepository
@Inject lateinit var activePlugin: ActivePlugin
private var _binding: TreatmentsBolusCarbsFragmentBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
class MealLink(
val bolus: Bolus? = null,
val carbs: Carbs? = null,
@ -74,14 +82,12 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
)
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var _binding: TreatmentsBolusCarbsFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
private var selectedItems: SparseArray<MealLink> = SparseArray()
private var showInvalidated = false
private var removeActionMode: ActionMode? = null
private var toolbar: Toolbar? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsBolusCarbsFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
@ -89,92 +95,10 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
@SuppressLint("CheckResult")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
toolbar = activity?.findViewById(R.id.toolbar)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
binding.refreshFromNightscout.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.refresheventsfromnightscout) + "?") {
uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments)
disposable +=
Completable.fromAction {
repository.deleteAllBolusCalculatorResults()
repository.deleteAllBoluses()
repository.deleteAllCarbs()
}
.subscribeOn(aapsSchedulers.io)
.observeOn(aapsSchedulers.main)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = {
rxBus.send(EventTreatmentChange())
rxBus.send(EventNewHistoryData(0, false))
}
)
rxBus.send(EventNSClientRestart())
}
}
}
binding.deleteFutureTreatments.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.overview_treatment_label), rh.gs(R.string.deletefuturetreatments) + "?", Runnable {
uel.log(Action.DELETE_FUTURE_TREATMENTS, Sources.Treatments)
repository
.getBolusesDataFromTime(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { bolus ->
disposable += repository.runTransactionForResult(InvalidateBolusTransaction(bolus.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bolus $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating bolus", it) }
)
}
}
repository
.getCarbsDataFromTimeNotExpanded(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { carb ->
if (carb.duration == 0L)
disposable += repository.runTransactionForResult(InvalidateCarbsTransaction(carb.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated carbs $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it) }
)
else {
disposable += repository.runTransactionForResult(CutCarbsTransaction(carb.id, dateUtil.now()))
.subscribe(
{ result ->
result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated carbs $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated (cut end) carbs $it") }
},
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it) }
)
}
}
}
repository
.getBolusCalculatorResultsDataFromTime(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { bolusCalc ->
disposable += repository.runTransactionForResult(InvalidateBolusCalculatorResultTransaction(bolusCalc.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bolusCalculatorResult $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating bolusCalculatorResult", it) }
)
}
}
binding.deleteFutureTreatments.visibility = View.GONE
})
}
}
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_insulin, false) || !sp.getBoolean(R.string.key_ns_receive_carbs, false) || !buildHelper.isEngineeringMode()
if (nsUploadOnly) binding.refreshFromNightscout.visibility = View.GONE
binding.showInvalidated.setOnCheckedChangeListener { _, _ ->
rxBus.send(EventTreatmentUpdateGui())
}
}
private fun bolusMealLinksWithInvalid(now: Long) = repository
@ -204,36 +128,35 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
fun swapAdapter() {
val now = System.currentTimeMillis()
if (binding.showInvalidated.isChecked)
disposable += carbsMealLinksWithInvalid(now)
.zipWith(bolusMealLinksWithInvalid(now)) { first, second -> first + second }
.zipWith(calcResultMealLinksWithInvalid(now)) { first, second -> first + second }
.map { ml ->
ml.sortedByDescending {
it.carbs?.timestamp ?: it.bolus?.timestamp
?: it.bolusCalculatorResult?.timestamp
disposable +=
if (showInvalidated)
carbsMealLinksWithInvalid(now)
.zipWith(bolusMealLinksWithInvalid(now)) { first, second -> first + second }
.zipWith(calcResultMealLinksWithInvalid(now)) { first, second -> first + second }
.map { ml ->
ml.sortedByDescending {
it.carbs?.timestamp ?: it.bolus?.timestamp
?: it.bolusCalculatorResult?.timestamp
}
}
}
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true)
binding.deleteFutureTreatments.visibility = list.isNotEmpty().toVisibility()
}
else
disposable += carbsMealLinks(now)
.zipWith(bolusMealLinks(now)) { first, second -> first + second }
.zipWith(calcResultMealLinks(now)) { first, second -> first + second }
.map { ml ->
ml.sortedByDescending {
it.carbs?.timestamp ?: it.bolus?.timestamp
?: it.bolusCalculatorResult?.timestamp
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true)
}
else
carbsMealLinks(now)
.zipWith(bolusMealLinks(now)) { first, second -> first + second }
.zipWith(calcResultMealLinks(now)) { first, second -> first + second }
.map { ml ->
ml.sortedByDescending {
it.carbs?.timestamp ?: it.bolus?.timestamp
?: it.bolusCalculatorResult?.timestamp
}
}
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true)
}
}
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true)
binding.deleteFutureTreatments.visibility = list.isNotEmpty().toVisibility()
}
}
@ -267,13 +190,14 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.let { it.finish() }
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
private fun timestamp(ml: MealLink): Long = ml.bolusCalculatorResult?.let { it.timestamp } ?: ml.bolus?.let { it.timestamp } ?: ml.carbs?.let { it.timestamp } ?: 0L
private fun timestamp(ml: MealLink): Long = ml.bolusCalculatorResult?.timestamp ?: ml.bolus?.timestamp ?: ml.carbs?.timestamp ?: 0L
inner class RecyclerViewAdapter internal constructor(var mealLinks: List<MealLink>) : RecyclerView.Adapter<RecyclerViewAdapter.MealLinkLoadedViewHolder>() {
inner class RecyclerViewAdapter internal constructor(private var mealLinks: List<MealLink>) : RecyclerView.Adapter<RecyclerViewAdapter.MealLinkLoadedViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MealLinkLoadedViewHolder =
MealLinkLoadedViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.treatments_bolus_carbs_item, viewGroup, false))
@ -287,13 +211,13 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
holder.binding.date.text = dateUtil.dateString(timestamp(ml))
// Metadata
holder.binding.metadataLayout.visibility = (ml.bolusCalculatorResult != null && (ml.bolusCalculatorResult.isValid || binding.showInvalidated.isChecked)).toVisibility()
holder.binding.metadataLayout.visibility = (ml.bolusCalculatorResult != null && (ml.bolusCalculatorResult.isValid || showInvalidated)).toVisibility()
ml.bolusCalculatorResult?.let { bolusCalculatorResult ->
holder.binding.calcTime.text = dateUtil.timeString(bolusCalculatorResult.timestamp)
}
// Bolus
holder.binding.bolusLayout.visibility = (ml.bolus != null && (ml.bolus.isValid || binding.showInvalidated.isChecked)).toVisibility()
holder.binding.bolusLayout.visibility = (ml.bolus != null && (ml.bolus.isValid || showInvalidated)).toVisibility()
ml.bolus?.let { bolus ->
holder.binding.bolusTime.text = dateUtil.timeString(bolus.timestamp)
holder.binding.insulin.text = rh.gs(R.string.formatinsulinunits, bolus.amount)
@ -321,7 +245,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
}
}
// Carbs
holder.binding.carbsLayout.visibility = (ml.carbs != null && (ml.carbs.isValid || binding.showInvalidated.isChecked)).toVisibility()
holder.binding.carbsLayout.visibility = (ml.carbs != null && (ml.carbs.isValid || showInvalidated)).toVisibility()
ml.carbs?.let { carbs ->
holder.binding.carbsTime.text = dateUtil.timeString(carbs.timestamp)
holder.binding.carbs.text = rh.gs(R.string.format_carbs, carbs.amount.toInt())
@ -330,19 +254,28 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
holder.binding.carbsPump.visibility = (carbs.interfaceIDs.pumpId != null).toVisibility()
holder.binding.carbsInvalid.visibility = carbs.isValid.not().toVisibility()
}
holder.binding.bolusRemove.visibility = (ml.bolus?.isValid == true).toVisibility()
holder.binding.carbsRemove.visibility = (ml.carbs?.isValid == true).toVisibility()
holder.binding.bolusRemove.tag = ml
holder.binding.carbsRemove.tag = ml
holder.binding.cbBolusRemove.visibility = (ml.bolus?.isValid == true && removeActionMode != null).toVisibility()
holder.binding.cbCarbsRemove.visibility = (ml.carbs?.isValid == true && removeActionMode != null).toVisibility()
if (removeActionMode != null) {
val onChange = CompoundButton.OnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, ml)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbBolusRemove.setOnCheckedChangeListener(onChange)
holder.binding.cbBolusRemove.isChecked = selectedItems.get(position) != null
holder.binding.cbCarbsRemove.setOnCheckedChangeListener(onChange)
holder.binding.cbCarbsRemove.isChecked = selectedItems.get(position) != null
}
holder.binding.calculation.tag = ml
val nextTimestamp = if (mealLinks.size != position + 1) timestamp(mealLinks[position + 1]) else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(timestamp(ml), nextTimestamp).toVisibility()
}
override fun getItemCount(): Int {
return mealLinks.size
}
override fun getItemCount() = mealLinks.size
inner class MealLinkLoadedViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {
@ -359,35 +292,199 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
}
}
binding.calculation.paintFlags = binding.calculation.paintFlags or Paint.UNDERLINE_TEXT_FLAG
binding.bolusRemove.setOnClickListener { ml ->
val bolus = (ml.tag as MealLink?)?.bolus ?: return@setOnClickListener
activity?.let { activity ->
val text = rh.gs(R.string.configbuilder_insulin) + ": " +
rh.gs(R.string.formatinsulinunits, bolus.amount) + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(bolus.timestamp)
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), text, Runnable {
}
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_carbs_bolus, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_insulin, false) || !sp.getBoolean(R.string.key_ns_receive_carbs, false) || !buildHelper.isEngineeringMode()
menu.findItem(R.id.nav_refresh_ns)?.isVisible = !nsUploadOnly
val hasItems = (binding.recyclerview.adapter?.itemCount ?: 0) > 0
menu.findItem(R.id.nav_delete_future)?.isVisible = hasItems
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_delete_future -> {
deleteFutureTreatments()
true
}
R.id.nav_refresh_ns -> {
refreshFromNightscout()
true
}
else -> false
}
private fun refreshFromNightscout() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.refresheventsfromnightscout) + "?") {
uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments)
disposable +=
Completable.fromAction {
repository.deleteAllBolusCalculatorResults()
repository.deleteAllBoluses()
repository.deleteAllCarbs()
}
.subscribeOn(aapsSchedulers.io)
.observeOn(aapsSchedulers.main)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = {
rxBus.send(EventTreatmentChange())
rxBus.send(EventNewHistoryData(0, false))
}
)
rxBus.send(EventNSClientRestart())
}
}
}
fun deleteFutureTreatments() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.overview_treatment_label), rh.gs(R.string.deletefuturetreatments) + "?", Runnable {
uel.log(Action.DELETE_FUTURE_TREATMENTS, Sources.Treatments)
disposable += repository
.getBolusesDataFromTime(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { bolus ->
disposable += repository.runTransactionForResult(InvalidateBolusTransaction(bolus.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bolus $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating bolus", it) }
)
}
}
disposable += repository
.getCarbsDataFromTimeNotExpanded(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { carb ->
if (carb.duration == 0L)
disposable += repository.runTransactionForResult(InvalidateCarbsTransaction(carb.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated carbs $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it) }
)
else {
disposable += repository.runTransactionForResult(CutCarbsTransaction(carb.id, dateUtil.now()))
.subscribe(
{ result ->
result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated carbs $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated (cut end) carbs $it") }
},
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it) }
)
}
}
}
disposable += repository
.getBolusCalculatorResultsDataFromTime(dateUtil.now(), false)
.observeOn(aapsSchedulers.main)
.subscribe { list ->
list.forEach { bolusCalc ->
disposable += repository.runTransactionForResult(InvalidateBolusCalculatorResultTransaction(bolusCalc.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bolusCalculatorResult $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating bolusCalculatorResult", it) }
)
}
}
})
}
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val mealLink = selectedItems.valueAt(0)
val bolus = mealLink.bolus
if (bolus != null)
return rh.gs(R.string.configbuilder_insulin) + ": " + rh.gs(R.string.formatinsulinunits, bolus.amount) + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(bolus.timestamp)
val carbs = mealLink.carbs
if (carbs != null)
return rh.gs(R.string.carbs) + ": " + rh.gs(R.string.format_carbs, carbs.amount.toInt()) + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(carbs.timestamp)
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach { _, ml ->
ml.bolus?.let { bolus ->
uel.log(
Action.BOLUS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(bolus.timestamp),
ValueWithUnit.Insulin(bolus.amount)
//ValueWithUnit.Gram(mealLinkLoaded.carbs.toInt())
)
disposable += repository.runTransactionForResult(InvalidateBolusTransaction(bolus.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated bolus $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating bolus", it) }
)
})
}
}
binding.bolusRemove.paintFlags = binding.bolusRemove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
binding.carbsRemove.setOnClickListener { ml ->
val carb = (ml.tag as MealLink?)?.carbs ?: return@setOnClickListener
activity?.let { activity ->
val text = rh.gs(R.string.carbs) + ": " +
rh.gs(R.string.carbs) + ": " + rh.gs(R.string.format_carbs, carb.amount.toInt()) + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(carb.timestamp)
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), text, Runnable {
}
ml.carbs?.let { carb ->
uel.log(
Action.CARBS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(carb.timestamp),
@ -398,11 +495,12 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated carbs $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it) }
)
})
}
}
}
binding.carbsRemove.paintFlags = binding.carbsRemove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
removeActionMode?.finish()
})
}
}
else
removeActionMode?.finish()
}
}
}

View file

@ -1,10 +1,11 @@
package info.nightscout.androidaps.activities.fragments
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.SparseArray
import android.view.*
import android.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -57,61 +58,61 @@ class TreatmentsCareportalFragment : DaggerFragment() {
@Inject lateinit var repository: AppRepository
@Inject lateinit var uel: UserEntryLogger
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var _binding: TreatmentsCareportalFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var selectedItems: SparseArray<TherapyEvent> = SparseArray()
private var showInvalidated = false
private var toolbar: Toolbar? = null
private var removeActionMode: ActionMode? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsCareportalFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar = activity?.findViewById(R.id.toolbar)
setHasOptionsMenu(true)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
binding.refreshFromNightscout.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.careportal), rh.gs(R.string.refresheventsfromnightscout) + " ?", Runnable {
uel.log(Action.CAREPORTAL_NS_REFRESH, Sources.Treatments)
disposable += Completable.fromAction { repository.deleteAllTherapyEventsEntries() }
.subscribeOn(aapsSchedulers.io)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = { rxBus.send(EventTherapyEventChange()) }
)
rxBus.send(EventNSClientRestart())
})
}
}
binding.removeAndroidapsStartedEvents.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.careportal), rh.gs(R.string.careportal_removestartedevents), Runnable {
uel.log(Action.RESTART_EVENTS_REMOVED, Sources.Treatments)
repository.runTransactionForResult(InvalidateAAPSStartedTherapyEventTransaction(rh.gs(R.string.androidaps_start)))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated therapy event $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it) }
)
}, null)
}
}
}
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_therapy_events, false) || !buildHelper.isEngineeringMode()
if (nsUploadOnly) binding.refreshFromNightscout.visibility = View.GONE
binding.showInvalidated.setOnCheckedChangeListener { _, _ ->
rxBus.send(EventTreatmentUpdateGui())
private fun refreshFromNightscout() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.careportal), rh.gs(R.string.refresheventsfromnightscout) + " ?", Runnable {
uel.log(Action.CAREPORTAL_NS_REFRESH, Sources.Treatments)
disposable += Completable.fromAction { repository.deleteAllTherapyEventsEntries() }
.subscribeOn(aapsSchedulers.io)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = { rxBus.send(EventTherapyEventChange()) }
)
rxBus.send(EventNSClientRestart())
})
}
}
private fun removeStartedEvents() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.careportal), rh.gs(R.string.careportal_removestartedevents), Runnable {
uel.log(Action.RESTART_EVENTS_REMOVED, Sources.Treatments)
disposable += repository.runTransactionForResult(InvalidateAAPSStartedTherapyEventTransaction(rh.gs(R.string.androidaps_start)))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated therapy event $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it) }
)
})
}
}
fun swapAdapter() {
val now = System.currentTimeMillis()
disposable +=
if (binding.showInvalidated.isChecked)
if (showInvalidated)
repository
.getTherapyEventDataIncludingInvalidFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
@ -148,6 +149,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.let { it.finish() }
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
@ -170,42 +172,137 @@ class TreatmentsCareportalFragment : DaggerFragment() {
holder.binding.duration.text = if (therapyEvent.duration == 0L) "" else dateUtil.niceTimeScalar(therapyEvent.duration, rh)
holder.binding.note.text = therapyEvent.note
holder.binding.type.text = translator.translate(therapyEvent.type)
holder.binding.remove.tag = therapyEvent
holder.binding.cbRemove.visibility = (therapyEvent.isValid && removeActionMode != null).toVisibility()
if (removeActionMode != null) {
holder.binding.cbRemove.setOnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, therapyEvent)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbRemove.isChecked = selectedItems.get(position) != null
}
val nextTimestamp = if (therapyList.size != position + 1) therapyList[position + 1].timestamp else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(therapyEvent.timestamp, nextTimestamp).toVisibility()
}
override fun getItemCount(): Int {
return therapyList.size
}
override fun getItemCount() = therapyList.size
inner class TherapyEventsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = TreatmentsCareportalItemBinding.bind(view)
init {
binding.remove.setOnClickListener { v: View ->
val therapyEvent = v.tag as TherapyEvent
activity?.let { activity ->
val text = rh.gs(R.string.eventtype) + ": " + translator.translate(therapyEvent.type) + "\n" +
rh.gs(R.string.notes_label) + ": " + (therapyEvent.note
?: "") + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(therapyEvent.timestamp)
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), text, Runnable {
uel.log(Action.CAREPORTAL_REMOVED, Sources.Treatments, therapyEvent.note ,
ValueWithUnit.Timestamp(therapyEvent.timestamp),
ValueWithUnit.TherapyEventType(therapyEvent.type))
disposable += repository.runTransactionForResult(InvalidateTherapyEventTransaction(therapyEvent.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated therapy event $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it) }
)
}, null)
}
}
binding.remove.paintFlags = binding.remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_careportal, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_therapy_events, false) || !buildHelper.isEngineeringMode()
menu.findItem(R.id.nav_refresh_ns)?.isVisible = !nsUploadOnly
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_remove_started_events -> {
removeStartedEvents()
true
}
R.id.nav_refresh_ns -> {
refreshFromNightscout()
true
}
else -> false
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val therapyEvent = selectedItems.valueAt(0)
return rh.gs(R.string.eventtype) + ": " + translator.translate(therapyEvent.type) + "\n" +
rh.gs(R.string.notes_label) + ": " + (therapyEvent.note ?: "") + "\n" +
rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(therapyEvent.timestamp)
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
private fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach { _, therapyEvent ->
uel.log(
Action.CAREPORTAL_REMOVED, Sources.Treatments, therapyEvent.note,
ValueWithUnit.Timestamp(therapyEvent.timestamp),
ValueWithUnit.TherapyEventType(therapyEvent.type)
)
disposable += repository.runTransactionForResult(InvalidateTherapyEventTransaction(therapyEvent.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated therapy event $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it) }
)
}
removeActionMode?.finish()
})
}
else
removeActionMode?.finish()
}
}

View file

@ -1,12 +1,12 @@
package info.nightscout.androidaps.activities.fragments
import android.annotation.SuppressLint
import android.content.DialogInterface
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.SparseArray
import android.view.*
import android.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -27,10 +27,10 @@ import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.activities.fragments.TreatmentsExtendedBolusesFragment.RecyclerViewAdapter.ExtendedBolusesViewHolder
import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
@ -39,6 +39,7 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import info.nightscout.shared.logging.LTag
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ -60,23 +61,27 @@ class TreatmentsExtendedBolusesFragment : DaggerFragment() {
@Inject lateinit var repository: AppRepository
private var _binding: TreatmentsExtendedbolusFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View =
private var selectedItems: SparseArray<ExtendedBolus> = SparseArray()
private var showInvalidated = false
private var removeActionMode: ActionMode? = null
private var toolbar: Toolbar? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsExtendedbolusFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setHasOptionsMenu(true)
toolbar = activity?.findViewById(R.id.toolbar)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
}
fun swapAdapter() {
val now = System.currentTimeMillis()
if (binding.showInvalidated.isChecked)
disposable += if (showInvalidated)
repository
.getExtendedBolusDataIncludingInvalidFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
@ -109,6 +114,7 @@ class TreatmentsExtendedBolusesFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.let { it.finish() }
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
@ -125,7 +131,7 @@ class TreatmentsExtendedBolusesFragment : DaggerFragment() {
holder.binding.ns.visibility = (extendedBolus.interfaceIDs.nightscoutId != null).toVisibility()
holder.binding.ph.visibility = (extendedBolus.interfaceIDs.pumpId != null).toVisibility()
holder.binding.invalid.visibility = extendedBolus.isValid.not().toVisibility()
val sameDayPrevious = position > 0 && dateUtil.isSameDay(extendedBolus.timestamp, extendedBolusList[position-1].timestamp)
val sameDayPrevious = position > 0 && dateUtil.isSameDay(extendedBolus.timestamp, extendedBolusList[position - 1].timestamp)
holder.binding.date.visibility = sameDayPrevious.not().toVisibility()
holder.binding.date.text = dateUtil.dateString(extendedBolus.timestamp)
@SuppressLint("SetTextI18n")
@ -143,41 +149,125 @@ class TreatmentsExtendedBolusesFragment : DaggerFragment() {
holder.binding.iob.text = rh.gs(R.string.formatinsulinunits, iob.iob)
holder.binding.ratio.text = rh.gs(R.string.pump_basebasalrate, extendedBolus.rate)
if (iob.iob != 0.0) holder.binding.iob.setTextColor(rh.gc(R.color.colorActive)) else holder.binding.iob.setTextColor(holder.binding.insulin.currentTextColor)
holder.binding.remove.tag = extendedBolus
holder.binding.cbRemove.visibility = (extendedBolus.isValid && removeActionMode != null).toVisibility()
if (removeActionMode != null) {
holder.binding.cbRemove.setOnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, extendedBolus)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbRemove.isChecked = selectedItems.get(position) != null
}
val nextTimestamp = if (extendedBolusList.size != position + 1) extendedBolusList[position + 1].timestamp else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(extendedBolus.timestamp, nextTimestamp).toVisibility()
}
override fun getItemCount(): Int = extendedBolusList.size
override fun getItemCount() = extendedBolusList.size
inner class ExtendedBolusesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding = TreatmentsExtendedbolusItemBinding.bind(itemView)
init {
binding.remove.setOnClickListener { v: View ->
val extendedBolus = v.tag as ExtendedBolus
context?.let { context ->
OKDialog.showConfirmation(context, rh.gs(R.string.removerecord),
"""
${rh.gs(R.string.extended_bolus)}
${rh.gs(R.string.date)}: ${dateUtil.dateAndTimeString(extendedBolus.timestamp)}
""".trimIndent(), { _: DialogInterface, _: Int ->
uel.log(Action.EXTENDED_BOLUS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(extendedBolus.timestamp),
ValueWithUnit.Insulin(extendedBolus.amount),
ValueWithUnit.UnitPerHour(extendedBolus.rate),
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(extendedBolus.duration).toInt()))
disposable += repository.runTransactionForResult(InvalidateExtendedBolusTransaction(extendedBolus.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed extended bolus $extendedBolus") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating extended bolus", it) })
}, null)
}
}
binding.remove.paintFlags = binding.remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_extended_bolus, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
else -> false
}
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val bolus = selectedItems.valueAt(0)
return rh.gs(R.string.extended_bolus) + "\n" +
"${rh.gs(R.string.date)}: ${dateUtil.dateAndTimeString(bolus.timestamp)}"
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
private fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach { _, extendedBolus ->
uel.log(
Action.EXTENDED_BOLUS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(extendedBolus.timestamp),
ValueWithUnit.Insulin(extendedBolus.amount),
ValueWithUnit.UnitPerHour(extendedBolus.rate),
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(extendedBolus.duration).toInt())
)
disposable += repository.runTransactionForResult(InvalidateExtendedBolusTransaction(extendedBolus.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed extended bolus $extendedBolus") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating extended bolus", it) })
}
removeActionMode?.finish()
})
}
else
removeActionMode?.finish()
}
}

View file

@ -2,13 +2,16 @@ package info.nightscout.androidaps.activities.fragments
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.SparseArray
import android.view.*
import android.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFragment.RecyclerProfileViewAdapter.ProfileSwitchViewHolder
import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.UserEntry.Action
@ -18,20 +21,17 @@ import info.nightscout.androidaps.database.transactions.InvalidateProfileSwitchT
import info.nightscout.androidaps.databinding.TreatmentsProfileswitchFragmentBinding
import info.nightscout.androidaps.databinding.TreatmentsProfileswitchItemBinding
import info.nightscout.androidaps.dialogs.ProfileViewerDialog
import info.nightscout.androidaps.events.EventEffectiveProfileSwitchChanged
import info.nightscout.androidaps.events.EventProfileSwitchChanged
import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.extensions.getCustomizedName
import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData
import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
import info.nightscout.androidaps.plugins.profile.local.events.EventLocalProfileChanged
import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFragment.RecyclerProfileViewAdapter.ProfileSwitchViewHolder
import info.nightscout.androidaps.events.EventEffectiveProfileSwitchChanged
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
@ -39,6 +39,8 @@ import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.shared.sharedPreferences.SP
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.disposables.CompositeDisposable
@ -61,50 +63,50 @@ class TreatmentsProfileSwitchFragment : DaggerFragment() {
@Inject lateinit var uel: UserEntryLogger
private var _binding: TreatmentsProfileswitchFragmentBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var selectedItems: SparseArray<ProfileSealed> = SparseArray()
private var showInvalidated = false
private var removeActionMode: ActionMode? = null
private var toolbar: Toolbar? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsProfileswitchFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
toolbar = activity?.findViewById(R.id.toolbar)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
}
binding.refreshFromNightscout.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.refresheventsfromnightscout) + "?") {
uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments)
disposable +=
Completable.fromAction {
repository.deleteAllEffectiveProfileSwitches()
repository.deleteAllProfileSwitches()
}
.subscribeOn(aapsSchedulers.io)
.observeOn(aapsSchedulers.main)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = {
rxBus.send(EventProfileSwitchChanged())
rxBus.send(EventEffectiveProfileSwitchChanged(0L))
rxBus.send(EventNewHistoryData(0, false))
}
)
rxBus.send(EventNSClientRestart())
}
private fun refreshFromNightscout() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.refresheventsfromnightscout) + "?") {
uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments)
disposable +=
Completable.fromAction {
repository.deleteAllEffectiveProfileSwitches()
repository.deleteAllProfileSwitches()
}
.subscribeOn(aapsSchedulers.io)
.observeOn(aapsSchedulers.main)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = {
rxBus.send(EventProfileSwitchChanged())
rxBus.send(EventEffectiveProfileSwitchChanged(0L))
rxBus.send(EventNewHistoryData(0, false))
}
)
rxBus.send(EventNSClientRestart())
}
}
if (!sp.getBoolean(R.string.key_ns_receive_profile_switch, false) || !buildHelper.isEngineeringMode()) binding.refreshFromNightscout.visibility = View.GONE
binding.showInvalidated.setOnCheckedChangeListener { _, _ ->
rxBus.send(EventTreatmentUpdateGui())
}
}
private fun profileSwitchWithInvalid(now: Long) = repository
@ -126,23 +128,23 @@ class TreatmentsProfileSwitchFragment : DaggerFragment() {
fun swapAdapter() {
val now = System.currentTimeMillis()
if (binding.showInvalidated.isChecked)
disposable += profileSwitchWithInvalid(now)
.zipWith(effectiveProfileSwitchWithInvalid(now)) { first, second -> first + second }
.map { ml -> ml.sortedByDescending { it.timestamp } }
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerProfileViewAdapter(list), true)
}
else
disposable += profileSwitches(now)
.zipWith(effectiveProfileSwitches(now)) { first, second -> first + second }
.map { ml -> ml.sortedByDescending { it.timestamp } }
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerProfileViewAdapter(list), true)
}
disposable +=
if (showInvalidated)
profileSwitchWithInvalid(now)
.zipWith(effectiveProfileSwitchWithInvalid(now)) { first, second -> first + second }
.map { ml -> ml.sortedByDescending { it.timestamp } }
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerProfileViewAdapter(list), true)
}
else
profileSwitches(now)
.zipWith(effectiveProfileSwitches(now)) { first, second -> first + second }
.map { ml -> ml.sortedByDescending { it.timestamp } }
.observeOn(aapsSchedulers.main)
.subscribe { list ->
binding.recyclerview.swapAdapter(RecyclerProfileViewAdapter(list), true)
}
}
@Synchronized
@ -168,6 +170,7 @@ class TreatmentsProfileSwitchFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.finish()
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
@ -186,64 +189,66 @@ class TreatmentsProfileSwitchFragment : DaggerFragment() {
holder.binding.date.text = dateUtil.dateString(profileSwitch.timestamp)
holder.binding.time.text = dateUtil.timeString(profileSwitch.timestamp)
holder.binding.duration.text = rh.gs(R.string.format_mins, T.msecs(profileSwitch.duration ?: 0L).mins())
holder.binding.name.text = if (profileSwitch is ProfileSealed.PS) profileSwitch.value.getCustomizedName() else if (profileSwitch is ProfileSealed.EPS) profileSwitch.value.originalCustomizedName else ""
holder.binding.name.text =
if (profileSwitch is ProfileSealed.PS) profileSwitch.value.getCustomizedName() else if (profileSwitch is ProfileSealed.EPS) profileSwitch.value.originalCustomizedName else ""
if (profileSwitch.isInProgress(dateUtil)) holder.binding.date.setTextColor(rh.gc(R.color.colorActive))
else holder.binding.date.setTextColor(holder.binding.duration.currentTextColor)
holder.binding.remove.tag = profileSwitch
holder.binding.clone.tag = profileSwitch
holder.binding.name.tag = profileSwitch
holder.binding.date.tag = profileSwitch
holder.binding.invalid.visibility = profileSwitch.isValid.not().toVisibility()
holder.binding.duration.visibility = (profileSwitch.duration != 0L && profileSwitch.duration != null).toVisibility()
holder.binding.remove.visibility = (profileSwitch is ProfileSealed.PS).toVisibility()
holder.binding.cbRemove.visibility = (removeActionMode != null && profileSwitch is ProfileSealed.PS).toVisibility()
if (removeActionMode != null) {
holder.binding.cbRemove.setOnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, profileSwitch)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbRemove.isChecked = selectedItems.get(position) != null
}
holder.binding.clone.visibility = (profileSwitch is ProfileSealed.PS).toVisibility()
holder.binding.spacer.visibility = (profileSwitch is ProfileSealed.PS).toVisibility()
holder.binding.root.setBackgroundColor(rh.gc(if (profileSwitch is ProfileSealed.PS) R.color.defaultbackground else R.color.list_delimiter))
val nextTimestamp = if (profileSwitchList.size != position + 1) profileSwitchList[position + 1].timestamp else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(profileSwitch.timestamp, nextTimestamp).toVisibility()
}
override fun getItemCount(): Int {
return profileSwitchList.size
}
override fun getItemCount() = profileSwitchList.size
inner class ProfileSwitchViewHolder internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding = TreatmentsProfileswitchItemBinding.bind(itemView)
init {
binding.remove.setOnClickListener { view ->
val profileSwitch = view.tag as ProfileSealed.PS
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord),
rh.gs(R.string.careportal_profileswitch) + ": " + profileSwitch.profileName +
"\n" + rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(profileSwitch.timestamp), Runnable {
uel.log(Action.PROFILE_SWITCH_REMOVED, Sources.Treatments, profileSwitch.profileName,
ValueWithUnit.Timestamp(profileSwitch.timestamp))
disposable += repository.runTransactionForResult(InvalidateProfileSwitchTransaction(profileSwitch.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated ProfileSwitch $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating ProfileSwitch", it) }
)
})
}
}
binding.clone.setOnClickListener {
activity?.let { activity ->
val profileSwitch = (it.tag as ProfileSealed.PS).value
val profileSealed = it.tag as ProfileSealed
OKDialog.showConfirmation(activity, rh.gs(R.string.careportal_profileswitch), rh.gs(R.string.copytolocalprofile) + "\n" + profileSwitch.getCustomizedName() + "\n" + dateUtil.dateAndTimeString(profileSwitch.timestamp), Runnable {
uel.log(Action.PROFILE_SWITCH_CLONED, Sources.Treatments,
profileSwitch.getCustomizedName() + " " + dateUtil.dateAndTimeString(profileSwitch.timestamp).replace(".", "_"),
ValueWithUnit.Timestamp(profileSwitch.timestamp),
ValueWithUnit.SimpleString(profileSwitch.profileName))
val nonCustomized = profileSealed.convertToNonCustomizedProfile(dateUtil)
localProfilePlugin.addProfile(localProfilePlugin.copyFrom(nonCustomized, profileSwitch.getCustomizedName() + " " + dateUtil.dateAndTimeString(profileSwitch.timestamp).replace(".", "_")))
rxBus.send(EventLocalProfileChanged())
})
OKDialog.showConfirmation(
activity,
rh.gs(R.string.careportal_profileswitch),
rh.gs(R.string.copytolocalprofile) + "\n" + profileSwitch.getCustomizedName() + "\n" + dateUtil.dateAndTimeString(profileSwitch.timestamp),
Runnable {
uel.log(
Action.PROFILE_SWITCH_CLONED, Sources.Treatments,
profileSwitch.getCustomizedName() + " " + dateUtil.dateAndTimeString(profileSwitch.timestamp).replace(".", "_"),
ValueWithUnit.Timestamp(profileSwitch.timestamp),
ValueWithUnit.SimpleString(profileSwitch.profileName)
)
val nonCustomized = profileSealed.convertToNonCustomizedProfile(dateUtil)
localProfilePlugin.addProfile(
localProfilePlugin.copyFrom(
nonCustomized,
profileSwitch.getCustomizedName() + " " + dateUtil.dateAndTimeString(profileSwitch.timestamp).replace(".", "_")
)
)
rxBus.send(EventLocalProfileChanged())
})
}
}
binding.remove.paintFlags = binding.remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
binding.clone.paintFlags = binding.clone.paintFlags or Paint.UNDERLINE_TEXT_FLAG
binding.name.setOnClickListener {
ProfileViewerDialog().also { pvd ->
@ -266,4 +271,104 @@ class TreatmentsProfileSwitchFragment : DaggerFragment() {
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_profile_switch, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_profile_switch, false) || !buildHelper.isEngineeringMode()
menu.findItem(R.id.nav_refresh_ns)?.isVisible = !nsUploadOnly
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_refresh_ns -> {
refreshFromNightscout()
true
}
else -> false
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val profileSwitch = selectedItems.valueAt(0)
return rh.gs(R.string.careportal_profileswitch) + ": " + profileSwitch.profileName + "\n" + rh.gs(R.string.date) + ": " + dateUtil.dateAndTimeString(profileSwitch.timestamp)
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
private fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach { _, profileSwitch ->
uel.log(
Action.PROFILE_SWITCH_REMOVED, Sources.Treatments, profileSwitch.profileName,
ValueWithUnit.Timestamp(profileSwitch.timestamp)
)
disposable += repository.runTransactionForResult(InvalidateProfileSwitchTransaction(profileSwitch.id))
.subscribe(
{ result -> result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated ProfileSwitch $it") } },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating ProfileSwitch", it) }
)
}
removeActionMode?.finish()
})
}
else
removeActionMode?.finish()
}
}

View file

@ -1,12 +1,11 @@
package info.nightscout.androidaps.activities.fragments
import android.annotation.SuppressLint
import android.content.DialogInterface
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.SparseArray
import android.view.*
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -30,6 +29,8 @@ import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.activities.fragments.TreatmentsTempTargetFragment.RecyclerViewAdapter.TempTargetsViewHolder
import info.nightscout.androidaps.events.EventEffectiveProfileSwitchChanged
import info.nightscout.androidaps.events.EventProfileSwitchChanged
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
@ -40,6 +41,7 @@ import info.nightscout.androidaps.extensions.friendlyDescription
import info.nightscout.androidaps.extensions.highValueToUnitsToString
import info.nightscout.androidaps.extensions.lowValueToUnitsToString
import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.shared.sharedPreferences.SP
@ -65,57 +67,64 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
@Inject lateinit var uel: UserEntryLogger
@Inject lateinit var repository: AppRepository
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var _binding: TreatmentsTemptargetFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val disposable = CompositeDisposable()
private val millsToThePast = T.days(30).msecs()
private var selectedItems: SparseArray<TemporaryTarget> = SparseArray()
private var showInvalidated = false
private var toolbar: Toolbar? = null
private var removeActionMode: ActionMode? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsTemptargetFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.recyclerview.setHasFixedSize(true)
toolbar = activity?.findViewById(R.id.toolbar)
setHasOptionsMenu(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
binding.refreshFromNightscout.setOnClickListener {
context?.let { context ->
OKDialog.showConfirmation(context, rh.gs(R.string.refresheventsfromnightscout) + " ?", {
uel.log(Action.TT_NS_REFRESH, Sources.Treatments)
disposable += Completable.fromAction { repository.deleteAllTempTargetEntries() }
}
private fun refreshFromNightscout() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.refresheventsfromnightscout) + "?") {
uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments)
disposable +=
Completable.fromAction {
repository.deleteAllEffectiveProfileSwitches()
repository.deleteAllProfileSwitches()
}
.subscribeOn(aapsSchedulers.io)
.observeOn(aapsSchedulers.main)
.subscribeBy(
onError = { aapsLogger.error("Error removing entries", it) },
onComplete = { rxBus.send(EventTempTargetChange()) }
onComplete = {
rxBus.send(EventProfileSwitchChanged())
rxBus.send(EventEffectiveProfileSwitchChanged(0L))
rxBus.send(EventNewHistoryData(0, false))
}
)
rxBus.send(EventNSClientRestart())
})
rxBus.send(EventNSClientRestart())
}
}
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_temp_target, false) || !buildHelper.isEngineeringMode()
if (nsUploadOnly) binding.refreshFromNightscout.visibility = View.INVISIBLE
binding.showInvalidated.setOnCheckedChangeListener { _, _ ->
rxBus.send(EventTreatmentUpdateGui())
}
}
fun swapAdapter() {
val now = System.currentTimeMillis()
if (binding.showInvalidated.isChecked)
repository
.getTemporaryTargetDataIncludingInvalidFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
else
repository
.getTemporaryTargetDataFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
disposable +=
if (showInvalidated)
repository
.getTemporaryTargetDataIncludingInvalidFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
else
repository
.getTemporaryTargetDataFromTime(now - millsToThePast, false)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
}
@Synchronized
@ -145,6 +154,7 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.let { it.finish() }
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
@ -163,8 +173,19 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
val tempTarget = tempTargetList[position]
holder.binding.ns.visibility = (tempTarget.interfaceIDs.nightscoutId != null).toVisibility()
holder.binding.invalid.visibility = tempTarget.isValid.not().toVisibility()
holder.binding.remove.visibility = tempTarget.isValid.toVisibility()
val sameDayPrevious = position > 0 && dateUtil.isSameDay(tempTarget.timestamp, tempTargetList[position-1].timestamp)
holder.binding.cbRemove.visibility = (tempTarget.isValid && removeActionMode != null).toVisibility()
if (removeActionMode != null) {
holder.binding.cbRemove.setOnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, tempTarget)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbRemove.isChecked = selectedItems.get(position) != null
}
val sameDayPrevious = position > 0 && dateUtil.isSameDay(tempTarget.timestamp, tempTargetList[position - 1].timestamp)
holder.binding.date.visibility = sameDayPrevious.not().toVisibility()
holder.binding.date.text = dateUtil.dateString(tempTarget.timestamp)
holder.binding.time.text = dateUtil.timeRangeString(tempTarget.timestamp, tempTarget.end)
@ -177,43 +198,123 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
tempTarget.id == currentlyActiveTarget?.id -> rh.gc(R.color.colorActive)
tempTarget.timestamp > dateUtil.now() -> rh.gc(R.color.colorScheduled)
else -> holder.binding.reasonColon.currentTextColor
})
holder.binding.remove.tag = tempTarget
}
)
val nextTimestamp = if (tempTargetList.size != position + 1) tempTargetList[position + 1].timestamp else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(tempTarget.timestamp, nextTimestamp).toVisibility()
}
override fun getItemCount(): Int = tempTargetList.size
override fun getItemCount() = tempTargetList.size
inner class TempTargetsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = TreatmentsTemptargetItemBinding.bind(view)
init {
binding.remove.setOnClickListener { v: View ->
val tempTarget = v.tag as TemporaryTarget
context?.let { context ->
OKDialog.showConfirmation(context, rh.gs(R.string.removerecord),
"""
${rh.gs(R.string.careportal_temporarytarget)}: ${tempTarget.friendlyDescription(profileFunction.getUnits(), rh)}
${dateUtil.dateAndTimeString(tempTarget.timestamp)}
""".trimIndent(),
{ _: DialogInterface?, _: Int ->
uel.log(Action.TT_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(tempTarget.timestamp),
ValueWithUnit.TherapyEventTTReason(tempTarget.reason),
ValueWithUnit.Mgdl(tempTarget.lowTarget),
ValueWithUnit.Mgdl(tempTarget.highTarget).takeIf { tempTarget.lowTarget != tempTarget.highTarget },
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(tempTarget.duration).toInt()))
disposable += repository.runTransactionForResult(InvalidateTemporaryTargetTransaction(tempTarget.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed temp target $tempTarget") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating temporary target", it) })
}, null)
}
}
binding.remove.paintFlags = binding.remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
}
}
}
private fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach { _, tempTarget ->
uel.log(
Action.TT_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(tempTarget.timestamp),
ValueWithUnit.TherapyEventTTReason(tempTarget.reason),
ValueWithUnit.Mgdl(tempTarget.lowTarget),
ValueWithUnit.Mgdl(tempTarget.highTarget).takeIf { tempTarget.lowTarget != tempTarget.highTarget },
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(tempTarget.duration).toInt())
)
disposable += repository.runTransactionForResult(InvalidateTemporaryTargetTransaction(tempTarget.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed temp target $tempTarget") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating temporary target", it) })
}
removeActionMode?.finish()
})
}
else
removeActionMode?.finish()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_temp_target, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
val nsUploadOnly = !sp.getBoolean(R.string.key_ns_receive_temp_target, false) || !buildHelper.isEngineeringMode()
menu.findItem(R.id.nav_refresh_ns)?.isVisible = !nsUploadOnly
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_refresh_ns -> {
refreshFromNightscout()
true
}
else -> false
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val tempTarget = selectedItems.valueAt(0)
return "${rh.gs(R.string.careportal_temporarytarget)}: ${tempTarget.friendlyDescription(profileFunction.getUnits(), rh)}\n" +
dateUtil.dateAndTimeString(tempTarget.timestamp)
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
}

View file

@ -1,11 +1,11 @@
package info.nightscout.androidaps.activities.fragments
import android.content.DialogInterface
import android.graphics.Paint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.util.Log
import android.util.SparseArray
import android.view.*
import androidx.appcompat.widget.Toolbar
import androidx.core.util.forEach
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -36,6 +36,7 @@ import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.activities.fragments.TreatmentsTemporaryBasalsFragment.RecyclerViewAdapter.TempBasalsViewHolder
import info.nightscout.androidaps.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.T
@ -64,18 +65,22 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
@Inject lateinit var repository: AppRepository
private var _binding: TreatmentsTempbasalsFragmentBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val millsToThePast = T.days(30).msecs()
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
private var selectedItems: SparseArray<TemporaryBasal> = SparseArray()
private var showInvalidated = false
private var toolbar: Toolbar? = null
private var removeActionMode: ActionMode? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
TreatmentsTempbasalsFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar = activity?.findViewById(R.id.toolbar)
setHasOptionsMenu(true)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
}
@ -98,7 +103,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
val now = System.currentTimeMillis()
disposable +=
if (activePlugin.activePump.isFakingTempsByExtendedBoluses) {
if (binding.showInvalidated.isChecked)
if (showInvalidated)
tempBasalsWithInvalid(now)
.zipWith(extendedBolusesWithInvalid(now)) { first, second -> first + second }
.map { list -> list.filterNotNull() }
@ -113,7 +118,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
} else {
if (binding.showInvalidated.isChecked)
if (showInvalidated)
tempBasalsWithInvalid(now)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(RecyclerViewAdapter(list), true) }
@ -150,6 +155,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
@Synchronized
override fun onDestroyView() {
super.onDestroyView()
removeActionMode?.let { it.finish() }
binding.recyclerview.adapter = null // avoid leaks
_binding = null
}
@ -164,7 +170,7 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
holder.binding.ns.visibility = (tempBasal.interfaceIDs.nightscoutId != null).toVisibility()
holder.binding.invalid.visibility = tempBasal.isValid.not().toVisibility()
holder.binding.ph.visibility = (tempBasal.interfaceIDs.pumpId != null).toVisibility()
val sameDayPrevious = position > 0 && dateUtil.isSameDay(tempBasal.timestamp, tempBasalList[position-1].timestamp)
val sameDayPrevious = position > 0 && dateUtil.isSameDay(tempBasal.timestamp, tempBasalList[position - 1].timestamp)
holder.binding.date.visibility = sameDayPrevious.not().toVisibility()
holder.binding.date.text = dateUtil.dateString(tempBasal.timestamp)
if (tempBasal.isInProgress) {
@ -187,62 +193,147 @@ class TreatmentsTemporaryBasalsFragment : DaggerFragment() {
holder.binding.emulatedSuspendFlag.visibility = (tempBasal.type == TemporaryBasal.Type.EMULATED_PUMP_SUSPEND).toVisibility()
holder.binding.superBolusFlag.visibility = (tempBasal.type == TemporaryBasal.Type.SUPERBOLUS).toVisibility()
if (abs(iob.basaliob) > 0.01) holder.binding.iob.setTextColor(rh.gc(R.color.colorActive)) else holder.binding.iob.setTextColor(holder.binding.duration.currentTextColor)
holder.binding.remove.tag = tempBasal
holder.binding.cbRemove.visibility = (tempBasal.isValid && removeActionMode != null).toVisibility()
if (removeActionMode != null) {
holder.binding.cbRemove.setOnCheckedChangeListener { _, value ->
if (value) {
selectedItems.put(position, tempBasal)
} else {
selectedItems.remove(position)
}
removeActionMode?.title = rh.gs(R.string.count_selected, selectedItems.size())
}
holder.binding.cbRemove.isChecked = selectedItems.get(position) != null
}
val nextTimestamp = if (tempBasalList.size != position + 1) tempBasalList[position + 1].timestamp else 0L
holder.binding.delimiter.visibility = dateUtil.isSameDay(tempBasal.timestamp, nextTimestamp).toVisibility()
}
override fun getItemCount(): Int = tempBasalList.size
override fun getItemCount() = tempBasalList.size
inner class TempBasalsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding = TreatmentsTempbasalsItemBinding.bind(itemView)
init {
binding.remove.setOnClickListener { v: View ->
val tempBasal = v.tag as TemporaryBasal
var extendedBolus: ExtendedBolus? = null
val isFakeExtended = tempBasal.type == TemporaryBasal.Type.FAKE_EXTENDED
if (isFakeExtended) {
val eb = repository.getExtendedBolusActiveAt(tempBasal.timestamp).blockingGet()
extendedBolus = if (eb is ValueWrapper.Existing) eb.value else null
}
val profile = profileFunction.getProfile(dateUtil.now())
?: return@setOnClickListener
context?.let {
OKDialog.showConfirmation(it, rh.gs(R.string.removerecord),
"""
${if (isFakeExtended) rh.gs(R.string.extended_bolus) else rh.gs(R.string.tempbasal_label)}: ${tempBasal.toStringFull(profile, dateUtil)}
${rh.gs(R.string.date)}: ${dateUtil.dateAndTimeString(tempBasal.timestamp)}
""".trimIndent(),
{ _: DialogInterface?, _: Int ->
if (isFakeExtended && extendedBolus != null) {
uel.log(Action.EXTENDED_BOLUS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(extendedBolus.timestamp),
ValueWithUnit.Insulin(extendedBolus.amount),
ValueWithUnit.UnitPerHour(extendedBolus.rate),
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(extendedBolus.duration).toInt()))
disposable += repository.runTransactionForResult(InvalidateExtendedBolusTransaction(extendedBolus.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed extended bolus $extendedBolus") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating extended bolus", it) })
} else if (!isFakeExtended) {
uel.log(Action.TEMP_BASAL_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(tempBasal.timestamp),
if (tempBasal.isAbsolute) ValueWithUnit.UnitPerHour(tempBasal.rate) else ValueWithUnit.Percent(tempBasal.rate.toInt()),
ValueWithUnit.Minute(T.msecs(tempBasal.duration).mins().toInt()))
disposable += repository.runTransactionForResult(InvalidateTemporaryBasalTransaction(tempBasal.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed temporary basal $tempBasal") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating temporary basal", it) })
}
}, null)
}
}
binding.remove.paintFlags = binding.remove.paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_temp_basal, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_invalidated)?.isVisible = showInvalidated
menu.findItem(R.id.nav_show_invalidated)?.isVisible = !showInvalidated
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_remove_items -> {
removeActionMode = toolbar?.startActionMode(RemoveActionModeCallback())
true
}
R.id.nav_show_invalidated -> {
showInvalidated = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_invalidated -> {
showInvalidated = false
rxBus.send(EventTreatmentUpdateGui())
true
}
else -> false
}
inner class RemoveActionModeCallback : ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {
mode.menuInflater.inflate(R.menu.menu_delete_selection, menu)
selectedItems.clear()
mode.title = rh.gs(R.string.count_selected, selectedItems.size())
binding.recyclerview.adapter?.notifyDataSetChanged()
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?) = false
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.remove_selected -> {
removeSelected()
true
}
else -> false
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
removeActionMode = null
binding.recyclerview.adapter?.notifyDataSetChanged()
}
}
private fun getConfirmationText(): String {
if (selectedItems.size() == 1) {
val tempBasal = selectedItems.valueAt(0)
val isFakeExtended = tempBasal.type == TemporaryBasal.Type.FAKE_EXTENDED
val profile = profileFunction.getProfile(dateUtil.now())
if (profile != null)
return "${if (isFakeExtended) rh.gs(R.string.extended_bolus) else rh.gs(R.string.tempbasal_label)}: ${tempBasal.toStringFull(profile, dateUtil)}\n" +
"${rh.gs(R.string.date)}: ${dateUtil.dateAndTimeString(tempBasal.timestamp)}"
}
return rh.gs(R.string.confirm_remove_multiple_items, selectedItems.size())
}
private fun removeSelected() {
if (selectedItems.size() > 0)
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.removerecord), getConfirmationText(), Runnable {
selectedItems.forEach {_, tempBasal ->
var extendedBolus: ExtendedBolus? = null
val isFakeExtended = tempBasal.type == TemporaryBasal.Type.FAKE_EXTENDED
if (isFakeExtended) {
val eb = repository.getExtendedBolusActiveAt(tempBasal.timestamp).blockingGet()
extendedBolus = if (eb is ValueWrapper.Existing) eb.value else null
}
if (isFakeExtended && extendedBolus != null) {
uel.log(
Action.EXTENDED_BOLUS_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(extendedBolus.timestamp),
ValueWithUnit.Insulin(extendedBolus.amount),
ValueWithUnit.UnitPerHour(extendedBolus.rate),
ValueWithUnit.Minute(TimeUnit.MILLISECONDS.toMinutes(extendedBolus.duration).toInt())
)
disposable += repository.runTransactionForResult(InvalidateExtendedBolusTransaction(extendedBolus.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed extended bolus $extendedBolus") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating extended bolus", it) })
} else if (!isFakeExtended) {
uel.log(
Action.TEMP_BASAL_REMOVED, Sources.Treatments,
ValueWithUnit.Timestamp(tempBasal.timestamp),
if (tempBasal.isAbsolute) ValueWithUnit.UnitPerHour(tempBasal.rate) else ValueWithUnit.Percent(tempBasal.rate.toInt()),
ValueWithUnit.Minute(T.msecs(tempBasal.duration).mins().toInt())
)
disposable += repository.runTransactionForResult(InvalidateTemporaryBasalTransaction(tempBasal.id))
.subscribe(
{ aapsLogger.debug(LTag.DATABASE, "Removed temporary basal $tempBasal") },
{ aapsLogger.error(LTag.DATABASE, "Error while invalidating temporary basal", it) })
}
}
removeActionMode?.finish()
})
}
else
removeActionMode?.finish()
}
}

View file

@ -1,9 +1,7 @@
package info.nightscout.androidaps.activities.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.*
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dagger.android.support.DaggerFragment
@ -30,6 +28,7 @@ import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ -51,11 +50,10 @@ class TreatmentsUserEntryFragment : DaggerFragment() {
private val millsToThePastFiltered = T.days(30).msecs()
private val millsToThePastUnFiltered = T.days(3).msecs()
private var showLoop = false
private var _binding: TreatmentsUserEntryFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
@ -63,35 +61,33 @@ class TreatmentsUserEntryFragment : DaggerFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(view.context)
binding.ueExportToXml.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.ue_export_to_csv) + "?") {
uel.log(Action.EXPORT_CSV, Sources.Treatments)
importExportPrefs.exportUserEntriesCsv(activity)
}
}
fun exportUserEnteries() {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.ue_export_to_csv) + "?") {
uel.log(Action.EXPORT_CSV, Sources.Treatments)
importExportPrefs.exportUserEntriesCsv(activity)
}
}
binding.showLoop.setOnCheckedChangeListener { _, _ ->
rxBus.send(EventTreatmentUpdateGui())
}
}
fun swapAdapter() {
val now = System.currentTimeMillis()
if (binding.showLoop.isChecked)
disposable.add( repository
.getUserEntryDataFromTime(now - millsToThePastUnFiltered)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(UserEntryAdapter(list), true) }
)
else
disposable.add( repository
.getUserEntryFilteredDataFromTime(now - millsToThePastFiltered)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(UserEntryAdapter(list), true) }
)
disposable +=
if (showLoop)
repository
.getUserEntryDataFromTime(now - millsToThePastUnFiltered)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(UserEntryAdapter(list), true) }
else
repository
.getUserEntryFilteredDataFromTime(now - millsToThePastFiltered)
.observeOn(aapsSchedulers.main)
.subscribe { list -> binding.recyclerview.swapAdapter(UserEntryAdapter(list), true) }
}
@Synchronized
@ -99,15 +95,15 @@ class TreatmentsUserEntryFragment : DaggerFragment() {
super.onResume()
swapAdapter()
disposable.add(rxBus
disposable += rxBus
.toObservable(EventPreferenceChange::class.java)
.observeOn(aapsSchedulers.io)
.subscribe({ swapAdapter() }, fabricPrivacy::logException))
disposable.add(rxBus
.subscribe({ swapAdapter() }, fabricPrivacy::logException)
disposable += rxBus
.toObservable(EventTreatmentUpdateGui::class.java)
.observeOn(aapsSchedulers.io)
.debounce(1L, TimeUnit.SECONDS)
.subscribe({ swapAdapter() }, fabricPrivacy::logException))
.subscribe({ swapAdapter() }, fabricPrivacy::logException)
}
@Synchronized
@ -132,7 +128,7 @@ class TreatmentsUserEntryFragment : DaggerFragment() {
override fun onBindViewHolder(holder: UserEntryViewHolder, position: Int) {
val current = entries[position]
val sameDayPrevious = position > 0 && dateUtil.isSameDay(current.timestamp, entries[position-1].timestamp)
val sameDayPrevious = position > 0 && dateUtil.isSameDay(current.timestamp, entries[position - 1].timestamp)
holder.binding.date.visibility = sameDayPrevious.not().toVisibility()
holder.binding.date.text = dateUtil.dateString(current.timestamp)
holder.binding.time.text = dateUtil.timeStringWithSeconds(current.timestamp)
@ -152,7 +148,40 @@ class TreatmentsUserEntryFragment : DaggerFragment() {
val binding = TreatmentsUserEntryItemBinding.bind(itemView)
}
override fun getItemCount(): Int = entries.size
override fun getItemCount() = entries.size
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_treatments_user_entry, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onPrepareOptionsMenu(menu: Menu) {
menu.findItem(R.id.nav_hide_loop)?.isVisible = showLoop
menu.findItem(R.id.nav_show_loop)?.isVisible = !showLoop
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
R.id.nav_show_loop -> {
showLoop = true
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_hide_loop -> {
showLoop = false
rxBus.send(EventTreatmentUpdateGui())
true
}
R.id.nav_export -> {
exportUserEnteries()
true
}
else -> false
}
}

View file

@ -143,7 +143,7 @@ class ProfileSwitchDialog : DialogFragmentWithDate() {
binding.reusebutton.text = rh.gs(R.string.reuse_profile_pct_hours, profile.value.originalPercentage, T.msecs(profile.value.originalTimeshift).hours().toInt())
binding.reusebutton.setOnClickListener {
binding.percentage.value = profile.value.originalPercentage.toDouble()
binding.timeshift.value = profile.value.originalTimeshift.toDouble()
binding.timeshift.value = T.msecs(profile.value.originalTimeshift).hours().toDouble()
}
}
}

View file

@ -125,7 +125,9 @@ class WizardDialog : DaggerDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
loadCheckedStates()
processCobCheckBox()
binding.sbCheckbox.visibility = sp.getBoolean(R.string.key_usesuperbolus, false).toVisibility()
val useSuperBolus = sp.getBoolean(R.string.key_usesuperbolus, false)
binding.sbCheckbox.visibility = useSuperBolus.toVisibility()
binding.superBolusRow.visibility = useSuperBolus.toVisibility()
binding.notesLayout.visibility = sp.getBoolean(R.string.key_show_notes_entry_dialogs, false).toVisibility()
val maxCarbs = constraintChecker.getMaxCarbsAllowed().value()
@ -146,7 +148,7 @@ class WizardDialog : DaggerDialogFragment() {
if (correctionPercent) {
calculatedPercentage = sp.getInt(R.string.key_boluswizard_percentage, 100).toDouble()
binding.correctionInput.setParams(calculatedPercentage, 10.0, 200.0, 1.0, DecimalFormat("0"), false, binding.okcancel.ok, textWatcher)
binding.correctionInput.setParams(calculatedPercentage, 10.0, 200.0, 5.0, DecimalFormat("0"), false, binding.okcancel.ok, textWatcher)
binding.correctionInput.value = calculatedPercentage
binding.correctionUnit.text = "%"
} else {
@ -175,9 +177,10 @@ class WizardDialog : DaggerDialogFragment() {
dismiss()
}
binding.bgCheckboxIcon.setOnClickListener { binding.bgCheckbox.isChecked = !binding.bgCheckbox.isChecked }
binding.ttCheckboxIcon.setOnClickListener { binding.ttCheckbox.isChecked = !binding.ttCheckbox.isChecked }
binding.trendCheckboxIcon.setOnClickListener { binding.bgTrendCheckbox.isChecked = !binding.bgTrendCheckbox.isChecked }
binding.cobCheckboxIcon.setOnClickListener { binding.cobCheckbox.isChecked = !binding.cobCheckbox.isChecked; processCobCheckBox(); }
binding.iobCheckboxIcon.setOnClickListener { if (!binding.cobCheckbox.isChecked) binding.iobCheckbox.isChecked = !binding.iobCheckbox.isChecked }
binding.iobCheckboxIcon.setOnClickListener { binding.iobCheckbox.isChecked = !binding.iobCheckbox.isChecked; processIobCheckBox(); }
// cancel button
binding.okcancel.cancel.setOnClickListener {
aapsLogger.debug(LTag.APS, "Dialog canceled: ${this.javaClass.name}")
@ -212,7 +215,7 @@ class WizardDialog : DaggerDialogFragment() {
binding.correctionUnit.text = if (isChecked) "%" else rh.gs(R.string.insulin_unit_shortname)
correctionPercent = binding.correctionPercent.isChecked
if (correctionPercent) {
binding.correctionInput.setParams(calculatedPercentage, 10.0, 200.0, 1.0, DecimalFormat("0"), false, binding.okcancel.ok, textWatcher)
binding.correctionInput.setParams(calculatedPercentage, 10.0, 200.0, 5.0, DecimalFormat("0"), false, binding.okcancel.ok, textWatcher)
binding.correctionInput.customContentDescription = rh.gs(R.string.a11_correction_percentage)
} else {
binding.correctionInput.setParams(
@ -265,35 +268,42 @@ class WizardDialog : DaggerDialogFragment() {
private fun onCheckedChanged(buttonView: CompoundButton, @Suppress("UNUSED_PARAMETER") state: Boolean) {
saveCheckedStates()
binding.ttCheckbox.isEnabled = binding.bgCheckbox.isChecked && repository.getTemporaryTargetActiveAt(dateUtil.now()).blockingGet() is ValueWrapper.Existing
binding.ttCheckboxIcon.visibility = binding.ttCheckbox.isEnabled.toVisibility()
if (buttonView.id == binding.cobCheckbox.id)
processCobCheckBox()
if (buttonView.id == binding.iobCheckbox.id)
processIobCheckBox()
processEnabledIcons()
calculateInsulin()
}
private fun processCobCheckBox() {
if (binding.cobCheckbox.isChecked) {
binding.iobCheckbox.isEnabled = false
binding.iobCheckboxIcon.isEnabled = false
binding.iobCheckbox.isChecked = true
} else {
binding.iobCheckbox.isEnabled = true
binding.iobCheckboxIcon.isEnabled = true
}
}
private fun processIobCheckBox() {
if (!binding.iobCheckbox.isChecked) {
binding.cobCheckbox.isChecked = false
}
}
private fun processEnabledIcons() {
binding.bgCheckboxIcon.isChecked = binding.bgCheckbox.isChecked
binding.ttCheckboxIcon.isChecked = binding.ttCheckbox.isChecked
binding.trendCheckboxIcon.isChecked = binding.bgTrendCheckbox.isChecked
binding.iobCheckboxIcon.isChecked = binding.iobCheckbox.isChecked
binding.cobCheckboxIcon.isChecked = binding.cobCheckbox.isChecked
binding.bgCheckboxIcon.alpha = if (binding.bgCheckbox.isChecked) 1.0f else 0.2f
binding.ttCheckboxIcon.alpha = if (binding.ttCheckbox.isChecked) 1.0f else 0.2f
binding.trendCheckboxIcon.alpha = if (binding.bgTrendCheckbox.isChecked) 1.0f else 0.2f
binding.iobCheckboxIcon.alpha = if (binding.iobCheckbox.isChecked) 1.0f else 0.2f
binding.cobCheckboxIcon.alpha = if (binding.cobCheckbox.isChecked) 1.0f else 0.2f
binding.bgCheckboxIcon.visibility = binding.calculationCheckbox.isChecked.not().toVisibility()
binding.ttCheckboxIcon.visibility = (binding.calculationCheckbox.isChecked.not() && binding.ttCheckbox.isEnabled).toVisibility()
binding.trendCheckboxIcon.visibility = binding.calculationCheckbox.isChecked.not().toVisibility()
binding.iobCheckboxIcon.visibility = binding.calculationCheckbox.isChecked.not().toVisibility()
binding.cobCheckboxIcon.visibility = binding.calculationCheckbox.isChecked.not().toVisibility()
@ -345,7 +355,9 @@ class WizardDialog : DaggerDialogFragment() {
// Set BG if not old
binding.bgInput.value = iobCobCalculator.ads.actualBg()?.valueToUnits(units) ?: 0.0
binding.ttCheckbox.isEnabled = repository.getTemporaryTargetActiveAt(dateUtil.now()).blockingGet() is ValueWrapper.Existing
binding.ttCheckboxIcon.visibility = binding.ttCheckbox.isEnabled.toVisibility()
// IOB calculation
val bolusIob = iobCobCalculator.calculateIobFromBolus().round()

View file

@ -258,8 +258,9 @@ class DetermineBasalAdapterSMBDynamicISFJS internal constructor(private val scri
this.mealData.put("lastBolusTime", mealData.lastBolusTime)
this.mealData.put("lastCarbTime", mealData.lastCarbTime)
this.mealData.put("TDDAIMI7", tddCalculator.averageTDD(tddCalculator.calculate(7)).totalAmount)
this.mealData.put("TDDAIMI7", tddCalculator.averageTDD(tddCalculator.calculate(7))?.totalAmount)
this.mealData.put("TDDPUMP", tddCalculator.calculateDaily().totalAmount)
this.mealData.put("TDDLast24", tddCalculator.calculate24Daily().totalAmount)
if (constraintChecker.isAutosensModeEnabled().value()) {
autosensData.put("ratio", autosensDataRatio)

View file

@ -65,6 +65,7 @@ class OpenAPSSMBDynamicISFPlugin @Inject constructor(
pluginDescription
.pluginName(R.string.openaps_smb_dynamic_isf)
.description(R.string.description_smb_dynamic_isf)
.shortName(R.string.dynisf_shortname)
.setDefault(false)
}

View file

@ -9,6 +9,7 @@ import info.nightscout.androidaps.interfaces.*
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin
import info.nightscout.androidaps.plugins.aps.openAPSSMBDynamicISF.OpenAPSSMBDynamicISFPlugin
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
@ -36,6 +37,7 @@ class SafetyPlugin @Inject constructor(
private val constraintChecker: ConstraintChecker,
private val openAPSAMAPlugin: OpenAPSAMAPlugin,
private val openAPSSMBPlugin: OpenAPSSMBPlugin,
private val OpenAPSSMBDynamicISFPlugin: OpenAPSSMBDynamicISFPlugin,
private val sensitivityOref1Plugin: SensitivityOref1Plugin,
private val activePlugin: ActivePlugin,
private val hardLimits: HardLimits,
@ -188,10 +190,12 @@ class SafetyPlugin @Inject constructor(
override fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> {
val apsMode = sp.getString(R.string.key_aps_mode, "open")
val maxIobPref: Double = if (openAPSSMBPlugin.isEnabled()) sp.getDouble(R.string.key_openapssmb_max_iob, 3.0) else sp.getDouble(R.string.key_openapsma_max_iob, 1.5)
val maxIobPref: Double = if (openAPSSMBPlugin.isEnabled() || OpenAPSSMBDynamicISFPlugin.isEnabled()) sp.getDouble(R.string.key_openapssmb_max_iob, 3.0) else sp.getDouble(R.string
.key_openapsma_max_iob, 1.5)
maxIob.setIfSmaller(aapsLogger, maxIobPref, String.format(rh.gs(R.string.limitingiob), maxIobPref, rh.gs(R.string.maxvalueinpreferences)), this)
if (openAPSAMAPlugin.isEnabled()) maxIob.setIfSmaller(aapsLogger, hardLimits.maxIobAMA(), String.format(rh.gs(R.string.limitingiob), hardLimits.maxIobAMA(), rh.gs(R.string.hardlimit)), this)
if (openAPSSMBPlugin.isEnabled()) maxIob.setIfSmaller(aapsLogger, hardLimits.maxIobSMB(), String.format(rh.gs(R.string.limitingiob), hardLimits.maxIobSMB(), rh.gs(R.string.hardlimit)), this)
if (OpenAPSSMBDynamicISFPlugin.isEnabled()) maxIob.setIfSmaller(aapsLogger, hardLimits.maxIobSMB(), String.format(rh.gs(R.string.limitingiob), hardLimits.maxIobSMB(), rh.gs(R.string.hardlimit)), this)
if (apsMode == "lgs") maxIob.setIfSmaller(aapsLogger, HardLimits.MAX_IOB_LGS, String.format(rh.gs(R.string.limitingiob), HardLimits.MAX_IOB_LGS, rh.gs(R.string.lowglucosesuspend)), this)
return maxIob
}
@ -207,4 +211,4 @@ class SafetyPlugin @Inject constructor(
configuration.storeDouble(R.string.key_treatmentssafety_maxbolus, sp, rh)
configuration.storeInt(R.string.key_treatmentssafety_maxcarbs, sp, rh)
}
}
}

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
@ -20,7 +21,7 @@ import androidx.recyclerview.widget.ItemTouchHelper.UP
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.activities.DaggerAppCompatActivityWithResult
import info.nightscout.androidaps.databinding.OverviewQuickwizardlistActivityBinding
import info.nightscout.androidaps.plugins.bus.RxBus
import info.nightscout.androidaps.plugins.general.overview.dialogs.EditQuickWizardDialog
@ -35,7 +36,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import javax.inject.Inject
class QuickWizardListActivity : NoSplashAppCompatActivity() {
class QuickWizardListActivity : DaggerAppCompatActivityWithResult() {
@Inject lateinit var aapsSchedulers: AapsSchedulers
@Inject lateinit var rxBus: RxBus
@ -180,6 +181,10 @@ class QuickWizardListActivity : NoSplashAppCompatActivity() {
binding = OverviewQuickwizardlistActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
title = rh.gs(R.string.quickwizard)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
binding.recyclerview.setHasFixedSize(true)
binding.recyclerview.layoutManager = LinearLayoutManager(this)
binding.recyclerview.adapter = RecyclerViewAdapter(supportFragmentManager)
@ -207,4 +212,14 @@ class QuickWizardListActivity : NoSplashAppCompatActivity() {
disposable.clear()
super.onPause()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.home -> {
finish()
true
}
else -> false
}
}

View file

@ -105,7 +105,8 @@ class EditQuickWizardDialog : DaggerDialogFragment(), View.OnClickListener {
binding.from.setOnClickListener {
context?.let {
TimePickerDialog(
it, fromTimeSetListener,
it, R.style.MaterialPickerTheme,
fromTimeSetListener,
T.secs(fromSeconds.toLong()).hours().toInt(),
T.secs((fromSeconds % 3600).toLong()).mins().toInt(),
DateFormat.is24HourFormat(context)
@ -123,7 +124,8 @@ class EditQuickWizardDialog : DaggerDialogFragment(), View.OnClickListener {
binding.to.setOnClickListener {
context?.let {
TimePickerDialog(
it, toTimeSetListener,
it, R.style.MaterialPickerTheme,
toTimeSetListener,
T.secs(toSeconds.toLong()).hours().toInt(),
T.secs((toSeconds % 3600).toLong()).mins().toInt(),
DateFormat.is24HourFormat(context)

View file

@ -165,7 +165,7 @@ class SmsCommunicatorPlugin @Inject constructor(
override fun updatePreferenceSummary(pref: Preference) {
super.updatePreferenceSummary(pref)
if (pref is EditTextPreference) {
if (pref.getKey().contains("smscommunicator_allowednumbers") && (pref.text == null || TextUtils.isEmpty(pref.text.trim { it <= ' ' }))) {
if (pref.getKey().contains("smscommunicator_allowednumbers") && (TextUtils.isEmpty(pref.text?.trim { it <= ' ' }))) {
pref.setSummary(rh.gs(R.string.smscommunicator_allowednumbers_summary))
}
}

View file

@ -31,7 +31,6 @@ import info.nightscout.androidaps.utils.HardLimits
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.ui.SpinnerHelper
import info.nightscout.androidaps.utils.ui.TimeListEdit
import info.nightscout.shared.SafeParse
import info.nightscout.shared.logging.AAPSLogger
@ -57,12 +56,12 @@ class LocalProfileFragment : DaggerFragment() {
private var disposable: CompositeDisposable = CompositeDisposable()
private var basalView: TimeListEdit? = null
private var spinner: SpinnerHelper? = null
// private var spinner: SpinnerHelper? = null
private val save = Runnable {
doEdit()
basalView?.updateLabel(rh.gs(R.string.basal_label) + ": " + sumLabel())
localProfilePlugin.profile?.getSpecificProfile(spinner?.selectedItem.toString())?.let {
localProfilePlugin.profile?.getSpecificProfile(binding.profileList.text.toString())?.let {
binding.basalGraph.show(ProfileSealed.Pure(it))
binding.icGraph.show(ProfileSealed.Pure(it))
binding.isfGraph.show(ProfileSealed.Pure(it))
@ -138,56 +137,118 @@ class LocalProfileFragment : DaggerFragment() {
binding.name.addTextChangedListener(textWatch)
binding.dia.setParams(currentProfile.dia, hardLimits.minDia(), hardLimits.maxDia(), 0.1, DecimalFormat("0.0"), false, null, textWatch)
binding.dia.tag = "LP_DIA"
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.ic_holder, "IC", rh.gs(R.string.ic_long_label), currentProfile.ic, null, doubleArrayOf(hardLimits.minIC(), hardLimits.maxIC()), null, 0.1, DecimalFormat ("0.0"), save)
basalView = TimeListEdit(context, aapsLogger, dateUtil, view, R.id.basal_holder, "BASAL", rh.gs(R.string.basal_long_label) + ": " + sumLabel(), currentProfile.basal, null, doubleArrayOf(pumpDescription.basalMinimumRate, pumpDescription.basalMaximumRate), null, 0.01, DecimalFormat("0.00"), save)
TimeListEdit(
context,
aapsLogger,
dateUtil,
view,
R.id.ic_holder,
"IC",
rh.gs(R.string.ic_long_label),
currentProfile.ic,
null,
doubleArrayOf(hardLimits.minIC(), hardLimits.maxIC()),
null,
0.1,
DecimalFormat("0.0"),
save
)
basalView =
TimeListEdit(
context,
aapsLogger,
dateUtil,
view,
R.id.basal_holder,
"BASAL",
rh.gs(R.string.basal_long_label) + ": " + sumLabel(),
currentProfile.basal,
null,
doubleArrayOf(pumpDescription.basalMinimumRate, pumpDescription.basalMaximumRate),
null,
0.01,
DecimalFormat("0.00"),
save
)
if (units == Constants.MGDL) {
val isfRange = doubleArrayOf(HardLimits.MIN_ISF, HardLimits.MAX_ISF)
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.isf_holder, "ISF", rh.gs(R.string.isf_long_label), currentProfile.isf, null, isfRange , null, 1.0, DecimalFormat("0"), save)
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.target_holder, "TARGET", rh.gs(R.string.target_long_label), currentProfile.targetLow, currentProfile.targetHigh, HardLimits.VERY_HARD_LIMIT_MIN_BG, HardLimits.VERY_HARD_LIMIT_TARGET_BG, 1.0, DecimalFormat("0"), save)
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.isf_holder, "ISF", rh.gs(R.string.isf_long_label), currentProfile.isf, null, isfRange, null, 1.0, DecimalFormat("0"), save)
TimeListEdit(
context,
aapsLogger,
dateUtil,
view,
R.id.target_holder,
"TARGET",
rh.gs(R.string.target_long_label),
currentProfile.targetLow,
currentProfile.targetHigh,
HardLimits.VERY_HARD_LIMIT_MIN_BG,
HardLimits.VERY_HARD_LIMIT_TARGET_BG,
1.0,
DecimalFormat("0"),
save
)
} else {
val isfRange = doubleArrayOf(roundUp(Profile.fromMgdlToUnits(HardLimits.MIN_ISF, GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.MAX_ISF, GlucoseUnit.MMOL)))
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.isf_holder, "ISF", rh.gs(R.string.isf_long_label), currentProfile.isf, null,isfRange , null, 0.1, DecimalFormat("0.0"), save)
val range1 = doubleArrayOf(roundUp(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MIN_BG[0], GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MIN_BG[1], GlucoseUnit.MMOL)))
val range2 = doubleArrayOf(roundUp(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MAX_BG[0], GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MAX_BG[1], GlucoseUnit.MMOL)))
Log.i("TimeListEdit", "build: range1" + range1[0] + " " + range1[1] + " range2" + range2[0] + " " + range2[1])
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.target_holder, "TARGET", rh.gs(R.string.target_long_label), currentProfile.targetLow, currentProfile.targetHigh, range1 , range2, 0.1, DecimalFormat("0.0"), save)
val isfRange = doubleArrayOf(
roundUp(Profile.fromMgdlToUnits(HardLimits.MIN_ISF, GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.MAX_ISF, GlucoseUnit.MMOL))
)
TimeListEdit(context, aapsLogger, dateUtil, view, R.id.isf_holder, "ISF", rh.gs(R.string.isf_long_label), currentProfile.isf, null, isfRange, null, 0.1, DecimalFormat("0.0"), save)
val range1 = doubleArrayOf(
roundUp(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MIN_BG[0], GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MIN_BG[1], GlucoseUnit.MMOL))
)
val range2 = doubleArrayOf(
roundUp(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MAX_BG[0], GlucoseUnit.MMOL)),
roundDown(Profile.fromMgdlToUnits(HardLimits.VERY_HARD_LIMIT_MAX_BG[1], GlucoseUnit.MMOL))
)
Log.i("TimeListEdit", "build: range1" + range1[0] + " " + range1[1] + " range2" + range2[0] + " " + range2[1])
TimeListEdit(
context,
aapsLogger,
dateUtil,
view,
R.id.target_holder,
"TARGET",
rh.gs(R.string.target_long_label),
currentProfile.targetLow,
currentProfile.targetHigh,
range1,
range2,
0.1,
DecimalFormat("0.0"),
save
)
}
// Spinner
spinner = SpinnerHelper(binding.spinner)
context?.let { context ->
val profileList: ArrayList<CharSequence> = localProfilePlugin.profile?.getProfileList() ?: ArrayList()
spinner?.adapter = ArrayAdapter(context, R.layout.spinner_centered, profileList)
val selection = localProfilePlugin.currentProfileIndex
if (selection in 0 until profileList.size) spinner?.setSelection(selection)
binding.profileList.setAdapter(ArrayAdapter(context, R.layout.spinner_centered, profileList))
} ?: return
spinner?.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
if (localProfilePlugin.isEdited) {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.doyouwantswitchprofile), {
binding.profileList.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
if (localProfilePlugin.isEdited) {
activity?.let { activity ->
OKDialog.showConfirmation(
activity, rh.gs(R.string.doyouwantswitchprofile),
{
localProfilePlugin.currentProfileIndex = position
localProfilePlugin.isEdited = false
build()
}, {
val selection = localProfilePlugin.currentProfileIndex
if (selection in 0 until (spinner?.adapter?.count ?: -1)) spinner?.setSelection(selection)
}
)
}
} else {
localProfilePlugin.currentProfileIndex = position
build()
if (selection in 0 until (binding.profileList.adapter?.count ?: -1)) binding.profileList.setSelection(selection)
}
)
}
} else {
localProfilePlugin.currentProfileIndex = position
build()
}
})
localProfilePlugin.profile?.getSpecificProfile(spinner?.selectedItem.toString())?.let {
}
localProfilePlugin.profile?.getSpecificProfile(binding.profileList.text.toString())?.let {
binding.basalGraph.show(ProfileSealed.Pure(it))
binding.icGraph.show(ProfileSealed.Pure(it))
binding.isfGraph.show(ProfileSealed.Pure(it))
@ -209,8 +270,12 @@ class LocalProfileFragment : DaggerFragment() {
if (localProfilePlugin.isEdited) {
activity?.let { OKDialog.show(it, "", rh.gs(R.string.saveorresetchangesfirst)) }
} else {
uel.log(Action.CLONE_PROFILE, Sources.LocalProfile, ValueWithUnit.SimpleString(localProfilePlugin.currentProfile()?.name
?: ""))
uel.log(
Action.CLONE_PROFILE, Sources.LocalProfile, ValueWithUnit.SimpleString(
localProfilePlugin.currentProfile()?.name
?: ""
)
)
localProfilePlugin.cloneProfile()
build()
}
@ -219,8 +284,12 @@ class LocalProfileFragment : DaggerFragment() {
binding.profileRemove.setOnClickListener {
activity?.let { activity ->
OKDialog.showConfirmation(activity, rh.gs(R.string.deletecurrentprofile), {
uel.log(Action.PROFILE_REMOVED, Sources.LocalProfile, ValueWithUnit.SimpleString(localProfilePlugin.currentProfile()?.name
?: ""))
uel.log(
Action.PROFILE_REMOVED, Sources.LocalProfile, ValueWithUnit.SimpleString(
localProfilePlugin.currentProfile()?.name
?: ""
)
)
localProfilePlugin.removeCurrentProfile()
build()
}, null)
@ -248,8 +317,12 @@ class LocalProfileFragment : DaggerFragment() {
if (!localProfilePlugin.isValidEditState(activity)) {
return@setOnClickListener //Should not happen as saveButton should not be visible if not valid
}
uel.log(Action.STORE_PROFILE, Sources.LocalProfile, ValueWithUnit.SimpleString(localProfilePlugin.currentProfile()?.name
?: ""))
uel.log(
Action.STORE_PROFILE, Sources.LocalProfile, ValueWithUnit.SimpleString(
localProfilePlugin.currentProfile()?.name
?: ""
)
)
localProfilePlugin.storeSettings(activity)
build()
}
@ -297,7 +370,7 @@ class LocalProfileFragment : DaggerFragment() {
val isEdited = localProfilePlugin.isEdited
if (isValid) {
this.view?.setBackgroundColor(rh.gc(R.color.ok_background))
binding.spinner.isEnabled = true
binding.profileList.isEnabled = true
if (isEdited) {
//edited profile -> save first
@ -309,7 +382,7 @@ class LocalProfileFragment : DaggerFragment() {
}
} else {
this.view?.setBackgroundColor(rh.gc(R.color.error_background))
binding.spinner.isEnabled = false
binding.profileList.isEnabled = false
binding.profileswitch.visibility = View.GONE
binding.save.visibility = View.GONE //don't save an invalid profile
}

View file

@ -28,7 +28,7 @@ object PrefImportSummaryDialog {
@SuppressLint("InflateParams")
fun showSummary(context: Context, importOk: Boolean, importPossible: Boolean, prefs: Prefs, ok: (() -> Unit)?, cancel: (() -> Unit)? = null) {
@StyleRes val theme: Int = if (importOk) R.style.AppTheme else {
@StyleRes val theme: Int = if (importOk) R.style.DialogTheme else {
if (importPossible) R.style.AppThemeWarningDialog else R.style.AppThemeErrorDialog
}
@ -92,7 +92,7 @@ object PrefImportSummaryDialog {
webView.setBackgroundColor(Color.TRANSPARENT)
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null)
AlertDialogHelper.Builder(context, R.style.AppTheme)
AlertDialogHelper.Builder(context, R.style.DialogTheme)
.setCustomTitle(
AlertDialogHelper.buildCustomTitle(
context,

View file

@ -19,7 +19,7 @@ object TwoMessagesAlertDialog {
val secondMessageLayout = LayoutInflater.from(context).inflate(R.layout.dialog_alert_two_messages, null)
(secondMessageLayout.findViewById<View>(R.id.password_prompt_title) as TextView).text = secondMessage
val dialog = AlertDialogHelper.Builder(context)
AlertDialogHelper.Builder(context, R.style.DialogTheme)
.setMessage(message)
.setCustomTitle(
AlertDialogHelper.buildCustomTitle(
@ -40,7 +40,7 @@ object TwoMessagesAlertDialog {
if (cancel != null) runOnUiThread { cancel() }
}
.show()
dialog.setCanceledOnTouchOutside(false)
.setCanceledOnTouchOutside(false)
}
}

View file

@ -6,18 +6,18 @@ import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.Bolus
import info.nightscout.androidaps.database.entities.TotalDailyDose
import info.nightscout.androidaps.extensions.convertedToAbsolute
import info.nightscout.androidaps.extensions.toText
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.interfaces.IobCobCalculator
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.HtmlHelper
import info.nightscout.androidaps.utils.MidnightTime
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.extensions.convertedToAbsolute
import info.nightscout.androidaps.extensions.toText
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.shared.logging.AAPSLogger
import info.nightscout.shared.logging.LTag
import javax.inject.Inject
class TddCalculator @Inject constructor(
@ -76,8 +76,8 @@ class TddCalculator @Inject constructor(
return result
}
fun calculateDaily():TotalDailyDose {
val startTime = MidnightTime.calc(dateUtil.now() )
fun calculateDaily(): TotalDailyDose {
val startTime = MidnightTime.calc(dateUtil.now())
val endTime = dateUtil.now()
val tdd = TotalDailyDose(timestamp = startTime)
//val result = TotalDailyDose()
@ -103,13 +103,13 @@ class TddCalculator @Inject constructor(
val tbr = iobCobCalculator.getTempBasalIncludingConvertedExtended(t)
val profile = profileFunction.getProfile(t) ?: continue
val absoluteRate = tbr?.convertedToAbsolute(t, profile) ?: profile.getBasal(t)
tdd.basalAmount += absoluteRate / T.mins(5).msecs().toDouble() * calculationStep.toDouble()
tdd.basalAmount += absoluteRate / 60.0 * 5.0
if (!activePlugin.activePump.isFakingTempsByExtendedBoluses) {
// they are not included in TBRs
val eb = iobCobCalculator.getExtendedBolus(t)
val absoluteEbRate = eb?.rate ?: 0.0
tdd.bolusAmount += absoluteEbRate / T.mins(5).msecs().toDouble() * calculationStep.toDouble()
tdd.bolusAmount += absoluteEbRate / 60.0 * 5.0
}
//result.put(midnight, tdd)
}
@ -118,13 +118,60 @@ class TddCalculator @Inject constructor(
tdd.totalAmount = tdd.bolusAmount + tdd.basalAmount
//}
aapsLogger.debug(LTag.CORE, tdd.toString())
return tdd
}
fun calculate24Daily(): TotalDailyDose {
val startTime = dateUtil.now() - T.hours(hour = 24).msecs()
val endTime = dateUtil.now()
val tdd = TotalDailyDose(timestamp = startTime)
//val result = TotalDailyDose()
repository.getBolusesDataFromTimeToTime(startTime, endTime, true).blockingGet()
.filter { it.type != Bolus.Type.PRIMING }
.forEach { t ->
//val midnight = MidnightTime.calc(t.timestamp)
//val tdd = result[midnight] ?: TotalDailyDose(timestamp = midnight)
tdd.bolusAmount += t.amount
//result.put(midnight, tdd)
}
repository.getCarbsDataFromTimeToTimeExpanded(startTime, endTime, true).blockingGet().forEach { t ->
//val midnight = MidnightTime.calc(t.timestamp)
//val tdd = result[midnight] ?: TotalDailyDose(timestamp = midnight)
tdd.carbs += t.amount
//result.put(midnight, tdd)
}
val calculationStep = T.mins(5).msecs()
//val tempBasals = iobCobCalculator.getTempBasalIncludingConvertedExtendedForRange(startTime, endTime, calculationStep)
for (t in startTime until endTime step calculationStep) {
//val midnight = MidnightTime.calc(t)
//val tdd = result[midnight] ?: TotalDailyDose(timestamp = midnight)
val tbr = iobCobCalculator.getTempBasalIncludingConvertedExtended(t)
val profile = profileFunction.getProfile(t) ?: continue
val absoluteRate = tbr?.convertedToAbsolute(t, profile) ?: profile.getBasal(t)
tdd.basalAmount += absoluteRate / 60.0 * 5.0
if (!activePlugin.activePump.isFakingTempsByExtendedBoluses) {
// they are not included in TBRs
val eb = iobCobCalculator.getExtendedBolus(t)
val absoluteEbRate = eb?.rate ?: 0.0
tdd.bolusAmount += absoluteEbRate / 60.0 * 5.0
}
//result.put(midnight, tdd)
}
//for (i in 0 until tdd.size()) {
//val tdd = result.valueAt(i)
tdd.totalAmount = tdd.bolusAmount + tdd.basalAmount
//}
aapsLogger.debug(LTag.CORE, tdd.toString())
return tdd
}
fun averageTDD(tdds: LongSparseArray<TotalDailyDose>): TotalDailyDose {
fun averageTDD(tdds: LongSparseArray<TotalDailyDose>): TotalDailyDose? {
val totalTdd = TotalDailyDose(timestamp = dateUtil.now())
if (tdds.size() == 0) return null
for (i in 0 until tdds.size()) {
val tdd = tdds.valueAt(i)
totalTdd.basalAmount += tdd.basalAmount
@ -143,10 +190,11 @@ class TddCalculator @Inject constructor(
val tdds = calculate(7)
val averageTdd = averageTDD(tdds)
return HtmlHelper.fromHtml(
"<b>" + rh.gs(R.string.tdd) + ":</b><br>" +
if (averageTdd != null) "<b>" + rh.gs(R.string.tdd) + ":</b><br>" +
toText(tdds, true) +
"<b>" + rh.gs(R.string.average) + ":</b><br>" +
averageTdd.toText(rh, tdds.size(), true)
else ""
)
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="26dp"
android:height="26dp"
android:drawable="@drawable/ic_temptarget_high" />
</layer-list>

View file

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

View file

@ -5,8 +5,8 @@
android:viewportHeight="24">
<path
android:pathData="M12.069,20.423c-4.644,0 -8.422,-3.779 -8.422,-8.423s3.778,-8.422 8.422,-8.422S20.492,7.355 20.492,12S16.713,20.423 12.069,20.423zM12.069,4.943c-3.891,0 -7.057,3.166 -7.057,7.057c0,3.891 3.166,7.057 7.057,7.057c3.891,0 7.057,-3.166 7.057,-7.057C19.126,8.109 15.961,4.943 12.069,4.943z"
android:fillColor="#67DFE8"/>
android:fillColor="@color/ic_local_activate"/>
<path
android:pathData="M9.945,16.362c-0.113,0 -0.227,-0.028 -0.33,-0.085c-0.217,-0.12 -0.353,-0.349 -0.353,-0.598V8.32c0,-0.249 0.135,-0.478 0.353,-0.598c0.218,-0.12 0.485,-0.112 0.694,0.021l5.827,3.679c0.198,0.125 0.318,0.343 0.318,0.577s-0.12,0.452 -0.318,0.577l-5.827,3.679C10.198,16.326 10.072,16.362 9.945,16.362zM10.627,9.559v4.881L14.493,12L10.627,9.559z"
android:fillColor="#67DFE8"/>
android:fillColor="@color/ic_local_activate"/>
</vector>

View file

@ -5,5 +5,5 @@
android:viewportHeight="24">
<path
android:pathData="M13.787,4.15c-4.338,0 -7.867,3.529 -7.867,7.867v5.193l-2.486,-2.485c-0.25,-0.248 -0.653,-0.248 -0.902,0c-0.249,0.249 -0.249,0.653 0,0.902l3.575,3.574c0.008,0.008 0.019,0.011 0.028,0.018c0.054,0.048 0.112,0.091 0.18,0.119c0.078,0.032 0.161,0.049 0.244,0.049s0.166,-0.017 0.244,-0.049c0.068,-0.028 0.126,-0.071 0.18,-0.119c0.008,-0.008 0.019,-0.01 0.028,-0.018l3.575,-3.574c0.249,-0.249 0.249,-0.653 0,-0.902c-0.249,-0.248 -0.653,-0.248 -0.902,0l-2.486,2.485v-5.193c0,-3.635 2.957,-6.592 6.591,-6.592c3.635,0 6.592,2.957 6.592,6.592c0,1.761 -0.686,3.415 -1.931,4.66c-0.249,0.249 -0.249,0.653 0,0.902c0.25,0.248 0.652,0.248 0.902,0c1.485,-1.486 2.304,-3.461 2.304,-5.563C21.654,7.68 18.125,4.15 13.787,4.15z"
android:fillColor="#E93057"/>
android:fillColor="@color/ic_local_reset"/>
</vector>

View file

@ -27,14 +27,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_profileswitch"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_profileswitch"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_profileswitch"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -42,14 +42,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_temptarget"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_temptarget_high"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_temporarytarget"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -57,14 +57,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_settempbasal"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_starttempbasal"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_tempbasal_button"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -72,15 +72,15 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_canceltempbasal"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cancelbasal"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/canceltemp"
android:textSize="11sp"
android:visibility="gone"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -88,14 +88,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_extendedbolus"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_startextbolus"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_extendedbolus_button"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -103,15 +103,15 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_extendedbolus_cancel"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_cancelextbolus"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_extendedbolus_cancel_button"
android:textSize="11sp"
android:visibility="gone"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -141,14 +141,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_bgcheck"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_bgcheck"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_bgcheck"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -156,14 +156,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_fill"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cp_pump_canula"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/primefill"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -171,13 +171,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_cgmsensorinsert"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_cgm_insert"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_cgmsensorinsert"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -185,13 +186,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_pumpbatterychange"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_pump_battery"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_pumpbatterychange"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -199,13 +201,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_note"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_note"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_note"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -213,13 +216,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_exercise"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_exercise"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_exercise"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -227,13 +231,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_announcement"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_announcement"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_announcement"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -241,13 +246,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_question"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_question"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_question"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -270,13 +276,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_historybrowser"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_pump_history"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/nav_historybrowser"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -284,14 +291,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_tddstats"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cp_stats"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/tdd"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"

View file

@ -27,14 +27,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_profileswitch"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_profileswitch"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_profileswitch"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -42,14 +42,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_temptarget"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_temptarget_high"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_temporarytarget"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -57,14 +57,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_settempbasal"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_starttempbasal"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_tempbasal_button"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -72,15 +72,15 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_canceltempbasal"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cancelbasal"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/canceltemp"
android:textSize="11sp"
android:visibility="gone"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -88,14 +88,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_extendedbolus"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_startextbolus"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_extendedbolus_button"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -103,15 +103,15 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_extendedbolus_cancel"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_actions_cancelextbolus"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/overview_extendedbolus_cancel_button"
android:textSize="11sp"
android:visibility="gone"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -141,14 +141,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_bgcheck"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_bgcheck"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_bgcheck"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -156,14 +156,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_fill"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cp_pump_canula"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/primefill"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -171,13 +171,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_cgmsensorinsert"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_cgm_insert"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_cgmsensorinsert"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -185,13 +186,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_pumpbatterychange"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_pump_battery"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_pumpbatterychange"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -199,13 +201,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_note"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_note"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_note"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -213,13 +216,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_exercise"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_exercise"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_exercise"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -227,13 +231,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_announcement"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_announcement"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_announcement"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -241,13 +246,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_question"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:drawableTop="@drawable/ic_cp_question"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/careportal_question"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -270,13 +276,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_historybrowser"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_pump_history"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/nav_historybrowser"
android:textSize="11sp"
app:layout_column="0"
app:layout_columnWeight="1"
app:layout_gravity="fill"
@ -284,14 +291,14 @@
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/actions_tddstats"
style="@style/ButtonSmallFontStyle"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_cp_stats"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:text="@string/tdd"
android:textSize="11sp"
app:layout_column="1"
app:layout_columnWeight="1"
app:layout_gravity="fill"

View file

@ -33,8 +33,9 @@
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_chevron_left_black_24dp" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/date"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
@ -52,8 +53,9 @@
android:layout_height="match_parent"
app:srcCompat="@drawable/ic_last_page_black_24dp" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/zoom"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"

View file

@ -62,21 +62,21 @@
android:layout_gravity="center_vertical"
android:paddingBottom="8dp">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/reset"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginEnd="8dp"
style="@style/mdtp_ActionButton.Text"
style="@style/OkCancelButton.Text"
android:text="@string/resettodefaults" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
style="@style/mdtp_ActionButton.Text"
android:text="@string/mdtp_ok" />
style="@style/OkCancelButton.Text"
android:text="@string/ok" />
</LinearLayout>

View file

@ -21,7 +21,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
app:tabIndicatorColor="#FFFFFF"
app:tabIndicatorColor="@color/tabSelectedTextColor"
app:tabTextColor="@color/tabTextColor"
app:tabSelectedTextColor="@color/tabSelectedTextColor"
app:tabMode="scrollable" />
<com.google.android.material.tabs.TabLayout
@ -31,8 +33,11 @@
android:background="@android:color/transparent"
app:tabMinWidth="0dp"
app:tabPadding="0dp"
app:tabIndicatorColor="#FFFFFF"
app:tabIndicatorColor="@color/tabSelectedTextColor"
app:tabTextColor="@color/tabTextColor"
app:tabSelectedTextColor="@color/tabSelectedTextColor"
app:tabMode="scrollable" />
</androidx.appcompat.widget.Toolbar>
<androidx.drawerlayout.widget.DrawerLayout

View file

@ -78,21 +78,21 @@
android:layout_gravity="center_vertical"
android:paddingBottom="8dp">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/reset"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginEnd="8dp"
style="@style/mdtp_ActionButton.Text"
style="@style/OkCancelButton.Text"
android:text="@string/reset" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
style="@style/mdtp_ActionButton.Text"
android:text="@string/mdtp_ok" />
style="@style/OkCancelButton.Text"
android:text="@string/ok" />
</LinearLayout>

View file

@ -14,6 +14,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
style="@style/mdtp_ActionButton.Text"
style="@style/OkCancelButton.Text"
android:text="@string/close" />
</LinearLayout>

View file

@ -5,11 +5,12 @@
android:gravity="center"
android:orientation="vertical">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/unlock"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:layout_gravity="center"
android:text="@string/unlock_settings" />
<androidx.core.widget.NestedScrollView

View file

@ -21,17 +21,17 @@
android:layout_marginEnd="8dp"
android:stretchColumns="2" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/summary_details_btn"
style="?android:attr/buttonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="bottom"
android:gravity="center"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="3dp"
android:layout_marginBottom="10dp"
android:text="@string/check_preferences_details_btn"
android:textColor="@color/colorTreatmentButton"
android:visibility="gone" />

View file

@ -215,26 +215,33 @@
android:orientation="horizontal"
android:padding="5dp">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="+5" />
android:text="+5"
tools:ignore="HardcodedText" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="+10" />
android:text="+10"
tools:ignore="HardcodedText" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="+20" />
android:text="+20"
tools:ignore="HardcodedText" />
</LinearLayout>

View file

@ -105,22 +105,25 @@
android:layout_height="wrap_content"
android:padding="5dp">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/fill_preset_button1"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="0.3U" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/fill_preset_button2"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="0.7U" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/fill_preset_button3"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"

View file

@ -146,22 +146,25 @@
android:orientation="horizontal"
android:padding="5dp">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus05"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:contentDescription="Increment insuline with 0.5"
android:contentDescription="Increment insulin with 0.5"
android:text="+0.5" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus10"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="+1.0" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/plus20"
android:layout_width="match_parent"
android:layout_height="match_parent"

View file

@ -395,14 +395,14 @@
android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/cancel"
style="@style/mdtp_ActionButton.Text"
style="@style/OkCancelButton.Text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:text="@string/mdtp_cancel"
android:text="@string/cancel"
android:padding="10dp"
android:textAlignment="textEnd" />

View file

@ -240,12 +240,12 @@
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|center_vertical"
android:layout_marginTop="0dp"
android:layout_marginTop="10dp"
android:background="@android:color/transparent"
android:orientation="horizontal"
android:padding="0dp">
@ -254,53 +254,67 @@
android:id="@+id/bg_checkbox_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:scaleX="0.7"
android:scaleY="0.7"
android:button="@drawable/checkbox_bg_icon"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:button="@android:color/transparent"
android:checked="true"
android:contentDescription="@string/treatments_wizard_bg_label" />
android:contentDescription="@string/treatments_wizard_bg_label"
android:drawableStart="@drawable/checkbox_bg_icon"
android:scaleX="1.4"
android:scaleY="1.4" />
<CheckBox
android:id="@+id/tt_checkbox_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:button="@android:color/transparent"
android:checked="true"
android:contentDescription="@string/treatments_wizard_tt_label"
android:drawableStart="@drawable/checkbox_tt_icon"
android:scaleX="1.6"
android:scaleY="1.6"
android:visibility="gone" />
<CheckBox
android:id="@+id/trend_checkbox_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:scaleX="0.7"
android:scaleY="0.7"
android:button="@drawable/checkbox_trend_icon"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:button="@android:color/transparent"
android:checked="true"
android:contentDescription="@string/bg_trend_label" />
android:contentDescription="@string/bg_trend_label"
android:drawableStart="@drawable/checkbox_trend_icon"
android:scaleX="1.4"
android:scaleY="1.4" />
<CheckBox
android:id="@+id/iob_checkbox_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:scaleX="0.9"
android:scaleY="0.9"
android:button="@drawable/checkbox_iob_icon"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:button="@android:color/transparent"
android:checked="true"
android:contentDescription="@string/iob" />
android:contentDescription="@string/iob"
android:drawableStart="@drawable/checkbox_iob_icon"
android:scaleX="1.4"
android:scaleY="1.4" />
<CheckBox
android:id="@+id/cob_checkbox_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:scaleX="0.7"
android:scaleY="0.7"
android:button="@drawable/checkbox_cob_icon"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:button="@android:color/transparent"
android:checked="true"
android:contentDescription="@string/treatments_wizard_cob_label" />
android:contentDescription="@string/treatments_wizard_cob_label"
android:drawableStart="@drawable/checkbox_cob_icon"
android:scaleX="1.6"
android:scaleY="1.6" />
</LinearLayout>
@ -323,7 +337,7 @@
android:contentDescription="@string/show_calculation"
android:drawableEnd="@drawable/ic_visibility" />
<include
<include
android:id="@+id/okcancel"
layout="@layout/okcancel" />
@ -614,6 +628,7 @@
</TableRow>
<TableRow
android:id="@+id/super_bolus_row"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true">

View file

@ -488,13 +488,13 @@
android:layout_gravity="center_vertical"
android:paddingBottom="8dp">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
style="@style/mdtp_ActionButton.Text"
android:text="@string/mdtp_ok" />
style="@style/OkCancelButton.Text"
android:text="@string/ok" />
</LinearLayout>
</LinearLayout>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
card_view:cardBackgroundColor="?android:colorBackground">
card_view:cardBackgroundColor="@color/cardColorBackground">
<LinearLayout
android:id="@+id/food_item"

View file

@ -10,38 +10,25 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="start"
android:orientation="horizontal">
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:hint="@string/select_profile"
android:textColorHint="@color/white"
app:boxStrokeColor="@color/list_delimiter">
<TextView
android:layout_width="wrap_content"
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
android:id="@+id/profileList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:labelFor="@+id/spinner"
android:text="@string/selected_profile"
android:textAppearance="?android:attr/textAppearanceMedium" />
android:clickable="true"
android:enabled="false"
tools:ignore="KeyboardInaccessibleWidget" />
<Spinner
android:id="@+id/spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:layout_weight="1" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
@ -217,7 +204,7 @@
android:layout_height="40dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
app:customContentDescription="@string/dia" />
app:customContentDescription="@string/dia" />
<TextView
android:layout_width="wrap_content"
@ -320,21 +307,20 @@
</LinearLayout>
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/profileswitch"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:drawableStart="@drawable/ic_local_activate"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/activate_profile" />
android:text="@string/activate_profile"
app:icon="@drawable/ic_local_activate"
app:iconTint="@color/ic_local_activate" />
<LinearLayout
android:layout_width="match_parent"
@ -342,37 +328,35 @@
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/reset"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:drawableStart="@drawable/ic_local_reset"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/reset" />
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:text="@string/reset"
app:icon="@drawable/ic_local_reset"
app:iconTint="@color/ic_local_reset" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/save"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:drawableStart="@drawable/ic_local_save"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/save" />
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:text="@string/save"
app:icon="@drawable/ic_local_save"
app:iconTint="@color/ic_local_save" />
</LinearLayout>
</LinearLayout>

View file

@ -10,9 +10,9 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/run"
style="?android:attr/buttonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/openapsma_run" />

View file

@ -10,94 +10,94 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/nav_logsettings"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/nav_logsettings"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/log_send"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/send_all_logs"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/log_delete"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/delete_logs"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/nav_export"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/nav_export"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/nav_import"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/nav_import"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/export_csv"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/ue_export_to_csv"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/nav_resetdb"
style="?android:attr/buttonStyle"
style="@style/GrayButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="3dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="3dp"
android:layout_weight="0.5"
android:text="@string/nav_resetdb"
android:textColor="@color/colorTreatmentButton" />

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="60dp"
android:layout_height="100dp"
android:background="@drawable/background_darkgray"
@ -13,7 +14,8 @@
android:padding="0dp"
android:text="+"
android:textColor="@color/mdtp_white"
android:textSize="25sp" />
android:textSize="25sp"
tools:ignore="HardcodedText" />
<EditText
android:id="@+id/display"
@ -24,7 +26,8 @@
android:imeOptions="actionDone"
android:inputType="number"
android:text="1"
android:textColor="@android:color/black" />
android:textColor="@android:color/black"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/decrement"
@ -32,8 +35,9 @@
android:layout_height="30dp"
android:background="@null"
android:padding="0dp"
android:text=""
android:text="-"
android:textColor="@color/mdtp_white"
android:textStyle="bold" />
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>

View file

@ -42,9 +42,9 @@
android:padding="4dp"
app:layout_constraintTop_toBottomOf="@+id/exam_disabledto">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/exam_reset"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset" />
@ -55,16 +55,16 @@
android:layout_weight="1"
android:text="" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/close"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/close" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/exam_verify"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/objectives_button_verify" />
@ -122,9 +122,9 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttons">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/back_button"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/previous_button" />
@ -135,16 +135,16 @@
android:layout_weight="1"
android:text="" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/next_button"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next_button" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/next_unanswered_button"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/unfinshed_button" />

View file

@ -23,9 +23,9 @@
android:layout_weight="1"
android:text="Enable fake time and progress" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/reset"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reset" />

View file

@ -8,7 +8,7 @@
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
app:cardBackgroundColor="@color/colorPrimary"
app:cardBackgroundColor="@color/cardColorBackground"
app:cardCornerRadius="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="16dp">
@ -53,32 +53,36 @@
</LinearLayout>
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/verify"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/objectives_button_verify" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/start"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/objectives_button_start" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/unfinish"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/objectives_button_unfinish" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/unstart"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/objectives_button_unstart" />
<TextView
@ -107,9 +111,9 @@
android:hint="XXXXXXXXXX"
android:inputType="text" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/enterbutton"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
style="@style/OkCancelButton.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/objectives_button_enter" />

View file

@ -18,7 +18,7 @@
android:layout_height="56dp"
android:orientation="horizontal"
android:background="@android:color/transparent"
android:gravity="end|right"
android:gravity="end"
android:layout_gravity="center_vertical"
android:paddingBottom="8dp">
@ -26,18 +26,15 @@
android:id="@+id/cancel"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginRight="8dp"
android:layout_marginEnd="8dp"
style="@style/mdtp_ActionButton.Text"
android:text="@string/mdtp_cancel" />
style="@style/OkCancelButton.Text"
android:text="@string/cancel" />
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
style="@style/mdtp_ActionButton.Text"
android:text="@string/mdtp_ok" />
style="@style/OkCancelButton.Text"
android:text="@string/ok" />
</LinearLayout>
<!-- From: file:/Users/wdullaer/Documents/Programming%20Projects/MaterialDateTimePicker/library/src/main/res/layout/mdtp_done_button.xml -->

View file

@ -15,9 +15,9 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/run"
style="?android:attr/buttonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/openapsma_run" />

View file

@ -26,7 +26,8 @@
android:text="Notification text. Notification text. Notification text. Notification text. Notification text. Notification text. "
tools:ignore="HardcodedText" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/dismiss"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -10,16 +10,9 @@
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".plugins.general.overview.activities.QuickWizardListActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="15dp"
android:text="@string/quickwizard"
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" />
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/add_button"
style="@style/GrayButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/overview_editquickwizardlistactivity_add" />

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/overview_quickwizard_cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -49,21 +50,23 @@
android:id="@+id/overview_quickwizard_item_buttonText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:text="Sample button text"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/cardObjectiveText"
android:textStyle="normal|bold" />
android:textStyle="normal|bold"
tools:ignore="HardcodedText,RtlSymmetry" />
<TextView
android:id="@+id/overview_quickwizard_item_carbs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:text="36g"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/cardObjectiveText"
android:textStyle="normal|bold" />
android:textStyle="normal|bold"
tools:ignore="HardcodedText,RtlSymmetry" />
</LinearLayout>
@ -73,16 +76,15 @@
android:layout_height="wrap_content"
android:adjustViewBounds="false"
android:cropToPadding="false"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:scaleType="fitStart"
card_view:srcCompat="@drawable/ic_smartphone" />
card_view:srcCompat="@drawable/ic_smartphone"
tools:ignore="RtlSymmetry" />
<ImageView
android:id="@+id/handleView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:adjustViewBounds="false"
android:cropToPadding="false"
android:scaleType="fitStart"
@ -99,8 +101,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingLeft="10dp"
android:paddingRight="5dp"
android:paddingStart="10dp"
android:paddingEnd="5dp"
android:text="@string/overview_editquickwizard_valid"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
@ -109,25 +111,28 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingRight="10dp"
android:paddingEnd="10dp"
android:text="07:45"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="normal|bold" />
android:textStyle="normal|bold"
tools:ignore="HardcodedText,RtlSymmetry" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" />
android:text="-"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/overview_quickwizard_item_to"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:text="11:45"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="normal|bold" />
android:textStyle="normal|bold"
tools:ignore="HardcodedText,RtlSymmetry" />
</LinearLayout>
@ -140,19 +145,22 @@
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/overview_quickwizard_item_edit_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/overview_quickwizard_item_edit_button" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/overview_quickwizard_item_remove_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/remove_button" />
</LinearLayout>
</LinearLayout>

View file

@ -14,7 +14,8 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -23,7 +24,8 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/status" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/uploadnow"
android:layout_width="113dp"
android:layout_height="50dp"
@ -32,7 +34,8 @@
app:layout_constraintStart_toEndOf="@+id/login"
app:layout_constraintTop_toBottomOf="@+id/status" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/removeall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -42,7 +45,8 @@
app:layout_constraintStart_toEndOf="@+id/uploadnow"
app:layout_constraintTop_toBottomOf="@+id/status" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/resertstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -1,54 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsBolusCarbsFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/refresh_from_nightscout"
style="?android:attr/buttonStyle"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_refresh"
android:text="@string/nav_refreshtreatments" />
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/delete_future_treatments"
style="?android:attr/buttonStyle"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_remove"
android:text="@string/deletefuturetreatments" />
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed"
app:srcCompat="@drawable/ic_visibility" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
card_view:cardBackgroundColor="?android:colorBackground">
card_view:cardBackgroundColor="@color/cardColorBackground">
<LinearLayout
android:layout_width="match_parent"
@ -161,14 +161,12 @@
android:text="@string/invalid"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/bolus_remove"
<CheckBox
android:id="@+id/cb_bolus_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
@ -257,13 +255,21 @@
<TextView
android:id="@+id/carbs_remove"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
<CheckBox
android:id="@+id/cb_carbs_remove"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -1,54 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsCareportalFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/refresh_from_nightscout"
style="?android:attr/buttonStyle"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_refresh"
android:text="@string/nav_refreshtreatments" />
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/remove_androidaps_started_events"
style="?android:attr/buttonStyle"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_remove"
android:text="@string/careportal_removestartedevents" />
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed"
app:srcCompat="@drawable/ic_visibility" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -112,14 +112,12 @@
android:text="Activity"
tools:ignore="HardcodedText,RtlSymmetry" />
<TextView
android:id="@+id/remove"
<CheckBox
android:id="@+id/cb_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
</LinearLayout>

View file

@ -1,34 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsExtendedBolusesFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
app:srcCompat="@drawable/ic_visibility"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -153,14 +153,12 @@
android:text="@string/invalid"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/remove"
<CheckBox
android:id="@+id/cb_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"

View file

@ -6,6 +6,13 @@
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.TreatmentsActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:titleTextColor="@android:color/white" />
<com.google.android.flexbox.FlexboxLayout
android:layout_width="match_parent"

View file

@ -1,44 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsProfileSwitchFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/refresh_from_nightscout"
style="?android:attr/buttonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_refresh"
android:text="@string/refresheventsfromnightscout" />
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed"
app:srcCompat="@drawable/ic_visibility" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -124,15 +124,12 @@
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_blue_light" />
<TextView
android:id="@+id/remove"
<CheckBox
android:id="@+id/cb_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="5dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
</LinearLayout>

View file

@ -1,36 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsTemporaryBasalsFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed"
app:srcCompat="@drawable/ic_visibility" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -172,15 +172,12 @@
android:text="@string/invalid"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/remove"
<CheckBox
android:id="@+id/cb_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:visibility="gone"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"

View file

@ -1,45 +1,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsTempTargetFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/refresh_from_nightscout"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_refresh"
android:text="@string/refresheventsfromnightscout"
tools:visibility="visible" />
<CheckBox
android:id="@+id/show_invalidated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_removed"
app:srcCompat="@drawable/ic_visibility" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -147,14 +147,12 @@
android:text="@string/invalid"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/remove"
<CheckBox
android:id="@+id/cb_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:text="@string/remove_button"
android:textAlignment="viewEnd"
android:textColor="@android:color/holo_orange_light" />
android:contentDescription="@string/select_for_removal"
android:visibility="gone" />
</LinearLayout>

View file

@ -6,40 +6,6 @@
android:orientation="vertical"
tools:context="info.nightscout.androidaps.activities.fragments.TreatmentsUserEntryFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<info.nightscout.androidaps.utils.ui.SingleClickButton
android:id="@+id/ue_export_to_xml"
style="?android:attr/buttonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawableStart="@drawable/ic_header_export"
android:text="@string/ue_export_to_csv" />
<CheckBox
android:id="@+id/show_loop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:checked="false"
android:paddingEnd="5dp"
tools:ignore="RtlSymmetry" />
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:contentDescription="@string/show_calculation"
app:srcCompat="@drawable/ic_loop_closed_white" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"

View file

@ -10,9 +10,9 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/resend"
style="?android:attr/buttonStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
@ -23,9 +23,9 @@
android:text="@string/resend_all_data"
android:textColor="@color/colorTreatmentButton" />
<Button
<com.google.android.material.button.MaterialButton
style="@style/GrayButton"
android:id="@+id/opensettings"
style="?android:attr/buttonStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"

View file

@ -0,0 +1,11 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/remove_selected"
android:icon="@drawable/ic_trash"
android:iconTint="@color/white"
android:title="@string/remove_selected_items"
app:showAsAction="always" />
</menu>

View file

@ -0,0 +1,25 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_delete_future"
android:title="@string/delete_future_treatments"
app:showAsAction="never" />
<item
android:id="@+id/nav_refresh_ns"
android:title="@string/refresh_from_nightscout"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,25 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_refresh_ns"
android:title="@string/refresh_from_nightscout"
app:showAsAction="never" />
<item
android:id="@+id/nav_remove_started_events"
android:title="@string/careportal_removestartedevents"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,21 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_remove_items"
android:title="@string/remove_items"
app:showAsAction="never" />
<item
android:id="@+id/nav_show_invalidated"
android:title="@string/show_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_invalidated"
android:title="@string/hide_invalidated"
app:showAsAction="never" />
<item
android:id="@+id/nav_refresh_ns"
android:title="@string/refresh_from_nightscout"
app:showAsAction="never" />
</menu>

View file

@ -0,0 +1,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/nav_show_loop"
android:title="@string/show_loop"
app:showAsAction="never" />
<item
android:id="@+id/nav_hide_loop"
android:title="@string/hide_loop"
app:showAsAction="never" />
<item
android:id="@+id/nav_export"
android:title="@string/ue_export_to_csv"
app:showAsAction="never" />
</menu>

View file

@ -129,7 +129,6 @@
<string name="end_user_license_agreement">Eindverbruiker Lisensie Ooreenkoms</string>
<string name="end_user_license_agreement_text">MOET NIE GEBRUIK WORD OM MEDIESE BESLUITE TE MAAK NIE. DAAR IS GEEN WAARBORG DAT DIE PROGRAM, ONDERWORPE AAN TOEPASSELIKE WETTE EN WETGEWING. TENSY ANDERS GEMELD IN TEKS VOORSIEN DIE KOPIEREG-HOUERS EN / OF ANDER PARTYE DIE PROGRAM \"AS IS\" SONDER ËNIGE WAARBORG VAN ENIGE ORDE, UITDRUKKELIK OF IMPLISIET, INKLUSIEF, MAAR NIE BEPERK TOT DIE IMPLISIETE WAARBORG VAN TOEPAASBAARHEID OF NUT VIR EEN SPESIFIEKE DOEL. DIE TOTALE EN ALLE RISIKOVIR DIE KWALITEIT EN PRESTASIE VAN DIE PROGRAM RUS MET JOUSELF. VIR ENIGE PROGRAM DEFEKTIEWE OF FALINGS MOET JY PERSOONLIK DIE KOSTE EN REGSAANSPREEKLIKHEID DRA VAN ALLE NODIGE AKSIES, DIENS, REPARASIES OF KORREKSIES VIR USELF OF ENIGE DERDE PARTYE EN/OF AKSIES, DIENS, REPARASIES OF KORREKSIES WAT DEUR DIE PROGRAM GEDOEN WAS.</string>
<string name="end_user_license_agreement_i_understand">EK VERSTAAN en STEM IN</string>
<string name="save">Stoor</string>
<string name="reloadprofile">Herlaai profiel</string>
<string name="smscommunicator">SMS Communicator</string>
<string name="smscommunicator_allowednumbers">Toegelate telefoon nommers</string>
@ -181,7 +180,6 @@
<string name="wear">Wear</string>
<string name="resend_all_data">Stuur alle Data weer</string>
<string name="open_settings_on_wear">Oop instellings op Wear</string>
<string name="basal_rate">Basale waarde:</string>
<string name="basalvaluebelowminimum">Basale waarde onder minimum. Profiel nie gestel nie!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Laaste BG:</string>
@ -311,8 +309,6 @@
<string name="keep_screen_on_summary">Verhoed dat Android skerm afskakel. Dit sal baie meer energie vereis wanneer nie in krag prop is nie.</string>
<string name="sensitivity_warning">Deur Autosense aan te skakel onthou om alle koolhidrate in te voer Andersins sal koolhidrate dwalinge verkeerdelik geïdentifiseer word as sensitiwiteit veranderinge!!</string>
<string name="sensitivityweightedaverage">Sensitiwiteit GeweegdeGemiddelde</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Kanselleer</string>
<string name="notloadedplugins">Nie alle profiele gelaai!</string>
<string name="valuesnotstored">Waardes nie gestoor!</string>
<string name="ns_localbroadcasts_title">Aktiveer plaaslike Uitsaai.</string>
@ -573,4 +569,5 @@
<!-- SMS Communicator & OTP Authenticator -->
<string name="overview_show_predictions">Projeksies</string>
<string name="prime">Prima</string>
<!-- WEAR OS-->
</resources>

View file

@ -160,7 +160,6 @@
<string name="end_user_license_agreement">Лицензионно споразумение с краен потребител</string>
<string name="end_user_license_agreement_text">НЕ ТРЯБВА ДА СЕ ИЗПОЛЗВА ЗА ВЗЕМАНЕ НА МЕДИЦИНСКИ РЕШЕНИЯ. НЯМА ГАРАНЦИЯ ЗА ПРОГРАМАТА, ДО СТЕПЕНТА, ПОЗВОЛЕНА ОТ ПРИЛОЖИМОТО ПРАВО. ОСВЕН КОГАТО Е ПОСОЧЕНО ДРУГО В ПИСМЕН ВИД, ПРИТЕЖАТЕЛИТЕ НА АВТОРСКОТО ПРАВО И/ИЛИ ДРУГИ СТРАНИ ПРЕДОСТАВЯТ ПРОГРАМАТА \"КАКТО Е\", БЕЗ ГАРАНЦИИ ОТ ВСЯКАКЪВ ВИД, ИЗРАЗЕНИ ИЛИ ПОДРАЗБИРАЩИ СЕ, ВКЛЮЧИТЕЛНО, НО НЕ САМО, ПОДРАЗБИРАЩИ СЕ ГАРАНЦИИ ЗА ПРОДАВАЕМОСТ И ПРИГОДНОСТ ЗА КОНКРЕТНА ЦЕЛ. ЦЕЛИЯ РИСК ПО ОТНОШЕНИЕ НА КАЧЕСТВОТО И ЕФЕКТИВНОСТТА НА ПРОГРАМАТА Е САМО ВАШ. АКО ПРОГРАМАТА НЕ СРАБОТИ, ВИЕ ПОЕМАТЕ ВСИЧКИ НЕОБХОДИМИ РАЗХОДИ ЗА ОБСЛУЖВАНЕ, РЕМОНТ ИЛИ КОРЕКЦИЯ.</string>
<string name="end_user_license_agreement_i_understand">Разбирам и приемам</string>
<string name="save">Съхрани</string>
<string name="reloadprofile">Презареди профил</string>
<string name="smscommunicator">SMS комуникатор</string>
<string name="smscommunicator_allowednumbers">Разрешени телефонни номера</string>
@ -245,7 +244,6 @@
<string name="wear">Часовник</string>
<string name="resend_all_data">Изпрати отново всички дани</string>
<string name="open_settings_on_wear">Отвори настройките на часовника</string>
<string name="basal_rate">Базал:</string>
<string name="basalvaluebelowminimum">Базалните стойности са под минимума. Не е зададен профил!</string>
<string name="sms_actualbg">КЗ:</string>
<string name="sms_lastbg">Последна КЗ:</string>
@ -425,8 +423,6 @@
<string name="keep_screen_on_summary">Предотвратяване на андроид да изключва екрана. Това ще доведе до консумацията на много енергия, когато устройството не е включено в контакта.</string>
<string name="sensitivity_warning">Когато включите Autosense feature трябва да въвеждате ВСИЧКИ въглехидрати. В противен случай те ще се изчисляват грешно като повишена чувствителност!!</string>
<string name="sensitivityweightedaverage">чрез Среднопретеглената стойност</string>
<string name="mdtp_ok">ОК</string>
<string name="mdtp_cancel">Откажи</string>
<string name="notloadedplugins">Не всички профили са заредени!</string>
<string name="valuesnotstored">Стойностите не са запазени!</string>
<string name="ns_localbroadcasts">Активира предаване на данни към други приложения (като xDrip+). Не активирайте, ако имате повече от един AAPS или имате инсталиран NSClient!</string>
@ -747,8 +743,6 @@
<string name="profilenamecontainsdot">Името на профила съдържа точка.\nТова не се поддържа от НС.\nПрофилът не е качен в НС.</string>
<string name="low_mark_comment">Ниската граница на диапазона (графика)</string>
<string name="high_mark_comment">Високата граница на диапазона (графика)</string>
<string name="age">Възраст:</string>
<string name="weight_label">Тегло:</string>
<string name="id">Номер:</string>
<string name="submit">Изпрати</string>
<string name="mostcommonprofile">Най-често използван профил:</string>
@ -890,4 +884,5 @@
<string name="recalculated_data_used">Рекалкулирани използвани данни</string>
<string name="bg_too_close">КЗ близо до:\n%1$s\n%2$s</string>
<string name="not_available_full">Недостъпно</string>
<!-- WEAR OS-->
</resources>

View file

@ -156,7 +156,6 @@
<string name="end_user_license_agreement">Acord de llicència per a l\'usuari final</string>
<string name="end_user_license_agreement_text">NO S\'HA D\'UTILITZAR PER A PRENDRE DECISIONS MÈDIQUES. EL PROGRAMA NO TÉ GARANTIA, EN LA MESURA QUE HO PERMET LA LLEI APLICABLE. EXCEPTE QUAN S\'INDIQUI EL CONTRARI PER ESCRIT, ELS PROPIETARIS DEL COPYRIGHT I/O ALTRES PARTS PROPORCIONEN EL PROGRAMA \"TAL QUAL\" SENSE CAP MENA DE GARANTIA, NI IMPLÍCITA NI EXPLÍCITA, INCLOENT, PERÒ SENSE ESTAR LIMITADES A, LES GARANTIES IMPLÍCITES DE COMERCIALITZACIÓ I ADEQUACIÓ A UN OBJECTIU PARTICULAR. US FEU RESPONSABLES TOTALMENT DELS RISCOS EN QUANT A LA QUALITAT I EL RENDIMENT DEL PROGRAMA. SI EL PROGRAMA FOS DEFECTUÓS, VOSALTRES ASSUMIU EL COST DE TOT SERVEI, REPARACIÓ O CORRECCIÓ.</string>
<string name="end_user_license_agreement_i_understand">ENTENC I ACCEPTO</string>
<string name="save">Desar</string>
<string name="reloadprofile">Recarregar perfil</string>
<string name="smscommunicator">Comunicador SMS</string>
<string name="smscommunicator_allowednumbers">Nrs. de telèfon permesos</string>
@ -316,4 +315,5 @@
<string name="doprofileswitch">Canviar de perfil</string>
<string name="careportal_sensor_label">Sensor</string>
<!-- SMS Communicator & OTP Authenticator -->
<!-- WEAR OS-->
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">Synchronizace dat s NS</string>
<string name="description_ama">Stav algoritmu v roce 2017</string>
<string name="description_smb">Nejnovější algoritmus pro pokročilé uživatele</string>
<string name="description_smb_dynamic_isf">Nejnovější algoritmus pro pokročilé uživatele s dynamickým/automatickým ISF</string>
<string name="description_overview">Zobrazení stavu a informací. Přístup k nejběžnějším ovládacím prvkům</string>
<string name="description_persistent_notification">Zobrazení průběžného oznámení v Androidu s krátkým přehledem, co smyčka právě dělá</string>
<string name="description_profile_local">Definujte profil, který je dostupný offline.</string>
@ -154,14 +155,13 @@
<string name="check_preferences_before_import">Před importem zkontrolujte předvolby:</string>
<string name="check_preferences_cannot_import">Předvolby nelze importovat!</string>
<string name="check_preferences_dangerous_import">Předvolby by neměly být importovány!</string>
<string name="check_preferences_details_btn">Vysvětlení problémy při importu…</string>
<string name="check_preferences_details_btn">Vysvětlení problémů při importu…</string>
<string name="check_preferences_details_title">Detaily problémů importu</string>
<string name="check_preferences_import_btn">Import</string>
<string name="check_preferences_import_anyway_btn">Přesto importovat (NEBEZPEČNÉ!)</string>
<string name="end_user_license_agreement">Licenční ujednání</string>
<string name="end_user_license_agreement_text">MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</string>
<string name="end_user_license_agreement_i_understand">ROZUMÍM A POTVRZUJI</string>
<string name="save">Uložit</string>
<string name="reloadprofile">Obnovit profil</string>
<string name="smscommunicator">SMS komunikátor</string>
<string name="smscommunicator_allowednumbers">Povolená tel. čísla</string>
@ -246,7 +246,7 @@
<string name="wear">Wear</string>
<string name="resend_all_data">Znovu poslat všechna data</string>
<string name="open_settings_on_wear">Otevřít nastavení na hodinkách Wear</string>
<string name="basal_rate">Bazál:</string>
<string name="basal_rate">Bazál</string>
<string name="basalvaluebelowminimum">Hodnota bazálu pod povoleným minimem. Nenastaveno!</string>
<string name="sms_actualbg">Glykémie:</string>
<string name="sms_lastbg">Poslední glykémie:</string>
@ -267,6 +267,7 @@
<string name="configbuilder_shortname">KONF</string>
<string name="loop_shortname">SMYČ</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DYNSENZ</string>
<string name="localprofile_shortname">MPRF</string>
<string name="overview_shortname">PŘEH</string>
<string name="virtualpump_shortname">VPUM</string>
@ -427,13 +428,12 @@
<string name="keep_screen_on_summary">Zabránit Androidu ve zhasínání obrazovky. Bez připojení do nabíječky vybije velice rychle baterii!</string>
<string name="sensitivity_warning">Při zapnuté detekci sensitivity nezapomeňte vkládat všechny sacharidy. Jinak budou odchylky mylně vyhodnocovány jako změna sensitivity !!</string>
<string name="sensitivityweightedaverage">Sensitivita vážený průměr</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Zrušit</string>
<string name="notloadedplugins">Všechny profily nenačteny!</string>
<string name="valuesnotstored">Hodnoty nejsou uloženy!</string>
<string name="ns_localbroadcasts">Povolit vysílání do jiných aplikací (například xDrip+). Nepovolujte, pokud máte instalovánu více než jednu instanci AAPS nebo NSClient!</string>
<string name="ns_localbroadcasts_title">Povolení odesílaní</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="openaps_smb_dynamic_isf">Dynamická ISF</string>
<string name="enableuam">Povolit UAM</string>
<string name="enablesmb">Povolit SMB</string>
<string name="enablesmb_summary">Použít super mikro bolusy místo dočasných bazálů pro zrychlení účinku</string>
@ -502,6 +502,7 @@
<string name="negativeonly">Pouze záporné</string>
<string name="overview_editquickwizard_usecob">Kalkulace COB</string>
<string name="overview_editquickwizard_usetemptarget">Kalkulace s dočasným cílem</string>
<string name="overview_editquickwizard_usepercentage">Procentní výpočet</string>
<string name="loopenabled">Smyčka povolena</string>
<string name="apsselected">APS vybráno</string>
<string name="nsclienthaswritepermission">NSClient má povolení k zápisu</string>
@ -662,6 +663,9 @@
<string name="sensitivity_raises_target_title">Citlivost zvyšuje cíl</string>
<string name="sensitivity_raises_target_summary">Je-li zjištěna vyšší citlivost, zvýší nastavenou cílovou glykémii</string>
<string name="careportal_removestartedevents">Vyčistit události \"AndroidAPS restartován\"</string>
<string name="show_invalidated">Zobrazit neplatné</string>
<string name="hide_invalidated">Skrýt zneplatněné</string>
<string name="remove_items">Odstranit položky</string>
<string name="storedsettingsfound">Nalezeno uložené nastavení</string>
<string name="allow_hardware_pump_text">POZOR: Pokud aktivuje a připojíte skutečnou pumpu, AndroidAPS nakopíruje (a bude udržovat) nastavení bazálu z aktivního profilu do pumpy. Nastavení bazálu v pumpě bude přepsáno. Pokud si nejste jistí nebo nechcete přepsat bazály v pumpě, stiskněte Zrušit a opakujte přepnutí na jinou pumpu později.</string>
<string name="error_adding_treatment_title">Data ošetření neúplná</string>
@ -757,8 +761,8 @@
<string name="profilenamecontainsdot">Název profilu obsahuje tečky.\nToto není v NS podporováno.\nProfil není přenesen do NS.</string>
<string name="low_mark_comment">Spodní hodnota oblasti v rozsahu (pouze zobrazování)</string>
<string name="high_mark_comment">Horní hodnota oblasti v rozsahu (pouze zobrazování)</string>
<string name="age">Věk:</string>
<string name="weight_label">Hmotnost:</string>
<string name="age">Věk</string>
<string name="weight_label">Váha</string>
<string name="id">ID:</string>
<string name="submit">Odeslat</string>
<string name="mostcommonprofile">Nejběžnější profil:</string>
@ -900,9 +904,85 @@
<string name="errors">Chyby</string>
<string name="ns_sync_slow">Zpomalit odesílání</string>
<string name="data_status">Stav glykémie</string>
<string name="statuslights_cannula_age">stáří kanyly</string>
<string name="statuslights_patch_pump_age">stáří náplasťové pumpy</string>
<string name="patch_pump">Náplasťová pumpa</string>
<string name="recalculated_data_used">Použita přepočítaná data</string>
<string name="bg_too_close">Glykémie je příliš blízko:\n%1$s\n%2$s</string>
<string name="identification">Identifikace (e-mail, jméno na FB nebo Discord atd.)</string>
<string name="identification_not_set">Identifikace není nastavena ve vývojářském režimu</string>
<string name="a11y_dialog">dialog</string>
<string name="a11y_current_bg">aktuální hodnota glykémie</string>
<string name="a11_correction_percentage">správný výsledek v %</string>
<string name="a11_correction_units">správný výsledek s jednotkami</string>
<string name="not_available_full">Nedostupný</string>
<string name="a11y_high">vysoká</string>
<string name="a11y_inrange">v rozsahu</string>
<string name="a11y_low">nízká</string>
<string name="a11y_arrow_double_down">rychle klesající</string>
<string name="a11y_arrow_single_down">klesající</string>
<string name="a11y_arrow_forty_five_down">pomalu klesající</string>
<string name="a11y_arrow_flat">stabilní</string>
<string name="a11y_arrow_forty_five_up">pomalu stoupající</string>
<string name="a11y_arrow_single_up">stoupající</string>
<string name="a11y_arrow_double_up">rychle stoupající</string>
<string name="a11y_arrow_none">žádný</string>
<string name="a11y_arrow_unknown">neznámý</string>
<string name="a11y_graph">graf</string>
<string name="a11y_bg_quality">kvalita glykémií</string>
<string name="a11y_bg_quality_recalculated">přepočítáno</string>
<string name="a11y_bg_quality_doubles">dvojité položky</string>
<string name="a11y_insulin_label">inzulín</string>
<string name="a11y_blood_glucose">glykémie</string>
<string name="a11y_bg_outdated">zastaralé</string>
<string name="a11y_carb_reminder">nastavit připomenutí</string>
<string name="a11y_add_new_profile">přidat nový profil</string>
<string name="a11y_clone_profile">klonovat aktuální profil</string>
<string name="a11y_delete_current_profile">odstranit aktuální profil</string>
<string name="a11y_add_new_to_list">přidat nový do seznamu</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Dočasný cíl neznámá předvolba: %1$s</string>
<string name="wear_action_tempt_cancel_message">Zrušení běžícího dočasného cíle?</string>
<string name="wear_action_tempt_unit_error">Různé jednotky používané na hodinkách a telefonu!</string>
<string name="wear_action_tempt_zero_message">Nulový dočasný cíl - zrušení běžícího dočasného cíle?</string>
<string name="wear_action_tempt_min_bg_error">Minimální glykémie mimo dosah!</string>
<string name="wear_action_tempt_max_bg_error">Maximální glykémie mimo dosah!</string>
<string name="wear_action_tempt_manual_range_message">Doč. cíl:\nMin: %1$s\nMax: %2$s\nTrvání: %3$s</string>
<string name="wear_action_tempt_manual_message">Doč. cíl:\nCíl: %1$s\nTrvání: %2$s</string>
<string name="wear_action_tempt_preset_message">Doč. cíl:\nDůvod: %1$s\nCíl: %2$s\nTrvání: %3$s</string>
<string name="quick_wizard_message">Rychlý bolus: %1$s\nInzulín: %2$.2fU\nSacharidy: %3$dg</string>
<string name="wizard_result">Kalkulátor: \nInzulín: %1$.2fU\nSacharidy: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Zobrazit záznam na zařízení:</string>
<string name="quick_wizard_not_available">Vybraný rychlý bolus již není k dispozici, obnovte prosím dlaždici</string>
<string name="wizard_no_actual_bg">Žádná aktuální glykémie k výpočtu!</string>
<string name="wizard_no_active_profile">Není nastaven žádný aktivní profil!</string>
<string name="wizard_no_cob">Neznámý COB! Chybějící glykémie nebo nedávný restart aplikace?</string>
<string name="wizard_carbs_constraint">Sacharidy mimo povolený rozsah!</string>
<string name="wizard_explain_calc">Kalk (IC: %2$.1f, ISF: %2$.1f) z:\"</string>
<string name="wizard_explain_carbs">Sacharidy: %1$.2fU</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">Glykémie: %1$.2fU</string>
<string name="wizard_explain_basal_iob">Bazální IOB: %1$.2fU</string>
<string name="wizard_explain_bolus_iob">Bolusové IOB: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fU</string>
<string name="wizard_explain_trend">15\' trend: %1$.2fU</string>
<string name="wizard_explain_percent">Procentuální hodnota: %1$.2fU x %2$d%% ≈ %3$.2fU</string>
<string name="wizard_constraint_bolus_size">Inzulím mimo povolený rozsah!\nNelze podat %1$.2fU</string>
<string name="wizard_explain_tt">Doč. cíl: %1$s</string>
<string name="wizard_explain_tt_to">%1$s %2$s</string>
<string name="wizard_pump_not_available">Pumpa není k dispozici!</string>
<string name="wear_unknown_action_string">Neznámý příkaz k akci:</string>
<string name="overview_editquickwizard_percentage">Procentní podíl</string>
<string name="app_default">Výchozí nastavení aplikace</string>
<string name="select_profile">Vyberte profil pro úpravu</string>
<string name="refresh_from_nightscout">Obnovit z Nightscoutu</string>
<string name="remove_selected_items">Odstranit zvolené položky</string>
<string name="select_for_removal">Vyberte pro odstranění</string>
<string name="profile_changes">Změny profilu</string>
<string name="tempt_targets">Dočasné cíle</string>
<string name="carbs_and_bolus">Sacharidy a bolusy</string>
<string name="confirm_remove_multiple_items">Opravdu chcete odstranit %1$d položku(y)</string>
<string name="hide_loop">Skrýt smyčku</string>
<string name="show_loop">Zobrazit smyčku</string>
<string name="count_selected">Vybráno: %1$d</string>
</resources>

View file

@ -161,7 +161,6 @@
<string name="end_user_license_agreement">Slutbrugerlicensaftale</string>
<string name="end_user_license_agreement_text">MÅ IKKE BRUGES TIL AT TRÆFFE MEDICINSKE BESLUTNINGER. DER ER INGEN GARANTI FOR PROGRAMMET, I DET OMFANG GÆLDENDE LOV TILLADER DET. UNDTAGEN NÅR DET ELLERS ER ANFØRT SKRIFTLIGT, AT RETTIGHEDSHAVERE OG / ELLER ANDRE PARTER LEVERER PROGRAMMET \"SOM BESET\" UDEN NOGEN FORM FOR GARANTI, HVERKEN UDTRYKT ELLER UNDERFORSTÅET, HERUNDER, MEN IKKE BEGRÆNSET TIL, DE UNDERFORSTÅELIGHEDER, DER ER FORBUNDET MED EGNETHED OG EGNETHED TIL ET BESTEMT FORMÅL. HELE RISIKOEN MED HENSYN TIL KVALITETEN OG YDEEVNEN AF PROGRAMMET ER DIN. HVIS PROGRAMMET VISER SIG AT VÆRE DEFEKT, BÆRER DU SELV OMKOSTNINGERNE VED ALLE NØDVENDIGE SERVICER, REPARATIONER ELLER KORREKTIONER SOM ER NØDVENDIGE.</string>
<string name="end_user_license_agreement_i_understand">JEG FORSTÅR OG ER ENIG</string>
<string name="save">Gem</string>
<string name="reloadprofile">Genindlæs profil</string>
<string name="smscommunicator">SMS Kommunikator</string>
<string name="smscommunicator_allowednumbers">Tilladte telefonnumre</string>
@ -246,7 +245,6 @@
<string name="wear">Ur</string>
<string name="resend_all_data">Send alle data igen</string>
<string name="open_settings_on_wear">Åbn indstillinger på ur</string>
<string name="basal_rate">Basal rate:</string>
<string name="basalvaluebelowminimum">Basal værdi under minimum. Profil ikke angivet!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Sidste BG:</string>
@ -427,8 +425,6 @@
<string name="keep_screen_on_summary">Forhindrer Android i at slukke for skærmen. Det vil forbruge meget energi, når den ikke er tilsluttet stikkontakt.</string>
<string name="sensitivity_warning">Ved at slå funktionen Autosense til husk at indtaste alle spiste kulhydrater. Ellers vil kulhydrat afvigelser blive identificeret forkert som følsomheds ændring !!</string>
<string name="sensitivityweightedaverage">Følsomhed Vægtet Gennemsnit</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Annuller</string>
<string name="notloadedplugins">Ikke alle profiler er indlæst!</string>
<string name="valuesnotstored">Værdier ikke gemt!</string>
<string name="ns_localbroadcasts">Aktiver udsendelse til andre apps (såsom xDrip+). Aktiver ikke hvis du har mere end én version af AAPS eller NSClient installeret!</string>
@ -757,8 +753,6 @@
<string name="profilenamecontainsdot">Profilnavn indeholder punktum.\nDette understøttes ikke af NS.\nProfilen er ikke uploadet til NS.</string>
<string name="low_mark_comment">Nedre værdi for målområde (kun visning)</string>
<string name="high_mark_comment">Øvre værdi for målområde (kun visning)</string>
<string name="age">Alder:</string>
<string name="weight_label">Vægt:</string>
<string name="id">ID:</string>
<string name="submit">Send</string>
<string name="mostcommonprofile">Mest almindelige profil:</string>
@ -900,9 +894,13 @@
<string name="errors">Fejl</string>
<string name="ns_sync_slow">Reducer upload hastighed</string>
<string name="data_status">BG data status</string>
<string name="statuslights_cannula_age">Indstik alder</string>
<string name="statuslights_patch_pump_age">patch pumpe alder</string>
<string name="patch_pump">Patch pumpe</string>
<string name="recalculated_data_used">Genberegnede data anvendt</string>
<string name="bg_too_close">BG for tæt:\n%1$s\n%2$s</string>
<string name="identification">Identifikation (e-mail, FB eller Discord alias osv.)</string>
<string name="identification_not_set">Identifikation ikke indstillet i udvikler-tilstand</string>
<string name="not_available_full">Ikke tilgængelig</string>
<!-- WEAR OS-->
</resources>

View file

@ -161,7 +161,6 @@
<string name="end_user_license_agreement">Endbenutzervereinbarung</string>
<string name="end_user_license_agreement_text">DAS PROGRAMM DARF NICHT FÜR MEDIZINISCHE ENTSCHEIDUNGEN BENUTZT WERDEN. ES GIBT IN DIESEM PROJEKT KEINE GEWÄHRLEISTUNG ODER GARANTIERTE UNTERSTÜTZUNG IN IRGENDEINER ART. WENN DU DICH ENTSCHEIDEST, ES ZU NUTZEN, HÄNGT DIE QUALITÄT UND LEISTUNGSFÄHIGKEIT DIESES PROJEKTES VON DIR SELBST AB. ES WIRD \"WIE BESEHEN\" ZUR VERFÜGUNG GESTELLT. SOLLTE SICH DAS PROGRAMM ALS FEHLERHAFT ERWEISEN, ÜBERNIMMST DU ALLE NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN.</string>
<string name="end_user_license_agreement_i_understand">Ich verstehe und stimme zu.</string>
<string name="save">Speichern</string>
<string name="reloadprofile">Profil neuladen</string>
<string name="smscommunicator">SMS-Kommunikator</string>
<string name="smscommunicator_allowednumbers">Erlaubte Telefonnummern</string>
@ -246,7 +245,7 @@
<string name="wear">Wear</string>
<string name="resend_all_data">Alle Daten erneut senden</string>
<string name="open_settings_on_wear">Öffne Einstellungen auf der Uhr</string>
<string name="basal_rate">Basalrate:</string>
<string name="basal_rate">Basalrate</string>
<string name="basalvaluebelowminimum">Wert der Basalrate unter Minimum. Profil nicht gesetzt!</string>
<string name="sms_actualbg">BZ:</string>
<string name="sms_lastbg">Letzter BZ:</string>
@ -427,8 +426,6 @@
<string name="keep_screen_on_summary">Hindere Android daran, den Bildschirm abzuschalten. Dies erhöht den Energieverbrauch, wenn das Gerät nicht an einem Ladegerät angeschlossen ist.</string>
<string name="sensitivity_warning">Stelle bei aktivierter Autosens-Funktion sicher, dass du alle eingenommenen Kohlenhydrate eingibst. Ansonsten können die Kohlenhydrat-Abweichungen zu falschen Sensitivitätswerten führen!</string>
<string name="sensitivityweightedaverage">Durchschnittliche Sensitivität</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Abbrechen</string>
<string name="notloadedplugins">Es sind nicht alle Profile geladen!</string>
<string name="valuesnotstored">Werte nicht gespeichert!</string>
<string name="ns_localbroadcasts">Aktiviere die Datenübertragung zu anderen Apps (z.B. xDrip+). Nicht aktivieren, falls Du mehr als eine Instanz von AAPS oder NSClient installiert hast!</string>
@ -758,8 +755,8 @@ Unerwartetes Verhalten.</string>
<string name="profilenamecontainsdot">Profilname enthält Punkte.\nDies wird von NS nicht unterstützt.\nProfil wird nicht zu NS hochgeladen.</string>
<string name="low_mark_comment">Unterer Wert des Zielbereichs (nur Anzeige)</string>
<string name="high_mark_comment">Oberer Wert des Zielbereichs (nur Anzeige)</string>
<string name="age">Alter:</string>
<string name="weight_label">Gewicht:</string>
<string name="age">Alter</string>
<string name="weight_label">Gewicht</string>
<string name="id">ID:</string>
<string name="submit">Senden</string>
<string name="mostcommonprofile">Meistgenutztes Profil:</string>
@ -900,9 +897,41 @@ Unerwartetes Verhalten.</string>
<string name="errors">Fehler</string>
<string name="ns_sync_slow">Hochladen verlangsamen</string>
<string name="data_status">Status BZ-Daten</string>
<string name="statuslights_cannula_age">Kanülenalter</string>
<string name="statuslights_patch_pump_age">Alter Patchpumpe</string>
<string name="patch_pump">Patch-Pumpe</string>
<string name="recalculated_data_used">Verwendete Daten neu berechnet</string>
<string name="bg_too_close">BZ zu nah:\n%1$s\n%2$s</string>
<string name="identification">Identifikation (E-Mail, Facebook oder Discord Nickname)</string>
<string name="identification_not_set">Identifikation im Dev-Modus nicht gesetzt</string>
<string name="a11y_dialog">Dialog</string>
<string name="a11y_current_bg">Aktueller Blutzucker</string>
<string name="a11_correction_percentage">korrektes Ergebnis mit %</string>
<string name="a11_correction_units">korrektes Ergebnis mit Einheiten</string>
<string name="not_available_full">Nicht verfügbar</string>
<string name="a11y_high">hoch</string>
<string name="a11y_inrange">im Zielbereich</string>
<string name="a11y_low">niedrig</string>
<string name="a11y_arrow_double_down">schnell fallend</string>
<string name="a11y_arrow_single_down">fallend</string>
<string name="a11y_arrow_forty_five_down">langsam fallend</string>
<string name="a11y_arrow_flat">stabil</string>
<string name="a11y_arrow_forty_five_up">Langsamer Anstieg</string>
<string name="a11y_arrow_single_up">steigend</string>
<string name="a11y_arrow_double_up">schnell steigend</string>
<string name="a11y_arrow_none">kein(e)</string>
<string name="a11y_arrow_unknown">unbekannt</string>
<string name="a11y_graph">Diagramm</string>
<string name="a11y_bg_quality">BZ-Qualität</string>
<string name="a11y_bg_quality_recalculated">neu berechnet</string>
<string name="a11y_bg_quality_doubles">doppelte Einträge</string>
<string name="a11y_insulin_label">Insulin</string>
<string name="a11y_blood_glucose">Blutzucker</string>
<string name="a11y_bg_outdated">veraltet</string>
<string name="a11y_carb_reminder">Erinnerung einstellen</string>
<string name="a11y_add_new_profile">Neues Profil hinzufügen</string>
<string name="a11y_clone_profile">aktuelles Profil klonen (kopieren)</string>
<string name="a11y_delete_current_profile">aktuelles Profil löschen</string>
<string name="a11y_add_new_to_list">neu zur Liste hinzufügen</string>
<!-- WEAR OS-->
</resources>

View file

@ -131,7 +131,6 @@
<string name="end_user_license_agreement">Άδεια χρήσης τελικού χρήστη</string>
<string name="end_user_license_agreement_text">ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΘΕΙ ΓΙΑ ΝΑ ΚΑΝΕΤΕ ΙΑΤΡΙΚΗ ΑΠΟΦΑΣΗ. ΔΕΝ ΥΠΑΡΧΕΙ ΕΓΓΥΗΣΗ ΓΙΑ ΤΟ ΠΡΟΓΡΑΜΜΑ, ΣΤΟ ΒΑΘΜΟ ΠΟΥ ΕΠΙΤΡΕΠΕΤΑΙ ΑΠΟ ΤΟ ΕΦΑΡΜΟΣΤΕΟ ΔΙΚΑΙΟ. ΕΚΤΟΣ ΟΠΟΙΑΣΔΗΠΟΤΕ ΔΙΑΒΑΘΜΙΣΜΕΝΗ ΚΑΤΑ ΤΗΝ ΕΓΓΡΑΦΗ ΤΩΝ ΚΑΤΟΧΟΙ ΠΝΕΥΜΑΤΙΚΩΝ ΔΙΚΑΙΩΜΑΤΩΝ ΚΑΙ/Ή ΑΛΛΑ ΜΕΡΗ ΠΑΡΕΧΟΝΤΑΙ ΤΟ ΠΡΟΓΡΑΜΜΑ \"ΩΣ ΕΧΕΙ\" ΧΩΡΙΣ ΕΓΓΥΗΣΗ ΟΠΟΙΟΥΔΗΠΟΤΕ ΕΙΔΟΥΣ, ΕΞΑΙΡΟΥΜΕΝΕΣ Ή ΣΙΩΠΗΡΕΣ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΩΝ, ΕΝΔΕΙΚΤΙΚΑ, ΤΩΝ ΣΙΩΠΗΡΩΝ ΕΓΓΥΗΣΕΩΝ ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ΚΑΙ ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Ο ΟΛΟΚΛΗΡΩΜΕΝΟΣ ΚΙΝΔΥΝΟΣ ΟΣΟΝ ΑΦΟΡΑ ΤΗΝ ΠΟΙΟΤΗΤΑ ΚΑΙ ΤΗΝ ΑΠΟΔΟΣΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΙΝΑΙ ΔΙΚΟ ΣΑΣ. ΕΑΝ ΤΟ ΠΡΟΓΡΑΜΜΑ ΔΕΝ ΕΙΝΑΙ ΕΛΑΤΤΩΜΑΤΙΚΟ, ΠΡΕΠΕΙ ΝΑ ΕΞΕΤΑΣΤΕ ΤΟ ΚΟΣΤΟΣ ΟΛΩΝ ΤΩΝ ΑΠΑΡΑΙΤΗΤΩΝ ΣΥΝΤΗΡΗΣΕΩΝ, ΕΠΙΣΚΕΥΩΝ Ή ΔΙΟΡΘΩΣΕΩΝ.</string>
<string name="end_user_license_agreement_i_understand">ΚΑΤΑΛΑΒΑ ΚΑΙ ΣΥΜΦΩΝΩ</string>
<string name="save">Αποθήκευση</string>
<string name="reloadprofile">Ξαναφορτώστε το προφίλ</string>
<string name="smscommunicator">SMS Επικοινωνία</string>
<string name="smscommunicator_allowednumbers">Επιτρεπτά τηλεφωνικά νούμερα</string>
@ -183,7 +182,6 @@
<string name="wear">Wear</string>
<string name="resend_all_data">Ξαναστείλτε όλα τα Δεδομένα</string>
<string name="open_settings_on_wear">Ρυθμίσεις στο Wear</string>
<string name="basal_rate">Βασικός Ρυθμός:</string>
<string name="basalvaluebelowminimum">Τιμή βασικού κάτω από το ελάχιστο. Δεν έχει ρυθμιστεί το προφίλ!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Τελευταία BG:</string>
@ -313,8 +311,6 @@
<string name="keep_screen_on_summary">Αποτρέψετε το Android να απενεργοποιήσει την οθόνη. Χωρίς σύνδεση με το φορτιστή, αποφορτίζει πολύ γρήγορα την μπαταρία.</string>
<string name="sensitivity_warning">Ενεργοποιώντας το autosense θυμηθείτε να εισάγετε όλους τους υδατάνθρακες. Διαφορετικά, οι αποκλίσεις των υδατανθράκων θα εντοπιστούν λανθασμένα ως αλλαγή ευαισθησίας!!</string>
<string name="sensitivityweightedaverage">Ευαισθησία WeightedAverage</string>
<string name="mdtp_ok">ΟΚ</string>
<string name="mdtp_cancel">Ακύρωση</string>
<string name="notloadedplugins">Δεν έχουν φορτωθεί όλα τα προφίλ!</string>
<string name="valuesnotstored">Οι τιμές δεν αποθηκεύτηκαν!</string>
<string name="ns_localbroadcasts_title">Ενεργοποιήστε τις τοπικές αποστολές.</string>
@ -578,4 +574,5 @@
<string name="format_percent">%1$d%%</string>
<string name="unit_minute_short">min</string>
<!-- SMS Communicator & OTP Authenticator -->
<!-- WEAR OS-->
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">Sincroniza tus datos con Nightscout</string>
<string name="description_ama">Estado del algoritmo en 2017</string>
<string name="description_smb">Algoritmo más reciente para usuarios avanzados</string>
<string name="description_smb_dynamic_isf">Algoritmo más reciente para usuarios avanzados con ISF dinámico/automático</string>
<string name="description_overview">Muestra el estado actual de tu lazo y los botones para las acciones más usadas</string>
<string name="description_persistent_notification">Muestra una notificación en curso con un breve resumen de lo que está haciendo tu lazo</string>
<string name="description_profile_local">Define un perfil que esté disponible cuando tengas una desconexión</string>
@ -161,7 +162,6 @@
<string name="end_user_license_agreement">Acuerdo de licencia de usuario final</string>
<string name="end_user_license_agreement_text">NO DEBE UTILIZARSE PARA TOMAR DECISIONES MÉDICAS. NO HAY NINGUNA GARANTÍA EN EL PROGRAMA, EN LA MEDIDA PERMITIDA POR LA LEY APLICABLE. EXCEPTO CUANDO SE INDIQUE LO CONTRARIO POR ESCRITO, LOS TITULARES DE LOS DERECHOS DE AUTOR Y/O OTRAS PARTES, PROPORCIONAN EL PROGRAMA \"TAL CUAL\", SIN GARANTÍA DE NINGÚN TIPO, YA SEA EXPRESA O IMPLÍCITA, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y ADECUACIÓN PARA UN PROPÓSITO EN PARTICULAR. TODO EL RIESGO EN CUANTO A LA CALIDAD Y EL RENDIMIENTO DEL PROGRAMA ES SUYA. SI EL PROGRAMA TUVIERA UN ERROR, USTED ASUME EL COSTE DE TODOS LOS SERVICIOS, REPARACIONES O CORRECCIONES NECESARIAS.</string>
<string name="end_user_license_agreement_i_understand">LO ENTIENDO Y ACEPTO</string>
<string name="save">Guardar</string>
<string name="reloadprofile">Recargar Perfil</string>
<string name="smscommunicator">Comunicador SMS</string>
<string name="smscommunicator_allowednumbers">Números de teléfono permitidos</string>
@ -224,7 +224,7 @@
<string name="overview_editquickwizard_valid">Validar:</string>
<string name="overview_editquickwizardlistactivity_add">Añadir</string>
<string name="overview_quickwizard_item_edit_button">Editar</string>
<string name="mealbolus">BOLO</string>
<string name="mealbolus">COMIDA</string>
<string name="correctionbous">Corrección</string>
<string name="actions">Acciones</string>
<string name="ns_upload_only">(PELIGROSO DESHABILITAR) Sólo subida a Nightscout</string>
@ -246,7 +246,7 @@
<string name="wear">Reloj</string>
<string name="resend_all_data">Reenviar todos los datos</string>
<string name="open_settings_on_wear">Abrir ajustes en el reloj</string>
<string name="basal_rate">Ratio Basal:</string>
<string name="basal_rate">Tasa Basal</string>
<string name="basalvaluebelowminimum">Valor basal por debajo del mínimo. Perfil no establecido.</string>
<string name="sms_actualbg">Glucosa:</string>
<string name="sms_lastbg">Última Glucosa:</string>
@ -267,6 +267,7 @@
<string name="configbuilder_shortname">CONF</string>
<string name="loop_shortname">LAZO</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DYNISF</string>
<string name="localprofile_shortname">PERFIL</string>
<string name="overview_shortname">INICIO</string>
<string name="virtualpump_shortname">BOMBAV</string>
@ -427,8 +428,6 @@
<string name="keep_screen_on_summary">Evita que Android apague la pantalla. Consume mucha batería cuando el teléfono no está conectado al cargador</string>
<string name="sensitivity_warning">Al activar Autosens, recuerda introducir todos carbohidratos que has comido, sino, las desviaciones de carbohidratos serán identificados incorrectamente, como un cambio de sensibilidad</string>
<string name="sensitivityweightedaverage">Sensibilidad promedio ponderada</string>
<string name="mdtp_ok">Ok</string>
<string name="mdtp_cancel">Cancelar</string>
<string name="notloadedplugins">Faltan perfiles por cargar!</string>
<string name="valuesnotstored">Valores no guardados!</string>
<string name="ns_localbroadcasts">Habilita las transmisiones a otras aplicaciones (como xDrip+). ¡No lo habilites si tienes más de una instancia de AAPS o NSClient instaladas!</string>
@ -502,6 +501,7 @@
<string name="negativeonly">Solo negativo</string>
<string name="overview_editquickwizard_usecob">Cálculo COB</string>
<string name="overview_editquickwizard_usetemptarget">Cálculo objetivo temporal</string>
<string name="overview_editquickwizard_usepercentage">Cálculo de porcentaje</string>
<string name="loopenabled">Lazo activado</string>
<string name="apsselected">APS seleccionado</string>
<string name="nsclienthaswritepermission">NSClient tiene permiso para escribir</string>
@ -757,8 +757,8 @@
<string name="profilenamecontainsdot">El nombre de perfil contiene puntos.\nEsto no está soportado por NS.\nEl perfil no se carga en NS.</string>
<string name="low_mark_comment">Valor de glucosa baja (sólo visualización)</string>
<string name="high_mark_comment">Valor de glucosa alta (sólo visualización)</string>
<string name="age">Edad:</string>
<string name="weight_label">Peso:</string>
<string name="age">Edad</string>
<string name="weight_label">Peso</string>
<string name="id">ID:</string>
<string name="submit">Enviar</string>
<string name="mostcommonprofile">Perfil más común:</string>
@ -900,9 +900,74 @@
<string name="errors">Errores</string>
<string name="ns_sync_slow">Ralentizar subidas</string>
<string name="data_status">Estado de datos de glucosa</string>
<string name="statuslights_cannula_age">edad de la cánula</string>
<string name="statuslights_patch_pump_age">edad del parche de la bomba</string>
<string name="patch_pump">Bomba parche</string>
<string name="recalculated_data_used">Datos recalculados utilizados</string>
<string name="bg_too_close">Datos de glucosa demasiado cercanos:\n%1$s\n%2$s</string>
<string name="identification">Identificación (correo electrónico, FB, nick de Discord, etc.)</string>
<string name="identification_not_set">Identificación no establecida en el modo dev</string>
<string name="a11y_dialog">diálogo</string>
<string name="a11y_current_bg">glucosa en sangre actual</string>
<string name="a11_correction_percentage">resultado correcto con %</string>
<string name="a11_correction_units">corregir resultado con unidades</string>
<string name="not_available_full">No disponible</string>
<string name="a11y_high">alto</string>
<string name="a11y_inrange">en rango</string>
<string name="a11y_low">bajo</string>
<string name="a11y_arrow_double_down">bajando rápido</string>
<string name="a11y_arrow_single_down">bajando</string>
<string name="a11y_arrow_forty_five_down">bajando despacio</string>
<string name="a11y_arrow_flat">estable</string>
<string name="a11y_arrow_forty_five_up">subiendo despacio</string>
<string name="a11y_arrow_single_up">subiendo</string>
<string name="a11y_arrow_double_up">subiendo rápido</string>
<string name="a11y_arrow_none">ninguno</string>
<string name="a11y_arrow_unknown">desconocido</string>
<string name="a11y_graph">gráfico</string>
<string name="a11y_bg_quality">calidad de glucosa en sangre</string>
<string name="a11y_bg_quality_recalculated">recalculado</string>
<string name="a11y_bg_quality_doubles">entradas dobles</string>
<string name="a11y_insulin_label">insulina</string>
<string name="a11y_blood_glucose">glucosa en sangre</string>
<string name="a11y_bg_outdated">desactualizado</string>
<string name="a11y_carb_reminder">establecer recordatorio</string>
<string name="a11y_add_new_profile">añadir nuevo perfil</string>
<string name="a11y_clone_profile">clonar el perfil actual</string>
<string name="a11y_delete_current_profile">borrar el perfil actual</string>
<string name="a11y_add_new_to_list">añadir nuevo a la lista</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Objetivo Temporal preestablecido desconocido: %1$s</string>
<string name="wear_action_tempt_cancel_message">¿Cancelar la ejecución del objetivo temporal?</string>
<string name="wear_action_tempt_unit_error">¡Diferentes unidades usadas en reloj y en el teléfono!</string>
<string name="wear_action_tempt_zero_message">Objetivo Temporal Zero - ¿Cancelar el Objetivo Temporal en ejecución?</string>
<string name="wear_action_tempt_min_bg_error">¡Glucosa mínima fuera de rango!</string>
<string name="wear_action_tempt_max_bg_error">¡Glucosa máxima fuera de rango!</string>
<string name="wear_action_tempt_manual_range_message">Objetivo temporal:\nMin: %1$s\nMax: %2$s\nDuración: %3$s</string>
<string name="wear_action_tempt_manual_message">Objetivo temporal:\nObjetivo: %1$s\nDuración: %2$s</string>
<string name="wear_action_tempt_preset_message">ObjetivoTemporal:\Razón: %1$s\nObjetivo: %2$s\nDuración: %3$s</string>
<string name="quick_wizard_message">Asistente Rápido: %1$s\nInsulina: %2$.2fU\nCarbohidratos: %3$dg</string>
<string name="wizard_result">Calc. Asistente:\nInsulina: %1$.2fU\nCarbohidratos: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Mostrar entrada en dispositivo:</string>
<string name="quick_wizard_not_available">El asistente rápido seleccionado ya no está disponible, por favor actualice su mosaico</string>
<string name="wizard_no_actual_bg">¡No hay valor de glucosa reciente en el que basar el cálculo!</string>
<string name="wizard_no_active_profile">¡No hay perfil activo!</string>
<string name="wizard_no_cob">COB desconocido! ¿Valor de glucosa ausente o reincio reciente de la aplicación?</string>
<string name="wizard_carbs_constraint">¡Violación de restricción de carbohidratos!</string>
<string name="wizard_explain_calc">Calc (CI: %2$.1f, ISF: %2$.1f) desde:\"</string>
<string name="wizard_explain_carbs">Carbohidratos: %1$.2fU</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">BG: %1$.2fU</string>
<string name="wizard_explain_basal_iob">Basal IOB: %1$.2fU</string>
<string name="wizard_explain_bolus_iob">Bolo IOB: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolo: %1$.2fU</string>
<string name="wizard_explain_trend">Tendencia 15\': %1$.2fU</string>
<string name="wizard_explain_percent">Porcentaje: %1$.2fU x %2$d%% ≈ %3$.2fU</string>
<string name="wizard_constraint_bolus_size">¡Violación de restricciones de insulina!\nNo se puede entregar %1$.2fU</string>
<string name="wizard_explain_tt">BasalT: %1$s</string>
<string name="wizard_explain_tt_to">%1$s a %2$s</string>
<string name="wizard_pump_not_available">¡No hay bomba disponible!</string>
<string name="wear_unknown_action_string">Comando de acción desconocido:</string>
<string name="overview_editquickwizard_percentage">Porcentaje</string>
<string name="app_default">Aplicación por defecto</string>
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">Synchronise vos données avec Nightscout</string>
<string name="description_ama">État de lalgorithme en 2017</string>
<string name="description_smb">Algorithme le plus récent pour les utilisateurs avancés</string>
<string name="description_smb_dynamic_isf">Algorithme le plus récent pour les utilisateurs avancés avec SI dynamique/automatique</string>
<string name="description_overview">Affiche létat actuel de votre Boucle et des boutons dactions les plus courantes</string>
<string name="description_persistent_notification">Affiche une notification en cours avec un bref aperçu de ce que fait votre Boucle</string>
<string name="description_profile_local">Définissez un profil qui est disponible hors ligne.</string>
@ -162,7 +163,6 @@
<string name="end_user_license_agreement_text">NE DOIT PAS ÊTRE UTILISÉ POUR PRENDRE DES DÉCISIONS MÉDICALES. IL N\'Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LA LIMITE PERMISE PAR LA LOI APPLICABLE. SAUF S\'IL EST INDIQUÉ LE CONTRAIRE PAR ÉCRIT. LES TITULAIRES DU DROIT D\'AUTEUR ET / OU D\'AUTRES PARTIES FOURNISSENT LE PROGRAMME «EN L\'ÉTAT» SANS GARANTIE D\'AUCUNE SORTE, EXPLICITE OU IMPLICITE, Y COMPRIS MAIS NON SEULEMENT AUX GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D\'ADÉQUATION À UN USAGE PARTICULIER
L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME SONT DE VOTRE RESPONSABILITÉ. SI LE PROGRAMME EST DÉFECTUEUX, VOUS ASSUMEZ LE COÛT DE TOUS LES SERVICES, RÉPARATIONS OU CORRECTIONS NÉCESSAIRES.</string>
<string name="end_user_license_agreement_i_understand">JE COMPRENDS ET J\'ACCEPTE LES CONDITIONS DU CONTRAT</string>
<string name="save">Sauvegarder</string>
<string name="reloadprofile">Actualiser le profil</string>
<string name="smscommunicator">Communicateur SMS</string>
<string name="smscommunicator_allowednumbers">Numéros de tél autorisés</string>
@ -247,7 +247,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="wear">Wear</string>
<string name="resend_all_data">Renvoyer toutes les données</string>
<string name="open_settings_on_wear">Afficher les Paramètres sur la Montre</string>
<string name="basal_rate">Débit Basal :</string>
<string name="basal_rate">Débit de Basal</string>
<string name="basalvaluebelowminimum">Le débit Basal est inférieur au minimum autorisé. Profil non accepté !</string>
<string name="sms_actualbg">G:</string>
<string name="sms_lastbg">Dernière G:</string>
@ -268,6 +268,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="configbuilder_shortname">CONF</string>
<string name="loop_shortname">BOUCLE</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DynSI</string>
<string name="localprofile_shortname">PL</string>
<string name="overview_shortname">ACCUEIL</string>
<string name="virtualpump_shortname">POMPEV</string>
@ -428,13 +429,12 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="keep_screen_on_summary">Empêcher Android d\'éteindre l\'écran. Ceci consommera beaucoup de batterie lorsque vous nêtes pas connecté à une prise de courant.</string>
<string name="sensitivity_warning">En activant la fonction Autosens, noubliez pas de rentrer tous les glucides consommés. Sinon les déviations de glucides seront incorrectement identifiées pour les changements de sensibilité !!</string>
<string name="sensitivityweightedaverage">Sensibilité avec moyenne pondérée</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Annuler</string>
<string name="notloadedplugins">Les profils ne sont pas tous téléchargés !</string>
<string name="valuesnotstored">Valeurs non enregistrées !</string>
<string name="ns_localbroadcasts">Active les diffusions vers d\'autres applications (comme xDrip+). Ne pas activer si plusieurs instances d\'AAPS ou de NSClient sont installées !</string>
<string name="ns_localbroadcasts_title">Activer les transmissions locales</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="openaps_smb_dynamic_isf">SI dynamique</string>
<string name="enableuam">Activer RNS</string>
<string name="enablesmb">Activer SMB</string>
<string name="enablesmb_summary">Utiliser les Super Micro Bolus au lieu des débits de base temporaires pour une action rapide</string>
@ -503,6 +503,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="negativeonly">Seulement négatif</string>
<string name="overview_editquickwizard_usecob">Calcul GA</string>
<string name="overview_editquickwizard_usetemptarget">Cible temporaire</string>
<string name="overview_editquickwizard_usepercentage">Calcul du pourcentage</string>
<string name="loopenabled">Boucle activée</string>
<string name="apsselected">APS Sélectionné</string>
<string name="nsclienthaswritepermission">NSClient a la permission d\'écriture</string>
@ -663,6 +664,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="sensitivity_raises_target_title">Sensibilité augmente la cible</string>
<string name="sensitivity_raises_target_summary">Quand une sensibilité est détectée, augmentation de la glycémie cible</string>
<string name="careportal_removestartedevents">Réinitialiser AndroidAPS</string>
<string name="show_invalidated">Montrer les entrées invalides</string>
<string name="hide_invalidated">Masquer les entrées invalides</string>
<string name="remove_items">Supprimer des entrées</string>
<string name="storedsettingsfound">Paramètres sauvegardés trouvés</string>
<string name="allow_hardware_pump_text">ATTENTION : Si vous activez et connectez à une vraie pompe, AndroidAPS copiera les paramètres Basals du profil vers la pompe, écrasant le taux basal existant stocké sur la pompe. Assurez-vous d\'avoir correctement saisi et réglé les paramètres Basal dans AndroidAPS. Si vous ne savez pas ou si ne voulez pas écraser les paramètres Basal sur votre pompe, appuyez sur Annuler et reporter le passage à la pompe à une date ultérieure.</string>
<string name="error_adding_treatment_title">Données de traitement incomplètes</string>
@ -758,8 +762,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="profilenamecontainsdot">Le nom du profil contient des points.\nCe n\'est pas pris en charge par NS.\nLe profil n\'est pas remonté dans NS.</string>
<string name="low_mark_comment">Valeur inférieure dans la plage (affichage uniquement)</string>
<string name="high_mark_comment">Valeur supérieure dans la plage (affichage uniquement)</string>
<string name="age">Âge :</string>
<string name="weight_label">Poids :</string>
<string name="age">Âge </string>
<string name="weight_label">Poids </string>
<string name="id">ID :</string>
<string name="submit">Envoyer</string>
<string name="mostcommonprofile">Profil le plus courant :</string>
@ -900,9 +904,85 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="errors">Erreurs</string>
<string name="ns_sync_slow">Ralentir les téléchargements</string>
<string name="data_status">État des données Gly</string>
<string name="statuslights_cannula_age">âge canule</string>
<string name="statuslights_patch_pump_age">âge pompe patch</string>
<string name="patch_pump">Pompe patch</string>
<string name="recalculated_data_used">Données recalculées utilisées</string>
<string name="bg_too_close">Gly trop proche :\n%1$s\n%2$s</string>
<string name="identification">Identification (email, FB ou pseudo dans Discord, etc)</string>
<string name="identification_not_set">Identification non définie en mode dev</string>
<string name="a11y_dialog">dialogue</string>
<string name="a11y_current_bg">glycémie actuelle</string>
<string name="a11_correction_percentage">corriger le résultat avec le %</string>
<string name="a11_correction_units">corriger le résultat avec les unités</string>
<string name="not_available_full">Non disponible</string>
<string name="a11y_high">haut</string>
<string name="a11y_inrange">dans la plage</string>
<string name="a11y_low">bas</string>
<string name="a11y_arrow_double_down">en baisse rapide</string>
<string name="a11y_arrow_single_down">en baisse</string>
<string name="a11y_arrow_forty_five_down">en baisse lente</string>
<string name="a11y_arrow_flat">stable</string>
<string name="a11y_arrow_forty_five_up">en hausse lente</string>
<string name="a11y_arrow_single_up">en hausse</string>
<string name="a11y_arrow_double_up">en hausse rapide</string>
<string name="a11y_arrow_none">aucun</string>
<string name="a11y_arrow_unknown">inconnu</string>
<string name="a11y_graph">graphique</string>
<string name="a11y_bg_quality">qualité de la glycémie</string>
<string name="a11y_bg_quality_recalculated">recalculé</string>
<string name="a11y_bg_quality_doubles">entrées doubles</string>
<string name="a11y_insulin_label">insuline</string>
<string name="a11y_blood_glucose">glycémie</string>
<string name="a11y_bg_outdated">obsolète</string>
<string name="a11y_carb_reminder">définir un rappel</string>
<string name="a11y_add_new_profile">ajouter un nouveau profil</string>
<string name="a11y_clone_profile">dupliquer le profil actuel</string>
<string name="a11y_delete_current_profile">supprimer le profil actuel</string>
<string name="a11y_add_new_to_list">ajouter un nouveau à la liste</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Préréglage inconnu de la cible temporaire : %1$s</string>
<string name="wear_action_tempt_cancel_message">Annuler l\'exécution des cibles Temp?</string>
<string name="wear_action_tempt_unit_error">Différentes unités utilisées sur la montre et le téléphone!</string>
<string name="wear_action_tempt_zero_message">Pas de Cible Temp - annuler la cible temporaire en cours?</string>
<string name="wear_action_tempt_min_bg_error">Gly mini hors limite!</string>
<string name="wear_action_tempt_max_bg_error">Gly maxi hors limite!</string>
<string name="wear_action_tempt_manual_range_message">Cible temporaire:\nMin: %1$s\nMax : %2$s\nDurée : %3$s</string>
<string name="wear_action_tempt_manual_message">Cible temporaire:\nCible: %1$s\nDurée: %2$s</string>
<string name="wear_action_tempt_preset_message">Cible temporaire:\nRaison: %1$s\nCible : %2$s\nDurée : %3$s</string>
<string name="quick_wizard_message">Assistant: %1$s\nInsuline : %2$.2fU\nGlucides : %3$dg</string>
<string name="wizard_result">Assistant Calc :\nInsuline : %1$.2fU\nGlucides : %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Afficher l\'entrée sur l\'appareil :</string>
<string name="quick_wizard_not_available">L\'assistant rapide sélectionné n\'est plus disponible, veuillez actualiser l\'écran</string>
<string name="wizard_no_actual_bg">Pas de glycémie récente pour calculer !</string>
<string name="wizard_no_active_profile">Aucun profil activé !</string>
<string name="wizard_no_cob">GA inconnu! glycémie manquante ou démarrage récent de l\'application ?</string>
<string name="wizard_carbs_constraint">Violation de contrainte des glucides!</string>
<string name="wizard_explain_calc">Calcul (G/I: %2$.1f, SI: %2$.1f) de:\"</string>
<string name="wizard_explain_carbs">Glucides : %1$.2fU</string>
<string name="wizard_explain_cob">GA: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">Gly: %1$.2fU</string>
<string name="wizard_explain_basal_iob">Basal IA: %1$.2fU</string>
<string name="wizard_explain_bolus_iob">Bolus IA: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolus : %1$.2fU</string>
<string name="wizard_explain_trend">tendance 15\': %1$.2fU</string>
<string name="wizard_explain_percent">Pourcentage : %1$.2fU x %2$d%% ≈ %3$.2fU</string>
<string name="wizard_constraint_bolus_size">Violation de contrainte d\'insuline!\nImpossible de délivrer %1$.2fU</string>
<string name="wizard_explain_tt">Cible Temp: %1$s</string>
<string name="wizard_explain_tt_to">%1$s vers %2$s</string>
<string name="wizard_pump_not_available">Aucune pompe disponible!</string>
<string name="wear_unknown_action_string">Commande inconnue :</string>
<string name="overview_editquickwizard_percentage">Pourcentage</string>
<string name="app_default">Application par défaut</string>
<string name="select_profile">Sélectionnez le profil à modifier</string>
<string name="refresh_from_nightscout">Rafraîchir à partir de Nightscout</string>
<string name="remove_selected_items">Supprimer les entrées sélectionnées</string>
<string name="select_for_removal">Sélectionner pour suppression</string>
<string name="profile_changes">Changements de profil</string>
<string name="tempt_targets">Cibles Temp</string>
<string name="carbs_and_bolus">Glucides et bolus</string>
<string name="confirm_remove_multiple_items">Êtes-vous sûr de vouloir supprimer %1$d entrée(s)</string>
<string name="hide_loop">Masquer la boucle</string>
<string name="show_loop">Afficher les entrées boucle</string>
<string name="count_selected">%1$d sélectionnée(s)</string>
</resources>

View file

@ -60,7 +60,6 @@
<string name="nav_export">Socruithe Easpórtáil</string>
<string name="nav_import">Socruithe Iompórtáil</string>
<string name="check_preferences_import_btn">Iompórtáil</string>
<string name="save">Sábháil</string>
<string name="reloadprofile">Athlódáil próifíl</string>
<string name="smscommunicator_loophasbeendisabled">Is lúb díchumasaithe</string>
<string name="smscommunicator_loophasbeenenabled">Is lúb cumasaithe</string>
@ -78,7 +77,6 @@
<string name="units_colon">Aonaid:</string>
<string name="units">Aonaid</string>
<string name="dia">DIA</string>
<string name="basal_rate">Bunaidh ráta:</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">GF deiridh:</string>
<string name="mdi">MDI</string>
@ -141,8 +139,6 @@
<string name="openaps">OpenAPS</string>
<string name="openaps_short">OAPS</string>
<string name="basal_short">BUN</string>
<string name="mdtp_ok">Ceart go leor</string>
<string name="mdtp_cancel">Cuir ar ceal</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="rapid_acting_oref">Rapid-Acting Oref</string>
<string name="lyumjev">Lyumjev</string>
@ -186,7 +182,7 @@
<string name="dia_short">DIA</string>
<string name="ic_short">IC</string>
<string name="isf_short">ISF</string>
<string name="age">Aois:</string>
<string name="randombg_short">BG</string>
<!-- SMS Communicator & OTP Authenticator -->
<!-- WEAR OS-->
</resources>

View file

@ -5,4 +5,5 @@
<!-- <string name="ja_lang" translatable="false">Japanese</string> -->
<string name="ns_wifi_ssids">WiFi SSID</string>
<!-- SMS Communicator & OTP Authenticator -->
<!-- WEAR OS-->
</resources>

View file

@ -161,7 +161,6 @@
<string name="end_user_license_agreement">Contratto di licenza per l\'utente</string>
<string name="end_user_license_agreement_text">NON DEVE ESSERE USATO PER PRENDERE DECISIONI MEDICHE. NON ESISTE ALCUNA GARANZIA PER IL PROGRAMMA, NELLA MISURA CONSENTITA DALLA LEGGE APPLICABILE. TRANNE QUANDO DIVERSAMENTE INDICATO PER ISCRITTO, I DETENTORI DEL COPYRIGHT E/O ALTRE PARTI FORNISCONO IL PROGRAMMA \"COSÌ COM\'È\" SENZA GARANZIA DI ALCUN TIPO, ESPLICITA O IMPLICITA, INCLUSE, MA NON LIMITATAMENTE A, GARANZIE IMPLICITE DI COMMERCIABILITÀ E IDONEITÀ PER UN SCOPO PARTICOLARE. L\'INTERO RISCHIO RIGUARDO LA QUALITÀ E LE PRESTAZIONI DEL PROGRAMMA È TUO. SE IL PROGRAMMA DOVESSE RISULTARE DIFETTOSO, TI ASSUMI IL COSTO DI TUTTE LE NECESSARIE MANUTENZIONI, RIPARAZIONI O CORREZIONI.</string>
<string name="end_user_license_agreement_i_understand">COMPRENDO E ACCETTO</string>
<string name="save">Salva</string>
<string name="reloadprofile">Ricarica profilo</string>
<string name="smscommunicator">Comunicazioni SMS</string>
<string name="smscommunicator_allowednumbers">Numeri di telefono consentiti</string>
@ -246,7 +245,6 @@
<string name="wear">Smartwatch</string>
<string name="resend_all_data">Invia di nuovo tutti i dati</string>
<string name="open_settings_on_wear">Apri impostazioni sullo smartwatch</string>
<string name="basal_rate">Velocità basale:</string>
<string name="basalvaluebelowminimum">Valore basale inferiore al minimo. Profilo non impostato!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Ultimo BG:</string>
@ -427,8 +425,6 @@
<string name="keep_screen_on_summary">Evita che Android spenga lo schermo. Consumerà molta energia quando non è collegato alla presa di corrente.</string>
<string name="sensitivity_warning">Attivando la funzione Autosense, ricorda di inserire tutti i carboidrati assunti. Altrimenti le deviazioni di glicemia dovute ai carboidrati saranno identificate erroneamente come variazione di sensibilità !!</string>
<string name="sensitivityweightedaverage">Sensibilità WeightedAverage</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Annulla</string>
<string name="notloadedplugins">Non tutti i profili caricati!</string>
<string name="valuesnotstored">Valori non memorizzati!</string>
<string name="ns_localbroadcasts">Abilita trasmissioni ad altre app (come xDrip+). Non abilitare se hai installato più di un\'istanza di AAPS o NSClient!</string>
@ -757,8 +753,7 @@
<string name="profilenamecontainsdot">Il nome profilo contiene dei punti.\nQuesto non è supportato da NS.\nIl profilo non viene caricato in NS.</string>
<string name="low_mark_comment">Valore più basso per l\'intervallo di visualizzazione dell\'area \"in range\"</string>
<string name="high_mark_comment">Valore più alto per l\'intervallo di visualizzazione dell\'area \"in range\"</string>
<string name="age">Età:</string>
<string name="weight_label">Peso:</string>
<string name="age">Età</string>
<string name="id">ID:</string>
<string name="submit">Invia</string>
<string name="mostcommonprofile">Profilo più comune:</string>
@ -905,4 +900,22 @@
<string name="identification">Identificazione (email, nick Discord o FB, etc)</string>
<string name="identification_not_set">Identificazione non impostata in modalità dev</string>
<string name="not_available_full">Non disponibile</string>
<string name="a11y_high">alto</string>
<string name="a11y_low">basso</string>
<string name="a11y_arrow_flat">stabile</string>
<string name="a11y_arrow_unknown">sconosciuto</string>
<string name="a11y_graph">grafico</string>
<string name="a11y_bg_quality">qualità glicemia</string>
<string name="a11y_bg_quality_recalculated">ricalcolato</string>
<string name="a11y_insulin_label">insulina</string>
<string name="a11y_blood_glucose">glicemia</string>
<!-- WEAR OS-->
<string name="wizard_explain_carbs">CHO: %1$.2fU</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fU</string>
<string name="wizard_explain_bg">BG: %1$.2fU</string>
<string name="wizard_explain_basal_iob">IOB da basale: %1$.2fU</string>
<string name="wizard_explain_bolus_iob">IOB da bolo: %1$.2fU</string>
<string name="wizard_explain_superbolus">Superbolo: %1$.2fU</string>
<string name="wizard_explain_percent">Percentuale: %1$.2fU x %2$d%% ≈ %3$.2fU</string>
<string name="overview_editquickwizard_percentage">Percentuale</string>
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">מסנכרן את נתוניכם עם Nightscout</string>
<string name="description_ama">הישאר עם האלגוריתם של 2017</string>
<string name="description_smb">האלגוריתם העדכני ביותר, עבור משתמשים מתקדמים בלבד</string>
<string name="description_smb_dynamic_isf">האלגוריתם העדכני ביותר, נועד למשתמשים מתקדמים עם רגישות (ISF) דינאמית\\אוטומטית</string>
<string name="description_overview">מציג את המצב הנוכחי של הלולאה ולחצני פעולות שימושיות</string>
<string name="description_persistent_notification">מציג הודעה קבועה עם סקירה קצרה של מה שהלולאה שלכם עושה</string>
<string name="description_profile_local">הגדירו פרופיל שזמין באופן לא מקוון.</string>
@ -161,7 +162,6 @@
<string name="end_user_license_agreement">הסכם רישיון למשתמש</string>
<string name="end_user_license_agreement_text">לא מיועד לשימוש למטרת קבלת החלטות רפואיות. בעלי הזכויות מספקים את התוכנית כפי שהיא - \"AS IS\", ללא אחריות מכל סוג שהוא. כל סיכון הנובע מאיכות ו\\או ביצועי התוכנה הוא באחריותך בלבד. במידה ותימצא תקלה בתוכנית, אתם תשאו בכל עלויות שיגרמו לך בשל התקלה.</string>
<string name="end_user_license_agreement_i_understand">אני מבין\\ה ומסכים\\ה</string>
<string name="save">שמור</string>
<string name="reloadprofile">טעינה מחדש של הפרופיל</string>
<string name="smscommunicator">תקשורת SMS</string>
<string name="smscommunicator_allowednumbers">מספרי טלפון מורשים</string>
@ -246,7 +246,6 @@
<string name="wear">Wear</string>
<string name="resend_all_data">שלח מחדש את כל הנתונים</string>
<string name="open_settings_on_wear">פתיחת הגדרות Wear</string>
<string name="basal_rate">מינונים בזאליים:</string>
<string name="basalvaluebelowminimum">ערך הבסיס מתחת למינימום. פרופיל אינו מוגדר!</string>
<string name="sms_actualbg">ערכי סוכר בדם:</string>
<string name="sms_lastbg">ערכי סוכר אחרונים:</string>
@ -260,13 +259,14 @@
<string name="array_of_elements">מערך של %1$d אלמנטים. \n ערך נוכחי:</string>
<string name="openapsma_autosensdata_label">נתוני חישוב רגישות אוטו\'</string>
<string name="openapsma_scriptdebugdata_label">תיקון באגים בסקריפט</string>
<string name="openapsama_useautosens">אפשר חישוב רגישות אוטומטית (Autosens)</string>
<string name="openapsama_useautosens">אפשר חישוב רגישות אוטומטי (Autosens)</string>
<string name="refresheventsfromnightscout">רענון אירועים מנייטסקאוט</string>
<string name="deletefuturetreatments">מחיקת טיפולים עתידיים</string>
<string name="actions_shortname">ACT</string>
<string name="configbuilder_shortname">CONF</string>
<string name="loop_shortname">לולאה</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DynISF</string>
<string name="localprofile_shortname">LP</string>
<string name="overview_shortname">בית</string>
<string name="virtualpump_shortname">VPUMP</string>
@ -280,8 +280,8 @@
<string name="profile">פרופיל</string>
<string name="openapsama_max_daily_safety_multiplier_summary">ערך ברירת מחדל: 3 מנגנון הגנה עיקרי של OpenAPS. מגביל את המינון הבזאלי לעד פי 3 מהמינון הבזאלי הגבוה ביותר שהוגדר. ברוב המקרים אין צורך לשנות ערך זה, אך יש לזכור שזו המשמעות של “3x max daily; 4x current” בדיון על מנגנוני הגנה.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">ערך ברירת מחדל: 4 זהו החצי השני של מנגנון הגנה עיקרי של OpenAPS, והחצי השני של \"3x max daily; 4x current\" במנגנוני ההגנה. המשמעות היא שהמינון הבזאלי, ללא קשר למקסימום שנקבע במשאבה, אינו יכול להיות גבוה יותר ממספר זה כפול הקצב הבזאלי הנוכחי. מיועד למנוע כניסה לתחומים מסוכנים ע\"י קביעת קצב בזאלי גבוה לפני הבנה של פעולת האלגוריתם. שוב: ברירת המחדל היא x4, רוב המשתמשים לעולם אינם צריכים לשנות ערך זה ואם הם מרגישים שמנגנון הגנה זה מפריע להם, הפתרון הוא בשינוי של הגדרות אחרות.</string>
<string name="openapsama_autosens_max_summary">ערך ברירת מחדל: 1.2\nזוהי מגבלת המכפיל של autosens (ובקרוב autotune) שמגדירה 20%% כיחס מקסימלי של autosens, אשר קובע בתורו את גובה הבזאלי המקסימלי, גובהו המינימלי של יחס התיקון, ואת המינימום של ערכי המטרה האפשריים.</string>
<string name="openapsama_autosens_min_summary">ערך ברירת מחדל: 0.7\nבצד השני של מגבלות הבטיחות של autosens, ערך זה מגביל את יכולתו של autosens להוריד את הערכים הבזאליים ועד כמה יכול להעלות את יחס התיקון ואת ערכי מטרת הסוכר בדם.</string>
<string name="openapsama_autosens_max_summary">ערך ברירת מחדל: 1.2\nזוהי מגבלת המכפיל של Autosens (ובקרוב Autotune) שמגדירה 20% כיחס מקסימלי של autosens, אשר קובע בתורו את גובה הבזאלי המקסימלי, גובהו המינימלי של יחס התיקון, ואת המינימום של ערכי המטרה האפשריים.</string>
<string name="openapsama_autosens_min_summary">ערך ברירת מחדל: 0.7\nבצד השני של מגבלות הבטיחות של Autosens, ערך זה מגביל את יכולתו של autosens להוריד את הערכים הבזאליים ועד כמה יכול להעלות את יחס התיקון ואת ערכי מטרת הסוכר בדם.</string>
<string name="openapsama_autosens_adjusttargets">וויסות ערכי מטרה ע\"י Autosens</string>
<string name="openapsama_autosens_adjusttargets_summary">ערך ברירת מחדל: התאמה מדויקת\n נועד לאפשר ל-Autosens לשנות את המטרה של ערכי הסוכר, בנוסף ליחס התיקון והבזאלים.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">ערך ברירת מחדל: 2\n מעכב בולוס מופעל אחרי שאתם מזריקים בולוס ארוחה, כך שהלולאה לא תפצה ע\"י בזאלי זמני נמוך אחרי הארוחה. הדוגמה כאן וברירת המחדל היא 2; כך שהגדרה של משך פעילות אינסולין של 3 שעות משמעה שהעיכוב יחלוף בהדרגה בתוך 1.5 שעות (3 ש\' לחלק ל-2).</string>
@ -427,8 +427,6 @@
<string name="keep_screen_on_summary">מניעת כיבוי המסך. הדבר צורך הרבה כח סוללה.</string>
<string name="sensitivity_warning">בהפעלת פונקציית ה-Autosens יש לזכור שחייבים להזין למערכת את כל הפחמימות שנאכלו. אחרת פחמימות לא יזוהו נכון כשינוי ברגישות!</string>
<string name="sensitivityweightedaverage">רגישות משוקללת ממוצעת</string>
<string name="mdtp_ok">אישור</string>
<string name="mdtp_cancel">ביטול</string>
<string name="notloadedplugins">לא כל הפרופילים נטענו!</string>
<string name="valuesnotstored">הערכים לא נשמרו</string>
<string name="ns_localbroadcasts">אפשר הפצה לאפליקציות אחרות (כגון xDrip). אין להפעיל אם מותקן לכם יותר ממופע אחד של AAPS או NSClient!</string>
@ -757,8 +755,6 @@
<string name="profilenamecontainsdot">שם הפרופיל מכיל נקודות.\nשם כזה אינו נתמך ע\"י Nightscout \n הפרופיל לא הועלה ל-Nightscout.</string>
<string name="low_mark_comment">ערך נמוך יותר באזור הטווח (הצגה בלבד)</string>
<string name="high_mark_comment">ערך גבוה יותר באזור הטווח (הצגה בלבד)</string>
<string name="age">גיל:</string>
<string name="weight_label">משקל:</string>
<string name="id">מס\' זיהוי:</string>
<string name="submit">עדכן</string>
<string name="mostcommonprofile">הפרופיל הנפוץ ביותר:</string>
@ -900,9 +896,36 @@
<string name="errors">שגיאות</string>
<string name="ns_sync_slow">האט העלאות</string>
<string name="data_status">מצב נתוני הסוכר</string>
<string name="statuslights_cannula_age">גיל הצינורית</string>
<string name="statuslights_patch_pump_age">גיל משאבה</string>
<string name="patch_pump">משאבה ללא צינורית</string>
<string name="recalculated_data_used">משתמש בנתונים מחושבים מחדש</string>
<string name="bg_too_close">רמת הסוכר קרובה מדי:\n%1$s\n%2$s</string>
<string name="identification">אמצעי זיהוי (מייל, פייסבוק או דיסקורד וכו\')</string>
<string name="identification_not_set">אמצעי הזיהוי אינו מוגדר במצב מפתחים</string>
<string name="a11y_dialog">תיבת דו-שיח</string>
<string name="a11y_current_bg">רמת סוכר נוכחית</string>
<string name="a11_correction_percentage">תיקון עם %</string>
<string name="a11_correction_units">תיקון עם יחידות</string>
<string name="not_available_full">לא זמין</string>
<string name="a11y_high">גבוה</string>
<string name="a11y_inrange">בטווח</string>
<string name="a11y_low">נמוך</string>
<string name="a11y_arrow_double_down">ירידה מהירה</string>
<string name="a11y_arrow_single_down">ירידה</string>
<string name="a11y_arrow_forty_five_down">ירידה איטית</string>
<string name="a11y_arrow_flat">יציב</string>
<string name="a11y_arrow_forty_five_up">עלייה איטית</string>
<string name="a11y_arrow_single_up">עלייה</string>
<string name="a11y_arrow_double_up">עלייה מהירה</string>
<string name="a11y_arrow_none">אין</string>
<string name="a11y_arrow_unknown">לא ידוע</string>
<string name="a11y_graph">גרף</string>
<string name="a11y_bg_quality">איכות נתוני סוכר</string>
<string name="a11y_bg_quality_recalculated">חושב מחדש</string>
<string name="a11y_bg_quality_doubles">רישומים כפולים</string>
<string name="a11y_insulin_label">אינסולין</string>
<string name="a11y_blood_glucose">ערכי סוכר בדם</string>
<string name="a11y_bg_outdated">לא עדכני</string>
<!-- WEAR OS-->
</resources>

View file

@ -157,7 +157,6 @@
<string name="end_user_license_agreement">최종 사용자 라이선스 동의서</string>
<string name="end_user_license_agreement_text">이 프로그램을 의학적 결정을 내리는 데 사용해서는 안되며, 여기에 대한 어떠한 보증도 없습니다. 이 프로그램의 품질과 성능에 관한 모든 위험은 사용자에게 있습니다.\nMUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</string>
<string name="end_user_license_agreement_i_understand">모두 이해하였고 동의합니다.</string>
<string name="save">저장</string>
<string name="reloadprofile">프로파일 새로고침</string>
<string name="smscommunicator">SMS 통신기</string>
<string name="smscommunicator_allowednumbers">허가된 전화번호</string>
@ -242,7 +241,6 @@
<string name="wear">워치</string>
<string name="resend_all_data">모든 데이터 다시 보내기</string>
<string name="open_settings_on_wear">워치에서 설정 열기</string>
<string name="basal_rate">Basal양:</string>
<string name="basalvaluebelowminimum">Basal값이 최소값 이하입니다. 프로파일이 설정되지 않습니다!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Last BG:</string>
@ -421,8 +419,6 @@
<string name="keep_screen_on_summary">안드로이드의 화면이 꺼지는 것을 방지합니다. 전원이 공급되어 있지 않으면 전력소모가 큽니다.</string>
<string name="sensitivity_warning">Autosense 기능을 켜면 모든 섭취된 탄수화물양을 입력하십시오. 그렇지 않으면 탄수화물 편차(deviations)가 민감도 변화로 잘못 인식될것입니다!!</string>
<string name="sensitivityweightedaverage">민감도 가중평균</string>
<string name="mdtp_ok"></string>
<string name="mdtp_cancel">취소</string>
<string name="notloadedplugins">모든 프로파일이 로드되지 않았습니다.</string>
<string name="valuesnotstored">값이 저장되지 않았습니다!</string>
<string name="ns_localbroadcasts">다른 앱 (예: xDrip)으로 데이터 전송을 활성화합니다. AAPS 또는 NSClient를 두 개 이상 설치 한 경우 활성화하지 마세요!</string>
@ -738,8 +734,6 @@
<string name="profilenamecontainsdot">프로파일명에 점을 포함하고 있습니다.\n이는 NS에서 지원하지 않습니다.\n프로파일이 NS에 업로드되지 않습니다.</string>
<string name="low_mark_comment">혈당 정상범위의 하한값(표시 전용)</string>
<string name="high_mark_comment">혈당 정상범위의 상한값(표시 전용)</string>
<string name="age">나이:</string>
<string name="weight_label">몸무게:</string>
<string name="id">ID:</string>
<string name="submit">확인</string>
<string name="mostcommonprofile">가장 많이 사용된 프로파일:</string>
@ -860,4 +854,5 @@
<string name="sms_timeout_while_wating">직전의 펌프 통신 종료를 기다리는 동안 타임 아웃</string>
<string name="smscommunicator_another_bolus_in_queue">대기열에 또다른 bolus가 있습니다. 이후에 다시 시도하세요.</string>
<string name="calculation_in_progress">계산 진행 중</string>
<!-- WEAR OS-->
</resources>

View file

@ -161,7 +161,6 @@
<string name="end_user_license_agreement">Licencinė sutartis su vartotoju</string>
<string name="end_user_license_agreement_text">PROGRAMA NEGALI BŪTI NAUDOJAMA GYDYMO SPRENDIMAMS PRIIMTI. PAGAL GALIOJANČIUS ĮSTATYMUS PROGRAMA NESUTEIKIA JOKIŲ GARANTIJŲ VARTOTOJUI. JEI RAŠTU NENURODYTA KITAIP, PROGRAMOS AUTORINIŲ TEISIŲ TURĖTOJAS IR/AR KITOS ŠALYS PATEIKIA PROGRAMĄ \"KAIP YRA\" BE JOKIŲ GARANTIJŲ, TIEK AKIVAIZDŽIŲ, TIEK NUMANOMŲ, ĮSKAITANT, BET NEAPSIRIBOJANT GALIMYBĘ NAUDOTI PROGRAMĄ KOMERCINIAMS AR KITOKIEMS DALINIAMS TIKSLAMS. RIZIKĄ, KYLANČIĄ NAUDOJANT PROGRAMĄ PRISIIMA PATS VARTOTOJAS. JEI PROGRAMA VEIKIA NETINKAMAI, IŠLAIDOS, SUSIJUSIOS SU PROGRAMOS SERVISU, TAISYMU AR KOREGAVIMU, TENKA VARTOTOJUI.</string>
<string name="end_user_license_agreement_i_understand">SUPRATAU IR SUTINKU</string>
<string name="save">Išsaugoti</string>
<string name="reloadprofile">Atnaujinti profilį</string>
<string name="smscommunicator">SMS komunikatorius</string>
<string name="smscommunicator_allowednumbers">Leidžiami telefono numeriai</string>
@ -246,7 +245,6 @@
<string name="wear">Išmanieji laikrodžiai</string>
<string name="resend_all_data">Pakartotinai siųsti visus duomenis</string>
<string name="open_settings_on_wear">Atidaryti išmaniojo laikrodžio nustatymus</string>
<string name="basal_rate">Valandinė bazė:</string>
<string name="basalvaluebelowminimum">Valandinės bazės vertė mažesnė už minimalią. Profilis nenustatytas!</string>
<string name="sms_actualbg">KG:</string>
<string name="sms_lastbg">Paskutinė KG:</string>
@ -427,8 +425,6 @@
<string name="keep_screen_on_summary">Neleidžia Android sistemai išjungti ekrano. Naudojama daug energijos, jei telefonas neprijungtas prie maitinimo šaltinio.</string>
<string name="sensitivity_warning">Įjungę Autosens funkciją nepamirškite įvedinėti visus valgomus angliavandenius. To nedarant, angliavandenių sukeliami gliukozės svyravimai bus klaidingai identifikuojami kaip jautrumo pasikeitimai!</string>
<string name="sensitivityweightedaverage">Jautrumas pagal svertinį vidurkį</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Atšaukti</string>
<string name="notloadedplugins">Ne visi profiliai įkelti!</string>
<string name="valuesnotstored">Reikšmės neišsaugotos!</string>
<string name="ns_localbroadcasts">Įgalinti perdavimą į kitas programas (pvz., xDrip+). Neįgalinkite, jei įdiegta daugiau nei vienas AAPS arba NSClient egzempliorius!</string>
@ -757,8 +753,6 @@
<string name="profilenamecontainsdot">Profilio pavadinime yra taškų.\nŠios funkcijos NS nepalaiko.\nProfilis neįkeltas į NS.</string>
<string name="low_mark_comment">Mažiausia tikslinės srities vertė (tik rodymui)</string>
<string name="high_mark_comment">Didžiausia tikslinės srities vertė (tik rodymui)</string>
<string name="age">Amžius:</string>
<string name="weight_label">Svoris:</string>
<string name="id">ID:</string>
<string name="submit">Pateikti</string>
<string name="mostcommonprofile">Dažniausiai naudojamas profilis:</string>
@ -904,4 +898,5 @@
<string name="identification">Identifikacija (el. paštas, FB, Discord slapyvardis ar kt.)</string>
<string name="identification_not_set">Kūrėjo režime tapatybė nenustatyta</string>
<string name="not_available_full">Negalimas</string>
<!-- WEAR OS-->
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">Synchroniseert je data met Nightscout</string>
<string name="description_ama">Het algoritme uit 2017</string>
<string name="description_smb">Meest recente algoritme voor gevorderde gebruikers</string>
<string name="description_smb_dynamic_isf">Meest recente algoritme voor gevorderde gebruikers met dynamische/automatische ISF</string>
<string name="description_overview">Toont de huidige Loop-status en knoppen voor meest gebruikte acties</string>
<string name="description_persistent_notification">Toont een permanente melding met een beknopt overzicht van hetgeen de Loop momenteel doet</string>
<string name="description_profile_local">Gebruik profiel(en) die je in AAPS aanmaakt en offline kunt gebruiken.</string>
@ -161,7 +162,6 @@
<string name="end_user_license_agreement">Eind gebruiker overeenkomst</string>
<string name="end_user_license_agreement_text">MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</string>
<string name="end_user_license_agreement_i_understand">Begrepen en goedgekeurd</string>
<string name="save">Opslaan</string>
<string name="reloadprofile">Herlaad profiel</string>
<string name="smscommunicator">SMS Commando\'s</string>
<string name="smscommunicator_allowednumbers">Geautoriseerde telefoon nummers</string>
@ -246,7 +246,7 @@
<string name="wear">Wear</string>
<string name="resend_all_data">Update Wear gegevens</string>
<string name="open_settings_on_wear">Open instellingen op Wear</string>
<string name="basal_rate">Basaal:</string>
<string name="basal_rate">Basaalstand</string>
<string name="basalvaluebelowminimum">Basaalwaarde onder minimum. Profiel niet ingesteld!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Laatste BG:</string>
@ -427,8 +427,6 @@
<string name="keep_screen_on_summary">Voorkomen dat Android het scherm uitschakelt. Dit kost veel accuvoeding als je de telefoon niet aan de oplader hebt.</string>
<string name="sensitivity_warning">Bij het gebruik van Autosense, vergeet niet alle opgenomen koolhydraten in te geven. Anders zullen BG wijzigingen door maaltijden foutief geïnterpreteerd worden !!</string>
<string name="sensitivityweightedaverage">Gemiddelde gevoeligheid</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Afbreken</string>
<string name="notloadedplugins">Niet alle profielen zijn geladen!</string>
<string name="valuesnotstored">Waarden niet opgeslagen!</string>
<string name="ns_localbroadcasts">Schakel lokaal data delen met andere apps (zoals xDrip) in. Schakel dit niet in als er meer dan één installatie van AAPS of NSClient zijn geinstalleerd!</string>
@ -502,6 +500,7 @@
<string name="negativeonly">Enkel negatief</string>
<string name="overview_editquickwizard_usecob">COB berekening</string>
<string name="overview_editquickwizard_usetemptarget">Tijdelijk doel berekenen</string>
<string name="overview_editquickwizard_usepercentage">Percentage berekening</string>
<string name="loopenabled">Loop Actief</string>
<string name="apsselected">APS geslecteerd</string>
<string name="nsclienthaswritepermission">NSClient heeft schrijf rechten</string>
@ -757,8 +756,8 @@
<string name="profilenamecontainsdot">Profielnaam bevat punten.\nDit wordt niet ondersteund door NS.\nProfiel is niet geüpload naar NS.</string>
<string name="low_mark_comment">Laagste waarde in bereik (alleen weergave)</string>
<string name="high_mark_comment">Hoogste waarde in bereik (alleen weergave)</string>
<string name="age">Leeftijd:</string>
<string name="weight_label">Gewicht:</string>
<string name="age">Leeftijd</string>
<string name="weight_label">Gewicht</string>
<string name="id">ID:</string>
<string name="submit">Verzenden</string>
<string name="mostcommonprofile">Meest voorkomende profiel:</string>
@ -900,9 +899,74 @@
<string name="errors">Foutmeldingen</string>
<string name="ns_sync_slow">Vertraag uploads</string>
<string name="data_status">BG data status</string>
<string name="statuslights_cannula_age">canule leeftijd</string>
<string name="statuslights_patch_pump_age">patchpomp leeftijd</string>
<string name="patch_pump">Patchpomp</string>
<string name="recalculated_data_used">Herberekende data gebruikt</string>
<string name="bg_too_close">BG data interval to kort:\n%1$s\n%2$s</string>
<string name="identification">Identificatie (e-mail, FB, Discord e. d.)</string>
<string name="identification_not_set">Identificatie niet ingesteld in dev modus</string>
<string name="a11y_dialog">dialoogvenster</string>
<string name="a11y_current_bg">huidige bloedglucose</string>
<string name="a11_correction_percentage">corrigeer uitkomt met percentage</string>
<string name="a11_correction_units">corrigeer uitkomt met units</string>
<string name="not_available_full">Niet beschikbaar</string>
<string name="a11y_high">hoog</string>
<string name="a11y_inrange">binnen bereik</string>
<string name="a11y_low">laag</string>
<string name="a11y_arrow_double_down">snel dalend</string>
<string name="a11y_arrow_single_down">dalend</string>
<string name="a11y_arrow_forty_five_down">langzaam dalend</string>
<string name="a11y_arrow_flat">stabiel</string>
<string name="a11y_arrow_forty_five_up">langzaam stijgend</string>
<string name="a11y_arrow_single_up">stijgt</string>
<string name="a11y_arrow_double_up">snel stijgend</string>
<string name="a11y_arrow_none">geen</string>
<string name="a11y_arrow_unknown">onbekend</string>
<string name="a11y_graph">grafiek</string>
<string name="a11y_bg_quality">bloedglucose kwaliteit</string>
<string name="a11y_bg_quality_recalculated">opnieuw berekend</string>
<string name="a11y_bg_quality_doubles">dubbele items</string>
<string name="a11y_insulin_label">insuline</string>
<string name="a11y_blood_glucose">bloed glucose</string>
<string name="a11y_bg_outdated">verouderd</string>
<string name="a11y_carb_reminder">herinnering instellen</string>
<string name="a11y_add_new_profile">nieuw profiel toevoegen</string>
<string name="a11y_clone_profile">huidig profiel dupliceren</string>
<string name="a11y_delete_current_profile">huidig profiel verwijderen</string>
<string name="a11y_add_new_to_list">nieuwe toevoegen aan lijst</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Tijdelijke doel onbekende preset: %1$s</string>
<string name="wear_action_tempt_cancel_message">Huidige tijdelijk streefdoel annuleren?</string>
<string name="wear_action_tempt_unit_error">Verschillende eenheden gebruikt op horloge en telefoon!</string>
<string name="wear_action_tempt_zero_message">Tijdelijk streefdoel 0 minuten, huidige tijdelijk streefdoel annuleren?</string>
<string name="wear_action_tempt_min_bg_error">Min BG buiten bereik!</string>
<string name="wear_action_tempt_max_bg_error">Max BG buiten bereik!</string>
<string name="wear_action_tempt_manual_range_message">Tijdelijk streefdoel:\nMin: %1$s\nMax: %2$s\nDuur: %3$s</string>
<string name="wear_action_tempt_manual_message">Tijdelijk streefdoel:\nDoel: %1$s\nDuur: %2$s</string>
<string name="wear_action_tempt_preset_message">Tijdelijk streefdoel:\Reden: %1$s\nDoel: %2$s\nDuur: %3$s</string>
<string name="quick_wizard_message">QuickWizard: %1$s\nInsuline: %2$.2fE\nKoolhy.: %3$dg</string>
<string name="wizard_result">Reken. Wizard:\nInsuline: %1$.2fE\nKoolhy.: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Toon invoer op apparaat:</string>
<string name="quick_wizard_not_available">Geselecteerde QuickWizard is niet meer beschikbaar, vernieuw uw tegel</string>
<string name="wizard_no_actual_bg">Geen recente BG om de berekening op te baseren!</string>
<string name="wizard_no_active_profile">Geen actief profiel ingesteld!</string>
<string name="wizard_no_cob">Onbekende COB! BG uitlezing ontbreekt of de recente app herstart?</string>
<string name="wizard_carbs_constraint">Koolhydraten beperking overschreden!</string>
<string name="wizard_explain_calc">Bereken (IC: %2$.1f, ISF: %2$.1f) van:\"</string>
<string name="wizard_explain_carbs">Koolhydraten: %1$.2fE</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fE</string>
<string name="wizard_explain_bg">BG: %1$.2fE</string>
<string name="wizard_explain_basal_iob">Basaal IOB: %1$.2fE</string>
<string name="wizard_explain_bolus_iob">Bolus IOB: %1$.2fE</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fE</string>
<string name="wizard_explain_trend">15\' trend: %1$.2fE</string>
<string name="wizard_explain_percent">Percentage: %1$.2fE x %2$d%% ≈ %3$.2fE</string>
<string name="wizard_constraint_bolus_size">Insuline beperking!\nKan %1$.2fE niet leveren</string>
<string name="wizard_explain_tt">Tijdelijk Doel: %1$s</string>
<string name="wizard_explain_tt_to">%1$s tot %2$s</string>
<string name="wizard_pump_not_available">Geen pomp beschikbaar!</string>
<string name="wear_unknown_action_string">Onbekend actie commando:</string>
<string name="overview_editquickwizard_percentage">Percentage</string>
<string name="app_default">Applicatie standaardwaarden</string>
</resources>

View file

@ -25,6 +25,7 @@
<string name="description_ns_client">Synkroniserer dine data med Nightscout</string>
<string name="description_ama">Slik algoritmen var definert i 2017</string>
<string name="description_smb">Siste utgave av algoritmen for avanserte brukere</string>
<string name="description_smb_dynamic_isf">Nyeste algoritme for avanserte brukere med dynamisk/automatisk ISF</string>
<string name="description_overview">Viser loopens nåværende tilstand og knapper for de vanligste funksjonene</string>
<string name="description_persistent_notification">Viser en konstant melding med en kort oppsummering av hva loop gjør</string>
<string name="description_profile_local">Definer en profil som er tilgjengelig offline.</string>
@ -161,7 +162,6 @@
<string name="end_user_license_agreement">Sluttbrukeravtale</string>
<string name="end_user_license_agreement_text">MÅ IKKE BENYTTES TIL Å TA MEDISINSKE BESLUTNINGER. DET FINNES INGEN GARANTI FOR PROGRAMMET I DEN UTSTREKNING SOM TILLATES AV GJELDENDE LOV. SÅFREMT IKKE ANNET ER ANGITT SKRIFTLIG LEVERES PROGRAMMET HELT UTEN GARANTIER I NOEN SOM HELST FORM, VERKEN UTTRYKT ELLER INNEFORSTÅTT, INKLUSIV MEN IKKE BEGRENSET TIL SALGBARHET ELLER EGNETHET TIL VISSE FORMÅL. ALL RISIKO KNYTTET TIL KVALITET AV PROGRAMMETS FUNKSJONALITET ER HOS DEG SOM BRUKER. OM PROGRAMMET VISER SEG Å VÆRE DEFEKT, ER DET BRUKEREN SOM MÅ TA ALT ANSVAR FOR KOSTNADER KNYTTET TIL ALL SERVICE, REPERASJON ELLER RETTELSE.</string>
<string name="end_user_license_agreement_i_understand">JEG FORSTÅR OG GODTAR</string>
<string name="save">Lagre</string>
<string name="reloadprofile">Les inn profil på nytt</string>
<string name="smscommunicator">SMS tjeneste</string>
<string name="smscommunicator_allowednumbers">Godkjente mobilnumre</string>
@ -246,7 +246,7 @@
<string name="wear">Klokke</string>
<string name="resend_all_data">Send alle data på nytt</string>
<string name="open_settings_on_wear">Åpne Innstillinger på klokken</string>
<string name="basal_rate">Basal rate:</string>
<string name="basal_rate">Basal rate</string>
<string name="basalvaluebelowminimum">Basal verdi under minimum. Profilen settes ikke!</string>
<string name="sms_actualbg">BS:</string>
<string name="sms_lastbg">Siste BS:</string>
@ -267,6 +267,7 @@
<string name="configbuilder_shortname">KONF</string>
<string name="loop_shortname">LOOP</string>
<string name="oaps_shortname">OAPS</string>
<string name="dynisf_shortname">DYNISF</string>
<string name="localprofile_shortname">LP</string>
<string name="overview_shortname">HJEM</string>
<string name="virtualpump_shortname">VPUMP</string>
@ -427,8 +428,6 @@
<string name="keep_screen_on_summary">Forhindre Android å slå av skjermen. Mobil vil bruke mye batteri hvis den ikke plugges til strømledning.</string>
<string name="sensitivity_warning">Hvis du slår på Autosense funksjonen må du huske å angi alle spiste karbohydrater. Ellers vil KH avvik gi feil i sensitivitetsberegningen !!</string>
<string name="sensitivityweightedaverage">Sensitivitet vektet middelverdi</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Avbryt</string>
<string name="notloadedplugins">Ikke alle profiler ble lastet!</string>
<string name="valuesnotstored">Verdier ikke lagret!</string>
<string name="ns_localbroadcasts">Aktiver kringkasting til andre apper (som xDrip+). Ikke aktiver dette hvis du har mer enn en AAPS eller NSClient installert!</string>
@ -502,6 +501,7 @@
<string name="negativeonly">Bare negative</string>
<string name="overview_editquickwizard_usecob">COB beregning</string>
<string name="overview_editquickwizard_usetemptarget">Temp target beregning</string>
<string name="overview_editquickwizard_usepercentage">Prosent beregning</string>
<string name="loopenabled">Loop er aktivert</string>
<string name="apsselected">APS valgt</string>
<string name="nsclienthaswritepermission">NSClient har skrive rettigheter</string>
@ -757,8 +757,8 @@
<string name="profilenamecontainsdot">Profilnavnet inneholder prikker.\nDette støttes ikke av NS.\nProfilen er ikke lastet opp til NS.</string>
<string name="low_mark_comment">Nedre verdi for målområdet (kun visning)</string>
<string name="high_mark_comment">Øvre verdi for målområdet (kun visning)</string>
<string name="age">Alder:</string>
<string name="weight_label">Vekt:</string>
<string name="age">Alder</string>
<string name="weight_label">Vekt</string>
<string name="id">ID:</string>
<string name="submit">Lagre</string>
<string name="mostcommonprofile">Mest vanlig profil:</string>
@ -900,9 +900,74 @@
<string name="errors">Feil</string>
<string name="ns_sync_slow">Reduser opplastingshastighet</string>
<string name="data_status">BS data status</string>
<string name="statuslights_cannula_age">kanyle alder</string>
<string name="statuslights_patch_pump_age">patch pumpe alder</string>
<string name="patch_pump">Patch pumpe</string>
<string name="recalculated_data_used">Rekalkulerte siste data</string>
<string name="bg_too_close">BS for nær:\n%1$s\n%2$s</string>
<string name="identification">Identifikasjon (e-post, Facebook eller Discord nick osv.)</string>
<string name="identification_not_set">Identifikasjon ikke satt i utviklermodus</string>
<string name="a11y_dialog">dialogvindu</string>
<string name="a11y_current_bg">nåværende blodsukker</string>
<string name="a11_correction_percentage">korriger resultatet med %</string>
<string name="a11_correction_units">korriger resultatet med enheter</string>
<string name="not_available_full">Ikke tilgjengelig</string>
<string name="a11y_high">høy</string>
<string name="a11y_inrange">i målområdet</string>
<string name="a11y_low">lav</string>
<string name="a11y_arrow_double_down">synker raskt</string>
<string name="a11y_arrow_single_down">synker</string>
<string name="a11y_arrow_forty_five_down">synker sakte</string>
<string name="a11y_arrow_flat">stabil</string>
<string name="a11y_arrow_forty_five_up">stiger sakte</string>
<string name="a11y_arrow_single_up">stiger</string>
<string name="a11y_arrow_double_up">stiger raskt</string>
<string name="a11y_arrow_none">ingen</string>
<string name="a11y_arrow_unknown">ukjent</string>
<string name="a11y_graph">graf</string>
<string name="a11y_bg_quality">blodsukkermålingens kvalitet</string>
<string name="a11y_bg_quality_recalculated">beregnet på nytt</string>
<string name="a11y_bg_quality_doubles">doble registreringer</string>
<string name="a11y_insulin_label">insulin</string>
<string name="a11y_blood_glucose">blodsukker</string>
<string name="a11y_bg_outdated">utdatert</string>
<string name="a11y_carb_reminder">angi påminnelse</string>
<string name="a11y_add_new_profile">legg til ny profil</string>
<string name="a11y_clone_profile">kopier gjeldende profil</string>
<string name="a11y_delete_current_profile">slett gjeldende profil</string>
<string name="a11y_add_new_to_list">legg til ny i liste</string>
<!-- WEAR OS-->
<string name="wear_action_tempt_preset_error">Temptarget ukjent forhåndsinnstilling: %1$s</string>
<string name="wear_action_tempt_cancel_message">Avbryt gjeldende Temp Target?</string>
<string name="wear_action_tempt_unit_error">Forskjellige enheter brukt på klokke og telefon!</string>
<string name="wear_action_tempt_zero_message">Zero-TempTarget - avbryter gjeldende TempTarget?</string>
<string name="wear_action_tempt_min_bg_error">Min-BS utenfor område!</string>
<string name="wear_action_tempt_max_bg_error">Maks-BS utenfor område!</string>
<string name="wear_action_tempt_manual_range_message">Temp target:\nMin: %1$s\nMaks: %2$s\nVarighet: %3$s</string>
<string name="wear_action_tempt_manual_message">TempTarget:\nMål: %1$s\nVarighet: %2$s</string>
<string name="wear_action_tempt_preset_message">TempTarget:\nMin: %1$s\nMål: %2$s\nVarighet: %3$s</string>
<string name="quick_wizard_message">QuickWizard: %1$s\ninsulin: %2$.2fE\nKarbo: %3$dg</string>
<string name="wizard_result">Kalk. Wizard:\nInsulin: %1$.2fE\nKarbo: %2$dg</string>
<string name="overview_editquickwizard_show_on_device">Vis oppføring på enhet:</string>
<string name="quick_wizard_not_available">Den valgte hurtigveiviseren er ikke tilgjengelig lenger, oppdater klokkewidget</string>
<string name="wizard_no_actual_bg">Mangler nylige BS verdier til å bruke i beregninger!</string>
<string name="wizard_no_active_profile">Det er ikke angitt noen aktiv profil!</string>
<string name="wizard_no_cob">Ukjent COB! BS verdier mangler eller nylig oppstart av appen?</string>
<string name="wizard_carbs_constraint">Brudd på karbo begrensning!</string>
<string name="wizard_explain_calc">Kalk (IC: %2$.1f, ISF: %2$.1f) fra:\"</string>
<string name="wizard_explain_carbs">Karbo: %1$.2fE</string>
<string name="wizard_explain_cob">COB: %1$.0fg %2$.2fE</string>
<string name="wizard_explain_bg">BS: %1$.2fE</string>
<string name="wizard_explain_basal_iob">Basal IOB: %1$.2fE</string>
<string name="wizard_explain_bolus_iob">Bolus IOB: %1$.2fE</string>
<string name="wizard_explain_superbolus">Superbolus: %1$.2fE</string>
<string name="wizard_explain_trend">15\' trend: %1$.2fE</string>
<string name="wizard_explain_percent">Prosent: %1$.2fE x %2$d%% ° %3$.2fE</string>
<string name="wizard_constraint_bolus_size">Insulinbegrensning nådd!\nKan ikke levere %1$.2fE</string>
<string name="wizard_explain_tt">TempT: %1$s</string>
<string name="wizard_explain_tt_to">%1$s til %2$s</string>
<string name="wizard_pump_not_available">Ingen pumpe tilgjengelig!</string>
<string name="wear_unknown_action_string">Ukjent kommando:</string>
<string name="overview_editquickwizard_percentage">Prosent</string>
<string name="app_default">Standardverdi</string>
</resources>

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