Conflicts:
	build.gradle
This commit is contained in:
TebbeUbben 2021-08-20 19:42:59 +02:00
commit dbf1772397
99 changed files with 936 additions and 311 deletions

View file

@ -68,6 +68,6 @@ workflows:
# Inside the workflow, you provide the jobs you want to run, e.g this workflow runs the build-and-test job above.
# CircleCI will run this workflow on every commit.
# For more details on extending your workflow, see the configuration docs: https://circleci.com/docs/2.0/configuration-reference/#workflows
sample:
dotests:
jobs:
- build-and-test

2
.gitignore vendored
View file

@ -11,8 +11,6 @@ build/
.idea/*
!.idea/codeStyles/
full/
debug/
release/
app/com.crashlytics.settings.json
app/session_analytics.tap
.project

View file

@ -1,6 +1,7 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-allopen'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.hiya.jacoco-android'
apply plugin: 'com.google.firebase.crashlytics'
@ -13,6 +14,11 @@ repositories {
google()
}
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation 'info.nightscout.androidaps.annotations.OpenForTesting'
}
def generateGitBuild = { ->
StringBuilder stringBuilder = new StringBuilder()
try {

View file

@ -93,11 +93,11 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
overviewData = OverviewData(injector, aapsLogger, resourceHelper, dateUtil, sp, activePlugin, defaultValueHelper, profileFunction, config, loopPlugin, nsDeviceStatus, repository, overviewMenus, iobCobCalculator, translator)
binding.left.setOnClickListener {
setTime(overviewData.fromTime - T.hours(rangeToDisplay.toLong()).msecs())
adjustTimeRange(overviewData.fromTime - T.hours(rangeToDisplay.toLong()).msecs())
loadAll("onClickLeft")
}
binding.right.setOnClickListener {
setTime(overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs())
adjustTimeRange(overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs())
loadAll("onClickRight")
}
binding.end.setOnClickListener {
@ -226,7 +226,6 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
outState.putInt("rangeToDisplay", rangeToDisplay)
outState.putLong("start", overviewData.fromTime)
outState.putLong("end", overviewData.toTime)
}
private fun prepareGraphsIfNeeded(numOfGraphs: Int) {
@ -266,6 +265,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
@Suppress("SameParameterValue")
private fun loadAll(from: String) {
updateDate()
Thread {
overviewData.prepareBasalData(from)
overviewData.prepareTemporaryTargetData(from)
@ -277,18 +277,22 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
private fun setTime(start: Long) {
Calendar.getInstance().also { calendar ->
GregorianCalendar().also { calendar ->
calendar.timeInMillis = start
calendar[Calendar.MILLISECOND] = 0
calendar[Calendar.SECOND] = 0
calendar[Calendar.MINUTE] = 0
calendar[Calendar.HOUR_OF_DAY] = 0
overviewData.fromTime = calendar.timeInMillis
overviewData.toTime = overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs()
overviewData.endTime = overviewData.toTime
calendar[Calendar.HOUR_OF_DAY] -= (calendar[Calendar.HOUR_OF_DAY] % rangeToDisplay)
adjustTimeRange(calendar.timeInMillis)
}
}
private fun adjustTimeRange(start: Long) {
overviewData.fromTime = start
overviewData.toTime = overviewData.fromTime + T.hours(rangeToDisplay.toLong()).msecs()
overviewData.endTime = overviewData.toTime
}
private fun runCalculation(from: String) {
Thread {
iobCobCalculator.stopCalculation(from)
@ -308,13 +312,17 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
runningRefresh = false
}
fun updateDate() {
binding.date.text = dateUtil.dateAndTimeString(overviewData.fromTime)
binding.zoom.text = rangeToDisplay.toString()
}
@Suppress("UNUSED_PARAMETER")
@SuppressLint("SetTextI18n")
fun updateGUI(from: String) {
aapsLogger.debug(LTag.UI, "updateGui $from")
binding.date.text = dateUtil.dateAndTimeString(overviewData.fromTime)
binding.zoom.text = rangeToDisplay.toString()
updateDate()
val pump = activePlugin.activePump
val graphData = GraphData(injector, binding.bgGraph, overviewData)

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.activities
import android.annotation.SuppressLint
import android.os.Bundle
import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.entities.UserEntry.Action
@ -21,14 +22,28 @@ class StatsActivity : NoSplashAppCompatActivity() {
private lateinit var binding: ActivityStatsBinding
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityStatsBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.tdds.text = tddCalculator.stats()
binding.tir.text = tirCalculator.stats()
binding.activity.text = activityMonitor.stats()
binding.tdds.text = getString(R.string.tdd) + ": " + getString(R.string.calculation_in_progress)
binding.tir.text = getString(R.string.tir) + ": " + getString(R.string.calculation_in_progress)
binding.activity.text = getString(R.string.activitymonitor) + ": " + getString(R.string.calculation_in_progress)
Thread {
val tdds = tddCalculator.stats()
runOnUiThread { binding.tdds.text = tdds }
}.start()
Thread {
val tir = tirCalculator.stats()
runOnUiThread { binding.tir.text = tir }
}.start()
Thread {
val activity = activityMonitor.stats()
runOnUiThread { binding.activity.text = activity }
}.start()
binding.ok.setOnClickListener { finish() }
binding.reset.setOnClickListener {

View file

@ -11,6 +11,7 @@ import org.json.JSONObject
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.abs
@Singleton
class DefaultProfile @Inject constructor(val dateUtil: DateUtil) {
@ -120,12 +121,12 @@ class DefaultProfile @Inject constructor(val dateUtil: DateUtil) {
val high = map.ceilingEntry(key)
var res: Array<Double>? = null
if (low != null && high != null) {
res = if (Math.abs(key - low.key) < Math.abs(key - high.key))
res = if (abs(key - low.key) < abs(key - high.key))
low.value
else
high.value
} else if (low != null || high != null) {
res = if (low != null) low.value else high.value
res = if (low != null) low.value else high!!.value
}
return res
}

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.dialogs
import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -62,8 +63,8 @@ class LoopDialog : DaggerDialogFragment() {
private var showOkCancel: Boolean = true
private var _binding: DialogLoopBinding? = null
private var loopHandler = Handler()
private var refreshDialog: Runnable? = null
private var loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshDialog: Runnable
// This property is only valid between onCreateView and
// onDestroyView.
@ -415,7 +416,7 @@ class LoopDialog : DaggerDialogFragment() {
it.commitAllowingStateLoss()
}
} catch (e: IllegalStateException) {
aapsLogger.debug(e.localizedMessage)
aapsLogger.debug(e.localizedMessage ?: e.toString())
}
}
}

View file

@ -384,7 +384,7 @@ class WizardDialog : DaggerDialogFragment() {
it.commitAllowingStateLoss()
}
} catch (e: IllegalStateException) {
aapsLogger.debug(e.localizedMessage)
aapsLogger.debug(e.localizedMessage ?: "")
}
}
}

View file

@ -12,6 +12,7 @@ import androidx.core.app.NotificationCompat
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.*
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.data.PumpEnactResult
@ -65,8 +66,9 @@ import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.abs
@OpenForTesting
@Singleton
open class LoopPlugin @Inject constructor(
class LoopPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
private val aapsSchedulers: AapsSchedulers,

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.aps.openAPSAMA
import android.content.Context
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.interfaces.Profile
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.ValueWrapper
@ -27,8 +28,9 @@ import org.json.JSONException
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class OpenAPSAMAPlugin @Inject constructor(
class OpenAPSAMAPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
private val rxBus: RxBusWrapper,

View file

@ -5,6 +5,7 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.ValueWrapper
import info.nightscout.androidaps.extensions.target
@ -27,8 +28,9 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class OpenAPSSMBPlugin @Inject constructor(
class OpenAPSSMBPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
private val rxBus: RxBusWrapper,

View file

@ -5,6 +5,7 @@ import android.os.StatFs
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.interfaces.Constraint
import info.nightscout.androidaps.interfaces.Constraints
import info.nightscout.androidaps.interfaces.PluginBase
@ -20,8 +21,9 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class StorageConstraintPlugin @Inject constructor(
class StorageConstraintPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
resourceHelper: ResourceHelper,

View file

@ -85,9 +85,8 @@ class MaintenancePlugin @Inject constructor(
}
val exportDir = fileListProvider.ensureTempDirExists()
if (exportDir.exists()) {
val expFiles = exportDir.listFiles()
for (file in expFiles) {
file.delete()
exportDir.listFiles()?.let { expFiles ->
for (file in expFiles) file.delete()
}
exportDir.delete()
}

View file

@ -78,8 +78,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastBolusId = -1L
private var lastBolusTime = -1L
@Volatile private var lastBolusId = -1L
@Volatile private var lastBolusTime = -1L
override fun processChangedBolusesCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastBolusIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -121,8 +121,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastCarbsId = -1L
private var lastCarbsTime = -1L
@Volatile private var lastCarbsId = -1L
@Volatile private var lastCarbsTime = -1L
override fun processChangedCarbsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastCarbsIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -164,8 +164,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastBcrId = -1L
private var lastBcrTime = -1L
@Volatile private var lastBcrId = -1L
@Volatile private var lastBcrTime = -1L
override fun processChangedBolusCalculatorResultsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastBolusCalculatorResultIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -207,8 +207,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastTtId = -1L
private var lastTtTime = -1L
@Volatile private var lastTtId = -1L
@Volatile private var lastTtTime = -1L
override fun processChangedTempTargetsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastTempTargetIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -250,8 +250,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastFoodId = -1L
private var lastFoodTime = -1L
@Volatile private var lastFoodId = -1L
@Volatile private var lastFoodTime = -1L
override fun processChangedFoodsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastFoodIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -293,8 +293,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastGvId = -1L
private var lastGvTime = -1L
@Volatile private var lastGvId = -1L
@Volatile private var lastGvTime = -1L
override fun processChangedGlucoseValuesCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastGlucoseValueIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -342,8 +342,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastTeId = -1L
private var lastTeTime = -1L
@Volatile private var lastTeId = -1L
@Volatile private var lastTeTime = -1L
override fun processChangedTherapyEventsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastTherapyEventIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -384,8 +384,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastDsId = -1L
private var lastDsTime = -1L
@Volatile private var lastDsId = -1L
@Volatile private var lastDsTime = -1L
override fun processChangedDeviceStatusesCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastDeviceStatusIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -426,8 +426,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastTbrId = -1L
private var lastTbrTime = -1L
@Volatile private var lastTbrId = -1L
@Volatile private var lastTbrTime = -1L
override fun processChangedTemporaryBasalsCompat(): Boolean {
val useAbsolute = sp.getBoolean(R.string.key_ns_sync_use_absolute, false)
val lastDbIdWrapped = appRepository.getLastTemporaryBasalIdWrapped().blockingGet()
@ -477,8 +477,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastEbId = -1L
private var lastEbTime = -1L
@Volatile private var lastEbId = -1L
@Volatile private var lastEbTime = -1L
override fun processChangedExtendedBolusesCompat(): Boolean {
val useAbsolute = sp.getBoolean(R.string.key_ns_sync_use_absolute, false)
val lastDbIdWrapped = appRepository.getLastExtendedBolusIdWrapped().blockingGet()
@ -527,8 +527,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastPsId = -1L
private var lastPsTime = -1L
@Volatile private var lastPsId = -1L
@Volatile private var lastPsTime = -1L
override fun processChangedProfileSwitchesCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastProfileSwitchIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L
@ -570,8 +570,8 @@ class DataSyncSelectorImplementation @Inject constructor(
}
}
private var lastOeId = -1L
private var lastOeTime = -1L
@Volatile private var lastOeId = -1L
@Volatile private var lastOeTime = -1L
override fun processChangedOfflineEventsCompat(): Boolean {
val lastDbIdWrapped = appRepository.getLastOfflineEventIdWrapped().blockingGet()
val lastDbId = if (lastDbIdWrapped is ValueWrapper.Existing) lastDbIdWrapped.value else 0L

View file

@ -119,7 +119,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
private var smallHeight = false
private lateinit var dm: DisplayMetrics
private var axisWidth: Int = 0
private var refreshLoop: Runnable? = null
private lateinit var refreshLoop: Runnable
private lateinit var handler: Handler
private val secondaryGraphs = ArrayList<GraphView>()
@ -583,9 +583,9 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
task = null
}
}
handler.removeCallbacks(task)
task?.let { handler.removeCallbacks(it) }
task = UpdateRunnable()
handler.postDelayed(task, 500)
task?.let { handler.postDelayed(it, 500) }
}
@Suppress("UNUSED_PARAMETER")

View file

@ -88,7 +88,7 @@ class SmsCommunicatorOtpActivity : NoSplashAppCompatActivity() {
Runnable {
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("OTP Secret", otp.provisioningSecret())
clipboard.primaryClip = clip
clipboard.setPrimaryClip(clip)
ToastUtils.Long.infoToast(this, resourceHelper.gs(R.string.smscommunicator_otp_export_successful))
uel.log(Action.OTP_EXPORT, Sources.SMS)
})

View file

@ -5,6 +5,7 @@ import androidx.collection.LongSparseArray
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.data.IobTotal
import info.nightscout.androidaps.data.MealData
import info.nightscout.androidaps.database.AppRepository
@ -42,8 +43,9 @@ import kotlin.math.floor
import kotlin.math.max
import kotlin.math.min
@OpenForTesting
@Singleton
open class IobCobCalculatorPlugin @Inject constructor(
class IobCobCalculatorPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
private val aapsSchedulers: AapsSchedulers,

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.sensitivity
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.extensions.isEPSEvent5minBack
@ -27,8 +28,9 @@ import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.roundToInt
@OpenForTesting
@Singleton
open class SensitivityAAPSPlugin @Inject constructor(
class SensitivityAAPSPlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
resourceHelper: ResourceHelper,

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.sensitivity
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.extensions.isEPSEvent5minBack
@ -28,8 +29,9 @@ import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.roundToInt
@OpenForTesting
@Singleton
open class SensitivityOref1Plugin @Inject constructor(
class SensitivityOref1Plugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
resourceHelper: ResourceHelper,

View file

@ -4,6 +4,7 @@ import androidx.collection.LongSparseArray
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.R
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.extensions.isEPSEvent5minBack
@ -26,8 +27,9 @@ import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.roundToInt
@OpenForTesting
@Singleton
open class SensitivityWeightedAveragePlugin @Inject constructor(
class SensitivityWeightedAveragePlugin @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
resourceHelper: ResourceHelper,

View file

@ -9,6 +9,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.activities.BolusProgressHelperActivity
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.data.DetailedBolusInfo
import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.data.PumpEnactResult
@ -47,8 +48,9 @@ import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class CommandQueue @Inject constructor(
class CommandQueue @Inject constructor(
private val injector: HasAndroidInjector,
private val aapsLogger: AAPSLogger,
private val rxBus: RxBusWrapper,

View file

@ -13,7 +13,7 @@ class BTReceiver : DaggerBroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) ?: return
when (intent.action) {
BluetoothDevice.ACTION_ACL_CONNECTED ->

View file

@ -20,8 +20,8 @@ class ActivityMonitor @Inject constructor(
private val dateUtil: DateUtil
) : Application.ActivityLifecycleCallbacks {
override fun onActivityPaused(activity: Activity?) {
val name = activity?.javaClass?.simpleName ?: return
override fun onActivityPaused(activity: Activity) {
val name = activity.javaClass.simpleName
val resumed = sp.getLong("Monitor_" + name + "_" + "resumed", 0)
if (resumed == 0L) {
aapsLogger.debug(LTag.UI, "onActivityPaused: $name resumed == 0")
@ -36,25 +36,25 @@ class ActivityMonitor @Inject constructor(
aapsLogger.debug(LTag.UI, "onActivityPaused: $name elapsed=$elapsed total=${total + elapsed}")
}
override fun onActivityResumed(activity: Activity?) {
val name = activity?.javaClass?.simpleName ?: return
override fun onActivityResumed(activity: Activity) {
val name = activity.javaClass.simpleName
aapsLogger.debug(LTag.UI, "onActivityResumed: $name")
sp.putLong("Monitor_" + name + "_" + "resumed", dateUtil.now())
}
override fun onActivityStarted(activity: Activity?) {
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityDestroyed(activity: Activity?) {
override fun onActivityDestroyed(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityStopped(activity: Activity?) {
override fun onActivityStopped(activity: Activity) {
}
override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
private fun toText(): String {

View file

@ -133,6 +133,7 @@
<string name="configbuilder_nightscoutversion_label">Nightscout versie:</string>
<string name="missing_carbs">Er ontbreekt %1$d g</string>
<string name="exported">Instellingen geëxporteerd</string>
<string name="ue_exported">Gebruikers invoer geëxporteerd</string>
<string name="export_to">Exporteer instellingen naar</string>
<string name="import_from">Importeer instellingen van</string>
<string name="setting_imported">Instellingen geïmporteerd</string>
@ -189,6 +190,7 @@
<string name="smscommunicator_loophasbeenenabled">Loop was ingeschakeld</string>
<string name="smscommunicator_loopisenabled">Loop is ingeschakeld</string>
<string name="valuelimitedto">%1$.2f gelimiteerd tot %2$.2f</string>
<string name="valueoutofrange">»Waarde %1$s is buiten de toegestane limieten</string>
<string name="smscommunicator_pumpconnectwithcode">Om verbinding te maken met pomp antwoord met code %1$s</string>
<string name="smscommunicator_pumpconnectfail">Verbinding maken met pomp is mislukt</string>
<string name="smscommunicator_pumpdisconnectwithcode">Om de pomp te ontkoppelen gedurende %1$d minuten antwoord met code %2$s</string>
@ -263,6 +265,7 @@
<string name="openapsma_autosensdata_label">Autosens gegevens</string>
<string name="openapsma_scriptdebugdata_label">Script debug</string>
<string name="openapsama_useautosens">Gebruik Autosens functie</string>
<string name="refresheventsfromnightscout">Vernieuwen vanaf NS</string>
<string name="deletefuturetreatments">Verwijder behandelingen in de toekomst</string>
<string name="actions_shortname">ACT</string>
<string name="configbuilder_shortname">CONF</string>
@ -386,6 +389,7 @@
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
<string name="activity_shortname">ACT</string>
<string name="bgi_shortname">-BGI</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DEVSLOPE</string>
<string name="nav_about">Over</string>
@ -553,6 +557,7 @@
<string name="bolusrecordedonly">Bolus wordt alleen geregistreerd (niet toegediend door pomp)</string>
<string name="loop_smbsetbypump_label">SMB op de pomp ingesteld</string>
<string name="overview_show_activity">Activiteit</string>
<string name="overview_show_bgi">Bloedglucose impact</string>
<string name="overview_show_sensitivity">Gevoeligheid</string>
<string name="overview_show_deviations">Afwijkingen</string>
<string name="overview_show_cob">Opgenomen Koolhydraten</string>
@ -874,6 +879,24 @@
<string name="fabric_upload_disabled">Upload van crashrapporten is uitgeschakeld!</string>
<string name="graph_menu_divider_header">Grafiek</string>
<string name="chart_menu">Grafiek menu</string>
<string name="clear_filter">Verwijder filter</string>
<string name="trend_arrow">Trendpijl</string>
<string name="cannula">Canule</string>
<string name="userentry">Gebruikersinvoer</string>
<string name="common_values">Gebruik de waarden van je grootste maaltijd die je gewoonlijk eet\n</string>
<string name="summary_email_for_crash_report">Dit e-mailadres zal gekoppeld worden aan crashrapporten, zodat we in dringende gevallen contact met u kunnen opnemen. Het is optioneel.</string>
<string name="email_address">E-mailadres</string>
<string name="privacy_settings">Privacyinstellingen</string>
<string name="privacy_summary">U kunt optioneel een e-mailadres opgeven als u op de hoogte wilt worden gebracht van applicatie crashes. Dit is geen geautomatiseerde service. De ontwikkelaars zullen contact met u opnemen bij gevaarlijke situaties.</string>
<string name="profile_low_target">Profiel laag doel</string>
<string name="profile_high_target">Profiel hoog doel</string>
<string name="temp_target_low_target">Tijdelijk streefdoel onder grens</string>
<string name="temp_target_high_target">Tijdelijk streefdoel boven grens</string>
<string name="temp_target_value">Tijdelijk streefdoel waarde</string>
<string name="profile_dia">Profiel DIA waarde</string>
<string name="profile_sensitivity_value">Profiel gevoeligheidswaarde</string>
<string name="profile_max_daily_basal_value">Maximale basaal waarde van het profiel</string>
<string name="current_basal_value">Huidige basaal waarde</string>
<string name="full_sync">Volledige synchronisatie</string>
<string name="prime">Vullen</string>
<string name="ns_sync_options">Synchronisatie</string>

View file

@ -919,4 +919,6 @@
<string name="ns_receive_therapy_events_summary">Godta behandlingshendelser (kanyle, insulin, batteribytte osv.) som er lagt inn gjennom NS eller NSClient</string>
<string name="ns_receive_cgm">Motta/tilbakefyll CGM data</string>
<string name="ns_receive_cgm_summary">Aksepter CGM data fra NS</string>
<string name="sms_timeout_while_wating">Tidsavbrudd fordi vi ventet på avslutning av forrige pumpekommunikasjon</string>
<string name="smscommunicator_another_bolus_in_queue">Det ligger en annen bolus i køen. Prøv igjen senere.</string>
</resources>

View file

@ -919,4 +919,6 @@
<string name="ns_receive_therapy_events_summary">Prijať liečebné udalosti (výmena setu, inzulínu, batérie atď.) zadané prostredníctvom NS, alebo NSClienta</string>
<string name="ns_receive_cgm">Prijímať/doplňovať glykémie</string>
<string name="ns_receive_cgm_summary">Prijať CGM dáta z NS</string>
<string name="sms_timeout_while_wating">Vypršal časový limit pri čakaní na dokončenie predchádzajúcej komunikácie s pumpou</string>
<string name="smscommunicator_another_bolus_in_queue">Vo fronte je ďalší bolus. Skúste to znovu neskôr.</string>
</resources>

View file

@ -1124,5 +1124,6 @@
<string name="ns_receive_cgm_summary">Accept CGM data from NS</string>
<string name="sms_timeout_while_wating">Timeout while waiting for finish of previous pump communication</string>
<string name="smscommunicator_another_bolus_in_queue">There is another bolus in queue. Try again later.</string>
<string name="calculation_in_progress">Calculation in progress</string>
</resources>

View file

@ -64,7 +64,7 @@ class AutomationEvent(private val injector: HasAndroidInjector) {
.toString()
}
fun fromJSON(data: String?): AutomationEvent {
fun fromJSON(data: String): AutomationEvent {
val d = JSONObject(data)
title = d.optString("title", "")
isEnabled = d.optBoolean("enabled", true)

View file

@ -87,41 +87,41 @@ abstract class Trigger(val injector: HasAndroidInjector) {
//return (clazz.primaryConstructor?.call(injector) as Trigger).fromJSON(data?.toString() ?: "")
return when (type) {
TriggerAutosensValue::class.java.name, // backward compatibility
TriggerAutosensValue::class.java.simpleName -> TriggerAutosensValue(injector).fromJSON(data?.toString() ?: "")
TriggerAutosensValue::class.java.simpleName -> TriggerAutosensValue(injector).fromJSON(data.toString())
TriggerBg::class.java.name,
TriggerBg::class.java.simpleName -> TriggerBg(injector).fromJSON(data?.toString() ?: "")
TriggerBg::class.java.simpleName -> TriggerBg(injector).fromJSON(data.toString())
TriggerBolusAgo::class.java.name,
TriggerBolusAgo::class.java.simpleName -> TriggerBolusAgo(injector).fromJSON(data?.toString() ?: "")
TriggerBolusAgo::class.java.simpleName -> TriggerBolusAgo(injector).fromJSON(data.toString())
TriggerBTDevice::class.java.name,
TriggerBTDevice::class.java.simpleName -> TriggerBTDevice(injector).fromJSON(data?.toString() ?: "")
TriggerBTDevice::class.java.simpleName -> TriggerBTDevice(injector).fromJSON(data.toString())
TriggerIob::class.java.name,
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data?.toString() ?: "")
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
TriggerCOB::class.java.name,
TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data?.toString() ?: "")
TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data.toString())
TriggerConnector::class.java.name,
TriggerConnector::class.java.simpleName -> TriggerConnector(injector).fromJSON(data?.toString() ?: "")
TriggerConnector::class.java.simpleName -> TriggerConnector(injector).fromJSON(data.toString())
TriggerDelta::class.java.name,
TriggerDelta::class.java.simpleName -> TriggerDelta(injector).fromJSON(data?.toString() ?: "")
TriggerDelta::class.java.simpleName -> TriggerDelta(injector).fromJSON(data.toString())
TriggerDummy::class.java.name,
TriggerDummy::class.java.simpleName -> TriggerDummy(injector).fromJSON(data?.toString() ?: "")
TriggerDummy::class.java.simpleName -> TriggerDummy(injector).fromJSON(data.toString())
TriggerIob::class.java.name,
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data?.toString() ?: "")
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
TriggerLocation::class.java.name,
TriggerLocation::class.java.simpleName -> TriggerLocation(injector).fromJSON(data?.toString() ?: "")
TriggerLocation::class.java.simpleName -> TriggerLocation(injector).fromJSON(data.toString())
TriggerProfilePercent::class.java.name,
TriggerProfilePercent::class.java.simpleName -> TriggerProfilePercent(injector).fromJSON(data?.toString() ?: "")
TriggerProfilePercent::class.java.simpleName -> TriggerProfilePercent(injector).fromJSON(data.toString())
TriggerPumpLastConnection::class.java.name,
TriggerPumpLastConnection::class.java.simpleName -> TriggerPumpLastConnection(injector).fromJSON(data?.toString() ?: "")
TriggerPumpLastConnection::class.java.simpleName -> TriggerPumpLastConnection(injector).fromJSON(data.toString())
TriggerRecurringTime::class.java.name,
TriggerRecurringTime::class.java.simpleName -> TriggerRecurringTime(injector).fromJSON(data?.toString() ?: "")
TriggerRecurringTime::class.java.simpleName -> TriggerRecurringTime(injector).fromJSON(data.toString())
TriggerTempTarget::class.java.name,
TriggerTempTarget::class.java.simpleName -> TriggerTempTarget(injector).fromJSON(data?.toString() ?: "")
TriggerTempTarget::class.java.simpleName -> TriggerTempTarget(injector).fromJSON(data.toString())
TriggerTime::class.java.name,
TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data?.toString() ?: "")
TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data.toString())
TriggerTimeRange::class.java.name,
TriggerTimeRange::class.java.simpleName -> TriggerTimeRange(injector).fromJSON(data?.toString() ?: "")
TriggerTimeRange::class.java.simpleName -> TriggerTimeRange(injector).fromJSON(data.toString())
TriggerWifiSsid::class.java.name,
TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(data?.toString() ?: "")
TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(data.toString())
else -> throw ClassNotFoundException(type)
}
}

View file

@ -148,15 +148,13 @@ class LocationService : DaggerService() {
override fun onDestroy() {
super.onDestroy()
if (locationManager != null) {
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
locationManager!!.removeUpdates(locationListener)
} catch (ex: Exception) {
aapsLogger.error(LTag.LOCATION, "fail to remove location listener, ignore", ex)
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
locationListener?.let { locationManager?.removeUpdates(it) }
} catch (ex: Exception) {
aapsLogger.error(LTag.LOCATION, "fail to remove location listener, ignore", ex)
}
disposable.clear()
}

View file

@ -2,22 +2,22 @@
buildscript {
ext {
kotlin_version = '1.5.10'
kotlin_version = '1.5.21'
coreVersion = '1.6.0'
rxjava_version = '2.2.21'
rxandroid_version = '2.1.1'
rxkotlin_version = '2.4.0'
room_version = '2.3.0'
lifecycle_version = '2.3.1'
dagger_version = '2.37'
dagger_version = '2.38.1'
coroutinesVersion = '1.4.1'
activityVersion = '1.2.0'
fragmentktx_version = '1.3.0'
activityVersion = '1.3.1'
fragmentktx_version = '1.3.6'
ormLiteVersion = '4.46'
nav_version = '2.3.3'
appcompat_version = '1.3.0'
nav_version = '2.3.5'
appcompat_version = '1.3.1'
material_version = '1.4.0'
constraintlayout_version = '2.0.4'
constraintlayout_version = '2.1.0'
preferencektx_version = '1.1.1'
commonslang3_version = '3.11'
commonscodec_version = '1.15'
@ -30,7 +30,7 @@ buildscript {
dexmakerVersion = "1.2"
retrofit2Version = '2.9.0'
okhttp3Version = '4.9.0'
byteBuddyVersion = '1.11.5'
byteBuddyVersion = '1.11.12'
androidx_junit = '1.1.2'
androidx_rules = '1.4.0-alpha04'
@ -41,14 +41,15 @@ buildscript {
maven { url "https://plugins.gradle.org/m2/" } // jacoco 0.2
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.google.gms:google-services:4.3.8'
classpath 'com.android.tools.build:gradle:7.0.0'
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
classpath 'com.hiya:jacoco-android:0.2'
modules {
module("org.jetbrains.trove4j:trove4j") {

View file

@ -2,6 +2,7 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
apply plugin: 'kotlin-allopen'
apply plugin: 'com.hiya.jacoco-android'
apply from: 'core_dependencies.gradle'
@ -14,3 +15,7 @@ dependencies {
implementation project(':database')
}
allOpen {
// allows mocking for classes w/o directly opening them for release builds
annotation 'info.nightscout.androidaps.annotations.OpenForTesting'
}

View file

@ -15,7 +15,7 @@ dependencies {
api "androidx.activity:activity-ktx:${activityVersion}"
api "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
api 'androidx.cardview:cardview:1.0.0'
api 'androidx.recyclerview:recyclerview:1.1.0'
api 'androidx.recyclerview:recyclerview:1.2.1'
api 'androidx.gridlayout:gridlayout:1.0.0'
api 'androidx.percentlayout:percentlayout:1.0.0'
api "com.google.android.material:material:$material_version"
@ -55,7 +55,7 @@ dependencies {
api "com.j256.ormlite:ormlite-android:${ormLiteVersion}"
// pumpCommon
api "com.google.code.gson:gson:2.8.6"
api "com.google.code.gson:gson:2.8.7"
// don't kill my app
api('dev.doubledot.doki:library:0.0.1@aar') {
@ -87,7 +87,7 @@ dependencies {
api 'com.google.android.gms:play-services-wearable:17.0.0'
api 'com.google.android.gms:play-services-location:17.1.0'
api("com.google.android.flexbox:flexbox:3.0.0")
api 'com.google.android.flexbox:flexbox:3.0.0'
api("io.socket:socket.io-client:1.0.0") {
// excluding org.json which is provided by Android
exclude group: "org.json", module: "json"
@ -103,5 +103,6 @@ dependencies {
api "commons-codec:commons-codec:$commonscodec_version"
// Phone checker
// updating to 0.0.9 prevents AAPS from build
api 'com.scottyab:rootbeer-lib:0.0.8'
}

View file

@ -0,0 +1,15 @@
package info.nightscout.androidaps.annotations
/**
* This is the actual annotation that makes the class open. Don't use it directly, only through [OpenForTesting]
* which has a NOOP replacement in production.
*/
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class OpenClass
/**
* Annotate a class with [OpenForTesting] if it should be extendable for testing.
*/
@OpenClass
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting

View file

@ -25,13 +25,13 @@ class ErrorHelperActivity : DialogAppCompatActivity() {
super.onCreate(savedInstanceState)
val errorDialog = ErrorDialog()
errorDialog.helperActivity = this
errorDialog.status = intent.getStringExtra(STATUS)
errorDialog.status = intent.getStringExtra(STATUS) ?: ""
errorDialog.sound = intent.getIntExtra(SOUND_ID, R.raw.error)
errorDialog.title = intent.getStringExtra(TITLE)
errorDialog.title = intent.getStringExtra(TITLE)?: ""
errorDialog.show(supportFragmentManager, "Error")
if (sp.getBoolean(R.string.key_ns_create_announcements_from_errors, true))
disposable += repository.runTransaction(InsertTherapyEventAnnouncementTransaction(intent.getStringExtra(STATUS))).subscribe()
disposable += repository.runTransaction(InsertTherapyEventAnnouncementTransaction(intent.getStringExtra(STATUS) ?: "")).subscribe()
}
companion object {

View file

@ -1,7 +1,7 @@
package info.nightscout.androidaps.di
import android.content.Context
import android.preference.PreferenceManager
import androidx.preference.PreferenceManager
import dagger.Module
import dagger.Provides
import info.nightscout.androidaps.logging.AAPSLogger

View file

@ -40,7 +40,10 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
override fun onStart() {
super.onStart()
dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
dialog?.window?.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}
override fun onSaveInstanceState(savedInstanceState: Bundle) {
@ -67,22 +70,24 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
eventTimeView?.text = dateUtil.timeString(eventTime)
// create an OnDateSetListener
val dateSetListener = DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth ->
val cal = Calendar.getInstance()
cal.timeInMillis = eventTime
cal.set(Calendar.YEAR, year)
cal.set(Calendar.MONTH, monthOfYear)
cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
eventTime = cal.timeInMillis
eventTimeChanged = true
eventDateView?.text = dateUtil.dateString(eventTime)
}
val dateSetListener =
DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth ->
val cal = Calendar.getInstance()
cal.timeInMillis = eventTime
cal.set(Calendar.YEAR, year)
cal.set(Calendar.MONTH, monthOfYear)
cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
eventTime = cal.timeInMillis
eventTimeChanged = true
eventDateView?.text = dateUtil.dateString(eventTime)
}
eventDateView?.setOnClickListener {
context?.let {
val cal = Calendar.getInstance()
cal.timeInMillis = eventTime
DatePickerDialog(it, dateSetListener,
DatePickerDialog(
it, dateSetListener,
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH)
@ -96,7 +101,10 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
cal.timeInMillis = eventTime
cal.set(Calendar.HOUR_OF_DAY, hour)
cal.set(Calendar.MINUTE, minute)
cal.set(Calendar.SECOND, seconds++) // randomize seconds to prevent creating record of the same time, if user choose time manually
cal.set(
Calendar.SECOND,
seconds++
) // randomize seconds to prevent creating record of the same time, if user choose time manually
eventTime = cal.timeInMillis
eventTimeChanged = true
eventTimeView?.text = dateUtil.timeString(eventTime)
@ -106,7 +114,8 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
context?.let {
val cal = Calendar.getInstance()
cal.timeInMillis = eventTime
TimePickerDialog(it, timeSetListener,
TimePickerDialog(
it, timeSetListener,
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
DateFormat.is24HourFormat(context)
@ -114,7 +123,8 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
}
}
(view.findViewById(R.id.notes_layout) as View?)?.visibility = sp.getBoolean(R.string.key_show_notes_entry_dialogs, false).toVisibility()
(view.findViewById(R.id.notes_layout) as View?)?.visibility =
sp.getBoolean(R.string.key_show_notes_entry_dialogs, false).toVisibility()
(view.findViewById(R.id.ok) as Button?)?.setOnClickListener {
synchronized(okClicked) {
@ -137,7 +147,7 @@ abstract class DialogFragmentWithDate : DaggerDialogFragment() {
it.commitAllowingStateLoss()
}
} catch (e: IllegalStateException) {
aapsLogger.debug(e.localizedMessage)
aapsLogger.debug(e.localizedMessage ?: "")
}
}

View file

@ -1,7 +1,9 @@
package info.nightscout.androidaps.dialogs
import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -24,13 +26,14 @@ class ErrorDialog : DaggerDialogFragment() {
@Inject lateinit var alarmSoundServiceHelper: AlarmSoundServiceHelper
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var uel: UserEntryLogger
@Inject lateinit var ctx: Context
var helperActivity: ErrorHelperActivity? = null
var status: String = ""
var title: String = ""
var sound: Int = 0
private var loopHandler = Handler()
private var loopHandler = Handler(Looper.getMainLooper())
private var _binding: DialogErrorBinding? = null
@ -106,9 +109,9 @@ class ErrorDialog : DaggerDialogFragment() {
private fun startAlarm() {
if (sound != 0)
context?.let { context -> alarmSoundServiceHelper.startAlarm(context, sound) }
alarmSoundServiceHelper.startAlarm(ctx, sound)
}
private fun stopAlarm() =
context?.let { context -> alarmSoundServiceHelper.stopService(context) }
alarmSoundServiceHelper.stopService(ctx)
}

View file

@ -16,14 +16,14 @@ fun DeviceStatus.toJson(dateUtil: DateUtil): JSONObject =
.put("created_at", dateUtil.toISOString(timestamp))
.also {
if (device != null) it.put("device", device)
if (pump != null) it.put("pump", JSONObject(pump))
pump?.let { pump -> it.put("pump", JSONObject(pump)) }
it.put("openaps", JSONObject().also { openaps ->
if (enacted != null) openaps.put("enacted", JSONObject(enacted))
if (suggested != null) openaps.put("suggested", JSONObject(suggested))
if (iob != null) openaps.put("iob", JSONObject(iob))
enacted?.let { enacted -> openaps.put("enacted", JSONObject(enacted)) }
suggested?.let { suggested -> openaps.put("suggested", JSONObject(suggested)) }
iob?.let { iob -> openaps.put("iob", JSONObject(iob)) }
})
if (uploaderBattery != 0) it.put("uploaderBattery", uploaderBattery)
if (configuration != null) it.put("configuration", JSONObject(configuration))
configuration?.let { configuration -> it.put("configuration", JSONObject(configuration)) }
}
fun buildDeviceStatus(

View file

@ -1,6 +1,9 @@
package info.nightscout.androidaps.interfaces
open class PluginDescription {
import info.nightscout.androidaps.annotations.OpenForTesting
@OpenForTesting
class PluginDescription {
var mainType = PluginType.GENERAL
var fragmentClass: String? = null

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.bus
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.events.Event
import info.nightscout.androidaps.utils.rx.AapsSchedulers
import io.reactivex.Observable
@ -7,8 +8,9 @@ import io.reactivex.subjects.PublishSubject
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class RxBusWrapper @Inject constructor(
class RxBusWrapper @Inject constructor(
val aapsSchedulers: AapsSchedulers
) {

View file

@ -1,7 +1,6 @@
package info.nightscout.androidaps.plugins.constraints.versionChecker
import android.content.Context
import android.net.ConnectivityManager
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.logging.AAPSLogger
@ -9,6 +8,7 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
import info.nightscout.androidaps.receivers.ReceiverStatusStore
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import java.io.IOException
@ -24,24 +24,28 @@ class VersionCheckerUtils @Inject constructor(
val resourceHelper: ResourceHelper,
val rxBus: RxBusWrapper,
private val config: Config,
val context: Context
val context: Context,
val receiverStatusStore: ReceiverStatusStore
) {
// check network connection
fun isConnected(): Boolean {
val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return connMgr.activeNetworkInfo?.isConnected ?: false
}
fun isConnected(): Boolean = receiverStatusStore.isConnected
fun triggerCheckVersion() {
if (!sp.contains(R.string.key_last_time_this_version_detected)) {
// On a new installation, set it as 30 days old in order to warn that there is a new version.
sp.putLong(R.string.key_last_time_this_version_detected, System.currentTimeMillis() - TimeUnit.DAYS.toMillis(30))
sp.putLong(
R.string.key_last_time_this_version_detected,
System.currentTimeMillis() - TimeUnit.DAYS.toMillis(30)
)
}
// If we are good, only check once every day.
if (System.currentTimeMillis() > sp.getLong(R.string.key_last_time_this_version_detected, 0) + CHECK_EVERY) {
if (System.currentTimeMillis() > sp.getLong(
R.string.key_last_time_this_version_detected,
0
) + CHECK_EVERY
) {
checkVersion()
}
}
@ -49,7 +53,8 @@ class VersionCheckerUtils @Inject constructor(
private fun checkVersion() = if (isConnected()) {
Thread {
try {
val version: String? = findVersion(URL("https://raw.githubusercontent.com/nightscout/AndroidAPS/master/app/build.gradle").readText())
val version: String? =
findVersion(URL("https://raw.githubusercontent.com/nightscout/AndroidAPS/master/app/build.gradle").readText())
compareWithCurrentVersion(version, config.VERSION_NAME)
} catch (e: IOException) {
aapsLogger.error(LTag.CORE, "Github master version check error: $e")
@ -81,8 +86,8 @@ class VersionCheckerUtils @Inject constructor(
(newElem - currElem).let {
when {
it > 0 -> return onNewVersionDetected(currentVersion, newVersion)
it < 0 -> return onOlderVersionDetected()
it > 0 -> return onNewVersionDetected(currentVersion, newVersion)
it < 0 -> return onOlderVersionDetected()
it == 0 -> Unit
}
}
@ -107,7 +112,11 @@ class VersionCheckerUtils @Inject constructor(
val now = System.currentTimeMillis()
if (now > sp.getLong(R.string.key_last_versionchecker_warning, 0) + WARN_EVERY) {
aapsLogger.debug(LTag.CORE, "Version $currentVersion outdated. Found $newVersion")
val notification = Notification(Notification.NEW_VERSION_DETECTED, resourceHelper.gs(R.string.versionavailable, newVersion.toString()), Notification.LOW)
val notification = Notification(
Notification.NEW_VERSION_DETECTED,
resourceHelper.gs(R.string.versionavailable, newVersion.toString()),
Notification.LOW
)
rxBus.send(EventNewNotification(notification))
sp.putLong(R.string.key_last_versionchecker_warning, now)
}
@ -126,7 +135,8 @@ class VersionCheckerUtils @Inject constructor(
fun findVersion(file: String?): String? {
val regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)".toRegex()
return file?.lines()?.filter { regex.matches(it) }?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
return file?.lines()?.filter { regex.matches(it) }
?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
}
companion object {
@ -142,14 +152,18 @@ fun String.numericVersionPart(): String =
@Suppress("unused") fun findVersion(file: String?): String? {
val regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)".toRegex()
return file?.lines()?.filter { regex.matches(it) }?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
return file?.lines()?.filter { regex.matches(it) }
?.mapNotNull { regex.matchEntire(it)?.groupValues?.getOrNull(3) }?.firstOrNull()
}
@Deprecated(replaceWith = ReplaceWith("numericVersionPart()"), message = "Will not work if RCs have another index number in it.")
@Deprecated(
replaceWith = ReplaceWith("numericVersionPart()"),
message = "Will not work if RCs have another index number in it."
)
fun String.versionStrip() = this.mapNotNull {
when (it) {
in '0'..'9' -> it
'.' -> it
'.' -> it
else -> null
}
}.joinToString(separator = "")

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.general.maintenance
import android.content.Context
import android.os.Environment
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.Config
@ -25,7 +26,8 @@ class PrefFileListProvider @Inject constructor(
private val classicPrefsFormat: ClassicPrefsFormat,
private val encryptedPrefsFormat: EncryptedPrefsFormat,
private val storage: Storage,
private val versionCheckerUtils: VersionCheckerUtils
private val versionCheckerUtils: VersionCheckerUtils,
context: Context
) {
private val path = File(Environment.getExternalStorageDirectory().toString())

View file

@ -81,7 +81,7 @@ class PrefImportListActivity : DaggerAppCompatActivity() {
filelistName.text = prefFile.file.name
filelistName.tag = prefFile
filelistDir.text = resourceHelper.gs(R.string.in_directory, prefFile.file.parentFile.absolutePath)
filelistDir.text = resourceHelper.gs(R.string.in_directory, prefFile.file.parentFile?.absolutePath)
val visible = (prefFile.handler != PrefsFormatsHandler.CLASSIC).toVisibility()
metalineName.visibility = visible

View file

@ -25,7 +25,7 @@ class NetworkChangeReceiver : DaggerBroadcastReceiver() {
rxBus.send(grabNetworkStatus(context, aapsLogger))
}
fun grabNetworkStatus(context: Context, aapsLogger: AAPSLogger): EventNetworkChange {
private fun grabNetworkStatus(context: Context, aapsLogger: AAPSLogger): EventNetworkChange {
val event = EventNetworkChange()
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networks: Array<Network> = cm.allNetworks

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.receivers
import info.nightscout.androidaps.annotations.OpenForTesting
import android.content.Context
import android.content.Intent
import info.nightscout.androidaps.events.EventChargingState
@ -8,6 +9,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
class ReceiverStatusStore @Inject constructor(val context: Context, val rxBus: RxBusWrapper) {

View file

@ -7,6 +7,7 @@ import android.media.MediaPlayer
import android.os.Binder
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import dagger.android.DaggerService
import info.nightscout.androidaps.activities.ErrorHelperActivity
import info.nightscout.androidaps.core.R
@ -37,7 +38,7 @@ class AlarmSoundService : DaggerService() {
private const val VOLUME_INCREASE_MIN_DELAY_MILLIS = 2_000L // Minimum delay between volume increments
/*
* Delay until the next volumen increment will be the lowest value of VOLUME_INCREASE_MIN_DELAY_MILLIS and
* Delay until the next volume increment will be the lowest value of VOLUME_INCREASE_MIN_DELAY_MILLIS and
* VOLUME_INCREASE_BASE_DELAY_MILLIS - (currentVolumeLevel - 1) ^ VOLUME_INCREASE_DELAY_DECREMENT_EXPONENT * 1000
*
*/
@ -53,7 +54,7 @@ class AlarmSoundService : DaggerService() {
private val binder = LocalBinder()
override fun onBind(intent: Intent): IBinder = binder
private val increaseVolumeHandler = Handler()
private val increaseVolumeHandler = Handler(Looper.getMainLooper())
private var currentVolumeLevel = 0
override fun onCreate() {

View file

@ -17,6 +17,7 @@ import javax.crypto.spec.SecretKeySpec
import javax.inject.Inject
import javax.inject.Singleton
@Suppress("SpellCheckingInspection")
@Singleton
class CryptoUtil @Inject constructor(
val aapsLogger: AAPSLogger
@ -39,7 +40,7 @@ class CryptoUtil @Inject constructor(
return hashRaw.toHex()
}
fun hmac256(str: String, secret: String): String? {
fun hmac256(str: String, secret: String): String {
val sha256HMAC = Mac.getInstance("HmacSHA256")
val secretKey = SecretKeySpec(secret.toByteArray(), "HmacSHA256")
sha256HMAC.init(secretKey)
@ -68,7 +69,7 @@ class CryptoUtil @Inject constructor(
secureRandom.nextBytes(iv)
val cipherEnc: Cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipherEnc.init(Cipher.ENCRYPT_MODE, prepCipherKey(passPhrase, salt), GCMParameterSpec(TAG_LENGTH_BIT, iv))
encrypted = cipherEnc.doFinal(rawData.toByteArray())
encrypted = cipherEnc.doFinal(rawData.toByteArray()) ?: return null
val byteBuffer: ByteBuffer = ByteBuffer.allocate(1 + iv.size + encrypted.size)
byteBuffer.put(iv.size.toByte())
byteBuffer.put(iv)

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.utils
import android.content.Context
import androidx.collection.LongSparseArray
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.utils.resources.ResourceHelper
import org.joda.time.DateTime
@ -26,8 +27,9 @@ import kotlin.math.abs
* The Class DateUtil. A simple wrapper around SimpleDateFormat to ease the handling of iso date string &lt;-&gt; date obj
* with TZ
*/
@OpenForTesting
@Singleton
open class DateUtil @Inject constructor(private val context: Context) {
class DateUtil @Inject constructor(private val context: Context) {
/**
* The date format in iso.

View file

@ -1,6 +1,7 @@
package info.nightscout.androidaps.utils
import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.GlucoseUnit
import info.nightscout.androidaps.interfaces.Profile
@ -9,8 +10,9 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
import javax.inject.Singleton
@OpenForTesting
@Singleton
open class DefaultValueHelper @Inject constructor(
class DefaultValueHelper @Inject constructor(
private val sp: SP,
private val profileFunction: ProfileFunction
) {

View file

@ -5,6 +5,7 @@ import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.google.firebase.ktx.Firebase
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
@ -17,8 +18,9 @@ import javax.inject.Singleton
* to disable them and make calls from a potentially invalid singleton reference. This wrapper
* emulates the methods but ignores the request if the instance is null or invalid.
*/
@OpenForTesting
@Singleton
open class FabricPrivacy @Inject constructor(
class FabricPrivacy @Inject constructor(
private val aapsLogger: AAPSLogger,
private val sp: SP
) {

View file

@ -50,7 +50,7 @@ object LocaleHelper {
configuration.setLocale(newLocale)
val localeList = LocaleList(newLocale)
LocaleList.setDefault(localeList)
configuration.locales = localeList
configuration.setLocales(localeList)
val context = ctx.createConfigurationContext(configuration)
return ContextWrapper(context)
}

View file

@ -9,25 +9,26 @@ import com.google.android.material.textfield.TextInputLayout
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.utils.textValidator.validators.*
@Suppress("SpellCheckingInspection")
class DefaultEditTextValidator : EditTextValidator {
protected var mValidator: MultiValidator? = null
protected var testErrorString: String? = null
protected var emptyAllowed = false
protected lateinit var editTextView: EditText
private var mValidator: MultiValidator? = null
private var testErrorString: String? = null
private var emptyAllowed = false
private lateinit var editTextView: EditText
private var tw: TextWatcher? = null
private var defaultEmptyErrorString: String? = null
protected var testType: Int
protected var classType: String? = null
protected var customRegexp: String? = null
protected var customFormat: String? = null
protected var emptyErrorStringActual: String? = null
protected var emptyErrorStringDef: String? = null
protected var minLength = 0
protected var minNumber = 0
protected var maxNumber = 0
protected var floatminNumber = 0f
protected var floatmaxNumber = 0f
private var testType: Int
private var classType: String? = null
private var customRegexp: String? = null
private var customFormat: String? = null
private var emptyErrorStringActual: String? = null
private var emptyErrorStringDef: String? = null
private var minLength = 0
private var minNumber = 0
private var maxNumber = 0
private var floatminNumber = 0f
private var floatmaxNumber = 0f
@Suppress("unused")
constructor(editTextView: EditText, context: Context) {
@ -56,8 +57,7 @@ class DefaultEditTextValidator : EditTextValidator {
@Throws(IllegalArgumentException::class)
override fun addValidator(theValidator: Validator) {
requireNotNull(theValidator) { "theValidator argument should not be null" }
mValidator!!.enqueue(theValidator)
mValidator?.enqueue(theValidator)
}
private fun setEditText(editText: EditText) {
@ -105,9 +105,9 @@ class DefaultEditTextValidator : EditTextValidator {
EditTextValidator.TEST_ALPHANUMERIC -> toAdd = AlphaNumericValidator(
if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_this_field_cannot_contain_special_character) else testErrorString)
EditTextValidator.TEST_NUMERIC -> toAdd = NumericValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_allowed) else testErrorString)
EditTextValidator.TEST_NUMERIC_RANGE -> toAdd = NumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, Integer.toString(minNumber), Integer.toString(maxNumber)) else testErrorString, minNumber, maxNumber)
EditTextValidator.TEST_FLOAT_NUMERIC_RANGE -> toAdd = FloatNumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, java.lang.Float.toString(floatminNumber), java.lang.Float.toString(floatmaxNumber)) else testErrorString, floatminNumber, floatmaxNumber)
EditTextValidator.TEST_REGEXP -> toAdd = RegexpValidator(testErrorString, customRegexp)
EditTextValidator.TEST_NUMERIC_RANGE -> toAdd = NumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, minNumber.toString(), maxNumber.toString()) else testErrorString, minNumber, maxNumber)
EditTextValidator.TEST_FLOAT_NUMERIC_RANGE -> toAdd = FloatNumericRangeValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_only_numeric_digits_range_allowed, floatminNumber.toString(), floatmaxNumber.toString()) else testErrorString, floatminNumber, floatmaxNumber)
EditTextValidator.TEST_REGEXP -> toAdd = RegexpValidator(testErrorString, customRegexp ?: "")
EditTextValidator.TEST_CREDITCARD -> toAdd = CreditCardValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_creditcard_number_not_valid) else testErrorString)
EditTextValidator.TEST_EMAIL -> toAdd = EmailValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_email_address_not_valid) else testErrorString)
EditTextValidator.TEST_PHONE -> toAdd = PhoneValidator(if (TextUtils.isEmpty(testErrorString)) context.getString(R.string.error_phone_not_valid) else testErrorString)
@ -185,7 +185,7 @@ class DefaultEditTextValidator : EditTextValidator {
return this
}
fun setEmptyErrorString(emptyErrorString: String?): DefaultEditTextValidator {
private fun setEmptyErrorString(emptyErrorString: String?): DefaultEditTextValidator {
emptyErrorStringActual = if (!TextUtils.isEmpty(emptyErrorString)) {
emptyErrorString
} else {
@ -243,6 +243,7 @@ class DefaultEditTextValidator : EditTextValidator {
!TextUtils.isEmpty(editTextView.error)
}
@Suppress("SpellCheckingInspection")
data class Parameters(
val testErrorString: String? = null,
val emptyAllowed: Boolean = false,

View file

@ -7,4 +7,4 @@ import java.util.regex.Pattern
*
* @author Andrea Baccega <me></me>@andreabaccega.com>
*/
open class RegexpValidator(message: String?, _regexp: String?) : PatternValidator(message, Pattern.compile(_regexp))
open class RegexpValidator(message: String?, _regexp: String) : PatternValidator(message, Pattern.compile(_regexp))

View file

@ -2,6 +2,7 @@
<resources>
<!-- Keys-->
<!-- General-->
<string name="refresh">Vernieuwen</string>
<string name="error">Fout</string>
<string name="not_set_short">Niet ingesteld</string>
<string name="failedupdatebasalprofile">Update basaal profiel mislukt</string>
@ -61,6 +62,8 @@
<string name="eventtype">Gebeurtenis type</string>
<string name="mgdl">mg/dl</string>
<string name="mmol">mmol/l</string>
<string name="shortgram">g</string>
<string name="shortpercent">%</string>
<string name="advancedsettings_title">Geavanceerde instellingen</string>
<string name="bluetooth">Bluetooth</string>
<string name="btwatchdog_title">BT Watchdog</string>
@ -68,6 +71,7 @@
<string name="pairing">Koppelen</string>
<string name="yes">Ja</string>
<string name="no">Nee</string>
<string name="loopdisabled">LOOP UITGESCHAKELD DOOR BEPERKINGEN</string>
<!-- Constraints-->
<string name="limitingbasalratio">Beperken van basaal tot max %1$.2f E/uur wegens de %2$s</string>
<string name="pumplimit">Pomp limiet</string>

View file

@ -382,6 +382,9 @@
<string name="ue_timestamp">Отметка времени</string>
<string name="ue_none">Нет единиц</string>
<string name="ue_export_to_csv">Экспорт пользовательских записей в Excel (csv)</string>
<string name="uel_loop_change">КОНТУР ИЗМЕНЕН</string>
<string name="uel_loop_removed">КОНТУР УДАЛЕН</string>
<string name="uel_other">ДРУГОЕ</string>
<plurals name="days">
<item quantity="one">%1$d день</item>
<item quantity="few">%1$d дня</item>

View file

@ -0,0 +1,8 @@
package info.nightscout.androidaps.annotations
/**
* Annotate a class with [OpenForTesting] if it should be extendable for testing.
* In production the class remains final.
*/
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting

View file

@ -1,9 +1,11 @@
package info.nightscout.androidaps.plugins.constraints.versionChecker
package info.nightscout.androidaps.plugins.contraints.versionChecker
import android.content.Context
import info.nightscout.androidaps.utils.buildHelper.ConfigImpl
import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.interfaces.Config
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtils
import info.nightscout.androidaps.receivers.ReceiverStatusStore
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import org.junit.Assert.assertArrayEquals
@ -14,17 +16,18 @@ import org.mockito.Mock
class VersionCheckerUtilsKtTest : TestBase() {
lateinit var versionCheckerUtils: VersionCheckerUtils
private lateinit var versionCheckerUtils: VersionCheckerUtils
@Mock lateinit var sp: SP
@Mock lateinit var resourceHelper: ResourceHelper
@Mock lateinit var context: Context
val config = ConfigImpl()
@Mock lateinit var receiverStatusStore: ReceiverStatusStore
@Mock lateinit var config: Config
private val rxBus = RxBusWrapper(aapsSchedulers)
@Before fun setup() {
versionCheckerUtils = VersionCheckerUtils(aapsLogger, sp, resourceHelper, rxBus, config, context)
versionCheckerUtils = VersionCheckerUtils(aapsLogger, sp, resourceHelper, rxBus, config, context, receiverStatusStore)
}
@Test
@ -124,6 +127,7 @@ class VersionCheckerUtilsKtTest : TestBase() {
}
*/
@Suppress("SpellCheckingInspection")
@Test
fun findVersionMatchesRegularVersion() {
val buildGradle = """blabla

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -61,7 +62,7 @@ class DanaFragment : DaggerFragment() {
private var disposable: CompositeDisposable = CompositeDisposable()
private val loopHandler = Handler()
private val loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshLoop: Runnable
private var _binding: DanarFragmentBinding? = null

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Сдвояване - ОК</string>
<string name="danars_pairingtimedout">Времето за сдвояване изтече</string>
<string name="danars_waitingforpairing">Очаква сдвояване с помпа</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Поддръжка за Dana Diabecare RS помпи</string>
<string name="maxbolusviolation">Превишавате макс болус</string>
<string name="commanderror">Грешка при команда</string>
<string name="speederror">Скорост грешка</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">Spárováno</string>
<string name="danars_pairingtimedout">Vypršel časový limit pro párování</string>
<string name="danars_waitingforpairing">Čekání na spárování na pumpě</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Ovladač pumpy pro DanaRS</string>
<string name="description_pump_dana_rs">Integrace pumpy pro pumpy DANA Diabecare RS a Dana-i</string>
<string name="maxbolusviolation">Překročen maximální bolus</string>
<string name="commanderror">Chyba příkazu</string>
<string name="speederror">Chyba rychlosti</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Pairing OK</string>
<string name="danars_pairingtimedout">Zeitüberschreitung beim Pairing</string>
<string name="danars_waitingforpairing">Auf Verbindung warten</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Pumpen-Integration für Dana Diabecare RS Pumpen</string>
<string name="maxbolusviolation">Max. Bolus überschritten</string>
<string name="commanderror">Fehler bei Befehl</string>
<string name="speederror">Geschwindigkeits-Fehler</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Conexión OK</string>
<string name="danars_pairingtimedout">Tiempo de Vinculación agotado</string>
<string name="danars_waitingforpairing">Esperando para conectar con bomba</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integración de bombas de insulina de DANA Diabecare RS</string>
<string name="maxbolusviolation">Violación de bolo Max</string>
<string name="commanderror">Error de comando</string>
<string name="speederror">Error de velocidad</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Appairage OK</string>
<string name="danars_pairingtimedout">Délai d\'appairage expiré</string>
<string name="danars_waitingforpairing">Attente appairage pompe</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Intégration des pompes Diabecare DANA RS</string>
<string name="maxbolusviolation">Violation bolus Max</string>
<string name="commanderror">Erreur de commande</string>
<string name="speederror">Erreur de vitesse</string>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="overview_bolusprogress_delivered">Seachadta</string>
<string name="overview_bolusprogress_stoped">Stopadh</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">Associazione OK</string>
<string name="danars_pairingtimedout">Time out associazione</string>
<string name="danars_waitingforpairing">In attesa di associare il micro</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integrazione del microinfusore DANA Diabecare RS</string>
<string name="description_pump_dana_rs">Integrazione del microinfusore DANA Diabecare RS / Dana-i</string>
<string name="maxbolusviolation">Violazione bolo massimo</string>
<string name="commanderror">Errore comando</string>
<string name="speederror">Errore velocità</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">הצימוד הצליח</string>
<string name="danars_pairingtimedout">הצימוד חרג ממגבלת הזמן</string>
<string name="danars_waitingforpairing">מחכה לצימוד עם משאבה</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i / RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">חיבור משאבת DANA Diabecare RS</string>
<string name="description_pump_dana_rs">חיבור משאבות DANA RS/i</string>
<string name="maxbolusviolation">בולוס גבוה מדי</string>
<string name="commanderror">שגיאת פקודה</string>
<string name="speederror">שגיאת מהירות</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">연동완료</string>
<string name="danars_pairingtimedout">연동시간초과</string>
<string name="danars_waitingforpairing">펌프연동 대기중</string>
<string name="danarspump">다나RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">다나RS 펌프와 연동</string>
<string name="maxbolusviolation">최대 Bolus 위반</string>
<string name="commanderror">명령 오류</string>
<string name="speederror">속도 오류</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Sujungta</string>
<string name="danars_pairingtimedout">Sujungimui skirtas laikas baigėsi</string>
<string name="danars_waitingforpairing">Laukiama ryšio su pompa</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">DANA Diabecare RS pompos integracija</string>
<string name="maxbolusviolation">Pažeistas maks boluso limitas</string>
<string name="commanderror">Komandos klaida</string>
<string name="speederror">Greičio klaida</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Koppeling geslaagd</string>
<string name="danars_pairingtimedout">Koppeling verlopen</string>
<string name="danars_waitingforpairing">Wachten op koppelen van de pomp</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Pomp integratie voor DANA Diabecare RS pompen</string>
<string name="maxbolusviolation">Max bolus overschrijding</string>
<string name="commanderror">Opdracht fout</string>
<string name="speederror">Snelheid fout</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">Sammenkobling OK</string>
<string name="danars_pairingtimedout">Sammenkobling ble tidsavbrutt</string>
<string name="danars_waitingforpairing">Venter på sammenkobling med pumpen</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Pumpeintegrasjon for DANA Diabecare RS-pumper</string>
<string name="description_pump_dana_rs">Pumpeintegrasjon for DANA Diabecare RS og Dana-i-pumper</string>
<string name="maxbolusviolation">Max bolus nådd</string>
<string name="commanderror">Kommando feil</string>
<string name="speederror">Hastighetsfeil</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Parowanie OK</string>
<string name="danars_pairingtimedout">Przekroczono limit czasu parowania</string>
<string name="danars_waitingforpairing">Oczekiwanie na pompę na sparowanie</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integracja z pompą DANA RS Diabecare</string>
<string name="maxbolusviolation">Przekroczenie ograniczenia maks. bolusa</string>
<string name="commanderror">Błąd polecenia</string>
<string name="speederror">Błąd prędkości</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Emparelhamento OK</string>
<string name="danars_pairingtimedout">Tempo emparelhamento excedido</string>
<string name="danars_waitingforpairing">Aguardando emparelhamento na bomba</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integração para bombas DANA Diabecare RS</string>
<string name="maxbolusviolation">Transgressão Bólus máx</string>
<string name="commanderror">Erro no comando</string>
<string name="speederror">Erro velocidade</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Emparelhamento OK</string>
<string name="danars_pairingtimedout">Tempo emparelhamento excedido</string>
<string name="danars_waitingforpairing">Aguardando emparelhamento na bomba</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integração para bombas DANA Diabecare RS</string>
<string name="maxbolusviolation">Transgressão Bólus máx</string>
<string name="commanderror">Erro no comando</string>
<string name="speederror">Erro velocidade</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Conectare OK</string>
<string name="danars_pairingtimedout">Conectare nereușită</string>
<string name="danars_waitingforpairing">Se așteaptă conectarea la pompă</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Integrare cu pompele DANA Diabcare RS</string>
<string name="maxbolusviolation">Încălcare a valorii maxime a bolusului</string>
<string name="commanderror">Eroare de comandă</string>
<string name="speederror">Eroare de viteză</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">Соединение OK</string>
<string name="danars_pairingtimedout">Истекло время ожидания соединения</string>
<string name="danars_waitingforpairing">Ожидание соединения на помпе</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Интеграция с помпой DANA Diabetcare RS</string>
<string name="description_pump_dana_rs">Интеграция с помпами DANA Diabecare RS и Dana-i</string>
<string name="maxbolusviolation">Нарушение макс болюса</string>
<string name="commanderror">Ошибка в команде</string>
<string name="speederror">Ошибка в скорости</string>

View file

@ -5,9 +5,9 @@
<string name="danars_pairingok">Spárované</string>
<string name="danars_pairingtimedout">Vypršal časový limit pre párovanie</string>
<string name="danars_waitingforpairing">Čakanie na párovanie na pumpe</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump">Dana-i/RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Ovládač pumpy pre Dana Diabecare RS</string>
<string name="description_pump_dana_rs">Integrácia pumpy pre pumpy DANA Diabecare RS a Dana-i</string>
<string name="maxbolusviolation">Prekročený maximálny bolus</string>
<string name="commanderror">Chyba príkazu</string>
<string name="speederror">Chyba rýchlosti</string>

View file

@ -5,9 +5,7 @@
<string name="danars_pairingok">Parkopplingen klar</string>
<string name="danars_pairingtimedout">Parkopplingen tog för lång tid</string>
<string name="danars_waitingforpairing">Väntar på parkoppling med pump</string>
<string name="danarspump">Dana RS</string>
<string name="danarspump_shortname">Dana</string>
<string name="description_pump_dana_rs">Pumpintegration för DANA Diabecare RS</string>
<string name="maxbolusviolation">Max bolus nådd</string>
<string name="commanderror">Kommandofel</string>
<string name="speederror">Felaktig hastighet</string>

View file

@ -2,7 +2,6 @@ package info.nightscout.androidaps.danar.comm
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.logging.LTag
import java.util.*
class MsgSettingUserOptions(
injector: HasAndroidInjector
@ -16,7 +15,7 @@ class MsgSettingUserOptions(
override fun handleMessage(packet: ByteArray) {
val bytes = getDataBytes(packet, packet.size - 10)
danaPump.userOptionsFrompump = Arrays.copyOf(bytes, bytes!!.size) // saving pumpDataBytes to use it in MsgSetUserOptions
danaPump.userOptionsFrompump = bytes.copyOf(bytes.size) // saving pumpDataBytes to use it in MsgSetUserOptions
for (pos in bytes.indices) {
aapsLogger.debug(LTag.PUMPCOMM, "[" + pos + "]" + bytes[pos])
}
@ -46,10 +45,7 @@ class MsgSettingUserOptions(
aapsLogger.debug(LTag.PUMPCOMM, "Low reservoir: " + danaPump.lowReservoirRate)
}
private fun getDataBytes(bytes: ByteArray?, len: Int): ByteArray? {
if (bytes == null) {
return null
}
private fun getDataBytes(bytes: ByteArray, len: Int): ByteArray {
val ret = ByteArray(len)
System.arraycopy(bytes, 6, ret, 0, len)
return ret

View file

@ -9,6 +9,7 @@ import android.bluetooth.le.ScanResult
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
@ -87,7 +88,7 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
return
}
devices.add(item)
Handler().post { listAdapter!!.notifyDataSetChanged() }
Handler(Looper.getMainLooper()).post { listAdapter?.notifyDataSetChanged() }
}
private val mBleScanCallback: ScanCallback = object : ScanCallback() {
@ -172,7 +173,7 @@ class BLEScanActivity : NoSplashAppCompatActivity() {
override fun hashCode(): Int = device.hashCode()
}
private fun isSNCheck(sn: String?): Boolean {
private fun isSNCheck(sn: String): Boolean {
val regex = "^([a-zA-Z]{3})([0-9]{5})([a-zA-Z]{2})$"
val p = Pattern.compile(regex)
val m = p.matcher(sn)

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -48,7 +49,7 @@ class DiaconnG8Fragment : DaggerFragment() {
private var disposable: CompositeDisposable = CompositeDisposable()
private val loopHandler = Handler()
private val loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshLoop: Runnable
private var _binding: DiaconnG8FragmentBinding? = null

View file

@ -11,6 +11,7 @@ import android.bluetooth.le.ScanSettings
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.ParcelUuid
import android.view.View
import android.view.ViewGroup
@ -72,10 +73,10 @@ class DiaconnG8BLEScanActivity : NoSplashAppCompatActivity() {
private fun startScan() =
try {
val filters: MutableList<ScanFilter> = ArrayList()
val scan_filter = ScanFilter.Builder()
val scanFilter = ScanFilter.Builder()
.setServiceUuid(ParcelUuid(serviceUUID))
.build()
filters.add(scan_filter)
filters.add(scanFilter)
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
@ -100,7 +101,7 @@ class DiaconnG8BLEScanActivity : NoSplashAppCompatActivity() {
return
}
devices.add(item)
Handler().post { listAdapter!!.notifyDataSetChanged() }
Handler(Looper.getMainLooper()).post { listAdapter?.notifyDataSetChanged() }
}
private val mBleScanCallback: ScanCallback = object : ScanCallback() {

View file

@ -176,7 +176,7 @@ class DiaconnG8Service : DaggerService() {
val instant = DateTime.now().millis
val offsetInMilliseconds = tz.getOffset(instant).toLong()
val offset = TimeUnit.MILLISECONDS.toHours(offsetInMilliseconds).toInt()
if (abs(timeDiff) > 60) {
if (timeDiff > 0 || abs(timeDiff) > 60) {
if (abs(timeDiff) > 60 * 60 * 1.5) {
aapsLogger.debug(LTag.PUMPCOMM, "Pump time difference: $timeDiff seconds - large difference")
//If time-diff is very large, warn user until we can synchronize history readings properly
@ -466,42 +466,6 @@ class DiaconnG8Service : DaggerService() {
return msgTBR.success()
}
fun highTempBasal(absoluteRate: Double): Boolean {
// temp state check
sendMessage(TempBasalInquirePacket(injector))
if (diaconnG8Pump.tbStatus ==1 ) {
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.stoppingtempbasal)))
val msgPacket = TempBasalSettingPacket(injector, 2, diaconnG8Pump.tbTime, diaconnG8Pump.tbInjectRateRatio)
// tempbasal stop
sendMessage(msgPacket)
// otp process
if(!processConfirm(msgPacket.msgType)) return false
diaconnG8Pump.tempBasalStart= dateUtil.now()
// SystemClock.sleep(500)
}
rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal)))
val tbTime = 2 // 2: 30min, 3:45min, 4:60min
var newAbsoluteRate = absoluteRate
if (absoluteRate < 0.0) newAbsoluteRate = 0.0
if (absoluteRate > 6.0) newAbsoluteRate = 6.0 // pump Temp Max percent = 200
aapsLogger.debug(LTag.PUMPCOMM, "APS Temp basal start absoluteRate: $newAbsoluteRate duration 30 min")
val tbInjectRate = absoluteRate * 100 + 1000
val msgTBR = TempBasalSettingPacket(injector, 1, tbTime, tbInjectRate.toInt())
sendMessage(msgTBR)
// otp process
if(!processConfirm(msgTBR.msgType)) return false
sendMessage(TempBasalInquirePacket(injector))
SystemClock.sleep(500)
loadHistory()
val tbr = pumpSync.expectedPumpState().temporaryBasal
diaconnG8Pump.fromTemporaryBasal(tbr)
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING))
return true
}
fun tempBasalShortDuration(absoluteRate: Double, durationInMinutes: Int): Boolean {
if (durationInMinutes != 15 && durationInMinutes != 30) {
aapsLogger.error(LTag.PUMPCOMM, "Wrong duration param")

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="resetpairing">Resetta associazione</string>
<string name="diaconn_nodeviceavailable">Nessun dispositivo disponibile</string>
<string name="diaconn_pairing">Associazione micro Diaconn</string>
<string name="pumperror">Errore micro</string>
<string name="diaconn_g8_history_alarm">Allarmi</string>
@ -17,14 +19,17 @@
<string name="gettingpumpsettings">Ricezione impostazioni micro</string>
<string name="gettingpumptime">Ricezione ora micro</string>
<string name="largetimediff">Grande differenza oraria:\nL\'ora nel micro differisce per più di 1h e 30m. \nRegola l\'ora manualmente e assicurati che la lettura dello storico dal micro non causi comportamenti imprevisti.\nSe possibile, cancella lo storico del micro prima di cambiare l\'ora oppure disabilita il loop chiuso per un tempo corrispondente al tuo valore DIA.</string>
<string name="largetimedifftitle">Grande differenza oraria</string>
<string name="approachingdailylimit">Si avvicina il limite giornaliero di insulina</string>
<string name="startingbolus">Avvio erogazione bolo</string>
<string name="waitingforestimatedbolusend">In attesa della fine stimata del bolo</string>
<string name="gettingbolusstatus">Ricezione stato bolo</string>
<string name="stoppingtempbasal">Stop basale temporanea</string>
<string name="settingtempbasal">Impostazione basale temporanea</string>
<string name="settingextendedbolus">Impostazione bolo esteso</string>
<string name="stoppingextendedbolus">Stop bolo esteso</string>
<string name="updatingbasalrates">Aggiornamento velocità basali</string>
<string name="description_pump_diaconn_g8">Integrazione del microinfusore Diaconn G8</string>
<string name="diaconn_g8_pump">Diaconn G8</string>
<string name="diaconn_g8_pump_shortname">Diaconn G8</string>
<string name="maxbolusviolation">Violazione bolo massimo</string>
@ -33,6 +38,7 @@
<string name="insulinlimitviolation">Violazione limite insulina</string>
<string name="boluserrorcode">Chiesto: %1$.2fU Erogato: %2$.2fU Codice errore: %3$s</string>
<string name="diaconn_g8_valuenotsetproperly">Valore non impostato correttamente</string>
<string name="diaconn_g8_bt_name_title">Dispositivo Bluetooth Diaconn G8</string>
<string name="diaconn_g8_password_title">Password micro</string>
<string name="bolusspeed">Velocità bolo</string>
<string name="selectedpump">Micro selezionato</string>
@ -44,11 +50,107 @@
<string name="basal_step">Incremento basale</string>
<string name="pump_firmware_label">Firmware</string>
<string name="diagonn_g8_useroptions">OPZIONI UTENTE</string>
<string name="pairfirst">Associa il micro col tuo telefono!</string>
<string name="processinghistory">"Elaborazione "</string>
<string name="apslastLogNum">aps_last_log_num</string>
<string name="apsWrappingCount">aps_wrapping_count</string>
<string name="diaconn_g8_history_tempbasal">Basale temporanea</string>
<string name="diaconng8_pump_settings">Impostazioni micro Diaconn</string>
<string name="diaconn_g8_pumpalarm">Suono</string>
<string name="diaconn_g8_pumpalarm_sound">suono</string>
<string name="diaconn_g8_pumpalarm_vibrate">vibrazione</string>
<string name="diaconn_g8_pumpalarm_silent">silenzioso</string>
<string name="diaconn_g8_pumpalarmlevel">Intensità allarme</string>
<string name="diaconn_g8_pumpalarm_intensity_low">basso</string>
<string name="diaconn_g8_pumpalarm_intensity_middle">medio</string>
<string name="diaconn_g8_pumpalarm_intensity_high">alto</string>
<string name="diaconn_g8_screentimeout">LCD attivo [second]</string>
<string name="diaconn_g8_saveuseroptions">SALVA OPZIONE SUL MICRO</string>
<string name="diaconn_g8_language">Lingua</string>
<string name="diaconn_g8_bolus_speed">Velocità bolo</string>
<string name="diaconn_g8_pumplang_chiness">Chiness</string>
<string name="diaconn_g8_pumplang_korean">Korean</string>
<string name="diaconn_g8_pumplang_english">English</string>
<string name="diaconn_g8_screentimeout_10">"10 "</string>
<string name="diaconn_g8_pumpscreentimeout_10">10</string>
<string name="diaconn_g8_pumpscreentimeout_20">20</string>
<string name="diaconn_g8_pumpscreentimeout_30">30</string>
<string name="diaconn_g8_pumpalarm_low">basso</string>
<string name="injectionblocked">Erogazione bloccata</string>
<string name="batterywarning">Avviso batteria</string>
<string name="insulinlackwarning">Avviso mancanza insulina</string>
<string name="needbatteryreplace">Necessario sostituire batteria</string>
<string name="needinsullinreplace">Necessario sostituire insulina</string>
<string name="pumpversion">pump_version</string>
<string name="apsIncarnationNo">aps_incarnation_no</string>
<string name="pumpserialno">pump_serial_no</string>
<string name="diaconn_g8_loginsulinchange_title">Registra cambio serbatorio</string>
<string name="diaconn_g8_loginsulinchange_summary">Aggiungi evento \"cambio insulina\" al portale quando rilevato nello storico</string>
<string name="diaconn_g8_logcanulachange_title">Registra cambio cannula</string>
<string name="diaconn_g8_logcanulachange_summary">Aggiungi evento \"cambio posizione\" al portale quando rilevato nello storico</string>
<string name="diaconn_g8_logbatterychange_summary">Aggiungi evento \"cambio batteria\" al portale quando rilevato nello storico</string>
<string name="diaconn_g8_logbatterychange_title">Registra cambio batteria</string>
<string name="diaconn_g8_logsyncinprogress">Sincronizzazione log in corso</string>
<string name="diaconn_g8_loginsulinshorage">Carenza insulina</string>
<string name="diaconn_g8_logbatteryshorage">Carenza batteria</string>
<string name="diaconn_g8_logneedleprime">Caricamento cannula :%1$.2fU</string>
<string name="diaconn_g8_loginjectorprime">Caricamento erogatore :%1$.2fU</string>
<string name="diaconn_g8_logtubeprime">Caricamento cambio catetere :%1$.2fU</string>
<string name="diaconn_g8_resetfactoryreset">Reset dopo ripristino impostazioni di fabbrica</string>
<string name="diaconn_g8_resetemergencyoff">Reset dopo Emergency Off</string>
<string name="diaconn_g8_resetbatteryreplacement">Reset dopo sostituzione batteria dell\'utente</string>
<string name="diaconn_g8_resetaftercalibration">Reset dopo calibrazione</string>
<string name="diaconn_g8_resetpreshipment">Reset dopo la configurazione iniziale</string>
<string name="diaconn_g8_resetunexpected">Reset sistema inatteso</string>
<string name="diaconn_g8_reasoncomplete">Completato</string>
<string name="diaconn_g8_reasoninjectonblock">Blocco erogazione</string>
<string name="diaconn_g8_reasonbatteryshortage">Carenza batteria</string>
<string name="diaconn_g8_reasoninsulinshortage">Carenza insulina</string>
<string name="diaconn_g8_reasonuserstop">Stop dell\'utente</string>
<string name="diaconn_g8_reasonsystemreset">Reset di sistema</string>
<string name="diaconn_g8_reasonother">Altro</string>
<string name="diaconn_g8_reasonemergencystop">Stop d\'emergenza</string>
<string name="diacon_g8_blockbasal">BASALE</string>
<string name="diacon_g8_blockmealbolus">BOLO PASTO</string>
<string name="diacon_g8_blocknormalbolus">BOLO NORMALE</string>
<string name="diacon_g8_blocksquarebolus">BOLO ONDA QUADRA</string>
<string name="diacon_g8_blockdualbolus">BOLO ONDA DOPPIA</string>
<string name="diacon_g8_blockreplacetube">SOSTITUIRE CATETERE</string>
<string name="diacon_g8_blockreplaceneedle">SOSTITUIRE CANNULA</string>
<string name="diacon_g8_blockreplacesyringe">SOSTITUIRE SIRINGA</string>
<string name="diaconn_g8_logalarmblock">Blocco erogazione (%s)</string>
<string name="diaconn_g8_lgorelease">rilascio basale (%s)</string>
<string name="diaconn_g8_lgosuspend">sospensione basale (%s)</string>
<string name="diaconn_g8_logdualnormalsuccess">Bolo normale doppio: OK</string>
<string name="diaconn_g8_logdualsquarestart">Avvio bolo onda quadra doppia</string>
<string name="diaconn_g8_logdualsquaresuccess">Bolo onda quadra doppia: OK</string>
<string name="diaconn_g8_logsquarestart">Avvio bolo onda quadra</string>
<string name="diaconn_g8_logsquaresuccess">Bolo onda quadra: OK</string>
<string name="diaconn_g8_logmealfail">Pasto: fallito</string>
<string name="diaconn_g8_logsuccess">OK</string>
<string name="diaconn_g8_logmealsuccess">Pasto: OK</string>
<string name="key_diaconn_g8_logtubechange">diaconn_g8_logtubechange</string>
<string name="diaconn_g8_errorcode_1">Ricerca non possibile a causa di un errore CRC del pacchetto.</string>
<string name="diaconn_g8_errorcode_2">Impostazione non possibile - errore di un parametro di input.</string>
<string name="diaconn_g8_errorcode_3">Impostazione non possibile - errore di specifica del protocollo.</string>
<string name="diaconn_g8_errorcode_4">Pasti programmati, erogazione non possibile ora.</string>
<string name="diaconn_g8_errorcode_6">Cancellato dal micro</string>
<string name="diaconn_g8_errorcode_7">Altre azioni in corso, limitazione impostazioni app.</string>
<string name="diaconn_g8_errorcode_8">Durante l\'erogazione di un altro bolo, l\'erogazione è limitata.</string>
<string name="diaconn_g8_errorcode_9">Richiedi di riprendere l\'erogazione della basale</string>
<string name="diaconn_g8_errorcode_10">Cancellato a causa della mancata risposta del micro.</string>
<string name="diaconn_g8_errorcode_11">L\'erogazione non è possibile a causa della batteria quasi scarica.</string>
<string name="diaconn_g8_errorcode_12">Insulina non sufficiente. Non può essere erogata.</string>
<string name="diaconn_g8_errorcode_13">Non puoi erogare l\'insulina perché la quantità eccede il limite.</string>
<string name="diaconn_g8_errorcode_14">Non puoi erogare l\'insulina perché la quantità eccede il limite giornaliero.</string>
<string name="diaconn_g8_errorcode_15">Dopo la configurazione della basale, l\'erogazione può essere effettuata.</string>
<string name="diaconn_g8_errotpreceivedyet">Il comando non è stato consegnato. Riprova.</string>
<string name="diaconn_g8_logtubechange_title">Registra cambio catetere</string>
<string name="diaconn_g8_logtubechange_summary">Aggiungi evento \"cambio catetere\" alle note quando rilevato nello storico</string>
<string name="diaconn_g8_logtempstart">Avvio basale temporanea</string>
<string name="diaconn_g8_errorcode_32">Durante l\'esecuzione di LGS, lerogazione è limitata</string>
<string name="diaconn_g8_errorcode_33">Stato LGS già su ON. Comando di attivazione rifiutato.</string>
<string name="diaconn_g8_errorcode_34">Stato LGS già su OFF. Comando di disattivazione rifiutato.</string>
<string name="diaconn_g8_errorcode_35">L\'avvio della basale temporanea viene rifiutato quando è già in esecuzione una basale temporanea</string>
<string name="diaconn_g8_errorcode_36">Lo stop della basale temporanea viene rifiutato quando non è in esecuzione alcuna basale temporanea</string>
</resources>

View file

@ -1,2 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="resetpairing">מחיקת צימוד</string>
<string name="diaconn_nodeviceavailable">אין מכשירים זמינים</string>
<string name="diaconn_pairing">צימוד משאבת Diaconn</string>
<string name="pumperror">תקלת משאבה</string>
<string name="diaconn_g8_history_alarm">התראות</string>
<string name="diaconn_g8_history_basalhours">שעות בזאליות</string>
<string name="diaconn_g8_history_bolus">בולוסים</string>
<string name="diaconn_g8_history_dailyinsulin">אינסולין יומי</string>
<string name="diaconn_g8_history_errors">שגיאות</string>
<string name="diaconn_g8_history_prime">תיחול</string>
<string name="diaconn_g8_history_refill">מילוי מחדש</string>
<string name="diaconn_g8_history_suspend">השהיה</string>
<string name="diaconn_g8_pairingok">הצימוד הצליח</string>
<string name="diaconn_g8_waitingforpairing">ממתין לצימוד</string>
<string name="diaconn_firmware_version">גירסה</string>
<string name="invalidpairing">נתוני הצימוד אינם חוקיים. מבצע צימוד מחדש</string>
<string name="gettingpumpsettings">מאחזר הגדרות משאבה</string>
<string name="gettingpumptime">מאחזר שעון המשאבה</string>
<string name="largetimediff">הפרש זמנים גדול:\nשעון המשאבה לא מכוון במעלה משעה וחצי.\n נא להתאים את שעון המשאבה באופן ידני ולוודא כי קריאת ההיסטוריה מהמשאבה אינה גורמת להתנהגות בלתי צפויה.\nבמידת האפשר, מחקו את ההיסטוריה מהמשאבה לפני שתשנו את השעה או השביתו את הלולאה הסגורה למשך פעילות אינסולין (DIA) לאחר רשומת ההיסטוריה השגויה האחרונה אך לפחות DIA אחד מעכשיו.</string>
<string name="largetimedifftitle">הפרש זמן גדול</string>
<string name="approachingdailylimit">מתקרב למגבלת האינסולין היומית</string>
<string name="startingbolus">מתחיל מתן בולוס</string>
<string name="waitingforestimatedbolusend">ממתין לסיום הבולוס</string>
<string name="gettingbolusstatus">מקבל סטטוס בולוס</string>
<string name="stoppingtempbasal">מפסיק בזאלי זמני</string>
<string name="settingtempbasal">מגדיר בזאלי זמני</string>
<string name="settingextendedbolus">מגדיר בולוס ממושך</string>
<string name="stoppingextendedbolus">מפסיק בולוס ממושך</string>
<string name="updatingbasalrates">מעדכן את המינון הבזאלי</string>
<string name="description_pump_diaconn_g8">חיבור משאבת Diaconn G8</string>
<string name="diaconn_g8_pump">Diaconn G8</string>
<string name="diaconn_g8_pump_shortname">Diaconn G8</string>
<string name="maxbolusviolation">בולוס גבוה מדי</string>
<string name="commanderror">שגיאה בפקודה</string>
<string name="speederror">שגיאת מהירות</string>
<string name="insulinlimitviolation">כמות אינסולין גבוהה מדי</string>
<string name="boluserrorcode">התבקש: %1$.2f יח\' הוזרק: %2$.2f יח\' קוד שגיאה: %3$s</string>
<string name="diaconn_g8_valuenotsetproperly">ערך לא מוגדר כראוי</string>
<string name="diaconn_g8_bt_name_title">מכשיר בלוטות\' Diaconn G8</string>
<string name="diaconn_g8_password_title">סיסמת משאבה</string>
<string name="bolusspeed">מהירות בולוס</string>
<string name="selectedpump">משאבה נבחרת</string>
<string name="diaconn_g8_useextended_title">השתמש בבולוס ממושך במשך &gt;200%%</string>
<string name="diaconn_g8_visualizeextendedaspercentage_title">הצגת בולוס ממושך כ-%%</string>
<string name="diaconn_g8_bluetooth_status">מצב בלוטות\'</string>
<string name="diagonn_g8_tdd_label">מינון יומי כולל (TDD)</string>
<string name="bolus_step">צעד במינון בולוס</string>
<string name="basal_step">צעד במינון בזאלי</string>
<string name="pump_firmware_label">קושחה</string>
<string name="diagonn_g8_useroptions">אפשרויות משתמש</string>
<string name="pairfirst">נא לצמד את המשאבה עם הטלפון שלכם!</string>
<string name="processinghistory">"מעבד אירוע "</string>
<string name="diaconn_g8_history_tempbasal">בזאלי זמני</string>
<string name="diaconng8_pump_settings">הגדרות משאבת Diaconn</string>
<string name="diaconn_g8_pumpalarm">צלילים</string>
<string name="diaconn_g8_pumpalarm_sound">צלילים</string>
<string name="diaconn_g8_pumpalarm_vibrate">רטט</string>
<string name="diaconn_g8_pumpalarm_silent">שקט</string>
<string name="diaconn_g8_pumpalarmlevel">עוצמת אזעקה</string>
<string name="diaconn_g8_pumpalarm_intensity_low">נמוכה</string>
<string name="diaconn_g8_pumpalarm_intensity_middle">בינונית</string>
<string name="diaconn_g8_pumpalarm_intensity_high">גבוהה</string>
<string name="diaconn_g8_screentimeout">זמן הפעלת מסך [second]</string>
<string name="diaconn_g8_saveuseroptions">שמירת הגדרה במשאבה</string>
<string name="diaconn_g8_language">שפה</string>
<string name="diaconn_g8_bolus_speed">מהירות הזרקת הבולוס</string>
<string name="diaconn_g8_pumplang_chiness">סינית</string>
<string name="diaconn_g8_pumplang_korean">קוריאנית</string>
<string name="diaconn_g8_pumplang_english">אנגלית</string>
<string name="diaconn_g8_screentimeout_10">"10 "</string>
<string name="diaconn_g8_pumpscreentimeout_10">10</string>
<string name="diaconn_g8_pumpscreentimeout_20">20</string>
<string name="diaconn_g8_pumpscreentimeout_30">30</string>
<string name="diaconn_g8_pumpalarm_low">נמוך</string>
<string name="injectionblocked">חסימת הזרקה</string>
<string name="batterywarning">אזהרת סוללה</string>
<string name="insulinlackwarning">אזהרת מחסור באינסולין</string>
<string name="needbatteryreplace">נדרשת החלפת סוללה</string>
<string name="needinsullinreplace">נדרשת החלפת אינסולין</string>
<string name="pumpversion">גרסת משאבה</string>
<string name="pumpserialno">מספר סידורי של המשאבה</string>
<string name="diaconn_g8_loginsulinchange_title">רישום החלפת מכל</string>
<string name="diaconn_g8_loginsulinchange_summary">הוסף אירוע \"החלפת אינסולין\" לפורטל הטיפולים כשימצא בהיסטוריה</string>
<string name="diaconn_g8_logcanulachange_title">רישום החלפת מחט</string>
<string name="diaconn_g8_logcanulachange_summary">הוסף אירוע \"החלפת צינורית\" לפורטל הטיפולים כשימצא בהיסטוריה</string>
<string name="diaconn_g8_logbatterychange_summary">הוסף אירוע \"החלפת סוללה\" לפורטל הטיפולים כשימצא בהיסטוריה</string>
<string name="diaconn_g8_logbatterychange_title">רישום החלפת סוללה</string>
<string name="diaconn_g8_logsyncinprogress">רישום ביצוע סינכרון</string>
<string name="diaconn_g8_loginsulinshorage">מחסור באינסולין</string>
<string name="diaconn_g8_logbatteryshorage">סוללה חלשה</string>
<string name="diaconn_g8_logneedleprime">תיחול מחט: %1$.2f יח\'</string>
<string name="diaconn_g8_loginjectorprime">תיחול: %1$.2f יח\'</string>
<string name="diaconn_g8_logtubeprime">תיחול החלפת צינורית: %1$.2f יח\'</string>
<string name="diaconn_g8_resetfactoryreset">איפוס לאחר חזרה להגדרות יצרן</string>
<string name="diaconn_g8_resetemergencyoff">איפוס לאחר כיבוי חירום</string>
<string name="diaconn_g8_resetbatteryreplacement">איפוס לאחר החלפת סוללה</string>
<string name="diaconn_g8_resetaftercalibration">איפוס לאחר כיול</string>
<string name="diaconn_g8_resetunexpected">אתחול מערכת בלתי צפוי</string>
<string name="diaconn_g8_reasoncomplete">הושלם</string>
<string name="diaconn_g8_reasoninjectonblock">חסימת הזרקה</string>
<string name="diaconn_g8_reasonbatteryshortage">סוללה חלשה</string>
<string name="diaconn_g8_reasoninsulinshortage">מחסור באינסולין</string>
<string name="diaconn_g8_reasonuserstop">עצירה ע\"י המשתמש</string>
<string name="diaconn_g8_reasonsystemreset">אתחול מערכת</string>
<string name="diaconn_g8_reasonother">אחר</string>
<string name="diaconn_g8_reasonemergencystop">עצירת חירום</string>
<string name="diaconn_g8_logalarmblock">חסימת הזרקה (%s)</string>
<string name="diaconn_g8_logsuccess">הצלחה</string>
<string name="key_diaconn_g8_logtubechange">רישום החלפת צינורית</string>
<string name="diaconn_g8_errorcode_10">בוטל עקב חוסר תגובה מהמשאבה.</string>
<string name="diaconn_g8_errorcode_11">ההזרקה לא אפשרית עקב סוללה חלשה.</string>
<string name="diaconn_g8_logtubechange_title">רישום החלפת צינורית</string>
<string name="diaconn_g8_logtubechange_summary">הוסף אירוע \"החלפת צינורית\" לפורטל הטיפולים כשימצא בהיסטוריה</string>
<string name="diaconn_g8_logtempstart">התחלת בזאלי זמני</string>
<string name="diaconn_g8_errorcode_32">בעת השהייה עקב סוכר נמוך, ההזרקה מוגבלת</string>
<string name="diaconn_g8_errorcode_33">מצב השהייה עקב סוכר נמוך מופעל, פקודת ON נדחתה.</string>
<string name="diaconn_g8_errorcode_34">מצב השהייה עקב סוכר נמוך כבוי, פקודת OFF נדחתה.</string>
</resources>

View file

@ -1,2 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="resetpairing">Koppeling verwijderen</string>
<string name="diaconn_nodeviceavailable">Geen apparaat beschikbaar</string>
<string name="diaconn_pairing">Diaconn Pomp Koppeling</string>
<string name="pumperror">Pomp storing</string>
<string name="diaconn_g8_history_alarm">Alarmen</string>
<string name="diaconn_g8_history_bolus">Bolussen</string>
<string name="diaconn_g8_history_dailyinsulin">Dagtotaal insuline</string>
<string name="diaconn_g8_history_errors">Foutmeldingen</string>
<string name="diaconn_g8_history_prime">Vullen</string>
<string name="diaconn_g8_history_suspend">Onderbreken</string>
<string name="diaconn_g8_pairingok">Koppeling geslaagd</string>
<string name="diaconn_g8_waitingforpairing">Wachten op koppeling</string>
<string name="diaconn_firmware_version">Versie</string>
<string name="invalidpairing">Ongeldige koppelingsinformatie. Nieuwe koppelingspoging wordt uitgevoerd</string>
<string name="gettingpumpsettings">Pomp instellingen aan het ophalen</string>
<string name="gettingpumptime">Pomp tijd aan het ophalen</string>
<string name="approachingdailylimit">Insuline daglimiet aan het benaderen</string>
<string name="startingbolus">Bolus toediening gestart</string>
<string name="gettingbolusstatus">Bolus status aan het ophalen</string>
<string name="stoppingtempbasal">Stoppen van tijdelijk basaal</string>
<string name="settingtempbasal">Instellen tijdelijk basaal</string>
<string name="settingextendedbolus">Instellen van vertraagde bolus</string>
<string name="stoppingextendedbolus">Stoppen van vertraagde bolus</string>
<string name="updatingbasalrates">Bijwerken basaal profiel</string>
<string name="description_pump_diaconn_g8">Pomp integratie voor Diaconn G8 Pompen</string>
</resources>

View file

@ -1,2 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="resetpairing">Slett sammenkobling</string>
<string name="diaconn_nodeviceavailable">Ingen enheter er tilgjengelige</string>
<string name="diaconn_pairing">Diaconn pumpe sammenkobling</string>
<string name="pumperror">Pumpe feil</string>
<string name="diaconn_g8_history_alarm">Alarmer</string>
<string name="diaconn_g8_history_basalhours">Basal timer</string>
<string name="diaconn_g8_history_bolus">Boluser</string>
<string name="diaconn_g8_history_dailyinsulin">Daglig insulin</string>
<string name="diaconn_g8_history_errors">Feil</string>
<string name="diaconn_g8_history_prime">Prime</string>
<string name="diaconn_g8_history_refill">Påfyll</string>
<string name="diaconn_g8_history_suspend">Pauset</string>
<string name="diaconn_g8_pairingok">Sammenkobling OK</string>
<string name="diaconn_g8_waitingforpairing">Venter på sammenkobling</string>
<string name="diaconn_firmware_version">Versjon</string>
<string name="invalidpairing">Ugyldig parringsinformasjon. Krever ny sammenkobling</string>
<string name="gettingpumpsettings">Henter pumpe innstillinger</string>
<string name="gettingpumptime">Henter pumpens tid</string>
<string name="largetimediff">Stor tidsforskjell:\nKlokken i pumpen avviker mer enn 1,5 timer fra mobilen.\nVennligst juster klokke manuelt på pumpen og sørg for at lesing av loggen fra pumpen ikke fører til uventet oppførsel.\nHvis mulig, fjern loggen fra pumpen før du endrer klokkeslettet eller deaktiver lukket loop for én DIA periode etter siste feil oppføring i historikk, men minst én DIA periode fra nå.</string>
<string name="largetimedifftitle">Stor tidsforskjell</string>
<string name="approachingdailylimit">Maksimal daglig insulindose er snart nådd</string>
<string name="startingbolus">Starter bolus dosering</string>
<string name="waitingforestimatedbolusend">Venter på avsluttet bolus dosering</string>
<string name="gettingbolusstatus">Leser bolus status</string>
<string name="stoppingtempbasal">Stopper temp basal</string>
<string name="settingtempbasal">Setter temp basal</string>
<string name="settingextendedbolus">Setter forlenget bolus</string>
<string name="stoppingextendedbolus">Stopper forlenget bolus</string>
<string name="updatingbasalrates">Oppdaterer basaldoser</string>
<string name="description_pump_diaconn_g8">Pumpe integrasjon for Diaconn G8 Pumper</string>
<string name="diaconn_g8_pump">Diaconn G8</string>
<string name="diaconn_g8_pump_shortname">Diaconn G8</string>
<string name="maxbolusviolation">Max bolus nådd</string>
<string name="commanderror">Kommando feil</string>
<string name="speederror">Hastighetsfeil</string>
<string name="insulinlimitviolation">Insulingrense nådd</string>
<string name="boluserrorcode">Forespurt: %1$.2fE Levert: %2$.2fE Feilkode: %3$s</string>
<string name="diaconn_g8_valuenotsetproperly">Verdien er ikke satt riktig</string>
<string name="diaconn_g8_bt_name_title">Diaconn G8 Bluetooth enhet</string>
<string name="diaconn_g8_password_title">Pumpe passord</string>
<string name="bolusspeed">Bolus hastighet</string>
<string name="selectedpump">Valgt pumpe</string>
<string name="diaconn_g8_useextended_title">Bruk forlenget bolus i &gt;200%%</string>
<string name="diaconn_g8_visualizeextendedaspercentage_title">Vis forlenget bolus som %%</string>
<string name="diaconn_g8_bluetooth_status">Bluetooth status</string>
<string name="diagonn_g8_tdd_label">TDD</string>
<string name="bolus_step">Bolus trinn</string>
<string name="basal_step">Basal trinn</string>
<string name="pump_firmware_label">Firmware</string>
<string name="diagonn_g8_useroptions">BRUKERVALG</string>
<string name="pairfirst">Vennligst sammenkobl pumpen med mobilen!</string>
<string name="processinghistory">"Behandler hendelse "</string>
<string name="apslastLogNum">aps_last_log_num</string>
<string name="apsWrappingCount">aps_wrapping_count</string>
<string name="diaconn_g8_history_tempbasal">Temp basal</string>
<string name="diaconng8_pump_settings">Diaconn pumpe innstillinger</string>
<string name="diaconn_g8_pumpalarm">Lyd</string>
<string name="diaconn_g8_pumpalarm_sound">lyd</string>
<string name="diaconn_g8_pumpalarm_vibrate">vibrering</string>
<string name="diaconn_g8_pumpalarm_silent">lydløs</string>
<string name="diaconn_g8_pumpalarmlevel">Alarm intensitet</string>
<string name="diaconn_g8_pumpalarm_intensity_low">lav</string>
<string name="diaconn_g8_pumpalarm_intensity_middle">medium</string>
<string name="diaconn_g8_pumpalarm_intensity_high">høy</string>
<string name="diaconn_g8_screentimeout">LCD påslått [second]</string>
<string name="diaconn_g8_saveuseroptions">LAGRE INNSTILLINGER TIL PUMPE</string>
<string name="diaconn_g8_language">Språk</string>
<string name="diaconn_g8_bolus_speed">Bolus hastighet</string>
<string name="diaconn_g8_pumplang_chiness">Kinesisk</string>
<string name="diaconn_g8_pumplang_korean">Koreansk</string>
<string name="diaconn_g8_pumplang_english">Engelsk</string>
<string name="diaconn_g8_screentimeout_10">"10 "</string>
<string name="diaconn_g8_pumpscreentimeout_10">10</string>
<string name="diaconn_g8_pumpscreentimeout_20">20</string>
<string name="diaconn_g8_pumpscreentimeout_30">30</string>
<string name="diaconn_g8_pumpalarm_low">lav</string>
<string name="injectionblocked">Injeksjon blokkert</string>
<string name="batterywarning">Advarsel: lavt batteri</string>
<string name="insulinlackwarning">Advarsel: lavt insulinnivå</string>
<string name="needbatteryreplace">Bytte av batteri er nødvendig</string>
<string name="needinsullinreplace">Påfyll av insulin er nødvendig</string>
<string name="pumpversion">pump_versjon</string>
<string name="apsIncarnationNo">aps_incarnation_no</string>
<string name="pumpserialno">pump_serial_no</string>
<string name="diaconn_g8_loginsulinchange_title">Logg reservoar bytte</string>
<string name="diaconn_g8_loginsulinchange_summary">Legg til \"Insulinbytte\" i Careportal når den oppdages i historikken</string>
<string name="diaconn_g8_logcanulachange_title">Logg bytte av kanyle</string>
<string name="diaconn_g8_logcanulachange_summary">Legg til \"Bytte av injeksjonssted\" i Careportal når den oppdages i historikken</string>
<string name="diaconn_g8_logbatterychange_summary">Legg til \"Bytte av batteri\" i Careportal når den oppdages i historikken</string>
<string name="diaconn_g8_logbatterychange_title">Logg batteri bytte</string>
<string name="diaconn_g8_logsyncinprogress">Logg synkronisering pågår</string>
<string name="diaconn_g8_loginsulinshorage">Lavt insulinnivå</string>
<string name="diaconn_g8_logbatteryshorage">Lavt batterinivå</string>
<string name="diaconn_g8_logneedleprime">Fyll kanyle:%1$.2fE</string>
<string name="diaconn_g8_loginjectorprime">Injector prime :%1$.2fE</string>
<string name="diaconn_g8_logtubeprime">Fyll slange: %1$.2fE</string>
<string name="diaconn_g8_resetfactoryreset">Nullstill etter tilbakestilling til fabrikkinnstillinger</string>
<string name="diaconn_g8_resetemergencyoff">Tilbakestill etter nødstopp</string>
<string name="diaconn_g8_resetbatteryreplacement">Tilbakestill etter bytte av batteri</string>
<string name="diaconn_g8_resetaftercalibration">Tilbakestill etter kalibrering</string>
<string name="diaconn_g8_resetpreshipment">Tilbakestill innstillinger til standard</string>
<string name="diaconn_g8_resetunexpected">Uventet tilbakestilling av systemet</string>
<string name="diaconn_g8_reasoncomplete">Fullført</string>
<string name="diaconn_g8_reasoninjectonblock">Blokkering av injeksjon</string>
<string name="diaconn_g8_reasonbatteryshortage">Lavt batterinivå</string>
<string name="diaconn_g8_reasoninsulinshortage">Lavt insulinnivå</string>
<string name="diaconn_g8_reasonuserstop">Stoppet av bruker</string>
<string name="diaconn_g8_reasonsystemreset">Tilbakestilling av systemet</string>
<string name="diaconn_g8_reasonother">Annet</string>
<string name="diaconn_g8_reasonemergencystop">Nødstopp</string>
<string name="diacon_g8_blockbasal">BASAL</string>
<string name="diacon_g8_blockmealbolus">MÅLTIDS BOLUS</string>
<string name="diacon_g8_blocknormalbolus">NORMAL BOLUS</string>
<string name="diacon_g8_blocksquarebolus">FORLENGET BOLUS</string>
<string name="diacon_g8_blockdualbolus">KOMBINASJONS BOLUS</string>
<string name="diacon_g8_blockreplacetube">ERSTATT SLANGESETT</string>
<string name="diacon_g8_blockreplaceneedle">ERSTATT KANYLE</string>
<string name="diacon_g8_blockreplacesyringe">ERSTATT SPRØYTE</string>
<string name="diaconn_g8_logalarmblock">Injeksjon blokkering (%s)</string>
<string name="diaconn_g8_lgorelease">basal levering (%s)</string>
<string name="diaconn_g8_lgosuspend">basal stanset (%s)</string>
<string name="diaconn_g8_logdualnormalsuccess">Normal kombinasjonsbolus vellykket</string>
<string name="diaconn_g8_logdualsquarestart">Kombinasjonsbolus startet</string>
<string name="diaconn_g8_logdualsquaresuccess">Kombinasjonsbolus vellykket</string>
<string name="diaconn_g8_logsquarestart">Forlenget bolus startet</string>
<string name="diaconn_g8_logsquaresuccess">Forlenget bolus vellykket</string>
<string name="diaconn_g8_logmealfail">Måltidsbolus feilet</string>
<string name="diaconn_g8_logsuccess">Suksess</string>
<string name="diaconn_g8_logmealsuccess">Måltidsbolus vellykket</string>
<string name="key_diaconn_g8_logtubechange">diaconn_g8_logtubechange</string>
<string name="diaconn_g8_errorcode_1">Kan ikke lese på grunn av feil med kommunikasjonen</string>
<string name="diaconn_g8_errorcode_2">Kan ikke settes på grunn av feil i parameterverdi.</string>
<string name="diaconn_g8_errorcode_3">Kan ikke settes på grunn av feil i kommunikasjonsprotokollen.</string>
<string name="diaconn_g8_errorcode_4">Måltid registrert, men kan ikke doseres.</string>
<string name="diaconn_g8_errorcode_6">Avbrutt av pumpe</string>
<string name="diaconn_g8_errorcode_7">Ta andre handlinger, begrenset av app-innstillingene.</string>
<string name="diaconn_g8_errorcode_8">Under levering av bolus dose er ytterligere doseringer begrenset.</string>
<string name="diaconn_g8_errorcode_9">Krever gjenopptak av basal injeksjonen</string>
<string name="diaconn_g8_errorcode_10">Avbrutt på grunn av at pumpen ikke responderer.</string>
<string name="diaconn_g8_errorcode_11">Injeksjonen er ikke mulig på grunn av lavt batterinivå.</string>
<string name="diaconn_g8_errorcode_12">Ikke nok insulin for doseringen.</string>
<string name="diaconn_g8_errorcode_13">Dosering kan ikke utføres fordi den overstiger maks grense.</string>
<string name="diaconn_g8_errorcode_14">Dosering kan ikke utføres fordi den overstiger daglig maks insulingrense.</string>
<string name="diaconn_g8_errorcode_15">Når basal oppsett er fullført, kan basaldoseringer startes.</string>
<string name="diaconn_g8_errotpreceivedyet">Kommandoen ble ikke utført. Vennligst prøv igjen.</string>
<string name="diaconn_g8_logtubechange_title">Logg bytte av slangesett</string>
<string name="diaconn_g8_logtubechange_summary">Legg til \"Slangesettbytte\" i Careportal når den oppdages i historikken</string>
<string name="diaconn_g8_logtempstart">Temp Basal startet</string>
<string name="diaconn_g8_errorcode_32">Vel Lav Glukose Stopp er injeksjoner begrenset</string>
<string name="diaconn_g8_errorcode_33">LGS status er PÅ. PÅ kommando er nektet.</string>
<string name="diaconn_g8_errorcode_34">LGS status er AV. AV kommandoen er avslått.</string>
<string name="diaconn_g8_errorcode_35">Temp basal avslått siden det allerede kjøres en temp basal</string>
<string name="diaconn_g8_errorcode_36">Stopp av temp basal avslått siden det ikke kjøres en temp basal</string>
</resources>

View file

@ -1,2 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="resetpairing">Zrušiť párovanie</string>
<string name="diaconn_nodeviceavailable">Nie sú k dispozícii žiadne zariadenia</string>
<string name="diaconn_pairing">Párovanie pumpy Diaconn</string>
<string name="pumperror">Chyba pumpy</string>
<string name="diaconn_g8_history_alarm">Alarmy</string>
<string name="diaconn_g8_history_basalhours">Hodinové bazály</string>
<string name="diaconn_g8_history_bolus">Bolusy</string>
<string name="diaconn_g8_history_dailyinsulin">Denný inzulín</string>
<string name="diaconn_g8_history_errors">Chyby</string>
<string name="diaconn_g8_history_prime">Doplňovanie</string>
<string name="diaconn_g8_history_refill">Plnenie</string>
<string name="diaconn_g8_history_suspend">Pozastaviť</string>
<string name="diaconn_g8_pairingok">Spárované</string>
<string name="diaconn_g8_waitingforpairing">Čakanie na párovanie</string>
<string name="diaconn_firmware_version">Verzia</string>
<string name="invalidpairing">Neplatné informácie o párovaní. Požiadavka na nové párovanie</string>
<string name="gettingpumpsettings">Získavam nastavenia pumpy</string>
<string name="gettingpumptime">Získavam čas z pumpy</string>
<string name="largetimediff">Veľký rozdiel v čase:\nČas v pumpe sa líši minimálne o 1,5 h.\nProsím upravte čas v pumpe manuálne a vymažte históriu pumpy.\nPokiaľ je to potrebné, pozastavte uzavretý okruh aspoň na \"DIA\" hodín.</string>
<string name="largetimedifftitle">Veľký rozdiel v čase</string>
<string name="approachingdailylimit">Blíži sa denný limit inzulínu</string>
<string name="startingbolus">Spúšťam podávanie bolusu</string>
<string name="waitingforestimatedbolusend">Čakanie na predpokladaný koniec bolusu</string>
<string name="gettingbolusstatus">Získavam stav bolusov</string>
<string name="stoppingtempbasal">Zastavujem dočasný bazál</string>
<string name="settingtempbasal">Nastavujem dočasný bazál</string>
<string name="settingextendedbolus">Nastavujem predĺžený bolus</string>
<string name="stoppingextendedbolus">Zastavujem predĺžený bolus</string>
<string name="updatingbasalrates">Aktualizujem bazály</string>
<string name="description_pump_diaconn_g8">Integrácia pumpy pre pumpy Diaconn G8</string>
<string name="diaconn_g8_pump">Diaconn G8</string>
<string name="diaconn_g8_pump_shortname">Diaconn G8</string>
<string name="maxbolusviolation">Prekročený maximálny bolus</string>
<string name="commanderror">Chyba príkazu</string>
<string name="speederror">Chyba rýchlosti</string>
<string name="insulinlimitviolation">Prekročený limit inzulínu</string>
<string name="boluserrorcode">Požadované: %1$.2fJI Podané: %2$.2fJI Chyba: %3$s</string>
<string name="diaconn_g8_valuenotsetproperly">Hodnota nenastavená správne</string>
<string name="diaconn_g8_bt_name_title">Zariadenie Bluetooth Diaconn G8</string>
<string name="diaconn_g8_password_title">Heslo do pumpy</string>
<string name="bolusspeed">Rýchlosť bolusu</string>
<string name="selectedpump">Vybraná pumpa</string>
<string name="diaconn_g8_useextended_title">Použiť predĺžené bolusy pre &gt;200%%</string>
<string name="diaconn_g8_visualizeextendedaspercentage_title">Zobrazovať predĺžený bolus v %%</string>
<string name="diaconn_g8_bluetooth_status">Stav Bluetooth</string>
<string name="diagonn_g8_tdd_label">CDD</string>
<string name="bolus_step">Krok bolusu</string>
<string name="basal_step">Krok bazálu</string>
<string name="pump_firmware_label">Firmware</string>
<string name="diagonn_g8_useroptions">UŽIVATEĽSKÉ NASTAVENIA</string>
<string name="pairfirst">Prosím spárujte pumpu s telefónom!</string>
<string name="processinghistory">"Spracúvam udalosť "</string>
<string name="apslastLogNum">aps_last_log_num</string>
<string name="apsWrappingCount">aps_wrapping_count</string>
<string name="diaconn_g8_history_tempbasal">Dočasný Bazál</string>
<string name="diaconng8_pump_settings">Nastavenie pumpy Diaconn</string>
<string name="diaconn_g8_pumpalarm">Zvuk</string>
<string name="diaconn_g8_pumpalarm_sound">zvuk</string>
<string name="diaconn_g8_pumpalarm_vibrate">vibrovať</string>
<string name="diaconn_g8_pumpalarm_silent">ticho</string>
<string name="diaconn_g8_pumpalarmlevel">Hlasitosť alarmu</string>
<string name="diaconn_g8_pumpalarm_intensity_low">nízka</string>
<string name="diaconn_g8_pumpalarm_intensity_middle">stredná</string>
<string name="diaconn_g8_resetfactoryreset">Resetovať po obnovení na továrenské nastavenia</string>
<string name="diaconn_g8_resetemergencyoff">Resetovať po núdzovom vypnutí</string>
<string name="diaconn_g8_resetbatteryreplacement">Resetovať po výmene batérie</string>
<string name="diaconn_g8_resetaftercalibration">Resetovať po kalibrácii</string>
<string name="diaconn_g8_resetpreshipment">Resetovať na továrenské nastavenia</string>
<string name="diaconn_g8_resetunexpected">Neočakávaný reset systému</string>
<string name="diaconn_g8_reasoncomplete">Dokončené</string>
<string name="diaconn_g8_reasoninjectonblock">Zablokované vydávanie</string>
<string name="diaconn_g8_reasonbatteryshortage">Slabá batéria</string>
<string name="diaconn_g8_reasoninsulinshortage">Nedostatok inzulínu</string>
<string name="diaconn_g8_reasonuserstop">Užívateľské vypnutie</string>
<string name="diaconn_g8_reasonsystemreset">Reset systému</string>
<string name="diaconn_g8_reasonother">Iné</string>
<string name="diaconn_g8_reasonemergencystop">Núdzové zastavenie</string>
<string name="diacon_g8_blockbasal">BAZÁL</string>
<string name="diacon_g8_blockmealbolus">BOLUS NA JEDLO</string>
<string name="diacon_g8_blocknormalbolus">NORMÁLNY BOLUS</string>
<string name="diacon_g8_blocksquarebolus">ONESKORENÝ BOLUS</string>
<string name="diacon_g8_blockdualbolus">KOMBINOVANÝ BOLUS</string>
<string name="diacon_g8_blockreplacetube">VYMEŇTE HADIČKU</string>
<string name="diacon_g8_blockreplaceneedle">VYMEŇTE KANYLU</string>
<string name="diacon_g8_blockreplacesyringe">VYMEŇTE ZÁSOBNÍK</string>
<string name="diaconn_g8_logalarmblock">Zablokované vydávanie (%s)</string>
<string name="diaconn_g8_lgorelease">výdaj bazálu (%s)</string>
<string name="diaconn_g8_lgosuspend">bazál pozastavený (%s)</string>
<string name="diaconn_g8_logdualnormalsuccess">Kombinovaný bolus vydaný</string>
<string name="diaconn_g8_logmealfail">Jedlo zlyhalo</string>
<string name="diaconn_g8_logsuccess">Hotovo</string>
<string name="diaconn_g8_logmealsuccess">Jedlo úspešné</string>
<string name="key_diaconn_g8_logtubechange">diaconn_g8_logtubechange</string>
<string name="diaconn_g8_errorcode_1">Nie je možné vyhľadať kvôli chybe CRC.</string>
<string name="diaconn_g8_errorcode_2">Nemôže byť nastavené na základe chybných vstupných parametrov.</string>
<string name="diaconn_g8_errorcode_3">Nemôže byť nastavené na základe chyby špecifikácie protokolu.</string>
<string name="diaconn_g8_errorcode_4">Čas na jedlo nastavený. Nie je možný výdaj inzulínu.</string>
<string name="diaconn_g8_errorcode_6">Zrušené pumpou</string>
<string name="diaconn_g8_errorcode_7">Prijímanie ďalších akcií, obmedzenie nastavenia aplikácie.</string>
<string name="diaconn_g8_errorcode_8">V priebehu podávania bolusu je ďalší bolus obmedzený.</string>
<string name="diaconn_g8_errorcode_9">Vyžaduje sa obnovenie bazálu</string>
<string name="diaconn_g8_errorcode_10">Zrušené, pretože pumpa neodpovedá.</string>
<string name="diaconn_g8_errorcode_11">Podávanie nie je možné z dôvodu slabej batérie.</string>
</resources>

View file

@ -1,5 +1,5 @@
android {
compileSdkVersion 28
compileSdkVersion 30
defaultConfig {
minSdkVersion 26
targetSdkVersion 28

View file

@ -1,19 +1,19 @@
dependencies {
testImplementation "junit:junit:$junit_version"
testImplementation 'org.json:json:20201115'
testImplementation 'org.json:json:20210307'
testImplementation "org.mockito:mockito-core:${mockitoVersion}"
testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4:${powermockVersion}"
testImplementation "joda-time:joda-time:$jodatime_version"
testImplementation('com.google.truth:truth:1.1.2') {
testImplementation('com.google.truth:truth:1.1.3') {
exclude group: "com.google.guava", module: "guava"
}
testImplementation "org.skyscreamer:jsonassert:1.5.0"
testImplementation "org.hamcrest:hamcrest-all:1.3"
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0-alpha04'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
androidTestImplementation "androidx.test:rules:$androidx_rules"

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl = https\://services.gradle.org/distributions/gradle-7.0-all.zip
distributionUrl = https\://services.gradle.org/distributions/gradle-7.1-all.zip

View file

@ -5,6 +5,7 @@ import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -67,7 +68,7 @@ class MedtronicFragment : DaggerFragment() {
private var disposable: CompositeDisposable = CompositeDisposable()
private val loopHandler = Handler()
private val loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshLoop: Runnable
init {
@ -98,7 +99,7 @@ class MedtronicFragment : DaggerFragment() {
binding.pumpStatusIcon.text = "{fa-bed}"
binding.history.setOnClickListener {
if (medtronicPumpPlugin.rileyLinkService.verifyConfiguration() == true) {
if (medtronicPumpPlugin.rileyLinkService.verifyConfiguration()) {
startActivity(Intent(context, MedtronicHistoryActivity::class.java))
} else {
displayNotConfiguredDialog()
@ -106,7 +107,7 @@ class MedtronicFragment : DaggerFragment() {
}
binding.refresh.setOnClickListener {
if (medtronicPumpPlugin.rileyLinkService.verifyConfiguration() != true) {
if (!medtronicPumpPlugin.rileyLinkService.verifyConfiguration()) {
displayNotConfiguredDialog()
} else {
binding.refresh.isEnabled = false
@ -120,7 +121,7 @@ class MedtronicFragment : DaggerFragment() {
}
binding.stats.setOnClickListener {
if (medtronicPumpPlugin.rileyLinkService.verifyConfiguration() == true) {
if (medtronicPumpPlugin.rileyLinkService.verifyConfiguration()) {
startActivity(Intent(context, RileyLinkStatusActivity::class.java))
} else {
displayNotConfiguredDialog()

View file

@ -5,6 +5,7 @@ import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.ble.data.RLMessage
import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil
import info.nightscout.androidaps.plugins.pump.medtronic.defs.MedtronicCommandType
import kotlin.math.min
/**
* Created by geoff on 5/29/16.
@ -15,7 +16,7 @@ class PumpMessage : RLMessage {
private var packetType: PacketType? = PacketType.Carelink
var address: ByteArray? = byteArrayOf(0, 0, 0)
var commandType: MedtronicCommandType? = null
var invalidCommandType: Byte? = null
private var invalidCommandType: Byte? = null
var messageBody: MessageBody? = MessageBody()
var error: String? = null
@ -33,7 +34,7 @@ class PumpMessage : RLMessage {
this.aapsLogger = aapsLogger
}
val isErrorResponse: Boolean
@Suppress("unused") val isErrorResponse: Boolean
get() = error != null
fun init(packetType: PacketType?, address: ByteArray?, commandType: MedtronicCommandType?, messageBody: MessageBody?) {
@ -47,7 +48,7 @@ class PumpMessage : RLMessage {
if (rxData == null) {
return
}
if (rxData.size > 0) {
if (rxData.isNotEmpty()) {
packetType = PacketType.getByValue(rxData[0].toShort())
}
if (rxData.size > 3) {
@ -87,7 +88,7 @@ class PumpMessage : RLMessage {
// rawContent = just response without code (contents-2, messageBody.txData-1);
val rawContent: ByteArray
get() {
if (messageBody == null || messageBody!!.txData == null || messageBody!!.txData!!.size == 0) return byteArrayOf()
if (messageBody == null || messageBody!!.txData == null || messageBody?.txData?.size == 0) return byteArrayOf()
val data = messageBody!!.txData
var length = ByteUtil.asUINT8(data!![0]) // length is not always correct so, we check whole array if we have
// data, after length
@ -109,7 +110,9 @@ class PumpMessage : RLMessage {
length = data.size - 1
}
val arrayOut = ByteArray(length)
System.arraycopy(messageBody!!.txData, 1, arrayOut, 0, length)
messageBody?.txData?.let {
System.arraycopy(it, 1, arrayOut, 0, length)
}
// if (isLogEnabled())
// LOG.debug("PumpMessage - Length: " + length + ", Original Length: " + originalLength + ", CommandType: "
@ -120,10 +123,10 @@ class PumpMessage : RLMessage {
val rawContentOfFrame: ByteArray
get() {
val raw = messageBody!!.txData
return if (raw == null || raw.size == 0) {
return if (raw == null || raw.isEmpty()) {
byteArrayOf()
} else {
ByteUtil.substring(raw, 1, Math.min(FRAME_DATA_LENGTH, raw.size - 1))
ByteUtil.substring(raw, 1, min(FRAME_DATA_LENGTH, raw.size - 1))
}
}

View file

@ -143,10 +143,7 @@ class MedtronicUIPostprocessor @Inject constructor(
}
private fun postProcessSettings(uiTask: MedtronicUITask) {
val settings = uiTask.result as? Map<String, PumpSettingDTO>
if (settings == null)
return
val settings = uiTask.result as? Map<String, PumpSettingDTO> ?: return
medtronicUtil.settings = settings
var checkValue: PumpSettingDTO

View file

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Omnipod Dash - Description -->
<string name="omnipod_dash_pump_description">Pomp integratie voor Omnipod Dash (het nieuwe, Bluetooth-enabled model met een blauwe naalddop).</string>
<!-- Omnipod Dash - Keys -->
<!-- Omnipod Dash - Overview -->
<string name="omnipod_dash_bluetooth_status">Bluetooth Status</string>
<string name="omnipod_dash_bluetooth_address">Bluetooth adres</string>
</resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Omnipod Eros - Description -->
<string name="omnipod_eros_pump_description">Pompintegratie voor Omnipod Eros (het oudere model met een transparante naalddop). Vereist een RileyLink-apparaat met ten minste firmwareversie 2.0.</string>
<!-- Omnipod Eros - Keys -->
<!-- Omnipod Eros - Overview -->
<!-- Omnipod Eros - Preferences -->
@ -48,7 +49,25 @@
<string name="omnipod_eros_error_set_temp_basal_failed_old_tbr_might_be_cancelled">Het instellen van een tijdelijke basaal is mislukt. Als een tijdelijk basaal eerder actief was, is deze mogelijk geannuleerd. Vernieuw de Pod-status handmatig vanaf het Omnipod tabblad.</string>
<string name="omnipod_eros_error_set_temp_basal_failed_old_tbr_cancelled_new_might_have_failed">Het instellen van een tijdelijk basaal is mogelijk mislukt. Als een tijdelijke basaal eerder actief was, is deze geannuleerd. Vernieuw de Pod-status handmatig vanaf het Omnipod tabblad.</string>
<string name="omnipod_eros_error_set_temp_basal_failed_validation">Tijdelijke basaal duur moet groter zijn dan nul en een veelvoud van %1$s minuten.</string>
<string name="omnipod_eros_error_set_time_failed_delivery_might_be_suspended">Instellen van de tijd is misschien mislukt. De insulinetoediening kan onderbroken zijn! Vernieuw de Pod-status handmatig in het Omnipod tabblad en hervat de toediening indien nodig.</string>
<string name="omnipod_eros_error_set_time_failed_delivery_suspended">Het instellen van de tijd is mislukt. Insulinetoediening is onderbroken! Hervat de toediening handmatig vanaf het Omnipod tabblad.</string>
<string name="omnipod_eros_error_failed_to_read_pulse_log">Lezen van Pulse log is mislukt</string>
<string name="omnipod_eros_error_automatic_time_or_timezone_change_failed">Het automatisch wijzigen van de tijd op de Pod is mislukt. Synchroniseer de tijd handmatig via het Omnipod-tabblad.</string>
<string name="omnipod_eros_error_operation_not_possible_no_configuration">Bewerking is niet mogelijk.\n\nJe moet eerst Omnipod ingesteld hebben, voordat je deze bewerking kunt gebruiken.</string>
<string name="omnipod_eros_error_bolus_failed_uncertain">Kan niet controleren of de bolus is geslaagd. Controleer handmatig of de Pod aan het bolussen is door te luisteren naar klik-geluidjes van de Pod. <b>Als je zeker weet dat de bolus niet is geslaagd, moet je deze bolus handmatig uit \'Behandelingen\' verwijderen, zelfs als je nu op \'Annuleren\' drukt!</b></string>
<string name="omnipod_eros_error_bolus_failed_uncertain_smb">Kan niet controleren of SMB bolus (%1$.2f E) geslaagd is. <b>Als je zeker weet dat de bolus niet is geslaagd, moet je deze handmatig verwijderen uit \'Behandelingen\'.</b></string>
<string name="omnipod_eros_error_tbr_running_but_aaps_not_aware">Er loopt een tijdelijk basaal op de Pod, maar AndroidAPS is zich niet bewust van deze tijdelijke basaal. Annuleer de tijdelijke basal handmatig.</string>
<!-- Omnipod Eros - Pod Management -->
<string name="omnipod_eros_pod_management_button_riley_link_stats">RileyLink status</string>
<string name="omnipod_eros_pod_management_waiting_for_riley_link_connection">Wachten op verbinding met RileyLink…</string>
<string name="omnipod_eros_pod_management_button_reset_riley_link_config">RileyLink Configuratie resetten</string>
<string name="omnipod_eros_pod_management_button_read_pulse_log">Pulse log uitlezen</string>
<string name="omnipod_eros_pod_management_button_reading_pulse_log">Pulse log aan het uitlezen…</string>
<string name="omnipod_eros_pod_management_pulse_log">Pulse Log</string>
<string name="omnipod_eros_pod_management_pulse_log_value">Pulse log (gekopieerd naar klembord)</string>
<!-- Omnipod Eros - Pod Activation Wizard -->
<string name="omnipod_eros_pod_activation_wizard_start_pod_activation_text">Vul een nieuw Pod in met voldoende insuline voor 3 dagen.\n\nLuister naar twee piepjes van de Pod tijdens het vulproces. Deze geven aan dat de minimale hoeveelheid van 80E is bereikt. Ga door met vullen (ook na het horen van de twee piepjes) totdat het vulspuitje volledig leeg is.\n\nNa het vullen van de Pod kun je op <b>Volgende</b>drukken.\n\n<b>Opmerking:</b> verwijder op dit moment de naaldbeschermer van de Pod.\n<b>Opmerking:</b> Zet de RileyLink rechtop en plaats de Pod ongeveer vijf centimeter ervandaan.</string>
<string name="omnipod_eros_pod_activation_wizard_initialize_pod_text">Er wordt nu geprobeerd om de Pod te koppelen en de canule te vullen.\n\nWanneer deze stap successvol is afgerond, kan er op <b>Volgende</b> worden gedrukt.\n\n<b>Opmerking:</b> zet de RileyLink rechtop en leg de Pod er ongeveer 5 centimeter vandaan.</string>
<!-- Omnipod Eros - Other -->
<string name="omnipod_eros_uncertain">onzeker</string>
</resources>

View file

@ -44,7 +44,7 @@ class PumpSyncStorage @Inject constructor(
if (sp.contains(pumpSyncStorageKey)) {
val jsonData: String = sp.getString(pumpSyncStorageKey, "");
if (!jsonData.isBlank()) {
if (jsonData.isNotBlank()) {
pumpSyncStorage = xstream.fromXML(jsonData, MutableMap::class.java) as MutableMap<String, MutableList<PumpDbEntry>>
aapsLogger.debug(LTag.PUMP, String.format("Loading Pump Sync Storage: boluses=%d, tbrs=%d.", pumpSyncStorage[BOLUS]!!.size, pumpSyncStorage[TBR]!!.size))

View file

@ -64,6 +64,7 @@
<string name="riley_link_common_yes">Ja</string>
<string name="riley_link_common_no">Nee</string>
<!-- RileyLink - Preferences -->
<string name="riley_link_show_battery_level">Toon batterijniveau van OrangeLink/EmaLink</string>
<string name="riley_link_show_battery_level_summary">Werkt NIET met de originele RileyLink. Werkt mogelijk niet met andere RileyLink-alternatieven.</string>
<plurals name="duration_days">
<item quantity="one">%1$d dag</item>

View file

@ -51,7 +51,7 @@ def generateGitBuild = { ->
}
android {
compileSdkVersion 28
compileSdkVersion 30
defaultConfig {
applicationId "info.nightscout.androidaps"